11 typedef struct _E_Msgbus_Data E_Msgbus_Data;
13 struct _E_Msgbus_Data {
14 E_DBus_Connection *conn;
18 static E_Msgbus_Data *_msgbus_data = NULL;
20 static E_DBus_Interface *iface = NULL;
23 _method_success_check(void *data, __UNUSED__ DBusMessage *msg, DBusError *error)
25 const char *name = data;
27 if ((!error) || (!dbus_error_is_set(error)))
29 printf("SUCCESS: method %s() finished successfully.\n", name);
33 printf("FAILURE: method %s() finished with error: %s %s\n",
34 name, error->name, error->message);
35 dbus_error_free(error);
39 _default_adapter_callback(__UNUSED__ void *data, DBusMessage *msg, __UNUSED__ DBusError *err)
41 E_Bluez_Element *element;
44 if (dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
45 DBUS_TYPE_INVALID) == EINA_FALSE)
46 printf("FAILURE: failed to get default adapter\n");
48 printf("SUCCESS: default adapter: %s\n", path);
50 element = e_bluez_element_get(path);
51 e_bluez_element_print(stdout, element);
57 _create_paired_device_cb(void *data, DBusMessage *msg, DBusError *err)
59 e_dbus_object_interface_detach(_msgbus_data->obj, iface);
60 e_dbus_object_free(_msgbus_data->obj);
61 e_dbus_interface_unref(iface);
62 _method_success_check(data, msg, err);
66 _request_pincode_cb(__UNUSED__ E_DBus_Object *obj, DBusMessage *msg)
73 printf("Enter PIN Code:\n");
74 ret = scanf("%15s", p);
78 reply = dbus_message_new_method_return(msg);
79 dbus_message_append_args(reply, DBUS_TYPE_STRING, &p,
86 _elements_print(E_Bluez_Element **elements, unsigned int count)
89 for (i = 0; i < count; i++)
91 printf("--- element %d:\n", i);
92 e_bluez_element_print(stdout, elements[i]);
95 printf("END: all elements count = %u\n", count);
99 _on_element_add(__UNUSED__ void *data, __UNUSED__ int type, void *info)
101 E_Bluez_Element *element = info;
102 printf(">>> %s\n", element->path);
103 return ECORE_CALLBACK_RENEW;
107 _on_element_del(__UNUSED__ void *data, __UNUSED__ int type, void *info)
109 E_Bluez_Element *element = info;
110 printf("<<< %s\n", element->path);
111 return ECORE_CALLBACK_RENEW;
115 _on_element_updated(__UNUSED__ void *data, __UNUSED__ int type, void *info)
117 E_Bluez_Element *element = info;
118 printf("!!! %s\n", element->path);
119 e_bluez_element_print(stderr, element);
120 return ECORE_CALLBACK_RENEW;
124 _on_device_found(__UNUSED__ void *data, int __UNUSED__ type, void *info)
126 E_Bluez_Device_Found *device = info;
127 printf("!!! %s\n", device->adapter->path);
128 printf(":::DeviceFound %s\n", device->name);
129 e_bluez_element_array_print(stderr, device->array);
132 e_bluez_devicefound_free(device);
133 return ECORE_CALLBACK_RENEW;
137 _on_cmd_quit(__UNUSED__ char *cmd, __UNUSED__ char *args)
139 fputs("Bye!\n", stderr);
140 ecore_main_loop_quit();
145 _on_cmd_sync(__UNUSED__ char *cmd, __UNUSED__ char *args)
147 e_bluez_manager_sync_elements();
148 return ECORE_CALLBACK_RENEW;
169 _on_cmd_get_all(__UNUSED__ char *cmd, char *args)
171 E_Bluez_Element **elements;
182 ret = e_bluez_elements_get_all_type(type, &count, &elements);
184 ret = e_bluez_elements_get_all(&count, &elements);
187 fputs("ERROR: could not get elements\n", stderr);
190 printf("BEG: all elements type=%s count = %d\n", type, count);
191 _elements_print(elements, count);
194 return ECORE_CALLBACK_RENEW;
197 static E_Bluez_Element *
198 _element_from_args(char *args, char **next_args)
200 E_Bluez_Element *element;
204 fputs("ERROR: missing element path\n", stderr);
209 *next_args = _tok(args);
210 element = e_bluez_element_get(args);
212 fprintf(stderr, "ERROR: no element called \"%s\".\n", args);
218 _on_cmd_print(__UNUSED__ char *cmd, char *args)
221 E_Bluez_Element *element = _element_from_args(args, &next_args);
223 e_bluez_element_print(stdout, element);
224 return ECORE_CALLBACK_RENEW;
228 _on_cmd_get_properties(__UNUSED__ char *cmd, char *args)
231 E_Bluez_Element *element = _element_from_args(args, &next_args);
233 e_bluez_element_properties_sync(element);
234 return ECORE_CALLBACK_RENEW;
238 _on_cmd_property_set(__UNUSED__ char *cmd, char *args)
240 char *next_args, *name, *p;
241 E_Bluez_Element *element = _element_from_args(args, &next_args);
249 return ECORE_CALLBACK_RENEW;
253 fputs("ERROR: missing parameters name, type and value.\n", stderr);
254 return ECORE_CALLBACK_RENEW;
261 fputs("ERROR: missing parameters type and value.\n", stderr);
262 return ECORE_CALLBACK_RENEW;
268 fputs("ERROR: missing parameter value.\n", stderr);
269 return ECORE_CALLBACK_RENEW;
275 case DBUS_TYPE_BOOLEAN:
276 vlong = !!atol(next_args);
278 fprintf(stderr, "DBG: boolean is: %ld\n", vlong);
280 case DBUS_TYPE_UINT16:
281 vu16 = strtol(next_args, &p, 0);
284 fprintf(stderr, "ERROR: invalid number \"%s\".\n", next_args);
285 return ECORE_CALLBACK_RENEW;
288 fprintf(stderr, "DBG: u16 is: %hu\n", vu16);
290 case DBUS_TYPE_UINT32:
291 vu32 = strtol(next_args, &p, 0);
294 fprintf(stderr, "ERROR: invalid number \"%s\".\n", next_args);
295 return ECORE_CALLBACK_RENEW;
298 fprintf(stderr, "DBG: u16 is: %u\n", vu32);
300 case DBUS_TYPE_STRING:
301 case DBUS_TYPE_OBJECT_PATH:
302 p = next_args + strlen(next_args);
305 while (p > next_args && isspace(*p))
309 fprintf(stderr, "ERROR: invalid string \"%s\".\n", next_args);
313 fprintf(stderr, "DBG: string is: \"%s\"\n", next_args);
316 fprintf(stderr, "ERROR: don't know how to parse type '%c' (%d)\n",
318 return ECORE_CALLBACK_RENEW;
321 fprintf(stderr, "set_property %s [%p] %s %c %p...\n",
322 args, element, name, type, value);
323 if (!e_bluez_element_property_set(element, name, type, value))
324 fputs("ERROR: error setting property.\n", stderr);
326 return ECORE_CALLBACK_RENEW;
329 /* Manager Commands */
332 _on_cmd_manager_get(__UNUSED__ char *cmd, __UNUSED__ char *args)
334 E_Bluez_Element *element;
335 element = e_bluez_manager_get();
336 e_bluez_element_print(stderr, element);
337 return ECORE_CALLBACK_RENEW;
341 _on_cmd_manager_default_adapter(__UNUSED__ char *cmd, __UNUSED__ char *args)
343 return e_bluez_manager_default_adapter(_default_adapter_callback, NULL);
346 /* Adapter Commands */
349 _on_cmd_adapter_register_agent(__UNUSED__ char *cmd, char *args)
351 char *next_args, *path, *cap;
352 E_Bluez_Element *element = _element_from_args(args, &next_args);
355 return ECORE_CALLBACK_RENEW;
358 fputs("ERROR: missing parameters name, type and value.\n", stderr);
359 return ECORE_CALLBACK_RENEW;
365 fputs("ERROR: missing parameters name, type and value.\n", stderr);
366 return ECORE_CALLBACK_RENEW;
369 if (e_bluez_adapter_agent_register(element,
370 path, cap, _method_success_check, "adapter_register_agent"))
371 printf(":::Registering agent %s (%s)...\n", path, cap);
373 fprintf(stderr, "ERROR: can't register agent %s\n", path);
375 return ECORE_CALLBACK_RENEW;
379 _on_cmd_adapter_unregister_agent(__UNUSED__ char *cmd, char *args)
381 char *path, *next_args;
382 E_Bluez_Element *element = _element_from_args(args, &next_args);
385 return ECORE_CALLBACK_RENEW;
389 fputs("ERROR: missing the object path\n", stderr);
390 return ECORE_CALLBACK_RENEW;
394 if (e_bluez_adapter_agent_unregister(element,
395 path, _method_success_check, "adapter_unregister_agent"))
396 printf(":::Unregistering agent %s...\n", path);
398 fprintf(stderr, "ERROR: can't unregister agent %s\n", path);
400 return ECORE_CALLBACK_RENEW;
404 _on_cmd_adapter_get_address(__UNUSED__ char *cmd, char *args)
408 E_Bluez_Element *element = _element_from_args(args, &next_args);
411 return ECORE_CALLBACK_RENEW;
413 if (e_bluez_adapter_address_get(element, &address))
414 printf(":::Adapter address = \"%s\"\n", address);
416 fputs("ERROR: can't get adapter address\n", stderr);
417 return ECORE_CALLBACK_RENEW;
421 _on_cmd_adapter_get_name(__UNUSED__ char *cmd, char *args)
425 E_Bluez_Element *element = _element_from_args(args, &next_args);
428 return ECORE_CALLBACK_RENEW;
430 if (e_bluez_adapter_name_get(element, &name))
431 printf(":::Adapter name = \"%s\"\n", name);
433 fputs("ERROR: can't get adapter name\n", stderr);
434 return ECORE_CALLBACK_RENEW;
438 _on_cmd_adapter_set_name(__UNUSED__ char *cmd, char *args)
441 E_Bluez_Element *element = _element_from_args(args, &next_args);
444 return ECORE_CALLBACK_RENEW;
447 fprintf(stderr, "ERROR: missing name value\n");
448 return ECORE_CALLBACK_RENEW;
451 if (e_bluez_adapter_name_set(element, next_args, _method_success_check,
453 printf(":::Adapter %s Name set to %s\n", element->path, next_args);
455 fputs("ERROR: can't set adapter name\n", stderr);
456 return ECORE_CALLBACK_RENEW;
460 _on_cmd_adapter_get_powered(__UNUSED__ char *cmd, char *args)
464 E_Bluez_Element *element = _element_from_args(args, &next_args);
467 return ECORE_CALLBACK_RENEW;
469 if (e_bluez_adapter_powered_get(element, &powered))
470 printf(":::Adapter powered = \"%hhu\"\n", powered);
472 fputs("ERROR: can't get adapter powered\n", stderr);
473 return ECORE_CALLBACK_RENEW;
477 _on_cmd_adapter_set_powered(__UNUSED__ char *cmd, char *args)
481 E_Bluez_Element *element = _element_from_args(args, &next_args);
484 return ECORE_CALLBACK_RENEW;
488 fputs("ERROR: missing the powered value\n", stderr);
489 return ECORE_CALLBACK_RENEW;
492 powered = !!atol(next_args);
494 if (e_bluez_adapter_powered_set
495 (element, powered, _method_success_check, "adapter_set_powered"))
496 printf(":::Adapter %s Powered set to %hhu\n", element->path, powered);
498 fputs("ERROR: can't set device powered\n", stderr);
499 return ECORE_CALLBACK_RENEW;
503 _on_cmd_adapter_get_discoverable(__UNUSED__ char *cmd, char *args)
506 Eina_Bool discoverable;
507 E_Bluez_Element *element = _element_from_args(args, &next_args);
510 return ECORE_CALLBACK_RENEW;
512 if (e_bluez_adapter_discoverable_get(element, &discoverable))
513 printf(":::Adapter discoverable = \"%hhu\"\n", discoverable);
515 fputs("ERROR: can't get adapter discoverable\n", stderr);
516 return ECORE_CALLBACK_RENEW;
520 _on_cmd_adapter_set_discoverable(__UNUSED__ char *cmd, char *args)
523 Eina_Bool discoverable;
524 E_Bluez_Element *element = _element_from_args(args, &next_args);
527 return ECORE_CALLBACK_RENEW;
531 fputs("ERROR: missing the discoverable value\n", stderr);
532 return ECORE_CALLBACK_RENEW;
535 discoverable = !!atol(next_args);
537 if (e_bluez_adapter_discoverable_set
538 (element, discoverable, _method_success_check, "adapter_set_discoverable"))
539 printf(":::Adapter %s discoverable set to %hhu\n", element->path, discoverable);
541 fputs("ERROR: can't set adapter discoverable\n", stderr);
542 return ECORE_CALLBACK_RENEW;
546 _on_cmd_adapter_get_discoverable_timeout(__UNUSED__ char *cmd, char *args)
549 unsigned int timeout;
550 E_Bluez_Element *element = _element_from_args(args, &next_args);
553 return ECORE_CALLBACK_RENEW;
555 if (e_bluez_adapter_discoverable_timeout_get(element, &timeout))
556 printf(":::Adapter %s DiscovableTimeout = %hu\n", element->path, timeout);
558 fputs("ERROR: can't get adapter discoverable timeout\n", stderr);
559 return ECORE_CALLBACK_RENEW;
563 _on_cmd_adapter_set_discoverable_timeout(__UNUSED__ char *cmd, char *args)
566 unsigned int timeout;
567 E_Bluez_Element *element = _element_from_args(args, &next_args);
570 return ECORE_CALLBACK_RENEW;
573 fprintf(stderr, "ERROR: missing timeout value\n");
574 return ECORE_CALLBACK_RENEW;
577 timeout = strtol(next_args, &p, 0);
580 fprintf(stderr, "ERROR: invalid number \"%s\".\n", next_args);
581 return ECORE_CALLBACK_RENEW;
584 if (e_bluez_adapter_discoverable_timeout_set(element, timeout,
585 _method_success_check,
586 "adapter_set_discoverable_timeout"))
587 printf(":::Adapter %s scan interval set to %hu\n", element->path, timeout);
589 fputs("ERROR: can't set adapter discoverable timeout\n", stderr);
590 return ECORE_CALLBACK_RENEW;
594 _on_cmd_adapter_get_discovering(__UNUSED__ char *cmd, char *args)
597 Eina_Bool discovering;
598 E_Bluez_Element *element = _element_from_args(args, &next_args);
601 return ECORE_CALLBACK_RENEW;
603 if (e_bluez_adapter_discovering_get(element, &discovering))
604 printf(":::Adapter discovering = \"%hhu\"\n", discovering);
606 fputs("ERROR: can't get adapter's Discovering\n", stderr);
607 return ECORE_CALLBACK_RENEW;
611 _on_cmd_adapter_start_discovery(__UNUSED__ char *cmd, char *args)
614 E_Bluez_Element *element = _element_from_args(args, &next_args);
617 return ECORE_CALLBACK_RENEW;
619 if (e_bluez_adapter_start_discovery(element,
620 _method_success_check, "adapter_start_discovery"))
621 printf(":::Adapter Start Discovery for %s\n", element->path);
623 fputs("ERROR: can't start discovery on adapter \n", stderr);
624 return ECORE_CALLBACK_RENEW;
628 _on_cmd_adapter_stop_discovery(__UNUSED__ char *cmd, char *args)
631 E_Bluez_Element *element = _element_from_args(args, &next_args);
634 return ECORE_CALLBACK_RENEW;
636 if (e_bluez_adapter_stop_discovery(element,
637 _method_success_check, "adapter_stop_discovery"))
638 printf(":::Adapter Stop Discovery for %s\n", element->path);
640 fputs("ERROR: can't stop discovery on adapter \n", stderr);
641 return ECORE_CALLBACK_RENEW;
645 _on_cmd_adapter_create_paired_device(__UNUSED__ char *cmd, char *args)
647 char *next_args, *path, *cap, *device;
648 E_Bluez_Element *element = _element_from_args(args, &next_args);
651 return ECORE_CALLBACK_RENEW;
654 fputs("ERROR: missing parameters name, type and value.\n", stderr);
655 return ECORE_CALLBACK_RENEW;
661 fputs("ERROR: missing parameters name, type and value.\n", stderr);
662 return ECORE_CALLBACK_RENEW;
666 fputs("ERROR: missing parameters name, type and value.\n", stderr);
667 return ECORE_CALLBACK_RENEW;
670 if (e_bluez_adapter_create_paired_device(element, path, cap, device,
671 _create_paired_device_cb, "adapter_create_paired_device")) {
672 printf(":::Creating Paired Device %s (%s)...\n", path, cap);
673 iface = e_dbus_interface_new("org.bluez.Agent");
675 fputs("WARNING: Cannot add org.bluez.Agent interface",stderr);
678 _msgbus_data->obj = e_dbus_object_add(_msgbus_data->conn, path, NULL);
679 e_dbus_object_interface_attach(_msgbus_data->obj, iface);
680 e_dbus_interface_method_add(iface, "RequestPinCode", "o", "s",
681 _request_pincode_cb);
685 fprintf(stderr, "ERROR: can't create paired device %s\n", path);
687 return ECORE_CALLBACK_RENEW;
690 /* Devices Commands */
693 _on_cmd_device_get_name(__UNUSED__ char *cmd, char *args)
697 E_Bluez_Element *element = _element_from_args(args, &next_args);
700 return ECORE_CALLBACK_RENEW;
702 if (e_bluez_device_name_get(element, &name))
703 printf(":::Device name = \"%s\"\n", name);
705 fputs("ERROR: can't get device name\n", stderr);
706 return ECORE_CALLBACK_RENEW;
710 _on_input(__UNUSED__ void *data, Ecore_Fd_Handler *fd_handler)
716 Eina_Bool (*cb)(char *cmd, char *args);
718 {"quit", _on_cmd_quit},
719 {"sync", _on_cmd_sync},
720 {"get_all", _on_cmd_get_all},
721 {"print", _on_cmd_print},
722 {"get_properties", _on_cmd_get_properties},
723 {"set_property", _on_cmd_property_set},
724 {"manager_get", _on_cmd_manager_get},
725 {"manager_default_adapter", _on_cmd_manager_default_adapter},
726 {"adapter_register_agent", _on_cmd_adapter_register_agent},
727 {"adapter_unregister_agent", _on_cmd_adapter_unregister_agent},
728 {"adapter_get_address", _on_cmd_adapter_get_address},
729 {"adapter_get_name", _on_cmd_adapter_get_name},
730 {"adapter_set_name", _on_cmd_adapter_set_name},
731 {"adapter_get_powered", _on_cmd_adapter_get_powered},
732 {"adapter_set_powered", _on_cmd_adapter_set_powered},
733 {"adapter_get_discoverable", _on_cmd_adapter_get_discoverable},
734 {"adapter_set_discoverable", _on_cmd_adapter_set_discoverable},
735 {"adapter_get_discoverable_timeout", _on_cmd_adapter_get_discoverable_timeout},
736 {"adapter_set_discoverable_timeout", _on_cmd_adapter_set_discoverable_timeout},
737 {"adapter_get_discovering", _on_cmd_adapter_get_discovering},
738 {"adapter_start_discovery", _on_cmd_adapter_start_discovery},
739 {"adapter_stop_discovery", _on_cmd_adapter_stop_discovery},
740 {"adapter_create_paired_device", _on_cmd_adapter_create_paired_device},
741 {"device_get_name", _on_cmd_device_get_name},
746 if (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_ERROR))
748 fputs("ERROR: reading from stdin, exit\n", stderr);
752 if (!ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_READ))
754 fputs("ERROR: nothing to read?\n", stderr);
758 if (!fgets(buf, sizeof(buf), stdin))
760 fprintf(stderr, "ERROR: could not read command: %s\n", strerror(errno));
761 ecore_main_loop_quit();
766 while (isspace(*cmd))
769 args = strchr(cmd, ' ');
777 while (isspace(*args))
780 p = args + strlen(args) - 1;
788 p = cmd + strlen(cmd) - 1;
793 if (strcmp(cmd, "help") == 0)
797 printf("Commands with '%s' in the name:\n", args);
798 for (itr = maps; itr->cmd; itr++)
799 if (strstr(itr->cmd, args))
800 printf("\t%s\n", itr->cmd);
804 fputs("Commands:\n", stdout);
805 for (itr = maps; itr->cmd; itr++)
806 printf("\t%s\n", itr->cmd);
809 return ECORE_CALLBACK_RENEW;
812 for (itr = maps; itr->cmd; itr++)
813 if (strcmp(itr->cmd, cmd) == 0)
814 return itr->cb(cmd, args);
816 printf("unknown command \"%s\", args=%s\n", cmd, args);
817 return ECORE_CALLBACK_RENEW;
821 main(__UNUSED__ int argc,__UNUSED__ char *argv[])
827 _msgbus_data = calloc(1, sizeof(E_Msgbus_Data));
828 _msgbus_data->conn = e_dbus_bus_get(DBUS_BUS_SYSTEM);
829 if (!_msgbus_data->conn) {
830 printf("ERROR: can't connect to system session\n");
834 e_bluez_system_init(_msgbus_data->conn);
836 ecore_event_handler_add(E_BLUEZ_EVENT_ELEMENT_ADD, _on_element_add, NULL);
837 ecore_event_handler_add(E_BLUEZ_EVENT_ELEMENT_DEL, _on_element_del, NULL);
838 ecore_event_handler_add(E_BLUEZ_EVENT_ELEMENT_UPDATED,
839 _on_element_updated, NULL);
840 ecore_event_handler_add(E_BLUEZ_EVENT_DEVICE_FOUND,
841 _on_device_found, NULL);
843 ecore_main_fd_handler_add
844 (0, ECORE_FD_READ | ECORE_FD_ERROR, _on_input, NULL, NULL, NULL);
846 ecore_main_loop_begin();
848 e_bluez_system_shutdown();
850 e_dbus_connection_close(_msgbus_data->conn);
855 fputs("DBG: clean exit.\n", stderr);