Bug 790133 - Final version: Fire devicecreated event with a BluetoothDevice, r=qdot, sr=mrbkap

This commit is contained in:
Gina Yeh 2012-09-17 14:39:47 +08:00
parent d1db99fdc1
commit 2174db4cb5
8 changed files with 143 additions and 2 deletions

View File

@ -660,6 +660,7 @@ GK_ATOM(oncut, "oncut")
GK_ATOM(ondatachange, "ondatachange")
GK_ATOM(ondblclick, "ondblclick")
GK_ATOM(ondelivered, "ondelivered")
GK_ATOM(ondevicecreated, "ondevicecreated")
GK_ATOM(ondevicedisappeared, "ondevicedisappeared")
GK_ATOM(ondevicefound, "ondevicefound")
GK_ATOM(ondialing, "ondialing")

View File

@ -290,6 +290,22 @@ BluetoothAdapter::Notify(const BluetoothSignal& aData)
e->SetTrusted(true);
bool dummy;
DispatchEvent(event, &dummy);
} else if (aData.name().EqualsLiteral("DeviceCreated")) {
NS_ASSERTION(aData.value().type() == BluetoothValue::TArrayOfBluetoothNamedValue,
"DeviceCreated: Invalid value type");
nsRefPtr<BluetoothDevice> device = BluetoothDevice::Create(GetOwner(),
GetPath(),
aData.value());
nsCOMPtr<nsIDOMEvent> event;
NS_NewDOMBluetoothDeviceEvent(getter_AddRefs(event), nullptr, nullptr);
nsCOMPtr<nsIDOMBluetoothDeviceEvent> e = do_QueryInterface(event);
e->InitBluetoothDeviceEvent(NS_LITERAL_STRING("devicecreated"),
false, false, device);
e->SetTrusted(true);
bool dummy;
DispatchEvent(event, &dummy);
} else if (aData.name().EqualsLiteral("PropertyChanged")) {
// Get BluetoothNamedValue, make sure array length is 1
arr = aData.value().get_ArrayOfBluetoothNamedValue();
@ -627,6 +643,7 @@ BluetoothAdapter::SetAuthorization(const nsAString& aDeviceAddress, bool aAllow)
NS_IMPL_EVENT_HANDLER(BluetoothAdapter, propertychanged)
NS_IMPL_EVENT_HANDLER(BluetoothAdapter, devicefound)
NS_IMPL_EVENT_HANDLER(BluetoothAdapter, devicedisappeared)
NS_IMPL_EVENT_HANDLER(BluetoothAdapter, devicecreated)
NS_IMPL_EVENT_HANDLER(BluetoothAdapter, requestconfirmation)
NS_IMPL_EVENT_HANDLER(BluetoothAdapter, requestpincode)
NS_IMPL_EVENT_HANDLER(BluetoothAdapter, requestpasskey)

View File

@ -158,7 +158,7 @@ public:
StartDiscoveryInternal(const nsAString& aAdapterPath,
BluetoothReplyRunnable* aRunnable) = 0;
/**
/**
* Fetches the propertes for the specified object
*
* @param aType Type of the object (see BluetoothObjectType in BluetoothCommon.h)
@ -173,6 +173,18 @@ public:
BluetoothReplyRunnable* aRunnable) = 0;
/**
* Fetches the propertes for the specified device
*
* @param aDevicePath Path of the object
* @param aSignalPath Path to distrubute signal after receiving properties
*
* @return NS_OK on function run, NS_ERROR_FAILURE otherwise
*/
virtual nsresult
GetDevicePropertiesInternal(const nsAString& aDevicePath,
const nsAString& aSignalPath) = 0;
/**
* Set a property for the specified object
*
* @param aPath Path to the object

View File

@ -102,6 +102,15 @@ BluetoothServiceChildProcess::GetDefaultAdapterPathInternal(
return NS_OK;
}
nsresult
BluetoothServiceChildProcess::GetDevicePropertiesInternal(
const nsAString& aDevicePath,
const nsAString& aSignalPath)
{
MOZ_NOT_REACHED("Implement me!");
return NS_ERROR_NOT_IMPLEMENTED;
}
nsresult
BluetoothServiceChildProcess::GetPairedDevicePropertiesInternal(
const nsTArray<nsString>& aDeviceAddresses,

View File

@ -61,6 +61,10 @@ public:
const nsAString& aPath,
BluetoothReplyRunnable* aRunnable) MOZ_OVERRIDE;
virtual nsresult
GetDevicePropertiesInternal(const nsAString& aDevicePath,
const nsAString& aSignalPath) MOZ_OVERRIDE;
virtual nsresult
SetProperty(BluetoothObjectType aType,
const nsAString& aPath,

View File

@ -947,6 +947,18 @@ EventFilter(DBusConnection* aConn, DBusMessage* aMsg, void* aData)
} else {
v = NS_ConvertUTF8toUTF16(str);
}
// Get device properties and then send to BluetoothAdapter
BluetoothService* bs = BluetoothService::Get();
if (!bs) {
NS_WARNING("BluetoothService not available!");
}
if (NS_FAILED(bs->GetDevicePropertiesInternal(v, signalPath))) {
NS_WARNING("get properties failed");
}
return DBUS_HANDLER_RESULT_HANDLED;
} else if (dbus_message_is_signal(aMsg, DBUS_ADAPTER_IFACE, "DeviceRemoved")) {
const char* str;
if (!dbus_message_get_args(aMsg, &err,
@ -1264,6 +1276,66 @@ BluetoothDBusService::StartDiscoveryInternal(const nsAString& aAdapterPath,
return SendDiscoveryMessage(aAdapterPath, "StartDiscovery", aRunnable);
}
class BluetoothDevicePropertiesRunnable : public nsRunnable
{
public:
BluetoothDevicePropertiesRunnable(const nsAString& aDevicePath,
const nsAString& aSignalPath) :
mDevicePath(aDevicePath),
mSignalPath(aSignalPath)
{
MOZ_ASSERT(NS_IsMainThread());
}
~BluetoothDevicePropertiesRunnable()
{
}
NS_IMETHOD Run()
{
MOZ_ASSERT(!NS_IsMainThread());
DBusError err;
dbus_error_init(&err);
BluetoothValue v = InfallibleTArray<BluetoothNamedValue>();
nsString replyError;
DBusMessage* msg = dbus_func_args_timeout(gThreadConnection->GetConnection(),
1000,
&err,
NS_ConvertUTF16toUTF8(mDevicePath).get(),
DBUS_DEVICE_IFACE,
"GetProperties",
DBUS_TYPE_INVALID);
UnpackDevicePropertiesMessage(msg, &err, v, replyError);
if (!replyError.IsEmpty()) {
NS_WARNING("Failed to get device properties");
return NS_ERROR_FAILURE;
}
if (msg) {
dbus_message_unref(msg);
}
BluetoothSignal signal(NS_LITERAL_STRING("DeviceCreated"),
mSignalPath, v);
nsRefPtr<DistributeBluetoothSignalTask> t = new DistributeBluetoothSignalTask(signal);
if (NS_FAILED(NS_DispatchToMainThread(t))) {
NS_WARNING("Failed to dispatch to main thread!");
return NS_ERROR_FAILURE;
}
return NS_OK;
}
private:
nsString mDevicePath;
nsString mSignalPath;
};
class BluetoothPairedDevicePropertiesRunnable : public nsRunnable
{
public:
@ -1364,6 +1436,26 @@ BluetoothDBusService::GetProperties(BluetoothObjectType aType,
return NS_OK;
}
nsresult
BluetoothDBusService::GetDevicePropertiesInternal(const nsAString& aDevicePath,
const nsAString& aSignalPath)
{
NS_ASSERTION(NS_IsMainThread(), "Must be called from main thread!");
if (!mConnection || !gThreadConnection) {
NS_ERROR("Bluetooth service not started yet!");
return NS_ERROR_FAILURE;
}
nsRefPtr<nsRunnable> func(new BluetoothDevicePropertiesRunnable(aDevicePath, aSignalPath));
if (NS_FAILED(mBluetoothCommandThread->Dispatch(func, NS_DISPATCH_NORMAL))) {
NS_WARNING("Cannot dispatch task!");
return NS_ERROR_FAILURE;
}
return NS_OK;
}
nsresult
BluetoothDBusService::GetPairedDevicePropertiesInternal(const nsTArray<nsString>& aDeviceAddresses,
BluetoothReplyRunnable* aRunnable)

View File

@ -38,6 +38,10 @@ public:
const nsAString& aPath,
BluetoothReplyRunnable* aRunnable);
virtual nsresult
GetDevicePropertiesInternal(const nsAString& aDevicePath,
const nsAString& aSignalPath);
virtual nsresult
SetProperty(BluetoothObjectType aType,
const nsAString& aPath,
const BluetoothNamedValue& aValue,

View File

@ -9,7 +9,7 @@
interface nsIDOMDOMRequest;
interface nsIDOMBluetoothDevice;
[scriptable, builtinclass, uuid(4ea7d312-f37c-4777-8114-fc7312890199)]
[scriptable, builtinclass, uuid(df1465c6-00b7-49ab-bd20-1b63721d118f)]
interface nsIDOMBluetoothAdapter : nsIDOMEventTarget
{
readonly attribute DOMString address;
@ -45,6 +45,8 @@ interface nsIDOMBluetoothAdapter : nsIDOMEventTarget
[implicit_jscontext] attribute jsval ondevicefound;
// Fired when any device is out of discoverable range.
[implicit_jscontext] attribute jsval ondevicedisappeared;
// Fired when any device is created.
[implicit_jscontext] attribute jsval ondevicecreated;
// Fired when a property of the adapter is changed
[implicit_jscontext] attribute jsval onpropertychanged;
// Pairing related events