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