Add a getter for DBusConnection pointer from E_DBus_Connection.
[framework/uifw/edbus.git] / src / lib / dbus / e_dbus_object.c
index ec48925..5212f9a 100644 (file)
@@ -1,17 +1,18 @@
-#include "E_DBus.h"
-#include "e_dbus_private.h"
-#include <Ecore_Data.h>
-#include <stdio.h>
-#include <stdlib.h>
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
 #include <string.h>
 
+#include "e_dbus_private.h"
+
 static E_DBus_Interface *introspectable_interface = NULL;
 static E_DBus_Interface *properties_interface = NULL;
 
 typedef struct E_DBus_Method E_DBus_Method;
 typedef struct E_DBus_Signal E_DBus_Signal;
 
-Ecore_Strbuf * e_dbus_object_introspect(E_DBus_Object *obj);
+Eina_Strbuf * e_dbus_object_introspect(E_DBus_Object *obj);
 
 static void e_dbus_object_unregister(DBusConnection *conn, void *user_data);
 static DBusHandlerResult e_dbus_object_handler(DBusConnection *conn, DBusMessage *message, void *user_data);
@@ -24,11 +25,11 @@ static void e_dbus_object_method_free(E_DBus_Method *m);
 static E_DBus_Signal *e_dbus_signal_new(const char *name, const char *signature);
 static void e_dbus_object_signal_free(E_DBus_Signal *s);
 
-static void _introspect_indent_append(Ecore_Strbuf *buf, int level);
-static void _introspect_interface_append(Ecore_Strbuf *buf, E_DBus_Interface *iface, int level);
-static void _introspect_method_append(Ecore_Strbuf *buf, E_DBus_Method *method, int level);
-static void _introspect_signal_append(Ecore_Strbuf *buf, E_DBus_Signal *signal, int level);
-static void _introspect_arg_append(Ecore_Strbuf *buf, const char *type, const char *direction, int level);
+static void _introspect_indent_append(Eina_Strbuf *buf, int level);
+static void _introspect_interface_append(Eina_Strbuf *buf, E_DBus_Interface *iface, int level);
+static void _introspect_method_append(Eina_Strbuf *buf, E_DBus_Method *method, int level);
+static void _introspect_signal_append(Eina_Strbuf *buf, E_DBus_Signal *signal, int level);
+static void _introspect_arg_append(Eina_Strbuf *buf, const char *type, const char *direction, int level);
 
 
 //static Eina_List *standard_methods = NULL;
@@ -83,7 +84,7 @@ static DBusMessage *
 cb_introspect(E_DBus_Object *obj, DBusMessage *msg)
 {
   DBusMessage *ret;
-  Ecore_Strbuf *buf;
+  Eina_Strbuf *buf;
 
   if (obj->introspection_dirty || !obj->introspection_data)
   {
@@ -95,8 +96,8 @@ cb_introspect(E_DBus_Object *obj, DBusMessage *msg)
     }
 
     if (obj->introspection_data) free(obj->introspection_data);
-    obj->introspection_data = strdup(ecore_strbuf_string_get(buf));
-    ecore_strbuf_free(buf);
+    obj->introspection_data = strdup(eina_strbuf_string_get(buf));
+    eina_strbuf_free(buf);
   }
   //printf("XML: \n\n%s\n\n", obj->introspection_data);
   ret = dbus_message_new_method_return(msg);
@@ -179,7 +180,7 @@ int
 e_dbus_object_init(void)
 {
   introspectable_interface = e_dbus_interface_new("org.freedesktop.DBus.Introspectable");
-  properties_interface = e_dbus_interface_new("org.freedesktop.DBus.Properties");
+  properties_interface = e_dbus_interface_new(E_DBUS_FDO_INTERFACE_PROPERTIES);
   if (!introspectable_interface || !properties_interface)
   {
     if (introspectable_interface) e_dbus_interface_unref(introspectable_interface);
@@ -205,19 +206,14 @@ e_dbus_object_shutdown(void)
   properties_interface = NULL;
 }
 
-/**
- * Add a dbus object.
- *
- * @param conn the connection on with the object should listen
- * @param object_path a unique string identifying an object (e.g. org/enlightenment/WindowManager
- * @param data custom data to set on the object (retrievable via
- *             e_dbus_object_data_get())
- */
 EAPI E_DBus_Object *
 e_dbus_object_add(E_DBus_Connection *conn, const char *object_path, void *data)
 {
   E_DBus_Object *obj;
 
+  EINA_SAFETY_ON_NULL_RETURN_VAL(conn, NULL);
+  EINA_SAFETY_ON_NULL_RETURN_VAL(object_path, NULL);
+
   obj = calloc(1, sizeof(E_DBus_Object));
   if (!obj) return NULL;
 
@@ -238,11 +234,6 @@ e_dbus_object_add(E_DBus_Connection *conn, const char *object_path, void *data)
   return obj;
 }
 
-/**
- * Free a dbus object
- *
- * @param obj the object to free
- */
 EAPI void
 e_dbus_object_free(E_DBus_Object *obj)
 {
@@ -250,7 +241,7 @@ e_dbus_object_free(E_DBus_Object *obj)
 
   if (!obj) return;
 
-  DEBUG(5, "e_dbus_object_free (%s)\n", obj->path);
+  DBG("e_dbus_object_free (%s)", obj->path);
   dbus_connection_unregister_object_path(obj->conn->conn, obj->path);
   e_dbus_connection_close(obj->conn);
 
@@ -263,32 +254,36 @@ e_dbus_object_free(E_DBus_Object *obj)
   free(obj);
 }
 
-/**
- * @brief Fetch the data pointer for a dbus object
- * @param obj the dbus object
- */
 EAPI void *
 e_dbus_object_data_get(E_DBus_Object *obj)
 {
   return obj->data;
 }
 
-/**
- * @brief Sets the callback to fetch properties from an object
- * @param obj the object
- * @param func the callback
- */
+EAPI E_DBus_Connection *
+e_dbus_object_conn_get(E_DBus_Object *obj)
+{
+  return obj->conn;
+}
+
+EAPI const char *
+e_dbus_object_path_get(E_DBus_Object *obj)
+{
+  return obj->path;
+}
+
+EAPI const Eina_List *
+e_dbus_object_interfaces_get(E_DBus_Object *obj)
+{
+  return obj->interfaces;
+}
+
 EAPI void
 e_dbus_object_property_get_cb_set(E_DBus_Object *obj, E_DBus_Object_Property_Get_Cb func)
 {
   obj->cb_property_get = func;
 }
 
-/**
- * @brief Sets the callback to set properties on an object
- * @param obj the object
- * @param func the callback
- */
 EAPI void
 e_dbus_object_property_set_cb_set(E_DBus_Object *obj, E_DBus_Object_Property_Set_Cb func)
 {
@@ -298,10 +293,13 @@ e_dbus_object_property_set_cb_set(E_DBus_Object *obj, E_DBus_Object_Property_Set
 EAPI void
 e_dbus_object_interface_attach(E_DBus_Object *obj, E_DBus_Interface *iface)
 {
+  EINA_SAFETY_ON_NULL_RETURN(obj);
+  EINA_SAFETY_ON_NULL_RETURN(iface);
+
   e_dbus_interface_ref(iface);
   obj->interfaces = eina_list_append(obj->interfaces, iface);
   obj->introspection_dirty = 1;
-  DEBUG(4, "e_dbus_object_interface_attach (%s, %s) ", obj->path, iface->name);
+  DBG("e_dbus_object_interface_attach (%s, %s) ", obj->path, iface->name);
 }
 
 EAPI void
@@ -309,9 +307,9 @@ e_dbus_object_interface_detach(E_DBus_Object *obj, E_DBus_Interface *iface)
 {
   E_DBus_Interface *found;
 
-  DEBUG(4, "e_dbus_object_interface_detach (%s, %s) ", obj->path, iface->name);
+  DBG("e_dbus_object_interface_detach (%s, %s) ", obj->path, iface->name);
   found = eina_list_data_find(obj->interfaces, iface);
-  if (found == NULL) return;
+  if (!found) return;
 
   obj->interfaces = eina_list_remove(obj->interfaces, iface);
   obj->introspection_dirty = 1;
@@ -322,13 +320,13 @@ EAPI void
 e_dbus_interface_ref(E_DBus_Interface *iface)
 {
   iface->refcount++;
-  DEBUG(4, "e_dbus_interface_ref (%s) = %d\n", iface->name, iface->refcount);
+  DBG("e_dbus_interface_ref (%s) = %d", iface->name, iface->refcount);
 }
 
 EAPI void
 e_dbus_interface_unref(E_DBus_Interface *iface)
 {
-  DEBUG(4, "e_dbus_interface_unref (%s) = %d\n", iface->name, iface->refcount - 1);
+  DBG("e_dbus_interface_unref (%s) = %d", iface->name, iface->refcount - 1);
   if (--(iface->refcount) == 0)
     e_dbus_interface_free(iface);
 }
@@ -348,47 +346,26 @@ e_dbus_interface_free(E_DBus_Interface *iface)
 }
 
 
-/**
- * Add a method to an object
- *
- * @param iface the E_DBus_Interface to which this method belongs
- * @param member the name of the method
- * @param signature  an optional message signature. if provided, then messages
- *                   with invalid signatures will be automatically rejected 
- *                   (an Error response will be sent) and introspection data
- *                   will be available.
- *
- * @return 1 if successful, 0 if failed (e.g. no memory)
- */
 EAPI int
 e_dbus_interface_method_add(E_DBus_Interface *iface, const char *member, const char *signature, const char *reply_signature, E_DBus_Method_Cb func)
 {
   E_DBus_Method *m;
 
   m = e_dbus_method_new(member, signature, reply_signature, func);
-  DEBUG(4, "Add method %s: %p\n", member, m);
+  DBG("E-dbus: Add method %s: %p", member, m);
   if (!m) return 0;
 
   iface->methods = eina_list_append(iface->methods, m);
   return 1;
 }
 
-/**
- * Add a signal to an object
- *
- * @param iface the E_DBus_Interface to which this signal belongs
- * @param name  the name of the signal
- * @param signature  an optional message signature.
- *
- * @return 1 if successful, 0 if failed (e.g. no memory)
- */
 EAPI int
 e_dbus_interface_signal_add(E_DBus_Interface *iface, const char *name, const char *signature)
 {
   E_DBus_Signal *s;
 
   s = e_dbus_signal_new(name, signature);
-  DEBUG(4, "Add signal %s: %p\n", name, s);
+  DBG("E-dbus: Add signal %s: %p", name, s);
   if (!s) return 0;
 
   iface->signals = eina_list_append(iface->signals, s);
@@ -517,6 +494,10 @@ e_dbus_object_handler(DBusConnection *conn, DBusMessage *message, void *user_dat
   else
     reply = m->func(obj, message);
 
+  /* user can choose reply later */
+  if (!reply)
+    return DBUS_HANDLER_RESULT_HANDLED;
+
   dbus_connection_send(conn, reply, &serial);
   dbus_message_unref(reply);
 
@@ -524,78 +505,78 @@ e_dbus_object_handler(DBusConnection *conn, DBusMessage *message, void *user_dat
 }
 
 static void
-e_dbus_object_unregister(DBusConnection *conn, void *user_data)
+e_dbus_object_unregister(DBusConnection *conn __UNUSED__, void *user_data __UNUSED__)
 {
   /* free up the object struct? */
 }
 
-Ecore_Strbuf *
+Eina_Strbuf *
 e_dbus_object_introspect(E_DBus_Object *obj)
 {
-  Ecore_Strbuf *buf;
+  Eina_Strbuf *buf;
   int level = 0;
   E_DBus_Interface *iface;
   Eina_List *l;
 
-  buf = ecore_strbuf_new();
+  buf = eina_strbuf_new();
 
   /* Doctype */
-  ecore_strbuf_append(buf, "<!DOCTYPE node PUBLIC \"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN\"\n \"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd\">\n");
+  eina_strbuf_append(buf, "<!DOCTYPE node PUBLIC \"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN\"\n \"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd\">\n");
 
-  ecore_strbuf_append(buf, "<node name=\"");
-  ecore_strbuf_append(buf, obj->path);
-  ecore_strbuf_append(buf, "\">\n");
+  eina_strbuf_append(buf, "<node name=\"");
+  eina_strbuf_append(buf, obj->path);
+  eina_strbuf_append(buf, "\">\n");
   level++;
 
   EINA_LIST_FOREACH(obj->interfaces, l, iface)
     _introspect_interface_append(buf, iface, level);
 
-  ecore_strbuf_append(buf, "</node>\n");
+  eina_strbuf_append(buf, "</node>\n");
   return buf;
 }
 
 static void
-_introspect_indent_append(Ecore_Strbuf *buf, int level)
+_introspect_indent_append(Eina_Strbuf *buf, int level)
 {
   /* XXX optimize this? */
   int i = level * 2;
   while (i-- > 0)
-    ecore_strbuf_append_char(buf, ' ');
+    eina_strbuf_append_char(buf, ' ');
 }
 static void
-_introspect_interface_append(Ecore_Strbuf *buf, E_DBus_Interface *iface, int level)
+_introspect_interface_append(Eina_Strbuf *buf, E_DBus_Interface *iface, int level)
 {
-  E_DBus_Method *method;
-  E_DBus_Signal *signal;
+  E_DBus_Method *m;
+  E_DBus_Signal *s;
   Eina_List *l;
 
   _introspect_indent_append(buf, level);
-  ecore_strbuf_append(buf, "<interface name=\"");
-  ecore_strbuf_append(buf, iface->name);
-  ecore_strbuf_append(buf, "\">\n");
+  eina_strbuf_append(buf, "<interface name=\"");
+  eina_strbuf_append(buf, iface->name);
+  eina_strbuf_append(buf, "\">\n");
   level++;
 
-  DEBUG(4, "introspect iface: %s\n", iface->name);
-  EINA_LIST_FOREACH(iface->methods, l, method)
-    _introspect_method_append(buf, method, level);
-  EINA_LIST_FOREACH(iface->signals, l, signal)
-    _introspect_signal_append(buf, signal, level);
+  DBG("introspect iface: %s", iface->name);
+  EINA_LIST_FOREACH(iface->methods, l, m)
+    _introspect_method_append(buf, m, level);
+  EINA_LIST_FOREACH(iface->signals, l, s)
+    _introspect_signal_append(buf, s, level);
 
   level--;
   _introspect_indent_append(buf, level);
-  ecore_strbuf_append(buf, "</interface>\n");
+  eina_strbuf_append(buf, "</interface>\n");
 }
 static void
-_introspect_method_append(Ecore_Strbuf *buf, E_DBus_Method *method, int level)
+_introspect_method_append(Eina_Strbuf *buf, E_DBus_Method *method, int level)
 {
   DBusSignatureIter iter;
   char *type;
 
   _introspect_indent_append(buf, level);
-  DEBUG(4, "introspect method: %s\n", method->member);
-  ecore_strbuf_append(buf, "<method name=\"");
-  ecore_strbuf_append(buf, method->member);
-  ecore_strbuf_append(buf, "\">\n");
+  DBG("introspect method: %s\n", method->member);
+  eina_strbuf_append(buf, "<method name=\"");
+  eina_strbuf_append(buf, method->member);
+  eina_strbuf_append(buf, "\">\n");
   level++;
 
   /* append args */
@@ -630,28 +611,28 @@ _introspect_method_append(Ecore_Strbuf *buf, E_DBus_Method *method, int level)
 
   level--;
   _introspect_indent_append(buf, level);
-  ecore_strbuf_append(buf, "</method>\n");
+  eina_strbuf_append(buf, "</method>\n");
 }
 
 static void
-_introspect_signal_append(Ecore_Strbuf *buf, E_DBus_Signal *signal, int level)
+_introspect_signal_append(Eina_Strbuf *buf, E_DBus_Signal *s, int level)
 {
   DBusSignatureIter iter;
   char *type;
 
   _introspect_indent_append(buf, level);
-  DEBUG(4, "introspect signal: %s\n", signal->name);
-  ecore_strbuf_append(buf, "<signal name=\"");
-  ecore_strbuf_append(buf, signal->name);
-  ecore_strbuf_append(buf, "\">\n");
+  DBG("introspect signal: %s", s->name);
+  eina_strbuf_append(buf, "<signal name=\"");
+  eina_strbuf_append(buf, s->name);
+  eina_strbuf_append(buf, "\">\n");
   level++;
 
   /* append args */
-  if (signal->signature &&
-      signal->signature[0] &&
-      dbus_signature_validate(signal->signature, NULL))
+  if (s->signature &&
+      s->signature[0] &&
+      dbus_signature_validate(s->signature, NULL))
   {
-    dbus_signature_iter_init(&iter, signal->signature);
+    dbus_signature_iter_init(&iter, s->signature);
     while ((type = dbus_signature_iter_get_signature(&iter)))
     {
       _introspect_arg_append(buf, type, NULL, level);
@@ -663,20 +644,27 @@ _introspect_signal_append(Ecore_Strbuf *buf, E_DBus_Signal *signal, int level)
 
   level--;
   _introspect_indent_append(buf, level);
-  ecore_strbuf_append(buf, "</signal>\n");
+  eina_strbuf_append(buf, "</signal>\n");
 }
 
 static void
-_introspect_arg_append(Ecore_Strbuf *buf, const char *type, const char *direction, int level)
+_introspect_arg_append(Eina_Strbuf *buf, const char *type, const char *direction, int level)
 {
   _introspect_indent_append(buf, level);
-  ecore_strbuf_append(buf, "<arg type=\"");
-  ecore_strbuf_append(buf, type);
+  eina_strbuf_append(buf, "<arg type=\"");
+  eina_strbuf_append(buf, type);
   if (direction)
   {
-    ecore_strbuf_append(buf, "\" direction=\"");
-    ecore_strbuf_append(buf, direction);
+    eina_strbuf_append(buf, "\" direction=\"");
+    eina_strbuf_append(buf, direction);
   }
-  ecore_strbuf_append(buf, "\"/>\n");
+  eina_strbuf_append(buf, "\"/>\n");
 }
 
+
+
+DBusConnection *e_dbus_conn_object_get(E_DBus_Connection *conn)
+{
+   if (conn!=NULL)
+     return conn->conn;
+}