diff --git a/dom/bluetooth/BluetoothAdapter.cpp b/dom/bluetooth/BluetoothAdapter.cpp index 4799df3d66a7..02b8682e2997 100644 --- a/dom/bluetooth/BluetoothAdapter.cpp +++ b/dom/bluetooth/BluetoothAdapter.cpp @@ -54,10 +54,10 @@ NS_INTERFACE_MAP_END_INHERITING(nsDOMEventTargetHelper) NS_IMPL_ADDREF_INHERITED(BluetoothAdapter, nsDOMEventTargetHelper) NS_IMPL_RELEASE_INHERITED(BluetoothAdapter, nsDOMEventTargetHelper) -class GetPairedDevicesTask : public BluetoothReplyRunnable +class GetDevicesTask : public BluetoothReplyRunnable { public: - GetPairedDevicesTask(BluetoothAdapter* aAdapterPtr, + GetDevicesTask(BluetoothAdapter* aAdapterPtr, nsIDOMDOMRequest* aReq) : BluetoothReplyRunnable(aReq), mAdapterPtr(aAdapterPtr) @@ -237,6 +237,12 @@ BluetoothAdapter::SetPropertyByValue(const BluetoothNamedValue& aValue) Root(); } else if (name.EqualsLiteral("Devices")) { mDeviceAddresses = value.get_ArrayOfnsString(); + + uint32_t length = mDeviceAddresses.Length(); + for (int i = 0; i < length; i++) { + mDeviceAddresses[i] = GetAddressFromObjectPath(mDeviceAddresses[i]); + } + nsresult rv; nsIScriptContext* sc = GetContextForEventHandlers(&rv); NS_ENSURE_SUCCESS_VOID(rv); @@ -453,23 +459,40 @@ BluetoothAdapter::SetDiscoverableTimeout(const uint32_t aDiscoverableTimeout, } NS_IMETHODIMP -BluetoothAdapter::GetPairedDevices(nsIDOMDOMRequest** aRequest) +BluetoothAdapter::GetConnectedDevices(uint16_t aProfileId, + nsIDOMDOMRequest** aRequest) { + MOZ_ASSERT(NS_IsMainThread()); nsCOMPtr req; - nsresult rv; - rv = PrepareDOMRequest(GetOwner(), getter_AddRefs(req)); + nsresult rv = PrepareDOMRequest(GetOwner(), getter_AddRefs(req)); NS_ENSURE_SUCCESS(rv, NS_ERROR_FAILURE); nsRefPtr results = - new GetPairedDevicesTask(this, req); + new GetDevicesTask(this, req); BluetoothService* bs = BluetoothService::Get(); NS_ENSURE_TRUE(bs, NS_ERROR_FAILURE); - if (NS_FAILED(bs->GetPairedDevicePropertiesInternal(mDeviceAddresses, - results))) { - NS_WARNING("GetPairedDevices failed!"); - return NS_ERROR_FAILURE; - } + rv = bs->GetConnectedDevicePropertiesInternal(aProfileId, results); + NS_ENSURE_SUCCESS(rv, NS_ERROR_FAILURE); + + req.forget(aRequest); + return NS_OK; +} + +NS_IMETHODIMP +BluetoothAdapter::GetPairedDevices(nsIDOMDOMRequest** aRequest) +{ + nsCOMPtr req; + nsresult rv = PrepareDOMRequest(GetOwner(), getter_AddRefs(req)); + NS_ENSURE_SUCCESS(rv, NS_ERROR_FAILURE); + + nsRefPtr results = + new GetDevicesTask(this, req); + + BluetoothService* bs = BluetoothService::Get(); + NS_ENSURE_TRUE(bs, NS_ERROR_FAILURE); + rv = bs->GetPairedDevicePropertiesInternal(mDeviceAddresses, results); + NS_ENSURE_SUCCESS(rv, NS_ERROR_FAILURE); req.forget(aRequest); return NS_OK; @@ -481,8 +504,7 @@ BluetoothAdapter::PairUnpair(bool aPair, nsIDOMDOMRequest** aRequest) { nsCOMPtr req; - nsresult rv; - rv = PrepareDOMRequest(GetOwner(), getter_AddRefs(req)); + nsresult rv = PrepareDOMRequest(GetOwner(), getter_AddRefs(req)); NS_ENSURE_SUCCESS(rv, NS_ERROR_FAILURE); nsRefPtr results = @@ -530,8 +552,7 @@ BluetoothAdapter::SetPinCode(const nsAString& aDeviceAddress, nsIDOMDOMRequest** aRequest) { nsCOMPtr req; - nsresult rv; - rv = PrepareDOMRequest(GetOwner(), getter_AddRefs(req)); + nsresult rv = PrepareDOMRequest(GetOwner(), getter_AddRefs(req)); NS_ENSURE_SUCCESS(rv, NS_ERROR_FAILURE); nsRefPtr results = @@ -553,8 +574,7 @@ BluetoothAdapter::SetPasskey(const nsAString& aDeviceAddress, uint32_t aPasskey, nsIDOMDOMRequest** aRequest) { nsCOMPtr req; - nsresult rv; - rv = PrepareDOMRequest(GetOwner(), getter_AddRefs(req)); + nsresult rv = PrepareDOMRequest(GetOwner(), getter_AddRefs(req)); NS_ENSURE_SUCCESS(rv, NS_ERROR_FAILURE); nsRefPtr results = @@ -577,8 +597,7 @@ BluetoothAdapter::SetPairingConfirmation(const nsAString& aDeviceAddress, nsIDOMDOMRequest** aRequest) { nsCOMPtr req; - nsresult rv; - rv = PrepareDOMRequest(GetOwner(), getter_AddRefs(req)); + nsresult rv = PrepareDOMRequest(GetOwner(), getter_AddRefs(req)); NS_ENSURE_SUCCESS(rv, NS_ERROR_FAILURE); nsRefPtr results = @@ -602,8 +621,7 @@ BluetoothAdapter::SetAuthorization(const nsAString& aDeviceAddress, bool aAllow, nsIDOMDOMRequest** aRequest) { nsCOMPtr req; - nsresult rv; - rv = PrepareDOMRequest(GetOwner(), getter_AddRefs(req)); + nsresult rv = PrepareDOMRequest(GetOwner(), getter_AddRefs(req)); NS_ENSURE_SUCCESS(rv, NS_ERROR_FAILURE); nsRefPtr results = @@ -626,8 +644,7 @@ BluetoothAdapter::Connect(const nsAString& aDeviceAddress, nsIDOMDOMRequest** aRequest) { nsCOMPtr req; - nsresult rv; - rv = PrepareDOMRequest(GetOwner(), getter_AddRefs(req)); + nsresult rv = PrepareDOMRequest(GetOwner(), getter_AddRefs(req)); NS_ENSURE_SUCCESS(rv, NS_ERROR_FAILURE); BluetoothService* bs = BluetoothService::Get(); @@ -646,8 +663,7 @@ BluetoothAdapter::Disconnect(uint16_t aProfileId, nsIDOMDOMRequest** aRequest) { nsCOMPtr req; - nsresult rv; - rv = PrepareDOMRequest(GetOwner(), getter_AddRefs(req)); + nsresult rv = PrepareDOMRequest(GetOwner(), getter_AddRefs(req)); NS_ENSURE_SUCCESS(rv, NS_ERROR_FAILURE); nsRefPtr results = @@ -667,8 +683,7 @@ BluetoothAdapter::SendFile(const nsAString& aDeviceAddress, nsIDOMDOMRequest** aRequest) { nsCOMPtr req; - nsresult rv; - rv = PrepareDOMRequest(GetOwner(), getter_AddRefs(req)); + nsresult rv = PrepareDOMRequest(GetOwner(), getter_AddRefs(req)); NS_ENSURE_SUCCESS(rv, NS_ERROR_FAILURE); nsRefPtr results = @@ -694,8 +709,7 @@ BluetoothAdapter::StopSendingFile(const nsAString& aDeviceAddress, nsIDOMDOMRequest** aRequest) { nsCOMPtr req; - nsresult rv; - rv = PrepareDOMRequest(GetOwner(), getter_AddRefs(req)); + nsresult rv = PrepareDOMRequest(GetOwner(), getter_AddRefs(req)); NS_ENSURE_SUCCESS(rv, NS_ERROR_FAILURE); nsRefPtr results = @@ -715,8 +729,7 @@ BluetoothAdapter::ConfirmReceivingFile(const nsAString& aDeviceAddress, nsIDOMDOMRequest** aRequest) { nsCOMPtr req; - nsresult rv; - rv = PrepareDOMRequest(GetOwner(), getter_AddRefs(req)); + nsresult rv = PrepareDOMRequest(GetOwner(), getter_AddRefs(req)); NS_ENSURE_SUCCESS(rv, NS_ERROR_FAILURE); nsRefPtr results = diff --git a/dom/bluetooth/BluetoothHfpManager.cpp b/dom/bluetooth/BluetoothHfpManager.cpp index 344713d8342b..2520287705f0 100644 --- a/dom/bluetooth/BluetoothHfpManager.cpp +++ b/dom/bluetooth/BluetoothHfpManager.cpp @@ -1455,3 +1455,9 @@ BluetoothHfpManager::IsConnected() return false; } + +void +BluetoothHfpManager::GetAddress(nsAString& aDeviceAddress) +{ + return mSocket->GetAddress(aDeviceAddress); +} diff --git a/dom/bluetooth/BluetoothHfpManager.h b/dom/bluetooth/BluetoothHfpManager.h index 085257e057dd..2504e2f26a57 100644 --- a/dom/bluetooth/BluetoothHfpManager.h +++ b/dom/bluetooth/BluetoothHfpManager.h @@ -75,6 +75,7 @@ public: void HandleCallStateChanged(uint32_t aCallIndex, uint16_t aCallState, const nsAString& aNumber, bool aSend); bool IsConnected(); + void GetAddress(nsAString& aDeviceAddress); private: class GetVolumeTask; diff --git a/dom/bluetooth/BluetoothOppManager.cpp b/dom/bluetooth/BluetoothOppManager.cpp index 2a116bbff657..392d2e69aa1c 100644 --- a/dom/bluetooth/BluetoothOppManager.cpp +++ b/dom/bluetooth/BluetoothOppManager.cpp @@ -1165,6 +1165,12 @@ BluetoothOppManager::IsTransferring() return (mConnected && !mSendTransferCompleteFlag); } +void +BluetoothOppManager::GetAddress(nsAString& aDeviceAddress) +{ + return mSocket->GetAddress(aDeviceAddress); +} + void BluetoothOppManager::ReplyToConnect() { diff --git a/dom/bluetooth/BluetoothOppManager.h b/dom/bluetooth/BluetoothOppManager.h index 92dad0aa9467..06488ecec0b9 100644 --- a/dom/bluetooth/BluetoothOppManager.h +++ b/dom/bluetooth/BluetoothOppManager.h @@ -73,6 +73,7 @@ public: // Return true if there is an ongoing file-transfer session, please see // Bug 827267 for more information. bool IsTransferring(); + void GetAddress(nsAString& aDeviceAddress); // Implement interface BluetoothSocketObserver void ReceiveSocketData( diff --git a/dom/bluetooth/BluetoothService.h b/dom/bluetooth/BluetoothService.h index 3a1694b9ebbc..18de49081d63 100644 --- a/dom/bluetooth/BluetoothService.h +++ b/dom/bluetooth/BluetoothService.h @@ -131,7 +131,17 @@ public: GetPairedDevicePropertiesInternal(const nsTArray& aDeviceAddresses, BluetoothReplyRunnable* aRunnable) = 0; - /** + /** + * Returns the properties of connected devices regarding to specific profile, + * implemented via a platform specific methood. + * + * @return NS_OK on success, NS_ERROR_FAILURE otherwise + */ + virtual nsresult + GetConnectedDevicePropertiesInternal(uint16_t aProfileId, + BluetoothReplyRunnable* aRunnable) = 0; + + /** * Stop device discovery (platform specific implementation) * * @return NS_OK if discovery stopped correctly, false otherwise diff --git a/dom/bluetooth/ipc/BluetoothParent.cpp b/dom/bluetooth/ipc/BluetoothParent.cpp index c24bee44a7ff..a0388fee29e8 100644 --- a/dom/bluetooth/ipc/BluetoothParent.cpp +++ b/dom/bluetooth/ipc/BluetoothParent.cpp @@ -197,8 +197,10 @@ BluetoothParent::RecvPBluetoothRequestConstructor( return actor->DoRequest(aRequest.get_PairRequest()); case Request::TUnpairRequest: return actor->DoRequest(aRequest.get_UnpairRequest()); - case Request::TDevicePropertiesRequest: - return actor->DoRequest(aRequest.get_DevicePropertiesRequest()); + case Request::TPairedDevicePropertiesRequest: + return actor->DoRequest(aRequest.get_PairedDevicePropertiesRequest()); + case Request::TConnectedDevicePropertiesRequest: + return actor->DoRequest(aRequest.get_ConnectedDevicePropertiesRequest()); case Request::TSetPinCodeRequest: return actor->DoRequest(aRequest.get_SetPinCodeRequest()); case Request::TSetPasskeyRequest: @@ -372,15 +374,26 @@ BluetoothRequestParent::DoRequest(const UnpairRequest& aRequest) } bool -BluetoothRequestParent::DoRequest(const DevicePropertiesRequest& aRequest) +BluetoothRequestParent::DoRequest(const PairedDevicePropertiesRequest& aRequest) { MOZ_ASSERT(mService); - MOZ_ASSERT(mRequestType == Request::TDevicePropertiesRequest); + MOZ_ASSERT(mRequestType == Request::TPairedDevicePropertiesRequest); nsresult rv = mService->GetPairedDevicePropertiesInternal(aRequest.addresses(), mReplyRunnable.get()); NS_ENSURE_SUCCESS(rv, false); + return true; +} +bool +BluetoothRequestParent::DoRequest(const ConnectedDevicePropertiesRequest& aRequest) +{ + MOZ_ASSERT(mService); + MOZ_ASSERT(mRequestType == Request::TConnectedDevicePropertiesRequest); + nsresult rv = + mService->GetConnectedDevicePropertiesInternal(aRequest.profileId(), + mReplyRunnable.get()); + NS_ENSURE_SUCCESS(rv, false); return true; } diff --git a/dom/bluetooth/ipc/BluetoothParent.h b/dom/bluetooth/ipc/BluetoothParent.h index 2bac5e824fca..e1eafd1af2c6 100644 --- a/dom/bluetooth/ipc/BluetoothParent.h +++ b/dom/bluetooth/ipc/BluetoothParent.h @@ -146,7 +146,9 @@ protected: DoRequest(const UnpairRequest& aRequest); bool - DoRequest(const DevicePropertiesRequest& aRequest); + DoRequest(const PairedDevicePropertiesRequest& aRequest); + bool + DoRequest(const ConnectedDevicePropertiesRequest& aRequest); bool DoRequest(const SetPinCodeRequest& aRequest); diff --git a/dom/bluetooth/ipc/BluetoothServiceChildProcess.cpp b/dom/bluetooth/ipc/BluetoothServiceChildProcess.cpp index 2cd3175f4b46..9c6738162c80 100644 --- a/dom/bluetooth/ipc/BluetoothServiceChildProcess.cpp +++ b/dom/bluetooth/ipc/BluetoothServiceChildProcess.cpp @@ -110,12 +110,20 @@ BluetoothServiceChildProcess::GetDevicePropertiesInternal( return NS_ERROR_NOT_IMPLEMENTED; } +nsresult +BluetoothServiceChildProcess::GetConnectedDevicePropertiesInternal( + uint16_t aProfileId, + BluetoothReplyRunnable* aRunnable) +{ + SendRequest(aRunnable, ConnectedDevicePropertiesRequest(aProfileId)); + return NS_OK; +} nsresult BluetoothServiceChildProcess::GetPairedDevicePropertiesInternal( const nsTArray& aDeviceAddresses, BluetoothReplyRunnable* aRunnable) { - DevicePropertiesRequest request; + PairedDevicePropertiesRequest request; request.addresses().AppendElements(aDeviceAddresses); SendRequest(aRunnable, request); diff --git a/dom/bluetooth/ipc/BluetoothServiceChildProcess.h b/dom/bluetooth/ipc/BluetoothServiceChildProcess.h index ee4e242bdea1..40b650da70ad 100644 --- a/dom/bluetooth/ipc/BluetoothServiceChildProcess.h +++ b/dom/bluetooth/ipc/BluetoothServiceChildProcess.h @@ -52,6 +52,10 @@ public: MOZ_OVERRIDE; virtual nsresult + GetConnectedDevicePropertiesInternal(uint16_t aProfileId, + BluetoothReplyRunnable* aRunnable) + MOZ_OVERRIDE; + virtual nsresult StopDiscoveryInternal(BluetoothReplyRunnable* aRunnable) MOZ_OVERRIDE; virtual nsresult diff --git a/dom/bluetooth/ipc/PBluetooth.ipdl b/dom/bluetooth/ipc/PBluetooth.ipdl index b5876de0d67b..5fd79f4e1ffa 100644 --- a/dom/bluetooth/ipc/PBluetooth.ipdl +++ b/dom/bluetooth/ipc/PBluetooth.ipdl @@ -88,10 +88,14 @@ struct DenyAuthorizationRequest nsString path; }; -struct DevicePropertiesRequest +struct PairedDevicePropertiesRequest { nsString[] addresses; }; +struct ConnectedDevicePropertiesRequest +{ + uint16_t profileId; +}; struct ConnectRequest { @@ -140,7 +144,8 @@ union Request DenyPairingConfirmationRequest; ConfirmAuthorizationRequest; DenyAuthorizationRequest; - DevicePropertiesRequest; + ConnectedDevicePropertiesRequest; + PairedDevicePropertiesRequest; ConnectRequest; DisconnectRequest; SendFileRequest; diff --git a/dom/bluetooth/linux/BluetoothDBusService.cpp b/dom/bluetooth/linux/BluetoothDBusService.cpp index 80f0b6c313d6..651a196ff406 100644 --- a/dom/bluetooth/linux/BluetoothDBusService.cpp +++ b/dom/bluetooth/linux/BluetoothDBusService.cpp @@ -147,6 +147,7 @@ static int32_t sIsPairing = 0; static nsString sAdapterPath; typedef void (*UnpackFunc)(DBusMessage*, DBusError*, BluetoothValue&, nsAString&); +typedef bool (*FilterFunc)(const BluetoothValue&); class RemoveDeviceTask : public nsRunnable { public: @@ -191,6 +192,34 @@ private: nsRefPtr mRunnable; }; +static bool +GetConnectedDevicesFilter(const BluetoothValue& aValue) +{ + // We don't have to filter device here + return true; +} + +static bool +GetPairedDevicesFilter(const BluetoothValue& aValue) +{ + // Check property 'Paired' and only paired device will be returned + if (aValue.type() != BluetoothValue::TArrayOfBluetoothNamedValue) { + NS_WARNING("Not a BluetoothNamedValue array!"); + return false; + } + + const InfallibleTArray& deviceProperties = + aValue.get_ArrayOfBluetoothNamedValue(); + uint32_t length = deviceProperties.Length(); + for (uint32_t p = 0; p < length; ++p) { + if (deviceProperties[p].name().EqualsLiteral("Paired")) { + return deviceProperties[p].value().get_bool(); + } + } + + return false; +} + class SendDiscoveryTask : public nsRunnable { public: SendDiscoveryTask(const char* aMessageName, @@ -1911,14 +1940,16 @@ private: BluetoothSignal mSignal; }; -class BluetoothPairedDevicePropertiesRunnable : public nsRunnable +class BluetoothArrayOfDevicePropertiesRunnable : public nsRunnable { public: - BluetoothPairedDevicePropertiesRunnable( + BluetoothArrayOfDevicePropertiesRunnable( + const nsTArray& aDeviceAddresses, BluetoothReplyRunnable* aRunnable, - const nsTArray& aDeviceAddresses) - : mRunnable(dont_AddRef(aRunnable)), - mDeviceAddresses(aDeviceAddresses) + FilterFunc aFilterFunc) + : mDeviceAddresses(aDeviceAddresses) + , mRunnable(dont_AddRef(aRunnable)) + , mFilterFunc(aFilterFunc) { } @@ -1930,51 +1961,39 @@ public: dbus_error_init(&err); BluetoothValue values = InfallibleTArray(); + nsAutoString errorStr; for (uint32_t i = 0; i < mDeviceAddresses.Length(); i++) { BluetoothValue v; - if (!GetPropertiesInternal(mDeviceAddresses[i], DBUS_DEVICE_IFACE, v)) { - nsAutoString errorStr; + nsString objectPath = GetObjectPathFromAddress(sAdapterPath, mDeviceAddresses[i]); + + if (!GetPropertiesInternal(objectPath, DBUS_DEVICE_IFACE, v)) { errorStr.AssignLiteral("Getting properties failed!"); - NS_WARNING(NS_ConvertUTF16toUTF8(errorStr).get()); - mRunnable->SetReply(new BluetoothReply(BluetoothReplyError(errorStr))); - if (NS_FAILED(NS_DispatchToMainThread(mRunnable))) { - NS_WARNING("Failed to dispatch to main thread!"); - } + DispatchBluetoothReply(mRunnable, values, errorStr); return NS_OK; } + + // We have to manually attach the path to the rest of the elements v.get_ArrayOfBluetoothNamedValue().AppendElement( - BluetoothNamedValue(NS_LITERAL_STRING("Path"), mDeviceAddresses[i]) + BluetoothNamedValue(NS_LITERAL_STRING("Path"), objectPath) ); - InfallibleTArray& deviceProperties = - v.get_ArrayOfBluetoothNamedValue(); - for (uint32_t p = 0; - p < v.get_ArrayOfBluetoothNamedValue().Length(); ++p) { - BluetoothNamedValue& property = v.get_ArrayOfBluetoothNamedValue()[p]; - // Only paired devices will be return back to main thread - if (property.name().EqualsLiteral("Paired")) { - bool paired = property.value(); - if (paired) { - values.get_ArrayOfBluetoothNamedValue().AppendElement( - BluetoothNamedValue(mDeviceAddresses[i], deviceProperties) - ); - } - break; - } + if (mFilterFunc(v)) { + values.get_ArrayOfBluetoothNamedValue().AppendElement( + BluetoothNamedValue(mDeviceAddresses[i], + v.get_ArrayOfBluetoothNamedValue()) + ); } } - mRunnable->SetReply(new BluetoothReply(BluetoothReplySuccess(values))); - if (NS_FAILED(NS_DispatchToMainThread(mRunnable))) { - NS_WARNING("Failed to dispatch to main thread!"); - } + DispatchBluetoothReply(mRunnable, values, errorStr); return NS_OK; } private: - nsRefPtr mRunnable; nsTArray mDeviceAddresses; + nsRefPtr mRunnable; + FilterFunc mFilterFunc; }; nsresult @@ -1996,6 +2015,55 @@ BluetoothDBusService::GetDevicePropertiesInternal(const BluetoothSignal& aSignal return NS_OK; } +nsresult +BluetoothDBusService::GetConnectedDevicePropertiesInternal(uint16_t aProfileId, + BluetoothReplyRunnable* aRunnable) +{ + nsAutoString errorStr; + BluetoothValue values = InfallibleTArray(); + if (!IsReady()) { + errorStr.AssignLiteral("Bluetooth service is not ready yet!"); + DispatchBluetoothReply(aRunnable, values, errorStr); + return NS_OK; + } + + nsTArray deviceAddresses; + if (aProfileId == BluetoothServiceClass::HANDSFREE || + aProfileId == BluetoothServiceClass::HEADSET) { + BluetoothHfpManager* hfp = BluetoothHfpManager::Get(); + if (hfp->IsConnected()) { + nsString address; + hfp->GetAddress(address); + deviceAddresses.AppendElement(address); + } + } else if (aProfileId == BluetoothServiceClass::OBJECT_PUSH) { + BluetoothOppManager* opp = BluetoothOppManager::Get(); + if (opp->IsTransferring()) { + nsString address; + opp->GetAddress(address); + deviceAddresses.AppendElement(address); + } + } else { + errorStr.AssignLiteral("Unknown profile"); + DispatchBluetoothReply(aRunnable, values, errorStr); + return NS_OK; + } + + nsRefPtr runnable = aRunnable; + nsRefPtr func( + new BluetoothArrayOfDevicePropertiesRunnable(deviceAddresses, + runnable, + GetConnectedDevicesFilter)); + + if (NS_FAILED(mBluetoothCommandThread->Dispatch(func, NS_DISPATCH_NORMAL))) { + NS_WARNING("Cannot dispatch task!"); + return NS_ERROR_FAILURE; + } + + runnable.forget(); + return NS_OK; +} + nsresult BluetoothDBusService::GetPairedDevicePropertiesInternal( const nsTArray& aDeviceAddresses, @@ -2011,7 +2079,9 @@ BluetoothDBusService::GetPairedDevicePropertiesInternal( nsRefPtr runnable = aRunnable; nsRefPtr func( - new BluetoothPairedDevicePropertiesRunnable(runnable, aDeviceAddresses)); + new BluetoothArrayOfDevicePropertiesRunnable(aDeviceAddresses, + runnable, + GetPairedDevicesFilter)); if (NS_FAILED(mBluetoothCommandThread->Dispatch(func, NS_DISPATCH_NORMAL))) { NS_WARNING("Cannot dispatch task!"); return NS_ERROR_FAILURE; @@ -2487,7 +2557,8 @@ BluetoothDBusService::Connect(const nsAString& aDeviceAddress, DispatchBluetoothReply(aRunnable, v, errorStr); } } else { - NS_WARNING("Unknown Profile"); + errorStr.AssignLiteral("Unknown profile"); + DispatchBluetoothReply(aRunnable, v, errorStr); } } diff --git a/dom/bluetooth/linux/BluetoothDBusService.h b/dom/bluetooth/linux/BluetoothDBusService.h index 697991571f95..4d1f1a096152 100644 --- a/dom/bluetooth/linux/BluetoothDBusService.h +++ b/dom/bluetooth/linux/BluetoothDBusService.h @@ -32,10 +32,15 @@ public: virtual bool IsEnabledInternal(); - virtual nsresult GetDefaultAdapterPathInternal(BluetoothReplyRunnable* aRunnable); + virtual nsresult GetDefaultAdapterPathInternal( + BluetoothReplyRunnable* aRunnable); - virtual nsresult GetPairedDevicePropertiesInternal(const nsTArray& aDeviceAddresses, - BluetoothReplyRunnable* aRunnable); + virtual nsresult GetConnectedDevicePropertiesInternal(uint16_t aProfileId, + BluetoothReplyRunnable* aRunnable); + + virtual nsresult GetPairedDevicePropertiesInternal( + const nsTArray& aDeviceAddresses, + BluetoothReplyRunnable* aRunnable); virtual nsresult StartDiscoveryInternal(BluetoothReplyRunnable* aRunnable); diff --git a/dom/bluetooth/nsIDOMBluetoothAdapter.idl b/dom/bluetooth/nsIDOMBluetoothAdapter.idl index 49a6617e1e0e..7b1afa69b2f0 100644 --- a/dom/bluetooth/nsIDOMBluetoothAdapter.idl +++ b/dom/bluetooth/nsIDOMBluetoothAdapter.idl @@ -10,7 +10,7 @@ interface nsIDOMDOMRequest; interface nsIDOMBlob; interface nsIDOMBluetoothDevice; -[scriptable, builtinclass, uuid(4321647b-0d45-4231-920b-8d238b6d1700)] +[scriptable, builtinclass, uuid(88a5638f-f55a-4d67-8437-392d0a9a87c7)] interface nsIDOMBluetoothAdapter : nsIDOMEventTarget { readonly attribute DOMString address; @@ -36,6 +36,7 @@ interface nsIDOMBluetoothAdapter : nsIDOMEventTarget nsIDOMDOMRequest pair(in nsIDOMBluetoothDevice aDevice); nsIDOMDOMRequest unpair(in nsIDOMBluetoothDevice aDevice); nsIDOMDOMRequest getPairedDevices(); + nsIDOMDOMRequest getConnectedDevices(in unsigned short aProfile); nsIDOMDOMRequest setPinCode(in DOMString aDeviceAddress, in DOMString aPinCode); nsIDOMDOMRequest setPasskey(in DOMString aDeviceAddress, in unsigned long aPasskey); nsIDOMDOMRequest setPairingConfirmation(in DOMString aDeviceAddress, in bool aConfirmation);