/* Build with: */ /* glib-genmarshal --prefix=marshal marshal.list --header > marshal.h */ /* glib-genmarshal --prefix=marshal marshal.list --body > marshal.c */ /* gcc `pkg-config --libs --cflags glib-2.0 dbus-1 dbus-glib-1` bluetooth.c marshal.c -o bluetooth */ #include #include #include #include #include "marshal.h" static GMainLoop *loop = NULL; static void remote_device_found(DBusGProxy *object, const char *address, const unsigned int class, const int rssi, gpointer user_data) { g_print("Signal: RemoteDeviceFound(%s, %d, %d)\n", address, class, rssi); } static void discovery_started(DBusGProxy *object, gpointer user_data) { g_print("Signal: DiscoveryStarted()\n"); } static void remote_name_updated(DBusGProxy *object, const char *address, const char *name, gpointer user_data) { g_print("Signal: RemoteNameUpdated(%s, %s)\n", address, name); } static void discovery_completed(DBusGProxy *object, gpointer user_data) { g_print("Signal: DiscoveryCompleted()\n"); g_main_loop_quit (loop); } static void run_mainloop (void) { GMainContext *ctx; ctx = g_main_loop_get_context (loop); while (g_main_context_pending (ctx)) g_main_context_iteration (ctx, FALSE); } int main(int argc, char* argv[]) { GError *error = NULL; DBusGConnection * bus = NULL; DBusGProxy * obj = NULL; g_type_init(); g_log_set_always_fatal (G_LOG_LEVEL_WARNING); loop = g_main_loop_new (NULL, FALSE); bus = dbus_g_bus_get(DBUS_BUS_SYSTEM, &error); if (error != NULL) { g_printerr("Connecting to system bus failed: %s\n", error->message); g_error_free(error); exit(EXIT_FAILURE); } obj = dbus_g_proxy_new_for_name(bus, "org.bluez", "/org/bluez/hci0", "org.bluez.Adapter"); dbus_g_object_register_marshaller(marshal_VOID__STRING_UINT_INT, G_TYPE_NONE, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_INT, G_TYPE_INVALID); dbus_g_proxy_add_signal(obj, "RemoteDeviceFound", G_TYPE_STRING, G_TYPE_UINT, G_TYPE_INT, G_TYPE_INVALID); dbus_g_proxy_connect_signal(obj, "RemoteDeviceFound", G_CALLBACK(remote_device_found), bus, NULL); //dbus_g_proxy_add_signal(obj, "DiscoveryStarted", G_TYPE_INVALID); //dbus_g_proxy_connect_signal(obj, "DiscoveryStarted", G_CALLBACK(discovery_started), bus, NULL); dbus_g_object_register_marshaller (g_cclosure_user_marshal_VOID_, G_TYPE_NONE, G_TYPE_INVALID); dbus_g_proxy_add_signal (self->priv->bluez, "DiscoveryStarted", G_TYPE_INVALID); dbus_g_proxy_connect_signal (self->priv->bluez, "DiscoveryStarted", ((GCallback) discovery_started), self, NULL); dbus_g_proxy_add_signal(obj, "DiscoveryCompleted", G_TYPE_INVALID); dbus_g_proxy_connect_signal(obj, "DiscoveryCompleted", G_CALLBACK(discovery_completed), bus, NULL); dbus_g_object_register_marshaller(marshal_VOID__STRING_STRING, G_TYPE_NONE, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID); dbus_g_proxy_add_signal(obj, "RemoteNameUpdated", G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID); dbus_g_proxy_connect_signal(obj, "RemoteNameUpdated", G_CALLBACK(remote_name_updated), NULL, NULL); dbus_g_proxy_call_no_reply(obj, "DiscoverDevices", &error, G_TYPE_INVALID, G_TYPE_INVALID); if (error != NULL) { g_printerr("Failed to discover devices: %s\n", error->message); g_error_free(error); exit(EXIT_FAILURE); } run_mainloop (); dbus_g_connection_flush (bus); g_main_loop_run (loop); dbus_g_connection_unref(bus); return 0; }