17d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
57d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef CHROMEOS_DBUS_BLUETOOTH_PROFILE_SERVICE_PROVIDER_H_
67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define CHROMEOS_DBUS_BLUETOOTH_PROFILE_SERVICE_PROVIDER_H_
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <string>
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/basictypes.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/callback.h"
12b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/chromeos_export.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "dbus/bus.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "dbus/file_descriptor.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "dbus/object_path.h"
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace chromeos {
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// BluetoothProfileServiceProvider is used to provide a D-Bus object that the
217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Bluetooth daemon can communicate with to connect application profiles.
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Instantiate with a chosen D-Bus object path and delegate object, and pass
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// the D-Bus object path as the |agent_path| argument to the
257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// chromeos::BluetoothProfileManagerClient::RegisterProfile() method.
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// When an incoming profile connection occurs, or after initiating a connection
287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// using the chromeos::BluetoothDeviceClient::ConnectProfile() method, the
297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Bluetooth daemon will make calls to this profile object and they will be
307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// passed on to your Delegate object for handling. Responses should be returned
317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// using the callbacks supplied to those methods.
327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class CHROMEOS_EXPORT BluetoothProfileServiceProvider {
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Interface for reacting to profile requests.
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  class Delegate {
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   public:
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual ~Delegate() {}
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Possible status values that may be returned to callbacks on a new
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // connection or a requested disconnection. Success indicates acceptance,
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // reject indicates the user rejected or denied the request; cancelled
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // means the user cancelled the request without confirming either way.
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    enum Status {
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SUCCESS,
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      REJECTED,
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CANCELLED
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    };
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Connection-specific options.
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    struct CHROMEOS_EXPORT Options {
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      Options() {}
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ~Options() {}
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // Profile version.
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      uint16 version;
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      // Profile features.
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      uint16 features;
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    };
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // The ConfirmationCallback is used for methods which require confirmation;
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // it should be called with one argument, the |status| of the request
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // (success, rejected or cancelled).
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    typedef base::Callback<void(Status)> ConfirmationCallback;
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // This method will be called when the profile is unregistered from the
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Bluetooth daemon, generally at shutdown or at the applications' request.
68a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    // It may be used to perform cleanup tasks. This corresponds to the
69a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    // org.bluez.Profile1.Release method and is renamed to avoid a conflict
70a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    // with base::Refcounted<T>.
71a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    virtual void Released() = 0;
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // This method will be called when a profile connection to the device
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // with object path |device_path| is established. |callback| must be called
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // to confirm the connection, or indicate rejection or cancellation.
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    //
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // A file descriptor for the connection socket is provided in |fd|, and
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // details about the specific implementation of the profile in |options|.
79b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    //
80b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    // IMPORTANT: Ownership of the file descriptor object |fd| is passed to
81b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    // the delegate by this call. The delegate is responsible for checking the
82b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    // validity of |fd| on a thread where I/O is permitted before taking the
83b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    // value. If the value is not taken, the file descriptor is closed.
84b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    //
85b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    // Ownership of |options| is NOT passed so information out of it must be
86b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    // copied if required.
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual void NewConnection(const dbus::ObjectPath& device_path,
88b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                               scoped_ptr<dbus::FileDescriptor> fd,
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               const Options& options,
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               const ConfirmationCallback& callback) = 0;
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // This method will be called when a profile connection to the device
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // with object path |device_path| is disconnected. Any file descriptors
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // owned by the service should be cleaned up and |callback| called to
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // confirm, or indicate rejection or cancellation of the disconnection.
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual void RequestDisconnection(const dbus::ObjectPath& device_path,
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      const ConfirmationCallback& callback) = 0;
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // This method will be called by the Bluetooth daemon to indicate that
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // a profile request failed before a reply was returned from the device.
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual void Cancel() = 0;
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual ~BluetoothProfileServiceProvider();
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Creates the instance where |bus| is the D-Bus bus connection to export
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // the object onto, |object_path| is the object path that it should have
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // and |delegate| is the object to which all method calls will be passed
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // and responses generated from.
1107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  static BluetoothProfileServiceProvider* Create(
1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      dbus::Bus* bus,
1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const dbus::ObjectPath& object_path,
1137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      Delegate* delegate);
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
1167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  BluetoothProfileServiceProvider();
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BluetoothProfileServiceProvider);
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace chromeos
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif  // CHROMEOS_DBUS_BLUETOOTH_PROFILE_SERVICE_PROVIDER_H_
125