Enlightenment CVS committal

Author  : sebastid
Project : e17
Module  : libs/ecore

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


Modified Files:
        Ecore_DBus.h ecore_dbus.c ecore_dbus_message.c 
        ecore_dbus_methods.c ecore_dbus_private.h 


Log Message:
Use callbacks for method return, not events

===================================================================
RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore_dbus/Ecore_DBus.h,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -3 -r1.13 -r1.14
--- Ecore_DBus.h        27 Jul 2006 13:29:43 -0000      1.13
+++ Ecore_DBus.h        27 Jul 2006 15:06:13 -0000      1.14
@@ -36,8 +36,10 @@
    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_Arg         Ecore_DBus_Event_Arg;
+   typedef struct _Ecore_DBus_Event_Server_Data Ecore_DBus_Event_Server_Signal;
+   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
@@ -106,10 +108,10 @@
             const char   *sender;
             const char   *signature;
        } header;
-       Ecore_DBus_Event_Arg *args;
+       Ecore_DBus_Message_Arg *args;
      };
 
-   struct _Ecore_DBus_Event_Arg
+   struct _Ecore_DBus_Message_Arg
      {
        Ecore_DBus_Data_Type  type;
        void                 *value;
@@ -130,10 +132,10 @@
 
    EAPI extern int ECORE_DBUS_EVENT_SERVER_ADD;
    EAPI extern int ECORE_DBUS_EVENT_SERVER_DEL;
-   EAPI extern int ECORE_DBUS_EVENT_SERVER_METHOD_RETURN;
-   EAPI extern int ECORE_DBUS_EVENT_SERVER_ERROR;
    EAPI extern int ECORE_DBUS_EVENT_SERVER_SIGNAL;
-   EAPI extern int ECORE_DBUS_EVENT_SERVER_DATA;
+
+   /* callback */
+   typedef void (*Ecore_DBus_Method_Cb)(void *data, Ecore_DBus_Message_Type 
type, Ecore_DBus_Method_Return *reply);
 
    /* init */
    EAPI int ecore_dbus_init(void);
@@ -146,21 +148,28 @@
 
    /* 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, char *fmt, 
...);
+   EAPI unsigned int  ecore_dbus_message_new_method_call(Ecore_DBus_Server 
*svr,
+                                                        char *destination, 
char *path,
+                                                        char *interface, char 
*method,
+                                                        void (*method_cb)(void 
*udata,
+                                                                          
Ecore_DBus_Message_Type type,
+                                                                          
Ecore_DBus_Event_Server_Data *data),
+                                                        void *data,
+                                                        char *fmt, ...);
    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);
    EAPI void         *ecore_dbus_message_body_field_get(Ecore_DBus_Message 
*msg, unsigned int pos);
 
    /* methods */
-   EAPI int ecore_dbus_method_hello(Ecore_DBus_Server *svr);
-   EAPI int ecore_dbus_method_list_names(Ecore_DBus_Server *svr);
-   EAPI int ecore_dbus_method_name_has_owner(Ecore_DBus_Server *svr, char 
*name);
-   EAPI int ecore_dbus_method_start_service_by_name(Ecore_DBus_Server *svr, 
char *name, unsigned int flags);
-   EAPI int ecore_dbus_method_get_name_owner(Ecore_DBus_Server *svr, char 
*name);
-   EAPI int ecore_dbus_method_get_connection_unix_user(Ecore_DBus_Server *svr, 
char *connection);
-   EAPI int ecore_dbus_method_add_match(Ecore_DBus_Server *svr, char *match);
-   EAPI int ecore_dbus_method_remove_match(Ecore_DBus_Server *svr, char 
*match);
+   EAPI int ecore_dbus_method_hello(Ecore_DBus_Server *svr, 
Ecore_DBus_Method_Cb method_cb, void *data);
+   EAPI int ecore_dbus_method_list_names(Ecore_DBus_Server *svr, 
Ecore_DBus_Method_Cb method_cb, void *data);
+   EAPI int ecore_dbus_method_name_has_owner(Ecore_DBus_Server *svr, char 
*name, Ecore_DBus_Method_Cb method_cb, void *data);
+   EAPI int ecore_dbus_method_start_service_by_name(Ecore_DBus_Server *svr, 
char *name, unsigned int flags, Ecore_DBus_Method_Cb method_cb, void *data);
+   EAPI int ecore_dbus_method_get_name_owner(Ecore_DBus_Server *svr, char 
*name, Ecore_DBus_Method_Cb method_cb, void *data);
+   EAPI int ecore_dbus_method_get_connection_unix_user(Ecore_DBus_Server *svr, 
char *connection, Ecore_DBus_Method_Cb method_cb, void *data);
+   EAPI int ecore_dbus_method_add_match(Ecore_DBus_Server *svr, char *match, 
Ecore_DBus_Method_Cb method_cb, void *data);
+   EAPI int ecore_dbus_method_remove_match(Ecore_DBus_Server *svr, char 
*match, Ecore_DBus_Method_Cb method_cb, void *data);
 
 #ifdef __cplusplus
 }
===================================================================
RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore_dbus/ecore_dbus.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -3 -r1.19 -r1.20
--- ecore_dbus.c        27 Jul 2006 14:06:04 -0000      1.19
+++ ecore_dbus.c        27 Jul 2006 15:06:13 -0000      1.20
@@ -42,10 +42,7 @@
 
 EAPI int                 ECORE_DBUS_EVENT_SERVER_ADD = 0;
 EAPI int                 ECORE_DBUS_EVENT_SERVER_DEL = 0;
-EAPI int                 ECORE_DBUS_EVENT_SERVER_METHOD_RETURN = 0;
-EAPI int                 ECORE_DBUS_EVENT_SERVER_ERROR = 0;
 EAPI int                 ECORE_DBUS_EVENT_SERVER_SIGNAL = 0;
-EAPI int                 ECORE_DBUS_EVENT_SERVER_DATA = 0;
 
 /* private function declaration */
 
@@ -63,6 +60,8 @@
 
 static Ecore_DBus_Event_Server_Data 
*_ecore_dbus_event_create(Ecore_DBus_Server *svr, Ecore_DBus_Message *msg);
 
+static void         _ecore_dbus_method_hello_cb(void *data, 
Ecore_DBus_Message_Type type, Ecore_DBus_Method_Return *reply);
+
 /* local variables  */
 
 static const Ecore_DBus_Auth auths[] = {
@@ -89,10 +88,7 @@
 
    ECORE_DBUS_EVENT_SERVER_ADD = ecore_event_type_new();
    ECORE_DBUS_EVENT_SERVER_DEL = ecore_event_type_new();
-   ECORE_DBUS_EVENT_SERVER_METHOD_RETURN = ecore_event_type_new();
-   ECORE_DBUS_EVENT_SERVER_ERROR = ecore_event_type_new();
    ECORE_DBUS_EVENT_SERVER_SIGNAL = ecore_event_type_new();
-   ECORE_DBUS_EVENT_SERVER_DATA = ecore_event_type_new();
 
    handler[i++] = ecore_event_handler_add(ECORE_CON_EVENT_SERVER_ADD,
                                          _ecore_dbus_event_server_add, NULL);
@@ -320,7 +316,7 @@
             ecore_dbus_server_send(svr, "BEGIN\r\n", 7);
             svr->authenticated = 1;
             /* Register on the bus */
-            svr->hello = ecore_dbus_method_hello(svr);
+            ecore_dbus_method_hello(svr, _ecore_dbus_method_hello_cb, svr);
          }
        else if (!strncmp(e->data, "DATA", 4))
          {
@@ -354,6 +350,8 @@
        printf("[ecore_dbus] received server data, %d bytes\n", e->size);
        while (e->size)
          {
+            Ecore_DBus_Event_Server_Data *ev2;
+
             msg = _ecore_dbus_message_unmarshal(svr, (unsigned char 
*)(e->data) + offset, e->size);
             if (!msg) break;
             offset += msg->length;
@@ -362,56 +360,23 @@
                    msg->length, e->size);
             //ecore_dbus_message_print(msg);
             /* Trap known messages */
-            if (msg->type == ECORE_DBUS_MESSAGE_TYPE_METHOD_RETURN)
+            ev2 = _ecore_dbus_event_create(svr, msg);
+            if (!ev2) break;
+            if ((msg->type == ECORE_DBUS_MESSAGE_TYPE_METHOD_RETURN) ||
+                (msg->type == ECORE_DBUS_MESSAGE_TYPE_ERROR))
               {
-                 unsigned int *serial;
-
-                 serial = ecore_dbus_message_header_field_get(msg, 
ECORE_DBUS_HEADER_FIELD_REPLY_SERIAL);
-                 if (serial)
+                 Ecore_DBus_Message *sent;
+                 sent = ecore_hash_remove(svr->messages, (void 
*)(ev2->header.reply_serial));
+                 if ((sent) && (sent->cb.func))
                    {
-                      Ecore_DBus_Message *sent;
-                      sent = ecore_hash_remove(svr->messages, (void 
*)(*serial));
-                      if (*serial == svr->hello)
-                        {
-                           Ecore_DBus_Event_Server_Add *svr_add;
-                           char                        *name;
-
-                           name = ecore_dbus_message_body_field_get(msg, 0);
-                           printf("Got unique name: %s\n", name);
-                           if (svr->unique_name)
-                             {
-                                printf("Ecore_DBus: Already said hello %s - 
%s\n",
-                                       svr->unique_name, name);
-                                free(svr->unique_name);
-                             }
-                           svr->unique_name = strdup(name);
-                           _ecore_dbus_message_free(msg);
-
-                           svr_add = 
malloc(sizeof(Ecore_DBus_Event_Server_Add));
-                           svr_add->server = svr;
-                           ecore_event_add(ECORE_DBUS_EVENT_SERVER_ADD, 
svr_add, NULL, NULL);
-                        }
-                      else
-                        {
-                           Ecore_DBus_Event_Server_Data *ev2;
-                           ev2 = _ecore_dbus_event_create(svr, msg);
-                           
ecore_event_add(ECORE_DBUS_EVENT_SERVER_METHOD_RETURN, ev2,
-                                 _ecore_dbus_event_server_data_free, NULL);
-                        }
-                      _ecore_dbus_message_free(sent);
+                      sent->cb.func(sent->cb.data, msg->type, ev2);
+                      _ecore_dbus_event_server_data_free(NULL, ev2);
                    }
                  else
                    {
-                      printf("Ecore_DBus: Method return without reply 
serial!\n");
+                      printf("Ecore_DBus: Reply without reply serial!\n");
                    }
               }
-            else if (msg->type == ECORE_DBUS_MESSAGE_TYPE_ERROR)
-              {
-                 Ecore_DBus_Event_Server_Data *ev2;
-                 ev2 = _ecore_dbus_event_create(svr, msg);
-                 ecore_event_add(ECORE_DBUS_EVENT_SERVER_ERROR, ev2,
-                                 _ecore_dbus_event_server_data_free, NULL);
-              }
             else if (msg->type == ECORE_DBUS_MESSAGE_TYPE_SIGNAL)
               {
                  Ecore_DBus_Event_Server_Data *ev2;
@@ -421,10 +386,8 @@
               }
             else
               {
-                 Ecore_DBus_Event_Server_Data *ev2;
-                 ev2 = _ecore_dbus_event_create(svr, msg);
-                 ecore_event_add(ECORE_DBUS_EVENT_SERVER_DATA, ev2,
-                                 _ecore_dbus_event_server_data_free, NULL);
+                 printf("Ecore_DBus: Unknown return type %d\n", msg->type);
+                 _ecore_dbus_event_server_data_free(NULL, ev2);
               }
          }
      }
@@ -478,7 +441,7 @@
        Ecore_DBus_Message_Field *f;
        int i = 0;
 
-       ev->args = malloc(ecore_list_nodes(msg->fields) * 
sizeof(Ecore_DBus_Event_Arg));
+       ev->args = malloc(ecore_list_nodes(msg->fields) * 
sizeof(Ecore_DBus_Message_Arg));
        ecore_list_goto_first(msg->fields);
        while ((f = ecore_list_next(msg->fields)))
          {
@@ -490,3 +453,31 @@
    return ev;
 }
 
+static void
+_ecore_dbus_method_hello_cb(void *data, Ecore_DBus_Message_Type type, 
Ecore_DBus_Method_Return *reply)
+{
+   Ecore_DBus_Event_Server_Add *svr_add;
+   Ecore_DBus_Server           *svr;
+   char                        *name;
+
+   if (type != ECORE_DBUS_MESSAGE_TYPE_METHOD_RETURN)
+     {
+       printf("Ecore_DBus: Could not register on the message bus\n");
+       return;
+     }
+
+   svr = data;
+   name = reply->args[0].value;
+   printf("Got unique name: %s\n", name);
+   if (svr->unique_name)
+     {
+       printf("Ecore_DBus: Already said hello %s - %s\n",
+             svr->unique_name, name);
+       free(svr->unique_name);
+     }
+   svr->unique_name = strdup(name);
+
+   svr_add = malloc(sizeof(Ecore_DBus_Event_Server_Add));
+   svr_add->server = svr;
+   ecore_event_add(ECORE_DBUS_EVENT_SERVER_ADD, svr_add, NULL, NULL);
+}
===================================================================
RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore_dbus/ecore_dbus_message.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -3 -r1.6 -r1.7
--- ecore_dbus_message.c        27 Jul 2006 14:06:04 -0000      1.6
+++ ecore_dbus_message.c        27 Jul 2006 15:06:13 -0000      1.7
@@ -19,6 +19,8 @@
 EAPI unsigned int
 ecore_dbus_message_new_method_call(Ecore_DBus_Server *svr, char *destination,
                                   char *path, char *interface, char *method,
+                                  Ecore_DBus_Method_Cb method_cb,
+                                  void *data,
                                   char *fmt, ...)
 {
    unsigned int                    body_start;
@@ -29,6 +31,11 @@
 
    /* init message */
    Ecore_DBus_Message *msg = _ecore_dbus_message_new(svr);
+   if (method_cb)
+     {
+       msg->cb.func = method_cb;
+       msg->cb.data = data;
+     }
 
    /* common header */
    _ecore_dbus_message_common_header(msg, ECORE_DBUS_MESSAGE_TYPE_METHOD_CALL, 
0);
===================================================================
RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore_dbus/ecore_dbus_methods.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -3 -r1.3 -r1.4
--- ecore_dbus_methods.c        27 Jul 2006 13:29:44 -0000      1.3
+++ ecore_dbus_methods.c        27 Jul 2006 15:06:13 -0000      1.4
@@ -9,97 +9,102 @@
 #include "ecore_dbus_private.h"
 
 EAPI int
-ecore_dbus_method_hello(Ecore_DBus_Server *svr)
+ecore_dbus_method_hello(Ecore_DBus_Server *svr, Ecore_DBus_Method_Cb 
method_cb, void *data)
 {
    if (svr->unique_name)
      {
        printf("Ecore_DBus: Already registered on the message bus.\n");
        return 0;
      }
-   if (svr->hello)
-     {
-       printf("Ecore_DBus: Already tried to register on the message bus, wait 
for reply.\n");
-       return 0;
-     }
    return ecore_dbus_message_new_method_call(svr,
                                             "org.freedesktop.DBus" 
/*destination*/,
                                             "/org/freedesktop/DBus" /*path*/,
                                             "org.freedesktop.DBus" 
/*interface*/,
-                                            "Hello" /*method*/, NULL /*fmt*/);
+                                            "Hello" /*method*/,
+                                            method_cb, data,
+                                            NULL /*fmt*/);
 }
 
 EAPI int
-ecore_dbus_method_list_names(Ecore_DBus_Server *svr)
+ecore_dbus_method_list_names(Ecore_DBus_Server *svr, Ecore_DBus_Method_Cb 
method_cb, void *data)
 {
    return ecore_dbus_message_new_method_call(svr,
                                             "org.freedesktop.DBus" 
/*destination*/,
                                             "/org/freedesktop/DBus" /*path*/,
                                             "org.freedesktop.DBus" 
/*interface*/,
-                                            "ListNames" /*method*/, NULL 
/*fmt*/);
+                                            "ListNames" /*method*/,
+                                            method_cb, data,
+                                            NULL /*fmt*/);
 }
 
 EAPI int
-ecore_dbus_method_name_has_owner(Ecore_DBus_Server *svr, char *name)
+ecore_dbus_method_name_has_owner(Ecore_DBus_Server *svr, char *name, 
Ecore_DBus_Method_Cb method_cb, void *data)
 {
    return ecore_dbus_message_new_method_call(svr,
                                             "org.freedesktop.DBus" 
/*destination*/,
                                             "/org/freedesktop/DBus" /*path*/,
                                             "org.freedesktop.DBus" 
/*interface*/,
                                             "NameHasOwner" /*method*/,
+                                            method_cb, data,
                                             "s" /*fmt*/, name);
 }
 
 EAPI int
-ecore_dbus_method_start_service_by_name(Ecore_DBus_Server *svr, char *name, 
unsigned int flags)
+ecore_dbus_method_start_service_by_name(Ecore_DBus_Server *svr, char *name, 
unsigned int flags, Ecore_DBus_Method_Cb method_cb, void *data)
 {
    return ecore_dbus_message_new_method_call(svr,
                                             "org.freedesktop.DBus" 
/*destination*/,
                                             "/org/freedesktop/DBus" /*path*/,
                                             "org.freedesktop.DBus" 
/*interface*/,
                                             "StartServiceByName" /*method*/,
+                                            method_cb, data,
                                             "su" /*fmt*/, name, flags);
 }
 
 EAPI int
-ecore_dbus_method_get_name_owner(Ecore_DBus_Server *svr, char *name)
+ecore_dbus_method_get_name_owner(Ecore_DBus_Server *svr, char *name, 
Ecore_DBus_Method_Cb method_cb, void *data)
 {
    return ecore_dbus_message_new_method_call(svr,
                                             "org.freedesktop.DBus" 
/*destination*/,
                                             "/org/freedesktop/DBus" /*path*/,
                                             "org.freedesktop.DBus" 
/*interface*/,
                                             "GetNameOwner" /*method*/,
+                                            method_cb, data,
                                             "s" /*fmt*/, name);
 }
 
 EAPI int
-ecore_dbus_method_get_connection_unix_user(Ecore_DBus_Server *svr, char 
*connection)
+ecore_dbus_method_get_connection_unix_user(Ecore_DBus_Server *svr, char 
*connection, Ecore_DBus_Method_Cb method_cb, void *data)
 {
    return ecore_dbus_message_new_method_call(svr,
                                             "org.freedesktop.DBus" 
/*destination*/,
                                             "/org/freedesktop/DBus" /*path*/,
                                             "org.freedesktop.DBus" 
/*interface*/,
                                             "GetConnectionUnixUser" /*method*/,
+                                            method_cb, data,
                                             "s" /*fmt*/, connection);
 }
 
 EAPI int
-ecore_dbus_method_add_match(Ecore_DBus_Server *svr, char *match)
+ecore_dbus_method_add_match(Ecore_DBus_Server *svr, char *match, 
Ecore_DBus_Method_Cb method_cb, void *data)
 {
    return ecore_dbus_message_new_method_call(svr,
                                             "org.freedesktop.DBus" 
/*destination*/,
                                             "/org/freedesktop/DBus" /*path*/,
                                             "org.freedesktop.DBus" 
/*interface*/,
                                             "AddMatch" /*method*/,
+                                            method_cb, data,
                                             "s" /*fmt*/, match);
 }
 
 EAPI int
-ecore_dbus_method_remove_match(Ecore_DBus_Server *svr, char *match)
+ecore_dbus_method_remove_match(Ecore_DBus_Server *svr, char *match, 
Ecore_DBus_Method_Cb method_cb, void *data)
 {
    return ecore_dbus_message_new_method_call(svr,
                                             "org.freedesktop.DBus" 
/*destination*/,
                                             "/org/freedesktop/DBus" /*path*/,
                                             "org.freedesktop.DBus" 
/*interface*/,
                                             "RemoveMatch" /*method*/,
+                                            method_cb, data,
                                             "s" /*fmt*/, match);
 }
===================================================================
RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore_dbus/ecore_dbus_private.h,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -3 -r1.10 -r1.11
--- ecore_dbus_private.h        27 Jul 2006 14:06:04 -0000      1.10
+++ ecore_dbus_private.h        27 Jul 2006 15:06:13 -0000      1.11
@@ -64,7 +64,6 @@
    int                      cnt_msg;
 
    Ecore_Hash              *messages;
-   unsigned int             hello;
    char                    *unique_name;
 };
 
@@ -72,6 +71,12 @@
 {
    /* server to send to */
    Ecore_DBus_Server *server;
+
+   /* callback */
+   struct {
+       Ecore_DBus_Method_Cb func;
+       void *data;
+   } cb;
 
    /* header fields */
    unsigned char      byte_order;



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