From ac9b10007ab7fc906da91becb8e28e60e6384999 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Roberto=20de=20Souza?= Date: Mon, 5 Aug 2013 13:25:04 -0300 Subject: [PATCH] Revert "Backport fixes from EFL tree" This reverts commit 7de696d9d258c372d503c8040d79fd061dc3765a. --- src/codegen/dbus.c | 36 +-- src/codegen/parser.c | 168 +++++------ src/codegen/source_client.c | 41 ++- src/codegen/utils.c | 20 +- src/examples/banshee.c | 26 +- src/examples/client.c | 47 +-- src/examples/complex-types-client-eina-value.c | 324 -------------------- src/examples/complex-types-server.c | 392 ------------------------- src/examples/complex-types.c | 284 ------------------ src/examples/connect-address.c | 274 ----------------- src/examples/connman-list-services.c | 5 +- src/examples/ofono-dial.c | 5 +- src/examples/server.c | 26 +- src/examples/simple-signal-emit.c | 3 - src/lib/eldbus_connection.h | 24 -- src/lib/eldbus_core.c | 157 ++-------- src/lib/eldbus_freedesktop.c | 8 - src/lib/eldbus_freedesktop.h | 1 - src/lib/eldbus_message.c | 17 +- src/lib/eldbus_message.h | 11 - src/lib/eldbus_pending.c | 2 +- src/lib/eldbus_proxy.c | 5 +- src/lib/eldbus_service.c | 69 +++-- src/lib/eldbus_service.h | 4 +- 24 files changed, 248 insertions(+), 1701 deletions(-) delete mode 100644 src/examples/complex-types-client-eina-value.c delete mode 100644 src/examples/complex-types-server.c delete mode 100644 src/examples/complex-types.c delete mode 100644 src/examples/connect-address.c diff --git a/src/codegen/dbus.c b/src/codegen/dbus.c index ac9e828..b05c760 100644 --- a/src/codegen/dbus.c +++ b/src/codegen/dbus.c @@ -62,30 +62,30 @@ arg_free(DBus_Arg *arg) DBus_Signal * signal_new(DBus_Interface *iface) { - DBus_Signal *sig = calloc(1, sizeof(DBus_Signal)); - EINA_SAFETY_ON_NULL_RETURN_VAL(sig, NULL); - iface->signals = eina_inlist_append(iface->signals, EINA_INLIST_GET(sig)); - sig->iface = iface; - return sig; + DBus_Signal *signal = calloc(1, sizeof(DBus_Signal)); + EINA_SAFETY_ON_NULL_RETURN_VAL(signal, NULL); + iface->signals = eina_inlist_append(iface->signals, EINA_INLIST_GET(signal)); + signal->iface = iface; + return signal; } void -signal_free(DBus_Signal *sig) +signal_free(DBus_Signal *signal) { DBus_Arg *arg; Eina_Inlist *inlist; - EINA_INLIST_FOREACH_SAFE(sig->args, inlist, arg) + EINA_INLIST_FOREACH_SAFE(signal->args, inlist, arg) arg_free(arg); - sig->iface->signals = eina_inlist_remove(sig->iface->signals, - EINA_INLIST_GET(sig)); - free(sig->c_name); - free(sig->struct_name); - free(sig->free_function); - free(sig->cb_name); - free(sig->name); - free(sig->signal_event); - free(sig); + signal->iface->signals = eina_inlist_remove(signal->iface->signals, + EINA_INLIST_GET(signal)); + free(signal->c_name); + free(signal->struct_name); + free(signal->free_function); + free(signal->cb_name); + free(signal->name); + free(signal->signal_event); + free(signal); } DBus_Interface * @@ -103,9 +103,9 @@ interface_free(DBus_Interface *iface) { while (iface->signals) { - DBus_Signal *sig = EINA_INLIST_CONTAINER_GET(iface->signals, + DBus_Signal *signal = EINA_INLIST_CONTAINER_GET(iface->signals, DBus_Signal); - signal_free(sig); + signal_free(signal); } while (iface->methods) { diff --git a/src/codegen/parser.c b/src/codegen/parser.c index f695490..55bbab8 100644 --- a/src/codegen/parser.c +++ b/src/codegen/parser.c @@ -1,19 +1,19 @@ #include "codegen.h" #define OBJECT_TAG "node" -#define OBJECT_TAG_LENGTH sizeof(OBJECT_TAG) - 1 +#define OBJECT_TAG_LENGHT strlen(OBJECT_TAG) #define INTERFACE_TAG "interface" -#define INTERFACE_TAG_LENGTH sizeof(INTERFACE_TAG) - 1 +#define INTERFACE_TAG_LENGHT strlen(INTERFACE_TAG) #define SIGNAL_TAG "signal" -#define SIGNAL_TAG_LENGTH sizeof(SIGNAL_TAG) - 1 +#define SIGNAL_TAG_LENGHT strlen(SIGNAL_TAG) #define METHOD_TAG "method" -#define METHOD_TAG_LENGTH sizeof(METHOD_TAG) - 1 +#define METHOD_TAG_LENGHT strlen(METHOD_TAG) #define PROPERTY_TAG "property" -#define PROPERTY_TAG_LENGTH sizeof(PROPERTY_TAG) - 1 +#define PROPERTY_TAG_LENGHT strlen(PROPERTY_TAG) #define ARG_TAG "arg" -#define ARG_TAG_LENGTH sizeof(ARG_TAG) - 1 +#define ARG_TAG_LENGHT strlen(ARG_TAG) #define ANNOTATION_TAG "annotation" -#define ANNOTATION_TAG_LENGTH sizeof(ANNOTATION_TAG) - 1 +#define ANNOTATION_TAG_LENGHT strlen(ANNOTATION_TAG) //attributes #define NAME_ATTR "name" @@ -46,7 +46,7 @@ obj_attributes_parser(void *data, const char *key, const char *value) } static Eina_Bool -iface_attributes_parser(void *data EINA_UNUSED, const char *key, const char *value) +iface_attributes_parser(void *data, const char *key, const char *value) { if (!strcmp(key, NAME_ATTR)) iface->name = strdup(value); @@ -55,7 +55,7 @@ iface_attributes_parser(void *data EINA_UNUSED, const char *key, const char *val } static Eina_Bool -signal_attributes_parser(void *data EINA_UNUSED, const char *key, const char *value) +signal_attributes_parser(void *data, const char *key, const char *value) { if (!strcmp(key, NAME_ATTR)) d_signal->name = strdup(value); @@ -64,7 +64,7 @@ signal_attributes_parser(void *data EINA_UNUSED, const char *key, const char *va } static Eina_Bool -arg_attributes_parser(void *data EINA_UNUSED, const char *key, const char *value) +arg_attributes_parser(void *data, const char *key, const char *value) { DBus_Arg *arg = data; if (!strcmp(key, NAME_ATTR)) @@ -78,7 +78,7 @@ arg_attributes_parser(void *data EINA_UNUSED, const char *key, const char *value } static Eina_Bool -method_attributes_parser(void *data EINA_UNUSED, const char *key, const char *value) +method_attributes_parser(void *data, const char *key, const char *value) { if (!strcmp(key, NAME_ATTR)) method->name = strdup(value); @@ -87,7 +87,7 @@ method_attributes_parser(void *data EINA_UNUSED, const char *key, const char *va } static Eina_Bool -property_attributes_parser(void *data EINA_UNUSED, const char *key, const char *value) +property_attributes_parser(void *data, const char *key, const char *value) { if (!strcmp(key, NAME_ATTR)) property->name = strdup(value); @@ -135,18 +135,6 @@ open_object(const char *content, unsigned length, Eina_Bool is_open_empty, DBus_ return r; } -static void -interface_close(void) -{ - //its not necessary generate code to FreeDesktop interfaces - if (!strncmp(iface->name, DBUS_INTERFACE, strlen(DBUS_INTERFACE))) - { - printf("Refusing to generate code for FDO interface; see eldbus_freedesktop.h\n"); - interface_free(iface); - } - iface = NULL; -} - static Eina_Bool open_interface(const char *content, unsigned length, Eina_Bool is_open_empty, DBus_Object *obj) { @@ -168,27 +156,9 @@ open_interface(const char *content, unsigned length, Eina_Bool is_open_empty, DB iface->c_name = dbus_name_to_c(tmp_name); free(tmp_name); - if (is_open_empty) - interface_close(); - return r; } -static void -signal_close(void) -{ - DBus_Arg *arg; - EINA_INLIST_FOREACH(d_signal->args, arg) - { - if ((arg->type[1]) || (arg->type[0] == 'v')) - { - d_signal->complex = EINA_TRUE; - break; - } - } - d_signal = NULL; -} - static Eina_Bool open_signal(const char *content, unsigned length, Eina_Bool is_open_empty) { @@ -231,12 +201,9 @@ open_signal(const char *content, unsigned length, Eina_Bool is_open_empty) eina_strbuf_append_char(buf, toupper(d_signal->name[i])); } eina_strbuf_append(buf, "_EVENT"); - d_signal->signal_event = eina_strbuf_string_steal(buf); + d_signal->signal_event = strdup(eina_strbuf_string_get(buf)); eina_strbuf_free(buf); - if (is_open_empty) - signal_close(); - return r; } @@ -321,30 +288,8 @@ open_arg(const char *content, unsigned length) return r; } -static void -method_close(void) -{ - DBus_Arg *arg; - EINA_INLIST_FOREACH(method->args, arg) - { - if ((arg->type[1]) || (arg->type[0] == 'v')) - { - if (arg->direction == 'o') - method->out_complex = EINA_TRUE; - else - method->in_complex = EINA_TRUE; - } - } - if (method->no_reply) - { - free(method->cb_name); - method->cb_name = strdup("NULL"); - } - method = NULL; -} - static Eina_Bool -open_method(const char *content, unsigned lenght, Eina_Bool is_open_empty) +open_method(const char *content, unsigned lenght) { Eina_Bool r; char *tmp; @@ -374,14 +319,11 @@ open_method(const char *content, unsigned lenght, Eina_Bool is_open_empty) method->function_cb[i+1] = toupper(method->function_cb[i+1]); } - if (is_open_empty) - method_close(); - return r; } static Eina_Bool -open_property(const char *content, unsigned length) +open_property(const char *content, unsigned length, Eina_Bool is_open_empty) { Eina_Bool r; char *tmp; @@ -410,21 +352,21 @@ static Eina_Bool open_tag(const char *content, unsigned length, Eina_Bool is_open_empty, DBus_Object **obj) { unsigned int i; - if (!strncmp(content, OBJECT_TAG, OBJECT_TAG_LENGTH)) + if (!strncmp(content, OBJECT_TAG, OBJECT_TAG_LENGHT)) return open_object(content, length, is_open_empty, obj); - else if (!strncmp(content, INTERFACE_TAG, INTERFACE_TAG_LENGTH) && *obj) + else if (!strncmp(content, INTERFACE_TAG, INTERFACE_TAG_LENGHT) && *obj) return open_interface(content, length, is_open_empty, *obj); - else if (!strncmp(content, SIGNAL_TAG, SIGNAL_TAG_LENGTH) && iface) + else if (!strncmp(content, SIGNAL_TAG, SIGNAL_TAG_LENGHT) && iface) return open_signal(content, length, is_open_empty); - else if (!strncmp(content, ARG_TAG, ARG_TAG_LENGTH) && iface) + else if (!strncmp(content, ARG_TAG, ARG_TAG_LENGHT) && iface) return open_arg(content, length); - else if (!strncmp(content, ANNOTATION_TAG, ANNOTATION_TAG_LENGTH) && iface) + else if (!strncmp(content, ANNOTATION_TAG, ANNOTATION_TAG_LENGHT) && iface) return open_annotation(content, length); - else if (!strncmp(content, METHOD_TAG, METHOD_TAG_LENGTH) && iface) - return open_method(content, length, is_open_empty); - else if (!strncmp(content, PROPERTY_TAG, PROPERTY_TAG_LENGTH) && iface) - return open_property(content, length); - else if (!strncmp(content, ANNOTATION_TAG, ANNOTATION_TAG_LENGTH) && iface) + else if (!strncmp(content, METHOD_TAG, METHOD_TAG_LENGHT) && iface) + return open_method(content, length); + else if (!strncmp(content, PROPERTY_TAG, PROPERTY_TAG_LENGHT) && iface) + return open_property(content, length, is_open_empty); + else if (!strncmp(content, ANNOTATION_TAG, ANNOTATION_TAG_LENGHT) && iface) return EINA_TRUE; printf("Warning: Tag not handled:\n"); @@ -435,23 +377,69 @@ open_tag(const char *content, unsigned length, Eina_Bool is_open_empty, DBus_Obj return EINA_TRUE; } +static void +interface_close(void) +{ + //its not necessary generate code to FreeDesktop interfaces + if (!strncmp(iface->name, DBUS_INTERFACE, strlen(DBUS_INTERFACE))) + interface_free(iface); + iface = NULL; +} + +static void +signal_close(void) +{ + DBus_Arg *arg; + EINA_INLIST_FOREACH(d_signal->args, arg) + { + if ((arg->type[1]) || (arg->type[0] == 'v')) + { + d_signal->complex = EINA_TRUE; + break; + } + } + d_signal = NULL; +} + +static void +method_close(void) +{ + DBus_Arg *arg; + EINA_INLIST_FOREACH(method->args, arg) + { + if ((arg->type[1]) || (arg->type[0] == 'v')) + { + if (arg->direction == 'o') + method->out_complex = EINA_TRUE; + else + method->in_complex = EINA_TRUE; + } + } + if (method->no_reply) + { + free(method->cb_name); + method->cb_name = strdup("NULL"); + } + method = NULL; +} + static Eina_Bool -close_tag(const char *content) +close_tag(const char *content, unsigned length) { - if (!strncmp(content, INTERFACE_TAG, INTERFACE_TAG_LENGTH)) + if (!strncmp(content, INTERFACE_TAG, INTERFACE_TAG_LENGHT)) interface_close(); - if (!strncmp(content, SIGNAL_TAG, SIGNAL_TAG_LENGTH)) + if (!strncmp(content, SIGNAL_TAG, SIGNAL_TAG_LENGHT)) signal_close(); - else if (!strncmp(content, METHOD_TAG, METHOD_TAG_LENGTH)) + else if (!strncmp(content, METHOD_TAG, METHOD_TAG_LENGHT)) method_close(); - else if (!strncmp(content, PROPERTY_TAG, PROPERTY_TAG_LENGTH)) + else if (!strncmp(content, PROPERTY_TAG, PROPERTY_TAG_LENGHT)) property = NULL; return EINA_TRUE; } Eina_Bool -parser(void *data, Eina_Simple_XML_Type type, const char *content, unsigned offset EINA_UNUSED, unsigned length) +parser(void *data, Eina_Simple_XML_Type type, const char *content, unsigned offset, unsigned length) { Eina_Bool r = EINA_TRUE; DBus_Object **obj = data; @@ -467,7 +455,7 @@ parser(void *data, Eina_Simple_XML_Type type, const char *content, unsigned offs } case EINA_SIMPLE_XML_CLOSE: { - r = close_tag(content); + r = close_tag(content, length); break; } default: diff --git a/src/codegen/source_client.c b/src/codegen/source_client.c index 45c95e5..b8787c1 100644 --- a/src/codegen/source_client.c +++ b/src/codegen/source_client.c @@ -300,7 +300,7 @@ source_client_method_generate(const DBus_Method *method, Eina_Strbuf *c_code, Ei } static void -source_client_signal_generate(const DBus_Signal *sig, Eina_Strbuf *c_code, Eina_Strbuf * h, Eina_Strbuf *c_init_function, Eina_Strbuf *c_header) +source_client_signal_generate(const DBus_Signal *signal, Eina_Strbuf *c_code, Eina_Strbuf * h, Eina_Strbuf *c_init_function, Eina_Strbuf *c_header) { DBus_Arg *arg; Eina_Strbuf *full_signature = eina_strbuf_new(); @@ -308,23 +308,23 @@ source_client_signal_generate(const DBus_Signal *sig, Eina_Strbuf *c_code, Eina_ Eina_Strbuf *string_copy = eina_strbuf_new(); Eina_Strbuf *string_free = eina_strbuf_new(); - eina_strbuf_append_printf(c_init_function, " eldbus_proxy_signal_handler_add(proxy, \"%s\", %s, proxy);\n", sig->name, sig->cb_name); - eina_strbuf_append_printf(c_header, "int %s;\n", sig->signal_event); - eina_strbuf_append_printf(h, "extern int %s;\n", sig->signal_event); - eina_strbuf_append_printf(c_init_function, " if (!%s)\n", sig->signal_event); - eina_strbuf_append_printf(c_init_function, " %s = ecore_event_type_new();\n", sig->signal_event); + eina_strbuf_append_printf(c_init_function, " eldbus_proxy_signal_handler_add(proxy, \"%s\", %s, proxy);\n", signal->name, signal->cb_name); + eina_strbuf_append_printf(c_header, "int %s;\n", signal->signal_event); + eina_strbuf_append_printf(h, "extern int %s;\n", signal->signal_event); + eina_strbuf_append_printf(c_init_function, " if (!%s)\n", signal->signal_event); + eina_strbuf_append_printf(c_init_function, " %s = ecore_event_type_new();\n", signal->signal_event); - eina_strbuf_append_printf(h, "typedef struct _%s\n", sig->struct_name); + eina_strbuf_append_printf(h, "typedef struct _%s\n", signal->struct_name); eina_strbuf_append_printf(h, "{\n"); eina_strbuf_append_printf(h, " Eldbus_Proxy *proxy;\n"); - if (sig->complex) + if (signal->complex) { eina_strbuf_append_printf(h, " Eina_Value *value;\n"); goto jump_simple_stuff; } - EINA_INLIST_FOREACH(sig->args, arg) + EINA_INLIST_FOREACH(signal->args, arg) { eina_strbuf_append(full_signature, arg->type); eina_strbuf_append_printf(parameters, ", &s_data->%s", arg->c_name); @@ -338,12 +338,12 @@ source_client_signal_generate(const DBus_Signal *sig, Eina_Strbuf *c_code, Eina_ } jump_simple_stuff: - eina_strbuf_append_printf(h, "} %s;\n", sig->struct_name); + eina_strbuf_append_printf(h, "} %s;\n", signal->struct_name); //free function - eina_strbuf_append_printf(c_code, "\nstatic void\n%s(void *user_data, void *func_data)\n{\n", sig->free_function); - eina_strbuf_append_printf(c_code, " %s *s_data = user_data;\n", sig->struct_name); - if (sig->complex) + eina_strbuf_append_printf(c_code, "\nstatic void\n%s(void *user_data, void *func_data)\n{\n", signal->free_function); + eina_strbuf_append_printf(c_code, " %s *s_data = user_data;\n", signal->struct_name); + if (signal->complex) eina_strbuf_append(c_code, " eina_value_free(s_data->proxy);\n"); else eina_strbuf_append(c_code, eina_strbuf_string_get(string_free)); @@ -351,11 +351,11 @@ jump_simple_stuff: eina_strbuf_append_printf(c_code, "}\n"); //cb function - eina_strbuf_append_printf(c_code, "\nstatic void\n%s(void *data, const Eldbus_Message *msg)\n{\n", sig->cb_name); + eina_strbuf_append_printf(c_code, "\nstatic void\n%s(void *data, const Eldbus_Message *msg)\n{\n", signal->cb_name); eina_strbuf_append_printf(c_code, " Eldbus_Proxy *proxy = data;\n"); - eina_strbuf_append_printf(c_code, " %s *s_data = calloc(1, sizeof(%s));\n", sig->struct_name, sig->struct_name); + eina_strbuf_append_printf(c_code, " %s *s_data = calloc(1, sizeof(%s));\n", signal->struct_name, signal->struct_name); eina_strbuf_append_printf(c_code, " s_data->proxy = proxy;\n"); - if (sig->complex) + if (signal->complex) { eina_strbuf_append_printf(c_code, " s_data->value = eldbus_message_to_eina_value(msg);\n"); goto end_signal; @@ -363,13 +363,12 @@ jump_simple_stuff: eina_strbuf_append_printf(c_code, " if (!eldbus_message_arguments_get(msg, \"%s\"%s))\n", eina_strbuf_string_get(full_signature), eina_strbuf_string_get(parameters)); eina_strbuf_append_printf(c_code, " {\n"); eina_strbuf_append_printf(c_code, " ERR(\"Error: Getting arguments from message.\");\n"); - eina_strbuf_append_printf(c_code, " free(s_data);\n"); eina_strbuf_append_printf(c_code, " return;\n"); eina_strbuf_append_printf(c_code, " }\n"); eina_strbuf_append(c_code, eina_strbuf_string_get(string_copy)); end_signal: - eina_strbuf_append_printf(c_code, " ecore_event_add(%s, s_data, %s, NULL);\n", sig->signal_event, sig->free_function); + eina_strbuf_append_printf(c_code, " ecore_event_add(%s, s_data, %s, NULL);\n", signal->signal_event, signal->free_function); eina_strbuf_append_printf(c_code, "}\n"); eina_strbuf_free(full_signature); @@ -533,7 +532,7 @@ source_client_generate(DBus_Object *path, const char *prefix, const char *interf { Eina_Strbuf *h, *c_init_function, *c_header, *c_code; DBus_Method *method; - DBus_Signal *sig; + DBus_Signal *signal; DBus_Property *prop; char *file_name, *aux; int i; @@ -592,8 +591,8 @@ source_client_generate(DBus_Object *path, const char *prefix, const char *interf EINA_INLIST_FOREACH(iface->methods, method) source_client_method_generate(method, c_code, h); - EINA_INLIST_FOREACH(iface->signals, sig) - source_client_signal_generate(sig, c_code, h, c_init_function, c_header); + EINA_INLIST_FOREACH(iface->signals, signal) + source_client_signal_generate(signal, c_code, h, c_init_function, c_header); EINA_INLIST_FOREACH(iface->properties, prop) source_client_property_generate(prop, c_code, h); diff --git a/src/codegen/utils.c b/src/codegen/utils.c index de4eb15..1f85891 100644 --- a/src/codegen/utils.c +++ b/src/codegen/utils.c @@ -5,7 +5,7 @@ Eina_Bool file_read(const char *file_name, char **buffer) { FILE *xml_handler; - int data; /* fgetc needs int to detect EOF correctly */ + char data; Eina_Strbuf *buf; xml_handler = fopen(file_name, "rt"); @@ -17,10 +17,10 @@ file_read(const char *file_name, char **buffer) buf = eina_strbuf_new(); while ((data = fgetc(xml_handler)) != EOF) - eina_strbuf_append_char(buf, (char)data); + eina_strbuf_append_char(buf, data); fclose(xml_handler); - *buffer = eina_strbuf_string_steal(buf); + *buffer = strdup(eina_strbuf_string_get(buf)); eina_strbuf_free(buf); return EINA_TRUE; @@ -62,7 +62,8 @@ dbus_name_to_c(const char *dbus) while ((pch = strtok(NULL, "/."))) eina_strbuf_append_printf(buffer, "_%s",pch); - ret = eina_strbuf_string_steal(buffer); + ret = strdup(eina_strbuf_string_get(buffer)); + eina_strbuf_reset(buffer); for (i = 0; ret[i]; i++) { if (i > 0 && ret[i-1] != '_' && ret[i] > '@' && ret[i] < '[')//upper case @@ -71,7 +72,7 @@ dbus_name_to_c(const char *dbus) eina_strbuf_append_char(buffer, tolower(ret[i])); } free(ret); - ret = eina_strbuf_string_steal(buffer); + ret = strdup(eina_strbuf_string_get(buffer)); end: free(str_cpy); eina_strbuf_free(buffer); @@ -87,17 +88,12 @@ replace_string(const char *string, const char *substr, const char *replacement) Eina_Strbuf *buffer = eina_strbuf_new(); pch = strtok(str_cpy, substr); - if (!pch) - { - eina_strbuf_free(buffer); - return str_cpy; - } eina_strbuf_append(buffer, pch); while ((pch = strtok(NULL, substr))) eina_strbuf_append_printf(buffer, "%s%s", replacement, pch); - ret = eina_strbuf_string_steal(buffer); + ret = strdup(eina_strbuf_string_get(buffer)); free(str_cpy); eina_strbuf_free(buffer); return ret; @@ -130,7 +126,7 @@ string_build(const char *fmt, ...) eina_strbuf_prepend_vprintf(buffer, fmt, ap); va_end(ap); - ret = eina_strbuf_string_steal(buffer); + ret = strdup(eina_strbuf_string_get(buffer)); eina_strbuf_free(buffer); return ret; diff --git a/src/examples/banshee.c b/src/examples/banshee.c index c9d30b5..5202422 100644 --- a/src/examples/banshee.c +++ b/src/examples/banshee.c @@ -1,6 +1,3 @@ -//Compile with: -// gcc -o banshee banshee.c `pkg-config --cflags --libs eldbus ecore eina` - #include "Eldbus.h" #include @@ -16,7 +13,7 @@ static Eldbus_Signal_Handler *state_changed2; static Eina_Bool -_timeout_application(void *data EINA_UNUSED) +_timeout_application(void *data) { printf("\n## ecore_main_loop_quit()\n"); ecore_main_loop_quit(); @@ -24,7 +21,7 @@ _timeout_application(void *data EINA_UNUSED) } static void -on_get_playlists(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) +on_get_playlists(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending) { Eldbus_Message_Iter *array, *struct_entry; const char *path, *name, *image; @@ -52,7 +49,7 @@ on_get_playlists(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pendi } static void -iterate_dict(void *data EINA_UNUSED, const void *key, Eldbus_Message_Iter *var) +iterate_dict(void *data, const void *key, Eldbus_Message_Iter *var) { const char *skey = key; @@ -61,7 +58,7 @@ iterate_dict(void *data EINA_UNUSED, const void *key, Eldbus_Message_Iter *var) unsigned count; if (!eldbus_message_iter_arguments_get(var, "u", &count)) printf("error2\n"); - printf("PlaylistCount=%u\n", count); + printf("PlaylistCount=%d\n", count); } else if (!strcmp(skey, "Orderings")) { @@ -76,7 +73,7 @@ iterate_dict(void *data EINA_UNUSED, const void *key, Eldbus_Message_Iter *var) } static void -playlist_get_all_cb(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) +playlist_get_all_cb(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending) { Eldbus_Message_Iter *array; EINA_SAFETY_ON_TRUE_RETURN(eldbus_message_error_get(msg, NULL, NULL)); @@ -86,7 +83,7 @@ playlist_get_all_cb(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pe } static void -on_introspect(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) +on_introspect(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending) { const char *string; @@ -102,7 +99,7 @@ on_introspect(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending } static void -on_next_or_pause(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) +on_next_or_pause(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending) { const char *status = data; @@ -112,7 +109,7 @@ on_next_or_pause(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending } static void -on_state_changed(void *data EINA_UNUSED, const Eldbus_Message *msg) +on_state_changed(void *data, const Eldbus_Message *msg) { const char *status; EINA_SAFETY_ON_TRUE_RETURN(eldbus_message_error_get(msg, NULL, NULL)); @@ -127,7 +124,7 @@ on_state_changed(void *data EINA_UNUSED, const Eldbus_Message *msg) } static void -on_state_changed2(void *data EINA_UNUSED, const Eldbus_Message *msg) +on_state_changed2(void *data, const Eldbus_Message *msg) { const char *status; EINA_SAFETY_ON_TRUE_RETURN(eldbus_message_error_get(msg, NULL, NULL)); @@ -144,7 +141,7 @@ on_state_changed2(void *data EINA_UNUSED, const Eldbus_Message *msg) } static void -on_banshee_startup(void *data EINA_UNUSED, const Eldbus_Message *msg) +on_banshee_startup(void *data, const Eldbus_Message *msg) { const char *bus, *older_id, *new_id; @@ -159,7 +156,7 @@ on_banshee_startup(void *data EINA_UNUSED, const Eldbus_Message *msg) } static void -on_name_owner_changed(void *data EINA_UNUSED, const Eldbus_Message *msg) +on_name_owner_changed(void *data, const Eldbus_Message *msg) { const char *bus, *older_id, *new_id; @@ -239,3 +236,4 @@ end: ecore_shutdown(); return 0; } + diff --git a/src/examples/client.c b/src/examples/client.c index fe8391f..a407847 100644 --- a/src/examples/client.c +++ b/src/examples/client.c @@ -1,6 +1,3 @@ -//Compile with: -// gcc -o client client.c `pkg-config --cflags --libs eldbus ecore eina` - #include "Eldbus.h" #include @@ -12,17 +9,14 @@ static int _client_log_dom = -1; #define ERR(...) EINA_LOG_DOM_ERR(_client_log_dom, __VA_ARGS__) -static Eldbus_Connection *conn = NULL; -static Ecore_Timer *timeout = NULL; - static void -_on_alive(void *context EINA_UNUSED, const Eldbus_Message *msg EINA_UNUSED) +_on_alive(void *context, const Eldbus_Message *msg) { printf("Alive\n\n"); } static void -_on_hello(void *context EINA_UNUSED, const Eldbus_Message *msg) +_on_hello(void *context, const Eldbus_Message *msg) { const char *txt; if (eldbus_message_arguments_get(msg, "s", &txt)) @@ -56,18 +50,13 @@ test(void) static int n = 0; n++; if (n >= NTESTS) - { - printf("Passed in all tests\nExiting...\n"); - eldbus_connection_unref(conn); - conn = NULL; - ecore_main_loop_quit(); - } + printf("Passed in all tests\n"); else printf("Passed in %d/%d tests\n", n, NTESTS); } static void -_on_send_bool(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) +_on_send_bool(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending) { const char *errname, *errmsg; Eina_Bool b; @@ -94,7 +83,7 @@ _on_send_bool(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending } static void -_on_send_byte(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) +_on_send_byte(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending) { const char *errname, *errmsg; uint8_t y; @@ -121,7 +110,7 @@ _on_send_byte(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending } static void -_on_send_uint32(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) +_on_send_uint32(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending) { const char *errname, *errmsg; unsigned int u; @@ -148,7 +137,7 @@ _on_send_uint32(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pendin } static void -_on_send_int32(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) +_on_send_int32(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending) { const char *errname, *errmsg; int32_t i; @@ -175,7 +164,7 @@ _on_send_int32(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending } static void -_on_send_int16(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) +_on_send_int16(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending) { const char *errname, *errmsg; int16_t n; @@ -202,7 +191,7 @@ _on_send_int16(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending } static void -_on_send_double(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) +_on_send_double(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending) { const char *errname, *errmsg; double d; @@ -229,7 +218,7 @@ _on_send_double(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pendin } static void -_on_send_string(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) +_on_send_string(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending) { const char *errname, *errmsg; char *s; @@ -256,7 +245,7 @@ _on_send_string(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pendin } static void -_on_async_test(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) +_on_async_test(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending) { const char *errname, *errmsg; @@ -270,23 +259,22 @@ _on_async_test(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending } static void -on_name_owner_changed(void *data EINA_UNUSED, const char *bus, const char *old_id, const char *new_id EINA_UNUSED) +on_name_owner_changed(void *data, const char *bus, const char *old_id, const char *new_id) { printf("Bus=%s | old=%s | new=%s\n", bus, old_id, new_id); } static Eina_Bool -finish(void *data EINA_UNUSED) +finish(void *data) { - ERR("Timeout\nSome error happened or server is taking too much time to respond."); ecore_main_loop_quit(); - timeout = NULL; return ECORE_CALLBACK_CANCEL; } int main(void) { + Eldbus_Connection *conn; Eldbus_Object *obj; Eldbus_Proxy *proxy; @@ -326,14 +314,11 @@ main(void) eldbus_name_owner_changed_callback_add(conn, BUS, on_name_owner_changed, conn, EINA_TRUE); - timeout = ecore_timer_add(30, finish, NULL); + ecore_timer_add(30, finish, NULL); ecore_main_loop_begin(); - if (timeout) - ecore_timer_del(timeout); - if (conn) - eldbus_connection_unref(conn); + eldbus_connection_unref(conn); eldbus_shutdown(); ecore_shutdown(); diff --git a/src/examples/complex-types-client-eina-value.c b/src/examples/complex-types-client-eina-value.c deleted file mode 100644 index 3d290ae..0000000 --- a/src/examples/complex-types-client-eina-value.c +++ /dev/null @@ -1,324 +0,0 @@ -//Compile with: -// gcc -o complex-types-client-eina-value complex-types-client-eina-value.c `pkg-config --cflags --libs eldbus ecore eina` - -#include "Eldbus.h" -#include - -#define BUS "com.profusion" -#define PATH "/com/profusion/Test" -#define IFACE "com.profusion.Test" - -#define size_of_array 5 -static const char *array_string[] = { - "aaaa", "bbbb", "cccc", "dddd", "eeee" -}; - -typedef struct _sub_struct -{ - char *txt; - int num; -} sub_struct; - -typedef struct _main_struct -{ - int size; - sub_struct array[]; -} main_struct; - -static unsigned int -_type_offset(unsigned base, unsigned size) -{ - unsigned padding; - if (!(base % size)) - return base; - padding = abs(base - size); - return base + padding; -} - -static void -_fill_receive_array_of_string_int_with_size(Eldbus_Message *msg, int size, const char *array[]) -{ - Eina_Value *value_struct, *value_array; - int i; - unsigned offset; - Eina_Value_Struct_Member main_members[2]; - Eina_Value_Struct_Member sub_members[] = { - EINA_VALUE_STRUCT_MEMBER(EINA_VALUE_TYPE_STRING, sub_struct, txt), - EINA_VALUE_STRUCT_MEMBER(EINA_VALUE_TYPE_INT, sub_struct, num) - }; - Eina_Value_Struct_Desc desc_sub_struct = { - EINA_VALUE_STRUCT_DESC_VERSION, - NULL, // no special operations - sub_members, - 2, - sizeof(sub_struct) - }; - Eina_Value_Struct_Desc desc_struct = { - EINA_VALUE_STRUCT_DESC_VERSION, - NULL, // no special operations - main_members, - 2, - 0//will be set below - }; - - offset = _type_offset(sizeof(int), sizeof(Eina_Value_Array)); - main_members[0].name = "size"; - main_members[0].type = EINA_VALUE_TYPE_INT, 0; - main_members[0].offset = 0; - main_members[1].name = "array"; - main_members[1].type = EINA_VALUE_TYPE_ARRAY; - main_members[1].offset = offset; - desc_struct.size = offset + sizeof(Eina_Value_Array); - - value_struct = eina_value_struct_new(&desc_struct); - eina_value_struct_set(value_struct, "size", size); - - value_array = eina_value_array_new(EINA_VALUE_TYPE_STRUCT, size); - for (i = 0; i < size; i++) - { - Eina_Value *value_sub_struct = eina_value_struct_new(&desc_sub_struct); - Eina_Value_Struct st; - eina_value_struct_set(value_sub_struct, "txt", array[i]); - eina_value_struct_set(value_sub_struct, "num", i); - eina_value_get(value_sub_struct, &st); - eina_value_array_append(value_array, st); - eina_value_free(value_sub_struct); - } - eina_value_struct_value_set(value_struct, "array", value_array); - - eldbus_message_from_eina_value("ia(si)", msg, value_struct); - - eina_value_free(value_struct); - eina_value_free(value_array); -} - -static void -on_send_array(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) -{ - Eina_Value *v, array; - const char *txt; - unsigned i; - printf("2 - on_send_array()\n"); - - if (eldbus_message_error_get(msg, NULL, NULL)) - { - printf("Message error\n\n"); - return; - } - - v = eldbus_message_to_eina_value(msg); - eina_value_struct_value_get(v, "arg0", &array); - for (i = 0; i < eina_value_array_count(&array); i++) - { - eina_value_array_get(&array, i, &txt); - printf("\t%s\n", txt); - } - - eina_value_free(v); - eina_value_flush(&array); -} - -static void -on_receive_array_with_size(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) -{ - const char *errname; - const char *errmsg; - - printf("1 - on_receive_array_with_size()\n"); - if (eldbus_message_error_get(msg, &errname, &errmsg)) - { - fprintf(stderr, "Error: %s %s\n", errname, errmsg); - } -} - -static void -on_plus_one(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) -{ - Eina_Value *v; - int num2; - - if (eldbus_message_error_get(msg, NULL, NULL)) - { - printf("Message error\n\n"); - return; - } - - v = eldbus_message_to_eina_value(msg); - eina_value_struct_get(v, "arg0", &num2); - - printf("3 - on_plus_one() %d\n", num2); - eina_value_free(v); -} - -static void -receive_variant_cb(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) -{ - Eina_Value *v, variant, array; - unsigned i; - - printf("4 - receive a variant with an array of strings\n"); - if (eldbus_message_error_get(msg, NULL, NULL)) - { - printf("Message error\n\n"); - return; - } - - v = eldbus_message_to_eina_value(msg); - - eina_value_struct_value_get(v, "arg0", &variant); - eina_value_struct_value_get(&variant, "arg0", &array); - for (i = 0; i < eina_value_array_count(&array); i++) - { - const char *txt; - eina_value_array_get(&array, i, &txt); - printf("\t%s\n", txt); - } - - eina_value_flush(&array); - eina_value_flush(&variant); - eina_value_free(v); -} - -static void -_property_removed(void *data EINA_UNUSED, Eldbus_Proxy *proxy EINA_UNUSED, void *event_info) -{ - Eldbus_Proxy_Event_Property_Removed *event = event_info; - - printf("\nproperty removed: %s", event->name); -} - -static void -_property_changed(void *data EINA_UNUSED, Eldbus_Proxy *proxy EINA_UNUSED, void *event_info) -{ - Eldbus_Proxy_Event_Property_Changed *event = event_info; - const char *name; - const Eina_Value *value; - printf("\nproperty changed\n"); - - name = event->name; - value = event->value; - - if (!strcmp(name, "text") || !strcmp(name, "Resp2")) - { - const char *txt; - eina_value_get(value, &txt); - printf("[%s] = %s\n", name, txt); - } - else if (!strcmp(name, "int32")) - { - int num; - eina_value_get(value, &num); - printf("[%s] = %d\n", name, num); - } - else if (!strcmp(name, "st")) - { - const char *txt; - eina_value_struct_get(value, "arg0", &txt); - printf("[%s] %s | ", name, txt); - eina_value_struct_get(value, "arg1", &txt); - printf("%s\n", txt); - } -} - -static Eina_Bool -_read_cache(void *data) -{ - Eldbus_Proxy *proxy = data; - const char *txt; - int num; - Eina_Value *v; - - v = eldbus_proxy_property_local_get(proxy, "text"); - if (v) - { - eina_value_get(v, &txt); - printf("Read cache: [txt] = %s\n", txt); - } - - v = eldbus_proxy_property_local_get(proxy, "int32"); - if (v) - { - eina_value_get(v, &num); - printf("Read cache: [int32] = %d\n", num); - } - - v = eldbus_proxy_property_local_get(proxy, "st"); - if (v) - { - eina_value_struct_get(v, "arg0", &txt); - printf("Read cache: [st] %s | ", txt); - eina_value_struct_get(v, "arg1", &txt); - printf("%s\n", txt); - } - - return EINA_FALSE; -} - -static void -_fill_plus_one(Eldbus_Message *msg, int num) -{ - Eina_Value *v; - Eina_Value_Struct_Member main_members[] = { - {"num", EINA_VALUE_TYPE_INT, 0} - }; - Eina_Value_Struct_Desc desc_struct = { - EINA_VALUE_STRUCT_DESC_VERSION, - NULL, // no special operations - main_members, - 1, - sizeof(int) - }; - v = eina_value_struct_new(&desc_struct); - eina_value_struct_set(v, "num", num); - - eldbus_message_from_eina_value("i", msg, v); - - eina_value_free(v); -} - -int -main(void) -{ - Eldbus_Connection *conn; - Eldbus_Object *obj; - Eldbus_Proxy *proxy; - Eldbus_Message *msg; - - ecore_init(); - eldbus_init(); - - conn = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SESSION); - obj = eldbus_object_get(conn, BUS, PATH); - proxy = eldbus_proxy_get(obj, IFACE); - - msg = eldbus_proxy_method_call_new(proxy, "ReceiveArrayOfStringIntWithSize"); - _fill_receive_array_of_string_int_with_size(msg, size_of_array, array_string); - eldbus_proxy_send(proxy, msg, on_receive_array_with_size, NULL, -1); - - eldbus_proxy_call(proxy, "SendArray", on_send_array, NULL, -1 , ""); - - msg = eldbus_proxy_method_call_new(proxy, "PlusOne"); - _fill_plus_one(msg, 14); - eldbus_proxy_send(proxy, msg, on_plus_one, NULL, -1); - - eldbus_proxy_event_callback_add(proxy, - ELDBUS_PROXY_EVENT_PROPERTY_CHANGED, - _property_changed, NULL); - eldbus_proxy_event_callback_add(proxy, ELDBUS_PROXY_EVENT_PROPERTY_REMOVED, - _property_removed, NULL); - - eldbus_proxy_properties_monitor(proxy, EINA_TRUE); - ecore_timer_add(10, _read_cache, proxy); - - eldbus_proxy_call(proxy, "ReceiveVariantData", receive_variant_cb, NULL, -1, ""); - - ecore_main_loop_begin(); - - eldbus_proxy_event_callback_del(proxy, ELDBUS_PROXY_EVENT_PROPERTY_CHANGED, - _property_changed, NULL); - eldbus_connection_unref(conn); - - eldbus_shutdown(); - ecore_shutdown(); - return 0; -} diff --git a/src/examples/complex-types-server.c b/src/examples/complex-types-server.c deleted file mode 100644 index 9e7f395..0000000 --- a/src/examples/complex-types-server.c +++ /dev/null @@ -1,392 +0,0 @@ -//Compile with: -// gcc -o complex-types-server complex-types-server.c `pkg-config --cflags --libs eldbus ecore` - -#include "Eldbus.h" -#include - -#define BUS "com.profusion" -#define PATH "/com/profusion/Test" -#define IFACE "com.profusion.Test" - -static char *resp2; -/* dummy, incremented each time DBus.Properties.Get() is called */ -static int int32 = 35; -static Ecore_Timer *timer; - -static Eldbus_Message * -_receive_array(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg) -{ - Eldbus_Message *reply = eldbus_message_method_return_new(msg); - Eldbus_Message_Iter *array; - const char *txt; - - printf("- receiveArray\n"); - if (!eldbus_message_arguments_get(msg, "as", &array)) - { - printf("Error on eldbus_message_arguments_get()\n"); - return reply; - } - - while (eldbus_message_iter_get_and_next(array, 's', &txt)) - printf("%s\n", txt); - printf("}\n\n"); - - return reply; -} - -static Eldbus_Message * -_receive_array_of_string_int_with_size(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg) -{ - Eldbus_Message *reply = eldbus_message_method_return_new(msg); - Eldbus_Message_Iter *array, *struct_si; - int size, i = 0; - - printf("- receiveArrayOfStringIntWithSize\n{\n"); - if (!eldbus_message_arguments_get(msg, "ia(si)", &size, &array)) - { - printf("Error on eldbus_message_arguments_get()\n"); - return reply; - } - - while (eldbus_message_iter_get_and_next(array, 'r', &struct_si)) - { - const char *txt; - int num; - if (!eldbus_message_iter_arguments_get(struct_si, "si", &txt, &num)) - { - printf("Error on eldbus_message_arguments_get()\n"); - return reply; - } - printf("%s | %d\n", txt, num); - i++; - } - printf("size in msg %d | size read %d\n", size, i); - printf("}\n\n"); - - return reply; -} - -static Eldbus_Message * -_receive_variant(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg) -{ - Eldbus_Message *reply = eldbus_message_method_return_new(msg); - Eldbus_Message_Iter *var, *array, *main_iter; - - main_iter = eldbus_message_iter_get(reply); - var = eldbus_message_iter_container_new(main_iter, 'v', "as"); - eldbus_message_iter_arguments_append(var, "as", &array); - - eldbus_message_iter_arguments_append(array, "s", "item1"); - eldbus_message_iter_arguments_append(array, "s", "item2"); - eldbus_message_iter_arguments_append(array, "s", "item3"); - - eldbus_message_iter_container_close(var, array); - eldbus_message_iter_container_close(main_iter, var); - - return reply; -} - -static Eldbus_Message * -_send_variant(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg) -{ - Eldbus_Message *reply = eldbus_message_method_return_new(msg); - Eldbus_Message_Iter *variant; - char *type; - - printf("- sendVariantData\n{\n"); - if (!eldbus_message_arguments_get(msg, "v", &variant)) - { - printf("Error on eldbus_message_arguments_get()\n"); - return reply; - } - - type = eldbus_message_iter_signature_get(variant); - if (type[1]) - { - printf("It is a complex type, not handle yet.\n"); - free(type); - return reply; - } - - switch (type[0]) - { - case 's': - case 'o': - { - char *txt; - eldbus_message_iter_arguments_get(variant, type, &txt); - printf("type = %c value = %s\n", type[0], txt); - break; - } - case 'i': - { - int num; - eldbus_message_iter_arguments_get(variant, type, &num); - printf("type = %c value = %d\n", type[0], num); - break; - } - default: - { - printf("Unhandled type\n"); - } - } - - printf("}\n\n"); - - free(type); - return reply; -} - -static Eldbus_Message * -_send_array_int(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg) -{ - Eldbus_Message *reply = eldbus_message_method_return_new(msg); - Eldbus_Message_Iter *iter, *array; - int numbers[] = { 10, 9, 8, 7, 6, 5 }; - - printf("- sendArrayInt\n\n"); - - iter = eldbus_message_iter_get(reply); - array = eldbus_message_iter_container_new(iter, 'a', "i"); - eldbus_message_iter_fixed_array_append(array, 'i', numbers, EINA_C_ARRAY_LENGTH(numbers)); - eldbus_message_iter_container_close(iter, array); - - return reply; -} - -static Eldbus_Message * -_send_array(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg) -{ - Eldbus_Message *reply = eldbus_message_method_return_new(msg); - Eldbus_Message_Iter *iter, *array; - const char *array_string[5] = {"qqqq", "wwwww", "eeeeee", "rrrrr", "ttttt"}; - int i; - - printf("sendArray\n\n"); - - iter = eldbus_message_iter_get(reply); - array = eldbus_message_iter_container_new(iter, 'a', "s"); - for (i = 0; i < 5; i++) - eldbus_message_iter_arguments_append(array, "s", array_string[i]); - eldbus_message_iter_container_close(iter, array); - - return reply; -} - -static Eldbus_Message * -_plus_one(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg) -{ - Eldbus_Message *reply = eldbus_message_method_return_new(msg); - int num; - - printf("- plusOne\n\n"); - if (!eldbus_message_arguments_get(msg, "i", &num)) - { - printf("Error on eldbus_message_arguments_get()\n"); - return reply; - } - num++; - eldbus_message_arguments_append(reply, "i", num); - - return reply; -} - -static Eldbus_Message * -_double_container(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg) -{ - Eldbus_Message_Iter *array1, *array2, *structure; - int num1, num2; - Eldbus_Message *reply = eldbus_message_method_return_new(msg); - - if (!eldbus_message_arguments_get(msg, "a(ii)a(ii)", &array1, &array2)) - { - printf("Error on eldbus_message_arguments_get()\n"); - return NULL; - } - - printf("DoubleCountainer\n{\nArray1:\n"); - while (eldbus_message_iter_get_and_next(array1, 'r', &structure)) - { - eldbus_message_iter_arguments_get(structure, "ii", &num1, &num2); - printf("1 %d - 2 %d\n", num1, num2); - } - - printf("Array2:\n"); - while (eldbus_message_iter_get_and_next(array2, 'r', &structure)) - { - eldbus_message_iter_arguments_get(structure, "ii", &num1, &num2); - printf("1 %d - 2 %d\n", num1, num2); - } - printf("}\n\n"); - return reply; -} - -static Eina_Bool -_properties_get(const Eldbus_Service_Interface *iface EINA_UNUSED, const char *propname, Eldbus_Message_Iter *iter, const Eldbus_Message *request_msg EINA_UNUSED, Eldbus_Message **error EINA_UNUSED) -{ - printf("Properties_get - %s\n", propname); - if (!strcmp(propname, "Resp2")) - eldbus_message_iter_basic_append(iter, 's', resp2); - else if (!strcmp(propname, "text")) - eldbus_message_iter_basic_append(iter, 's', "lalalala"); - else if (!strcmp(propname, "int32")) - { - eldbus_message_iter_arguments_append(iter, "i", int32); - int32++; - } - else if (!strcmp(propname, "st")) - { - Eldbus_Message_Iter *st; - eldbus_message_iter_arguments_append(iter, "(ss)", &st); - eldbus_message_iter_arguments_append(st, "ss", "string1", "string2"); - eldbus_message_iter_container_close(iter, st); - } - return EINA_TRUE; -} - -static Eldbus_Message * -_properties_set(const Eldbus_Service_Interface *iface EINA_UNUSED, const char *propname, Eldbus_Message_Iter *iter, const Eldbus_Message *msg) -{ - char *type; - - type = eldbus_message_iter_signature_get(iter); - - if (!strcmp(propname, "int32")) - { - int num; - if (type[0] != 'i') - goto invalid_signature; - eldbus_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; - eldbus_message_iter_arguments_get(iter, "s", &txt); - printf("Resp2 was set to: %s, previously was: %s\n", txt, resp2); - free(resp2); - resp2 = strdup(txt); - } - free(type); - return eldbus_message_method_return_new(msg); - -invalid_signature: - free(type); - return eldbus_message_error_new(msg, "org.freedesktop.DBus.Error.InvalidSignature", - "Invalid type."); -} - -static const Eldbus_Method methods[] = { - { - "ReceiveArray", ELDBUS_ARGS({"as", "array_of_strings"}), - NULL, _receive_array - }, - { - "ReceiveArrayOfStringIntWithSize", - ELDBUS_ARGS({"i", "size_of_array"}, {"a(si)", "array"}), - NULL, _receive_array_of_string_int_with_size, 0 - }, - { - "SendVariantData", ELDBUS_ARGS({"v", "variant_data"}), - NULL, _send_variant - }, - { - "ReceiveVariantData", NULL, ELDBUS_ARGS({"v", "variant_data"}), - _receive_variant - }, - { - "SendArrayInt", NULL, - ELDBUS_ARGS({"ai", "array_of_int"}), _send_array_int, 0 - }, - { - "SendArray", NULL, ELDBUS_ARGS({"as", "array_string"}), - _send_array - }, - { - "PlusOne", ELDBUS_ARGS({"i", "integer"}), - ELDBUS_ARGS({"i", "integer_plus_one"}), _plus_one - }, - { - "DoubleContainner", ELDBUS_ARGS({"a(ii)", "array1"}, {"a(ii)", "array2"}), - NULL, _double_container - }, - { } -}; - -static const Eldbus_Property properties[] = { - { "Resp2", "s", NULL, _properties_set }, - { "text", "s" }, - { "int32", "i", NULL, _properties_set }, - { "st", "(ss)" }, - { } -}; - -static const Eldbus_Service_Interface_Desc iface_desc = { - IFACE, methods, NULL, properties, _properties_get -}; - -static Eina_Bool _emit_changed(void *data) -{ - Eldbus_Service_Interface *iface = data; - eldbus_service_property_changed(iface, "int32"); - eldbus_service_property_invalidate_set(iface, "Resp2", EINA_TRUE); - return ECORE_CALLBACK_RENEW; -} - -static void -on_name_request(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) -{ - unsigned int reply; - Eldbus_Service_Interface *iface = data; - - if (eldbus_message_error_get(msg, NULL, NULL)) - { - printf("error on on_name_request\n"); - return; - } - - if (!eldbus_message_arguments_get(msg, "u", &reply)) - { - printf("error geting arguments on on_name_request\n"); - return; - } - - if (reply != ELDBUS_NAME_REQUEST_REPLY_PRIMARY_OWNER) - { - printf("error name already in use\n"); - return; - } - - timer = ecore_timer_add(3, _emit_changed, iface); -} - -int -main(void) -{ - Eldbus_Connection *conn; - Eldbus_Service_Interface *iface; - - ecore_init(); - eldbus_init(); - - conn = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SESSION); - - resp2 = malloc(sizeof(char) * 5); - strcpy(resp2, "test"); - iface = eldbus_service_interface_register(conn, PATH, &iface_desc); - eldbus_name_request(conn, BUS, ELDBUS_NAME_REQUEST_FLAG_DO_NOT_QUEUE, - on_name_request, iface); - - ecore_main_loop_begin(); - - free(resp2); - ecore_timer_del(timer); - eldbus_connection_unref(conn); - - eldbus_shutdown(); - ecore_shutdown(); - return 0; -} diff --git a/src/examples/complex-types.c b/src/examples/complex-types.c deleted file mode 100644 index fc0063a..0000000 --- a/src/examples/complex-types.c +++ /dev/null @@ -1,284 +0,0 @@ -//Compile with: -// gcc -o complex-types complex-types.c `pkg-config --cflags --libs eldbus ecore` - -#include "Eldbus.h" -#include - -#define BUS "com.profusion" -#define PATH "/com/profusion/Test" -#define IFACE "com.profusion.Test" - -Eldbus_Connection *conn; - -static Eina_Bool -_timer1_cb(void *data EINA_UNUSED) -{ - printf("\nFishing...\n"); - ecore_main_loop_quit(); - return ECORE_CALLBACK_CANCEL; -} - -static void -on_plus_one(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) -{ - int num2 = 0; - - if (eldbus_message_error_get(msg, NULL, NULL)) - { - printf("Message error\n\n"); - return; - } - if (!eldbus_message_arguments_get(msg, "i", &num2)) - { - printf("Error getting arguments."); - return; - } - - printf("on_plus_one() %d\n", num2); -} - -static void -set_property_resp2(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) -{ - const char *errname; - const char *errmsg; - - printf("set_property_resp2()\n"); - if (eldbus_message_error_get(msg, &errname, &errmsg)) - { - printf("Message error %s - %s\n\n", errname, errmsg); - return; - } -} - -static void -get_property_resp2(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) -{ - Eldbus_Proxy *proxy = data; - Eldbus_Message_Iter *variant = NULL; - char *type; - char *resp2; - const char *errname; - const char *errmsg; - - printf("get_property_resp2()\n"); - if (eldbus_message_error_get(msg, &errname, &errmsg)) - { - printf("Message error %s - %s\n\n", errname, errmsg); - return; - } - if (!eldbus_message_arguments_get(msg, "v", &variant)) - { - printf("Error getting arguments."); - return; - } - - type = eldbus_message_iter_signature_get(variant); - if (type[1]) - { - printf("It is a complex type, not handle yet.\n\n"); - return; - } - if (type[0] != 's') - { - printf("Expected type is string.\n\n"); - return; - } - if (!eldbus_message_iter_arguments_get(variant, "s", &resp2)) - { - printf("error in eldbus_message_iter_arguments_get()\n\n"); - return; - } - printf("resp2=%s\n", resp2); - free(type); - - eldbus_proxy_property_set(proxy, "Resp2", "s", &"lalala", set_property_resp2, NULL); - eldbus_proxy_property_set(proxy, "int32", "i", (void*)(intptr_t)99, set_property_resp2, NULL); -} - -static void -on_send_array_int(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) -{ - Eldbus_Message_Iter *array = NULL; - int num; - - printf("on_send_array_int()\n"); - if (eldbus_message_error_get(msg, NULL, NULL)) - { - printf("Message error\n\n"); - return; - } - if (!eldbus_message_arguments_get(msg, "ai", &array)) - { - printf("Error getting arguments."); - return; - } - - while (eldbus_message_iter_get_and_next(array, 'i', &num)) - { - printf("%d\n", num); - } -} - -static void -on_send_array(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) -{ - Eldbus_Message_Iter *array = NULL; - char *txt = NULL; - char *string[10]; - int i = 0; - int z; - - printf("on_send_array()\n"); - if (eldbus_message_error_get(msg, NULL, NULL)) - { - printf("Message error\n\n"); - return; - } - if (!eldbus_message_arguments_get(msg, "as", &array)) - { - printf("Error getting arguments."); - return; - } - - while (eldbus_message_iter_get_and_next(array, 's', &txt)) - { - string[i] = txt; - i++; - } - - for (z = 0; z < i; z++) - printf("string = %s\n", string[z]); -} - -static void -on_receive_array_with_size(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) -{ - const char *errname; - const char *errmsg; - - printf("on_receive_array_with_size()\n"); - if (eldbus_message_error_get(msg, &errname, &errmsg)) - { - fprintf(stderr, "Error: %s %s\n", errname, errmsg); - } -} - -static void -on_send_variant(void *data EINA_UNUSED, const Eldbus_Message *msg EINA_UNUSED, Eldbus_Pending *pending EINA_UNUSED) -{ - printf("on_send_variant()\n\n"); -} - -static void -on_receive_array(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) -{ - const char *errname; - const char *errmsg; - - printf("on_receive_array()\n"); - if (eldbus_message_error_get(msg, &errname, &errmsg)) - { - fprintf(stderr, "Error: %s %s\n", errname, errmsg); - } -} - -int -main(void) -{ - Eldbus_Object *test2_obj; - Eldbus_Proxy *test2_proxy; - Eldbus_Pending *pending; - Eldbus_Message_Iter *iter, *array_of_string, *variant; - Eldbus_Message_Iter *array_itr, *structure; - Eldbus_Message *msg; - int size_of_array = 5; - const char *array[5] = { "aaaa", "bbbb", "cccc", "dddd", "eeee" }; - int i; - int plus_one = 24; - - ecore_init(); - eldbus_init(); - - conn = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SESSION); - - test2_obj = eldbus_object_get(conn, BUS, PATH); - test2_proxy = eldbus_proxy_get(test2_obj, IFACE); - - msg = eldbus_proxy_method_call_new(test2_proxy, "ReceiveArray"); - iter = eldbus_message_iter_get(msg); - array_of_string = eldbus_message_iter_container_new(iter, 'a',"s"); - if (!array_of_string) printf("array_of_string == NULL\n\n"); - for (i = 0; i < 5; i++) - eldbus_message_iter_basic_append(array_of_string, 's', array[i]); - eldbus_message_iter_container_close(iter, array_of_string); - pending = eldbus_proxy_send(test2_proxy, msg, on_receive_array, NULL, -1); - if (!pending) printf("Error in eldbus_proxy_send()\n\n"); - - msg = eldbus_proxy_method_call_new(test2_proxy, "ReceiveArrayOfStringIntWithSize"); - iter = eldbus_message_iter_get(msg); - if (!eldbus_message_iter_arguments_append(iter, "ia(si)", size_of_array, &array_of_string)) - printf("error on eldbus_massage_iterator_arguments_set()\n\n"); - for (i = 0; i < size_of_array; i++) - { - Eldbus_Message_Iter *struct_of_si; - eldbus_message_iter_arguments_append(array_of_string, "(si)", &struct_of_si); - eldbus_message_iter_arguments_append(struct_of_si, "si", array[i], i); - eldbus_message_iter_container_close(array_of_string, struct_of_si); - } - eldbus_message_iter_container_close(iter, array_of_string); - pending = eldbus_proxy_send(test2_proxy, msg, on_receive_array_with_size, NULL, -1); - - msg = eldbus_proxy_method_call_new(test2_proxy, "SendVariantData"); - iter = eldbus_message_iter_get(msg); - variant = eldbus_message_iter_container_new(iter, 'v', "s"); - eldbus_message_iter_basic_append(variant, 's', "test"); - eldbus_message_iter_container_close(iter, variant); - pending = eldbus_proxy_send(test2_proxy, msg, on_send_variant, NULL, -1); - - msg = eldbus_proxy_method_call_new(test2_proxy, "DoubleContainner"); - iter = eldbus_message_iter_get(msg); - /** - * eldbus_message_iterator_arguments_set(itr, "a(ii)a(ii)", &array_itr, &array_itr2); - * this will cause a error, we could not open another container until - * we close the first one - */ - eldbus_message_iter_arguments_append(iter, "a(ii)", &array_itr); - for (i = 0; i < 5; i++) - { - eldbus_message_iter_arguments_append(array_itr, "(ii)", &structure); - eldbus_message_iter_arguments_append(structure, "ii", i, i*i); - eldbus_message_iter_container_close(array_itr, structure); - } - eldbus_message_iter_container_close(iter, array_itr); - eldbus_message_iter_arguments_append(iter, "a(ii)", &array_itr); - for (i = 0; i < 7; i++) - { - eldbus_message_iter_arguments_append(array_itr, "(ii)", &structure); - eldbus_message_iter_arguments_append(structure, "ii", i, i*i*i); - eldbus_message_iter_container_close(array_itr, structure); - } - eldbus_message_iter_container_close(iter, array_itr); - eldbus_proxy_send(test2_proxy, msg, NULL, NULL, -1); - - pending = eldbus_proxy_call(test2_proxy, "SendArrayInt", on_send_array_int, NULL, - -1 , ""); - - pending = eldbus_proxy_call(test2_proxy, "SendArray", on_send_array, NULL, - -1 , ""); - - pending = eldbus_proxy_call(test2_proxy, "PlusOne", on_plus_one, NULL, - -1 , "i", plus_one); - - pending = eldbus_proxy_property_get(test2_proxy, "Resp2", get_property_resp2, test2_proxy); - - ecore_timer_add(10, _timer1_cb, NULL); - - ecore_main_loop_begin(); - - eldbus_connection_unref(conn); - - eldbus_shutdown(); - ecore_shutdown(); - return 0; -} diff --git a/src/examples/connect-address.c b/src/examples/connect-address.c deleted file mode 100644 index 242960e..0000000 --- a/src/examples/connect-address.c +++ /dev/null @@ -1,274 +0,0 @@ -/* - * compile with: - * gcc -o client client.c `pkg-config --cflags --libs eldbus ecore eina` - * - * This simple example connects to an IBus daemon running on the machine. - * IBus daemon is a dbus daemon running apart from system or session buses. - * - * Requires ibus-daemon to be running, for instance: - * $ ibus-daemon -v -r -s - * - * After starting ibus-daemon, check for its address on the file located on - * ~/.config/ibus/bus/ directory. For instance: - * - * $ cat ~/.config/ibus/bus/809ee018614317e782464b8900000029-unix-0 - * # This file is created by ibus-daemon, please do not modify it - * IBUS_ADDRESS=unix:abstract=/tmp/dbus-VOJaWARY,guid=e0082807a08a81ad22e0d3f551d48d5e - * IBUS_DAEMON_PID=3697 - * - * Export or set the IBUS_ADDRESS environment variable and run this program. To exit, - * just hit ctrl+c - */ - -#include - -#define _GNU_SOURCE -#include - -#include "Eldbus.h" -#include - -#define IBUS_BUS "org.freedesktop.IBus" -#define PANEL_BUS "org.freedesktop.IBUS.Panel" -#define PANEL_INTERFACE "org.freedesktop.IBUS.Panel" - -static int _conn_addr_log_dom = -1; -#define DBG(...) EINA_LOG_DOM_DBG(_conn_addr_log_dom, __VA_ARGS__) -#define INF(...) EINA_LOG_DOM_INFO(_conn_addr_log_dom, __VA_ARGS__) -#define ERR(...) EINA_LOG_DOM_ERR(_conn_addr_log_dom, __VA_ARGS__) - -static Eldbus_Connection *conn; -static Eldbus_Signal_Handler *acquired; -static Eldbus_Signal_Handler *lost; - -static void -on_name_owner_changed(void *data EINA_UNUSED, const char *bus, const char *old_id, const char *new_id EINA_UNUSED) -{ - INF("Name owner changed: bus=%s | old=%s | new=%s\n", bus, old_id, new_id); -} - -static void -on_name_acquired(void *data EINA_UNUSED, const Eldbus_Message *msg) -{ - const char *error, *error_msg, *name; - - if (eldbus_message_error_get(msg, &error, &error_msg)) - { - ERR("Name acquired message error: %s: %s\n", error, error_msg); - return; - } - - if (!eldbus_message_arguments_get(msg, "s", &name)) - { - ERR("Error reading message arguments"); - return; - } - - INF("Name acquired: %s", name); -} - -static void -on_name_lost(void *data EINA_UNUSED, const Eldbus_Message *msg) -{ - const char *error, *error_msg, *name; - - if (eldbus_message_error_get(msg, &error, &error_msg)) - { - ERR("Name lost message error: %s: %s\n", error, error_msg); - return; - } - - if (!eldbus_message_arguments_get(msg, "s", &name)) - { - ERR("Error reading message arguments"); - return; - } - - INF("Name lost: %s", name); -} - -static void -name_request_cb(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) -{ - const char *error, *error_msg; - unsigned int reply; - - if (eldbus_message_error_get(msg, &error, &error_msg)) - { - ERR("Name request message error: %s: %s\n", error, error_msg); - return; - } - - if (!eldbus_message_arguments_get(msg, "u", &reply)) - { - ERR("Error reading message arguments"); - return; - } - - switch (reply) - { - case ELDBUS_NAME_REQUEST_REPLY_PRIMARY_OWNER: - INF("Got primary ownership"); - break; - case ELDBUS_NAME_REQUEST_REPLY_IN_QUEUE: - INF("Got queued for ownership"); - break; - case ELDBUS_NAME_REQUEST_REPLY_EXISTS: - INF("Already in queue for ownership"); - break; - case ELDBUS_NAME_REQUEST_REPLY_ALREADY_OWNER: - INF("Already primary owner"); - break; - default: - ERR("Unexpected reply: %d", reply); - break; - } -} - -static Eina_Bool -main_loop_quit_idler(void *data EINA_UNUSED) -{ - eldbus_signal_handler_del(acquired); - eldbus_signal_handler_del(lost); - eldbus_connection_unref(conn); - - INF("Finishing"); - ecore_main_loop_quit(); - return ECORE_CALLBACK_CANCEL; -} - -static void -name_release_cb(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) -{ - const char *error, *error_msg; - unsigned int reply; - - if (eldbus_message_error_get(msg, &error, &error_msg)) - { - ERR("Name release message error: %s: %s\n", error, error_msg); - return; - } - - if (!eldbus_message_arguments_get(msg, "u", &reply)) - { - ERR("Error reading message arguments"); - return; - } - - switch (reply) - { - case ELDBUS_NAME_RELEASE_REPLY_RELEASED: - INF("Name released"); - break; - case ELDBUS_NAME_RELEASE_REPLY_NON_EXISTENT: - INF("Name non existent"); - break; - case ELDBUS_NAME_RELEASE_REPLY_NOT_OWNER: - INF("Not owner"); - break; - default: - ERR("Unexpected reply: %d", reply); - break; - } - - ecore_idler_add(main_loop_quit_idler, NULL); -} - -static void -finish(int foo EINA_UNUSED) -{ - eldbus_name_release(conn, PANEL_BUS, name_release_cb, NULL); -} - -int -main(int argc EINA_UNUSED, char *argv[] EINA_UNUSED) -{ - const char *address; - - /* Init */ - if (!eina_init()) - { - EINA_LOG_ERR("Failed to initialize Eina"); - return 1; - } - - _conn_addr_log_dom = eina_log_domain_register("connect_address", EINA_COLOR_CYAN); - - if (_conn_addr_log_dom < 0) - { - EINA_LOG_ERR("Unable to create 'client' log domain"); - goto exit_eina; - } - - if (!(address = getenv("IBUS_ADDRESS"))) - { - ERR("IBUS_ADDRESS environment variable must be set"); - goto exit_eina; - } - - if (!ecore_init()) - { - EINA_LOG_ERR("Failed to initialize Ecore"); - goto exit_eina; - } - - if (!eldbus_init()) - { - EINA_LOG_ERR("Failed to initialize Eldbus"); - goto exit_ecore; - } - - signal(SIGTERM, finish); - signal(SIGINT, finish); - - /* Connect */ - printf("Connecting to IBus with address: %s\n", address); - conn = eldbus_address_connection_get(address); - - if (!conn) - { - ERR("Failed to get dbus connection with address '%s'\n", address); - goto end; - } - - eldbus_name_owner_changed_callback_add(conn, IBUS_BUS, on_name_owner_changed, - conn, EINA_TRUE); - - eldbus_name_owner_changed_callback_add(conn, PANEL_BUS, on_name_owner_changed, - conn, EINA_TRUE); - - acquired = eldbus_signal_handler_add(conn, - ELDBUS_FDO_BUS, - ELDBUS_FDO_PATH, - PANEL_INTERFACE, - "NameAcquired", - on_name_acquired, - NULL); - - lost = eldbus_signal_handler_add(conn, - ELDBUS_FDO_BUS, - ELDBUS_FDO_PATH, - PANEL_INTERFACE, - "NameLost", - on_name_lost, - NULL); - - /* Request ownership of PANEL_BUS */ - eldbus_name_request(conn, PANEL_BUS, - ELDBUS_NAME_REQUEST_FLAG_REPLACE_EXISTING | ELDBUS_NAME_REQUEST_FLAG_ALLOW_REPLACEMENT, - name_request_cb, NULL); - - ecore_main_loop_begin(); - -end: - eldbus_shutdown(); - -exit_ecore: - ecore_shutdown(); - eina_log_domain_unregister(_conn_addr_log_dom); - -exit_eina: - eina_shutdown(); - - return 0; -} diff --git a/src/examples/connman-list-services.c b/src/examples/connman-list-services.c index 2e98097..aabcb8f 100644 --- a/src/examples/connman-list-services.c +++ b/src/examples/connman-list-services.c @@ -1,11 +1,8 @@ -//Compile with: -// gcc -o connman-list-services connman-list-services.c `pkg-config --cflags --libs eldbus ecore` - #include "Eldbus.h" #include static void -on_services_get(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) +on_services_get(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending) { Eldbus_Message_Iter *array, *entry; const char *errname, *errmsg; diff --git a/src/examples/ofono-dial.c b/src/examples/ofono-dial.c index a672102..9fc68c4 100644 --- a/src/examples/ofono-dial.c +++ b/src/examples/ofono-dial.c @@ -1,11 +1,8 @@ -//Compile with: -// gcc -o ofono-dial ofono-dial.c `pkg-config --cflags --libs eldbus ecore` - #include "Eldbus.h" #include static void -on_dial(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) +on_dial(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending) { const char *errname, *errmsg; const char *call_path; diff --git a/src/examples/server.c b/src/examples/server.c index 532ce42..3190ab7 100644 --- a/src/examples/server.c +++ b/src/examples/server.c @@ -1,6 +1,3 @@ -//Compile with: -// gcc -o server server.c `pkg-config --cflags --libs eldbus ecore` - #include "Eldbus.h" #include @@ -12,7 +9,7 @@ static Eldbus_Connection *conn; static Eldbus_Message * -_hello(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *message) +_hello(const Eldbus_Service_Interface *iface, const Eldbus_Message *message) { Eldbus_Message *reply = eldbus_message_method_return_new(message); eldbus_message_arguments_append(reply, "s", "Hello World"); @@ -21,7 +18,7 @@ _hello(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message * } static Eldbus_Message * -_quit(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *message) +_quit(const Eldbus_Service_Interface *iface, const Eldbus_Message *message) { printf("Quit\n"); ecore_main_loop_quit(); @@ -51,7 +48,7 @@ send_signal_hello(void *data) } static Eldbus_Message * -_send_bool(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg) +_send_bool(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg) { Eldbus_Message *reply = eldbus_message_method_return_new(msg); Eina_Bool bool; @@ -62,7 +59,7 @@ _send_bool(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Messa } static Eldbus_Message * -_send_byte(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg) +_send_byte(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg) { Eldbus_Message *reply = eldbus_message_method_return_new(msg); unsigned char byte; @@ -73,7 +70,7 @@ _send_byte(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Messa } static Eldbus_Message * -_send_uint32(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg) +_send_uint32(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg) { Eldbus_Message *reply = eldbus_message_method_return_new(msg); unsigned int uint32; @@ -84,7 +81,7 @@ _send_uint32(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Mes } static Eldbus_Message * -_send_int32(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg) +_send_int32(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg) { Eldbus_Message *reply = eldbus_message_method_return_new(msg); int int32; @@ -95,7 +92,7 @@ _send_int32(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Mess } static Eldbus_Message * -_send_int16(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg) +_send_int16(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg) { Eldbus_Message *reply = eldbus_message_method_return_new(msg); short int int16; @@ -106,7 +103,7 @@ _send_int16(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Mess } static Eldbus_Message * -_send_double(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg) +_send_double(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg) { Eldbus_Message *reply = eldbus_message_method_return_new(msg); double d; @@ -117,7 +114,7 @@ _send_double(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Mes } static Eldbus_Message * -_send_string(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg) +_send_string(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg) { Eldbus_Message *reply = eldbus_message_method_return_new(msg); const char *txt; @@ -133,11 +130,12 @@ _resp_async(void *data) Eldbus_Message *msg = data; eldbus_message_arguments_append(msg, "s", "Async test ok"); eldbus_connection_send(conn, msg, NULL, NULL, -1); + eldbus_message_unref(msg); return ECORE_CALLBACK_CANCEL; } static Eldbus_Message * -_async_test(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg) +_async_test(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg) { Eldbus_Message *reply = eldbus_message_method_return_new(msg); printf("Received a call to AsyncTest.\n"); @@ -193,7 +191,7 @@ static const Eldbus_Service_Interface_Desc iface_desc = { }; static void -on_name_request(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) +on_name_request(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending) { Eldbus_Service_Interface *iface; unsigned int reply; diff --git a/src/examples/simple-signal-emit.c b/src/examples/simple-signal-emit.c index 8b0bf89..6f2ca55 100644 --- a/src/examples/simple-signal-emit.c +++ b/src/examples/simple-signal-emit.c @@ -1,6 +1,3 @@ -//Compile with: -// gcc -o simple-signal-emit simple-signal-emit.c `pkg-config --cflags --libs eldbus` - #include enum { diff --git a/src/lib/eldbus_connection.h b/src/lib/eldbus_connection.h index c8a4832..8fd8136 100644 --- a/src/lib/eldbus_connection.h +++ b/src/lib/eldbus_connection.h @@ -13,7 +13,6 @@ typedef enum ELDBUS_CONNECTION_TYPE_SESSION, ELDBUS_CONNECTION_TYPE_SYSTEM, ELDBUS_CONNECTION_TYPE_STARTER, - ELDBUS_CONNECTION_TYPE_ADDRESS, ELDBUS_CONNECTION_TYPE_LAST /**< sentinel, not a real type */ } Eldbus_Connection_Type; @@ -45,29 +44,6 @@ EAPI Eldbus_Connection *eldbus_connection_get(Eldbus_Connection_Type type); EAPI Eldbus_Connection *eldbus_private_connection_get(Eldbus_Connection_Type type); /** - * Establish a connection to bus and integrate it with the ecore main - * loop. If a connection of given type was already created before, its - * reference counter is incremented and the connection is returned. - * - * @param address the address which will be passed to dbus_connection_open() - * - * @return connection with bus - */ -EAPI Eldbus_Connection *eldbus_address_connection_get(const char *address) EINA_ARG_NONNULL(1); - -/** - * Always create and establish a new connection to bus and integrate it with - * the ecore main loop. Differently from eldbus_connection_get(), this function - * guarantees to create a new connection to the D-Bus daemon and the connection - * is not shared by any means. - * - * @param address the address which will be passed to dbus_connection_open_private() - * - * @return connection with bus - */ -EAPI Eldbus_Connection *eldbus_private_address_connection_get(const char *address) EINA_ARG_NONNULL(1); - -/** * @brief Increment connection reference count. * * @param conn The given Eldbus_Connection object to reference diff --git a/src/lib/eldbus_core.c b/src/lib/eldbus_core.c index bd73659..c2b3b57 100644 --- a/src/lib/eldbus_core.c +++ b/src/lib/eldbus_core.c @@ -76,13 +76,11 @@ int _eldbus_log_dom = -1; /* We don't save ELDBUS_CONNECTION_TYPE_UNKNOWN in here so we need room for * last - 1 elements */ -static void *shared_connections[ELDBUS_CONNECTION_TYPE_LAST - 1]; -static Eina_Hash *address_connections = NULL; +static Eldbus_Connection *shared_connections[ELDBUS_CONNECTION_TYPE_LAST - 1]; static void _eldbus_connection_event_callback_call(Eldbus_Connection *conn, Eldbus_Connection_Event_Type type, const void *event_info); static void _eldbus_connection_context_event_cb_del(Eldbus_Connection_Context_Event *ce, Eldbus_Connection_Context_Event_Cb *ctx); static void eldbus_dispatch_name_owner_change(Eldbus_Connection_Name *cn, const char *old_id); -static void _eldbus_connection_free(Eldbus_Connection *conn); EAPI int eldbus_init(void) @@ -217,25 +215,6 @@ eldbus_shutdown(void) CRITICAL("Alive TYPE_STARTER connection"); print_live_connection(shared_connections[ELDBUS_CONNECTION_TYPE_STARTER - 1]); } - if (shared_connections[ELDBUS_CONNECTION_TYPE_ADDRESS - 1]) - { - if (eina_hash_population(address_connections)) - { - Eina_Iterator *it; - Eina_Hash_Tuple *tuple; - - it = eina_hash_iterator_tuple_new(address_connections); - EINA_ITERATOR_FOREACH(it, tuple) - { - CRITICAL("Alive TYPE_ADDRESS connection: %s", (char*)tuple->key); - print_live_connection(tuple->data); - } - eina_iterator_free(it); - } - - eina_hash_free(address_connections); - address_connections = shared_connections[ELDBUS_CONNECTION_TYPE_ADDRESS - 1] = NULL; - } eldbus_service_shutdown(); eldbus_proxy_shutdown(); @@ -656,15 +635,8 @@ cb_watch_toggle(DBusWatch *watch, void *data EINA_UNUSED) hd->enabled = dbus_watch_get_enabled(watch); DBG("watch %p is %sabled", hd, hd->enabled ? "en" : "dis"); - if (hd->enabled) - { - eldbus_fd_handler_add(hd); - } - else - { - ecore_main_fd_handler_del(hd->fd_handler); - hd->fd_handler = NULL; - } + if (hd->enabled) eldbus_fd_handler_add(hd); + else ecore_main_fd_handler_del(hd->fd_handler); } static void @@ -758,20 +730,21 @@ eldbus_idler(void *data) Eldbus_Connection *conn = data; DBG("Connection@%p: Dispatch status: %d", conn, - dbus_connection_get_dispatch_status(conn->dbus_conn)); + dbus_connection_get_dispatch_status(conn->dbus_conn)); - if (dbus_connection_get_dispatch_status(conn->dbus_conn) == - DBUS_DISPATCH_COMPLETE) + if (DBUS_DISPATCH_COMPLETE == + dbus_connection_get_dispatch_status(conn->dbus_conn)) { DBG("Connection@%p: Dispatch complete, idler@%p finishing", - conn, conn->idler); + conn, conn->idler); conn->idler = NULL; return ECORE_CALLBACK_CANCEL; } + + dbus_connection_ref(conn->dbus_conn); DBG("Connection@%p: Dispatching", conn); - eldbus_connection_ref(conn); dbus_connection_dispatch(conn->dbus_conn); - eldbus_connection_unref(conn); + dbus_connection_unref(conn->dbus_conn); return ECORE_CALLBACK_RENEW; } @@ -780,24 +753,18 @@ cb_dispatch_status(DBusConnection *dbus_conn EINA_UNUSED, DBusDispatchStatus new { Eldbus_Connection *conn = data; - if (!conn->refcount) - { - DBG("Connection[%p] being freed, dispatch blocked", conn); - return; - } - DBG("Connection@%p: Dispatch status: %d", conn, new_status); if ((new_status == DBUS_DISPATCH_DATA_REMAINS) && (!conn->idler)) { conn->idler = ecore_idler_add(eldbus_idler, conn); DBG("Connection@%p: Adding idler@%p to handle remaining dispatch data", - conn, conn->idler); + conn, conn->idler); } else if ((new_status != DBUS_DISPATCH_DATA_REMAINS) && (conn->idler)) { DBG("Connection@%p: No remaining dispatch data, clearing idler@%p", - conn, conn->idler); + conn, conn->idler); ecore_idler_del(conn->idler); conn->idler = NULL; @@ -972,9 +939,8 @@ _disconnected(void *data, const Eldbus_Message *msg EINA_UNUSED) conn, ELDBUS_CONNECTION_EVENT_DISCONNECTED, NULL); } -/* Param address is only used for ELDBUS_CONNECTION_TYPE_ADDRESS type */ static Eldbus_Connection * -_connection_get(Eldbus_Connection_Type type, const char *address) +_connection_get(Eldbus_Connection_Type type) { Eldbus_Connection *conn; DBusError err; @@ -982,44 +948,27 @@ _connection_get(Eldbus_Connection_Type type, const char *address) EINA_SAFETY_ON_FALSE_RETURN_VAL((type < ELDBUS_CONNECTION_TYPE_LAST) && (type > ELDBUS_CONNECTION_TYPE_UNKNOWN), NULL); - EINA_SAFETY_ON_TRUE_RETURN_VAL((type == ELDBUS_CONNECTION_TYPE_ADDRESS) && - (address == NULL), NULL); conn = calloc(1, sizeof(Eldbus_Connection)); EINA_SAFETY_ON_NULL_RETURN_VAL(conn, NULL); dbus_error_init(&err); - if (type == ELDBUS_CONNECTION_TYPE_ADDRESS) - conn->dbus_conn = dbus_connection_open_private(address, &err); - else - conn->dbus_conn = dbus_bus_get_private(type - 1, &err); - - if (!conn->dbus_conn || dbus_error_is_set(&err)) + conn->dbus_conn = dbus_bus_get_private(type - 1, &err); + if (dbus_error_is_set(&err)) { free(conn); ERR("Error connecting to bus: %s", err.message); return NULL; } - if (type == ELDBUS_CONNECTION_TYPE_ADDRESS && - !dbus_bus_register(conn->dbus_conn, &err)) - { - dbus_connection_close(conn->dbus_conn); - dbus_connection_unref(conn->dbus_conn); - conn->dbus_conn = NULL; - free(conn); - ERR("Error registering with bus: %s", err.message); - return NULL; - } - + eldbus_connection_setup(conn); conn->type = type; conn->refcount = 1; EINA_MAGIC_SET(conn, ELDBUS_CONNECTION_MAGIC); conn->names = eina_hash_string_superfast_new(NULL); - eldbus_connection_setup(conn); eldbus_signal_handler_add(conn, NULL, DBUS_PATH_LOCAL, DBUS_INTERFACE_LOCAL, - "Disconnected", _disconnected, conn); + "Disconnected", _disconnected, conn); obj = eldbus_object_get(conn, ELDBUS_FDO_BUS, ELDBUS_FDO_PATH); conn->fdo_proxy = eldbus_proxy_get(obj, ELDBUS_FDO_INTERFACE); @@ -1030,8 +979,7 @@ _connection_get(Eldbus_Connection_Type type, const char *address) EAPI Eldbus_Connection * eldbus_private_connection_get(Eldbus_Connection_Type type) { - DBG("Getting private connection with type %d", type); - return _connection_get(type, NULL); + return _connection_get(type); } EAPI Eldbus_Connection * @@ -1044,13 +992,7 @@ eldbus_connection_get(Eldbus_Connection_Type type) if (!type) return NULL; - if (type == ELDBUS_CONNECTION_TYPE_ADDRESS) - { - ERR("CONNECTION_TYPE_ADDRESS must be used with appropriate address_connection_get() function"); - return NULL; - } - - conn = (Eldbus_Connection *) shared_connections[type - 1]; + conn = shared_connections[type - 1]; if (conn) { DBG("Connection with type %d exists at %p; reffing and returning", @@ -1058,7 +1000,7 @@ eldbus_connection_get(Eldbus_Connection_Type type) return eldbus_connection_ref(conn); } - conn = _connection_get(type, NULL); + conn = _connection_get(type); EINA_SAFETY_ON_NULL_RETURN_VAL(conn, NULL); shared_connections[type - 1] = conn; @@ -1066,44 +1008,6 @@ eldbus_connection_get(Eldbus_Connection_Type type) } EAPI Eldbus_Connection * -eldbus_address_connection_get(const char *address) -{ - Eldbus_Connection *conn = NULL; - - DBG("Getting connection with address %s", address); - - if (address_connections == NULL) - { - address_connections = eina_hash_string_small_new(NULL); - shared_connections[ELDBUS_CONNECTION_TYPE_ADDRESS - 1] = address_connections; - } - else - { - conn = (Eldbus_Connection *) eina_hash_find(address_connections, address); - } - - if (conn != NULL) - { - DBG("Connection with address %s exists at %p; reffing and returning", - address, conn); - return eldbus_connection_ref(conn); - } - - conn = _connection_get(ELDBUS_CONNECTION_TYPE_ADDRESS, address); - EINA_SAFETY_ON_NULL_RETURN_VAL(conn, NULL); - eina_hash_add(address_connections, address, conn); - - return conn; -} - -EAPI Eldbus_Connection * -eldbus_private_address_connection_get(const char *address) -{ - DBG("Getting private connection with address %s", address); - return _connection_get(ELDBUS_CONNECTION_TYPE_ADDRESS, address); -} - -EAPI Eldbus_Connection * eldbus_connection_ref(Eldbus_Connection *conn) { ELDBUS_CONNECTION_CHECK_RETVAL(conn, NULL); @@ -1113,7 +1017,7 @@ eldbus_connection_ref(Eldbus_Connection *conn) } static void -_eldbus_connection_free(Eldbus_Connection *conn) +_eldbus_connection_unref(Eldbus_Connection *conn) { unsigned int i; Eldbus_Handler_Data *fd_handler; @@ -1126,6 +1030,11 @@ _eldbus_connection_free(Eldbus_Connection *conn) Eina_Array *cns; const char *name; + DBG("Connection %p: unref (currently at %d refs)", + conn, conn->refcount); + + if (--conn->refcount > 0) return; + DBG("Freeing connection %p", conn); _eldbus_connection_event_callback_call @@ -1203,7 +1112,6 @@ _eldbus_connection_free(Eldbus_Connection *conn) } EINA_MAGIC_SET(conn, EINA_MAGIC_NONE); - //will trigger a cb_dispatch_status() dbus_connection_close(conn->dbus_conn); dbus_connection_unref(conn->dbus_conn); conn->dbus_conn = NULL; @@ -1217,13 +1125,8 @@ _eldbus_connection_free(Eldbus_Connection *conn) eldbus_data_del_all(&conn->data); if (conn->idler) ecore_idler_del(conn->idler); - if (conn->type) - { - if (conn->type == ELDBUS_CONNECTION_TYPE_ADDRESS) - eina_hash_del_by_data(address_connections, conn); - else if (shared_connections[conn->type - 1] == (void *) conn) - shared_connections[conn->type - 1] = NULL; - } + if (conn->type && (shared_connections[conn->type - 1] == conn)) + shared_connections[conn->type - 1] = NULL; free(conn); } @@ -1233,9 +1136,7 @@ eldbus_connection_unref(Eldbus_Connection *conn) { ELDBUS_CONNECTION_CHECK(conn); DBG("conn=%p, pre-refcount=%d", conn, conn->refcount); - if (--conn->refcount > 0) - return; - _eldbus_connection_free(conn); + _eldbus_connection_unref(conn); } EAPI void diff --git a/src/lib/eldbus_freedesktop.c b/src/lib/eldbus_freedesktop.c index 2862753..e9b4dfd 100644 --- a/src/lib/eldbus_freedesktop.c +++ b/src/lib/eldbus_freedesktop.c @@ -80,11 +80,3 @@ eldbus_object_managed_objects_get(Eldbus_Object *obj, Eldbus_Message_Cb cb, cons p = eldbus_object_send(obj, msg, cb, data, -1); return p; } - -EAPI Eldbus_Pending * -eldbus_hello(Eldbus_Connection *conn, Eldbus_Message_Cb cb, const void *cb_data) -{ - EINA_SAFETY_ON_NULL_RETURN_VAL(conn, NULL); - - return eldbus_proxy_call(conn->fdo_proxy, "Hello", cb, cb_data, -1, ""); -} diff --git a/src/lib/eldbus_freedesktop.h b/src/lib/eldbus_freedesktop.h index 46406e6..e3903ef 100644 --- a/src/lib/eldbus_freedesktop.h +++ b/src/lib/eldbus_freedesktop.h @@ -29,7 +29,6 @@ EAPI Eldbus_Pending *eldbus_name_owner_get(Eldbus_Connection *conn, const char * EAPI Eldbus_Pending *eldbus_name_owner_has(Eldbus_Connection *conn, const char *bus, Eldbus_Message_Cb cb, const void *cb_data); EAPI Eldbus_Pending *eldbus_names_list(Eldbus_Connection *conn, Eldbus_Message_Cb cb, const void *cb_data) EINA_ARG_NONNULL(1); EAPI Eldbus_Pending *eldbus_names_activatable_list(Eldbus_Connection *conn, Eldbus_Message_Cb cb, const void *cb_data) EINA_ARG_NONNULL(1); -EAPI Eldbus_Pending *eldbus_hello(Eldbus_Connection *conn, Eldbus_Message_Cb cb, const void *cb_data) EINA_ARG_NONNULL(1); /* Replies to service starts */ #define ELDBUS_NAME_START_REPLY_SUCCESS 1 /**< Service was auto started */ diff --git a/src/lib/eldbus_message.c b/src/lib/eldbus_message.c index 1d1eeb8..85fbe56 100644 --- a/src/lib/eldbus_message.c +++ b/src/lib/eldbus_message.c @@ -548,16 +548,6 @@ eldbus_message_iter_basic_append(Eldbus_Message_Iter *iter, int type, ...) return r; } -EAPI Eina_Bool -eldbus_message_iter_fixed_array_append(Eldbus_Message_Iter *iter, int type, const void *array, unsigned int size) -{ - ELDBUS_MESSAGE_ITERATOR_CHECK_RETVAL(iter, EINA_FALSE); - EINA_SAFETY_ON_NULL_RETURN_VAL(array, EINA_FALSE); - EINA_SAFETY_ON_FALSE_RETURN_VAL(iter->writable, EINA_FALSE); - EINA_SAFETY_ON_FALSE_RETURN_VAL(dbus_type_is_basic(type), EINA_FALSE); - return dbus_message_iter_append_fixed_array(&iter->dbus_iterator, type, &array, (int)size); -} - EAPI void eldbus_message_iter_basic_get(Eldbus_Message_Iter *iter, void *value) { @@ -826,7 +816,12 @@ eldbus_message_error_new(const Eldbus_Message *msg, const char *error_name, cons reply->dbus_msg = dbus_message_new_error(msg->dbus_msg, error_name, error_msg); - dbus_message_iter_init(reply->dbus_msg, &reply->iterator->dbus_iterator); + /* + * Technically user should not append more arguments in an error message but + * we can't leave its iter as NULL. + */ + dbus_message_iter_init_append(reply->dbus_msg, + &reply->iterator->dbus_iterator); return reply; } diff --git a/src/lib/eldbus_message.h b/src/lib/eldbus_message.h index 39bc41e..4c174cb 100644 --- a/src/lib/eldbus_message.h +++ b/src/lib/eldbus_message.h @@ -213,17 +213,6 @@ EAPI Eina_Bool eldbus_message_iter_arguments_append(Eldbus_Message */ EAPI Eina_Bool eldbus_message_iter_arguments_vappend(Eldbus_Message_Iter *iter, const char *signature, va_list ap) EINA_ARG_NONNULL(1, 2, 3); - -/** - * Append a array of basic type with fixed size to Eldbus_Message_Iter. - * - * @param iter iterator - * @param type basic type that will be appended - * @param array data to append - * @param size of array - */ -EAPI Eina_Bool eldbus_message_iter_fixed_array_append(Eldbus_Message_Iter *iter, int type, const void *array, unsigned int size) EINA_ARG_NONNULL(1, 3); - /** * @brief Closes a container-typed value appended to the message. * diff --git a/src/lib/eldbus_pending.c b/src/lib/eldbus_pending.c index 4174ac1..7740901 100644 --- a/src/lib/eldbus_pending.c +++ b/src/lib/eldbus_pending.c @@ -128,7 +128,7 @@ _eldbus_connection_send(Eldbus_Connection *conn, Eldbus_Message *msg, Eldbus_Mes pending->cb = cb; pending->cb_data = cb_data; pending->conn = conn; - pending->dest = eina_stringshare_add(dbus_message_get_destination(msg->dbus_msg)); + pending->dest = eina_stringshare_add(dbus_message_get_member(msg->dbus_msg)); pending->interface = eina_stringshare_add(dbus_message_get_interface(msg->dbus_msg)); pending->method = eina_stringshare_add(dbus_message_get_member(msg->dbus_msg)); pending->path = eina_stringshare_add(dbus_message_get_path(msg->dbus_msg)); diff --git a/src/lib/eldbus_proxy.c b/src/lib/eldbus_proxy.c index 675c510..90f5590 100644 --- a/src/lib/eldbus_proxy.c +++ b/src/lib/eldbus_proxy.c @@ -735,10 +735,7 @@ _props_get_all(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EI if (!eldbus_message_arguments_get(msg, "a{sv}", &dict)) { - char *txt; - - if (eldbus_message_arguments_get(msg, "s", &txt)) - ERR("Error getting data from properties getAll: %s", txt); + ERR("Error getting data from properties getAll."); return; } eldbus_message_iter_dict_iterate(dict, "sv", _property_iter, proxy); diff --git a/src/lib/eldbus_service.c b/src/lib/eldbus_service.c index 8f5ec2a..e6946c2 100644 --- a/src/lib/eldbus_service.c +++ b/src/lib/eldbus_service.c @@ -66,9 +66,9 @@ static DBusObjectPathVTable vtable = { NULL }; -static Eldbus_Service_Interface *introspectable; -static Eldbus_Service_Interface *properties_iface; -static Eldbus_Service_Interface *objmanager; +Eldbus_Service_Interface *introspectable; +Eldbus_Service_Interface *properties_iface; +Eldbus_Service_Interface *objmanager; static inline void _introspect_arguments_append(Eina_Strbuf *buf, const Eldbus_Arg_Info *args, @@ -395,7 +395,7 @@ cb_introspect(const Eldbus_Service_Interface *_iface, const Eldbus_Message *mess } static const Eldbus_Method introspect = { - "Introspect", NULL, ELDBUS_ARGS({ "s", "xml" }), cb_introspect, 0 + "Introspect", NULL, ELDBUS_ARGS({ "s", "xml" }), cb_introspect }; static void @@ -435,22 +435,22 @@ _default_interfaces_free(void) static const Eldbus_Method _property_methods[] = { { "Get", ELDBUS_ARGS({"s", "interface"}, {"s", "property"}), - ELDBUS_ARGS({"v", "value"}), _cb_property_get, 0 + ELDBUS_ARGS({"v", "value"}), _cb_property_get }, { "Set", ELDBUS_ARGS({"s", "interface"}, {"s", "property"}, {"v", "value"}), - NULL, _cb_property_set, 0 + NULL, _cb_property_set }, { "GetAll", ELDBUS_ARGS({"s", "interface"}), ELDBUS_ARGS({"a{sv}", "props"}), - _cb_property_getall, 0 + _cb_property_getall } }; static const Eldbus_Signal _properties_signals[] = { { "PropertiesChanged", - ELDBUS_ARGS({"s", "interface"}, {"a{sv}", "changed_properties"}, {"as", "invalidated_properties"}), 0 + ELDBUS_ARGS({"s", "interface"}, {"a{sv}", "changed_properties"}, {"as", "invalidated_properties"}) } }; @@ -570,15 +570,15 @@ _cb_managed_objects(const Eldbus_Service_Interface *iface, const Eldbus_Message static Eldbus_Method get_managed_objects = { "GetManagedObjects", NULL, ELDBUS_ARGS({"a{oa{sa{sv}}}", "objects"}), - _cb_managed_objects, 0 + _cb_managed_objects }; static const Eldbus_Signal _object_manager_signals[] = { { - "InterfacesAdded", ELDBUS_ARGS({"o", "object"}, {"a{sa{sv}}", "interfaces"}), 0 + "InterfacesAdded", ELDBUS_ARGS({"o", "object"}, {"a{sa{sv}}", "interfaces"}) }, { - "InterfacesRemoved", ELDBUS_ARGS({"o", "object"}, {"as", "interfaces"}), 0 + "InterfacesRemoved", ELDBUS_ARGS({"o", "object"}, {"as", "interfaces"}) } }; @@ -1082,12 +1082,17 @@ _on_connection_free(void *data, const void *dead_pointer EINA_UNUSED) EAPI void eldbus_service_interface_unregister(Eldbus_Service_Interface *iface) { - Eldbus_Service_Object *obj; ELDBUS_SERVICE_INTERFACE_CHECK(iface); - obj = iface->obj; - eina_hash_del(obj->interfaces, NULL, iface); + if (!eina_hash_find(iface->obj->interfaces, objmanager->name)) + { + //properties + introspectable + iface that user wants unregister + if (eina_hash_population(iface->obj->interfaces) < 4) + eldbus_service_object_unregister(iface); + return; + } + eina_hash_del(iface->obj->interfaces, NULL, iface); + iface->obj->introspection_dirty = EINA_TRUE; _interface_free(iface); - obj->introspection_dirty = EINA_TRUE; } EAPI void @@ -1142,29 +1147,41 @@ _object_handler(DBusConnection *conn EINA_UNUSED, DBusMessage *msg, void *user_d eldbus_msg = eldbus_message_new(EINA_FALSE); EINA_SAFETY_ON_NULL_RETURN_VAL(eldbus_msg, DBUS_HANDLER_RESULT_NEED_MEMORY); eldbus_msg->dbus_msg = msg; - dbus_message_ref(eldbus_msg->dbus_msg); dbus_message_iter_init(eldbus_msg->dbus_msg, &eldbus_msg->iterator->dbus_iterator); if (!_have_signature(method->in, eldbus_msg)) - reply = eldbus_message_error_new(eldbus_msg, DBUS_ERROR_INVALID_SIGNATURE, - "See introspectable to know the expected signature"); + { + reply = eldbus_message_error_new(eldbus_msg, + DBUS_ERROR_INVALID_SIGNATURE, + "See introspectable to know the expected signature"); + } else { if (iface->obj) reply = method->cb(iface, eldbus_msg); else { - /* if iface does have obj it is some of FreeDesktop interfaces: - Introspectable, Properties or ObjectManager */ - iface->obj = obj; - reply = method->cb(iface, eldbus_msg); - iface->obj = NULL; + //if iface does have obj it is some of FreeDesktop interfaces: + //Introspectable, Properties... + Eldbus_Service_Interface *cpy; + cpy = calloc(1, sizeof(Eldbus_Service_Interface)); + if (!cpy) + { + dbus_message_ref(eldbus_msg->dbus_msg); + eldbus_message_unref(eldbus_msg); + return DBUS_HANDLER_RESULT_NEED_MEMORY; + } + cpy->obj = obj; + reply = method->cb(cpy, eldbus_msg); + free(cpy); } } + dbus_message_ref(eldbus_msg->dbus_msg); eldbus_message_unref(eldbus_msg); - if (reply) - _eldbus_connection_send(obj->conn, reply, NULL, NULL, -1); + if (!reply) return DBUS_HANDLER_RESULT_HANDLED; + + _eldbus_connection_send(obj->conn, reply, NULL, NULL, -1); return DBUS_HANDLER_RESULT_HANDLED; } @@ -1414,7 +1431,7 @@ eldbus_service_object_manager_attach(Eldbus_Service_Interface *iface) return EINA_TRUE; /* Ugh. User already registered the ObjectManager interface himself? */ - if (eina_hash_find(obj->interfaces, objmanager->name)) + if (eina_hash_find(obj->interfaces, obj->objmanager->name)) return EINA_FALSE; if (!eina_hash_add(obj->interfaces, objmanager->name, objmanager)) diff --git a/src/lib/eldbus_service.h b/src/lib/eldbus_service.h index 5fa839d..f36903b 100644 --- a/src/lib/eldbus_service.h +++ b/src/lib/eldbus_service.h @@ -110,8 +110,8 @@ EAPI Eldbus_Service_Interface *eldbus_service_interface_register(Eldbus_Connecti /** * @brief Unregister a interface. - * Note: This doesn't unregister the object path if interface count reaches 0. - * Use eldbus_service_object_unregister() to unregister the object. + * If this is the last interface of the object path, the object path will be + * removed too. */ EAPI void eldbus_service_interface_unregister(Eldbus_Service_Interface *iface) EINA_ARG_NONNULL(1); -- 2.7.4