diff --git a/legacy/ecore/src/bin/ecore_dbus_test.c b/legacy/ecore/src/bin/ecore_dbus_test.c index b7ba8ad63e..5cd48e595f 100644 --- a/legacy/ecore/src/bin/ecore_dbus_test.c +++ b/legacy/ecore/src/bin/ecore_dbus_test.c @@ -54,7 +54,7 @@ _ecore_dbus_event_server_add(void *udata, int ev_type, void *ev) event = ev; printf("_ecore_dbus_event_server_add\n"); - ret = ecore_dbus_message_new_method_call(event->server, "org.freedesktop.DBus" /*service*/, + ret = ecore_dbus_message_new_method_call(event->server, "org.freedesktop.DBus" /*destination*/, "/org/freedesktop/DBus" /*path*/, "org.freedesktop.DBus" /*interface*/, "Hello" /*method*/, NULL /*fmt*/); diff --git a/legacy/ecore/src/lib/ecore_dbus/Ecore_DBus.h b/legacy/ecore/src/lib/ecore_dbus/Ecore_DBus.h index b674578398..90709750fd 100644 --- a/legacy/ecore/src/lib/ecore_dbus/Ecore_DBus.h +++ b/legacy/ecore/src/lib/ecore_dbus/Ecore_DBus.h @@ -119,9 +119,7 @@ extern "C" { EAPI void ecore_dbus_message_del(Ecore_DBus_Message *msg); EAPI void ecore_dbus_message_print(Ecore_DBus_Message *msg); EAPI void *ecore_dbus_message_header_field_get(Ecore_DBus_Message *msg, Ecore_DBus_Message_Header_Field field); -#if 0 - EAPI void *ecore_dbus_get_body_field(Ecore_DBus_Message *msg, Ecore_DBus_Message_Field *field, unsigned int pos); -#endif + EAPI void *ecore_dbus_message_body_field_get(Ecore_DBus_Message *msg, unsigned int pos); #ifdef __cplusplus } diff --git a/legacy/ecore/src/lib/ecore_dbus/ecore_dbus.c b/legacy/ecore/src/lib/ecore_dbus/ecore_dbus.c index 1dfd4898bf..154e0fae15 100644 --- a/legacy/ecore/src/lib/ecore_dbus/ecore_dbus.c +++ b/legacy/ecore/src/lib/ecore_dbus/ecore_dbus.c @@ -147,6 +147,8 @@ ecore_dbus_server_connect(Ecore_DBus_Type compl_type, char *name, int port, svr->cnt_msg = 0; svr->auth_type = -1; svr->auth_type_transaction = 0; + svr->methods = ecore_hash_new(ecore_direct_hash, ecore_direct_compare); + ecore_hash_set_free_value(svr->methods, free); servers = _ecore_list2_append(servers, svr); return svr; @@ -157,6 +159,8 @@ ecore_dbus_server_del(Ecore_DBus_Server *svr) { if (svr->server) ecore_con_server_del(svr->server); servers = _ecore_list2_remove(servers, svr); + if (svr->unique_name) free(svr->unique_name); + ecore_hash_destroy(svr->methods); free(svr); } @@ -338,6 +342,7 @@ _ecore_dbus_event_server_data(void *udata, int ev_type, void *ev) while (e->size) { Ecore_DBus_Event_Server_Data *ev; + Ecore_DBus_Message_Field_UInt32 *serial; msg = _ecore_dbus_message_unmarshal(svr, (unsigned char *)(e->data) + offset, e->size); if (msg == NULL) break; @@ -345,11 +350,53 @@ _ecore_dbus_event_server_data(void *udata, int ev_type, void *ev) e->size -= msg->length; printf("[ecore_dbus] dbus message length %u bytes, still %d\n", msg->length, e->size); - ecore_dbus_message_print(msg); - ev = malloc(sizeof(Ecore_DBus_Event_Server_Data)); - ev->server = svr; - ev->message = msg; - ecore_event_add(ECORE_DBUS_EVENT_SERVER_DATA, ev, _ecore_dbus_event_server_data_free, NULL); + //ecore_dbus_message_print(msg); + /* Trap known messages */ + serial = ecore_dbus_message_header_field_get(msg, ECORE_DBUS_HEADER_FIELD_REPLY_SERIAL); + if (msg->type == ECORE_DBUS_MESSAGE_TYPE_METHOD_RETURN) + { + char *method; + + method = ecore_hash_remove(svr->methods, (void *)serial->value); + if (method) + { + printf("Return from method: %s\n", method); + if (!strcmp(method, "org.freedesktop.DBus.Hello")) + { + char *name; + + name = ecore_dbus_message_body_field_get(msg, 0); + printf("Got unique name: %s\n", name); + svr->unique_name = strdup(name); + _ecore_dbus_message_free(msg); + } + else + { + ev = malloc(sizeof(Ecore_DBus_Event_Server_Data)); + ev->server = svr; + ev->message = msg; + ecore_event_add(ECORE_DBUS_EVENT_SERVER_DATA, ev, + _ecore_dbus_event_server_data_free, NULL); + } + free(method); + } + else + { + ev = malloc(sizeof(Ecore_DBus_Event_Server_Data)); + ev->server = svr; + ev->message = msg; + ecore_event_add(ECORE_DBUS_EVENT_SERVER_DATA, ev, + _ecore_dbus_event_server_data_free, NULL); + } + } + else + { + ev = malloc(sizeof(Ecore_DBus_Event_Server_Data)); + ev->server = svr; + ev->message = msg; + ecore_event_add(ECORE_DBUS_EVENT_SERVER_DATA, ev, + _ecore_dbus_event_server_data_free, NULL); + } } } return 0; diff --git a/legacy/ecore/src/lib/ecore_dbus/ecore_dbus_message.c b/legacy/ecore/src/lib/ecore_dbus/ecore_dbus_message.c index fada377ceb..6446deee1c 100644 --- a/legacy/ecore/src/lib/ecore_dbus/ecore_dbus_message.c +++ b/legacy/ecore/src/lib/ecore_dbus/ecore_dbus_message.c @@ -22,9 +22,10 @@ ecore_dbus_message_new_method_call(Ecore_DBus_Server *svr, char *destination, char *fmt, ...) { unsigned int serial, body_start; + char action[1024]; Ecore_DBus_Message_Field_Array *arr; - if ((!destination) && (!path) && (!interface) && (!method)) return 0; + if (!method) return 0; /* init message */ Ecore_DBus_Message *msg = _ecore_dbus_message_new(svr); @@ -139,9 +140,14 @@ ecore_dbus_message_new_method_call(Ecore_DBus_Server *svr, char *destination, *(unsigned int *)(msg->buffer + 4) = msg->length - body_start; /* show message */ - ecore_dbus_message_print(msg); + //ecore_dbus_message_print(msg); /* send message */ ecore_dbus_server_send(svr, (char *)msg->buffer, msg->length); + if (interface) + snprintf(action, sizeof(action), "%s.%s", interface, method); + else + strcpy(action, method); + ecore_hash_set(svr->methods, (void *)msg->serial, strdup(action)); serial = msg->serial; _ecore_dbus_message_free(msg); @@ -200,23 +206,62 @@ ecore_dbus_message_header_field_get(Ecore_DBus_Message *m, return NULL; } -#if 0 EAPI void * -ecore_dbus_body_field_get(Ecore_DBus_Message *m, Ecore_DBus_Message_Field *mf, - unsigned int pos) +ecore_dbus_message_body_field_get(Ecore_DBus_Message *m, unsigned int pos) { - Ecore_List2 *l; - unsigned int i = 0; + Ecore_DBus_Message_Field *f; + unsigned int i = 0; - for (l = (Ecore_List2 *) mf; l; l = l->next) + ecore_list_goto_first(m->fields); + while ((f = ecore_list_next(m->fields))) { if (i == pos) - return _ecore_dbus_field_get(m->body, (Ecore_DBus_Message_Field *)l); + { + switch (f->type) + { + case ECORE_DBUS_DATA_TYPE_BYTE: + return &ECORE_DBUS_MESSAGE_FIELD_BYTE(f)->value; + case ECORE_DBUS_DATA_TYPE_BOOLEAN: + return &ECORE_DBUS_MESSAGE_FIELD_BOOLEAN(f)->value; + case ECORE_DBUS_DATA_TYPE_INT16: + return &ECORE_DBUS_MESSAGE_FIELD_INT16(f)->value; + case ECORE_DBUS_DATA_TYPE_UINT16: + return &ECORE_DBUS_MESSAGE_FIELD_UINT16(f)->value; + case ECORE_DBUS_DATA_TYPE_INT32: + return &ECORE_DBUS_MESSAGE_FIELD_INT32(f)->value; + case ECORE_DBUS_DATA_TYPE_UINT32: + return &ECORE_DBUS_MESSAGE_FIELD_UINT32(f)->value; + case ECORE_DBUS_DATA_TYPE_INT64: + return &ECORE_DBUS_MESSAGE_FIELD_INT64(f)->value; + case ECORE_DBUS_DATA_TYPE_UINT64: + return &ECORE_DBUS_MESSAGE_FIELD_UINT64(f)->value; + case ECORE_DBUS_DATA_TYPE_DOUBLE: + return &ECORE_DBUS_MESSAGE_FIELD_DOUBLE(f)->value; + case ECORE_DBUS_DATA_TYPE_STRING: + return ECORE_DBUS_MESSAGE_FIELD_STRING(f)->value; + case ECORE_DBUS_DATA_TYPE_OBJECT_PATH: + return ECORE_DBUS_MESSAGE_FIELD_OBJECT_PATH(f)->value; + case ECORE_DBUS_DATA_TYPE_SIGNATURE: + return ECORE_DBUS_MESSAGE_FIELD_SIGNATURE(f)->value; + case ECORE_DBUS_DATA_TYPE_INVALID: + case ECORE_DBUS_DATA_TYPE_ARRAY: + case ECORE_DBUS_DATA_TYPE_VARIANT: + case ECORE_DBUS_DATA_TYPE_STRUCT: + case ECORE_DBUS_DATA_TYPE_STRUCT_BEGIN: + case ECORE_DBUS_DATA_TYPE_STRUCT_END: + case ECORE_DBUS_DATA_TYPE_DICT_ENTRY: + case ECORE_DBUS_DATA_TYPE_DICT_ENTRY_BEGIN: + case ECORE_DBUS_DATA_TYPE_DICT_ENTRY_END: +#if 0 + default: +#endif + break; + } + } i++; } return NULL; } -#endif /* message functions */ diff --git a/legacy/ecore/src/lib/ecore_dbus/ecore_dbus_private.h b/legacy/ecore/src/lib/ecore_dbus/ecore_dbus_private.h index 2272d8b731..aa4e01d17d 100644 --- a/legacy/ecore/src/lib/ecore_dbus/ecore_dbus_private.h +++ b/legacy/ecore/src/lib/ecore_dbus/ecore_dbus_private.h @@ -8,26 +8,42 @@ typedef unsigned char *(*Ecore_DBus_Auth_Transaction)(void *); typedef struct _Ecore_DBus_Auth Ecore_DBus_Auth; -typedef struct _Ecore_DBus_Message_Field_Container Ecore_DBus_Message_Field_Container; - #define ECORE_DBUS_MESSAGE_FIELD(x) ((Ecore_DBus_Message_Field *)(x)) #define ECORE_DBUS_MESSAGE_FIELD_CONTAINER(x) ((Ecore_DBus_Message_Field_Container *)(x)) +typedef struct _Ecore_DBus_Message_Field_Container Ecore_DBus_Message_Field_Container; + typedef struct _Ecore_DBus_Message_Field_Byte Ecore_DBus_Message_Field_Byte; +#define ECORE_DBUS_MESSAGE_FIELD_BYTE(x) ((Ecore_DBus_Message_Field_Byte *)(x)) typedef struct _Ecore_DBus_Message_Field_Boolean Ecore_DBus_Message_Field_Boolean; +#define ECORE_DBUS_MESSAGE_FIELD_BOOLEAN(x) ((Ecore_DBus_Message_Field_Boolean *)(x)) typedef struct _Ecore_DBus_Message_Field_Int16 Ecore_DBus_Message_Field_Int16; +#define ECORE_DBUS_MESSAGE_FIELD_INT16(x) ((Ecore_DBus_Message_Field_Int16 *)(x)) typedef struct _Ecore_DBus_Message_Field_UInt16 Ecore_DBus_Message_Field_UInt16; +#define ECORE_DBUS_MESSAGE_FIELD_UINT16(x) ((Ecore_DBus_Message_Field_UInt16 *)(x)) typedef struct _Ecore_DBus_Message_Field_Int32 Ecore_DBus_Message_Field_Int32; +#define ECORE_DBUS_MESSAGE_FIELD_INT32(x) ((Ecore_DBus_Message_Field_Int32 *)(x)) typedef struct _Ecore_DBus_Message_Field_UInt32 Ecore_DBus_Message_Field_UInt32; +#define ECORE_DBUS_MESSAGE_FIELD_UINT32(x) ((Ecore_DBus_Message_Field_UInt32 *)(x)) typedef struct _Ecore_DBus_Message_Field_Int64 Ecore_DBus_Message_Field_Int64; +#define ECORE_DBUS_MESSAGE_FIELD_INT64(x) ((Ecore_DBus_Message_Field_Int64 *)(x)) typedef struct _Ecore_DBus_Message_Field_UInt64 Ecore_DBus_Message_Field_UInt64; +#define ECORE_DBUS_MESSAGE_FIELD_UINT64(x) ((Ecore_DBus_Message_Field_UInt64 *)(x)) typedef struct _Ecore_DBus_Message_Field_Double Ecore_DBus_Message_Field_Double; +#define ECORE_DBUS_MESSAGE_FIELD_DOUBLE(x) ((Ecore_DBus_Message_Field_Double *)(x)) typedef struct _Ecore_DBus_Message_Field_String Ecore_DBus_Message_Field_String; +#define ECORE_DBUS_MESSAGE_FIELD_STRING(x) ((Ecore_DBus_Message_Field_String *)(x)) typedef struct _Ecore_DBus_Message_Field_Object_Path Ecore_DBus_Message_Field_Object_Path; +#define ECORE_DBUS_MESSAGE_FIELD_OBJECT_PATH(x) ((Ecore_DBus_Message_Field_Object_Path *)(x)) typedef struct _Ecore_DBus_Message_Field_Signature Ecore_DBus_Message_Field_Signature; +#define ECORE_DBUS_MESSAGE_FIELD_SIGNATURE(x) ((Ecore_DBus_Message_Field_Signature *)(x)) typedef struct _Ecore_DBus_Message_Field_Array Ecore_DBus_Message_Field_Array; +#define ECORE_DBUS_MESSAGE_FIELD_ARRAY(x) ((Ecore_DBus_Message_Field_Array *)(x)) typedef struct _Ecore_DBus_Message_Field_Variant Ecore_DBus_Message_Field_Variant; +#define ECORE_DBUS_MESSAGE_FIELD_VARIANT(x) ((Ecore_DBus_Message_Field_Variant *)(x)) typedef struct _Ecore_DBus_Message_Field_Struct Ecore_DBus_Message_Field_Struct; +#define ECORE_DBUS_MESSAGE_FIELD_STRUCT(x) ((Ecore_DBus_Message_Field_Struct *)(x)) typedef struct _Ecore_DBus_Message_Field_Dict_Entry Ecore_DBus_Message_Field_Dict_Entry; +#define ECORE_DBUS_MESSAGE_FIELD_DICT_ENTRY(x) ((Ecore_DBus_Message_Field_Dict_Entry *)(x)) typedef enum _Ecore_DBus_Auth_Type { @@ -49,12 +65,15 @@ typedef enum _Ecore_DBus_Message_Type struct _Ecore_DBus_Server { - Ecore_List2 __list_data; - Ecore_Con_Server *server; - int authenticated; - int auth_type; - int auth_type_transaction; - int cnt_msg; + Ecore_List2 __list_data; + Ecore_Con_Server *server; + int authenticated; + int auth_type; + int auth_type_transaction; + int cnt_msg; + + Ecore_Hash *methods; + char *unique_name; }; struct _Ecore_DBus_Message diff --git a/legacy/ecore/src/lib/ecore_dbus/ecore_dbus_unmarshal.c b/legacy/ecore/src/lib/ecore_dbus/ecore_dbus_unmarshal.c index d35f992f38..3bcce7cb9e 100644 --- a/legacy/ecore/src/lib/ecore_dbus/ecore_dbus_unmarshal.c +++ b/legacy/ecore/src/lib/ecore_dbus/ecore_dbus_unmarshal.c @@ -34,6 +34,7 @@ _ecore_dbus_message_unmarshal_int32(Ecore_DBus_Message *msg, int *size) unsigned int old_length; old_length = msg->length; + _ecore_dbus_message_padding(msg, 4); f = _ecore_dbus_message_field_new(msg, ECORE_DBUS_DATA_TYPE_INT32); f->value = _ecore_dbus_message_read_uint32(msg); if (*size < (msg->length - old_length)) @@ -54,6 +55,7 @@ _ecore_dbus_message_unmarshal_uint32(Ecore_DBus_Message *msg, int *size) unsigned int old_length; old_length = msg->length; + _ecore_dbus_message_padding(msg, 4); f = _ecore_dbus_message_field_new(msg, ECORE_DBUS_DATA_TYPE_UINT32); f->value = _ecore_dbus_message_read_uint32(msg); if (*size < (msg->length - old_length))