Enlightenment CVS committal Author : sebastid Project : e17 Module : libs/ecore
Dir : e17/libs/ecore/src/lib/ecore_dbus Modified Files: Ecore_DBus.h ecore_dbus.c ecore_dbus_message.c ecore_dbus_private.h ecore_dbus_unmarshal.c Log Message: Trap known messages =================================================================== RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore_dbus/Ecore_DBus.h,v retrieving revision 1.9 retrieving revision 1.10 diff -u -3 -r1.9 -r1.10 --- Ecore_DBus.h 25 Jul 2006 12:44:19 -0000 1.9 +++ Ecore_DBus.h 25 Jul 2006 14:12:21 -0000 1.10 @@ -119,9 +119,7 @@ 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 } =================================================================== RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore_dbus/ecore_dbus.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -3 -r1.12 -r1.13 --- ecore_dbus.c 25 Jul 2006 12:44:19 -0000 1.12 +++ ecore_dbus.c 25 Jul 2006 14:12:21 -0000 1.13 @@ -147,6 +147,8 @@ 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 @@ { 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 @@ 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 @@ 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; =================================================================== RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore_dbus/ecore_dbus_message.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- ecore_dbus_message.c 25 Jul 2006 12:44:19 -0000 1.1 +++ ecore_dbus_message.c 25 Jul 2006 14:12:21 -0000 1.2 @@ -22,9 +22,10 @@ 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 @@ *(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 @@ 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 */ =================================================================== RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore_dbus/ecore_dbus_private.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- ecore_dbus_private.h 25 Jul 2006 12:44:19 -0000 1.5 +++ ecore_dbus_private.h 25 Jul 2006 14:12:21 -0000 1.6 @@ -8,26 +8,42 @@ 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 @@ 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 =================================================================== RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore_dbus/ecore_dbus_unmarshal.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- ecore_dbus_unmarshal.c 25 Jul 2006 12:44:19 -0000 1.2 +++ ecore_dbus_unmarshal.c 25 Jul 2006 14:12:21 -0000 1.3 @@ -34,6 +34,7 @@ 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 @@ 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)) ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys -- and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs