[PATCH 13/16] e_dbus/bluez: add CreatePairedDevice method
authorbarbieri <barbieri@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sat, 27 Feb 2010 05:27:49 +0000 (05:27 +0000)
committerbarbieri <barbieri@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sat, 27 Feb 2010 05:27:49 +0000 (05:27 +0000)
By: Gustavo F. Padovan <padovan@profusion.mobi>

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

src/bin/e_dbus_bluez_test.c
src/lib/bluez/E_Bluez.h
src/lib/bluez/e_bluez_adapter.c

index 47dd29b..4e0f72f 100644 (file)
@@ -4,6 +4,17 @@
 #include <ctype.h>
 #include <errno.h>
 
+typedef struct _E_Msgbus_Data E_Msgbus_Data;
+
+struct _E_Msgbus_Data {
+       E_DBus_Connection *conn;
+       E_DBus_Object     *obj;
+};
+
+static E_Msgbus_Data *_msgbus_data = NULL;
+
+static E_DBus_Interface *iface = NULL;
+
 static void
 _method_success_check(void *data, DBusMessage *msg, DBusError *error)
 {
@@ -39,6 +50,29 @@ _default_adapter_callback(void *data, DBusMessage *msg, DBusError *err)
 }
 
 static void
+_create_paired_device_cb(void *data, DBusMessage *msg, DBusError *err)
+{
+       e_dbus_object_interface_detach(_msgbus_data->obj, iface);
+       _method_success_check(data, msg, err);
+}
+
+static DBusMessage*
+_request_pincode_cb(E_DBus_Object *obj, DBusMessage *msg)
+{
+       DBusMessage *reply;
+       char *pin[16];
+
+       printf("Enter PIN Code:\n");
+       scanf("%s", *pin);
+
+       reply = dbus_message_new_method_return(msg);
+       dbus_message_append_args(reply, DBUS_TYPE_STRING, &pin,
+                                DBUS_TYPE_INVALID);
+
+       return reply;
+}
+
+static void
 _elements_print(E_Bluez_Element **elements, unsigned int count)
 {
    unsigned int i;
@@ -450,6 +484,52 @@ _on_cmd_adapter_stop_discovery(char *cmd, char *args)
    return 1;
 }
 
+static int
+_on_cmd_adapter_create_paired_device(char *cmd, char *args)
+{
+   char *next_args, *path, *cap, *device;
+   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;
+   }
+   device = _tok(cap);
+   if (!device) {
+          fputs("ERROR: missing parameters name, type and value.\n", stderr);
+          return 1;
+   }
+
+   if (e_bluez_adapter_create_paired_device(element, path, cap, device,
+               _create_paired_device_cb, "adapter_create_paired_device")) {
+     printf(":::Creating Paired Device %s (%s)...\n", path, cap);
+     iface = e_dbus_interface_new("org.bluez.Agent");
+     if (!iface) {
+        fputs("WARNING: Cannot add org.bluez.Agent interface",stderr);
+        return 0;
+     }
+     _msgbus_data->obj = e_dbus_object_add(_msgbus_data->conn, path, NULL);
+     e_dbus_object_interface_attach(_msgbus_data->obj, iface);
+     e_dbus_interface_method_add(iface, "RequestPinCode", "o", "s",
+                    _request_pincode_cb);
+
+   }
+   else
+     fprintf(stderr, "ERROR: can't create paired device %s\n", path);
+
+   return 1;
+}
+
 /* Devices Commands */
 
 static int
@@ -493,6 +573,7 @@ _on_input(void *data, Ecore_Fd_Handler *fd_handler)
      {"adapter_set_powered", _on_cmd_adapter_set_powered},
      {"adapter_start_discovery", _on_cmd_adapter_start_discovery},
      {"adapter_stop_discovery", _on_cmd_adapter_stop_discovery},
+     {"adapter_create_paired_device", _on_cmd_adapter_create_paired_device},
      {"device_get_name", _on_cmd_device_get_name},
      {NULL, NULL}
    };
@@ -575,19 +656,18 @@ _on_input(void *data, Ecore_Fd_Handler *fd_handler)
 int
 main(int argc, char *argv[])
 {
-   E_DBus_Connection *c;
-
    ecore_init();
    e_dbus_init();
    eina_init();
 
-   c = e_dbus_bus_get(DBUS_BUS_SYSTEM);
-   if (!c) {
+   _msgbus_data = calloc(1, sizeof(E_Msgbus_Data));
+   _msgbus_data->conn = e_dbus_bus_get(DBUS_BUS_SYSTEM);
+   if (!_msgbus_data->conn) {
       printf("ERROR: can't connect to system session\n");
       return -1;
    }
 
-   e_bluez_system_init(c);
+   e_bluez_system_init(_msgbus_data->conn);
 
    ecore_event_handler_add(E_BLUEZ_EVENT_ELEMENT_ADD, _on_element_add, NULL);
    ecore_event_handler_add(E_BLUEZ_EVENT_ELEMENT_DEL, _on_element_del, NULL);
@@ -603,7 +683,7 @@ main(int argc, char *argv[])
 
    e_bluez_system_shutdown();
 
-   e_dbus_connection_close(c);
+   e_dbus_connection_close(_msgbus_data->conn);
    eina_shutdown();
    e_dbus_shutdown();
    ecore_shutdown();
index 5de2fd2..d5a981e 100644 (file)
@@ -62,6 +62,7 @@ extern "C" {
        Eina_Inlist *agent_unregister;
        Eina_Inlist *start_discovery;
        Eina_Inlist *stop_discovery;
+       Eina_Inlist *create_paired_device;
      } _pending;
      struct {
        Ecore_Idler *changed;
@@ -101,6 +102,7 @@ extern "C" {
   EAPI bool e_bluez_adapter_powered_set(E_Bluez_Element *profile, bool powered, E_DBus_Method_Return_Cb cb, const void *data) EINA_ARG_NONNULL(1) EINA_WARN_UNUSED_RESULT;
   EAPI bool e_bluez_adapter_start_discovery(E_Bluez_Element *element, E_DBus_Method_Return_Cb cb, const void *data) EINA_ARG_NONNULL(1) EINA_WARN_UNUSED_RESULT;
   EAPI bool e_bluez_adapter_stop_discovery(E_Bluez_Element *element, E_DBus_Method_Return_Cb cb, const void *data) EINA_ARG_NONNULL(1) EINA_WARN_UNUSED_RESULT;
+bool e_bluez_adapter_create_paired_device(E_Bluez_Element *element, const char *object_path, const char *capability, const char *device, E_DBus_Method_Return_Cb cb, const void *data) EINA_ARG_NONNULL(1,2,4) EINA_WARN_UNUSED_RESULT;
 
   /* Devices Methods */
   EAPI bool e_bluez_device_name_get(E_Bluez_Element *element, const char **name) EINA_ARG_NONNULL(1) EINA_WARN_UNUSED_RESULT;
index c23bf3d..264376e 100644 (file)
@@ -229,3 +229,45 @@ e_bluez_adapter_stop_discovery(E_Bluez_Element *element, E_DBus_Method_Return_Cb
    return e_bluez_element_call_full(element, name, NULL,
                   &element->_pending.stop_discovery, cb, data);
 }
+
+/**
+ * Create a new Paired Device.
+ *
+ * Call method CreatePairedDevice()
+ *
+ * @param element adapter's element
+ * @param object_path object to be registered.
+ * @param capability input/output agent capabilities
+ * @param device device to pair with
+ * @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_create_paired_device(E_Bluez_Element *element, const char *object_path, const char *capability, const char *device, E_DBus_Method_Return_Cb cb, const void *data)
+{
+   DBusMessageIter itr;
+   DBusMessage *msg;
+
+   const char name[] = "CreatePairedDevice";
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(element, 0);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(object_path, 0);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(device, 0);
+
+   msg = dbus_message_new_method_call
+     (e_bluez_system_bus_name_get(), element->path, element->interface,
+      name);
+
+   if (!msg)
+     return 0;
+
+   dbus_message_iter_init_append(msg, &itr);
+   dbus_message_iter_append_basic(&itr, DBUS_TYPE_STRING, &device);
+   dbus_message_iter_append_basic(&itr, DBUS_TYPE_OBJECT_PATH, &object_path);
+   dbus_message_iter_append_basic(&itr, DBUS_TYPE_STRING, &capability);
+
+   return e_bluez_element_message_send(element, name, NULL, msg,
+                        &element->_pending.create_paired_device, cb, data);
+}