[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 bf73e49..aa2f9cb 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 51622fc..bbb2a55 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 ca2dd47..ee95726 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 =
@@ -474,9 +494,6 @@ JSValueRef emitSignal (JSContextRef context,
 }
 
 static
-JSGlobalContextRef gcontext = NULL;
-
-static
 void dbus_finalize(JSObjectRef object)
 {
   JSObjectSetPrivate(object, NULL);