From 4e1d08d200838d517da752e6d2f528de84762579 Mon Sep 17 00:00:00 2001 From: rephorm Date: Wed, 27 Sep 2006 00:00:59 +0000 Subject: [PATCH] add simple object/method creation API SVN revision: 26171 --- legacy/ecore/src/lib/ecore_dbus/Ecore_DBus.h | 35 +++++++++++++++++++ legacy/ecore/src/lib/ecore_dbus/Makefile.am | 1 + legacy/ecore/src/lib/ecore_dbus/ecore_dbus.c | 6 ++++ .../src/lib/ecore_dbus/ecore_dbus_message.c | 6 ++++ .../src/lib/ecore_dbus/ecore_dbus_private.h | 5 +++ .../src/lib/ecore_dbus/ecore_dbus_unmarshal.c | 8 ++--- 6 files changed, 57 insertions(+), 4 deletions(-) diff --git a/legacy/ecore/src/lib/ecore_dbus/Ecore_DBus.h b/legacy/ecore/src/lib/ecore_dbus/Ecore_DBus.h index 51c087b9d8..aec8fb1667 100644 --- a/legacy/ecore/src/lib/ecore_dbus/Ecore_DBus.h +++ b/legacy/ecore/src/lib/ecore_dbus/Ecore_DBus.h @@ -46,6 +46,33 @@ extern "C" { typedef struct _Ecore_DBus_Message_Field Ecore_DBus_Message_Field; typedef struct _Ecore_DBus_Address Ecore_DBus_Address; + typedef void (*Ecore_DBus_Method_Call_Cb) (Ecore_DBus_Event_Method_Call *event); + + typedef struct _Ecore_DBus_Object Ecore_DBus_Object; + typedef struct _Ecore_DBus_Object_Method Ecore_DBus_Object_Method; + typedef struct _Ecore_DBus_Object_Registry Ecore_DBus_Object_Registry; + + struct _Ecore_DBus_Object + { + Ecore_DBus_Server *server; + char *path; /* dbus path name */ + Ecore_List *methods; + }; + + struct _Ecore_DBus_Object_Method + { + Ecore_DBus_Object *object; + char *interface; + char *name; + + Ecore_DBus_Method_Call_Cb func; + }; + struct _Ecore_DBus_Object_Registry + { + Ecore_Hash *objects; + }; + + typedef enum _Ecore_DBus_Message_Type { ECORE_DBUS_MESSAGE_TYPE_INVALID, @@ -217,6 +244,14 @@ extern "C" { EAPI Ecore_DBus_Server *ecore_dbus_address_list_connect(Ecore_List *addrs, const void *data); EAPI Ecore_DBus_Server *ecore_dbus_address_connect(Ecore_DBus_Address *addr, const void *data); + /* object */ + EAPI Ecore_DBus_Object *ecore_dbus_object_add(Ecore_DBus_Server *svr, const char *path); + EAPI void ecore_dbus_object_free(Ecore_DBus_Object *obj); + + EAPI Ecore_DBus_Object_Method *ecore_dbus_object_method_add(Ecore_DBus_Object *obj, const char *interface, const char *method_name, Ecore_DBus_Method_Call_Cb func); + EAPI void ecore_dbus_object_method_remove(Ecore_DBus_Object *obj, Ecore_DBus_Object_Method *method); + EAPI void ecore_dbus_object_method_free(Ecore_DBus_Object_Method *method); + #ifdef __cplusplus } #endif diff --git a/legacy/ecore/src/lib/ecore_dbus/Makefile.am b/legacy/ecore/src/lib/ecore_dbus/Makefile.am index c367f49109..ad72f00f12 100644 --- a/legacy/ecore/src/lib/ecore_dbus/Makefile.am +++ b/legacy/ecore/src/lib/ecore_dbus/Makefile.am @@ -27,6 +27,7 @@ ecore_dbus_unmarshal.c \ ecore_dbus_methods.c \ ecore_dbus_utils.c \ ecore_dbus_address.c \ +ecore_dbus_object.c \ ecore_dbus_private.h libecore_dbus_la_LIBADD = \ diff --git a/legacy/ecore/src/lib/ecore_dbus/ecore_dbus.c b/legacy/ecore/src/lib/ecore_dbus/ecore_dbus.c index 7ceadefa01..c19b4bfa39 100644 --- a/legacy/ecore/src/lib/ecore_dbus/ecore_dbus.c +++ b/legacy/ecore/src/lib/ecore_dbus/ecore_dbus.c @@ -105,6 +105,7 @@ ecore_dbus_init(void) handler[i++] = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_DATA, _ecore_dbus_event_server_data, NULL); + ecore_dbus_objects_init(); return init_count; } @@ -115,6 +116,7 @@ ecore_dbus_shutdown(void) if (--init_count != 0) return init_count; + ecore_dbus_objects_shutdown(); /* FIXME: Delete servers */ for (i = 0; i < 3; i++) @@ -231,6 +233,9 @@ ecore_dbus_server_connect(Ecore_Con_Type con_type, const char *name, int port, svr->auth_type_transaction = 0; svr->messages = ecore_hash_new(ecore_direct_hash, ecore_direct_compare); ecore_hash_set_free_value(svr->messages, ECORE_FREE_CB(_ecore_dbus_message_free)); + svr->objects = ecore_hash_new(ecore_str_hash, ecore_str_compare); + ecore_hash_set_free_key(svr->objects, free); + ecore_hash_set_free_value(svr->objects, ECORE_FREE_CB(ecore_dbus_object_free)); servers = _ecore_list2_append(servers, svr); return svr; @@ -243,6 +248,7 @@ ecore_dbus_server_del(Ecore_DBus_Server *svr) servers = _ecore_list2_remove(servers, svr); if (svr->unique_name) free(svr->unique_name); ecore_hash_destroy(svr->messages); + ecore_hash_destroy(svr->objects); free(svr); } 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 96d8009577..1194d6a325 100644 --- a/legacy/ecore/src/lib/ecore_dbus/ecore_dbus_message.c +++ b/legacy/ecore/src/lib/ecore_dbus/ecore_dbus_message.c @@ -298,6 +298,12 @@ ecore_dbus_message_body_field_get(Ecore_DBus_Message *m, unsigned int pos) return NULL; } +EAPI int +ecore_dbus_message_serial_get(Ecore_DBus_Message *m) +{ + return m->serial; +} + /* message functions */ Ecore_DBus_Message * 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 3e44278310..c2ddf161c3 100644 --- a/legacy/ecore/src/lib/ecore_dbus/ecore_dbus_private.h +++ b/legacy/ecore/src/lib/ecore_dbus/ecore_dbus_private.h @@ -67,6 +67,8 @@ struct _Ecore_DBus_Server int cnt_msg; Ecore_Hash *messages; + Ecore_Hash *objects; + char *unique_name; }; @@ -287,6 +289,9 @@ Ecore_DBus_Message_Field *_ecore_dbus_message_unmarshal_custom_header(unsigned c */ Ecore_DBus_Message *_ecore_dbus_message_unmarshal(Ecore_DBus_Server *svr, unsigned char *message, int size); + +int ecore_dbus_object_method_dispatch(Ecore_DBus_Server *server, const char *path, const char *interface, const char *method); + /* Errors */ #define DBUS_ERROR_FAILED "org.freedesktop.DBus.Error.Failed" #define DBUS_ERROR_NO_MEMORY "org.freedesktop.DBus.Error.NoMemory" 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 4fbb991767..4312a4ec36 100644 --- a/legacy/ecore/src/lib/ecore_dbus/ecore_dbus_unmarshal.c +++ b/legacy/ecore/src/lib/ecore_dbus/ecore_dbus_unmarshal.c @@ -384,7 +384,7 @@ _ecore_dbus_message_unmarshal(Ecore_DBus_Server *svr, unsigned char *message, in _ecore_dbus_message_append_bytes(msg, message, size); msg->length = 12; size -= 12; - /* Parse custom header */ + /* Parse header fields */ if (!(arr = _ecore_dbus_message_unmarshal_array_begin(msg, ECORE_DBUS_DATA_TYPE_STRUCT, &size))) { printf("Could not parse custom header.\n"); @@ -461,10 +461,10 @@ _ecore_dbus_message_unmarshal(Ecore_DBus_Server *svr, unsigned char *message, in 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 + printf("[ecore_dbus] unhandled data type %c\n", type); + break; default: -#endif - printf("[ecore_dbus] unknown/unhandled data type %c\n", type); + printf("[ecore_dbus] unknown data type %c\n", type); break; } sig++;