Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(57)

Side by Side Diff: chrome/browser/devtools/devtools_adb_bridge.cc

Issue 12559008: DevTools: add backend for discovering connected ADB devices. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Offline review comments addressed Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/devtools/devtools_adb_bridge.h"
6
7 #include "base/bind.h"
8 #include "base/compiler_specific.h"
9 #include "base/logging.h"
10 #include "base/message_loop_proxy.h"
11 #include "base/stringprintf.h"
12 #include "base/strings/string_number_conversions.h"
13 #include "base/threading/thread.h"
14 #include "chrome/browser/devtools/adb_client_socket.h"
15 #include "content/public/browser/browser_thread.h"
16
17 using content::BrowserThread;
18
19 namespace {
20
21 static const char* kDevToolsAdbBridgeThreadName = "Chrome_DevToolsADBThread";
22 const int kAdbPort = 5037;
23
24 } // namespace
25
26 // static
27 DevToolsAdbBridge* DevToolsAdbBridge::Start() {
28 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
29 return new DevToolsAdbBridge();
30 }
31
32 void DevToolsAdbBridge::Stop() {
33 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
34 if (!thread_.get())
35 return;
36 BrowserThread::PostTaskAndReply(
37 BrowserThread::FILE, FROM_HERE,
38 base::Bind(&DevToolsAdbBridge::StopHandlerOnFileThread, this),
39 base::Bind(&DevToolsAdbBridge::ResetHandlerAndReleaseOnUIThread, this));
40 }
41
42 void DevToolsAdbBridge::Query(
43 const std::string query,
44 const Callback& callback) {
45 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
46
47 // There is a race condition in case Query immediately follows start. We
48 // consider it Ok since query is polling anyways.
49 if (!thread_.get()) {
50 callback.Run("ADB is not yet connected", std::string());
51 return;
52 }
53 thread_->message_loop()->PostTask(
54 FROM_HERE,
55 base::Bind(&DevToolsAdbBridge::QueryOnHandlerThread,
56 this, query, callback));
57 }
58
59 DevToolsAdbBridge::DevToolsAdbBridge() {
60 AddRef(); // Balanced in Release
61
62 thread_.reset(new base::Thread(kDevToolsAdbBridgeThreadName));
63 BrowserThread::PostTask(
64 BrowserThread::FILE, FROM_HERE,
65 base::Bind(&DevToolsAdbBridge::StartHandlerOnFileThread, this));
66 }
67
68 DevToolsAdbBridge::~DevToolsAdbBridge() {
69 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
70 // Stop() must be called prior to destruction.
71 DCHECK(thread_.get() == NULL);
72 }
73
74 void DevToolsAdbBridge::StartHandlerOnFileThread() {
75 base::Thread::Options options;
76 options.message_loop_type = MessageLoop::TYPE_IO;
77 if (!thread_->StartWithOptions(options)) {
78 BrowserThread::PostTask(
79 BrowserThread::UI, FROM_HERE,
80 base::Bind(&DevToolsAdbBridge::ResetHandlerOnUIThread, this));
81 return;
82 }
83 }
84
85 // Runs on FILE thread to make sure that it is serialized against
86 // {Start|Stop}HandlerThread and to allow calling pthread_join.
87 void DevToolsAdbBridge::StopHandlerOnFileThread() {
88 if (!thread_->message_loop())
89 return;
90 // Thread::Stop joins the thread.
91 thread_->Stop();
92 }
93
94 void DevToolsAdbBridge::ResetHandlerAndReleaseOnUIThread() {
95 ResetHandlerOnUIThread();
96 Release();
97 }
98
99 void DevToolsAdbBridge::ResetHandlerOnUIThread() {
100 thread_.reset();
101 }
102
103 void DevToolsAdbBridge::QueryOnHandlerThread(
104 const std::string query,
105 const Callback& callback) {
106 ADBClientSocket::Query(
107 kAdbPort, query,
108 base::Bind(&DevToolsAdbBridge::QueryResponseOnHandlerThread,
109 base::Unretained(this), callback));
110 }
111
112 void DevToolsAdbBridge::QueryResponseOnHandlerThread(
113 const Callback& callback,
114 const std::string& error,
115 const std::string& response) {
116 BrowserThread::PostTask(
117 BrowserThread::UI, FROM_HERE,
118 base::Bind(&DevToolsAdbBridge::RespondOnUIThread, base::Unretained(this),
119 callback, error, response));
120 }
121
122 void DevToolsAdbBridge::RespondOnUIThread(
123 const Callback& callback,
124 const std::string& error,
125 const std::string& response) {
126 callback.Run(error, response);
127 }
OLDNEW
« no previous file with comments | « chrome/browser/devtools/devtools_adb_bridge.h ('k') | chrome/browser/devtools/protocol_http_request.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698