Mercurial > audlegacy-plugins
comparison src/bluetooth/agent.c @ 2846:3d7f01edb388
updated pairing agent - added bonding signals
author | Paula Stanciu <paula.stanciu@gmail.com> |
---|---|
date | Sun, 27 Jul 2008 22:15:41 +0300 |
parents | d0cbf303869b |
children | 671cdfc2d62d |
comparison
equal
deleted
inserted
replaced
2845:d0cbf303869b | 2846:3d7f01edb388 |
---|---|
38 static GtkWidget *device_label = NULL; | 38 static GtkWidget *device_label = NULL; |
39 static GtkWidget *passkey_entry = NULL; | 39 static GtkWidget *passkey_entry = NULL; |
40 static GtkWidget *ok_button = NULL; | 40 static GtkWidget *ok_button = NULL; |
41 static GtkWidget *cancel_button = NULL; | 41 static GtkWidget *cancel_button = NULL; |
42 static char* passkey; | 42 static char* passkey; |
43 static GList *adapter_list = NULL; | |
43 DBusGProxy *pair_obj = NULL; | 44 DBusGProxy *pair_obj = NULL; |
45 static gint bonding_finish=0; | |
44 static DBusGConnection *connection; | 46 static DBusGConnection *connection; |
47 | |
48 struct adapter_data { | |
49 char *path; | |
50 int attached; | |
51 char *old_mode; | |
52 }; | |
53 | |
45 void ok_button_call() | 54 void ok_button_call() |
46 { | 55 { |
47 passkey = gtk_entry_get_text(GTK_ENTRY(passkey_entry)); | 56 passkey = gtk_entry_get_text(GTK_ENTRY(passkey_entry)); |
48 printf("Key entered : %s\n",passkey); | 57 printf("Key entered : %s\n",passkey); |
49 } | 58 } |
280 | 289 |
281 enable_blinking(); | 290 enable_blinking(); |
282 */ | 291 */ |
283 printf("passkey callback\n"); | 292 printf("passkey callback\n"); |
284 passkey_callback(GTK_RESPONSE_ACCEPT,input); | 293 passkey_callback(GTK_RESPONSE_ACCEPT,input); |
294 | |
295 | |
285 } | 296 } |
286 | 297 |
287 static void confirm_dialog(const char *path, const char *address, | 298 static void confirm_dialog(const char *path, const char *address, |
288 const char *value, const gchar *device, | 299 const char *value, const gchar *device, |
289 DBusGMethodInvocation *context) | 300 DBusGMethodInvocation *context) |
297 input->path = g_strdup(path); | 308 input->path = g_strdup(path); |
298 input->address = g_strdup(address); | 309 input->address = g_strdup(address); |
299 | 310 |
300 input->context = context; | 311 input->context = context; |
301 | 312 |
302 | 313 printf("confirm dialog\n"); |
303 // g_signal_connect(G_OBJECT(dialog), "response", | 314 // g_signal_connect(G_OBJECT(dialog), "response", |
304 // G_CALLBACK(confirm_callback), input); | 315 // G_CALLBACK(confirm_callback), input); |
305 | 316 |
306 //enable_blinking(); | 317 //enable_blinking(); |
307 } | 318 } |
308 | 319 |
309 static void auth_dialog(const char *path, const char *address, | 320 static void auth_dialog(const char *path, const char *address, |
310 const char *service, const char *uuid, const gchar *device, | 321 const char *service, const char *uuid, const gchar *device, |
311 const gchar *profile, DBusGMethodInvocation *context) | 322 const gchar *profile, DBusGMethodInvocation *context) |
312 { | 323 { |
313 GtkWidget *dialog; | |
314 GtkWidget *button; | |
315 GtkWidget *image; | |
316 GtkWidget *label; | |
317 GtkWidget *table; | |
318 GtkWidget *vbox; | |
319 gchar *markup, *text; | |
320 struct input_data *input; | 324 struct input_data *input; |
321 | 325 |
322 input = g_try_malloc0(sizeof(*input)); | 326 input = g_try_malloc0(sizeof(*input)); |
323 if (!input) | 327 if (!input) |
324 return; | 328 return; |
416 device = g_strdup_printf("%s (%s)", name, address); | 420 device = g_strdup_printf("%s (%s)", name, address); |
417 } else | 421 } else |
418 device = g_strdup(address); | 422 device = g_strdup(address); |
419 | 423 |
420 passkey_dialog(path, address, device, context); | 424 passkey_dialog(path, address, device, context); |
421 printf ("pairing request for device :%s",address); | |
422 /* translators: this is a popup telling you a particular device | 425 /* translators: this is a popup telling you a particular device |
423 * has asked for pairing */ | 426 * has asked for pairing */ |
424 line = g_strdup_printf(_("Pairing request for '%s'"), device); | 427 line = g_strdup_printf(_("Pairing request for '%s'"), device); |
425 g_free(device); | 428 g_free(device); |
426 | 429 |
756 | 759 |
757 void set_auto_authorize(gboolean value) | 760 void set_auto_authorize(gboolean value) |
758 { | 761 { |
759 auto_authorize = value; | 762 auto_authorize = value; |
760 } | 763 } |
764 | |
765 static void bonding_created(DBusGProxy *object, | |
766 const char *address, gpointer user_data) | |
767 { | |
768 const char *adapter = NULL, *name = NULL; | |
769 gchar *device, *text; | |
770 | |
771 dbus_g_proxy_call(object, "GetName", NULL, G_TYPE_INVALID, | |
772 G_TYPE_STRING, &adapter, G_TYPE_INVALID); | |
773 | |
774 dbus_g_proxy_call(object, "GetRemoteName", NULL, | |
775 G_TYPE_STRING, address, G_TYPE_INVALID, | |
776 G_TYPE_STRING, &name, G_TYPE_INVALID); | |
777 | |
778 if (name) { | |
779 if (g_strrstr(name, address)) | |
780 device = g_strdup(name); | |
781 else | |
782 device = g_strdup_printf("%s (%s)", name, address); | |
783 } else | |
784 device = g_strdup(address); | |
785 | |
786 text = g_strdup_printf(_("Created bonding with %s"), device); | |
787 bonding_finish = 1; | |
788 g_free(device); | |
789 | |
790 g_printf("%s\n",text); | |
791 g_free(text); | |
792 } | |
793 | |
794 static void bonding_removed(DBusGProxy *object, | |
795 const char *address, gpointer user_data) | |
796 { | |
797 const char *adapter = NULL, *name = NULL; | |
798 gchar *device, *text; | |
799 | |
800 dbus_g_proxy_call(object, "GetName", NULL, G_TYPE_INVALID, | |
801 G_TYPE_STRING, &adapter, G_TYPE_INVALID); | |
802 | |
803 dbus_g_proxy_call(object, "GetRemoteName", NULL, | |
804 G_TYPE_STRING, address, G_TYPE_INVALID, | |
805 G_TYPE_STRING, &name, G_TYPE_INVALID); | |
806 | |
807 if (name) { | |
808 if (g_strrstr(name, address)) | |
809 device = g_strdup(name); | |
810 else | |
811 device = g_strdup_printf("%s (%s)", name, address); | |
812 } else | |
813 device = g_strdup(address); | |
814 | |
815 text = g_strdup_printf(_("Removed bonding with %s"), device); | |
816 | |
817 g_free(device); | |
818 | |
819 // show_notification(adapter ? adapter : _("Bluetooth device"), | |
820 // text, NULL, 6000, NULL); | |
821 | |
822 g_free(text); | |
823 bonding_finish =0; | |
824 } | |
825 | |
826 | |
827 static void trust_added(DBusGProxy *object, | |
828 const char *address, gpointer user_data) | |
829 { | |
830 } | |
831 | |
832 static void trust_removed(DBusGProxy *object, | |
833 const char *address, gpointer user_data) | |
834 { | |
835 } | |
836 | |
837 static void set_new_mode(struct adapter_data *adapter, const char *mode) | |
838 { | |
839 g_free(adapter->old_mode); | |
840 | |
841 adapter->old_mode = g_strdup(mode); | |
842 } | |
843 | |
844 static void mode_changed(DBusGProxy *object, | |
845 const char *mode, gpointer user_data) | |
846 { | |
847 struct adapter_data *adapter = (struct adapter_data *) user_data; | |
848 const char *adapter_name = NULL; | |
849 const char *text; | |
850 | |
851 if (g_str_equal(mode, "off") == TRUE) { | |
852 set_new_mode(adapter, mode); | |
853 return; | |
854 } | |
855 if (g_str_equal(adapter->old_mode, "off") | |
856 && g_str_equal(mode, "connectable")) { | |
857 set_new_mode(adapter, mode); | |
858 return; | |
859 } | |
860 | |
861 | |
862 if (g_str_equal(mode, "off") != FALSE) { | |
863 text = N_("Device has been switched off"); | |
864 } else if (g_str_equal(mode, "connectable") != FALSE | |
865 && g_str_equal(adapter->old_mode, "discoverable") != FALSE) { | |
866 text = N_("Device has been made non-discoverable"); | |
867 } else if (g_str_equal(mode, "connectable") != FALSE) { | |
868 text = N_("Device has been made connectable"); | |
869 } else if (g_str_equal (mode, "discoverable") != FALSE) { | |
870 text = N_("Device has been made discoverable"); | |
871 } else if (g_str_equal(mode, "limited") != FALSE) { | |
872 text = N_("Device has been made limited discoverable"); | |
873 } else if (g_str_equal(mode, "pairing") != FALSE) { | |
874 text = N_("Device has been switched into pairing mode"); | |
875 } else { | |
876 set_new_mode(adapter, mode); | |
877 return; | |
878 } | |
879 | |
880 dbus_g_proxy_call(object, "GetName", NULL, G_TYPE_INVALID, | |
881 G_TYPE_STRING, &adapter_name, G_TYPE_INVALID); | |
882 | |
883 /*show_notification(adapter_name ? adapter_name : _("Bluetooth device"), | |
884 _(text), NULL, 3000, NULL); | |
885 */ | |
886 | |
887 set_new_mode(adapter, mode); | |
888 } | |
889 | |
890 static void adapter_free(gpointer data, gpointer user_data) | |
891 { | |
892 struct adapter_data *adapter = data; | |
893 | |
894 adapter_list = g_list_remove(adapter_list, adapter); | |
895 | |
896 g_free(adapter->path); | |
897 g_free(adapter->old_mode); | |
898 g_free(adapter); | |
899 } | |
900 | |
901 static void adapter_disable(gpointer data, gpointer user_data) | |
902 { | |
903 struct adapter_data *adapter = data; | |
904 | |
905 adapter->attached = 0; | |
906 } | |
907 | |
908 static gint adapter_compare(gconstpointer a, gconstpointer b) | |
909 { | |
910 const struct adapter_data *adapter = a; | |
911 const char *path = b; | |
912 | |
913 return g_ascii_strcasecmp(adapter->path, path); | |
914 } | |
915 | |
916 static void adapter_count(gpointer data, gpointer user_data) | |
917 { | |
918 struct adapter_data *adapter = data; | |
919 int *count = user_data; | |
920 | |
921 if (adapter->attached) | |
922 (*count)++; | |
923 } | |
924 | |
925 | |
926 | |
927 | |
928 void add_bonding(){ | |
929 DBusGProxy *object; | |
930 | |
931 object = dbus_g_proxy_new_for_name(bus, "org.bluez", | |
932 "/org/bluez/passkey", "org.bluez.Adapter"); | |
933 | |
934 dbus_g_proxy_add_signal(object, "BondingCreated", | |
935 G_TYPE_STRING, G_TYPE_INVALID); | |
936 | |
937 dbus_g_proxy_connect_signal(object, "BondingCreated", | |
938 G_CALLBACK(bonding_created), NULL, NULL); | |
939 | |
940 dbus_g_proxy_add_signal(object, "BondingRemoved", | |
941 G_TYPE_STRING, G_TYPE_INVALID); | |
942 | |
943 dbus_g_proxy_connect_signal(object, "BondingRemoved", | |
944 G_CALLBACK(bonding_removed), NULL, NULL); | |
945 } | |
946 static void add_adapter(const char *path) | |
947 { | |
948 GList *list; | |
949 DBusGProxy *object; | |
950 struct adapter_data *adapter; | |
951 const char *old_mode; | |
952 | |
953 list = g_list_find_custom(adapter_list, path, adapter_compare); | |
954 if (list && list->data) { | |
955 struct adapter_data *adapter = list->data; | |
956 | |
957 adapter->attached = 1; | |
958 return; | |
959 } | |
960 | |
961 adapter = g_try_malloc0(sizeof(*adapter)); | |
962 if (!adapter) | |
963 return; | |
964 | |
965 adapter->path = g_strdup(path); | |
966 adapter->attached = 1; | |
967 | |
968 adapter_list = g_list_append(adapter_list, adapter); | |
969 | |
970 | |
971 object = dbus_g_proxy_new_for_name(bus, "org.bluez", | |
972 path, "org.bluez.Adapter"); | |
973 | |
974 dbus_g_proxy_add_signal(object, "ModeChanged", | |
975 G_TYPE_STRING, G_TYPE_INVALID); | |
976 | |
977 dbus_g_proxy_connect_signal(object, "ModeChanged", | |
978 G_CALLBACK(mode_changed), adapter, NULL); | |
979 | |
980 dbus_g_proxy_add_signal(object, "BondingCreated", | |
981 G_TYPE_STRING, G_TYPE_INVALID); | |
982 | |
983 dbus_g_proxy_connect_signal(object, "BondingCreated", | |
984 G_CALLBACK(bonding_created), NULL, NULL); | |
985 | |
986 dbus_g_proxy_add_signal(object, "BondingRemoved", | |
987 G_TYPE_STRING, G_TYPE_INVALID); | |
988 | |
989 dbus_g_proxy_connect_signal(object, "BondingRemoved", | |
990 G_CALLBACK(bonding_removed), NULL, NULL); | |
991 | |
992 dbus_g_proxy_add_signal(object, "TrustAdded", | |
993 G_TYPE_STRING, G_TYPE_INVALID); | |
994 | |
995 dbus_g_proxy_connect_signal(object, "TrustAdded", | |
996 G_CALLBACK(trust_added), NULL, NULL); | |
997 | |
998 dbus_g_proxy_add_signal(object, "TrustRemoved", | |
999 G_TYPE_STRING, G_TYPE_INVALID); | |
1000 | |
1001 dbus_g_proxy_connect_signal(object, "TrustRemoved", | |
1002 G_CALLBACK(trust_removed), NULL, NULL); | |
1003 | |
1004 old_mode = NULL; | |
1005 dbus_g_proxy_call(object, "GetMode", NULL, | |
1006 G_TYPE_INVALID, G_TYPE_STRING, | |
1007 &old_mode, G_TYPE_INVALID); | |
1008 if (old_mode != NULL) | |
1009 set_new_mode(adapter, old_mode); | |
1010 register_agents(); | |
1011 } | |
1012 | |
1013 static void adapter_added(DBusGProxy *object, | |
1014 const char *path, gpointer user_data) | |
1015 { | |
1016 printf("adapter added\n"); | |
1017 register_agents(); | |
1018 | |
1019 add_adapter(path); | |
1020 } | |
1021 | |
1022 static void adapter_removed(DBusGProxy *object, | |
1023 const char *path, gpointer user_data) | |
1024 { | |
1025 GList *list; | |
1026 | |
1027 list = g_list_find_custom(adapter_list, path, adapter_compare); | |
1028 if (list && list->data) { | |
1029 struct adapter_data *adapter = list->data; | |
1030 | |
1031 adapter->attached = 0; | |
1032 } | |
1033 | |
1034 } | |
1035 | |
1036 | |
1037 static int setup_manager(void) | |
1038 { | |
1039 DBusGProxy *object; | |
1040 GError *error = NULL; | |
1041 const gchar **array = NULL; | |
1042 | |
1043 object = dbus_g_proxy_new_for_name(bus, "org.bluez", | |
1044 "/org/bluez", "org.bluez.Manager"); | |
1045 | |
1046 dbus_g_proxy_add_signal(object, "AdapterAdded", | |
1047 G_TYPE_STRING, G_TYPE_INVALID); | |
1048 | |
1049 dbus_g_proxy_connect_signal(object, "AdapterAdded", | |
1050 G_CALLBACK(adapter_added), NULL, NULL); | |
1051 | |
1052 dbus_g_proxy_add_signal(object, "AdapterRemoved", | |
1053 G_TYPE_STRING, G_TYPE_INVALID); | |
1054 | |
1055 dbus_g_proxy_connect_signal(object, "AdapterRemoved", | |
1056 G_CALLBACK(adapter_removed), NULL, NULL); | |
1057 | |
1058 dbus_g_proxy_call(object, "ListAdapters", &error, | |
1059 G_TYPE_INVALID, G_TYPE_STRV, &array, G_TYPE_INVALID); | |
1060 | |
1061 if (error == NULL) { | |
1062 while (*array) { | |
1063 printf("add adapter\n"); | |
1064 add_adapter(*array); | |
1065 array++; | |
1066 } | |
1067 } else | |
1068 g_error_free(error); | |
1069 | |
1070 return 0; | |
1071 } | |
1072 | |
1073 | |
761 void run_agents() | 1074 void run_agents() |
762 { | 1075 { |
763 setup_agents(bus); | 1076 setup_agents(bus); |
764 | 1077 //to add the bounding signals |
765 register_agents(); | 1078 // register_agents(); |
766 | 1079 setup_manager(); |
767 } | 1080 |
768 | 1081 } |
1082 |