From 9315921d599377a9d4909c6c0731ac77bd92ecb8 Mon Sep 17 00:00:00 2001 From: barbieri Date: Sat, 13 Feb 2010 12:32:21 +0000 Subject: [PATCH] e_dbus/bluez: add support to register/unregister adapters agents By: Gustavo F. Padovan 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 | 72 +++++++++++++++++++++++++++++++++++++++++ src/lib/bluez/E_Bluez.h | 4 +++ src/lib/bluez/Makefile.am | 3 +- src/lib/bluez/e_bluez_adapter.c | 52 +++++++++++++++++++++++++++++ src/lib/bluez/e_bluez_element.c | 27 ++++++++++++++++ src/lib/bluez/e_bluez_private.h | 1 + 6 files changed, 158 insertions(+), 1 deletion(-) create mode 100644 src/lib/bluez/e_bluez_adapter.c diff --git a/src/bin/e_dbus_bluez_test.c b/src/bin/e_dbus_bluez_test.c index 3387bd7..3750666 100644 --- a/src/bin/e_dbus_bluez_test.c +++ b/src/bin/e_dbus_bluez_test.c @@ -5,6 +5,22 @@ #include 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} }; diff --git a/src/lib/bluez/E_Bluez.h b/src/lib/bluez/E_Bluez.h index 24c3b18..1066230 100644 --- a/src/lib/bluez/E_Bluez.h +++ b/src/lib/bluez/E_Bluez.h @@ -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 diff --git a/src/lib/bluez/Makefile.am b/src/lib/bluez/Makefile.am index 6bb2008..c5c7791 100644 --- a/src/lib/bluez/Makefile.am +++ b/src/lib/bluez/Makefile.am @@ -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 index 0000000..f8e8ce3 --- /dev/null +++ b/src/lib/bluez/e_bluez_adapter.c @@ -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); +} diff --git a/src/lib/bluez/e_bluez_element.c b/src/lib/bluez/e_bluez_element.c index a026799..00d9dea 100644 --- a/src/lib/bluez/e_bluez_element.c +++ b/src/lib/bluez/e_bluez_element.c @@ -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. * diff --git a/src/lib/bluez/e_bluez_private.h b/src/lib/bluez/e_bluez_private.h index 2b26e33..801ae45 100644 --- a/src/lib/bluez/e_bluez_private.h +++ b/src/lib/bluez/e_bluez_private.h @@ -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); -- 2.7.4