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

Side by Side Diff: chrome/service/service_process.cc

Issue 3257011: Registered the service process to AutoRun (for Windows) if any service (Cloud... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Fixed Linux compile Created 10 years, 3 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
« no previous file with comments | « chrome/service/service_process.h ('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 #include "chrome/service/service_process.h" 5 #include "chrome/service/service_process.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/command_line.h"
9 #include "base/path_service.h" 10 #include "base/path_service.h"
11 #include "base/string16.h"
10 #include "base/utf_string_conversions.h" 12 #include "base/utf_string_conversions.h"
11 #include "base/values.h" 13 #include "base/values.h"
14 #if defined(OS_WIN)
15 #include "base/win_util.h"
16 #endif // defined(OS_WIN)
12 #include "chrome/common/chrome_constants.h" 17 #include "chrome/common/chrome_constants.h"
13 #include "chrome/common/chrome_paths.h" 18 #include "chrome/common/chrome_paths.h"
19 #include "chrome/common/chrome_switches.h"
14 #include "chrome/common/json_pref_store.h" 20 #include "chrome/common/json_pref_store.h"
15 #include "chrome/common/pref_names.h" 21 #include "chrome/common/pref_names.h"
16 #include "chrome/common/service_process_type.h" 22 #include "chrome/common/service_process_type.h"
17 #include "chrome/common/service_process_util.h" 23 #include "chrome/common/service_process_util.h"
18 #include "chrome/service/cloud_print/cloud_print_proxy.h" 24 #include "chrome/service/cloud_print/cloud_print_proxy.h"
19 #include "chrome/service/service_ipc_server.h" 25 #include "chrome/service/service_ipc_server.h"
20 #include "net/base/network_change_notifier.h" 26 #include "net/base/network_change_notifier.h"
21 27
22 #if defined(ENABLE_REMOTING) 28 #if defined(ENABLE_REMOTING)
23 #include "remoting/base/constants.h" 29 #include "remoting/base/constants.h"
(...skipping 11 matching lines...) Expand all
35 #elif defined(OS_MACOSX) 41 #elif defined(OS_MACOSX)
36 #include "remoting/host/capturer_mac.h" 42 #include "remoting/host/capturer_mac.h"
37 #include "remoting/host/event_executor_mac.h" 43 #include "remoting/host/event_executor_mac.h"
38 #endif 44 #endif
39 #endif // defined(ENABLED_REMOTING) 45 #endif // defined(ENABLED_REMOTING)
40 46
41 ServiceProcess* g_service_process = NULL; 47 ServiceProcess* g_service_process = NULL;
42 48
43 ServiceProcess::ServiceProcess() 49 ServiceProcess::ServiceProcess()
44 : shutdown_event_(true, false), 50 : shutdown_event_(true, false),
45 main_message_loop_(NULL) { 51 main_message_loop_(NULL),
52 enabled_services_(0) {
46 DCHECK(!g_service_process); 53 DCHECK(!g_service_process);
47 g_service_process = this; 54 g_service_process = this;
48 } 55 }
49 56
50 bool ServiceProcess::Initialize(MessageLoop* message_loop) { 57 bool ServiceProcess::Initialize(MessageLoop* message_loop) {
51 main_message_loop_ = message_loop; 58 main_message_loop_ = message_loop;
52 network_change_notifier_.reset(net::NetworkChangeNotifier::Create()); 59 network_change_notifier_.reset(net::NetworkChangeNotifier::Create());
53 base::Thread::Options options; 60 base::Thread::Options options;
54 options.message_loop_type = MessageLoop::TYPE_IO; 61 options.message_loop_type = MessageLoop::TYPE_IO;
55 io_thread_.reset(new base::Thread("ServiceProcess_IO")); 62 io_thread_.reset(new base::Thread("ServiceProcess_IO"));
(...skipping 14 matching lines...) Expand all
70 DictionaryValue* values = service_prefs_->prefs(); 77 DictionaryValue* values = service_prefs_->prefs();
71 bool remoting_host_enabled = false; 78 bool remoting_host_enabled = false;
72 79
73 // Check if remoting host is already enabled. 80 // Check if remoting host is already enabled.
74 if (values->GetBoolean(prefs::kRemotingHostEnabled, &remoting_host_enabled) && 81 if (values->GetBoolean(prefs::kRemotingHostEnabled, &remoting_host_enabled) &&
75 remoting_host_enabled) { 82 remoting_host_enabled) {
76 // If true then we start the host. 83 // If true then we start the host.
77 StartChromotingHost(); 84 StartChromotingHost();
78 } 85 }
79 86
80 // TODO(hclam): Each type of service process should has it own instance of 87 bool cloud_print_proxy_enabled = false;
81 // process and thus channel, but now we have only one process for all types 88
82 // so the type parameter doesn't matter now. 89 // Check if the cloud print proxy is already enabled.
90 if (values->GetBoolean(prefs::kCloudPrintProxyEnabled,
91 &cloud_print_proxy_enabled) &&
92 cloud_print_proxy_enabled) {
93 GetCloudPrintProxy()->EnableForUser(std::string());
94 }
95
83 LOG(INFO) << "Starting Service Process IPC Server"; 96 LOG(INFO) << "Starting Service Process IPC Server";
84 ipc_server_.reset(new ServiceIPCServer( 97 ipc_server_.reset(new ServiceIPCServer(GetServiceProcessChannelName()));
85 GetServiceProcessChannelName(kServiceProcessCloudPrint)));
86 ipc_server_->Init(); 98 ipc_server_->Init();
87 99
88 // After the IPC server has started we signal that the service process is 100 // After the IPC server has started we signal that the service process is
89 // running. 101 // running.
90 SignalServiceProcessRunning(kServiceProcessCloudPrint); 102 SignalServiceProcessRunning(kServiceProcessCloudPrint);
91 return true; 103 return true;
92 } 104 }
93 105
94 bool ServiceProcess::Teardown() { 106 bool ServiceProcess::Teardown() {
95 if (service_prefs_.get()) { 107 if (service_prefs_.get()) {
(...skipping 22 matching lines...) Expand all
118 } 130 }
119 131
120 void ServiceProcess::Shutdown() { 132 void ServiceProcess::Shutdown() {
121 // Quit the main message loop. 133 // Quit the main message loop.
122 main_message_loop_->PostTask(FROM_HERE, new MessageLoop::QuitTask()); 134 main_message_loop_->PostTask(FROM_HERE, new MessageLoop::QuitTask());
123 } 135 }
124 136
125 CloudPrintProxy* ServiceProcess::GetCloudPrintProxy() { 137 CloudPrintProxy* ServiceProcess::GetCloudPrintProxy() {
126 if (!cloud_print_proxy_.get()) { 138 if (!cloud_print_proxy_.get()) {
127 cloud_print_proxy_.reset(new CloudPrintProxy()); 139 cloud_print_proxy_.reset(new CloudPrintProxy());
128 cloud_print_proxy_->Initialize(service_prefs_.get()); 140 cloud_print_proxy_->Initialize(service_prefs_.get(), this);
129 } 141 }
130 return cloud_print_proxy_.get(); 142 return cloud_print_proxy_.get();
131 } 143 }
132 144
145 void ServiceProcess::OnCloudPrintProxyEnabled() {
146 // Save the preference that we have enabled the cloud print proxy.
147 service_prefs_->prefs()->SetBoolean(prefs::kCloudPrintProxyEnabled, true);
148 service_prefs_->WritePrefs();
149 OnServiceEnabled();
150 }
151
152 void ServiceProcess::OnCloudPrintProxyDisabled() {
153 // Save the preference that we have disabled the cloud print proxy.
154 service_prefs_->prefs()->SetBoolean(prefs::kCloudPrintProxyEnabled, false);
155 service_prefs_->WritePrefs();
156 OnServiceDisabled();
157 }
158
159 void ServiceProcess::OnServiceEnabled() {
160 enabled_services_++;
161 if (1 == enabled_services_) {
162 AddServiceProcessToAutoStart();
163 }
164 }
165
166 void ServiceProcess::OnServiceDisabled() {
167 DCHECK(0 != enabled_services_);
168 enabled_services_--;
169 if (0 == enabled_services_) {
170 RemoveServiceProcessFromAutoStart();
171 Shutdown();
172 }
173 }
174
175 bool ServiceProcess::AddServiceProcessToAutoStart() {
176 // TODO(sanjeevr): This needs to move to some common place like base or
177 // chrome/common and implementation for non-Windows platforms needs to be added.
178 #if defined(OS_WIN)
179 FilePath chrome_path;
180 if (PathService::Get(base::FILE_EXE, &chrome_path)) {
181 CommandLine cmd_line(chrome_path);
182 cmd_line.AppendSwitchASCII(switches::kProcessType,
183 switches::kServiceProcess);
184 // We need a unique name for the command per user-date-dir. Just use the
185 // channel name.
186 return win_util::AddCommandToAutoRun(
187 HKEY_CURRENT_USER, UTF8ToWide(GetServiceProcessChannelName()),
188 cmd_line.command_line_string());
189 }
190 #endif // defined(OS_WIN)
191 return false;
192 }
193
194 bool ServiceProcess::RemoveServiceProcessFromAutoStart() {
195 // TODO(sanjeevr): This needs to move to some common place like base or
196 // chrome/common and implementation for non-Windows platforms needs to be added.
197 #if defined(OS_WIN)
198 return win_util::RemoveCommandFromAutoRun(
199 HKEY_CURRENT_USER, UTF8ToWide(GetServiceProcessChannelName()));
200 #endif // defined(OS_WIN)
201 return false;
202 }
203
204
133 #if defined(ENABLE_REMOTING) 205 #if defined(ENABLE_REMOTING)
134 bool ServiceProcess::EnableChromotingHostWithTokens( 206 bool ServiceProcess::EnableChromotingHostWithTokens(
135 const std::string& login, 207 const std::string& login,
136 const std::string& remoting_token, 208 const std::string& remoting_token,
137 const std::string& talk_token) { 209 const std::string& talk_token) {
138 // Save the login info and tokens. 210 // Save the login info and tokens.
139 remoting_login_ = login; 211 remoting_login_ = login;
140 remoting_token_ = remoting_token; 212 remoting_token_ = remoting_token;
141 talk_token_ = talk_token; 213 talk_token_ = talk_token;
142 214
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
183 chromoting_config_, 255 chromoting_config_,
184 capturer.release(), 256 capturer.release(),
185 encoder.release(), 257 encoder.release(),
186 executor.release()); 258 executor.release());
187 259
188 // Then start the chromoting host. 260 // Then start the chromoting host.
189 // When ChromotingHost is shutdown because of failure or a request that 261 // When ChromotingHost is shutdown because of failure or a request that
190 // we made OnChromotingShutdown() is calls. 262 // we made OnChromotingShutdown() is calls.
191 chromoting_host_->Start( 263 chromoting_host_->Start(
192 NewRunnableMethod(this, &ServiceProcess::OnChromotingHostShutdown)); 264 NewRunnableMethod(this, &ServiceProcess::OnChromotingHostShutdown));
265 OnServiceEnabled();
193 return true; 266 return true;
194 } 267 }
195 268
196 bool ServiceProcess::ShutdownChromotingHost() { 269 bool ServiceProcess::ShutdownChromotingHost() {
197 // Chromoting host doesn't exist so return true. 270 // Chromoting host doesn't exist so return true.
198 if (!chromoting_host_) 271 if (!chromoting_host_)
199 return true; 272 return true;
200 273
201 // Shutdown the chromoting host asynchronously. This will signal the host to 274 // Shutdown the chromoting host asynchronously. This will signal the host to
202 // shutdown, we'll actually wait for all threads to stop when we destroy 275 // shutdown, we'll actually wait for all threads to stop when we destroy
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
293 #endif 366 #endif
294 367
295 ServiceProcess::~ServiceProcess() { 368 ServiceProcess::~ServiceProcess() {
296 Teardown(); 369 Teardown();
297 g_service_process = NULL; 370 g_service_process = NULL;
298 } 371 }
299 372
300 // Disable refcounting for runnable method because it is really not needed 373 // Disable refcounting for runnable method because it is really not needed
301 // when we post tasks on the main message loop. 374 // when we post tasks on the main message loop.
302 DISABLE_RUNNABLE_METHOD_REFCOUNT(ServiceProcess); 375 DISABLE_RUNNABLE_METHOD_REFCOUNT(ServiceProcess);
OLDNEW
« no previous file with comments | « chrome/service/service_process.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698