zehortigoza pushed a commit to branch master.

commit 1cf49fd906a5d4e7a06c2a3d2ddffda37e708cbc
Author: Eduardo Lima (Etrunko) <[email protected]>
Date:   Thu Jul 4 17:23:52 2013 -0300

    Updated Eldbus connect_address example
    
    See description on the header of the source file
    
    Signed-off-by: Eduardo Lima (Etrunko) <[email protected]>
---
 src/examples/connect-address.c | 248 +++++++++++++++++++++++++++++++++++------
 1 file changed, 211 insertions(+), 37 deletions(-)

diff --git a/src/examples/connect-address.c b/src/examples/connect-address.c
index 11858f4..242960e 100644
--- a/src/examples/connect-address.c
+++ b/src/examples/connect-address.c
@@ -1,56 +1,200 @@
-//Compile with:
-// gcc -o client client.c `pkg-config --cflags --libs eldbus ecore eina`
+/*
+ * compile with:
+ * gcc -o client client.c `pkg-config --cflags --libs eldbus ecore eina`
+ *
+ * This simple example connects to an IBus daemon running on the machine.
+ * IBus daemon is a dbus daemon running apart from system or session buses.
+ *
+ * Requires ibus-daemon to be running, for instance:
+ * $ ibus-daemon -v -r -s
+ *
+ * After starting ibus-daemon, check for its address on the file located on
+ * ~/.config/ibus/bus/ directory. For instance:
+ *
+ * $ cat ~/.config/ibus/bus/809ee018614317e782464b8900000029-unix-0
+ * # This file is created by ibus-daemon, please do not modify it
+ * 
IBUS_ADDRESS=unix:abstract=/tmp/dbus-VOJaWARY,guid=e0082807a08a81ad22e0d3f551d48d5e
+ * IBUS_DAEMON_PID=3697
+ *
+ * Export or set the IBUS_ADDRESS environment variable and run this program. 
To exit,
+ * just hit ctrl+c
+ */
 
 #include <stdlib.h>
 
+#define _GNU_SOURCE
+#include <signal.h>
+
 #include "Eldbus.h"
 #include <Ecore.h>
 
-#define BUS "org.freedesktop.IBus"
-#define PATH "/org/freedesktop/IBus"
-#define INTERFACE "org.freedesktop.IBus"
+#define IBUS_BUS "org.freedesktop.IBus"
+#define PANEL_BUS "org.freedesktop.IBUS.Panel"
+#define PANEL_INTERFACE "org.freedesktop.IBUS.Panel"
+
+static int _conn_addr_log_dom = -1;
+#define DBG(...) EINA_LOG_DOM_DBG(_conn_addr_log_dom, __VA_ARGS__)
+#define INF(...) EINA_LOG_DOM_INFO(_conn_addr_log_dom, __VA_ARGS__)
+#define ERR(...) EINA_LOG_DOM_ERR(_conn_addr_log_dom, __VA_ARGS__)
 
-static int _client_log_dom = -1;
-#define ERR(...)      EINA_LOG_DOM_ERR(_client_log_dom, __VA_ARGS__)
+static Eldbus_Connection *conn;
+static Eldbus_Signal_Handler *acquired;
+static Eldbus_Signal_Handler *lost;
 
 static void
-_on_registry_changed(void *context EINA_UNUSED, const Eldbus_Message *msg 
EINA_UNUSED)
+on_name_owner_changed(void *data EINA_UNUSED, const char *bus, const char 
*old_id, const char *new_id EINA_UNUSED)
 {
-   printf("RegistryChanged\n\n");
+   INF("Name owner changed: bus=%s | old=%s | new=%s\n", bus, old_id, new_id);
 }
 
 static void
-_on_global_engine_changed(void *context EINA_UNUSED, const Eldbus_Message *msg)
+on_name_acquired(void *data EINA_UNUSED, const Eldbus_Message *msg)
 {
-   const char *txt;
-   if (eldbus_message_arguments_get(msg, "s", &txt))
-     printf("GlobalEngineChanged %s\n", txt);
+   const char *error, *error_msg, *name;
+
+   if (eldbus_message_error_get(msg, &error, &error_msg))
+     {
+        ERR("Name acquired message error: %s: %s\n", error, error_msg);
+        return;
+     }
+
+   if (!eldbus_message_arguments_get(msg, "s", &name))
+     {
+        ERR("Error reading message arguments");
+        return;
+     }
+
+   INF("Name acquired: %s", name);
 }
 
 static void
-on_name_owner_changed(void *data EINA_UNUSED, const char *bus, const char 
*old_id, const char *new_id EINA_UNUSED)
+on_name_lost(void *data EINA_UNUSED, const Eldbus_Message *msg)
 {
-   printf("Bus=%s | old=%s | new=%s\n", bus, old_id, new_id);
+   const char *error, *error_msg, *name;
+
+   if (eldbus_message_error_get(msg, &error, &error_msg))
+     {
+        ERR("Name lost message error: %s: %s\n", error, error_msg);
+        return;
+     }
+
+   if (!eldbus_message_arguments_get(msg, "s", &name))
+     {
+        ERR("Error reading message arguments");
+        return;
+     }
+
+   INF("Name lost: %s", name);
+}
+
+static void
+name_request_cb(void *data EINA_UNUSED, const Eldbus_Message *msg, 
Eldbus_Pending *pending EINA_UNUSED)
+{
+   const char *error, *error_msg;
+   unsigned int reply;
+
+   if (eldbus_message_error_get(msg, &error, &error_msg))
+     {
+        ERR("Name request message error: %s: %s\n", error, error_msg);
+        return;
+     }
+
+   if (!eldbus_message_arguments_get(msg, "u", &reply))
+     {
+        ERR("Error reading message arguments");
+        return;
+     }
+
+   switch (reply)
+     {
+      case ELDBUS_NAME_REQUEST_REPLY_PRIMARY_OWNER:
+         INF("Got primary ownership");
+         break;
+      case ELDBUS_NAME_REQUEST_REPLY_IN_QUEUE:
+         INF("Got queued for ownership");
+         break;
+      case ELDBUS_NAME_REQUEST_REPLY_EXISTS:
+         INF("Already in queue for ownership");
+         break;
+      case ELDBUS_NAME_REQUEST_REPLY_ALREADY_OWNER:
+         INF("Already primary owner");
+         break;
+      default:
+         ERR("Unexpected reply: %d", reply);
+         break;
+     }
 }
 
 static Eina_Bool
-finish(void *data EINA_UNUSED)
+main_loop_quit_idler(void *data EINA_UNUSED)
 {
+   eldbus_signal_handler_del(acquired);
+   eldbus_signal_handler_del(lost);
+   eldbus_connection_unref(conn);
+
+   INF("Finishing");
    ecore_main_loop_quit();
    return ECORE_CALLBACK_CANCEL;
 }
 
+static void
+name_release_cb(void *data EINA_UNUSED, const Eldbus_Message *msg, 
Eldbus_Pending *pending EINA_UNUSED)
+{
+   const char *error, *error_msg;
+   unsigned int reply;
+
+   if (eldbus_message_error_get(msg, &error, &error_msg))
+     {
+        ERR("Name release message error: %s: %s\n", error, error_msg);
+        return;
+     }
+
+   if (!eldbus_message_arguments_get(msg, "u", &reply))
+     {
+        ERR("Error reading message arguments");
+        return;
+     }
+
+   switch (reply)
+     {
+      case ELDBUS_NAME_RELEASE_REPLY_RELEASED:
+         INF("Name released");
+         break;
+      case ELDBUS_NAME_RELEASE_REPLY_NON_EXISTENT:
+         INF("Name non existent");
+         break;
+      case ELDBUS_NAME_RELEASE_REPLY_NOT_OWNER:
+         INF("Not owner");
+         break;
+      default:
+         ERR("Unexpected reply: %d", reply);
+         break;
+     }
+
+   ecore_idler_add(main_loop_quit_idler, NULL);
+}
+
+static void
+finish(int foo EINA_UNUSED)
+{
+   eldbus_name_release(conn, PANEL_BUS, name_release_cb, NULL);
+}
+
 int
-main(void)
+main(int argc EINA_UNUSED, char *argv[] EINA_UNUSED)
 {
-   Eldbus_Connection *conn;
-   Eldbus_Object *obj;
-   Eldbus_Proxy *proxy;
    const char *address;
 
-   eina_init();
-   _client_log_dom = eina_log_domain_register("connect_address", 
EINA_COLOR_CYAN);
-   if (_client_log_dom < 0)
+   /* Init */
+   if (!eina_init())
+     {
+        EINA_LOG_ERR("Failed to initialize Eina");
+        return 1;
+     }
+
+   _conn_addr_log_dom = eina_log_domain_register("connect_address", 
EINA_COLOR_CYAN);
+
+   if (_conn_addr_log_dom < 0)
      {
         EINA_LOG_ERR("Unable to create 'client' log domain");
         goto exit_eina;
@@ -62,37 +206,67 @@ main(void)
         goto exit_eina;
      }
 
-   ecore_init();
-   eldbus_init();
+   if (!ecore_init())
+     {
+        EINA_LOG_ERR("Failed to initialize Ecore");
+        goto exit_eina;
+     }
+
+   if (!eldbus_init())
+     {
+        EINA_LOG_ERR("Failed to initialize Eldbus");
+        goto exit_ecore;
+     }
 
-   printf("Connecting to %s\n", address);
+   signal(SIGTERM, finish);
+   signal(SIGINT, finish);
+
+   /* Connect */
+   printf("Connecting to IBus with address: %s\n", address);
    conn = eldbus_address_connection_get(address);
 
    if (!conn)
      {
-        ERR("Failed to get dbus connection to address '%s'", address);
+        ERR("Failed to get dbus connection with address '%s'\n", address);
         goto end;
      }
 
-   printf("CONNECTED!!!\n");
-   obj = eldbus_object_get(conn, BUS, PATH);
-   proxy = eldbus_proxy_get(obj, INTERFACE);
-   eldbus_proxy_signal_handler_add(proxy, "RegistryChanged", 
_on_registry_changed, NULL);
-   eldbus_proxy_signal_handler_add(proxy, "GlobalEngineChanged", 
_on_global_engine_changed, NULL);
+   eldbus_name_owner_changed_callback_add(conn, IBUS_BUS, 
on_name_owner_changed,
+                                         conn, EINA_TRUE);
 
-   eldbus_name_owner_changed_callback_add(conn, BUS, on_name_owner_changed,
+   eldbus_name_owner_changed_callback_add(conn, PANEL_BUS, 
on_name_owner_changed,
                                          conn, EINA_TRUE);
-   ecore_timer_add(30, finish, NULL);
 
-   ecore_main_loop_begin();
+   acquired = eldbus_signal_handler_add(conn,
+                                        ELDBUS_FDO_BUS,
+                                        ELDBUS_FDO_PATH,
+                                        PANEL_INTERFACE,
+                                        "NameAcquired",
+                                        on_name_acquired,
+                                        NULL);
 
-   eldbus_connection_unref(conn);
+   lost = eldbus_signal_handler_add(conn,
+                                    ELDBUS_FDO_BUS,
+                                    ELDBUS_FDO_PATH,
+                                    PANEL_INTERFACE,
+                                    "NameLost",
+                                    on_name_lost,
+                                    NULL);
+
+   /* Request ownership of PANEL_BUS */
+   eldbus_name_request(conn, PANEL_BUS,
+                       ELDBUS_NAME_REQUEST_FLAG_REPLACE_EXISTING | 
ELDBUS_NAME_REQUEST_FLAG_ALLOW_REPLACEMENT,
+                       name_request_cb, NULL);
+
+   ecore_main_loop_begin();
 
 end:
    eldbus_shutdown();
+
+exit_ecore:
    ecore_shutdown();
+   eina_log_domain_unregister(_conn_addr_log_dom);
 
-   eina_log_domain_unregister(_client_log_dom);
 exit_eina:
    eina_shutdown();
 

-- 

------------------------------------------------------------------------------
Get your SQL database under version control now!
Version control is standard for application code, but databases havent 
caught up. So what steps can you take to put your SQL databases under 
version control? Why should you start doing it? Read more to find out.
http://pubads.g.doubleclick.net/gampad/clk?id=49501711&iu=/4140/ostg.clktrk

Reply via email to