Index: chrome/browser/extensions/api/bluetooth/bluetooth_api.cc |
diff --git a/chrome/browser/extensions/api/bluetooth/bluetooth_api.cc b/chrome/browser/extensions/api/bluetooth/bluetooth_api.cc |
index acac2e1f6e85a48197e3f3b9975cea340be337b4..8905b419cd63755cb63611093838b451ac36fd72 100644 |
--- a/chrome/browser/extensions/api/bluetooth/bluetooth_api.cc |
+++ b/chrome/browser/extensions/api/bluetooth/bluetooth_api.cc |
@@ -13,46 +13,24 @@ |
#include "chrome/browser/extensions/api/bluetooth/bluetooth_event_router.h" |
#include "chrome/browser/profiles/profile_manager.h" |
#include "chrome/common/extensions/api/bluetooth.h" |
-#include "chrome/common/extensions/api/bluetooth/bluetooth_manifest_data.h" |
#include "content/public/browser/browser_thread.h" |
#include "device/bluetooth/bluetooth_adapter.h" |
#include "device/bluetooth/bluetooth_device.h" |
-#include "device/bluetooth/bluetooth_profile.h" |
-#include "device/bluetooth/bluetooth_service_record.h" |
-#include "device/bluetooth/bluetooth_socket.h" |
#include "extensions/browser/event_router.h" |
-#include "extensions/common/permissions/permissions_data.h" |
-#include "net/base/io_buffer.h" |
using content::BrowserContext; |
using content::BrowserThread; |
using device::BluetoothAdapter; |
using device::BluetoothDevice; |
-using device::BluetoothProfile; |
-using device::BluetoothServiceRecord; |
-using device::BluetoothSocket; |
-using extensions::BluetoothApiSocket; |
- |
-namespace AddProfile = extensions::api::bluetooth::AddProfile; |
namespace bluetooth = extensions::api::bluetooth; |
-namespace Connect = extensions::api::bluetooth::Connect; |
-namespace Disconnect = extensions::api::bluetooth::Disconnect; |
namespace GetDevice = extensions::api::bluetooth::GetDevice; |
namespace GetDevices = extensions::api::bluetooth::GetDevices; |
-namespace RemoveProfile = extensions::api::bluetooth::RemoveProfile; |
-namespace Send = extensions::api::bluetooth::Send; |
namespace { |
const char kInvalidDevice[] = "Invalid device"; |
-const char kInvalidUuid[] = "Invalid UUID"; |
-const char kPermissionDenied[] = "Permission to add profile denied."; |
-const char kProfileAlreadyRegistered[] = |
- "This profile has already been registered"; |
-const char kProfileNotFound[] = "Profile not found: invalid uuid"; |
-const char kProfileRegistrationFailed[] = "Profile registration failed"; |
const char kStartDiscoveryFailed[] = "Starting discovery failed"; |
const char kStopDiscoveryFailed[] = "Failed to stop discovery"; |
@@ -62,28 +40,6 @@ extensions::BluetoothEventRouter* GetEventRouter(BrowserContext* context) { |
return extensions::BluetoothAPI::Get(context)->event_router(); |
} |
-static void DispatchConnectionEventWorker( |
- void* browser_context_id, |
- const std::string& extension_id, |
- const device::BluetoothUUID& profile_uuid, |
- const device::BluetoothDevice* device, |
- scoped_refptr<device::BluetoothSocket> socket) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- |
- content::BrowserContext* context = |
- reinterpret_cast<content::BrowserContext*>(browser_context_id); |
- if (!extensions::ExtensionsBrowserClient::Get()->IsValidContext(context)) |
- return; |
- |
- extensions::BluetoothAPI* bluetooth_api = |
- extensions::BluetoothAPI::Get(context); |
- if (!bluetooth_api) |
- return; |
- |
- bluetooth_api->DispatchConnectionEvent( |
- extension_id, profile_uuid, device, socket); |
-} |
- |
} // namespace |
namespace extensions { |
@@ -103,10 +59,6 @@ BluetoothAPI* BluetoothAPI::Get(BrowserContext* context) { |
return GetFactoryInstance()->Get(context); |
} |
-BluetoothAPI::ConnectionParams::ConnectionParams() {} |
- |
-BluetoothAPI::ConnectionParams::~ConnectionParams() {} |
- |
BluetoothAPI::BluetoothAPI(content::BrowserContext* context) |
: browser_context_(context) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
@@ -128,22 +80,6 @@ BluetoothEventRouter* BluetoothAPI::event_router() { |
return event_router_.get(); |
} |
-scoped_refptr<BluetoothAPI::SocketData> BluetoothAPI::socket_data() { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- if (!socket_data_) { |
- ApiResourceManager<BluetoothApiSocket>* socket_manager = |
- ApiResourceManager<BluetoothApiSocket>::Get(browser_context_); |
- DCHECK(socket_manager) |
- << "There is no socket manager. " |
- "If this assertion is failing during a test, then it is likely that " |
- "TestExtensionSystem is failing to provide an instance of " |
- "ApiResourceManager<BluetoothApiSocket>."; |
- |
- socket_data_ = socket_manager->data_; |
- } |
- return socket_data_; |
-} |
- |
void BluetoothAPI::Shutdown() { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
EventRouter::Get(browser_context_)->UnregisterObserver(this); |
@@ -161,86 +97,6 @@ void BluetoothAPI::OnListenerRemoved(const EventListenerInfo& details) { |
event_router()->OnListenerRemoved(); |
} |
-void BluetoothAPI::DispatchConnectionEvent( |
- const std::string& extension_id, |
- const device::BluetoothUUID& uuid, |
- const device::BluetoothDevice* device, |
- scoped_refptr<device::BluetoothSocket> socket) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- |
- if (!event_router()->HasProfile(uuid)) |
- return; |
- |
- extensions::BluetoothAPI::ConnectionParams params; |
- params.browser_context_id = browser_context_; |
- params.thread_id = BluetoothApiSocket::kThreadId; |
- params.extension_id = extension_id; |
- params.uuid = uuid; |
- params.device_address = device->GetAddress(); |
- params.socket = socket; |
- params.socket_data = socket_data(); |
- BrowserThread::PostTask( |
- params.thread_id, FROM_HERE, base::Bind(&RegisterSocket, params)); |
-} |
- |
-// static |
-void BluetoothAPI::RegisterSocket( |
- const BluetoothAPI::ConnectionParams& params) { |
- DCHECK(BrowserThread::CurrentlyOn(params.thread_id)); |
- |
- BluetoothApiSocket* api_socket = new BluetoothApiSocket( |
- params.extension_id, params.socket, params.device_address, params.uuid); |
- int socket_id = params.socket_data->Add(api_socket); |
- |
- BrowserThread::PostTask(BrowserThread::UI, |
- FROM_HERE, |
- base::Bind(&RegisterSocketUI, params, socket_id)); |
-} |
- |
-// static |
-void BluetoothAPI::RegisterSocketUI(const ConnectionParams& params, |
- int socket_id) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- |
- content::BrowserContext* context = |
- reinterpret_cast<content::BrowserContext*>(params.browser_context_id); |
- if (!extensions::ExtensionsBrowserClient::Get()->IsValidContext(context)) |
- return; |
- |
- BluetoothAPI::Get(context)->event_router()->GetAdapter( |
- base::Bind(&RegisterSocketWithAdapterUI, params, socket_id)); |
-} |
- |
-void BluetoothAPI::RegisterSocketWithAdapterUI( |
- const ConnectionParams& params, |
- int socket_id, |
- scoped_refptr<device::BluetoothAdapter> adapter) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- |
- content::BrowserContext* context = |
- reinterpret_cast<content::BrowserContext*>(params.browser_context_id); |
- if (!extensions::ExtensionsBrowserClient::Get()->IsValidContext(context)) |
- return; |
- |
- BluetoothDevice* device = adapter->GetDevice(params.device_address); |
- if (!device) |
- return; |
- |
- api::bluetooth::Socket result_socket; |
- bluetooth::BluetoothDeviceToApiDevice(*device, &result_socket.device); |
- result_socket.uuid = params.uuid.canonical_value(); |
- result_socket.id = socket_id; |
- |
- scoped_ptr<base::ListValue> args = |
- bluetooth::OnConnection::Create(result_socket); |
- scoped_ptr<Event> event( |
- new Event(bluetooth::OnConnection::kEventName, args.Pass())); |
- |
- EventRouter* router = EventRouter::Get(context); |
- if (router) |
- router->DispatchEventToExtension(params.extension_id, event.Pass()); |
-} |
- |
namespace api { |
BluetoothGetAdapterStateFunction::~BluetoothGetAdapterStateFunction() {} |
@@ -304,228 +160,6 @@ bool BluetoothGetDeviceFunction::DoWork( |
return false; |
} |
-BluetoothAddProfileFunction::BluetoothAddProfileFunction() {} |
- |
-BluetoothAddProfileFunction::~BluetoothAddProfileFunction() {} |
- |
-bool BluetoothAddProfileFunction::RunAsync() { |
- DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
- scoped_ptr<AddProfile::Params> params(AddProfile::Params::Create(*args_)); |
- EXTENSION_FUNCTION_VALIDATE(params.get() != NULL); |
- |
- device::BluetoothUUID uuid(params->profile.uuid); |
- |
- if (!uuid.IsValid()) { |
- SetError(kInvalidUuid); |
- return false; |
- } |
- |
- BluetoothPermissionRequest param(params->profile.uuid); |
- if (!BluetoothManifestData::CheckRequest(GetExtension(), param)) { |
- error_ = kPermissionDenied; |
- return false; |
- } |
- |
- uuid_ = uuid; |
- |
- if (GetEventRouter(browser_context())->HasProfile(uuid_)) { |
- SetError(kProfileAlreadyRegistered); |
- return false; |
- } |
- |
- BluetoothProfile::Options options; |
- if (params->profile.name.get()) |
- options.name = *params->profile.name.get(); |
- if (params->profile.channel.get()) |
- options.channel = *params->profile.channel.get(); |
- if (params->profile.psm.get()) |
- options.psm = *params->profile.psm.get(); |
- if (params->profile.require_authentication.get()) { |
- options.require_authentication = |
- *params->profile.require_authentication.get(); |
- } |
- if (params->profile.require_authorization.get()) { |
- options.require_authorization = |
- *params->profile.require_authorization.get(); |
- } |
- if (params->profile.auto_connect.get()) |
- options.auto_connect = *params->profile.auto_connect.get(); |
- if (params->profile.version.get()) |
- options.version = *params->profile.version.get(); |
- if (params->profile.features.get()) |
- options.features = *params->profile.features.get(); |
- |
- RegisterProfile( |
- options, |
- base::Bind(&BluetoothAddProfileFunction::OnProfileRegistered, this)); |
- |
- return true; |
-} |
- |
-void BluetoothAddProfileFunction::RegisterProfile( |
- const BluetoothProfile::Options& options, |
- const BluetoothProfile::ProfileCallback& callback) { |
- DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
- BluetoothProfile::Register(uuid_, options, callback); |
-} |
- |
-void BluetoothAddProfileFunction::OnProfileRegistered( |
- BluetoothProfile* bluetooth_profile) { |
- DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
- if (!bluetooth_profile) { |
- SetError(kProfileRegistrationFailed); |
- SendResponse(false); |
- return; |
- } |
- |
- if (GetEventRouter(browser_context())->HasProfile(uuid_)) { |
- bluetooth_profile->Unregister(); |
- SetError(kProfileAlreadyRegistered); |
- SendResponse(false); |
- return; |
- } |
- |
- bluetooth_profile->SetConnectionCallback( |
- base::Bind(&DispatchConnectionEventWorker, |
- browser_context(), |
- extension_id(), |
- uuid_)); |
- GetEventRouter(browser_context()) |
- ->AddProfile(uuid_, extension_id(), bluetooth_profile); |
- SendResponse(true); |
-} |
- |
-BluetoothRemoveProfileFunction::~BluetoothRemoveProfileFunction() {} |
- |
-bool BluetoothRemoveProfileFunction::RunSync() { |
- DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
- scoped_ptr<RemoveProfile::Params> params( |
- RemoveProfile::Params::Create(*args_)); |
- |
- device::BluetoothUUID uuid(params->profile.uuid); |
- |
- if (!uuid.IsValid()) { |
- SetError(kInvalidUuid); |
- return false; |
- } |
- |
- if (!GetEventRouter(browser_context())->HasProfile(uuid)) { |
- SetError(kProfileNotFound); |
- return false; |
- } |
- |
- GetEventRouter(browser_context())->RemoveProfile(uuid); |
- return true; |
-} |
- |
-BluetoothConnectFunction::~BluetoothConnectFunction() {} |
- |
-bool BluetoothConnectFunction::DoWork(scoped_refptr<BluetoothAdapter> adapter) { |
- scoped_ptr<Connect::Params> params(Connect::Params::Create(*args_)); |
- EXTENSION_FUNCTION_VALIDATE(params.get() != NULL); |
- const bluetooth::ConnectOptions& options = params->options; |
- |
- device::BluetoothUUID uuid(options.profile.uuid); |
- |
- if (!uuid.IsValid()) { |
- SetError(kInvalidUuid); |
- SendResponse(false); |
- return false; |
- } |
- |
- BluetoothDevice* device = adapter->GetDevice(options.device.address); |
- if (!device) { |
- SetError(kInvalidDevice); |
- SendResponse(false); |
- return false; |
- } |
- |
- BluetoothProfile* bluetooth_profile = |
- GetEventRouter(browser_context())->GetProfile(uuid); |
- if (!bluetooth_profile) { |
- SetError(kProfileNotFound); |
- SendResponse(false); |
- return false; |
- } |
- |
- device->ConnectToProfile( |
- bluetooth_profile, |
- base::Bind(&BluetoothConnectFunction::OnConnectedCallback, |
- this, |
- adapter, |
- device->GetAddress()), |
- base::Bind(&BluetoothConnectFunction::OnErrorCallback, this)); |
- |
- return true; |
-} |
- |
-void BluetoothConnectFunction::OnConnectedCallback( |
- scoped_refptr<device::BluetoothAdapter> adapter, |
- const std::string& device_address) { |
- DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
- |
- // TODO(tengs): Remove this once we have an API for starting the connection |
- // monitor. |
- BluetoothDevice* device = adapter->GetDevice(device_address); |
- if (!device) { |
- SetError(kInvalidDevice); |
- SendResponse(false); |
- return; |
- } |
- // Start the connection monitor, and return success even if this fails, |
- // as the connection was still opened successfully. |
- device->StartConnectionMonitor( |
- base::Bind(&BluetoothConnectFunction::OnMonitorStartedCallback, this), |
- base::Bind(&BluetoothConnectFunction::OnMonitorStartedCallback, this)); |
-} |
- |
-void BluetoothConnectFunction::OnMonitorStartedCallback() { |
- DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
- SendResponse(true); |
-} |
- |
-void BluetoothConnectFunction::OnErrorCallback(const std::string& error) { |
- DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
- SetError(error); |
- SendResponse(false); |
-} |
- |
-bool BluetoothDisconnectFunction::RunAsync() { |
- // TODO(keybuk): Remove. |
- SetError("Removed. Use chrome.bluetoothSocket.disconnect() instead."); |
- return false; |
-} |
- |
-bool BluetoothSendFunction::RunAsync() { |
- // TODO(keybuk): Remove. |
- SetError("Removed. Use chrome.bluetoothSocket.send() instead."); |
- return false; |
-} |
- |
-bool BluetoothUpdateSocketFunction::RunAsync() { |
- // TODO(keybuk): Remove. |
- SetError("Removed. Use chrome.bluetoothSocket.update() instead."); |
- return false; |
-} |
- |
-bool BluetoothSetSocketPausedFunction::RunAsync() { |
- // TODO(keybuk): Remove. |
- SetError("Removed. Use chrome.bluetoothSocket.setPaused() instead."); |
- return false; |
-} |
- |
-bool BluetoothGetSocketFunction::RunAsync() { |
- // TODO(keybuk): Remove. |
- SetError("Removed. Use chrome.bluetoothSocket.getInfo() instead."); |
- return false; |
-} |
- |
-bool BluetoothGetSocketsFunction::RunAsync() { |
- // TODO(keybuk): Remove. |
- SetError("Removed. Use chrome.bluetoothSocket.getSockets() instead."); |
- return false; |
-} |
- |
void BluetoothStartDiscoveryFunction::OnSuccessCallback() { |
SendResponse(true); |
} |