// Copyright (c) 2012 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_SOCKET_H_ #define DEVICE_BLUETOOTH_BLUETOOTH_SOCKET_H_ #include <string> #include "base/callback.h" #include "base/memory/ref_counted.h" namespace net { class IOBuffer; } // namespace net namespace device { class BluetoothDevice; class BluetoothUUID; // BluetoothSocket represents a socket to a specific service on a // BluetoothDevice. BluetoothSocket objects are ref counted and may outlive // both the BluetoothDevice and BluetoothAdapter that were involved in their // creation. In terms of threading, platform specific implementations may // differ slightly, but platform independent consumers must guarantee calling // various instance methods on the same thread as the thread used at // construction time -- platform specific implementation are resonsible for // marshalling calls to a different thread if required. class BluetoothSocket : public base::RefCountedThreadSafe<BluetoothSocket> { public: enum ErrorReason { kSystemError, kIOPending, kDisconnected }; typedef base::Callback<void(int)> SendCompletionCallback; typedef base::Callback<void(int, scoped_refptr<net::IOBuffer> io_buffer)> ReceiveCompletionCallback; typedef base::Callback<void(const BluetoothDevice* device, scoped_refptr<BluetoothSocket> socket)> AcceptCompletionCallback; typedef base::Callback<void(const std::string& error_message)> ErrorCompletionCallback; typedef base::Callback<void(ErrorReason, const std::string& error_message)> ReceiveErrorCompletionCallback; // Destroys resources associated with the socket. After calling this method, // it is illegal to call any method on this socket instance (except for the // desctrutor via Release). virtual void Close() = 0; // Gracefully disconnects the socket and calls |callback| upon completion. // There is no failure case, as this is a best effort operation. virtual void Disconnect(const base::Closure& success_callback) = 0; // Receives data from the socket and calls |success_callback| when data is // available. |buffer_size| specifies the maximum number of bytes that can be // received. If an error occurs, calls |error_callback| with a reason and an // error message. virtual void Receive( int buffer_size, const ReceiveCompletionCallback& success_callback, const ReceiveErrorCompletionCallback& error_callback) = 0; // Sends |buffer| to the socket and calls |success_callback| when data has // been successfully sent. |buffer_size| is the number of bytes contained in // |buffer|. If an error occurs, calls |error_callback| with an error message. virtual void Send(scoped_refptr<net::IOBuffer> buffer, int buffer_size, const SendCompletionCallback& success_callback, const ErrorCompletionCallback& error_callback) = 0; // Accepts a pending client connection from the socket and calls // |success_callback| on completion, passing a new BluetoothSocket instance // for the new client. If an error occurs, calls |error_callback| with a // reason and an error message. virtual void Accept(const AcceptCompletionCallback& success_callback, const ErrorCompletionCallback& error_callback) = 0; protected: friend class base::RefCountedThreadSafe<BluetoothSocket>; virtual ~BluetoothSocket(); }; } // namespace device #endif // DEVICE_BLUETOOTH_BLUETOOTH_SOCKET_H_