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

Side by Side Diff: ceee/ie/plugin/toolband/toolband_module.cc

Issue 4508002: COM replaced with RPC for firing events in broker. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 10 years, 1 month 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
« no previous file with comments | « ceee/ie/plugin/toolband/toolband.gyp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 // 4 //
5 // Declaration of ATL module object and DLL exports. 5 // Declaration of ATL module object and DLL exports.
6 6
7 #include "base/at_exit.h" 7 #include "base/at_exit.h"
8 #include "base/atomic_ref_count.h" 8 #include "base/atomic_ref_count.h"
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "base/logging_win.h" 11 #include "base/logging_win.h"
12 #include "base/thread.h" 12 #include "base/thread.h"
13 #include "ceee/common/com_utils.h" 13 #include "ceee/common/com_utils.h"
14 #include "ceee/common/install_utils.h" 14 #include "ceee/common/install_utils.h"
15 #include "ceee/ie/broker/broker_rpc_client.h"
15 #include "ceee/ie/common/ceee_module_util.h" 16 #include "ceee/ie/common/ceee_module_util.h"
16 #include "ceee/ie/plugin/bho/browser_helper_object.h" 17 #include "ceee/ie/plugin/bho/browser_helper_object.h"
17 #include "ceee/ie/plugin/bho/executor.h" 18 #include "ceee/ie/plugin/bho/executor.h"
18 #include "ceee/ie/plugin/toolband/toolband_module_reporting.h" 19 #include "ceee/ie/plugin/toolband/toolband_module_reporting.h"
19 #include "ceee/ie/plugin/toolband/tool_band.h" 20 #include "ceee/ie/plugin/toolband/tool_band.h"
20 #include "ceee/ie/plugin/scripting/script_host.h" 21 #include "ceee/ie/plugin/scripting/script_host.h"
21 #include "ceee/common/windows_constants.h" 22 #include "ceee/common/windows_constants.h"
22 #include "chrome/common/url_constants.h" 23 #include "chrome/common/url_constants.h"
23 24
24 #include "toolband.h" // NOLINT 25 #include "toolband.h" // NOLINT
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
59 bool module_initialized() const { 60 bool module_initialized() const {
60 return module_initialized_; 61 return module_initialized_;
61 } 62 }
62 63
63 // Fires an event to the broker, so that the call can be made with an 64 // Fires an event to the broker, so that the call can be made with an
64 // instance of a broker proxy that was CoCreated in the worker thread. 65 // instance of a broker proxy that was CoCreated in the worker thread.
65 void FireEventToBroker(const std::string& event_name, 66 void FireEventToBroker(const std::string& event_name,
66 const std::string& event_args); 67 const std::string& event_args);
67 68
68 private: 69 private:
70 // TODO(vitalybuka@google.com): Fire events without this thread.
69 class ComWorkerThread : public base::Thread { 71 class ComWorkerThread : public base::Thread {
70 public: 72 public:
71 ComWorkerThread(); 73 ComWorkerThread();
72 74
73 // Called just prior to starting the message loop 75 // Called just prior to starting the message loop
74 virtual void Init(); 76 virtual void Init();
75 77
76 // Called just after the message loop ends 78 // Called just after the message loop ends
77 virtual void CleanUp(); 79 virtual void CleanUp();
78 80
79 // Called by FireEventTask so that the broker we instantiate in the 81 // Called by FireEventTask so that the broker we instantiate in the
80 // worker thread can be used. 82 // worker thread can be used.
81 void FireEventToBroker(BSTR event_name, BSTR event_args); 83 void FireEventToBroker(BSTR event_name, BSTR event_args);
82 protected: 84 protected:
83 CComPtr<ICeeeBroker> broker_; 85 BrokerRpcClient broker_rpc_;
84 static const int kMaxNumberOfRetries = 5;
85 static const int64 kRetryDelayMs = 10;
86 int current_number_of_retries_;
87 }; 86 };
88 87
89 class FireEventTask : public Task { 88 class FireEventTask : public Task {
90 public: 89 public:
91 FireEventTask(ComWorkerThread* worker_thread, 90 FireEventTask(ComWorkerThread* worker_thread,
92 const std::string& event_name, 91 const std::string& event_name,
93 const std::string& event_args) 92 const std::string& event_args)
94 : worker_thread_(worker_thread), 93 : worker_thread_(worker_thread),
95 event_name_(event_name.c_str()), 94 event_name_(event_name.c_str()),
96 event_args_(event_args.c_str()) { 95 event_args_(event_args.c_str()) {
97 } 96 }
98 FireEventTask(ComWorkerThread* worker_thread,
99 const BSTR event_name,
100 const BSTR event_args)
101 : worker_thread_(worker_thread),
102 event_name_(event_name),
103 event_args_(event_args) {
104 }
105 virtual void Run() { 97 virtual void Run() {
106 worker_thread_->FireEventToBroker(event_name_, event_args_); 98 worker_thread_->FireEventToBroker(event_name_, event_args_);
107 } 99 }
108 private: 100 private:
109 ComWorkerThread* worker_thread_; 101 ComWorkerThread* worker_thread_;
110 CComBSTR event_name_; 102 CComBSTR event_name_;
111 CComBSTR event_args_; 103 CComBSTR event_args_;
112 }; 104 };
113 // We only start the thread on first use. If we would start it on 105 // We only start the thread on first use. If we would start it on
114 // initialization, when our DLL is loaded into the broker process, 106 // initialization, when our DLL is loaded into the broker process,
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
284 message_loop->PostTask(FROM_HERE, 276 message_loop->PostTask(FROM_HERE,
285 new FireEventTask(worker_thread_, event_name, event_args)); 277 new FireEventTask(worker_thread_, event_name, event_args));
286 } else { 278 } else {
287 LOG(ERROR) << "Trying to post a message before the COM worker thread is" 279 LOG(ERROR) << "Trying to post a message before the COM worker thread is"
288 "completely initialized and ready."; 280 "completely initialized and ready.";
289 } 281 }
290 } 282 }
291 283
292 284
293 ToolbandModule::ComWorkerThread::ComWorkerThread() 285 ToolbandModule::ComWorkerThread::ComWorkerThread()
294 : base::Thread("CEEE-COM Worker Thread"), 286 : base::Thread("CEEE-COM Worker Thread") {
295 current_number_of_retries_(0) {
296 } 287 }
297 288
298 void ToolbandModule::ComWorkerThread::Init() { 289 void ToolbandModule::ComWorkerThread::Init() {
299 ::CoInitializeEx(0, COINIT_MULTITHREADED); 290 ::CoInitializeEx(0, COINIT_MULTITHREADED);
291 // TODO(vitalybuka@google.com): Start broker without COM.
292 CComPtr<ICeeeBroker> broker_;
300 HRESULT hr = broker_.CoCreateInstance(CLSID_CeeeBroker); 293 HRESULT hr = broker_.CoCreateInstance(CLSID_CeeeBroker);
301 DCHECK(SUCCEEDED(hr)) << "Failed to create broker. " << com::LogHr(hr); 294 DCHECK(SUCCEEDED(hr)) << "Failed to create broker. " << com::LogHr(hr);
295 broker_rpc_.Connect();
296 DCHECK(broker_rpc_.is_connected());
297 ::CoUninitialize();
302 } 298 }
303 299
304 void ToolbandModule::ComWorkerThread::CleanUp() { 300 void ToolbandModule::ComWorkerThread::CleanUp() {
305 broker_.Release(); 301 broker_rpc_.Disconnect();
306 ::CoUninitialize();
307 } 302 }
308 303
309 void ToolbandModule::ComWorkerThread::FireEventToBroker(BSTR event_name, 304 void ToolbandModule::ComWorkerThread::FireEventToBroker(BSTR event_name,
310 BSTR event_args) { 305 BSTR event_args) {
311 DCHECK(broker_ != NULL); 306 DCHECK(broker_rpc_.is_connected());
312 if (broker_ != NULL) { 307 bool result = broker_rpc_.FireEvent(event_name, event_args);
313 HRESULT hr = broker_->FireEvent(event_name, event_args); 308 DCHECK(result);
314 if (SUCCEEDED(hr)) {
315 current_number_of_retries_ = 0;
316 return;
317 }
318 // If the server is busy (which can happen if it is calling in as we try to
319 // to call out to it), then we should retry a few times a little later.
320 if (current_number_of_retries_ < kMaxNumberOfRetries && message_loop()) {
321 ++current_number_of_retries_;
322 LOG(WARNING) << "Retrying Broker FireEvent Failure. " << com::LogHr(hr);
323 message_loop()->PostDelayedTask(FROM_HERE,
324 new FireEventTask(this, event_name, event_args), kRetryDelayMs);
325 } else {
326 current_number_of_retries_ = 0;
327 DCHECK(SUCCEEDED(hr)) << "Broker FireEvent Failed. " << com::LogHr(hr);
328 }
329 }
330 } 309 }
331 310
332 ToolbandModule module; 311 ToolbandModule module;
333 312
334 void ceee_module_util::AddRefModuleWorkerThread() { 313 void ceee_module_util::AddRefModuleWorkerThread() {
335 module.IncThreadRefCount(); 314 module.IncThreadRefCount();
336 } 315 }
337 void ceee_module_util::ReleaseModuleWorkerThread() { 316 void ceee_module_util::ReleaseModuleWorkerThread() {
338 module.DecThreadRefCount(); 317 module.DecThreadRefCount();
339 } 318 }
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
399 } 378 }
400 379
401 CEEE_DEFINE_DLL_REGISTER_SERVER() 380 CEEE_DEFINE_DLL_REGISTER_SERVER()
402 381
403 // DllUnregisterServer - Removes entries from the system registry 382 // DllUnregisterServer - Removes entries from the system registry
404 STDAPI DllUnregisterServer(void) { 383 STDAPI DllUnregisterServer(void) {
405 // We always allow unregistration, even if no --enable-ceee install flag. 384 // We always allow unregistration, even if no --enable-ceee install flag.
406 HRESULT hr = module.DllUnregisterServer(); 385 HRESULT hr = module.DllUnregisterServer();
407 return hr; 386 return hr;
408 } 387 }
OLDNEW
« no previous file with comments | « ceee/ie/plugin/toolband/toolband.gyp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698