edbus: Fix edbus_proxy_property_set
authorJosé Roberto de Souza <zehortigoza@profusion.mobi>
Thu, 20 Dec 2012 21:48:22 +0000 (21:48 +0000)
committerLucas De Marchi <lucas.demarchi@profusion.mobi>
Thu, 20 Dec 2012 21:48:22 +0000 (21:48 +0000)
Fix the function and add support for complex types, in which case a
Eina_Value is expected.

Patch by: José Roberto de Souza  <zehortigoza@profusion.mobi>

SVN revision: 81493

src/examples/complex_types.c
src/examples/complex_types_server.c
src/lib/edbus_freedesktop.h
src/lib/edbus_proxy.c

index e6d4658..a0af846 100644 (file)
@@ -89,7 +89,8 @@ get_property_resp2(void *data, const EDBus_Message *msg, EDBus_Pending *pending)
    printf("resp2=%s\n", resp2);
    free(type);
 
-   edbus_proxy_property_set(proxy, "Resp2", 's', "lalala", set_property_resp2, NULL);
+   edbus_proxy_property_set(proxy, "Resp2", "s", &"lalala", set_property_resp2, NULL);
+   edbus_proxy_property_set(proxy, "int32", "i",  (void*)(intptr_t)99, set_property_resp2, NULL);
 }
 
 static void
index 2dacaf0..5e87422 100644 (file)
@@ -245,27 +245,36 @@ _properties_get(const EDBus_Service_Interface *iface, const char *propname, EDBu
 static EDBus_Message *
 _properties_set(const EDBus_Service_Interface *iface, const char *propname, EDBus_Message_Iter *iter, const EDBus_Message *msg)
 {
-   EDBus_Message *reply;
-   char *type, *txt;
+   char *type;
 
    type = edbus_message_iter_signature_get(iter);
-   if (type[0] != 's')
+
+   if (!strcmp(propname, "int32"))
      {
-        reply = edbus_message_error_new(msg, "org.freedesktop.DBus.Error.InvalidSignature",
-                                        "Invalid type.");
-        free(type);
-        return reply;
+        int num;
+        if (type[0] != 'i')
+          goto invalid_signature;
+        edbus_message_iter_arguments_get(iter, "i", &num);
+        printf("int32 was set to: %d, previously was: %d\n", num, int32);
+        int32 = num;
+     }
+   else if (!strcmp(propname, "Resp2"))
+     {
+        const char *txt;
+        if (type[0] != 's')
+          goto invalid_signature;
+        edbus_message_iter_arguments_get(iter, "s", &txt);
+        printf("Resp2 was set to: %s, previously was: %s\n", txt, resp2);
+        free(resp2);
+        resp2 = strdup(txt);
      }
-
-   reply = edbus_message_method_return_new(msg);
-   edbus_message_iter_arguments_get(iter, "s", &txt);
-   printf("Resp2 was set to: %s, previously was: %s\n", txt, resp2);
    free(type);
-   free(resp2);
-   resp2 = strdup(txt);
-   edbus_service_property_changed(iface, propname);
+   return edbus_message_method_return_new(msg);
 
-   return reply;
+invalid_signature:
+   free(type);
+   return edbus_message_error_new(msg, "org.freedesktop.DBus.Error.InvalidSignature",
+                                  "Invalid type.");
 }
 
 static const EDBus_Method methods[] = {
@@ -308,7 +317,7 @@ static const EDBus_Method methods[] = {
 static const EDBus_Property properties[] = {
       { "Resp2", "s", NULL, _properties_set },
       { "text", "s" },
-      { "int32", "i" },
+      { "int32", "i", NULL, _properties_set },
       { "st", "(ss)" },
       { }
 };
@@ -331,9 +340,6 @@ on_name_request(void *data, const EDBus_Message *msg, EDBus_Pending *pending)
    unsigned int reply;
    EDBus_Service_Interface *iface = data;
 
-   resp2 = malloc(sizeof(char) * 5);
-   strcpy(resp2, "test");
-
    if (edbus_message_error_get(msg, NULL, NULL))
      {
         printf("error on on_name_request\n");
@@ -366,6 +372,8 @@ main(void)
 
    conn = edbus_connection_get(EDBUS_CONNECTION_TYPE_SESSION);
 
+   resp2 = malloc(sizeof(char) * 5);
+   strcpy(resp2, "test");
    iface = edbus_service_interface_register(conn, PATH, &iface_desc);
    edbus_name_request(conn, BUS, EDBUS_NAME_REQUEST_FLAG_DO_NOT_QUEUE,
                       on_name_request, iface);
index 4e622d0..a341928 100644 (file)
@@ -101,7 +101,7 @@ EAPI EDBus_Pending        *edbus_object_introspect(EDBus_Object *obj, EDBus_Mess
 EAPI void edbus_proxy_properties_monitor(EDBus_Proxy *proxy, Eina_Bool enable) EINA_ARG_NONNULL(1);
 
 EAPI EDBus_Pending        *edbus_proxy_property_get(EDBus_Proxy *proxy, const char *name, EDBus_Message_Cb cb, const void *data) EINA_ARG_NONNULL(1, 2, 3);
-EAPI EDBus_Pending        *edbus_proxy_property_set(EDBus_Proxy *proxy, const char *name, char type, const void *value, EDBus_Message_Cb cb, const void *data) EINA_ARG_NONNULL(1, 2, 4);
+EAPI EDBus_Pending        *edbus_proxy_property_set(EDBus_Proxy *proxy, const char *name, const char *sig, const void *value, EDBus_Message_Cb cb, const void *data) EINA_ARG_NONNULL(1, 2, 3, 4);
 EAPI EDBus_Pending        *edbus_proxy_property_get_all(EDBus_Proxy *proxy, EDBus_Message_Cb cb, const void *data) EINA_ARG_NONNULL(1, 2);
 EAPI EDBus_Signal_Handler *edbus_proxy_properties_changed_callback_add(EDBus_Proxy *proxy, EDBus_Signal_Cb cb, const void *data) EINA_ARG_NONNULL(1, 2);
 
index f11d959..72c192c 100644 (file)
@@ -624,29 +624,33 @@ edbus_proxy_property_get(EDBus_Proxy *proxy, const char *name, EDBus_Message_Cb
 }
 
 EAPI EDBus_Pending *
-edbus_proxy_property_set(EDBus_Proxy *proxy, const char *name, char type, const void *value, EDBus_Message_Cb cb, const void *data)
+edbus_proxy_property_set(EDBus_Proxy *proxy, const char *name, const char *sig, const void *value, EDBus_Message_Cb cb, const void *data)
 {
    EDBus_Message *msg;
    EDBus_Message_Iter *iter, *variant;
    EDBus_Pending *pending;
-   char sig[2];
+
    EDBUS_PROXY_CHECK_RETVAL(proxy, NULL);
    EINA_SAFETY_ON_NULL_RETURN_VAL(name, NULL);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(sig, NULL);
+   EINA_SAFETY_ON_FALSE_RETURN_VAL(dbus_signature_validate_single(sig, NULL), NULL);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(value, NULL);
 
-   if (!dbus_type_is_basic(type))
-     {
-        ERR("Only basic types may be set using edbus_proxy_property_set()");
-        return NULL;
-     }
-
-   sig[0] = type;
-   sig[1] = 0;
    msg = edbus_proxy_method_call_new(proxy->obj->properties, "Set");
    iter = edbus_message_iter_get(msg);
    edbus_message_iter_basic_append(iter, 's', proxy->interface);
    edbus_message_iter_basic_append(iter, 's', name);
    variant = edbus_message_iter_container_new(iter, 'v', sig);
-   edbus_message_iter_basic_append(variant, type, value);
+   if (dbus_type_is_basic(sig[0]))
+     dbus_message_iter_append_basic(&variant->dbus_iterator, sig[0], &value);
+   else
+     {
+        if (!_message_iter_from_eina_value_struct(sig, variant, value))
+          {
+             edbus_message_unref(msg);
+             return NULL;
+          }
+     }
    edbus_message_iter_container_close(iter, variant);
 
    pending = edbus_proxy_send(proxy->obj->properties, msg, cb, data, -1);