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