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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_SERVICE_SERVICE_PROCESS_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_SERVICE_SERVICE_PROCESS_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/sequenced_worker_pool.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/waitable_event.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/service/cloud_print/cloud_print_proxy.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ServiceProcessPrefs;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ServiceIPCServer;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ServiceURLRequestContextGetter;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ServiceProcessState;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace base {
24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class CommandLine;
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NetworkChangeNotifier;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The ServiceProcess does not inherit from ChildProcess because this
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// process can live independently of the browser process.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ServiceProcess Design Notes
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// https://sites.google.com/a/chromium.org/dev/developers/design-documents/service-processes
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ServiceProcess : public cloud_print::CloudPrintProxy::Client {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ServiceProcess();
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ServiceProcess();
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize the ServiceProcess with the message loop that it should run on.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ServiceProcess takes ownership of |state|.
42a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  bool Initialize(base::MessageLoopForUI* message_loop,
43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                  const base::CommandLine& command_line,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  ServiceProcessState* state);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Teardown();
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(sanjeevr): Change various parts of the code such as
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // net::ProxyService::CreateSystemProxyConfigService to take in
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // MessageLoopProxy* instead of MessageLoop*. When we have done that, we can
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // remove the io_thread() and file_thread() accessors and replace them with
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // io_message_loop_proxy() and file_message_loop_proxy() respectively.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the thread that we perform I/O coordination on (network requests,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // communication with renderers, etc.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NOTE: You should ONLY use this to pass to IPC or other objects which must
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // need a MessageLoop*. If you just want to post a task, use the thread's
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // message_loop_proxy() as it takes care of checking that a thread is still
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // alive, race conditions, lifetime differences etc.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If you still must use this, need to check the return value for NULL.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Thread* io_thread() const {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return io_thread_.get();
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the thread that we perform random file operations on. For code
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that wants to do I/O operations (not network requests or even file: URL
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // requests), this is the thread to use to avoid blocking the UI thread.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Thread* file_thread() const {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return file_thread_.get();
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A global event object that is signalled when the main thread's message
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // loop exits. This gives background threads a way to observe the main
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // thread shutting down.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WaitableEvent* shutdown_event() {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return &shutdown_event_;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Shutdown the service process. This is likely triggered by a IPC message.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Shutdown();
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetUpdateAvailable() {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    update_available_ = true;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool update_available() const { return update_available_; }
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called by the IPC server when a client disconnects. A return value of
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // true indicates that the IPC server should continue listening for new
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // connections.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HandleClientDisconnect();
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cloud_print::CloudPrintProxy* GetCloudPrintProxy();
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CloudPrintProxy::Client implementation.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnCloudPrintProxyEnabled(bool persist_state) OVERRIDE;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnCloudPrintProxyDisabled(bool persist_state) OVERRIDE;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ServiceURLRequestContextGetter* GetServiceURLRequestContextGetter();
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class TestServiceProcess;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Schedule a call to ShutdownIfNeeded.
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ScheduleShutdownCheck();
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Shuts down the process if no services are enabled and no clients are
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // connected.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ShutdownIfNeeded();
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Schedule a call to CloudPrintPolicyCheckIfNeeded.
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ScheduleCloudPrintPolicyCheck();
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Launch the browser for a policy check if we're not connected.
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CloudPrintPolicyCheckIfNeeded();
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called exactly ONCE per process instance for each service that gets
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // enabled in this process.
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnServiceEnabled();
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called exactly ONCE per process instance for each service that gets
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // disabled in this process (note that shutdown != disabled).
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnServiceDisabled();
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Terminate forces the service process to quit.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Terminate();
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<net::NetworkChangeNotifier> network_change_notifier_;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Thread> io_thread_;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Thread> file_thread_;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<base::SequencedWorkerPool> blocking_pool_;
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<cloud_print::CloudPrintProxy> cloud_print_proxy_;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ServiceProcessPrefs> service_prefs_;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ServiceIPCServer> ipc_server_;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ServiceProcessState> service_process_state_;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // An event that will be signalled when we shutdown.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WaitableEvent shutdown_event_;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pointer to the main message loop that host this object.
138a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  base::MessageLoop* main_message_loop_;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Count of currently enabled services in this process.
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int enabled_services_;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Speficies whether a product update is available.
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool update_available_;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<ServiceURLRequestContextGetter> request_context_getter_;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ServiceProcess);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern ServiceProcess* g_service_process;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_SERVICE_SERVICE_PROCESS_H_
154