123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// found in the LICENSE file.
423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#ifndef CHROMEOS_DBUS_BLUETOOTH_GATT_SERVICE_CLIENT_H_
623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#define CHROMEOS_DBUS_BLUETOOTH_GATT_SERVICE_CLIENT_H_
723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include <string>
923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include <vector>
1023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "chromeos/chromeos_export.h"
1223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "chromeos/dbus/dbus_client.h"
1323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "dbus/object_path.h"
1423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "dbus/property.h"
1523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)namespace chromeos {
1723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// BluetoothGattServiceClient is used to communicate with remote GATT service
1923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// objects exposed by the Bluetooth daemon.
2023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)class CHROMEOS_EXPORT BluetoothGattServiceClient : public DBusClient {
2123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) public:
2223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Structure of properties associated with GATT services.
2323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  struct Properties : public dbus::PropertySet {
2423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // The 128-bit service UUID. [read-only]
2523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    dbus::Property<std::string> uuid;
2623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
27c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // Object path of the Bluetooth device that the GATT service belongs to.
28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    dbus::Property<dbus::ObjectPath> device;
29c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
30c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // Whether or not this service is a primary service.
31c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    dbus::Property<bool> primary;
32c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // Array of object paths representing the characteristics of this service.
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // [read-only]
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    dbus::Property<std::vector<dbus::ObjectPath> > characteristics;
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // Array of object paths representing the included services of this service.
3823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // [read-only]
3923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    dbus::Property<std::vector<dbus::ObjectPath> > includes;
4023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
4123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    Properties(dbus::ObjectProxy* object_proxy,
4223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)               const std::string& interface_name,
4323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)               const PropertyChangedCallback& callback);
4423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    virtual ~Properties();
4523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  };
4623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
4723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Interface for observing changes from a remote GATT service.
4823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  class Observer {
4923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)   public:
5023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    virtual ~Observer() {}
5123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
5223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // Called when the GATT service with object path |object_path| is added to
5323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // the system.
5423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    virtual void GattServiceAdded(const dbus::ObjectPath& object_path) {}
5523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
5623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // Called when the GATT service with object path |object_path| is removed
5723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // from the system.
5823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    virtual void GattServiceRemoved(const dbus::ObjectPath& object_path) {}
5923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
6023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // Called when the GATT service with object path |object_path| has a change
6123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // in the value of the property named |property_name|.
6223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    virtual void GattServicePropertyChanged(const dbus::ObjectPath& object_path,
6323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                            const std::string& property_name) {}
6423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  };
6523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
6623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  virtual ~BluetoothGattServiceClient();
6723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
6823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Adds and removes observers for events on all remote GATT services. Check
6923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // the |object_path| parameter of observer methods to determine which GATT
7023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // service is issuing the event.
7123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  virtual void AddObserver(Observer* observer) = 0;
7223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  virtual void RemoveObserver(Observer* observer) = 0;
7323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
7423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Returns the list of GATT service object paths known to the system.
7523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  virtual std::vector<dbus::ObjectPath> GetServices() = 0;
7623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
7723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Obtain the properties for the GATT service with object path |object_path|.
7823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Values should be copied if needed.
7923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  virtual Properties* GetProperties(const dbus::ObjectPath& object_path) = 0;
8023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
8123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Creates the instance.
8223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  static BluetoothGattServiceClient* Create();
8323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
8423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) protected:
8523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  BluetoothGattServiceClient();
8623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
8723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) private:
8823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BluetoothGattServiceClient);
8923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)};
9023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
9123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}  // namespace chromeos
9223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
9323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#endif  // CHROMEOS_DBUS_BLUETOOTH_GATT_SERVICE_CLIENT_H_
94