[XPCOM] Keep the JS context with the Service/Method objects, we
[browser-dbus-bridge.git] / xpcom-dbusservice / DBusMethod.cpp
index 7dd03b5..01d9079 100644 (file)
@@ -32,6 +32,7 @@
 #include "nsArrayUtils.h"
 #include "nsISupportsPrimitives.h"
 #include "nsIProperties.h"
+#include "nsIXPConnect.h"
 
 #include "IDBusService.h"
 #include "DBusMethod.h"
@@ -43,7 +44,7 @@
 // helper declarations
 //
 
-static void DoCallBack(IDBusMethod *aCallback, DBusMessage *aReply);
+static void DoCallBack(DBusMethod *aCallback, DBusMessage *aReply);
 static void ReplyHandler(DBusPendingCall *pending, void *user_data);
 
 //
@@ -58,7 +59,8 @@ DBusMethod::DBusMethod(DBusService *aDBusService,
                        const nsACString& aObjectPath,
                        const nsACString& aMethodName,
                        const nsACString& aInterfaceName,
-                       const nsACString& aSignature) :
+                       const nsACString& aSignature,
+                       JSContext *cx) :
     mDBusService(aDBusService),
     mBusType(aBusType),
     mDestination(aDestination),
@@ -68,7 +70,8 @@ DBusMethod::DBusMethod(DBusService *aDBusService,
     mSignature(aSignature),
     mAsync(PR_TRUE),
     mCallback(nsnull),
-    mErrorCallback(nsnull)
+    mErrorCallback(nsnull),
+    mJScx(cx)
 {
     BDBLOG(("DBusMethod::DBusMethod()\n"));
     BDBLOG(("  aBusType          : %d\n", aBusType));
@@ -142,11 +145,18 @@ DBusMethod::SetOnError(IDBusMethodCallback *aOnError)
     return NS_OK;
 }
 
+NS_IMETHODIMP
+DBusMethod::GetJSContext(JSContext **aJSContext)
+{
+    *aJSContext = mJScx;
+    return NS_OK;
+}
+
 static void
 ReplyHandler(DBusPendingCall *pending, void *user_data)
 {
     DBusMessage *reply;
-    nsCOMPtr<IDBusMethod> method = (IDBusMethod *) user_data;
+    nsCOMPtr<DBusMethod> method = (DBusMethod *) user_data;
 
     reply = dbus_pending_call_steal_reply(pending);
     DoCallBack(method, reply);
@@ -155,7 +165,7 @@ ReplyHandler(DBusPendingCall *pending, void *user_data)
 
 
 static void
-DoCallBack(IDBusMethod *aMethod, DBusMessage *aReply)
+DoCallBack(DBusMethod *aMethod, DBusMessage *aReply)
 {
     DBusMessageIter iter;
     int current_type;
@@ -166,7 +176,9 @@ DoCallBack(IDBusMethod *aMethod, DBusMessage *aReply)
 
     dbus_message_iter_init(aReply, &iter);
 
-    reply_args = getArrayFromIter(&iter);
+    JSContext *cx;
+    aMethod->GetJSContext(&cx);
+    reply_args = getArrayFromIter(cx, &iter);
 
     switch (msg_type)
     {
@@ -204,7 +216,7 @@ DoCallBack(IDBusMethod *aMethod, DBusMessage *aReply)
         /* arguments are packed as an array into an nsIVariant */
         nsIVariant **callback_args = new nsIVariant*[reply_items];
         nsCOMPtr<nsIWritableVariant> args = do_CreateInstance("@mozilla.org/variant;1");
-        for (int i = 0; i < reply_items; i++)
+        for (PRUint32 i = 0; i < reply_items; i++)
         {
             nsCOMPtr<nsIVariant> arg = do_QueryElementAt(reply_args, i);
             callback_args[i] = arg;
@@ -214,7 +226,7 @@ DoCallBack(IDBusMethod *aMethod, DBusMessage *aReply)
                          &NS_GET_IID(nsIVariant),
                          reply_items,
                          callback_args);
-        for (int i = 0; i < reply_items; i++)
+        for (PRUint32 i = 0; i < reply_items; i++)
             NS_RELEASE(callback_args[i]);
         delete[] callback_args;
         callback->OnReply(args);
@@ -247,7 +259,7 @@ DBusMethod::DoCall(nsIVariant **aArgs, PRUint32 aCount)
             nsCOMPtr<nsIVariant> data = aArgs[i];
             nsCAutoString tmpsig;
 
-            getSignatureFromVariant(data, tmpsig);
+            getSignatureFromVariant(mJScx, data, tmpsig);
             BDBLOG(("  aArgs[%02d]       : signature \"%s\"\n",
                    i,
                    PromiseFlatCString(tmpsig).get()));
@@ -275,7 +287,7 @@ DBusMethod::DoCall(nsIVariant **aArgs, PRUint32 aCount)
             BDBLOG(("  element \"%s\" from signature\n", element_signature));
             BDBLOG(("  type %c from signature\n", current_type));
 
-            addVariantToIter(aArgs[i], &msg_iter, &sig_iter);
+            addVariantToIter(mJScx, aArgs[i], &msg_iter, &sig_iter);
 
             i++;
             dbus_free(element_signature);