[jscore] Implement the Variant(signature, arg) conversion method for real
authorKalle Vahlman <kalle.vahlman@movial.com>
Tue, 28 Apr 2009 10:08:05 +0000 (13:08 +0300)
committerKalle Vahlman <kalle.vahlman@movial.com>
Tue, 28 Apr 2009 10:08:05 +0000 (13:08 +0300)
jscorebus/jscorebus-marshal.c
jscorebus/jscorebus-marshal.h
jscorebus/jscorebus.c

index bf73e49a379009bea93732adb12ef1409f7af962..aa2f9cbbdf39175c640eb82a86dbe7b1dcf65da4 100644 (file)
@@ -270,7 +270,8 @@ gboolean jsvalue_append_to_message_iter(JSContextRef context,
 
         if (jsvalue_typeof(context, jsvalue, "DBusVariant"))
         {
-          value = (JSValueRef)JSObjectGetPrivate((JSObjectRef)jsvalue);
+          variant_data_t *data = (variant_data_t *)JSObjectGetPrivate((JSObjectRef)jsvalue);
+          value = data->value;
         } else {
           value = jsvalue;
         }
index 51622fc4780434b687ae9afb10f8beac38e3d3de..bbb2a557df44f6e7495813d5f17f161baaddb9f7 100644 (file)
@@ -88,7 +88,12 @@ gboolean jsvalue_instanceof(JSContextRef context,
                             JSValueRef jsvalue,
                             const char *constructor);
 
-
+/* Variant data carrier */
+typedef struct _variant_data
+{
+  char *signature;
+  JSValueRef value;
+} variant_data_t;
 
 #endif /* __JSCOREBUS_CONVERT_H___ */
 
index ca2dd471cbe30f9600a0a3d8009c27db3716a9de..ee9572610408eaf715314e1cde972f23bc6c8897 100644 (file)
 #include "jscorebus-signal.h"
 
 /* Globals */
+/* TODO: Not like this :( */
 static DBusConnection *session;
 static DBusConnection *system;
+static JSGlobalContextRef gcontext = NULL;
+
 
 
 /* Getters for the bus type properties */
@@ -160,10 +163,22 @@ MAKE_NUMBER_CLASS_AND_GETTER("DBusInt64", int64)
 MAKE_NUMBER_CLASS_AND_GETTER("DBusUInt16", uint16)
 MAKE_NUMBER_CLASS_AND_GETTER("DBusInt16", int16)
 
+/* Variants */
+
+static
+void _variant_finalize (JSObjectRef object)
+{
+  variant_data_t *data = (variant_data_t *)JSObjectGetPrivate(object);
+  g_assert(data != NULL);
+  g_free(data->signature);
+  JSValueUnprotect(gcontext, data->value);
+  g_free(data);
+}
+
 static const JSClassDefinition variant_jsclass_def =
 {
   0, kJSClassAttributeNone, "DBusVariant",
-  NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+  NULL, NULL, NULL, NULL, _variant_finalize, NULL, NULL,
   NULL, NULL, NULL, NULL, NULL, NULL, NULL
 };
 
@@ -175,15 +190,20 @@ JSValueRef _construct_variant (JSContextRef context,
                                const JSValueRef arguments[],
                                JSValueRef *exception)
 {
+  variant_data_t *data;
 
-  if (argumentCount != 1)
+  if (argumentCount < 2)
   {
     /* TODO: set exception */
     return JSValueMakeUndefined(context);
   }
 
-  /* Just carry the value in private data */
-  return JSObjectMake(context, (JSClassRef)jsclass_lookup(&variant_jsclass_def), (void*)arguments[0]);
+  data = g_new0(variant_data_t, 1);
+  data->signature = string_from_jsvalue(context, arguments[0]);
+  data->value = arguments[1];
+  JSValueProtect(context, data->value);
+
+  return JSObjectMake(context, (JSClassRef)jsclass_lookup(&variant_jsclass_def), (void*)data);
 }
 
 static const JSClassDefinition struct_jsclass_def =
@@ -473,9 +493,6 @@ JSValueRef emitSignal (JSContextRef context,
   return JSValueMakeBoolean(context, FALSE);
 }
 
-static
-JSGlobalContextRef gcontext = NULL;
-
 static
 void dbus_finalize(JSObjectRef object)
 {