| OLD | NEW |
| 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/browser/service/service_process_control.h" | 5 #include "chrome/browser/service/service_process_control.h" |
| 6 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "base/file_path.h" | 8 #include "base/file_path.h" |
| 9 #include "base/process_util.h" | 9 #include "base/process_util.h" |
| 10 #include "base/thread.h" | 10 #include "base/thread.h" |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 84 ServiceProcessControl::ServiceProcessControl(Profile* profile, | 84 ServiceProcessControl::ServiceProcessControl(Profile* profile, |
| 85 ServiceProcessType type) | 85 ServiceProcessType type) |
| 86 : profile_(profile), | 86 : profile_(profile), |
| 87 type_(type), | 87 type_(type), |
| 88 message_handler_(NULL) { | 88 message_handler_(NULL) { |
| 89 } | 89 } |
| 90 | 90 |
| 91 ServiceProcessControl::~ServiceProcessControl() { | 91 ServiceProcessControl::~ServiceProcessControl() { |
| 92 } | 92 } |
| 93 | 93 |
| 94 void ServiceProcessControl::Connect(Task* task) { | 94 void ServiceProcessControl::ConnectInternal(Task* task) { |
| 95 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); | 95 // If the channel has already been established then we run the task |
| 96 // and return. |
| 96 if (channel_.get()) { | 97 if (channel_.get()) { |
| 97 task->Run(); | 98 if (task) { |
| 98 delete task; | 99 task->Run(); |
| 100 delete task; |
| 101 } |
| 99 return; | 102 return; |
| 100 } | 103 } |
| 101 | 104 |
| 102 // Saves the task. | 105 // Actually going to connect. |
| 106 LOG(INFO) << "Connecting to Service Process IPC Server"; |
| 103 connect_done_task_.reset(task); | 107 connect_done_task_.reset(task); |
| 104 ConnectInternal(); | |
| 105 } | |
| 106 | 108 |
| 107 void ServiceProcessControl::ConnectInternal() { | |
| 108 LOG(INFO) << "Connecting to Service Process IPC Server"; | |
| 109 // Run the IPC channel on the shared IO thread. | 109 // Run the IPC channel on the shared IO thread. |
| 110 base::Thread* io_thread = g_browser_process->io_thread(); | 110 base::Thread* io_thread = g_browser_process->io_thread(); |
| 111 | 111 |
| 112 // TODO(hclam): Determine the the channel id from profile and type. | 112 // TODO(hclam): Determine the the channel id from profile and type. |
| 113 // TODO(hclam): Handle error connecting to channel. | 113 // TODO(hclam): Handle error connecting to channel. |
| 114 const std::string channel_id = GetServiceProcessChannelName(type_); | 114 const std::string channel_id = GetServiceProcessChannelName(type_); |
| 115 channel_.reset( | 115 channel_.reset( |
| 116 new IPC::SyncChannel(channel_id, IPC::Channel::MODE_CLIENT, this, NULL, | 116 new IPC::SyncChannel(channel_id, IPC::Channel::MODE_CLIENT, this, NULL, |
| 117 io_thread->message_loop(), true, | 117 io_thread->message_loop(), true, |
| 118 g_browser_process->shutdown_event())); | 118 g_browser_process->shutdown_event())); |
| 119 channel_->set_sync_messages_with_no_timeout_allowed(false); | 119 channel_->set_sync_messages_with_no_timeout_allowed(false); |
| 120 } | 120 } |
| 121 | 121 |
| 122 void ServiceProcessControl::Launch(Task* task) { | 122 void ServiceProcessControl::Launch(Task* task) { |
| 123 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); | 123 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); |
| 124 if (channel_.get()) { | 124 |
| 125 if (task) { | 125 // If the service process is already running then connects to it. |
| 126 task->Run(); | 126 if (CheckServiceProcessRunning(kServiceProcessCloudPrint)) { |
| 127 delete task; | 127 ConnectInternal(task); |
| 128 } | |
| 129 return; | 128 return; |
| 130 } | 129 } |
| 131 | 130 |
| 132 // A service process should have a different mechanism for starting, but now | 131 // A service process should have a different mechanism for starting, but now |
| 133 // we start it as if it is a child process. | 132 // we start it as if it is a child process. |
| 134 FilePath exe_path = ChildProcessHost::GetChildPath(true); | 133 FilePath exe_path = ChildProcessHost::GetChildPath(true); |
| 135 if (exe_path.empty()) { | 134 if (exe_path.empty()) { |
| 136 NOTREACHED() << "Unable to get service process binary name."; | 135 NOTREACHED() << "Unable to get service process binary name."; |
| 137 } | 136 } |
| 138 | 137 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 157 | 156 |
| 158 // And then start the process asynchronously. | 157 // And then start the process asynchronously. |
| 159 launcher_ = new Launcher(this, cmd_line); | 158 launcher_ = new Launcher(this, cmd_line); |
| 160 launcher_->Run( | 159 launcher_->Run( |
| 161 NewRunnableMethod(this, &ServiceProcessControl::OnProcessLaunched, task)); | 160 NewRunnableMethod(this, &ServiceProcessControl::OnProcessLaunched, task)); |
| 162 } | 161 } |
| 163 | 162 |
| 164 void ServiceProcessControl::OnProcessLaunched(Task* task) { | 163 void ServiceProcessControl::OnProcessLaunched(Task* task) { |
| 165 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); | 164 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); |
| 166 if (launcher_->launched()) { | 165 if (launcher_->launched()) { |
| 167 // Now use the launch task as the connect task. | |
| 168 connect_done_task_.reset(task); | |
| 169 | |
| 170 // After we have successfully created the service process we try to connect | 166 // After we have successfully created the service process we try to connect |
| 171 // to it. The launch task is transfered to a connect task. | 167 // to it. The launch task is transfered to a connect task. |
| 172 ConnectInternal(); | 168 ConnectInternal(task); |
| 173 } else if (task) { | 169 } else if (task) { |
| 174 // If we don't have process handle that means launching the service process | 170 // If we don't have process handle that means launching the service process |
| 175 // has failed. | 171 // has failed. |
| 176 task->Run(); | 172 task->Run(); |
| 177 delete task; | 173 delete task; |
| 178 } | 174 } |
| 179 | 175 |
| 180 // We don't need the launcher anymore. | 176 // We don't need the launcher anymore. |
| 181 launcher_ = NULL; | 177 launcher_ = NULL; |
| 182 } | 178 } |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 226 bool ServiceProcessControl::EnableRemotingWithTokens( | 222 bool ServiceProcessControl::EnableRemotingWithTokens( |
| 227 const std::string& user, | 223 const std::string& user, |
| 228 const std::string& remoting_token, | 224 const std::string& remoting_token, |
| 229 const std::string& talk_token) { | 225 const std::string& talk_token) { |
| 230 return Send( | 226 return Send( |
| 231 new ServiceMsg_EnableRemotingWithTokens(user, remoting_token, | 227 new ServiceMsg_EnableRemotingWithTokens(user, remoting_token, |
| 232 talk_token)); | 228 talk_token)); |
| 233 } | 229 } |
| 234 | 230 |
| 235 DISABLE_RUNNABLE_METHOD_REFCOUNT(ServiceProcessControl); | 231 DISABLE_RUNNABLE_METHOD_REFCOUNT(ServiceProcessControl); |
| OLD | NEW |