1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// found in the LICENSE file.
4f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#ifndef DEVICE_BLUETOOTH_BLUETOOTH_L2CAP_CHANNEL_MAC_H_
6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#define DEVICE_BLUETOOTH_BLUETOOTH_L2CAP_CHANNEL_MAC_H_
7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#import <IOBluetooth/IOBluetooth.h>
9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#import <IOKit/IOReturn.h>
10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/mac/scoped_nsobject.h"
12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/macros.h"
13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "device/bluetooth/bluetooth_channel_mac.h"
15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)@class BluetoothL2capChannelDelegate;
17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace device {
19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class BluetoothL2capChannelMac : public BluetoothChannelMac {
21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public:
22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Creates a new L2CAP channel wrapper with the given |socket| and native
23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // |channel|.
24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // NOTE: The |channel| is expected to already be retained.
25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  BluetoothL2capChannelMac(BluetoothSocketMac* socket,
26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                           IOBluetoothL2CAPChannel* channel);
27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual ~BluetoothL2capChannelMac();
28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Opens a new L2CAP channel with Channel ID |channel_id| to the target
30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // |device|. Returns the opened channel and sets |status| to kIOReturnSuccess
31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // if the open process was successfully started (or if an existing L2CAP
32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // channel was found). Otherwise, sets |status| to an error status.
33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  static scoped_ptr<BluetoothL2capChannelMac> OpenAsync(
34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      BluetoothSocketMac* socket,
35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      IOBluetoothDevice* device,
36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      BluetoothL2CAPPSM psm,
37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      IOReturn* status);
38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // BluetoothChannelMac:
40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void SetSocket(BluetoothSocketMac* socket) OVERRIDE;
41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual IOBluetoothDevice* GetDevice() OVERRIDE;
42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual uint16_t GetOutgoingMTU() OVERRIDE;
43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual IOReturn WriteAsync(void* data,
44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                              uint16_t length,
45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                              void* refcon) OVERRIDE;
46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void OnChannelOpenComplete(IOBluetoothL2CAPChannel* channel,
48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                             IOReturn status);
49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void OnChannelClosed(IOBluetoothL2CAPChannel* channel);
50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void OnChannelDataReceived(IOBluetoothL2CAPChannel* channel,
51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                             void* data,
52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                             size_t length);
53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void OnChannelWriteComplete(IOBluetoothL2CAPChannel* channel,
54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                              void* refcon,
55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                              IOReturn status);
56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private:
58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // The wrapped native L2CAP channel.
59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::scoped_nsobject<IOBluetoothL2CAPChannel> channel_;
60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // The delegate for the native channel.
62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::scoped_nsobject<BluetoothL2capChannelDelegate> delegate_;
63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BluetoothL2capChannelMac);
65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)};
66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}  // namespace device
68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif  // DEVICE_BLUETOOTH_BLUETOOTH_L2CAP_CHANNEL_MAC_H_
70