e_dbus/bluez: add support to register/unregister adapters agents
authorbarbieri <barbieri@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sat, 13 Feb 2010 12:32:21 +0000 (12:32 +0000)
committerbarbieri <barbieri@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sat, 13 Feb 2010 12:32:21 +0000 (12:32 +0000)
By: Gustavo F. Padovan <padovan@profusion.mobi>

git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/e_dbus@46135 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/bin/e_dbus_bluez_test.c
src/lib/bluez/E_Bluez.h
src/lib/bluez/Makefile.am
src/lib/bluez/e_bluez_adapter.c [new file with mode: 0644]
src/lib/bluez/e_bluez_element.c
src/lib/bluez/e_bluez_private.h

index 3387bd7..3750666 100644 (file)
@@ -5,6 +5,22 @@
 #include <errno.h>
 
 static void
+_method_success_check(void *data, DBusMessage *msg, DBusError *error)
+{
+   const char *name = data;
+
+   if ((!error) || (!dbus_error_is_set(error)))
+     {
+       printf("SUCCESS: method %s() finished successfully.\n", name);
+       return;
+     }
+
+   printf("FAILURE: method %s() finished with error: %s %s\n",
+         name, error->name, error->message);
+   dbus_error_free(error);
+}
+
+static void
 _elements_print(E_Bluez_Element **elements, unsigned int count)
 {
    unsigned int i;
@@ -246,6 +262,60 @@ _on_cmd_manager_get(char *cmd, char *args)
 }
 
 static int
+_on_cmd_adapter_register_agent(char *cmd, char *args)
+{
+   char *next_args, *path, *cap;
+   E_Bluez_Element *element = _element_from_args(args, &next_args);
+
+   if (!element)
+          return 1;
+
+   if (!next_args) {
+          fputs("ERROR: missing parameters name, type and value.\n", stderr);
+          return 1;
+   }
+
+   path = next_args;
+   cap = _tok(path);
+   if (!cap) {
+          fputs("ERROR: missing parameters name, type and value.\n", stderr);
+          return 1;
+   }
+
+   if (e_bluez_adapter_agent_register(element,
+       path, cap, _method_success_check, "adapter_register_agent"))
+     printf(":::Registering agent %s (%s)...\n", path, cap);
+   else
+     fprintf(stderr, "ERROR: can't register agent %s\n", path);
+
+   return 1;
+}
+
+static int
+_on_cmd_adapter_unregister_agent(char *cmd, char *args)
+{
+   char *path, *next_args;
+   E_Bluez_Element *element = _element_from_args(args, &next_args);
+
+   if (!element)
+          return 1;
+
+   if (!args)
+     {
+       fputs("ERROR: missing the object path\n", stderr);
+       return 1;
+     }
+
+   path = next_args;
+   if (e_bluez_adapter_agent_unregister(element,
+       path, _method_success_check, "adapter_unregister_agent"))
+     printf(":::Unregistering agent %s...\n", path);
+   else
+     fprintf(stderr, "ERROR: can't unregister agent %s\n", path);
+
+   return 1;
+}
+static int
 _on_input(void *data, Ecore_Fd_Handler *fd_handler)
 {
    char buf[256];
@@ -261,6 +331,8 @@ _on_input(void *data, Ecore_Fd_Handler *fd_handler)
      {"get_properties", _on_cmd_get_properties},
      {"set_property", _on_cmd_property_set},
      {"manager_get", _on_cmd_manager_get},
+     {"adapter_register_agent", _on_cmd_adapter_register_agent},
+     {"adapter_unregister_agent", _on_cmd_adapter_unregister_agent},
      {NULL, NULL}
    };
 
index 24c3b18..1066230 100644 (file)
@@ -71,6 +71,10 @@ extern "C" {
   /* Manager Methods */
   EAPI E_Bluez_Element *e_bluez_manager_get(void) EINA_WARN_UNUSED_RESULT;
 
+  /* Adapter Methods */
+  EAPI bool e_bluez_adapter_agent_register(E_Bluez_Element *element, const char *object_path, const char *capability, E_DBus_Method_Return_Cb cb, const void *data) EINA_ARG_NONNULL(1) EINA_WARN_UNUSED_RESULT;
+  EAPI bool e_bluez_adapter_agent_unregister(E_Bluez_Element *element, const char *object_path, E_DBus_Method_Return_Cb cb, const void *data) EINA_ARG_NONNULL(1) EINA_WARN_UNUSED_RESULT;
+
   /* Low-Level API:
    *
    * Should just be used to work around problems until proper solution
index 6bb2008..c5c7791 100644 (file)
@@ -14,7 +14,8 @@ E_Bluez.h \
 e_bluez_private.h \
 e_bluez.c \
 e_bluez_element.c \
-e_bluez_manager.c
+e_bluez_manager.c \
+e_bluez_adapter.c
 
 libebluez_la_LIBADD = \
 @EDBUS_LIBS@ @EVAS_LIBS@ \
diff --git a/src/lib/bluez/e_bluez_adapter.c b/src/lib/bluez/e_bluez_adapter.c
new file mode 100644 (file)
index 0000000..f8e8ce3
--- /dev/null
@@ -0,0 +1,52 @@
+#include "e_bluez_private.h"
+
+/**
+ * Register new agent for handling user requests.
+ *
+ * Call method RegisterAgent(object) on server in order to
+ * register new agent for handling user requests.
+ *
+ * @param element adapter's element
+ * @param object_path object to be registered.
+ * @param capability input/output agent capabilities
+ * @param cb function to call when server replies or some error happens.
+ * @param data data to give to cb when it is called.
+ *
+ * @return 1 on success, 0 otherwise.
+ */
+bool
+e_bluez_adapter_agent_register(E_Bluez_Element *element, const char *object_path, const char *capability, E_DBus_Method_Return_Cb cb, const void *data)
+{
+   const char name[] = "RegisterAgent";
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(object_path, 0);
+
+   return e_bluez_element_call_with_path_and_string
+     (element, name, object_path, capability, NULL,
+      &element->_pending.agent_register, cb, data);
+}
+
+/**
+ * Unregister an existing agent.
+ *
+ * Call method UnregisterAgent(object) on server in order to
+ * unregister an existing agent.
+ *
+ * @param element adapter's element
+ * @param object_path agent to be unregistered.
+ * @param cb function to call when server replies or some error happens.
+ * @param data data to give to cb when it is called.
+ *
+ * @return 1 on success, 0 otherwise.
+ */
+bool
+e_bluez_adapter_agent_unregister(E_Bluez_Element *element, const char *object_path, E_DBus_Method_Return_Cb cb, const void *data)
+{
+   const char name[] = "UnregisterAgent";
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(object_path, 0);
+
+   return e_bluez_element_call_with_path
+     (element, name, object_path, NULL,
+      &element->_pending.agent_unregister, cb, data);
+}
index a026799..00d9dea 100644 (file)
@@ -1560,6 +1560,33 @@ e_bluez_element_call_with_string(E_Bluez_Element *element, const char *method_na
      (element, method_name, cb, msg, pending, user_cb, user_data);
 }
 
+bool
+e_bluez_element_call_with_path_and_string(E_Bluez_Element *element, const char *method_name, const char *path, const char *string, E_DBus_Method_Return_Cb cb, Eina_Inlist **pending, E_DBus_Method_Return_Cb user_cb, const void *user_data)
+{
+   DBusMessageIter itr;
+   DBusMessage *msg;
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(element, 0);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(method_name, 0);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(path, 0);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(string, 0);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(pending, 0);
+
+   msg = dbus_message_new_method_call
+     (e_bluez_system_bus_name_get(), element->path, element->interface,
+      method_name);
+
+   if (!msg)
+     return 0;
+
+   dbus_message_iter_init_append(msg, &itr);
+   dbus_message_iter_append_basic(&itr, DBUS_TYPE_OBJECT_PATH, &path);
+   dbus_message_iter_append_basic(&itr, DBUS_TYPE_STRING, &string);
+
+   return e_bluez_element_message_send
+     (element, method_name, cb, msg, pending, user_cb, user_data);
+}
+
 /**
  * Get property type.
  *
index 2b26e33..801ae45 100644 (file)
@@ -113,3 +113,4 @@ bool e_bluez_element_message_send(E_Bluez_Element *element, const char *method_n
 bool e_bluez_element_call_full(E_Bluez_Element *element, const char *method_name, E_DBus_Method_Return_Cb cb, Eina_Inlist **pending, E_DBus_Method_Return_Cb user_cb, const void *user_data);
 bool e_bluez_element_call_with_path(E_Bluez_Element *element, const char *method_name, const char *string, E_DBus_Method_Return_Cb cb, Eina_Inlist **pending, E_DBus_Method_Return_Cb user_cb, const void *user_data);
 bool e_bluez_element_call_with_string(E_Bluez_Element *element, const char *method_name, const char *string, E_DBus_Method_Return_Cb cb, Eina_Inlist **pending, E_DBus_Method_Return_Cb user_cb, const void *user_data);
+bool e_bluez_element_call_with_path_and_string(E_Bluez_Element *element, const char *method_name, const char *path, const char *string, E_DBus_Method_Return_Cb cb, Eina_Inlist **pending, E_DBus_Method_Return_Cb user_cb, const void *user_data);