dom/bluetooth/bluedroid/BluetoothDaemonInterface.h
author Wes Kocher <wkocher@mozilla.com>
Wed, 07 Oct 2015 10:19:19 -0700
changeset 299948 41dea9df27ed995f8315ab4318c187a617937664
parent 299739 91d4539e00cecb658604e021675a923c60ef3235
child 301450 4226f38eb8b0a6cdd3a9ffbad8c72e39bb7e5f6a
permissions -rw-r--r--
Backed out changeset 91d4539e00ce (bug 1207245)

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
 * You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef mozilla_dom_bluetooth_bluedroid_BluetoothDaemonInterface_h
#define mozilla_dom_bluetooth_bluedroid_BluetoothDaemonInterface_h

#include "BluetoothInterface.h"
#include "mozilla/ipc/DaemonSocketConsumer.h"
#include "mozilla/ipc/ListenSocketConsumer.h"

namespace mozilla {
namespace ipc {

class DaemonSocket;
class ListenSocket;

}
}

BEGIN_BLUETOOTH_NAMESPACE

class BluetoothDaemonA2dpInterface;
class BluetoothDaemonAvrcpInterface;
class BluetoothDaemonGattInterface;
class BluetoothDaemonHandsfreeInterface;
class BluetoothDaemonProtocol;
class BluetoothDaemonSocketInterface;

class BluetoothDaemonInterface final
  : public BluetoothInterface
  , public mozilla::ipc::DaemonSocketConsumer
  , public mozilla::ipc::ListenSocketConsumer
{
public:
  class CleanupResultHandler;
  class InitResultHandler;
  class StartDaemonTask;

  friend class CleanupResultHandler;
  friend class InitResultHandler;
  friend class StartDaemonTask;

  static BluetoothDaemonInterface* GetInstance();

  void Init(BluetoothNotificationHandler* aNotificationHandler,
            BluetoothResultHandler* aRes) override;
  void Cleanup(BluetoothResultHandler* aRes) override;

  void Enable(BluetoothResultHandler* aRes) override;
  void Disable(BluetoothResultHandler* aRes) override;

  /* Adapter Properties */

  void GetAdapterProperties(BluetoothResultHandler* aRes) override;
  void GetAdapterProperty(BluetoothPropertyType aType,
                          BluetoothResultHandler* aRes) override;
  void SetAdapterProperty(const BluetoothProperty& aProperty,
                          BluetoothResultHandler* aRes) override;

  /* Remote Device Properties */

  void GetRemoteDeviceProperties(const BluetoothAddress& aRemoteAddr,
                                 BluetoothResultHandler* aRes) override;
  void GetRemoteDeviceProperty(const BluetoothAddress& aRemoteAddr,
                               BluetoothPropertyType aType,
                               BluetoothResultHandler* aRes) override;
  void SetRemoteDeviceProperty(const BluetoothAddress& aRemoteAddr,
                               const BluetoothProperty& aProperty,
                               BluetoothResultHandler* aRes) override;

  /* Remote Services */

  void GetRemoteServiceRecord(const BluetoothAddress& aRemoteAddr,
                              const BluetoothUuid& aUuid,
                              BluetoothResultHandler* aRes) override;
  void GetRemoteServices(const BluetoothAddress& aRemoteAddr,
                         BluetoothResultHandler* aRes) override;

  /* Discovery */

  void StartDiscovery(BluetoothResultHandler* aRes) override;
  void CancelDiscovery(BluetoothResultHandler* aRes) override;

  /* Bonds */

  void CreateBond(const BluetoothAddress& aBdAddr,
                  BluetoothTransport aTransport,
                  BluetoothResultHandler* aRes) override;
  void RemoveBond(const BluetoothAddress& aBdAddr,
                  BluetoothResultHandler* aRes) override;
  void CancelBond(const BluetoothAddress& aBdAddr,
                  BluetoothResultHandler* aRes) override;

  /* Connection */

  void GetConnectionState(const BluetoothAddress& aBdAddr,
                          BluetoothResultHandler* aRes) override;

  /* Authentication */

  void PinReply(const BluetoothAddress& aBdAddr, bool aAccept,
                const BluetoothPinCode& aPinCode,
                BluetoothResultHandler* aRes) override;

  void SspReply(const BluetoothAddress& aBdAddr,
                BluetoothSspVariant aVariant,
                bool aAccept, uint32_t aPasskey,
                BluetoothResultHandler* aRes) override;

  /* DUT Mode */

  void DutModeConfigure(bool aEnable, BluetoothResultHandler* aRes);
  void DutModeSend(uint16_t aOpcode, uint8_t* aBuf, uint8_t aLen,
                   BluetoothResultHandler* aRes) override;

  /* LE Mode */

  void LeTestMode(uint16_t aOpcode, uint8_t* aBuf, uint8_t aLen,
                  BluetoothResultHandler* aRes) override;

  /* Energy Information */

  void ReadEnergyInfo(BluetoothResultHandler* aRes) override;

  /* Profile Interfaces */

  BluetoothSocketInterface* GetBluetoothSocketInterface() override;
  BluetoothHandsfreeInterface* GetBluetoothHandsfreeInterface() override;
  BluetoothA2dpInterface* GetBluetoothA2dpInterface() override;
  BluetoothAvrcpInterface* GetBluetoothAvrcpInterface() override;
  BluetoothGattInterface* GetBluetoothGattInterface() override;

protected:
  enum Channel {
    LISTEN_SOCKET,
    CMD_CHANNEL,
    NTF_CHANNEL
  };

  BluetoothDaemonInterface();
  ~BluetoothDaemonInterface();

  // Methods for |DaemonSocketConsumer| and |ListenSocketConsumer|
  //

  void OnConnectSuccess(int aIndex) override;
  void OnConnectError(int aIndex) override;
  void OnDisconnect(int aIndex) override;

private:
  void DispatchError(BluetoothResultHandler* aRes, BluetoothStatus aStatus);
  void DispatchError(BluetoothResultHandler* aRes, nsresult aRv);

  nsCString mListenSocketName;
  nsRefPtr<mozilla::ipc::ListenSocket> mListenSocket;
  nsRefPtr<mozilla::ipc::DaemonSocket> mCmdChannel;
  nsRefPtr<mozilla::ipc::DaemonSocket> mNtfChannel;
  nsAutoPtr<BluetoothDaemonProtocol> mProtocol;

  nsTArray<nsRefPtr<BluetoothResultHandler> > mResultHandlerQ;

  nsAutoPtr<BluetoothDaemonSocketInterface> mSocketInterface;
  nsAutoPtr<BluetoothDaemonHandsfreeInterface> mHandsfreeInterface;
  nsAutoPtr<BluetoothDaemonA2dpInterface> mA2dpInterface;
  nsAutoPtr<BluetoothDaemonAvrcpInterface> mAvrcpInterface;
  nsAutoPtr<BluetoothDaemonGattInterface> mGattInterface;
};

END_BLUETOOTH_NAMESPACE

#endif // mozilla_dom_bluetooth_bluedroid_BluetoothDaemonInterface_h