#ifndef PLATFORM_API_BLUETOOTH_CLASSIC_H_ #define PLATFORM_API_BLUETOOTH_CLASSIC_H_ #include #include #include "platform/base/byte_array.h" #include "platform/base/cancellation_flag.h" #include "platform/base/exception.h" #include "platform/base/input_stream.h" #include "platform/base/listeners.h" #include "platform/base/output_stream.h" namespace location { namespace nearby { namespace api { // https://developer.android.com/reference/android/bluetooth/BluetoothDevice.html. class BluetoothDevice { public: virtual ~BluetoothDevice() = default; // https://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#getName() virtual std::string GetName() const = 0; // Returns BT MAC address assigned to this device. virtual std::string GetMacAddress() const = 0; }; // https://developer.android.com/reference/android/bluetooth/BluetoothSocket.html. class BluetoothSocket { public: virtual ~BluetoothSocket() = default; // NOTE: // It is an undefined behavior if GetInputStream() or GetOutputStream() is // called for a not-connected BluetoothSocket, i.e. any object that is not // returned by BluetoothClassicMedium::ConnectToService() for client side or // BluetoothServerSocket::Accept() for server side of connection. // Returns the InputStream of this connected BluetoothSocket. virtual InputStream& GetInputStream() = 0; // Returns the OutputStream of this connected BluetoothSocket. virtual OutputStream& GetOutputStream() = 0; // Closes both input and output streams, marks Socket as closed. // After this call object should be treated as not connected. // Returns Exception::kIo on error, Exception::kSuccess otherwise. virtual Exception Close() = 0; // https://developer.android.com/reference/android/bluetooth/BluetoothSocket.html#getRemoteDevice() // Returns valid BluetoothDevice pointer if there is a connection, and // nullptr otherwise. virtual BluetoothDevice* GetRemoteDevice() = 0; }; // https://developer.android.com/reference/android/bluetooth/BluetoothServerSocket.html. class BluetoothServerSocket { public: virtual ~BluetoothServerSocket() = default; // https://developer.android.com/reference/android/bluetooth/BluetoothServerSocket.html#accept() // // Blocks until either: // - at least one incoming connection request is available, or // - ServerSocket is closed. // On success, returns connected socket, ready to exchange data. // Returns nullptr on error. // Once error is reported, it is permanent, and ServerSocket has to be closed. virtual std::unique_ptr Accept() = 0; // https://developer.android.com/reference/android/bluetooth/BluetoothServerSocket.html#close() // // Returns Exception::kIo on error, Exception::kSuccess otherwise. virtual Exception Close() = 0; }; // Container of operations that can be performed over the Bluetooth Classic // medium. class BluetoothClassicMedium { public: virtual ~BluetoothClassicMedium() = default; struct DiscoveryCallback { // BluetoothDevice is a proxy object created as a result of BT discovery. // Its lifetime spans between calls to device_discovered_cb and // device_lost_cb. // It is safe to use BluetoothDevice in device_discovered_cb() callback // and at any time afterwards, until device_lost_cb() is called. // It is not safe to use BluetoothDevice after returning from // device_lost_cb() callback. std::function device_discovered_cb = DefaultCallback(); std::function device_name_changed_cb = DefaultCallback(); std::function device_lost_cb = DefaultCallback(); }; // https://developer.android.com/reference/android/bluetooth/BluetoothAdapter.html#startDiscovery() // // Returns true once the process of discovery has been initiated. virtual bool StartDiscovery(DiscoveryCallback discovery_callback) = 0; // https://developer.android.com/reference/android/bluetooth/BluetoothAdapter.html#cancelDiscovery() // // Returns true once discovery is well and truly stopped; after this returns, // there must be no more invocations of the DiscoveryCallback passed in to // StartDiscovery(). virtual bool StopDiscovery() = 0; // A combination of // https://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#createInsecureRfcommSocketToServiceRecord // followed by // https://developer.android.com/reference/android/bluetooth/BluetoothSocket.html#connect(). // // service_uuid is the canonical textual representation // (https://en.wikipedia.org/wiki/Universally_unique_identifier#Format) of a // type 3 name-based // (https://en.wikipedia.org/wiki/Universally_unique_identifier#Versions_3_and_5_(namespace_name-based)) // UUID. // // On success, returns a new BluetoothSocket. // On error, returns nullptr. virtual std::unique_ptr ConnectToService( BluetoothDevice& remote_device, const std::string& service_uuid, CancellationFlag* cancellation_flag) = 0; // https://developer.android.com/reference/android/bluetooth/BluetoothAdapter.html#listenUsingInsecureRfcommWithServiceRecord // // service_uuid is the canonical textual representation // (https://en.wikipedia.org/wiki/Universally_unique_identifier#Format) of a // type 3 name-based // (https://en.wikipedia.org/wiki/Universally_unique_identifier#Versions_3_and_5_(namespace_name-based)) // UUID. // // Returns nullptr error. virtual std::unique_ptr ListenForService( const std::string& service_name, const std::string& service_uuid) = 0; virtual BluetoothDevice* GetRemoteDevice(const std::string& mac_address) = 0; }; } // namespace api } // namespace nearby } // namespace location #endif // PLATFORM_API_BLUETOOTH_CLASSIC_H_