ecore_dbus_test can now say hello to the system dbus server!

SVN revision: 24105
This commit is contained in:
sebastid 2006-07-21 15:56:42 +00:00 committed by sebastid
parent 49bd390565
commit a9e5f4f75c
3 changed files with 333 additions and 158 deletions

View File

@ -48,23 +48,27 @@ extern "C" {
typedef enum _Ecore_DBus_Data_Type typedef enum _Ecore_DBus_Data_Type
{ {
ECORE_DBUS_DATA_TYPE_INVALID = ((int) '\0'), ECORE_DBUS_DATA_TYPE_INVALID = ((int) '\0'),
ECORE_DBUS_DATA_TYPE_BYTE = ((int) 'y'), ECORE_DBUS_DATA_TYPE_BYTE = ((int) 'y'),
ECORE_DBUS_DATA_TYPE_BOOLEAN = ((int) 'b'), /* 0,1 */ ECORE_DBUS_DATA_TYPE_BOOLEAN = ((int) 'b'), /* 0,1 */
ECORE_DBUS_DATA_TYPE_INT16 = ((int) 'n'), ECORE_DBUS_DATA_TYPE_INT16 = ((int) 'n'),
ECORE_DBUS_DATA_TYPE_UINT16 = ((int) 'q'), ECORE_DBUS_DATA_TYPE_UINT16 = ((int) 'q'),
ECORE_DBUS_DATA_TYPE_INT32 = ((int) 'i'), ECORE_DBUS_DATA_TYPE_INT32 = ((int) 'i'),
ECORE_DBUS_DATA_TYPE_UINT32 = ((int) 'u'), ECORE_DBUS_DATA_TYPE_UINT32 = ((int) 'u'),
ECORE_DBUS_DATA_TYPE_INT64 = ((int) 'x'), ECORE_DBUS_DATA_TYPE_INT64 = ((int) 'x'),
ECORE_DBUS_DATA_TYPE_UINT64 = ((int) 't'), ECORE_DBUS_DATA_TYPE_UINT64 = ((int) 't'),
ECORE_DBUS_DATA_TYPE_DOUBLE = ((int) 'd'), ECORE_DBUS_DATA_TYPE_DOUBLE = ((int) 'd'),
ECORE_DBUS_DATA_TYPE_STRING = ((int) 's'), ECORE_DBUS_DATA_TYPE_STRING = ((int) 's'),
ECORE_DBUS_DATA_TYPE_OBJECT_PATH = ((int) 'o'), ECORE_DBUS_DATA_TYPE_OBJECT_PATH = ((int) 'o'),
ECORE_DBUS_DATA_TYPE_SIGNATURE = ((int) 'g'), ECORE_DBUS_DATA_TYPE_SIGNATURE = ((int) 'g'),
ECORE_DBUS_DATA_TYPE_ARRAY = ((int) 'a'), ECORE_DBUS_DATA_TYPE_ARRAY = ((int) 'a'),
ECORE_DBUS_DATA_TYPE_VARIANT = ((int) 'v'), ECORE_DBUS_DATA_TYPE_VARIANT = ((int) 'v'),
ECORE_DBUS_DATA_TYPE_STRUCT = ((int) 'r'), ECORE_DBUS_DATA_TYPE_STRUCT = ((int) 'r'),
ECORE_DBUS_DATA_TYPE_DICT_ENTRY = ((int) 'e'), ECORE_DBUS_DATA_TYPE_STRUCT_BEGIN = ((int) '('),
ECORE_DBUS_DATA_TYPE_STRUCT_END = ((int) ')'),
ECORE_DBUS_DATA_TYPE_DICT_ENTRY = ((int) 'e'),
ECORE_DBUS_DATA_TYPE_DICT_ENTRY_BEGIN = ((int) '{'),
ECORE_DBUS_DATA_TYPE_DICT_ENTRY_END = ((int) '}'),
} Ecore_DBus_Data_Type; } Ecore_DBus_Data_Type;
struct _Ecore_DBus_Event_Server_Add struct _Ecore_DBus_Event_Server_Add

View File

@ -55,16 +55,14 @@ EAPI int ECORE_DBUS_EVENT_SERVER_DATA = 0;
static void _ecore_dbus_message_append_length(unsigned char **buf, unsigned int old_length, unsigned int size); static void _ecore_dbus_message_append_length(unsigned char **buf, unsigned int old_length, unsigned int size);
static void _ecore_dbus_message_increase_length(unsigned char **buf, unsigned int new_length); static void _ecore_dbus_message_increase_length(unsigned char **buf, unsigned int new_length);
/* padding functions */ /* padding functions */
static void _ecore_dbus_message_4byte_padding(unsigned char **buf, unsigned int *old_length); static void _ecore_dbus_message_padding(unsigned char **buf, unsigned int *old_length, int size);
static void _ecore_dbus_message_8byte_padding(unsigned char **buf, unsigned int *old_length); static void _ecore_dbus_message_padding_skip(unsigned int *old_length, int size);
static void _ecore_dbus_message_skip_4byte_padding(unsigned int *old_length);
/*static void _ecore_dbus_message_skip_8byte_padding(unsigned int *old_length);*/
/* appending/reading functions */ /* appending/reading functions */
static void _ecore_dbus_message_append_nbytes(unsigned char *buf, unsigned char *data, unsigned int data_length); static void _ecore_dbus_message_append_nbytes(unsigned char *buf, unsigned char *data, unsigned int data_length);
static void _ecore_dbus_message_append_byte(unsigned char *buf, unsigned char c); static void _ecore_dbus_message_append_byte(unsigned char *buf, unsigned char c);
static void _ecore_dbus_message_append_uint32(unsigned char *buf, unsigned long int i); static void _ecore_dbus_message_append_uint32(unsigned char *buf, unsigned int i);
static unsigned char _ecore_dbus_message_read_byte(unsigned char *buf); static unsigned char _ecore_dbus_message_read_byte(unsigned char *buf);
static unsigned long _ecore_dbus_message_read_uint32(unsigned char *buf); static unsigned int _ecore_dbus_message_read_uint32(unsigned char *buf);
/* message functions */ /* message functions */
static Ecore_DBus_Message *_ecore_dbus_message_new(Ecore_DBus_Server *svr); static Ecore_DBus_Message *_ecore_dbus_message_new(Ecore_DBus_Server *svr);
static Ecore_DBus_Message_Field *_ecore_dbus_message_new_field(Ecore_DBus_Data_Type type, unsigned int offset); static Ecore_DBus_Message_Field *_ecore_dbus_message_new_field(Ecore_DBus_Data_Type type, unsigned int offset);
@ -88,11 +86,12 @@ static Ecore_DBus_Message_Field *_ecore_dbus_message_marshal_object_path(unsigne
/* /*
static Ecore_DBus_Message_Field *_ecore_dbus_message_marshal_signature(unsigned char **buf, unsigned int *old_length, char *str); static Ecore_DBus_Message_Field *_ecore_dbus_message_marshal_signature(unsigned char **buf, unsigned int *old_length, char *str);
*/ */
static Ecore_DBus_Message_Field *_ecore_dbus_message_marshal_array(unsigned char **msg, unsigned int *old_length, Ecore_DBus_Data_Type contained_type);
static Ecore_DBus_Message_Field *_ecore_dbus_message_marshal_struct_begin(unsigned char **msg, unsigned int *old_length);
static Ecore_DBus_Message_Field *_ecore_dbus_message_marshal_struct_end(unsigned char **msg, unsigned int *old_length);
/* /*
* FIXME: These aren't correct ! * FIXME: These aren't correct !
static Ecore_DBus_Message_Field *_ecore_dbus_message_marshal_array(unsigned char **msg, unsigned int *old_length);
static Ecore_DBus_Message_Field *_ecore_dbus_message_marshal_variant(unsigned char **msg, unsigned int *old_length); static Ecore_DBus_Message_Field *_ecore_dbus_message_marshal_variant(unsigned char **msg, unsigned int *old_length);
static Ecore_DBus_Message_Field *_ecore_dbus_message_marshal_struct(unsigned char **msg, unsigned int *old_length);
static Ecore_DBus_Message_Field *_ecore_dbus_message_marshal_dict_entry(unsigned char **msg, unsigned int *old_length); static Ecore_DBus_Message_Field *_ecore_dbus_message_marshal_dict_entry(unsigned char **msg, unsigned int *old_length);
*/ */
static Ecore_DBus_Message_Field *_ecore_dbus_message_marshal_data(unsigned char **buf, unsigned int *old_length, Ecore_DBus_Data_Type type, void *data); static Ecore_DBus_Message_Field *_ecore_dbus_message_marshal_data(unsigned char **buf, unsigned int *old_length, Ecore_DBus_Data_Type type, void *data);
@ -113,22 +112,20 @@ static Ecore_DBus_Message_Field *_ecore_dbus_message_unmarshal_double(unsigned c
*/ */
static Ecore_DBus_Message_Field *_ecore_dbus_message_unmarshal_string(unsigned char *buf, unsigned int *old_length); static Ecore_DBus_Message_Field *_ecore_dbus_message_unmarshal_string(unsigned char *buf, unsigned int *old_length);
static Ecore_DBus_Message_Field *_ecore_dbus_message_unmarshal_object_path(unsigned char *buf, unsigned int *old_length); static Ecore_DBus_Message_Field *_ecore_dbus_message_unmarshal_object_path(unsigned char *buf, unsigned int *old_length);
/*
static Ecore_DBus_Message_Field *_ecore_dbus_message_unmarshal_signature(unsigned char *buf, unsigned int *old_length); static Ecore_DBus_Message_Field *_ecore_dbus_message_unmarshal_signature(unsigned char *buf, unsigned int *old_length);
*/
/* /*
* FIXME: These aren't correct! * FIXME: These aren't correct!
static Ecore_DBus_Message_Field *_ecore_dbus_message_unmarshal_array(unsigned char *buf, unsigned int *old_length); static Ecore_DBus_Message_Field *_ecore_dbus_message_unmarshal_array(unsigned char *buf, unsigned int *old_length);
static Ecore_DBus_Message_Field *_ecore_dbus_message_unmarshal_variant(unsigned char *buf, unsigned int *old_length); static Ecore_DBus_Message_Field *_ecore_dbus_message_unmarshal_variant(unsigned char *buf, unsigned int *old_length);
static Ecore_DBus_Message_Field *_ecore_dbus_message_unmarshal_struct(unsigned char *buf, unsigned int *old_length); static Ecore_DBus_Message_Field *_ecore_dbus_message_unmarshal_struct(unsigned char *buf, unsigned int *old_length);
static Ecore_DBus_Message_Field *_ecore_dbus_message_unmarshal_dict_entry(unsigned char *buf, unsigned int *old_length); static Ecore_DBus_Message_Field *_ecore_dbus_message_unmarshal_dict_entry(unsigned char *buf, unsigned int *old_length);
static Ecore_DBus_Message_Field *_ecore_dbus_message_unmarshal_data(unsigned char *buf, unsigned int *old_length);
*/ */
static Ecore_DBus_Message_Field *_ecore_dbus_message_unmarshal_data(unsigned char *buf, unsigned int *old_length);
static Ecore_DBus_Message_Field *_ecore_dbus_message_unmarshal_custom_header(unsigned char *buf, unsigned int *old_length); static Ecore_DBus_Message_Field *_ecore_dbus_message_unmarshal_custom_header(unsigned char *buf, unsigned int *old_length);
static Ecore_DBus_Message *_ecore_dbus_message_unmarshal(Ecore_DBus_Server *svr, unsigned char *message); static Ecore_DBus_Message *_ecore_dbus_message_unmarshal(Ecore_DBus_Server *svr, unsigned char *message);
/* header functions */ /* header functions */
static void _ecore_dbus_message_common_header(Ecore_DBus_Message *msg, int type, int flags); static void _ecore_dbus_message_common_header(Ecore_DBus_Message *msg, int type, int flags);
static void *_ecore_dbus_get_field(unsigned char *buf, Ecore_DBus_Message_Field *f); static void *_ecore_dbus_field_get(unsigned char *buf, Ecore_DBus_Message_Field *f);
/* helper functions */ /* helper functions */
static char *_ecore_dbus_getuid(void); static char *_ecore_dbus_getuid(void);
static char *_ecore_dbus_hex_encode(char *src_str); static char *_ecore_dbus_hex_encode(char *src_str);
@ -143,6 +140,7 @@ static Ecore_DBus_Message_Field *_ecore_dbus_message_print_field(Ecore_DBus_Mess
static Ecore_DBus_Message_Field *_ecore_dbus_message_print_header_field(Ecore_DBus_Message_Field *f, unsigned char *buf); static Ecore_DBus_Message_Field *_ecore_dbus_message_print_header_field(Ecore_DBus_Message_Field *f, unsigned char *buf);
/*static void _ecore_dbus_message_print_fields(Ecore_DBus_Message_Field *f);*/ /*static void _ecore_dbus_message_print_fields(Ecore_DBus_Message_Field *f);*/
/*static void _ecore_dbus_message_print_raw(unsigned char *msg, unsigned int msg_len);*/ /*static void _ecore_dbus_message_print_raw(unsigned char *msg, unsigned int msg_len);*/
static int _ecore_dbus_alignment_get(Ecore_DBus_Data_Type type);
/* local variables */ /* local variables */
@ -263,11 +261,14 @@ ecore_dbus_message_new_method_call(Ecore_DBus_Server *svr, char *service,
char *path, char *interface, char *method, char *path, char *interface, char *method,
char *fmt, ...) char *fmt, ...)
{ {
unsigned long serial; unsigned int serial;
va_list ap; va_list ap;
unsigned int size = 0;
Ecore_DBus_Message_Field *f; Ecore_DBus_Message_Field *f;
if ((!service) && (!path) && (!interface) && (!method)) return 0;
/* init message */ /* init message */
Ecore_DBus_Message *msg = _ecore_dbus_message_new(svr); Ecore_DBus_Message *msg = _ecore_dbus_message_new(svr);
@ -281,23 +282,7 @@ ecore_dbus_message_new_method_call(Ecore_DBus_Server *svr, char *service,
ECORE_DBUS_DATA_TYPE_OBJECT_PATH, ECORE_DBUS_DATA_TYPE_OBJECT_PATH,
path); path);
msg->header_fields = _ecore_list2_append(msg->header_fields, f); msg->header_fields = _ecore_list2_append(msg->header_fields, f);
} size++;
if (interface)
{
f = _ecore_dbus_message_marshal_custom_header(&msg->header, &msg->hpos,
2,
ECORE_DBUS_DATA_TYPE_STRING,
interface);
msg->header_fields = _ecore_list2_append(msg->header_fields, f);
}
if (method)
{
f = _ecore_dbus_message_marshal_custom_header(&msg->header, &msg->hpos,
3,
ECORE_DBUS_DATA_TYPE_STRING,
method);
msg->header_fields = _ecore_list2_append(msg->header_fields, f);
} }
if (service) if (service)
{ {
@ -306,18 +291,39 @@ ecore_dbus_message_new_method_call(Ecore_DBus_Server *svr, char *service,
ECORE_DBUS_DATA_TYPE_STRING, ECORE_DBUS_DATA_TYPE_STRING,
service); service);
msg->header_fields = _ecore_list2_append(msg->header_fields, f); msg->header_fields = _ecore_list2_append(msg->header_fields, f);
size++;
}
if (interface)
{
f = _ecore_dbus_message_marshal_custom_header(&msg->header, &msg->hpos,
2,
ECORE_DBUS_DATA_TYPE_STRING,
interface);
msg->header_fields = _ecore_list2_append(msg->header_fields, f);
size++;
}
if (method)
{
f = _ecore_dbus_message_marshal_custom_header(&msg->header, &msg->hpos,
3,
ECORE_DBUS_DATA_TYPE_STRING,
method);
msg->header_fields = _ecore_list2_append(msg->header_fields, f);
size++;
} }
if (fmt) if (fmt)
{ {
f = _ecore_dbus_message_marshal_custom_header(&msg->header, &msg->hpos, f = _ecore_dbus_message_marshal_custom_header(&msg->header, &msg->hpos,
8, 8,
ECORE_DBUS_DATA_TYPE_STRING, ECORE_DBUS_DATA_TYPE_SIGNATURE,
fmt); fmt);
msg->header_fields = _ecore_list2_append(msg->header_fields, f); msg->header_fields = _ecore_list2_append(msg->header_fields, f);
size++;
} }
_ecore_dbus_message_8byte_padding(&msg->header, &msg->hpos); /* Remove 16 bytes for the intro */
/* header length */ *(unsigned int *)(msg->header + 12) = msg->hpos - 16;
*(msg->header + 4) = msg->hlength = msg->hpos; _ecore_dbus_message_padding(&msg->header, &msg->hpos, 8);
msg->hlength = msg->hpos;
/* message body */ /* message body */
if (fmt) if (fmt)
{ {
@ -333,7 +339,7 @@ ecore_dbus_message_new_method_call(Ecore_DBus_Server *svr, char *service,
break; break;
case ECORE_DBUS_DATA_TYPE_UINT32: case ECORE_DBUS_DATA_TYPE_UINT32:
f = _ecore_dbus_message_marshal_uint32(&msg->body, &msg->bpos, f = _ecore_dbus_message_marshal_uint32(&msg->body, &msg->bpos,
va_arg(ap, unsigned long)); va_arg(ap, unsigned int));
msg->body_fields = _ecore_list2_append(msg->body_fields, f); msg->body_fields = _ecore_list2_append(msg->body_fields, f);
break; break;
case ECORE_DBUS_DATA_TYPE_STRING: case ECORE_DBUS_DATA_TYPE_STRING:
@ -364,11 +370,13 @@ ecore_dbus_message_new_method_call(Ecore_DBus_Server *svr, char *service,
} }
va_end(ap); va_end(ap);
} }
*(unsigned int *)(msg->header + 8) = msg->blength = msg->bpos; *(unsigned int *)(msg->header + 4) = msg->blength = msg->bpos;
/* show message */ /* show message */
/*ecore_dbus_message_print(msg); ecore_dbus_message_print(msg);
* _ecore_dbus_message_print_raw(msg->header, msg->hlength); /*
* _ecore_dbus_message_print_raw(msg->body, msg->blength); */ _ecore_dbus_message_print_raw(msg->header, msg->hlength);
_ecore_dbus_message_print_raw(msg->body, msg->blength);
*/
/* send message */ /* send message */
ecore_dbus_server_send(svr, (char *)msg->header, msg->hlength); ecore_dbus_server_send(svr, (char *)msg->header, msg->hlength);
if (msg->body) if (msg->body)
@ -390,14 +398,15 @@ ecore_dbus_message_print(Ecore_DBus_Message *msg)
printf("[ecore_dbus] per field message:\n"); printf("[ecore_dbus] per field message:\n");
printf("[ecore_dbus] header fields:\n"); printf("[ecore_dbus] header fields:\n");
/* header common fields */ /* header common fields */
printf("[ecore_dbus] header endianess : %c\n", msg->byte_order); printf("[ecore_dbus] header endianess : %c\n", msg->header[0]);
printf("[ecore_dbus] header type : %s\n", msg_type[msg->type]); printf("[ecore_dbus] header type : %s\n", msg_type[msg->header[1]]);
printf("[ecore_dbus] header flags : %c\n", msg->flags + 48); printf("[ecore_dbus] header flags : %c\n", msg->header[2]);
printf("[ecore_dbus] header protocol : %c\n", msg->protocol + 48); printf("[ecore_dbus] header protocol : %c\n", msg->header[3]);
printf("[ecore_dbus] header hlength : %u\n", printf("[ecore_dbus] header hlength : %u\n", msg->hlength);
printf("[ecore_dbus] header blength : %u\n",
*(unsigned int *)(msg->header + 4)); *(unsigned int *)(msg->header + 4));
printf("[ecore_dbus] header blength : %lu\n", msg->blength); printf("[ecore_dbus] header serial : %u\n",
printf("[ecore_dbus] header serial : %lu\n", msg->serial); *(unsigned int *)(msg->header + 8));
/* header custom fields */ /* header custom fields */
f = msg->header_fields; f = msg->header_fields;
@ -416,7 +425,7 @@ ecore_dbus_message_print(Ecore_DBus_Message *msg)
} }
EAPI void * EAPI void *
ecore_dbus_get_header_field(Ecore_DBus_Message *m, ecore_dbus_header_field_get(Ecore_DBus_Message *m,
Ecore_DBus_Message_Field *mf, Ecore_DBus_Message_Field *mf,
Ecore_DBus_Message_Header_Field hft) Ecore_DBus_Message_Header_Field hft)
{ {
@ -424,12 +433,12 @@ ecore_dbus_get_header_field(Ecore_DBus_Message *m,
for (l = (Ecore_List2 *)mf; l; l = l->next) for (l = (Ecore_List2 *)mf; l; l = l->next)
if (((Ecore_DBus_Message_Field *)l)->hfield == hft) if (((Ecore_DBus_Message_Field *)l)->hfield == hft)
return _ecore_dbus_get_field(m->header, (Ecore_DBus_Message_Field *)l); return _ecore_dbus_field_get(m->header, (Ecore_DBus_Message_Field *)l);
return NULL; return NULL;
} }
EAPI void * EAPI void *
ecore_dbus_get_body_field(Ecore_DBus_Message *m, Ecore_DBus_Message_Field *mf, ecore_dbus_body_field_get(Ecore_DBus_Message *m, Ecore_DBus_Message_Field *mf,
unsigned int pos) unsigned int pos)
{ {
Ecore_List2 *l; Ecore_List2 *l;
@ -438,7 +447,7 @@ ecore_dbus_get_body_field(Ecore_DBus_Message *m, Ecore_DBus_Message_Field *mf,
for (l = (Ecore_List2 *) mf; l; l = l->next) for (l = (Ecore_List2 *) mf; l; l = l->next)
{ {
if (i == pos) if (i == pos)
return _ecore_dbus_get_field(m->body, (Ecore_DBus_Message_Field *)l); return _ecore_dbus_field_get(m->body, (Ecore_DBus_Message_Field *)l);
i++; i++;
} }
return NULL; return NULL;
@ -466,57 +475,30 @@ _ecore_dbus_message_increase_length(unsigned char **buf,
/* padding functions */ /* padding functions */
static void static void
_ecore_dbus_message_4byte_padding(unsigned char **buf, unsigned int *old_length) _ecore_dbus_message_padding(unsigned char **buf, unsigned int *old_length, int size)
{ {
unsigned int padding; unsigned int padding;
padding = *old_length % 4; padding = *old_length % size;
if (padding != 0) if (padding != 0)
{ {
padding = 4 - padding; padding = size - padding;
_ecore_dbus_message_append_length(buf, *old_length, padding); _ecore_dbus_message_append_length(buf, *old_length, padding);
} }
*old_length += padding; *old_length += padding;
} }
static void static void
_ecore_dbus_message_8byte_padding(unsigned char **buf, unsigned int *old_length) _ecore_dbus_message_padding_skip(unsigned int *old_length, int size)
{ {
unsigned int padding; unsigned int padding;
padding = *old_length % 8; padding = *old_length % size;
if (padding != 0) if (padding != 0)
{ *old_length += size - padding;
padding = 8 - padding;
_ecore_dbus_message_append_length(buf, *old_length, padding);
}
*old_length += padding;
}
static void
_ecore_dbus_message_skip_4byte_padding(unsigned int *old_length)
{
unsigned int padding;
padding = *old_length % 4;
if (padding != 0)
*old_length += 4 - padding;
return; return;
} }
/*static void
_ecore_dbus_message_skip_8byte_padding(unsigned int *old_length)
{
unsigned int padding;
padding = *old_length % 8;
if (padding != 0)
*old_length += 8 - padding;
return;
}
*/
/* appending/reading functions */ /* appending/reading functions */
static void static void
@ -533,7 +515,7 @@ _ecore_dbus_message_append_byte(unsigned char *buf, unsigned char c)
} }
static void static void
_ecore_dbus_message_append_uint32(unsigned char *buf, unsigned long int i) _ecore_dbus_message_append_uint32(unsigned char *buf, unsigned int i)
{ {
unsigned char *c; unsigned char *c;
@ -550,10 +532,10 @@ _ecore_dbus_message_read_byte(unsigned char *buf)
return *(unsigned char *)buf; return *(unsigned char *)buf;
} }
static unsigned long static unsigned int
_ecore_dbus_message_read_uint32(unsigned char *buf) _ecore_dbus_message_read_uint32(unsigned char *buf)
{ {
return *(unsigned long *)buf; return *(unsigned int *)buf;
} }
/* message functions */ /* message functions */
@ -607,7 +589,7 @@ _ecore_dbus_message_free(void *data, void *ev)
free(l); free(l);
l = next; l = next;
} }
l = (Ecore_List2 *) msg->header_fields; l = (Ecore_List2 *)msg->header_fields;
while (l) while (l)
{ {
next = l->next; next = l->next;
@ -654,7 +636,7 @@ _ecore_dbus_message_marshal_uint32(unsigned char **buf,
/* append the data type */ /* append the data type */
_ecore_dbus_message_append_byte(*buf + *old_length, ECORE_DBUS_DATA_TYPE_UINT32); _ecore_dbus_message_append_byte(*buf + *old_length, ECORE_DBUS_DATA_TYPE_UINT32);
*old_length += 1; *old_length += 1;
_ecore_dbus_message_4byte_padding(buf, old_length); _ecore_dbus_message_padding(buf, old_length, 4);
_ecore_dbus_message_increase_length(buf, *old_length + 4); _ecore_dbus_message_increase_length(buf, *old_length + 4);
_ecore_dbus_message_append_uint32(*buf + *old_length, i); _ecore_dbus_message_append_uint32(*buf + *old_length, i);
f = _ecore_dbus_message_new_field(ECORE_DBUS_DATA_TYPE_UINT32, *old_length); f = _ecore_dbus_message_new_field(ECORE_DBUS_DATA_TYPE_UINT32, *old_length);
@ -676,7 +658,7 @@ _ecore_dbus_message_marshal_object_path(unsigned char **buf, unsigned int *old_l
*old_length += 1; *old_length += 1;
str_len = strlen(str); str_len = strlen(str);
_ecore_dbus_message_4byte_padding(buf, old_length); _ecore_dbus_message_padding(buf, old_length, 4);
_ecore_dbus_message_increase_length(buf, *old_length + 4); _ecore_dbus_message_increase_length(buf, *old_length + 4);
f = _ecore_dbus_message_new_field(ECORE_DBUS_DATA_TYPE_OBJECT_PATH, *old_length); f = _ecore_dbus_message_new_field(ECORE_DBUS_DATA_TYPE_OBJECT_PATH, *old_length);
_ecore_dbus_message_append_uint32(*buf + *old_length, str_len); _ecore_dbus_message_append_uint32(*buf + *old_length, str_len);
@ -703,7 +685,7 @@ _ecore_dbus_message_marshal_string(unsigned char **buf,
*old_length += 1; *old_length += 1;
str_len = strlen(str); str_len = strlen(str);
_ecore_dbus_message_4byte_padding(buf, old_length); _ecore_dbus_message_padding(buf, old_length, 4);
_ecore_dbus_message_increase_length(buf, *old_length + 4); _ecore_dbus_message_increase_length(buf, *old_length + 4);
f = _ecore_dbus_message_new_field(ECORE_DBUS_DATA_TYPE_STRING, *old_length); f = _ecore_dbus_message_new_field(ECORE_DBUS_DATA_TYPE_STRING, *old_length);
_ecore_dbus_message_append_uint32(*buf + *old_length, str_len); _ecore_dbus_message_append_uint32(*buf + *old_length, str_len);
@ -715,21 +697,63 @@ _ecore_dbus_message_marshal_string(unsigned char **buf,
return f; return f;
} }
#if 0
static Ecore_DBus_Message_Field * static Ecore_DBus_Message_Field *
_ecore_dbus_message_marshal_array(unsigned char **msg, unsigned int *old_length) _ecore_dbus_message_marshal_array(unsigned char **buf, unsigned int *old_length,
Ecore_DBus_Data_Type contained_type)
{ {
/* TODO: complete this */
Ecore_DBus_Message_Field *f; Ecore_DBus_Message_Field *f;
_ecore_dbus_message_8byte_padding(msg, old_length); /* increase the length with 1 + contained length */
_ecore_dbus_message_increase_length(buf, *old_length + 1);
/* append the data type */
_ecore_dbus_message_append_byte(*buf + *old_length, ECORE_DBUS_DATA_TYPE_ARRAY);
*old_length += 1;
/* for the array length value */ /* for the array length value */
_ecore_dbus_message_increase_length(msg, *old_length + 4); _ecore_dbus_message_padding(buf, old_length, 4);
_ecore_dbus_message_increase_length(buf, *old_length + 4);
f = _ecore_dbus_message_new_field(ECORE_DBUS_DATA_TYPE_ARRAY, *old_length); f = _ecore_dbus_message_new_field(ECORE_DBUS_DATA_TYPE_ARRAY, *old_length);
*old_length += 4; *old_length += 4;
/* pad for contained type */
_ecore_dbus_message_padding(buf, old_length, _ecore_dbus_alignment_get(contained_type));
return f;
}
static Ecore_DBus_Message_Field *
_ecore_dbus_message_marshal_struct_begin(unsigned char **buf, unsigned int *old_length)
{
Ecore_DBus_Message_Field *f;
/* increase the length with 1 */
_ecore_dbus_message_increase_length(buf, *old_length + 1);
/* append the data type */
_ecore_dbus_message_append_byte(*buf + *old_length, ECORE_DBUS_DATA_TYPE_STRUCT_BEGIN);
*old_length += 1;
/* padding */
_ecore_dbus_message_padding(buf, old_length, 8);
f = _ecore_dbus_message_new_field(ECORE_DBUS_DATA_TYPE_STRUCT, *old_length);
return f;
}
static Ecore_DBus_Message_Field *
_ecore_dbus_message_marshal_struct_end(unsigned char **buf, unsigned int *old_length)
{
Ecore_DBus_Message_Field *f;
/* increase the length with 1 */
_ecore_dbus_message_increase_length(buf, *old_length + 1);
/* append the data type */
_ecore_dbus_message_append_byte(*buf + *old_length, ECORE_DBUS_DATA_TYPE_STRUCT_END);
*old_length += 1;
f = _ecore_dbus_message_new_field(ECORE_DBUS_DATA_TYPE_STRUCT, *old_length);
return f; return f;
} }
#endif
static Ecore_DBus_Message_Field * static Ecore_DBus_Message_Field *
_ecore_dbus_message_marshal_data(unsigned char **buf, unsigned int *old_length, _ecore_dbus_message_marshal_data(unsigned char **buf, unsigned int *old_length,
@ -737,11 +761,16 @@ _ecore_dbus_message_marshal_data(unsigned char **buf, unsigned int *old_length,
{ {
Ecore_DBus_Message_Field *f = NULL; Ecore_DBus_Message_Field *f = NULL;
_ecore_dbus_message_increase_length(buf, *old_length + 1);
/* append the signature length */
_ecore_dbus_message_append_byte(*buf + *old_length, 1);
*old_length += 1;
switch (type) switch (type)
{ {
case ECORE_DBUS_DATA_TYPE_UINT32: case ECORE_DBUS_DATA_TYPE_UINT32:
f = _ecore_dbus_message_marshal_uint32(buf, old_length, f = _ecore_dbus_message_marshal_uint32(buf, old_length,
*(unsigned long *)data); *(unsigned int *)data);
break; break;
case ECORE_DBUS_DATA_TYPE_STRING: case ECORE_DBUS_DATA_TYPE_STRING:
f = _ecore_dbus_message_marshal_string(buf, old_length, f = _ecore_dbus_message_marshal_string(buf, old_length,
@ -764,7 +793,11 @@ _ecore_dbus_message_marshal_data(unsigned char **buf, unsigned int *old_length,
case ECORE_DBUS_DATA_TYPE_ARRAY: case ECORE_DBUS_DATA_TYPE_ARRAY:
case ECORE_DBUS_DATA_TYPE_VARIANT: case ECORE_DBUS_DATA_TYPE_VARIANT:
case ECORE_DBUS_DATA_TYPE_STRUCT: 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:
case ECORE_DBUS_DATA_TYPE_DICT_ENTRY_BEGIN:
case ECORE_DBUS_DATA_TYPE_DICT_ENTRY_END:
#if 0 #if 0
default: default:
#endif #endif
@ -782,11 +815,13 @@ _ecore_dbus_message_marshal_custom_header(unsigned char **buf,
{ {
Ecore_DBus_Message_Field *f; Ecore_DBus_Message_Field *f;
_ecore_dbus_message_padding(buf, old_length, 8);
/* increase the length + 1, old_length changed */ /* increase the length + 1, old_length changed */
_ecore_dbus_message_increase_length(buf, *old_length + 1); _ecore_dbus_message_increase_length(buf, *old_length + 1);
/* append header field name at cur_length */ /* append header field name at cur_length */
_ecore_dbus_message_append_byte(*buf + *old_length, code); _ecore_dbus_message_append_byte(*buf + *old_length, code);
*old_length += 1; *old_length += 1;
/* marshal header field data */ /* marshal header field data */
f = _ecore_dbus_message_marshal_data(buf, old_length, type, data); f = _ecore_dbus_message_marshal_data(buf, old_length, type, data);
f->hfield = code; f->hfield = code;
@ -801,7 +836,7 @@ _ecore_dbus_message_unmarshal_int32(unsigned char *buf,
{ {
Ecore_DBus_Message_Field *f; Ecore_DBus_Message_Field *f;
_ecore_dbus_message_skip_4byte_padding(old_length); _ecore_dbus_message_padding_skip(old_length, 4);
f = _ecore_dbus_message_new_field(ECORE_DBUS_DATA_TYPE_INT32, *old_length); f = _ecore_dbus_message_new_field(ECORE_DBUS_DATA_TYPE_INT32, *old_length);
*old_length += 4; *old_length += 4;
return f; return f;
@ -813,7 +848,7 @@ _ecore_dbus_message_unmarshal_uint32(unsigned char *buf,
{ {
Ecore_DBus_Message_Field *f; Ecore_DBus_Message_Field *f;
_ecore_dbus_message_skip_4byte_padding(old_length); _ecore_dbus_message_padding_skip(old_length, 4);
f = _ecore_dbus_message_new_field(ECORE_DBUS_DATA_TYPE_UINT32, *old_length); f = _ecore_dbus_message_new_field(ECORE_DBUS_DATA_TYPE_UINT32, *old_length);
*old_length += 4; *old_length += 4;
return f; return f;
@ -824,9 +859,9 @@ _ecore_dbus_message_unmarshal_string(unsigned char *buf,
unsigned int *old_length) unsigned int *old_length)
{ {
Ecore_DBus_Message_Field *f; Ecore_DBus_Message_Field *f;
unsigned long str_len; unsigned int str_len;
_ecore_dbus_message_skip_4byte_padding(old_length); _ecore_dbus_message_padding_skip(old_length, 4);
f = _ecore_dbus_message_new_field(ECORE_DBUS_DATA_TYPE_STRING, *old_length); f = _ecore_dbus_message_new_field(ECORE_DBUS_DATA_TYPE_STRING, *old_length);
str_len = _ecore_dbus_message_read_uint32(buf + *old_length); str_len = _ecore_dbus_message_read_uint32(buf + *old_length);
*old_length += 4; *old_length += 4;
@ -838,9 +873,9 @@ static Ecore_DBus_Message_Field *
_ecore_dbus_message_unmarshal_object_path(unsigned char *buf, unsigned int *old_length) _ecore_dbus_message_unmarshal_object_path(unsigned char *buf, unsigned int *old_length)
{ {
Ecore_DBus_Message_Field *f; Ecore_DBus_Message_Field *f;
unsigned long str_len; unsigned int str_len;
_ecore_dbus_message_skip_4byte_padding(old_length); _ecore_dbus_message_padding_skip(old_length, 4);
f = _ecore_dbus_message_new_field(ECORE_DBUS_DATA_TYPE_OBJECT_PATH, f = _ecore_dbus_message_new_field(ECORE_DBUS_DATA_TYPE_OBJECT_PATH,
*old_length); *old_length);
str_len = _ecore_dbus_message_read_uint32(buf + *old_length); str_len = _ecore_dbus_message_read_uint32(buf + *old_length);
@ -849,15 +884,29 @@ _ecore_dbus_message_unmarshal_object_path(unsigned char *buf, unsigned int *old_
return f; return f;
} }
static Ecore_DBus_Message_Field *
_ecore_dbus_message_unmarshal_signature(unsigned char *buf,
unsigned int *old_length)
{
Ecore_DBus_Message_Field *f;
unsigned int str_len;
f = _ecore_dbus_message_new_field(ECORE_DBUS_DATA_TYPE_SIGNATURE, *old_length);
str_len = _ecore_dbus_message_read_byte(buf + *old_length);
*old_length += 1;
*old_length += str_len + 1;
return f;
}
static Ecore_DBus_Message_Field * static Ecore_DBus_Message_Field *
_ecore_dbus_message_unmarshal_data(unsigned char *buf, unsigned int *old_length) _ecore_dbus_message_unmarshal_data(unsigned char *buf, unsigned int *old_length)
{ {
Ecore_DBus_Message_Field *f = NULL; Ecore_DBus_Message_Field *f = NULL;
unsigned char type; Ecore_DBus_Data_Type type;
type = _ecore_dbus_message_read_byte(buf + *old_length); type = _ecore_dbus_message_read_byte(buf + *old_length);
*old_length += 1; *old_length += 1;
switch (type) switch (type)
{ {
case ECORE_DBUS_DATA_TYPE_INT32: case ECORE_DBUS_DATA_TYPE_INT32:
@ -872,14 +921,25 @@ _ecore_dbus_message_unmarshal_data(unsigned char *buf, unsigned int *old_length)
case ECORE_DBUS_DATA_TYPE_OBJECT_PATH: case ECORE_DBUS_DATA_TYPE_OBJECT_PATH:
f = _ecore_dbus_message_unmarshal_object_path(buf, old_length); f = _ecore_dbus_message_unmarshal_object_path(buf, old_length);
break; break;
case ECORE_DBUS_DATA_TYPE_SIGNATURE:
f = _ecore_dbus_message_unmarshal_signature(buf, old_length);
break;
case ECORE_DBUS_DATA_TYPE_INVALID:
case ECORE_DBUS_DATA_TYPE_BYTE: case ECORE_DBUS_DATA_TYPE_BYTE:
case ECORE_DBUS_DATA_TYPE_BOOLEAN: case ECORE_DBUS_DATA_TYPE_BOOLEAN:
case ECORE_DBUS_DATA_TYPE_INT16:
case ECORE_DBUS_DATA_TYPE_UINT16:
case ECORE_DBUS_DATA_TYPE_INT64: case ECORE_DBUS_DATA_TYPE_INT64:
case ECORE_DBUS_DATA_TYPE_UINT64: case ECORE_DBUS_DATA_TYPE_UINT64:
case ECORE_DBUS_DATA_TYPE_DOUBLE: case ECORE_DBUS_DATA_TYPE_DOUBLE:
case ECORE_DBUS_DATA_TYPE_ARRAY: 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:
case ECORE_DBUS_DATA_TYPE_INVALID: case ECORE_DBUS_DATA_TYPE_DICT_ENTRY_BEGIN:
case ECORE_DBUS_DATA_TYPE_DICT_ENTRY_END:
#if 0 #if 0
default: default:
#endif #endif
@ -894,21 +954,28 @@ _ecore_dbus_message_unmarshal_custom_header(unsigned char *buf,
unsigned int *old_length) unsigned int *old_length)
{ {
Ecore_DBus_Message_Field *f; Ecore_DBus_Message_Field *f;
unsigned int code; unsigned int code, length;
_ecore_dbus_message_padding_skip(old_length, 8);
/* get header field name at cur_length */ /* get header field name at cur_length */
code = _ecore_dbus_message_read_byte(buf + *old_length); code = _ecore_dbus_message_read_byte(buf + *old_length);
*old_length += 1; *old_length += 1;
/* Read signature length */
length = _ecore_dbus_message_read_byte(buf + *old_length);
if (length != 1)
fprintf(stderr, "[ecore_dbus]: Wrong signature length in header\n");
*old_length += 1;
/* unmarshal header field data */ /* unmarshal header field data */
f = _ecore_dbus_message_unmarshal_data(buf, old_length); f = _ecore_dbus_message_unmarshal_data(buf, old_length);
f->hfield = code; if (f) f->hfield = code;
return f; return f;
} }
static Ecore_DBus_Message * static Ecore_DBus_Message *
_ecore_dbus_message_unmarshal(Ecore_DBus_Server *svr, unsigned char *message) _ecore_dbus_message_unmarshal(Ecore_DBus_Server *svr, unsigned char *message)
{ {
Ecore_DBus_Message_Field *f; Ecore_DBus_Message_Field *f, *sig;
/* init */ /* init */
Ecore_DBus_Message *msg = _ecore_dbus_message_new(svr); Ecore_DBus_Message *msg = _ecore_dbus_message_new(svr);
@ -922,35 +989,92 @@ _ecore_dbus_message_unmarshal(Ecore_DBus_Server *svr, unsigned char *message)
msg->type = *(message + 1); msg->type = *(message + 1);
msg->flags = *(message + 2); msg->flags = *(message + 2);
msg->protocol = *(message + 3); msg->protocol = *(message + 3);
msg->hlength = *(unsigned long *)(message + 4); msg->blength = *(unsigned int *)(message + 4);
msg->blength = *(unsigned long *)(message + 8); msg->serial = *(unsigned int *)(message + 8);
msg->serial = *(unsigned long *)(message + 12); msg->hlength = *(unsigned int *)(message + 12) + 16;
_ecore_dbus_message_padding_skip(&(msg->hlength), 8);
if (msg->type == ECORE_DBUS_MESSAGE_TYPE_INVALID) if (msg->type == ECORE_DBUS_MESSAGE_TYPE_INVALID)
{ {
printf("[ecore_dbus] message type invalid\n"); printf("[ecore_dbus] message type invalid\n");
return NULL; return NULL;
} }
msg->hpos += 16;
/* memcpy the header part */ /* memcpy the header part */
_ecore_dbus_message_increase_length(&msg->header, msg->hlength); _ecore_dbus_message_increase_length(&msg->header, msg->hlength);
_ecore_dbus_message_append_nbytes(msg->header, message, msg->hlength); _ecore_dbus_message_append_nbytes(msg->header, message, msg->hlength);
msg->hpos += 16;
/* custom fields */ /* custom fields */
sig = NULL;
while ((msg->hpos + 8 - (msg->hpos % 8)) < msg->hlength) while ((msg->hpos + 8 - (msg->hpos % 8)) < msg->hlength)
{ {
f = _ecore_dbus_message_unmarshal_custom_header(message, &msg->hpos); f = _ecore_dbus_message_unmarshal_custom_header(message, &msg->hpos);
msg->header_fields = _ecore_list2_append(msg->header_fields, f); if (f)
{
msg->header_fields = _ecore_list2_append(msg->header_fields, f);
if (f->type == ECORE_DBUS_DATA_TYPE_SIGNATURE)
sig = f;
}
} }
msg->hpos = msg->hlength; msg->hpos = msg->hlength;
message += msg->hlength;
/* message body */ /* message body */
message += msg->hlength; if (sig)
_ecore_dbus_message_increase_length(&msg->body, msg->blength);
_ecore_dbus_message_append_nbytes(msg->body, message, msg->blength);
while (msg->bpos < msg->blength)
{ {
f = _ecore_dbus_message_unmarshal_data(message, &msg->bpos); unsigned char *s;
msg->body_fields = _ecore_list2_append(msg->body_fields, f); Ecore_DBus_Data_Type type;
_ecore_dbus_message_increase_length(&msg->body, msg->blength);
_ecore_dbus_message_append_nbytes(msg->body, message, msg->blength);
s = msg->header + sig->offset + 2;
while (*s)
{
f = NULL;
printf("body: %c\n", *s);
type = *s;
switch (type)
{
case ECORE_DBUS_DATA_TYPE_INT32:
f = _ecore_dbus_message_unmarshal_int32(msg->body, &(msg->bpos));
break;
case ECORE_DBUS_DATA_TYPE_UINT32:
f = _ecore_dbus_message_unmarshal_uint32(msg->body, &(msg->bpos));
break;
case ECORE_DBUS_DATA_TYPE_STRING:
f = _ecore_dbus_message_unmarshal_string(msg->body, &(msg->bpos));
break;
case ECORE_DBUS_DATA_TYPE_OBJECT_PATH:
f = _ecore_dbus_message_unmarshal_object_path(msg->body, &(msg->bpos));
break;
case ECORE_DBUS_DATA_TYPE_SIGNATURE:
f = _ecore_dbus_message_unmarshal_signature(msg->body, &(msg->bpos));
break;
case ECORE_DBUS_DATA_TYPE_INVALID:
case ECORE_DBUS_DATA_TYPE_BYTE:
case ECORE_DBUS_DATA_TYPE_BOOLEAN:
case ECORE_DBUS_DATA_TYPE_INT16:
case ECORE_DBUS_DATA_TYPE_UINT16:
case ECORE_DBUS_DATA_TYPE_INT64:
case ECORE_DBUS_DATA_TYPE_UINT64:
case ECORE_DBUS_DATA_TYPE_DOUBLE:
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
printf("[ecore_dbus] unknown/unhandled data type %c\n", type);
break;
}
if (f)
msg->body_fields = _ecore_list2_append(msg->body_fields, f);
s++;
}
} }
return msg; return msg;
} }
@ -960,7 +1084,7 @@ _ecore_dbus_message_unmarshal(Ecore_DBus_Server *svr, unsigned char *message)
static void static void
_ecore_dbus_message_common_header(Ecore_DBus_Message *msg, int type, int flags) _ecore_dbus_message_common_header(Ecore_DBus_Message *msg, int type, int flags)
{ {
/* the body,header length arent filled only alloc */ /* the body, header length arent filled only alloc */
_ecore_dbus_message_append_length(&msg->header, msg->hpos, 16); _ecore_dbus_message_append_length(&msg->header, msg->hpos, 16);
/* endiannes (1) */ /* endiannes (1) */
msg->header[0] = msg->byte_order = 'l'; msg->header[0] = msg->byte_order = 'l';
@ -969,16 +1093,17 @@ _ecore_dbus_message_common_header(Ecore_DBus_Message *msg, int type, int flags)
/* flags (1) 0x1 = no reply expected, 0x2 auto activiation */ /* flags (1) 0x1 = no reply expected, 0x2 auto activiation */
msg->header[2] = msg->flags = 0x0; msg->header[2] = msg->flags = 0x0;
/* protocol (1) */ /* protocol (1) */
msg->header[3] = msg->protocol = 0x0; msg->header[3] = msg->protocol = 0x1;
/* autoincrement the client_serial (0 is invalid) */ /* autoincrement the client_serial (0 is invalid) */
msg->ref_server->cnt_msg++; msg->ref_server->cnt_msg++;
*(msg->header + 12) = msg->serial = msg->ref_server->cnt_msg; *(unsigned int *)(msg->header + 8) = msg->serial = msg->ref_server->cnt_msg;
*(msg->header + 12) = ECORE_DBUS_DATA_TYPE_INT16;
msg->hpos = 16; msg->hpos = 16;
} }
static void * static void *
_ecore_dbus_get_field(unsigned char *buf, Ecore_DBus_Message_Field *f) _ecore_dbus_field_get(unsigned char *buf, Ecore_DBus_Message_Field *f)
{ {
switch (f->type) switch (f->type)
{ {
@ -997,12 +1122,18 @@ _ecore_dbus_get_field(unsigned char *buf, Ecore_DBus_Message_Field *f)
case ECORE_DBUS_DATA_TYPE_OBJECT_PATH: case ECORE_DBUS_DATA_TYPE_OBJECT_PATH:
return buf + f->offset + 4; return buf + f->offset + 4;
break; break;
case ECORE_DBUS_DATA_TYPE_INVALID:
case ECORE_DBUS_DATA_TYPE_SIGNATURE: case ECORE_DBUS_DATA_TYPE_SIGNATURE:
return buf + f->offset + 1;
break;
case ECORE_DBUS_DATA_TYPE_INVALID:
case ECORE_DBUS_DATA_TYPE_ARRAY: case ECORE_DBUS_DATA_TYPE_ARRAY:
case ECORE_DBUS_DATA_TYPE_VARIANT: case ECORE_DBUS_DATA_TYPE_VARIANT:
case ECORE_DBUS_DATA_TYPE_STRUCT: 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:
case ECORE_DBUS_DATA_TYPE_DICT_ENTRY_BEGIN:
case ECORE_DBUS_DATA_TYPE_DICT_ENTRY_END:
#if 0 #if 0
default: default:
#endif #endif
@ -1183,9 +1314,9 @@ _ecore_dbus_event_server_data(void *udata, int ev_type, void *ev)
if (msg == NULL) break; if (msg == NULL) break;
offset += msg->hlength + msg->blength; offset += msg->hlength + msg->blength;
e->size -= msg->hlength + msg->blength; e->size -= msg->hlength + msg->blength;
printf("[ecore_dbus] dbus message length %lu bytes, still %d\n", printf("[ecore_dbus] dbus message length %u bytes, still %d\n",
msg->hlength + msg->blength, e->size); msg->hlength + msg->blength, e->size);
/*ecore_dbus_message_print(msg); */ ecore_dbus_message_print(msg);
ecore_event_add(ECORE_DBUS_EVENT_SERVER_DATA, msg, _ecore_dbus_message_free, NULL); ecore_event_add(ECORE_DBUS_EVENT_SERVER_DATA, msg, _ecore_dbus_message_free, NULL);
} }
} }
@ -1203,34 +1334,39 @@ _ecore_dbus_message_print_field(Ecore_DBus_Message_Field *f, unsigned char *buf)
{ {
case ECORE_DBUS_DATA_TYPE_BYTE: case ECORE_DBUS_DATA_TYPE_BYTE:
printf printf
("[ecore_dbus] field BYTE : value offset = %d value = %d\n", ("[ecore_dbus] field BYTE: value offset = %d value = %d\n",
f->offset, (char)*(buf + f->offset)); f->offset, (char)*(buf + f->offset));
break; break;
case ECORE_DBUS_DATA_TYPE_INT32: case ECORE_DBUS_DATA_TYPE_INT32:
printf printf
("[ecore_dbus] field INT32 : value offset = %d value = %ld\n", ("[ecore_dbus] field INT32: value offset = %d value = %d\n",
f->offset, (long int)*(buf + f->offset)); f->offset, (int)*(buf + f->offset));
break; break;
case ECORE_DBUS_DATA_TYPE_UINT32: case ECORE_DBUS_DATA_TYPE_UINT32:
printf printf
("[ecore_dbus] field UINT32 : value offset = %d value = %lu\n", ("[ecore_dbus] field UINT32: value offset = %d value = %u\n",
f->offset, (unsigned long int)*(buf + f->offset)); f->offset, (unsigned int)*(buf + f->offset));
break; break;
case ECORE_DBUS_DATA_TYPE_STRING: case ECORE_DBUS_DATA_TYPE_STRING:
printf printf
("[ecore_dbus] field STRING : value offset = %d length = %d value = %s\n", ("[ecore_dbus] field STRING: value offset = %d length = %d value = %s\n",
f->offset, *(buf + f->offset), (buf + f->offset + 4)); f->offset, *(buf + f->offset), (buf + f->offset + 4));
break; break;
case ECORE_DBUS_DATA_TYPE_OBJECT_PATH: case ECORE_DBUS_DATA_TYPE_OBJECT_PATH:
printf printf
("[ecore_dbus] field PATH : value offset = %d length = %d value = %s\n", ("[ecore_dbus] field PATH: value offset = %d length = %d value = %s\n",
f->offset, *(buf + f->offset), (buf + f->offset + 4)); f->offset, *(buf + f->offset), (buf + f->offset + 4));
break; break;
case ECORE_DBUS_DATA_TYPE_SIGNATURE:
printf
("[ecore_dbus] field SIGNATURE : value offset = %d length = %d value = %s\n",
f->offset, *(buf + f->offset), (buf + f->offset + 1));
break;
case ECORE_DBUS_DATA_TYPE_ARRAY: case ECORE_DBUS_DATA_TYPE_ARRAY:
{ {
printf printf
("[ecore_dbus] field ARRAY : value offset = %d length = %lu elements = %u\n", ("[ecore_dbus] field ARRAY : value offset = %d length = %u elements = %u\n",
f->offset, *(unsigned long int *)(buf + f->offset), f->count); f->offset, *(unsigned int *)(buf + f->offset), f->count);
printf("[ecore_dbus] * ARRAY elements begin *\n"); printf("[ecore_dbus] * ARRAY elements begin *\n");
f = (Ecore_DBus_Message_Field *)((Ecore_List2 *)f)->next; f = (Ecore_DBus_Message_Field *)((Ecore_List2 *)f)->next;
for (i = 0; i < f->count; i++) for (i = 0; i < f->count; i++)
@ -1246,10 +1382,13 @@ _ecore_dbus_message_print_field(Ecore_DBus_Message_Field *f, unsigned char *buf)
case ECORE_DBUS_DATA_TYPE_INT64: case ECORE_DBUS_DATA_TYPE_INT64:
case ECORE_DBUS_DATA_TYPE_UINT64: case ECORE_DBUS_DATA_TYPE_UINT64:
case ECORE_DBUS_DATA_TYPE_DOUBLE: case ECORE_DBUS_DATA_TYPE_DOUBLE:
case ECORE_DBUS_DATA_TYPE_SIGNATURE:
case ECORE_DBUS_DATA_TYPE_VARIANT: case ECORE_DBUS_DATA_TYPE_VARIANT:
case ECORE_DBUS_DATA_TYPE_STRUCT: 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:
case ECORE_DBUS_DATA_TYPE_DICT_ENTRY_BEGIN:
case ECORE_DBUS_DATA_TYPE_DICT_ENTRY_END:
/* TODO */ /* TODO */
printf("[ecore_dbus] field not implemented: %c\n", f->type); printf("[ecore_dbus] field not implemented: %c\n", f->type);
break; break;
@ -1310,3 +1449,35 @@ _ecore_dbus_message_print_raw(unsigned char *msg, unsigned int msg_len)
printf("[ecore_dbus] end raw message\n"); printf("[ecore_dbus] end raw message\n");
} }
*/ */
static int
_ecore_dbus_alignment_get(Ecore_DBus_Data_Type type)
{
switch (type)
{
case ECORE_DBUS_DATA_TYPE_BYTE:
case ECORE_DBUS_DATA_TYPE_SIGNATURE:
case ECORE_DBUS_DATA_TYPE_VARIANT:
return 1;
case ECORE_DBUS_DATA_TYPE_INT16:
case ECORE_DBUS_DATA_TYPE_UINT16:
return 2;
case ECORE_DBUS_DATA_TYPE_BOOLEAN:
case ECORE_DBUS_DATA_TYPE_INT32:
case ECORE_DBUS_DATA_TYPE_UINT32:
case ECORE_DBUS_DATA_TYPE_STRING:
case ECORE_DBUS_DATA_TYPE_OBJECT_PATH:
case ECORE_DBUS_DATA_TYPE_ARRAY:
return 4;
case ECORE_DBUS_DATA_TYPE_INT64:
case ECORE_DBUS_DATA_TYPE_UINT64:
case ECORE_DBUS_DATA_TYPE_DOUBLE:
return 8;
case ECORE_DBUS_DATA_TYPE_STRUCT:
case ECORE_DBUS_DATA_TYPE_DICT_ENTRY:
return 8;
default:
fprintf(stderr, "Ecore_DBus: Alignment requested for invalid data type!\n");
return 0;
}
}

View File

@ -42,9 +42,9 @@ struct _Ecore_DBus_Message
unsigned char type; unsigned char type;
unsigned char flags; unsigned char flags;
unsigned char protocol; unsigned char protocol;
unsigned long hlength; unsigned int hlength;
unsigned long blength; unsigned int blength;
unsigned long serial; unsigned int serial;
Ecore_DBus_Server *ref_server; Ecore_DBus_Server *ref_server;