SET_INT(16)
SET_INT(32)
SET_INT(64)
+ case nsIDataType::VTYPE_INTERFACE_IS:
+ {
+ nsISupports **data = (nsISupports **)data_ptr;
+
+ // We might have array of variants
+ nsCOMPtr<nsIVariant> data_variant =
+ do_QueryInterface(data[i]);
+
+ if (data_variant) {
+ variant->SetFromVariant(data_variant);
+ break;
+ }
+
+ // We might have a wrapped JS obect in the variant
+ // eg. dicts
+ nsCOMPtr<nsIXPConnectWrappedJS> wrapped =
+ do_QueryInterface(data[i]);
+
+ if (!wrapped)
+ break;
+
+ JSObject *js_obj = nsnull;
+ if (!NS_SUCCEEDED(wrapped->GetJSObject(&js_obj)))
+ break;
+
+ jsval js_obj_as_value = OBJECT_TO_JSVAL(js_obj);
+ addJSValueToIter(cx, &js_obj_as_value,
+ &arrayIter, &aChildSigIter);
+ break;
+ }
default:
BDBLOG(("*** No conversion from %i to %c\n", type, dbustype));
break;
}
- addVariantToIter(cx, variant, &arrayIter, &aChildSigIter);
+ PRUint16 vtype = 0;
+ variant->GetDataType(&vtype);
+ if (vtype != nsIDataType::VTYPE_EMPTY)
+ addVariantToIter(cx, variant, &arrayIter, &aChildSigIter);
}
dbus_message_iter_close_container(aIter, &arrayIter);
}
case DBUS_TYPE_ARRAY:
{
- if (JSVAL_IS_OBJECT(*aValue) && JS_IsArrayObject(cx, JSVAL_TO_OBJECT(*aValue)))
- {
- // Arrays are simply converted to variants and pushed to the
- // variant code path
+ if (JSVAL_IS_OBJECT(*aValue)) {
+ // Arrays and dicts are simply converted to variants and pushed
+ // to the variant code path
nsresult rv;
nsCOMPtr<nsIXPConnect> xpc(do_GetService(nsIXPConnect::GetCID(), &rv));
if(NS_FAILED(rv))