Enlightenment CVS committal

Author  : rephorm
Project : e17
Module  : libs/ecore

Dir     : e17/libs/ecore/src/lib/ecore_dbus


Modified Files:
        Ecore_DBus.h Makefile.am ecore_dbus.c ecore_dbus_message.c 
        ecore_dbus_methods.c ecore_dbus_private.h ecore_dbus_utils.c 


Log Message:

Add abstract socket namespace support to ecore_con.
Lots of work on ecore_dbus
Hilights:
  - get the socket address for system/session/startup busses from the 
environment
  - can request/release a bus name
  - receive method calls (we need to add a way to register callbacks for 
specific methods)
  - send signals and method replies (untested)

*** API BREAKAGE ***
ecore_dbus_message_new_method_call() - the 'destination' param has moved to 
after the 'method' param to keep things consistent with newly supported message 
types and the param ordering in the spec.

===================================================================
RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore_dbus/Ecore_DBus.h,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -3 -r1.15 -r1.16
--- Ecore_DBus.h        27 Jul 2006 15:28:44 -0000      1.15
+++ Ecore_DBus.h        24 Sep 2006 07:24:52 -0000      1.16
@@ -3,7 +3,9 @@
  */
 #ifndef _ECORE_DBUS_H
 #define _ECORE_DBUS_H
-#endif
+
+#include "Ecore_Data.h"
+#include "Ecore_Con.h"
 
 #ifdef EAPI
 #undef EAPI
@@ -36,18 +38,13 @@
    typedef struct _Ecore_DBus_Event_Server_Add  Ecore_DBus_Event_Server_Add;
    typedef struct _Ecore_DBus_Event_Server_Del  Ecore_DBus_Event_Server_Del;
    typedef struct _Ecore_DBus_Event_Server_Data Ecore_DBus_Event_Server_Data;
-   typedef struct _Ecore_DBus_Event_Server_Data Ecore_DBus_Event_Server_Signal;
+   typedef struct _Ecore_DBus_Event_Server_Data Ecore_DBus_Event_Signal;
+   typedef struct _Ecore_DBus_Event_Server_Data Ecore_DBus_Event_Method_Call;
    typedef struct _Ecore_DBus_Event_Server_Data Ecore_DBus_Method_Return;
    typedef struct _Ecore_DBus_Message           Ecore_DBus_Message;
    typedef struct _Ecore_DBus_Message_Arg       Ecore_DBus_Message_Arg;
    typedef struct _Ecore_DBus_Message_Field     Ecore_DBus_Message_Field;
-
-   typedef enum _Ecore_DBus_Type
-     {
-       ECORE_DBUS_BUS_SESSION,
-       ECORE_DBUS_BUS_SYSTEM,
-       ECORE_DBUS_BUS_ACTIVATION
-     } Ecore_DBus_Type;
+   typedef struct _Ecore_DBus_Address           Ecore_DBus_Address;
 
    typedef enum _Ecore_DBus_Message_Type
      {
@@ -58,6 +55,12 @@
        ECORE_DBUS_MESSAGE_TYPE_SIGNAL
      } Ecore_DBus_Message_Type;
 
+   typedef enum _Ecore_DBus_Message_Flag
+     {
+       ECORE_DBUS_MESSAGE_FLAG_NO_REPLY_EXPECTED,
+       ECORE_DBUS_MESSAGE_FLAG_NO_AUTO_START
+     } Ecore_DBus_Message_Flag;
+
    typedef enum _Ecore_DBus_Data_Type
      {
        ECORE_DBUS_DATA_TYPE_INVALID          = ((int) '\0'),
@@ -130,9 +133,18 @@
        ECORE_DBUS_HEADER_FIELD_SIGNATURE
      } Ecore_DBus_Message_Header_Field;
 
+
+   struct _Ecore_DBus_Address 
+     {
+       char *transport;
+       Ecore_List *keys;
+       Ecore_List *vals;
+     };
+
    EAPI extern int ECORE_DBUS_EVENT_SERVER_ADD;
    EAPI extern int ECORE_DBUS_EVENT_SERVER_DEL;
-   EAPI extern int ECORE_DBUS_EVENT_SERVER_SIGNAL;
+   EAPI extern int ECORE_DBUS_EVENT_METHOD_CALL;
+   EAPI extern int ECORE_DBUS_EVENT_SIGNAL;
 
    /* callback */
    typedef void (*Ecore_DBus_Method_Return_Cb)(void *data, 
Ecore_DBus_Method_Return *reply);
@@ -143,19 +155,39 @@
    EAPI int ecore_dbus_shutdown(void);
 
    /* connection */
-   EAPI Ecore_DBus_Server *ecore_dbus_server_connect(Ecore_DBus_Type type, 
char *name, int port, const void *data);
+   EAPI Ecore_DBus_Server *ecore_dbus_server_system_connect(const void *data);
+   EAPI Ecore_DBus_Server *ecore_dbus_server_session_connect(const void *data);
+   EAPI Ecore_DBus_Server *ecore_dbus_server_starter_connect(const void *data);
+
+   EAPI Ecore_DBus_Server *ecore_dbus_server_connect(Ecore_Con_Type type, 
const char *name, int port, const void *data);
+
+
    EAPI void               ecore_dbus_server_del(Ecore_DBus_Server *svr);
 
 
    /* message */
    EAPI int           ecore_dbus_server_send(Ecore_DBus_Server *svr, char 
*command, int length);
-   EAPI unsigned int  ecore_dbus_message_new_method_call(Ecore_DBus_Server 
*svr,
-                                                        char *destination, 
char *path,
-                                                        char *interface, char 
*method,
-                                                        
Ecore_DBus_Method_Return_Cb method_cb,
-                                                        Ecore_DBus_Error_Cb 
error_cb,
-                                                        void *data,
-                                                        char *fmt, ...);
+
+   EAPI unsigned int ecore_dbus_message_new_method_call(Ecore_DBus_Server 
*svr, 
+                                        char *path, char *interface,
+                                        char *method, char *destination, 
+                                        Ecore_DBus_Method_Return_Cb method_cb,
+                                        Ecore_DBus_Error_Cb error_cb,
+                                        void *data,
+                                        char *signature, ...);
+   EAPI unsigned int ecore_dbus_message_new_method_return(Ecore_DBus_Server 
*svr,
+                                        int reply_serial, char *destination,
+                                        char *signature, ...);
+   EAPI unsigned int ecore_dbus_message_new_error(Ecore_DBus_Server *svr, 
+                                        char *error_name,
+                                        int reply_serial, char *destination,
+                                        char *signature, ...);
+   EAPI unsigned int ecore_dbus_message_new_signal(Ecore_DBus_Server *svr,
+                                        char *path,
+                                        char *interface, char *signal_name,
+                                        char *destination, void *data,
+                                        char *signature, ...);
+
    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);
@@ -170,7 +202,22 @@
    EAPI int ecore_dbus_method_get_connection_unix_user(Ecore_DBus_Server *svr, 
char *connection, Ecore_DBus_Method_Return_Cb method_cb, Ecore_DBus_Error_Cb, 
void *data);
    EAPI int ecore_dbus_method_add_match(Ecore_DBus_Server *svr, char *match, 
Ecore_DBus_Method_Return_Cb method_cb, Ecore_DBus_Error_Cb, void *data);
    EAPI int ecore_dbus_method_remove_match(Ecore_DBus_Server *svr, char 
*match, Ecore_DBus_Method_Return_Cb method_cb, Ecore_DBus_Error_Cb, void *data);
+   EAPI int ecore_dbus_method_request_name(Ecore_DBus_Server *svr, char *name, 
int flags, Ecore_DBus_Method_Return_Cb method_cb, Ecore_DBus_Error_Cb, void 
*data);
+   EAPI int ecore_dbus_method_release_name(Ecore_DBus_Server *svr, char *name, 
Ecore_DBus_Method_Return_Cb method_cb, Ecore_DBus_Error_Cb, void *data);
+
+   /* addresses */
+   EAPI Ecore_DBus_Address *ecore_dbus_address_new();
+   EAPI void                ecore_dbus_address_free(Ecore_DBus_Address 
*address);
+
+   EAPI Ecore_List         *ecore_dbus_address_parse(const char *address);
+
+   EAPI char               *ecore_dbus_address_value_get(Ecore_DBus_Address 
*address,
+                                                        char *key);
+   EAPI void                ecore_dbus_print_address_list(Ecore_List 
*addresses);
+   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);
 
 #ifdef __cplusplus
 }
+#endif
 #endif
===================================================================
RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore_dbus/Makefile.am,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -3 -r1.6 -r1.7
--- Makefile.am 25 Jul 2006 14:34:47 -0000      1.6
+++ Makefile.am 24 Sep 2006 07:24:52 -0000      1.7
@@ -26,6 +26,7 @@
 ecore_dbus_unmarshal.c \
 ecore_dbus_methods.c \
 ecore_dbus_utils.c \
+ecore_dbus_address.c \
 ecore_dbus_private.h
 
 libecore_dbus_la_LIBADD = \
===================================================================
RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore_dbus/ecore_dbus.c,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -3 -r1.22 -r1.23
--- ecore_dbus.c        27 Jul 2006 15:34:16 -0000      1.22
+++ ecore_dbus.c        24 Sep 2006 07:24:52 -0000      1.23
@@ -1,6 +1,7 @@
 /*
  * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
  */
+#include "config.h"
 #include "Ecore.h"
 #include "ecore_private.h"
 #include "Ecore_Con.h"
@@ -11,7 +12,8 @@
 /* About                                                                       
*/
 
/********************************************************************************/
 /* Author: Jorge Luis Zapata                                                   
*/
-/* Version: 0.2.1                                                              
*/
+/* Author: Brian Mattern (rephorm)                                             
*/
+/* Version: 0.3.0                                                              
*/
 
/********************************************************************************/
 /* Todo                                                                        
        */
 
/********************************************************************************/
@@ -37,12 +39,16 @@
 /*                                                                             
*/
 /* 29-03-05                                                                    
*/
 /* 0.2.1 some segfault fixes, new tests                                        
        */
+/* 0.3.0 add ability to send signals, receive method class and respond to them 
 */
+/*       add address parsing and functions to connect to standard busses       
 */
+/*       change API of ecore_dbus_message_new_method_call()                    
*/
 
 /* global variables  */
 
 EAPI int                 ECORE_DBUS_EVENT_SERVER_ADD = 0;
 EAPI int                 ECORE_DBUS_EVENT_SERVER_DEL = 0;
-EAPI int                 ECORE_DBUS_EVENT_SERVER_SIGNAL = 0;
+EAPI int                 ECORE_DBUS_EVENT_SIGNAL = 0;
+EAPI int                 ECORE_DBUS_EVENT_METHOD_CALL = 0;
 
 /* private function declaration */
 
@@ -89,7 +95,8 @@
 
    ECORE_DBUS_EVENT_SERVER_ADD = ecore_event_type_new();
    ECORE_DBUS_EVENT_SERVER_DEL = ecore_event_type_new();
-   ECORE_DBUS_EVENT_SERVER_SIGNAL = ecore_event_type_new();
+   ECORE_DBUS_EVENT_SIGNAL = ecore_event_type_new();
+   ECORE_DBUS_EVENT_METHOD_CALL = ecore_event_type_new();
 
    handler[i++] = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_ADD,
                                          _ecore_dbus_event_server_add, NULL);
@@ -118,37 +125,103 @@
    return init_count;
 }
 
+/**
+ * Connect to the system bus.
+ */
 EAPI Ecore_DBus_Server *
-ecore_dbus_server_connect(Ecore_DBus_Type compl_type, char *name, int port,
+ecore_dbus_server_system_connect(const void *data)
+{
+  Ecore_List *addrs;
+  Ecore_DBus_Server *svr;
+  char *bus_env;
+
+  /* get the system bus address from the environment */
+  bus_env = getenv("DBUS_SYSTEM_BUS_ADDRESS");
+  if (bus_env)
+  {
+    addrs = ecore_dbus_address_parse(bus_env);
+    if (addrs)
+      {
+        svr = ecore_dbus_address_list_connect(addrs, data);
+        ecore_list_destroy(addrs);
+        if (svr) return svr;
+      }
+  }
+
+  /* if we haven't returned already, try the default location */
+  return ecore_dbus_server_connect(ECORE_CON_LOCAL_SYSTEM, 
"/var/run/dbus/system_bus_socket", -1, data);
+}
+
+/**
+ * Connect to the session bus.
+ */
+EAPI Ecore_DBus_Server *
+ecore_dbus_server_session_connect(const void *data)
+{
+  Ecore_List *addrs;
+  Ecore_DBus_Server *svr;
+  char *bus_env;
+
+  /* get the session bus address from the environment */
+  bus_env = getenv("DBUS_SESSION_BUS_ADDRESS");
+  if (bus_env)
+  {
+    addrs = ecore_dbus_address_parse(bus_env);
+    if (addrs)
+      {
+        svr = ecore_dbus_address_list_connect(addrs, data);
+        ecore_list_destroy(addrs);
+        if (svr) return svr;
+      }
+  }
+
+  /*
+   * XXX try getting address from _DBUS_SESSION_BUS_ADDRESS property (STRING) 
set
+   * on the root window 
+   */
+
+  return NULL;
+}
+
+EAPI Ecore_DBus_Server *
+ecore_dbus_server_starter_connect(const void *data)
+{
+  Ecore_List *addrs;
+  Ecore_DBus_Server *svr;
+  char *bus_env;
+
+  /* get the session bus address from the environment */
+  bus_env = getenv("DBUS_STARTER_ADDRESS");
+  if (bus_env)
+  {
+    addrs = ecore_dbus_address_parse(bus_env);
+    if (addrs)
+      {
+        svr = ecore_dbus_address_list_connect(addrs, data);
+        ecore_list_destroy(addrs);
+        if (svr) return svr;
+      }
+  }
+  return NULL;
+}
+
+
+EAPI Ecore_DBus_Server *
+ecore_dbus_server_connect(Ecore_Con_Type con_type, const char *name, int port,
                          const void *data)
 {
+   /* XXX data isn't used! */
    Ecore_DBus_Server  *svr;
-   Ecore_DBus_Type     type;
-   Ecore_Con_Type      extra = 0;
-
+ 
    svr = calloc(1, sizeof(Ecore_DBus_Server));
    if (!svr) return NULL;
-   type = compl_type;
-   switch (type)
-     {
-#if 0
-       /* Get address from DBUS_SESSION_BUS_ADDRESS env */
-     case ECORE_DBUS_BUS_SESSION:
-       svr->server =
-          ecore_con_server_connect(ECORE_CON_LOCAL_USER | extra, name, port, 
svr);
-       break;
-#endif
-     case ECORE_DBUS_BUS_SYSTEM:
-       svr->server =
-          ecore_con_server_connect(ECORE_CON_LOCAL_SYSTEM | extra, name, port, 
svr);
-       break;
-     default:
-       free(svr);
-       return NULL;
-     }
+
+   svr->server =
+     ecore_con_server_connect(con_type, name, port, svr);
+
    if (!svr->server)
      {
-       printf("Couldn't connect to server\n");
+       fprintf(stderr, "Ecore_DBus Error: Couldn't connect to server\n");
        free(svr);
        return NULL;
      }
@@ -373,7 +446,7 @@
                    }
                  else
                    {
-                      printf("Ecore_DBus: Reply without reply serial!\n");
+                      printf("[ecore_dbus] Reply without reply serial!\n");
                    }
                  if (sent) _ecore_dbus_message_free(sent);
                  _ecore_dbus_event_server_data_free(NULL, ev2);
@@ -391,7 +464,7 @@
                    }
                  else
                    {
-                      printf("Ecore_DBus: Error without reply serial!\n");
+                      printf("[ecore_dbus] Error without reply serial!\n");
                    }
                  if (sent) _ecore_dbus_message_free(sent);
                  _ecore_dbus_event_server_data_free(NULL, ev2);
@@ -400,7 +473,14 @@
               {
                  Ecore_DBus_Event_Server_Data *ev2;
                  ev2 = _ecore_dbus_event_create(svr, msg);
-                 ecore_event_add(ECORE_DBUS_EVENT_SERVER_SIGNAL, ev2,
+                 ecore_event_add(ECORE_DBUS_EVENT_SIGNAL, ev2,
+                                 _ecore_dbus_event_server_data_free, NULL);
+              }
+            else if (msg->type == ECORE_DBUS_MESSAGE_TYPE_METHOD_CALL)
+              {
+                 Ecore_DBus_Event_Server_Data *ev2;
+                 ev2 = _ecore_dbus_event_create(svr, msg);
+                 ecore_event_add(ECORE_DBUS_EVENT_METHOD_CALL, ev2,
                                  _ecore_dbus_event_server_data_free, NULL);
               }
             else
@@ -410,7 +490,7 @@
               }
          }
      }
-   return 0;
+   return 1;
 }
 
 static void
===================================================================
RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore_dbus/ecore_dbus_message.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -3 -r1.8 -r1.9
--- ecore_dbus_message.c        27 Jul 2006 15:28:44 -0000      1.8
+++ ecore_dbus_message.c        24 Sep 2006 07:24:52 -0000      1.9
@@ -8,7 +8,18 @@
 #include "Ecore_DBus.h"
 #include "ecore_dbus_private.h"
 
-static void  _ecore_dbus_message_common_header(Ecore_DBus_Message *msg, int 
type, int flags);
+/* message helpers */
+static Ecore_DBus_Message *_ecore_dbus_message_create(Ecore_DBus_Server *svr,
+                             int type, int flags, char *path, char *interface,
+                            char *member, char *error_name, int reply_serial,
+                            char *destination, char *signature, va_list args);
+static void  _ecore_dbus_message_header(Ecore_DBus_Message *msg, int type,
+                             int flags, char *path, char *interface,
+                            char *member, char *error_name, int reply_serial,
+                            char *destination, char *format);
+static void _ecore_dbus_message_body(Ecore_DBus_Message *msg,
+                             char *signature, va_list args);
+
 static void  _ecore_dbus_message_field_free(void *data);
 
 /* printing functions */
@@ -16,108 +27,167 @@
 static void 
_ecore_dbus_message_header_field_print(Ecore_DBus_Message_Field_Container *arr);
 static void _ecore_dbus_message_print_raw(Ecore_DBus_Message *msg);
 
+/*
+ * Message types and allowed fields (* indicates required field):
+ *
+ * METHOD_CALL
+ *     *path
+ *      interface
+ *      member
+ *      destination
+ *      signature
+ *
+ * METHOD_RETURN
+ *      member
+ *     *reply_serial
+ *      destination
+ *      signature
+ *
+ * ERROR
+ *     *error_name
+ *     *reply_serial
+ *      destination
+ *      signature
+ *
+ * SIGNAL
+ *     *path
+ *     *interface
+ *     *member
+ *      destination
+ *      signature
+ *
+ */
+EAPI unsigned int
+ecore_dbus_message_new_method_return(Ecore_DBus_Server *svr, int reply_serial,
+                                    char *destination, char *signature, ...)
+{
+   va_list     args;   
+   Ecore_DBus_Message *msg;
+
+   va_start(args, signature);
+   msg = _ecore_dbus_message_create(svr, 
ECORE_DBUS_MESSAGE_TYPE_METHOD_RETURN, 0, NULL, NULL, NULL, NULL, reply_serial, 
destination, signature, args);
+   va_end(args);
+
+   ecore_dbus_server_send(svr, (char *)msg->buffer, msg->length);
+   ecore_hash_set(svr->messages, (void *)msg->serial, msg);
+
+   return msg->serial;
+}
+
 EAPI unsigned int
-ecore_dbus_message_new_method_call(Ecore_DBus_Server *svr, char *destination,
-                                  char *path, char *interface, char *method,
+ecore_dbus_message_new_error(Ecore_DBus_Server *svr, char *error_name,
+                            int reply_serial, char *destination,
+                            char *signature, ...)
+{
+   va_list     args;   
+   Ecore_DBus_Message *msg;
+
+   va_start(args, signature);
+   msg = _ecore_dbus_message_create(svr, ECORE_DBUS_MESSAGE_TYPE_ERROR, 0, 
NULL, NULL, NULL, error_name, reply_serial, destination, signature, args);
+   va_end(args);
+
+   ecore_dbus_server_send(svr, (char *)msg->buffer, msg->length);
+   ecore_hash_set(svr->messages, (void *)msg->serial, msg);
+
+   return msg->serial;
+}
+
+EAPI unsigned int
+ecore_dbus_message_new_signal(Ecore_DBus_Server *svr, char *path,
+                             char *interface, char *signal_name,
+                             char *destination, void *data,
+                             char *signature, ...)
+{
+   va_list     args;   
+   Ecore_DBus_Message *msg;
+
+   va_start(args, signature);
+   msg = _ecore_dbus_message_create(svr, ECORE_DBUS_MESSAGE_TYPE_SIGNAL, 0, 
path, interface, signal_name, NULL, 0, destination, signature, args);
+   va_end(args);
+
+   ecore_dbus_server_send(svr, (char *)msg->buffer, msg->length);
+   ecore_hash_set(svr->messages, (void *)msg->serial, msg);
+
+   return msg->serial;
+}
+
+EAPI unsigned int
+ecore_dbus_message_new_method_call(Ecore_DBus_Server *svr, 
+                                  char *path, char *interface,
+                                  char *method, char *destination, 
                                   Ecore_DBus_Method_Return_Cb method_cb,
                                   Ecore_DBus_Error_Cb error_cb,
                                   void *data,
-                                  char *fmt, ...)
+                                  char *signature, ...)
 {
-   unsigned int                    body_start;
-   char                            buf[1024];
-   Ecore_DBus_Message_Field_Array *arr;
+   va_list     args;   
+   Ecore_DBus_Message *msg;
+   int flags = 0;
 
    if (!method) return 0;
 
-   /* init message */
-   Ecore_DBus_Message *msg = _ecore_dbus_message_new(svr);
-   if (method_cb)
+   if (!method_cb && !error_cb) flags |= 
ECORE_DBUS_MESSAGE_FLAG_NO_REPLY_EXPECTED;
+
+   va_start(args, signature);
+   msg = _ecore_dbus_message_create(svr, ECORE_DBUS_MESSAGE_TYPE_METHOD_CALL, 
flags, path, interface, method, NULL, 0, destination, signature, args);
+   va_end(args);
+
+   if (method_cb || error_cb)
      {
        msg->cb.method_return = method_cb;
        msg->cb.error = error_cb;
        msg->cb.data = data;
      }
 
-   /* common header */
-   _ecore_dbus_message_common_header(msg, ECORE_DBUS_MESSAGE_TYPE_METHOD_CALL, 
0);
-
-   arr = _ecore_dbus_message_marshal_array_begin(msg, 
ECORE_DBUS_DATA_TYPE_STRUCT);
-   /* custom header */
-   if (path)
-     {
-       Ecore_DBus_Message_Field_Struct *s;
-
-       s = _ecore_dbus_message_marshal_struct_begin(msg);
-       _ecore_dbus_message_marshal_byte(msg, ECORE_DBUS_HEADER_FIELD_PATH);
-       _ecore_dbus_message_marshal_variant(msg, 
ECORE_DBUS_DATA_TYPE_OBJECT_PATH, path);
-       _ecore_dbus_message_marshal_struct_end(msg, s);
-     }
-   if (destination)
-     {
-       Ecore_DBus_Message_Field_Struct *s;
-
-       s = _ecore_dbus_message_marshal_struct_begin(msg);
-       _ecore_dbus_message_marshal_byte(msg, 
ECORE_DBUS_HEADER_FIELD_DESTINATION);
-       _ecore_dbus_message_marshal_variant(msg, ECORE_DBUS_DATA_TYPE_STRING, 
destination);
-       _ecore_dbus_message_marshal_struct_end(msg, s);
-     }
-   if (interface)
-     {
-       Ecore_DBus_Message_Field_Struct *s;
+   /* send message */
+   ecore_dbus_server_send(svr, (char *)msg->buffer, msg->length);
+   ecore_hash_set(svr->messages, (void *)msg->serial, msg);
 
-       s = _ecore_dbus_message_marshal_struct_begin(msg);
-       _ecore_dbus_message_marshal_byte(msg, 
ECORE_DBUS_HEADER_FIELD_INTERFACE);
-       _ecore_dbus_message_marshal_variant(msg, ECORE_DBUS_DATA_TYPE_STRING, 
interface);
-       _ecore_dbus_message_marshal_struct_end(msg, s);
-     }
-   if (method)
-     {
-       Ecore_DBus_Message_Field_Struct *s;
+   return msg->serial;
+}
 
-       s = _ecore_dbus_message_marshal_struct_begin(msg);
-       _ecore_dbus_message_marshal_byte(msg, ECORE_DBUS_HEADER_FIELD_MEMBER);
-       _ecore_dbus_message_marshal_variant(msg, ECORE_DBUS_DATA_TYPE_STRING, 
method);
-       _ecore_dbus_message_marshal_struct_end(msg, s);
-     }
-   if (fmt)
-     {
-       Ecore_DBus_Message_Field_Struct *s;
+static Ecore_DBus_Message *
+_ecore_dbus_message_create(Ecore_DBus_Server *svr, int type, int flags, char 
*path, char *interface, char *member, char *error_name, int reply_serial, char 
*destination, char *signature, va_list args)
+{
+   /* init message */
+   Ecore_DBus_Message *msg;
+   
+   msg = _ecore_dbus_message_new(svr);
+   _ecore_dbus_message_header(msg, type, flags, path, interface, member, 
error_name, reply_serial, destination, signature);
+   _ecore_dbus_message_body(msg, signature, args);
 
-       s = _ecore_dbus_message_marshal_struct_begin(msg);
-       _ecore_dbus_message_marshal_byte(msg, 
ECORE_DBUS_HEADER_FIELD_SIGNATURE);
-       _ecore_dbus_message_marshal_variant(msg, 
ECORE_DBUS_DATA_TYPE_SIGNATURE, fmt);
-       _ecore_dbus_message_marshal_struct_end(msg, s);
-     }
-   _ecore_dbus_message_marshal_array_end(msg, arr);
-   msg->header = ecore_list_remove_first(msg->fields);
-   _ecore_dbus_message_padding(msg, 8);
+   /* show message */
+   //ecore_dbus_message_print(msg);
+   return msg;
+}
 
+static void
+_ecore_dbus_message_body(Ecore_DBus_Message *msg, char *signature, va_list 
args) 
+{
+   unsigned int body_start;
    /* message body */
    body_start = msg->length;
-   if (fmt)
+   if (signature)
      {
-       va_list ap;
-       va_start(ap, fmt);
-       while (*fmt)
+       while (*signature)
          {
-            Ecore_DBus_Data_Type type = *fmt;
+            Ecore_DBus_Data_Type type = *signature;
             switch (type)
               {
                case ECORE_DBUS_DATA_TYPE_BYTE:
-                  _ecore_dbus_message_marshal_byte(msg, va_arg(ap, int));
+                  _ecore_dbus_message_marshal_byte(msg, va_arg(args, int));
                   break;
                case ECORE_DBUS_DATA_TYPE_UINT32:
-                   _ecore_dbus_message_marshal_uint32(msg, va_arg(ap, unsigned 
int));
+                   _ecore_dbus_message_marshal_uint32(msg, va_arg(args, 
unsigned int));
                   break;
                case ECORE_DBUS_DATA_TYPE_STRING:
-                   _ecore_dbus_message_marshal_string(msg, (char *)va_arg(ap, 
char *));
+                   _ecore_dbus_message_marshal_string(msg, (char 
*)va_arg(args, char *));
                   break;
                case ECORE_DBUS_DATA_TYPE_OBJECT_PATH:
-                   _ecore_dbus_message_marshal_object_path(msg, (char 
*)va_arg(ap, char *));
+                   _ecore_dbus_message_marshal_object_path(msg, (char 
*)va_arg(args, char *));
                   break;
                case ECORE_DBUS_DATA_TYPE_SIGNATURE:
-                   _ecore_dbus_message_marshal_signature(msg, (char 
*)va_arg(ap, char *));
+                   _ecore_dbus_message_marshal_signature(msg, (char 
*)va_arg(args, char *));
                   break;
                case ECORE_DBUS_DATA_TYPE_INVALID:
                case ECORE_DBUS_DATA_TYPE_BOOLEAN:
@@ -138,27 +208,14 @@
 #if 0
                default:
 #endif
-                  printf("[ecore_dbus] unknown/unhandled data type %c\n", 
*fmt);
+                  printf("[ecore_dbus] unknown/unhandled data type %c\n", 
*signature);
                   break;
               }
-            fmt++;
+            signature++;
          }
-       va_end(ap);
      }
    /* set body length */
    *(unsigned int *)(msg->buffer + 4) = msg->length - body_start;
-
-   /* show message */
-   //ecore_dbus_message_print(msg);
-   /* send message */
-   ecore_dbus_server_send(svr, (char *)msg->buffer, msg->length);
-   if (interface)
-     snprintf(buf, sizeof(buf), "%s.%s", interface, method);
-   else
-     strcpy(buf, method);
-   ecore_hash_set(svr->messages, (void *)msg->serial, msg);
-
-   return msg->serial;
 }
 
 EAPI void
@@ -375,14 +432,22 @@
 /* header functions */
 
 static void
-_ecore_dbus_message_common_header(Ecore_DBus_Message *msg, int type, int flags)
+_ecore_dbus_message_header(Ecore_DBus_Message *msg, int type, int flags,
+                           char *path, char *interface, char *member,
+                          char *error_name, int reply_serial,
+                          char *destination, char *signature)
 {
-   /* endiannes (1) */
+   Ecore_DBus_Message_Field_Array *arr;
+   
+   if (!msg) return;
+
+   /* endianness (1) */
+   /* XXX we need to detect for endianess and send 'B' for Bigendian machines 
*/
    msg->buffer[0] = msg->byte_order = 'l';
    /* type (1) */
    msg->buffer[1] = msg->type = (char)type;
    /* flags (1) 0x1 = no reply expected, 0x2 auto activation */
-   msg->buffer[2] = msg->flags = 0x0;
+   msg->buffer[2] = msg->flags = flags;
    /* protocol (1) */
    msg->buffer[3] = msg->protocol = ECORE_DBUS_MAJOR_PROTOCOL_VERSION;
    /* autoincrement the client_serial (0 is invalid) */
@@ -390,6 +455,61 @@
 
    *(unsigned int *)(msg->buffer + 8) = msg->serial = msg->server->cnt_msg;
    msg->length = 12;
+
+   /* header fields */
+   arr = _ecore_dbus_message_marshal_array_begin(msg, 
ECORE_DBUS_DATA_TYPE_STRUCT);
+   if (path)
+     {
+       Ecore_DBus_Message_Field_Struct *s;
+
+       s = _ecore_dbus_message_marshal_struct_begin(msg);
+       _ecore_dbus_message_marshal_byte(msg, ECORE_DBUS_HEADER_FIELD_PATH);
+       _ecore_dbus_message_marshal_variant(msg, 
ECORE_DBUS_DATA_TYPE_OBJECT_PATH, path);
+       _ecore_dbus_message_marshal_struct_end(msg, s);
+     }
+   if (interface)
+     {
+       Ecore_DBus_Message_Field_Struct *s;
+
+       s = _ecore_dbus_message_marshal_struct_begin(msg);
+       _ecore_dbus_message_marshal_byte(msg, 
ECORE_DBUS_HEADER_FIELD_INTERFACE);
+       _ecore_dbus_message_marshal_variant(msg, ECORE_DBUS_DATA_TYPE_STRING, 
interface);
+       _ecore_dbus_message_marshal_struct_end(msg, s);
+     }
+   if (member)
+     {
+       Ecore_DBus_Message_Field_Struct *s;
+
+       s = _ecore_dbus_message_marshal_struct_begin(msg);
+       _ecore_dbus_message_marshal_byte(msg, ECORE_DBUS_HEADER_FIELD_MEMBER);
+       _ecore_dbus_message_marshal_variant(msg, ECORE_DBUS_DATA_TYPE_STRING, 
member);
+       _ecore_dbus_message_marshal_struct_end(msg, s);
+     }
+   if (destination)
+     {
+       Ecore_DBus_Message_Field_Struct *s;
+
+       s = _ecore_dbus_message_marshal_struct_begin(msg);
+       _ecore_dbus_message_marshal_byte(msg, 
ECORE_DBUS_HEADER_FIELD_DESTINATION);
+       _ecore_dbus_message_marshal_variant(msg, ECORE_DBUS_DATA_TYPE_STRING, 
destination);
+       _ecore_dbus_message_marshal_struct_end(msg, s);
+     }
+   if (signature)
+     {
+       Ecore_DBus_Message_Field_Struct *s;
+
+       s = _ecore_dbus_message_marshal_struct_begin(msg);
+       _ecore_dbus_message_marshal_byte(msg, 
ECORE_DBUS_HEADER_FIELD_SIGNATURE);
+       _ecore_dbus_message_marshal_variant(msg, 
ECORE_DBUS_DATA_TYPE_SIGNATURE, signature);
+       _ecore_dbus_message_marshal_struct_end(msg, s);
+     }
+   _ecore_dbus_message_marshal_array_end(msg, arr);
+
+   /* move the header fields to the header */
+   msg->header = ecore_list_remove_last(msg->fields);
+
+   /* pad to an 8 bit boundary */
+   _ecore_dbus_message_padding(msg, 8);
 }
 
 static void
@@ -581,3 +701,4 @@
    printf("\n");
    printf("[ecore_dbus] end raw message\n");
 }
+
===================================================================
RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore_dbus/ecore_dbus_methods.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -3 -r1.5 -r1.6
--- ecore_dbus_methods.c        27 Jul 2006 15:28:44 -0000      1.5
+++ ecore_dbus_methods.c        24 Sep 2006 07:24:52 -0000      1.6
@@ -20,10 +20,10 @@
        return 0;
      }
    return ecore_dbus_message_new_method_call(svr,
-                                            "org.freedesktop.DBus" 
/*destination*/,
                                             "/org/freedesktop/DBus" /*path*/,
                                             "org.freedesktop.DBus" 
/*interface*/,
                                             "Hello" /*method*/,
+                                            "org.freedesktop.DBus" 
/*destination*/,
                                             method_cb, error_cb, data,
                                             NULL /*fmt*/);
 }
@@ -35,10 +35,10 @@
                             void *data)
 {
    return ecore_dbus_message_new_method_call(svr,
-                                            "org.freedesktop.DBus" 
/*destination*/,
                                             "/org/freedesktop/DBus" /*path*/,
                                             "org.freedesktop.DBus" 
/*interface*/,
                                             "ListNames" /*method*/,
+                                            "org.freedesktop.DBus" 
/*destination*/,
                                             method_cb, error_cb, data,
                                             NULL /*fmt*/);
 }
@@ -50,10 +50,10 @@
                                 void *data)
 {
    return ecore_dbus_message_new_method_call(svr,
-                                            "org.freedesktop.DBus" 
/*destination*/,
                                             "/org/freedesktop/DBus" /*path*/,
                                             "org.freedesktop.DBus" 
/*interface*/,
                                             "NameHasOwner" /*method*/,
+                                            "org.freedesktop.DBus" 
/*destination*/,
                                             method_cb, error_cb, data,
                                             "s" /*fmt*/, name);
 }
@@ -65,10 +65,10 @@
                                        void *data)
 {
    return ecore_dbus_message_new_method_call(svr,
-                                            "org.freedesktop.DBus" 
/*destination*/,
                                             "/org/freedesktop/DBus" /*path*/,
                                             "org.freedesktop.DBus" 
/*interface*/,
                                             "StartServiceByName" /*method*/,
+                                            "org.freedesktop.DBus" 
/*destination*/,
                                             method_cb, error_cb, data,
                                             "su" /*fmt*/, name, flags);
 }
@@ -80,10 +80,10 @@
                                 void *data)
 {
    return ecore_dbus_message_new_method_call(svr,
-                                            "org.freedesktop.DBus" 
/*destination*/,
                                             "/org/freedesktop/DBus" /*path*/,
                                             "org.freedesktop.DBus" 
/*interface*/,
                                             "GetNameOwner" /*method*/,
+                                            "org.freedesktop.DBus" 
/*destination*/,
                                             method_cb, error_cb, data,
                                             "s" /*fmt*/, name);
 }
@@ -95,10 +95,10 @@
                                           void *data)
 {
    return ecore_dbus_message_new_method_call(svr,
-                                            "org.freedesktop.DBus" 
/*destination*/,
                                             "/org/freedesktop/DBus" /*path*/,
                                             "org.freedesktop.DBus" 
/*interface*/,
                                             "GetConnectionUnixUser" /*method*/,
+                                            "org.freedesktop.DBus" 
/*destination*/,
                                             method_cb, error_cb, data,
                                             "s" /*fmt*/, connection);
 }
@@ -110,10 +110,10 @@
                            void *data)
 {
    return ecore_dbus_message_new_method_call(svr,
-                                            "org.freedesktop.DBus" 
/*destination*/,
                                             "/org/freedesktop/DBus" /*path*/,
                                             "org.freedesktop.DBus" 
/*interface*/,
                                             "AddMatch" /*method*/,
+                                            "org.freedesktop.DBus" 
/*destination*/,
                                             method_cb, error_cb, data,
                                             "s" /*fmt*/, match);
 }
@@ -125,10 +125,40 @@
                               void *data)
 {
    return ecore_dbus_message_new_method_call(svr,
-                                            "org.freedesktop.DBus" 
/*destination*/,
                                             "/org/freedesktop/DBus" /*path*/,
                                             "org.freedesktop.DBus" 
/*interface*/,
                                             "RemoveMatch" /*method*/,
+                                            "org.freedesktop.DBus" 
/*destination*/,
                                             method_cb, error_cb, data,
                                             "s" /*fmt*/, match);
+}
+
+EAPI int
+ecore_dbus_method_request_name(Ecore_DBus_Server *svr, char *name, int flags,
+                              Ecore_DBus_Method_Return_Cb method_cb,
+                              Ecore_DBus_Error_Cb error_cb,
+                              void *data)
+{
+   return ecore_dbus_message_new_method_call(svr,
+                                            "/org/freedesktop/DBus" /*path*/,
+                                            "org.freedesktop.DBus" 
/*interface*/,
+                                            "RequestName" /*method*/,
+                                            "org.freedesktop.DBus" 
/*destination*/,
+                                            method_cb, error_cb, data,
+                                            "su" /*fmt*/, name, flags);
+}
+
+EAPI int
+ecore_dbus_method_release_name(Ecore_DBus_Server *svr, char *name,
+                              Ecore_DBus_Method_Return_Cb method_cb,
+                              Ecore_DBus_Error_Cb error_cb,
+                              void *data)
+{
+   return ecore_dbus_message_new_method_call(svr,
+                                            "/org/freedesktop/DBus" /*path*/,
+                                            "org.freedesktop.DBus" 
/*interface*/,
+                                            "RequestName" /*method*/,
+                                            "org.freedesktop.DBus" 
/*destination*/,
+                                            method_cb, error_cb, data,
+                                            "s" /*fmt*/, name);
 }
===================================================================
RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore_dbus/ecore_dbus_private.h,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -3 -r1.12 -r1.13
--- ecore_dbus_private.h        27 Jul 2006 15:28:44 -0000      1.12
+++ ecore_dbus_private.h        24 Sep 2006 07:24:52 -0000      1.13
@@ -4,6 +4,9 @@
 #ifndef _ECORE_DBUS_PRIVATE_H
 #define _ECORE_DBUS_PRIVATE_H
 
+#include "Ecore_Con.h"
+#include "Ecore_Data.h"
+
 typedef unsigned char *(*Ecore_DBus_Auth_Transaction)(void *);
 
 typedef struct _Ecore_DBus_Auth                      Ecore_DBus_Auth;
@@ -56,7 +59,7 @@
 
 struct _Ecore_DBus_Server
 {
-   Ecore_List2            __list_data;
+   Ecore_List2             __list_data;
    Ecore_Con_Server        *server;
    int                      authenticated;
    int                      auth_type;
===================================================================
RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore_dbus/ecore_dbus_utils.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -3 -r1.4 -r1.5
--- ecore_dbus_utils.c  27 Jul 2006 13:29:44 -0000      1.4
+++ ecore_dbus_utils.c  24 Sep 2006 07:24:52 -0000      1.5
@@ -202,3 +202,4 @@
      }
    return NULL;
 }
+



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

Reply via email to