15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#ifndef CHROME_BROWSER_SERVICE_PROCESS_SERVICE_PROCESS_CONTROL_H_ 6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define CHROME_BROWSER_SERVICE_PROCESS_SERVICE_PROCESS_CONTROL_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <queue> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h" 151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/cancelable_callback.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/id_map.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/singleton.h" 19bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "base/process/process.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_channel_proxy.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_listener.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_sender.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace base { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CommandLine; 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace cloud_print { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct CloudPrintProxyInfo; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace cloud_print 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A ServiceProcessControl works as a portal between the service process and 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the browser process. 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// It is used to start and terminate the service process. It is also used 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to send and receive IPC messages from the service process. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// THREADING 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class is accessed on the UI thread through some UI actions. It then 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// talks to the IPC channel on the IO thread. 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ServiceProcessControl : public IPC::Sender, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public IPC::Listener, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public content::NotificationObserver { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) enum ServiceProcessEvent { 490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) SERVICE_EVENT_INITIALIZE, 500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) SERVICE_EVENT_ENABLED_ON_LAUNCH, 510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) SERVICE_EVENT_ENABLE, 520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) SERVICE_EVENT_DISABLE, 530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) SERVICE_EVENT_DISABLE_BY_POLICY, 540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) SERVICE_EVENT_LAUNCH, 550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) SERVICE_EVENT_LAUNCHED, 560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) SERVICE_EVENT_LAUNCH_FAILED, 570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) SERVICE_EVENT_CHANNEL_CONNECTED, 580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) SERVICE_EVENT_CHANNEL_ERROR, 590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) SERVICE_EVENT_INFO_REQUEST, 600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) SERVICE_EVENT_INFO_REPLY, 610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) SERVICE_EVENT_HISTOGRAMS_REQUEST, 620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) SERVICE_EVENT_HISTOGRAMS_REPLY, 63effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SERVICE_PRINTERS_REQUEST, 64effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SERVICE_PRINTERS_REPLY, 650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) SERVICE_EVENT_MAX, 660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) }; 670f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef IDMap<ServiceProcessControl>::iterator iterator; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::queue<IPC::Message> MessageQueue; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef base::Callback<void(const cloud_print::CloudPrintProxyInfo&)> 71effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch CloudPrintProxyInfoCallback; 72effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch typedef base::Callback<void(const std::vector<std::string>&)> 73effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch PrintersCallback; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the singleton instance of this class. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static ServiceProcessControl* GetInstance(); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return true if this object is connected to the service. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Virtual for testing. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsConnected() const; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If no service process is currently running, creates a new service process 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and connects to it. If a service process is already running this method 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will try to connect to it. 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |success_task| is called when we have successfully launched the process 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and connected to it. 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |failure_task| is called when we failed to connect to the service process. 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It is OK to pass the same value for |success_task| and |failure_task|. In 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this case, the task is invoked on success or failure. 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that if we are already connected to service process then 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |success_task| can be invoked in the context of the Launch call. 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Virtual for testing. 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Launch(const base::Closure& success_task, 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Closure& failure_task); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disconnect the IPC channel from the service process. 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Virtual for testing. 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Disconnect(); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // IPC::Listener implementation. 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnChannelConnected(int32 peer_pid) OVERRIDE; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnChannelError() OVERRIDE; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // IPC::Sender implementation 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Send(IPC::Message* message) OVERRIDE; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // content::NotificationObserver implementation. 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Observe(int type, 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) OVERRIDE; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send a shutdown message to the service process. IPC channel will be 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // destroyed after calling this method. 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return true if the message was sent. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Virtual for testing. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Shutdown(); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send request for cloud print proxy info (enabled state, email, proxy id). 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The callback gets the information when received. 1211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Returns true if request was sent. Callback will be called only in case of 1221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // reply from service. The method resets any previous callback. 1231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // This call starts service if needed. 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool GetCloudPrintProxyInfo( 125effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const CloudPrintProxyInfoCallback& cloud_print_status_callback); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Send request for histograms collected in service process. 1281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Returns true if request was sent, and callback will be called in case of 1291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // success or timeout. The method resets any previous callback. 1301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Returns false if service is not running or other failure, callback will not 1311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // be called in this case. 1321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool GetHistograms(const base::Closure& cloud_print_status_callback, 1331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const base::TimeDelta& timeout); 1341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 135effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Send request for printers available for cloud print proxy. 136effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // The callback gets the information when received. 137effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Returns true if request was sent. Callback will be called only in case of 138effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // reply from service. The method resets any previous callback. 139effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // This call starts service if needed. 140effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool GetPrinters(const PrintersCallback& enumerate_printers_callback); 141effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This class is responsible for launching the service process on the 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PROCESS_LAUNCHER thread. 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class Launcher 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public base::RefCountedThreadSafe<ServiceProcessControl::Launcher> { 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) Launcher(ServiceProcessControl* process, 1496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) scoped_ptr<base::CommandLine> cmd_line); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Execute the command line to start the process asynchronously. After the 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // command is executed |task| is called with the process handle on the UI 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // thread. 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Run(const base::Closure& task); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool launched() const { return launched_; } 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::RefCountedThreadSafe<ServiceProcessControl::Launcher>; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~Launcher(); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DoDetectLaunched(); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // !OS_MACOSX 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DoRun(); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Notify(); 1671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) void CloseProcessHandle(); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ServiceProcessControl* process_; 169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<base::CommandLine> cmd_line_; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Closure notify_task_; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool launched_; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 retry_count_; 1731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::ProcessHandle process_handle_; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class MockServiceProcessControl; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class CloudPrintProxyPolicyStartupTest; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ServiceProcessControl(); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ServiceProcessControl(); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend struct DefaultSingletonTraits<ServiceProcessControl>; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::vector<base::Closure> TaskList; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Message handlers 1871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) void OnCloudPrintProxyInfo( 1881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const cloud_print::CloudPrintProxyInfo& proxy_info); 1891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) void OnHistograms(const std::vector<std::string>& pickled_histograms); 190effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void OnPrinters(const std::vector<std::string>& printers); 1911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Runs callback provided in |GetHistograms()|. 1931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) void RunHistogramsCallback(); 1941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper method to invoke all the callbacks based on success or failure. 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RunConnectDoneTasks(); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Method called by Launcher when the service process is launched. 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnProcessLaunched(); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used internally to connect to the service process. 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ConnectInternal(); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Takes ownership of the pointer. Split out for testing. 20546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void SetChannel(scoped_ptr<IPC::ChannelProxy> channel); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void RunAllTasksHelper(TaskList* task_list); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // IPC channel to the service process. 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<IPC::ChannelProxy> channel_; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Service process launcher. 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<Launcher> launcher_; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callbacks that get invoked when the channel is successfully connected. 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TaskList connect_success_tasks_; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callbacks that get invoked when there was a connection failure. 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TaskList connect_failure_tasks_; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 220effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Callback that gets invoked when a printers is received from 221effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // the cloud print proxy. 222effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch PrintersCallback printers_callback_; 223effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback that gets invoked when a status message is received from 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the cloud print proxy. 226effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch CloudPrintProxyInfoCallback cloud_print_info_callback_; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Callback that gets invoked when a message with histograms is received from 2291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // the service process. 2301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::Closure histograms_callback_; 2311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationRegistrar registrar_; 2331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Callback that gets invoked if service didn't reply in time. 2351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::CancelableClosure histograms_timeout_callback_; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 238f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif // CHROME_BROWSER_SERVICE_PROCESS_SERVICE_PROCESS_CONTROL_H_ 239