| Index: components/arc/arc_bridge_service.h
 | 
| diff --git a/components/arc/arc_bridge_service.h b/components/arc/arc_bridge_service.h
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..b13f8a7d7e1b274318482b63fb31b0c2bbab11e1
 | 
| --- /dev/null
 | 
| +++ b/components/arc/arc_bridge_service.h
 | 
| @@ -0,0 +1,166 @@
 | 
| +// Copyright 2015 The Chromium Authors. All rights reserved.
 | 
| +// Use of this source code is governed by a BSD-style license that can be
 | 
| +// found in the LICENSE file.
 | 
| +
 | 
| +#ifndef COMPONENTS_ARC_ARC_BRIDGE_SERVICE_H_
 | 
| +#define COMPONENTS_ARC_ARC_BRIDGE_SERVICE_H_
 | 
| +
 | 
| +#include "base/macros.h"
 | 
| +#include "base/observer_list.h"
 | 
| +#include "base/sequenced_task_runner.h"
 | 
| +#include "chromeos/dbus/dbus_method_call_status.h"
 | 
| +#include "components/keyed_service/core/keyed_service.h"
 | 
| +#include "ipc/ipc_channel_proxy.h"
 | 
| +#include "ipc/ipc_listener.h"
 | 
| +#include "ipc/ipc_message.h"
 | 
| +
 | 
| +class PrefRegistrySimple;
 | 
| +class PrefService;
 | 
| +
 | 
| +namespace arc {
 | 
| +
 | 
| +class ArcBridgeTest;
 | 
| +
 | 
| +// The Chrome-side service that handles ARC instances and ARC bridge creation.
 | 
| +// This service handles the lifetime of ARC instances and sets up the
 | 
| +// communication channel (the ARC bridge) used to send and receive messages.
 | 
| +class ArcBridgeService : public KeyedService,
 | 
| +                         public IPC::Listener {
 | 
| + public:
 | 
| +  enum State {
 | 
| +    // An attempt to start the ARC instance was done, but it resulted in an
 | 
| +    // error.
 | 
| +    ERROR,
 | 
| +
 | 
| +    // ARC is enabled in this machine, but has not started.
 | 
| +    STOPPED,
 | 
| +
 | 
| +    // The bridge has connected to the socket, but has not started the ARC
 | 
| +    // instance.
 | 
| +    CONNECTED,
 | 
| +
 | 
| +    // The ARC bridge has been set up and ARC is starting up.
 | 
| +    STARTING,
 | 
| +
 | 
| +    // The ARC instance has been fully initialized and is now ready for user
 | 
| +    // interaction.
 | 
| +    READY
 | 
| +  };
 | 
| +
 | 
| +  class Observer {
 | 
| +   public:
 | 
| +    // Called whenever the state of the bridge has changed.
 | 
| +    virtual void OnStateChanged(State state) {}
 | 
| +
 | 
| +    // Called whenever ARC's enabled status has changed for this session.
 | 
| +    virtual void OnEnabledChanged(bool enabled) {}
 | 
| +
 | 
| +   protected:
 | 
| +    virtual ~Observer() {}
 | 
| +  };
 | 
| +
 | 
| +  explicit ArcBridgeService(
 | 
| +      const scoped_refptr<base::SequencedTaskRunner>& file_task_runner);
 | 
| +  virtual ~ArcBridgeService();
 | 
| +
 | 
| +  // Registers ARC preferences.
 | 
| +  static void RegisterPrefs(PrefRegistrySimple* registry);
 | 
| +
 | 
| +  // Reads from the preference store if ARC has been enabled.
 | 
| +  static bool GetEnabledPref(PrefService* pref_service);
 | 
| +
 | 
| +  // HandleStartup() should be called upon profile startup.  This will only
 | 
| +  // launch an instance if the instance service is available and it is enabled.
 | 
| +  void HandleStartup();
 | 
| +
 | 
| +  // Shuts down the running instance, if any.  This is safe to call even if
 | 
| +  // there is no instance running.
 | 
| +  void Shutdown();
 | 
| +
 | 
| +  // Adds or removes observers.
 | 
| +  void AddObserver(Observer* observer);
 | 
| +  void RemoveObserver(Observer* observer);
 | 
| +
 | 
| +  // Gets the current state of the bridge service.
 | 
| +  State GetState() const { return state_; }
 | 
| +
 | 
| +  // Enables or disables the bridge for this session.
 | 
| +  void SetEnabled(bool enabled);
 | 
| +
 | 
| +  // Gets if the bridge is enabled for this session.
 | 
| +  bool IsEnabled() const { return enabled_; }
 | 
| +
 | 
| +  // Requests registration of an input device on the ARC instance.
 | 
| +  // TODO(denniskempin): Make this interface more typesafe.
 | 
| +  // |name| should be the displayable name of the emulated device (e.g. "Chrome
 | 
| +  // OS Keyboard"), |device_type| the name of the device type (e.g. "keyboard")
 | 
| +  // and |fd| a file descriptor that emulates the kernel events of the device.
 | 
| +  bool RegisterInputDevice(const std::string& name,
 | 
| +                           const std::string& device_type,
 | 
| +                           base::ScopedFD fd);
 | 
| +
 | 
| + private:
 | 
| +  friend class arc::ArcBridgeTest;
 | 
| +
 | 
| +  // Binds to the socket specified by |socket_path|.
 | 
| +  void SocketConnect(const base::FilePath& socket_path,
 | 
| +                     bool directory_creation_success);
 | 
| +
 | 
| +  // Internal connection method. Separated to make testing easier.
 | 
| +  bool Connect(const IPC::ChannelHandle& handle, IPC::Channel::Mode mode);
 | 
| +
 | 
| +  // Finishes connecting after setting socket permissions.
 | 
| +  void FinishConnectAfterSetSocketPermissions(const base::FilePath& socket_path,
 | 
| +                                              bool socket_permissions_success);
 | 
| +
 | 
| +  // Called when the ARC instance has finished setting up and is ready for user
 | 
| +  // interaction.
 | 
| +  void OnInstanceReady();
 | 
| +
 | 
| +  // Changes the current state and notify all observers.
 | 
| +  void NotifyStateChanged(State state);
 | 
| +
 | 
| +  // Finishes shutdown after deleting the socket file.
 | 
| +  void FinishShutdownAfterSocketDeleted(bool socket_deleted);
 | 
| +
 | 
| +  // IPC::Listener:
 | 
| +  bool OnMessageReceived(const IPC::Message& message) override;
 | 
| +
 | 
| +  // DBus callbacks.
 | 
| +  void OnInstanceStarted(chromeos::DBusMethodCallStatus status);
 | 
| +  void OnInstanceStopped(chromeos::DBusMethodCallStatus status);
 | 
| +
 | 
| +  // Thread in which IPC messaging is performed.
 | 
| +  base::Thread ipc_thread_;
 | 
| +
 | 
| +  // Task runner on which incoming messages are handled.
 | 
| +  scoped_refptr<base::SequencedTaskRunner> origin_task_runner_;
 | 
| +
 | 
| +  // Task runner on which file operations are performed.
 | 
| +  scoped_refptr<base::SequencedTaskRunner> file_task_runner_;
 | 
| +
 | 
| +  // The channel through which messages are sent.
 | 
| +  scoped_ptr<IPC::ChannelProxy> ipc_channel_;
 | 
| +
 | 
| +  // List of observers to notify of state changes.
 | 
| +  // Makes sure list is empty on destruction.
 | 
| +  base::ObserverList<Observer, true> observer_list_;
 | 
| +
 | 
| +  // If the ARC instance service is available.
 | 
| +  bool available_;
 | 
| +
 | 
| +  // If ARC has been enabled by policy and user choice.
 | 
| +  bool enabled_;
 | 
| +
 | 
| +  // The current state of the bridge.
 | 
| +  ArcBridgeService::State state_;
 | 
| +
 | 
| +  // WeakPtrFactory to use callbacks.
 | 
| +  base::WeakPtrFactory<ArcBridgeService> weak_factory_;
 | 
| +
 | 
| +  DISALLOW_COPY_AND_ASSIGN(ArcBridgeService);
 | 
| +};
 | 
| +
 | 
| +}  // namespace arc
 | 
| +
 | 
| +#endif  // COMPONENTS_ARC_ARC_BRIDGE_SERVICE_H_
 | 
| 
 |