#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)
{
}
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;
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
{"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}
};
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);
e_bluez_system_shutdown();
- e_dbus_connection_close(c);
+ e_dbus_connection_close(_msgbus_data->conn);
eina_shutdown();
e_dbus_shutdown();
ecore_shutdown();
Eina_Inlist *agent_unregister;
Eina_Inlist *start_discovery;
Eina_Inlist *stop_discovery;
+ Eina_Inlist *create_paired_device;
} _pending;
struct {
Ecore_Idler *changed;
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;
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);
+}