Trap known messages

SVN revision: 24194
This commit is contained in:
sebastid 2006-07-25 14:12:21 +00:00 committed by sebastid
parent 27071cc23b
commit ea6d530cfa
6 changed files with 138 additions and 27 deletions

View File

@ -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*/);

View File

@ -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
}

View File

@ -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;

View File

@ -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 */

View File

@ -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

View File

@ -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))