// Copyright 2014 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 DEVICE_BLUETOOTH_BLUETOOTH_CHANNEL_MAC_H_
#define DEVICE_BLUETOOTH_BLUETOOTH_CHANNEL_MAC_H_
#import <IOKit/IOReturn.h>
#include <string>
#include "base/macros.h"
@class IOBluetoothDevice;
namespace device {
class BluetoothSocketMac;
// Wraps a native RFCOMM or L2CAP channel.
class BluetoothChannelMac {
public:
BluetoothChannelMac();
virtual ~BluetoothChannelMac();
// Sets the channel's owning socket to |socket|. Should only be called if the
// socket was previously unset. Note: This can synchronously call back into
// socket->OnChannelOpenComplete().
virtual void SetSocket(BluetoothSocketMac* socket);
// Returns the Bluetooth address for the device associated with |this|
// channel.
std::string GetDeviceAddress();
// Returns the Bluetooth device associated with |this| channel.
virtual IOBluetoothDevice* GetDevice() = 0;
// Returns the outgoing MTU (maximum transmission unit) for the channel.
virtual uint16_t GetOutgoingMTU() = 0;
// Writes |data| of length |length| bytes into the channel. The |refcon| is a
// user-supplied value that gets passed to the write callback.
// Returns kIOReturnSuccess if the data was buffered successfully.
// If the return value is an error condition none of the data was sent.
// The number of bytes to be sent must not exceed the channel MTU.
//
// Once the data has been successfully passed to the hardware to be
// transmitted, the socket's method OnChannelWriteComplete() will be called
// with the |refcon| that was passed to this method.
virtual IOReturn WriteAsync(void* data, uint16_t length, void* refcon) = 0;
protected:
BluetoothSocketMac* socket() { return socket_; }
private:
// The socket that owns |this|.
BluetoothSocketMac* socket_;
DISALLOW_COPY_AND_ASSIGN(BluetoothChannelMac);
};
} // namespace device
#endif // DEVICE_BLUETOOTH_BLUETOOTH_CHANNEL_MAC_H_