edbus: Fix edbus_proxy_property_set

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
This commit is contained in:
José Roberto de Souza 2012-12-20 21:48:22 +00:00 committed by Lucas De Marchi
parent c86f98d459
commit 2576b1b861
4 changed files with 45 additions and 32 deletions

View 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

View 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);

View 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);

View 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);