[jscore] Implement DBus.emitSignal()
authorKalle Vahlman <kalle.vahlman@movial.com>
Sun, 14 Dec 2008 14:07:41 +0000 (16:07 +0200)
committerKalle Vahlman <kalle.vahlman@movial.com>
Sun, 14 Dec 2008 14:07:41 +0000 (16:07 +0200)
jscorebus/jscorebus.c

index a1e38b7..3e3a178 100644 (file)
@@ -314,6 +314,8 @@ JSValueRef _construct_signature (JSContextRef context,
                       (void*)arguments[0]);
 }
 
+#define JSVALUE_TO_CONNECTION(ctx, val) (JSValueToNumber(ctx, val, NULL) == DBUS_BUS_SYSTEM) ? system : session
+
 static
 JSValueRef getMethod (JSContextRef context,
                       JSObjectRef function,
@@ -331,8 +333,7 @@ JSValueRef getMethod (JSContextRef context,
   }
 
   return jscorebus_create_method(global_context,
-                                 JSValueToNumber(context, arguments[0], NULL)
-                                  == DBUS_BUS_SYSTEM ? system : session,
+                                 JSVALUE_TO_CONNECTION(context, arguments[0]),
                                  string_from_jsvalue(context, arguments[1]),
                                  string_from_jsvalue(context, arguments[2]),
                                  string_from_jsvalue(context, arguments[3]),
@@ -365,8 +366,7 @@ JSValueRef getSignal (JSContextRef context,
   }
 
   return jscorebus_create_signal(global_context,
-                                 JSValueToNumber(context, arguments[0], NULL)
-                                  == DBUS_BUS_SYSTEM ? system : session,
+                                 JSVALUE_TO_CONNECTION(context, arguments[0]),
                                  string_from_jsvalue(context, arguments[1]),
                                  string_from_jsvalue(context, arguments[2]),
                                  argumentCount > 3 ? 
@@ -382,6 +382,88 @@ JSValueRef getSignal (JSContextRef context,
 }
 
 static
+JSValueRef emitSignal (JSContextRef context,
+                       JSObjectRef function,
+                       JSObjectRef thisObject,
+                       size_t argumentCount,
+                       const JSValueRef arguments[],
+                       JSValueRef *exception)
+{
+  DBusMessage *message;
+  DBusConnection *connection;
+  char *path;
+  char *interface;
+  char *member;
+  char *signature;
+
+  if (argumentCount < 4)
+  {
+    /* TODO: set exception */
+    g_warning("Not enough arguments for emitSignal");
+    return JSValueMakeBoolean(context, FALSE);
+  }
+
+  connection = JSVALUE_TO_CONNECTION(context, arguments[0]);
+  path       = string_from_jsvalue(context, arguments[1]);
+  interface  = string_from_jsvalue(context, arguments[2]);
+  member     = string_from_jsvalue(context, arguments[3]);
+
+  message = dbus_message_new_signal(path, interface, member);
+
+  g_free(path);
+  g_free(interface);
+  g_free(member);
+
+  if (message == NULL)
+  {
+    return JSValueMakeBoolean(context, FALSE);
+  }
+
+  if (argumentCount > 5)
+  {
+    int i, c;
+    JSValueRef *args;
+    DBusMessageIter iter;
+
+    /* "Splice" the array */
+    args = g_new(JSValueRef, argumentCount - 5);
+    c = 0;
+    for (i = 5; i < argumentCount; i++)
+      args[c++] = arguments[i];
+
+    /* Push arguments to the message */
+    signature = string_from_jsvalue(context, arguments[4]);
+    dbus_message_iter_init_append (message, &iter);
+    if (!jsvalue_array_append_to_message_iter(context,
+                                              args, c,
+                                              &iter, signature))
+    {
+      /* TODO: set exception */
+      for (i = 0; i < c; i++)
+        args[i] = NULL;
+      g_free(args);
+      g_free(signature);
+      dbus_message_unref(message);
+      return JSValueMakeBoolean(context, FALSE);
+    }
+
+    for (i = 0; i < c; i++)
+      args[i] = NULL;
+    g_free(args);
+    g_free(signature);
+  }
+
+  if (dbus_connection_send(connection, message, NULL))
+  {
+    dbus_message_unref(message);
+    return JSValueMakeBoolean(context, TRUE);
+  }
+
+  dbus_message_unref(message);
+  return JSValueMakeBoolean(context, FALSE);
+}
+
+static
 void dbus_finalize(JSObjectRef object)
 {
   g_debug(G_STRFUNC);
@@ -408,6 +490,7 @@ JSStaticFunction dbus_jsclass_staticfuncs[] =
   /* Methods */
   { "getMethod", getMethod, kJSPropertyAttributeReadOnly },
   { "getSignal", getSignal, kJSPropertyAttributeReadOnly },
+  { "emitSignal", emitSignal, kJSPropertyAttributeReadOnly },
   { NULL, NULL, 0 }
 };