diff options
Diffstat (limited to 'src/conversation/gnunet-conversation-gtk_phone.c')
-rw-r--r-- | src/conversation/gnunet-conversation-gtk_phone.c | 376 |
1 files changed, 309 insertions, 67 deletions
diff --git a/src/conversation/gnunet-conversation-gtk_phone.c b/src/conversation/gnunet-conversation-gtk_phone.c index addc641e..210c8c56 100644 --- a/src/conversation/gnunet-conversation-gtk_phone.c +++ b/src/conversation/gnunet-conversation-gtk_phone.c | |||
@@ -188,9 +188,19 @@ enum OutCallState | |||
188 | OUT_STATE_ACTIVE, | 188 | OUT_STATE_ACTIVE, |
189 | 189 | ||
190 | /** | 190 | /** |
191 | * This phone call is currently suspended. | 191 | * This phone call is currently suspended by local. |
192 | */ | 192 | */ |
193 | OUT_STATE_SUSPENDED | 193 | OUT_STATE_SUSPENDED_LOCAL, |
194 | |||
195 | /** | ||
196 | * This phone call is currently suspended by remote. | ||
197 | */ | ||
198 | OUT_STATE_SUSPENDED_REMOTE, | ||
199 | |||
200 | /** | ||
201 | * This phone call is currently suspended from both sides. | ||
202 | */ | ||
203 | OUT_STATE_SUSPENDED_BOTH | ||
194 | 204 | ||
195 | }; | 205 | }; |
196 | 206 | ||
@@ -455,6 +465,7 @@ update_call_buttons (GtkTreeSelection *sel) | |||
455 | { | 465 | { |
456 | GtkTreeIter iter; | 466 | GtkTreeIter iter; |
457 | GtkTreeModel *model; | 467 | GtkTreeModel *model; |
468 | struct IncomingCall *ic; | ||
458 | gint type; | 469 | gint type; |
459 | gint in_state; | 470 | gint in_state; |
460 | gint out_state; | 471 | gint out_state; |
@@ -477,6 +488,7 @@ update_call_buttons (GtkTreeSelection *sel) | |||
477 | GCG_PHONE_LS_TYPE, &type, | 488 | GCG_PHONE_LS_TYPE, &type, |
478 | GCG_PHONE_LS_CALL_STATE, &out_state, | 489 | GCG_PHONE_LS_CALL_STATE, &out_state, |
479 | GCG_PHONE_LS_CALLER_STATE, &in_state, | 490 | GCG_PHONE_LS_CALLER_STATE, &in_state, |
491 | GCG_PHONE_LS_CALLER, &ic, | ||
480 | -1); | 492 | -1); |
481 | switch ((enum TypeOfConversation) type) | 493 | switch ((enum TypeOfConversation) type) |
482 | { | 494 | { |
@@ -495,7 +507,7 @@ update_call_buttons (GtkTreeSelection *sel) | |||
495 | case IN_STATE_CONNECTED: | 507 | case IN_STATE_CONNECTED: |
496 | gtk_widget_set_sensitive (b_add_contact, TRUE); | 508 | gtk_widget_set_sensitive (b_add_contact, TRUE); |
497 | gtk_widget_set_sensitive (b_accept, FALSE); | 509 | gtk_widget_set_sensitive (b_accept, FALSE); |
498 | gtk_widget_set_sensitive (b_refuse, FALSE); | 510 | gtk_widget_set_sensitive (b_refuse, (active_in != ic)); |
499 | gtk_widget_set_sensitive (b_resume, FALSE); | 511 | gtk_widget_set_sensitive (b_resume, FALSE); |
500 | break; | 512 | break; |
501 | case IN_STATE_SUSPENDED_LOCAL: | 513 | case IN_STATE_SUSPENDED_LOCAL: |
@@ -527,21 +539,31 @@ update_call_buttons (GtkTreeSelection *sel) | |||
527 | case OUT_STATE_RESOLVING: | 539 | case OUT_STATE_RESOLVING: |
528 | gtk_widget_set_sensitive (b_add_contact, TRUE); | 540 | gtk_widget_set_sensitive (b_add_contact, TRUE); |
529 | gtk_widget_set_sensitive (b_accept, FALSE); | 541 | gtk_widget_set_sensitive (b_accept, FALSE); |
530 | gtk_widget_set_sensitive (b_refuse, TRUE); | 542 | gtk_widget_set_sensitive (b_refuse, FALSE); |
531 | gtk_widget_set_sensitive (b_resume, FALSE); | 543 | gtk_widget_set_sensitive (b_resume, FALSE); |
532 | case OUT_STATE_RINGING: | 544 | case OUT_STATE_RINGING: |
533 | gtk_widget_set_sensitive (b_add_contact, TRUE); | 545 | gtk_widget_set_sensitive (b_add_contact, TRUE); |
534 | gtk_widget_set_sensitive (b_accept, ! in_call); | 546 | gtk_widget_set_sensitive (b_accept, ! in_call); |
535 | gtk_widget_set_sensitive (b_refuse, TRUE); | 547 | gtk_widget_set_sensitive (b_refuse, FALSE); |
536 | gtk_widget_set_sensitive (b_resume, ! in_call); | 548 | gtk_widget_set_sensitive (b_resume, ! in_call); |
537 | case OUT_STATE_ACTIVE: | 549 | case OUT_STATE_ACTIVE: |
538 | gtk_widget_set_sensitive (b_add_contact, TRUE); | 550 | gtk_widget_set_sensitive (b_add_contact, TRUE); |
539 | gtk_widget_set_sensitive (b_accept, FALSE); | 551 | gtk_widget_set_sensitive (b_accept, FALSE); |
540 | gtk_widget_set_sensitive (b_refuse, FALSE); | 552 | gtk_widget_set_sensitive (b_refuse, FALSE); |
541 | gtk_widget_set_sensitive (b_resume, FALSE); | 553 | gtk_widget_set_sensitive (b_resume, FALSE); |
542 | case OUT_STATE_SUSPENDED: | 554 | case OUT_STATE_SUSPENDED_LOCAL: |
543 | gtk_widget_set_sensitive (b_add_contact, TRUE); | 555 | gtk_widget_set_sensitive (b_add_contact, TRUE); |
544 | gtk_widget_set_sensitive (b_accept, ! in_call); | 556 | gtk_widget_set_sensitive (b_accept, FALSE); |
557 | gtk_widget_set_sensitive (b_refuse, TRUE); | ||
558 | gtk_widget_set_sensitive (b_resume, ! in_call); | ||
559 | case OUT_STATE_SUSPENDED_REMOTE: | ||
560 | gtk_widget_set_sensitive (b_add_contact, TRUE); | ||
561 | gtk_widget_set_sensitive (b_accept, FALSE); | ||
562 | gtk_widget_set_sensitive (b_refuse, TRUE); | ||
563 | gtk_widget_set_sensitive (b_resume, FALSE); | ||
564 | case OUT_STATE_SUSPENDED_BOTH: | ||
565 | gtk_widget_set_sensitive (b_add_contact, TRUE); | ||
566 | gtk_widget_set_sensitive (b_accept, FALSE); | ||
545 | gtk_widget_set_sensitive (b_refuse, TRUE); | 567 | gtk_widget_set_sensitive (b_refuse, TRUE); |
546 | gtk_widget_set_sensitive (b_resume, ! in_call); | 568 | gtk_widget_set_sensitive (b_resume, ! in_call); |
547 | default: | 569 | default: |
@@ -599,7 +621,11 @@ set_outgoing_call_state (struct OutgoingCall *oc, | |||
599 | break; | 621 | break; |
600 | case OUT_STATE_ACTIVE: | 622 | case OUT_STATE_ACTIVE: |
601 | break; | 623 | break; |
602 | case OUT_STATE_SUSPENDED: | 624 | case OUT_STATE_SUSPENDED_LOCAL: |
625 | break; | ||
626 | case OUT_STATE_SUSPENDED_REMOTE: | ||
627 | break; | ||
628 | case OUT_STATE_SUSPENDED_BOTH: | ||
603 | break; | 629 | break; |
604 | } | 630 | } |
605 | gtk_list_store_set (active_liststore, | 631 | gtk_list_store_set (active_liststore, |
@@ -700,6 +726,7 @@ phone_event_handler (void *cls, | |||
700 | caller_num_gen); | 726 | caller_num_gen); |
701 | break; | 727 | break; |
702 | case GNUNET_CONVERSATION_EC_PHONE_HUNG_UP: | 728 | case GNUNET_CONVERSATION_EC_PHONE_HUNG_UP: |
729 | GNUNET_break (in_ring_counter > 0); | ||
703 | in_ring_counter--; | 730 | in_ring_counter--; |
704 | valid = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (active_liststore), | 731 | valid = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (active_liststore), |
705 | &iter); | 732 | &iter); |
@@ -852,7 +879,7 @@ GNUNET_CONVERSATION_GTK_on_accept_clicked (GtkButton *button, | |||
852 | } | 879 | } |
853 | gtk_tree_model_get (model, | 880 | gtk_tree_model_get (model, |
854 | &iter, | 881 | &iter, |
855 | GCG_PHONE_LS_CALLER_STATE, &ic, | 882 | GCG_PHONE_LS_CALLER, &ic, |
856 | -1); | 883 | -1); |
857 | if (NULL == ic) | 884 | if (NULL == ic) |
858 | { | 885 | { |
@@ -860,6 +887,7 @@ GNUNET_CONVERSATION_GTK_on_accept_clicked (GtkButton *button, | |||
860 | GNUNET_break (0); | 887 | GNUNET_break (0); |
861 | return; | 888 | return; |
862 | } | 889 | } |
890 | phone_state = PS_ACCEPTED; | ||
863 | active_in = ic; | 891 | active_in = ic; |
864 | set_incoming_call_state (ic, | 892 | set_incoming_call_state (ic, |
865 | IN_STATE_CONNECTED); | 893 | IN_STATE_CONNECTED); |
@@ -885,8 +913,69 @@ void | |||
885 | GNUNET_CONVERSATION_GTK_on_reject_clicked (GtkButton *button, | 913 | GNUNET_CONVERSATION_GTK_on_reject_clicked (GtkButton *button, |
886 | gpointer user_data) | 914 | gpointer user_data) |
887 | { | 915 | { |
888 | // do_reject (); // FIXME! | 916 | struct IncomingCall *ic; |
889 | do_status (); | 917 | struct OutgoingCall *oc; |
918 | GtkTreeSelection *sel; | ||
919 | GtkTreeIter iter; | ||
920 | GtkTreeModel *model; | ||
921 | |||
922 | sel = gtk_tree_view_get_selection (active_treeview); | ||
923 | if (! gtk_tree_selection_get_selected (sel, | ||
924 | &model, | ||
925 | &iter)) | ||
926 | { | ||
927 | /* reject button should not have been sensitive! */ | ||
928 | GNUNET_break (0); | ||
929 | return; | ||
930 | } | ||
931 | gtk_tree_model_get (model, | ||
932 | &iter, | ||
933 | GCG_PHONE_LS_CALLER, &ic, | ||
934 | GCG_PHONE_LS_CALL, &oc, | ||
935 | -1); | ||
936 | if (NULL != ic) | ||
937 | { | ||
938 | if (active_in == ic) | ||
939 | { | ||
940 | /* reject button should not have been sensitive! */ | ||
941 | GNUNET_break (0); | ||
942 | return; | ||
943 | } | ||
944 | GNUNET_break (in_ring_counter > 0); | ||
945 | in_ring_counter--; | ||
946 | GCG_update_status_bar (_("Rejected conversation with `%s'.\n"), | ||
947 | ic->caller_id); | ||
948 | GCG_HISTORY_add (GCG_HISTORY_TYPE_REJECTED, | ||
949 | ic->caller_id); | ||
950 | set_incoming_call_state (ic, | ||
951 | IN_STATE_NONE); | ||
952 | destroy_in (ic); | ||
953 | phone_state = PS_LISTEN; /* FIXME: or error... */ | ||
954 | do_status (); | ||
955 | return; | ||
956 | } | ||
957 | if (NULL != oc) | ||
958 | { | ||
959 | /* terminate suspended outgoing call */ | ||
960 | if (active_out == oc) | ||
961 | { | ||
962 | /* reject button should not have been sensitive! */ | ||
963 | GNUNET_break (0); | ||
964 | return; | ||
965 | } | ||
966 | GCG_update_status_bar (_("Terminated suspended conversation with `%s'.\n"), | ||
967 | oc->peer_name); | ||
968 | GCG_HISTORY_add (GCG_HISTORY_TYPE_HANGUP, | ||
969 | oc->peer_name); | ||
970 | set_outgoing_call_state (oc, | ||
971 | OUT_STATE_NONE); | ||
972 | destroy_out (oc); | ||
973 | phone_state = PS_LISTEN; /* FIXME: or error... */ | ||
974 | do_status (); | ||
975 | return; | ||
976 | } | ||
977 | /* reject button should not have been sensitive! */ | ||
978 | GNUNET_break (0); | ||
890 | } | 979 | } |
891 | 980 | ||
892 | 981 | ||
@@ -922,9 +1011,11 @@ void | |||
922 | GNUNET_CONVERSATION_GTK_on_resume_clicked (GtkButton *button, | 1011 | GNUNET_CONVERSATION_GTK_on_resume_clicked (GtkButton *button, |
923 | gpointer user_data) | 1012 | gpointer user_data) |
924 | { | 1013 | { |
925 | enum TypeOfConversation toc; | ||
926 | struct IncomingCall *ic; | 1014 | struct IncomingCall *ic; |
927 | struct OutgoingCall *oc; | 1015 | struct OutgoingCall *oc; |
1016 | GtkTreeSelection *sel; | ||
1017 | GtkTreeIter iter; | ||
1018 | GtkTreeModel *model; | ||
928 | 1019 | ||
929 | if ( (NULL != active_in) || | 1020 | if ( (NULL != active_in) || |
930 | (NULL != active_out) || | 1021 | (NULL != active_out) || |
@@ -935,31 +1026,49 @@ GNUNET_CONVERSATION_GTK_on_resume_clicked (GtkButton *button, | |||
935 | GNUNET_break(0); | 1026 | GNUNET_break(0); |
936 | return; | 1027 | return; |
937 | } | 1028 | } |
938 | toc = 42; // FIXME: get from selection! | ||
939 | 1029 | ||
940 | switch (toc) | 1030 | sel = gtk_tree_view_get_selection (active_treeview); |
1031 | if (! gtk_tree_selection_get_selected (sel, | ||
1032 | &model, | ||
1033 | &iter)) | ||
1034 | { | ||
1035 | /* resume button should not have been sensitive! */ | ||
1036 | GNUNET_break (0); | ||
1037 | return; | ||
1038 | } | ||
1039 | gtk_tree_model_get (model, | ||
1040 | &iter, | ||
1041 | GCG_PHONE_LS_CALLER, &ic, | ||
1042 | GCG_PHONE_LS_CALL, &oc, | ||
1043 | -1); | ||
1044 | if (NULL != ic) | ||
941 | { | 1045 | { |
942 | case CALL_IN: | ||
943 | ic = NULL; // FIXME: get from selection | ||
944 | GNUNET_CONVERSATION_caller_resume (ic->caller, speaker, mic); | ||
945 | set_incoming_call_state (ic, IN_STATE_CONNECTED); | ||
946 | phone_state = PS_ACCEPTED; | 1046 | phone_state = PS_ACCEPTED; |
947 | GCG_update_status_bar (_("Resumed a conversation with `%s'.\n"), | 1047 | active_in = ic; |
948 | ic->caller_id); | 1048 | set_incoming_call_state (ic, |
1049 | IN_STATE_CONNECTED); | ||
1050 | GCG_update_status_bar (_("Resumed conversation with `%s'.\n"), | ||
1051 | ic->caller_id); | ||
949 | GCG_set_status_icon ("gnunet-conversation-call-active"); | 1052 | GCG_set_status_icon ("gnunet-conversation-call-active"); |
950 | // FIXME: update visibility/sensitivity | 1053 | GNUNET_CONVERSATION_caller_resume (ic->caller, |
1054 | speaker, mic); | ||
1055 | // GCG_HISTORY_add (GCG_HISTORY_TYPE_RESUMED, ic->caller_id); | ||
951 | do_status (); | 1056 | do_status (); |
952 | return; | 1057 | return; |
953 | case CALL_OUT: | 1058 | } |
954 | oc = NULL; // FIXME: get from selection | 1059 | if (NULL != oc) |
1060 | { | ||
1061 | phone_state = PS_ACCEPTED; | ||
1062 | active_out = oc; | ||
955 | GNUNET_CONVERSATION_call_resume (oc->call, | 1063 | GNUNET_CONVERSATION_call_resume (oc->call, |
956 | speaker, mic); | 1064 | speaker, mic); |
957 | set_outgoing_call_state (oc, | 1065 | set_outgoing_call_state (oc, |
958 | OUT_STATE_ACTIVE); | 1066 | OUT_STATE_ACTIVE); |
959 | // FIXME: update visibility/sensitivity | 1067 | // GCG_HISTORY_add (GCG_HISTORY_TYPE_RESUMED, ic->caller_id); |
960 | do_status (); | 1068 | do_status (); |
961 | return; | 1069 | return; |
962 | } | 1070 | } |
1071 | /* resume button should not have been sensitive! */ | ||
963 | GNUNET_break (0); | 1072 | GNUNET_break (0); |
964 | } | 1073 | } |
965 | 1074 | ||
@@ -974,6 +1083,9 @@ void | |||
974 | GNUNET_CONVERSATION_GTK_on_pause_clicked (GtkButton *button, | 1083 | GNUNET_CONVERSATION_GTK_on_pause_clicked (GtkButton *button, |
975 | gpointer user_data) | 1084 | gpointer user_data) |
976 | { | 1085 | { |
1086 | enum OutCallState os; | ||
1087 | enum InCallState is; | ||
1088 | |||
977 | if ( (NULL != active_in) && | 1089 | if ( (NULL != active_in) && |
978 | (NULL != active_out) ) | 1090 | (NULL != active_out) ) |
979 | { | 1091 | { |
@@ -983,10 +1095,39 @@ GNUNET_CONVERSATION_GTK_on_pause_clicked (GtkButton *button, | |||
983 | if (NULL != active_out) | 1095 | if (NULL != active_out) |
984 | { | 1096 | { |
985 | /* outgoing */ | 1097 | /* outgoing */ |
1098 | os = active_out->state; | ||
1099 | switch (active_out->state) | ||
1100 | { | ||
1101 | case OUT_STATE_NONE: | ||
1102 | GNUNET_assert (0); | ||
1103 | break; | ||
1104 | case OUT_STATE_RESOLVING: | ||
1105 | GNUNET_assert (0); | ||
1106 | break; | ||
1107 | case OUT_STATE_RINGING: | ||
1108 | GNUNET_assert (0); | ||
1109 | break; | ||
1110 | case OUT_STATE_ACTIVE: | ||
1111 | os = OUT_STATE_SUSPENDED_LOCAL; | ||
1112 | break; | ||
1113 | case OUT_STATE_SUSPENDED_LOCAL: | ||
1114 | GNUNET_assert (0); | ||
1115 | break; | ||
1116 | case OUT_STATE_SUSPENDED_REMOTE: | ||
1117 | os = OUT_STATE_SUSPENDED_BOTH; | ||
1118 | break; | ||
1119 | case OUT_STATE_SUSPENDED_BOTH: | ||
1120 | GNUNET_assert (0); | ||
1121 | break; | ||
1122 | default: | ||
1123 | GNUNET_assert (0); | ||
1124 | break; | ||
1125 | } | ||
986 | GNUNET_CONVERSATION_call_suspend (active_out->call); | 1126 | GNUNET_CONVERSATION_call_suspend (active_out->call); |
987 | set_outgoing_call_state (active_out, | 1127 | set_outgoing_call_state (active_out, |
988 | OUT_STATE_SUSPENDED); | 1128 | os); |
989 | active_out = NULL; | 1129 | active_out = NULL; |
1130 | phone_state = PS_LISTEN; | ||
990 | gtk_widget_hide (b_suspend); | 1131 | gtk_widget_hide (b_suspend); |
991 | gtk_widget_hide (b_hangup); | 1132 | gtk_widget_hide (b_hangup); |
992 | gtk_widget_show (b_call); | 1133 | gtk_widget_show (b_call); |
@@ -1002,11 +1143,43 @@ GNUNET_CONVERSATION_GTK_on_pause_clicked (GtkButton *button, | |||
1002 | { | 1143 | { |
1003 | /* incoming */ | 1144 | /* incoming */ |
1004 | GNUNET_CONVERSATION_caller_suspend (active_in->caller); | 1145 | GNUNET_CONVERSATION_caller_suspend (active_in->caller); |
1146 | phone_state = PS_LISTEN; | ||
1147 | is = active_in->state; | ||
1148 | switch (active_in->state) | ||
1149 | { | ||
1150 | case IN_STATE_NONE: | ||
1151 | GNUNET_assert (0); | ||
1152 | break; | ||
1153 | case IN_STATE_RINGING: | ||
1154 | GNUNET_assert (0); | ||
1155 | break; | ||
1156 | case IN_STATE_CONNECTED: | ||
1157 | is = IN_STATE_SUSPENDED_LOCAL; | ||
1158 | break; | ||
1159 | case IN_STATE_SUSPENDED_LOCAL: | ||
1160 | GNUNET_assert (0); | ||
1161 | break; | ||
1162 | case IN_STATE_SUSPENDED_REMOTE: | ||
1163 | is = IN_STATE_SUSPENDED_BOTH; | ||
1164 | break; | ||
1165 | case IN_STATE_SUSPENDED_BOTH: | ||
1166 | GNUNET_assert (0); | ||
1167 | break; | ||
1168 | default: | ||
1169 | GNUNET_assert (0); | ||
1170 | break; | ||
1171 | } | ||
1005 | set_incoming_call_state (active_in, | 1172 | set_incoming_call_state (active_in, |
1006 | IN_STATE_SUSPENDED_LOCAL); | 1173 | is); |
1007 | active_in = NULL; | 1174 | active_in = NULL; |
1008 | phone_state = PS_LISTEN; | 1175 | gtk_widget_hide (b_suspend); |
1009 | // FIXME: visibility | 1176 | gtk_widget_hide (b_hangup); |
1177 | gtk_widget_show (b_call); | ||
1178 | gtk_widget_set_sensitive (b_hangup, FALSE); | ||
1179 | gtk_widget_set_sensitive (b_suspend, FALSE); | ||
1180 | gtk_widget_set_sensitive (GTK_WIDGET (address_entry), TRUE); | ||
1181 | check_call_sensitivity (); | ||
1182 | do_status (); | ||
1010 | // FIXME: logging | 1183 | // FIXME: logging |
1011 | return; | 1184 | return; |
1012 | } | 1185 | } |
@@ -1035,8 +1208,7 @@ GNUNET_CONVERSATION_GTK_on_hangup_clicked (GtkButton *button, | |||
1035 | /* if current call is outgoing, stop it */ | 1208 | /* if current call is outgoing, stop it */ |
1036 | set_outgoing_call_state (active_out, | 1209 | set_outgoing_call_state (active_out, |
1037 | OUT_STATE_NONE); | 1210 | OUT_STATE_NONE); |
1038 | // FIXME: rather: remove call state! | 1211 | destroy_out (active_out); |
1039 | GNUNET_CONVERSATION_call_stop (active_out->call); | ||
1040 | active_out = NULL; | 1212 | active_out = NULL; |
1041 | // FIXME: logging | 1213 | // FIXME: logging |
1042 | gtk_widget_hide (b_suspend); | 1214 | gtk_widget_hide (b_suspend); |
@@ -1054,12 +1226,18 @@ GNUNET_CONVERSATION_GTK_on_hangup_clicked (GtkButton *button, | |||
1054 | /* if selected call is incoming, hang it up */ | 1226 | /* if selected call is incoming, hang it up */ |
1055 | set_incoming_call_state (active_in, | 1227 | set_incoming_call_state (active_in, |
1056 | IN_STATE_NONE); | 1228 | IN_STATE_NONE); |
1057 | // FIXME: rather: remove call state! | 1229 | destroy_in (active_in); |
1058 | GNUNET_CONVERSATION_caller_hang_up (active_in->caller); | ||
1059 | phone_state = PS_LISTEN; | ||
1060 | active_in = NULL; | 1230 | active_in = NULL; |
1231 | phone_state = PS_LISTEN; | ||
1232 | gtk_widget_hide (b_suspend); | ||
1233 | gtk_widget_hide (b_hangup); | ||
1234 | gtk_widget_show (b_call); | ||
1235 | gtk_widget_set_sensitive (b_hangup, FALSE); | ||
1236 | gtk_widget_set_sensitive (b_suspend, FALSE); | ||
1237 | gtk_widget_set_sensitive (GTK_WIDGET (address_entry), TRUE); | ||
1238 | check_call_sensitivity (); | ||
1239 | do_status (); | ||
1061 | // FIXME: logging | 1240 | // FIXME: logging |
1062 | // FIXME: visibility | ||
1063 | return; | 1241 | return; |
1064 | } | 1242 | } |
1065 | GNUNET_break (0); | 1243 | GNUNET_break (0); |
@@ -1077,16 +1255,18 @@ call_event_handler (void *cls, | |||
1077 | enum GNUNET_CONVERSATION_CallEventCode code) | 1255 | enum GNUNET_CONVERSATION_CallEventCode code) |
1078 | { | 1256 | { |
1079 | struct OutgoingCall *oc = cls; | 1257 | struct OutgoingCall *oc = cls; |
1258 | enum OutCallState os; | ||
1080 | 1259 | ||
1081 | set_outgoing_call_state (oc, code); | 1260 | set_outgoing_call_state (oc, code); |
1082 | switch (code) | 1261 | switch (code) |
1083 | { | 1262 | { |
1084 | case GNUNET_CONVERSATION_EC_CALL_RINGING: | 1263 | case GNUNET_CONVERSATION_EC_CALL_RINGING: |
1085 | GNUNET_break (OUT_STATE_RESOLVING == oc->state); | 1264 | GNUNET_break (OUT_STATE_RESOLVING == oc->state); |
1265 | GNUNET_break (active_out == oc); | ||
1086 | GCG_log (_("Resolved address of `%s'. Now ringing other party."), | 1266 | GCG_log (_("Resolved address of `%s'. Now ringing other party."), |
1087 | oc->peer_name); | 1267 | oc->peer_name); |
1088 | // FIXME: use oc->rr here! | 1268 | set_outgoing_call_state (oc, |
1089 | set_outgoing_call_state (oc, OUT_STATE_RINGING); | 1269 | OUT_STATE_RINGING); |
1090 | GCG_log (_("Ringing `%s'.\n"), | 1270 | GCG_log (_("Ringing `%s'.\n"), |
1091 | oc->peer_name); | 1271 | oc->peer_name); |
1092 | GCG_update_status_bar (_("Ringing `%s'."), | 1272 | GCG_update_status_bar (_("Ringing `%s'."), |
@@ -1096,6 +1276,7 @@ call_event_handler (void *cls, | |||
1096 | case GNUNET_CONVERSATION_EC_CALL_PICKED_UP: | 1276 | case GNUNET_CONVERSATION_EC_CALL_PICKED_UP: |
1097 | GNUNET_break (OUT_STATE_RINGING == oc->state); | 1277 | GNUNET_break (OUT_STATE_RINGING == oc->state); |
1098 | set_outgoing_call_state (oc, OUT_STATE_ACTIVE); | 1278 | set_outgoing_call_state (oc, OUT_STATE_ACTIVE); |
1279 | GNUNET_break (active_out == oc); | ||
1099 | gtk_widget_set_sensitive (b_suspend, TRUE); | 1280 | gtk_widget_set_sensitive (b_suspend, TRUE); |
1100 | GCG_log (_("Connection established to `%s'."), | 1281 | GCG_log (_("Connection established to `%s'."), |
1101 | oc->peer_name); | 1282 | oc->peer_name); |
@@ -1105,12 +1286,14 @@ call_event_handler (void *cls, | |||
1105 | break; | 1286 | break; |
1106 | case GNUNET_CONVERSATION_EC_CALL_GNS_FAIL: | 1287 | case GNUNET_CONVERSATION_EC_CALL_GNS_FAIL: |
1107 | GNUNET_break (OUT_STATE_RESOLVING == oc->state); | 1288 | GNUNET_break (OUT_STATE_RESOLVING == oc->state); |
1108 | set_outgoing_call_state (oc, OUT_STATE_NONE); | 1289 | GNUNET_break (active_out == oc); |
1109 | // FIXME: rather: remove from list! | 1290 | set_outgoing_call_state (oc, |
1291 | OUT_STATE_NONE); | ||
1292 | oc->call = NULL; | ||
1293 | destroy_out (oc); | ||
1294 | active_out = NULL; | ||
1110 | GCG_log (_("Failed to resolve %s in current zone."), | 1295 | GCG_log (_("Failed to resolve %s in current zone."), |
1111 | oc->peer_name); | 1296 | oc->peer_name); |
1112 | GNUNET_free (oc); | ||
1113 | active_out = NULL; | ||
1114 | gtk_widget_hide (b_suspend); | 1297 | gtk_widget_hide (b_suspend); |
1115 | gtk_widget_hide (b_hangup); | 1298 | gtk_widget_hide (b_hangup); |
1116 | gtk_widget_show (b_call); | 1299 | gtk_widget_show (b_call); |
@@ -1122,8 +1305,9 @@ call_event_handler (void *cls, | |||
1122 | case GNUNET_CONVERSATION_EC_CALL_HUNG_UP: | 1305 | case GNUNET_CONVERSATION_EC_CALL_HUNG_UP: |
1123 | GCG_log ("%s", _("Call terminated")); | 1306 | GCG_log ("%s", _("Call terminated")); |
1124 | set_outgoing_call_state (oc, OUT_STATE_NONE); | 1307 | set_outgoing_call_state (oc, OUT_STATE_NONE); |
1125 | // FIXME: rather: remove from list! | 1308 | GNUNET_break (active_out == oc); |
1126 | GNUNET_free (oc); | 1309 | oc->call = NULL; |
1310 | destroy_out (oc); | ||
1127 | active_out = NULL; | 1311 | active_out = NULL; |
1128 | gtk_widget_hide (b_suspend); | 1312 | gtk_widget_hide (b_suspend); |
1129 | gtk_widget_hide (b_hangup); | 1313 | gtk_widget_hide (b_hangup); |
@@ -1135,42 +1319,93 @@ call_event_handler (void *cls, | |||
1135 | do_status (); | 1319 | do_status (); |
1136 | break; | 1320 | break; |
1137 | case GNUNET_CONVERSATION_EC_CALL_SUSPENDED: | 1321 | case GNUNET_CONVERSATION_EC_CALL_SUSPENDED: |
1138 | GNUNET_break (OUT_STATE_ACTIVE == oc->state); | 1322 | os = oc->state; |
1139 | set_outgoing_call_state (oc, OUT_STATE_SUSPENDED); | 1323 | switch (oc->state) |
1324 | { | ||
1325 | case OUT_STATE_NONE: | ||
1326 | GNUNET_assert (0); | ||
1327 | break; | ||
1328 | case OUT_STATE_RESOLVING: | ||
1329 | GNUNET_assert (0); | ||
1330 | break; | ||
1331 | case OUT_STATE_RINGING: | ||
1332 | GNUNET_assert (0); | ||
1333 | break; | ||
1334 | case OUT_STATE_ACTIVE: | ||
1335 | os = OUT_STATE_SUSPENDED_REMOTE; | ||
1336 | break; | ||
1337 | case OUT_STATE_SUSPENDED_LOCAL: | ||
1338 | os = OUT_STATE_SUSPENDED_BOTH; | ||
1339 | break; | ||
1340 | case OUT_STATE_SUSPENDED_REMOTE: | ||
1341 | GNUNET_assert (0); | ||
1342 | break; | ||
1343 | case OUT_STATE_SUSPENDED_BOTH: | ||
1344 | GNUNET_assert (0); | ||
1345 | break; | ||
1346 | default: | ||
1347 | GNUNET_assert (0); | ||
1348 | break; | ||
1349 | } | ||
1350 | set_outgoing_call_state (oc, os); | ||
1140 | GCG_log (_("Connection to `%s' suspended (by other user)\n"), | 1351 | GCG_log (_("Connection to `%s' suspended (by other user)\n"), |
1141 | oc->peer_name); | 1352 | oc->peer_name); |
1142 | active_out = NULL; | ||
1143 | gtk_widget_hide (b_suspend); | ||
1144 | gtk_widget_hide (b_hangup); | ||
1145 | gtk_widget_show (b_call); | ||
1146 | gtk_widget_set_sensitive (b_hangup, FALSE); | ||
1147 | gtk_widget_set_sensitive (b_suspend, FALSE); | ||
1148 | gtk_widget_set_sensitive (GTK_WIDGET (address_entry), TRUE); | ||
1149 | check_call_sensitivity (); | ||
1150 | do_status (); | 1353 | do_status (); |
1151 | break; | 1354 | break; |
1152 | case GNUNET_CONVERSATION_EC_CALL_RESUMED: | 1355 | case GNUNET_CONVERSATION_EC_CALL_RESUMED: |
1153 | GNUNET_break (OUT_STATE_ACTIVE == oc->state); | 1356 | os = oc->state; |
1154 | GCG_log (_("Connection to `%s' resumed\n"), | 1357 | switch (oc->state) |
1358 | { | ||
1359 | case OUT_STATE_NONE: | ||
1360 | GNUNET_assert (0); | ||
1361 | break; | ||
1362 | case OUT_STATE_RESOLVING: | ||
1363 | GNUNET_assert (0); | ||
1364 | break; | ||
1365 | case OUT_STATE_RINGING: | ||
1366 | GNUNET_assert (0); | ||
1367 | break; | ||
1368 | case OUT_STATE_ACTIVE: | ||
1369 | GNUNET_assert (0); | ||
1370 | break; | ||
1371 | case OUT_STATE_SUSPENDED_LOCAL: | ||
1372 | GNUNET_assert (0); | ||
1373 | break; | ||
1374 | case OUT_STATE_SUSPENDED_REMOTE: | ||
1375 | os = OUT_STATE_ACTIVE; | ||
1376 | break; | ||
1377 | case OUT_STATE_SUSPENDED_BOTH: | ||
1378 | os = OUT_STATE_SUSPENDED_LOCAL; | ||
1379 | break; | ||
1380 | default: | ||
1381 | GNUNET_assert (0); | ||
1382 | break; | ||
1383 | } | ||
1384 | GCG_log (_("Connection to `%s' resumed by remote\n"), | ||
1155 | oc->peer_name); | 1385 | oc->peer_name); |
1156 | GCG_update_status_bar (_("Talking to `%s'."), | 1386 | set_outgoing_call_state (oc, os); |
1157 | oc->peer_name); | 1387 | if (OUT_STATE_ACTIVE == os) |
1158 | GCG_set_status_icon ("gnunet-conversation-gtk-tray-call-active"); | 1388 | { |
1159 | active_out = oc; | 1389 | GCG_update_status_bar (_("Talking to `%s'."), |
1160 | set_outgoing_call_state (oc, OUT_STATE_ACTIVE); | 1390 | oc->peer_name); |
1161 | gtk_widget_show (b_suspend); | 1391 | GCG_set_status_icon ("gnunet-conversation-gtk-tray-call-active"); |
1162 | gtk_widget_show (b_hangup); | 1392 | GNUNET_break (active_out == oc); |
1163 | gtk_widget_hide (b_call); | 1393 | gtk_widget_show (b_suspend); |
1164 | gtk_widget_set_sensitive (b_hangup, TRUE); | 1394 | gtk_widget_show (b_hangup); |
1165 | gtk_widget_set_sensitive (b_suspend, TRUE); | 1395 | gtk_widget_hide (b_call); |
1166 | gtk_widget_set_sensitive (GTK_WIDGET (address_entry), FALSE); | 1396 | gtk_widget_set_sensitive (b_hangup, TRUE); |
1397 | gtk_widget_set_sensitive (b_suspend, TRUE); | ||
1398 | gtk_widget_set_sensitive (GTK_WIDGET (address_entry), FALSE); | ||
1399 | } | ||
1167 | break; | 1400 | break; |
1168 | case GNUNET_CONVERSATION_EC_CALL_ERROR: | 1401 | case GNUNET_CONVERSATION_EC_CALL_ERROR: |
1169 | GCG_log ("GNUNET_CONVERSATION_EC_CALL_ERROR %s", | 1402 | GCG_log ("GNUNET_CONVERSATION_EC_CALL_ERROR %s", |
1170 | oc->peer_name); | 1403 | oc->peer_name); |
1171 | set_outgoing_call_state (oc, OUT_STATE_NONE); | 1404 | set_outgoing_call_state (oc, OUT_STATE_NONE); |
1172 | // FIXME: rather: remove from list! | 1405 | oc->call = NULL; |
1173 | active_out = NULL; | 1406 | if (active_out == oc) |
1407 | active_out = NULL; | ||
1408 | destroy_out (oc); | ||
1174 | gtk_widget_hide (b_suspend); | 1409 | gtk_widget_hide (b_suspend); |
1175 | gtk_widget_hide (b_hangup); | 1410 | gtk_widget_hide (b_hangup); |
1176 | gtk_widget_show (b_call); | 1411 | gtk_widget_show (b_call); |
@@ -1218,6 +1453,13 @@ GSC_PHONE_make_call (const char *arg) | |||
1218 | arg); | 1453 | arg); |
1219 | return; | 1454 | return; |
1220 | } | 1455 | } |
1456 | if (NULL != active_in) | ||
1457 | { | ||
1458 | GCG_log (_("You are on the phone with `%s', suspend or hang up before trying to call `%s'!\n"), | ||
1459 | active_in->caller_id, | ||
1460 | arg); | ||
1461 | return; | ||
1462 | } | ||
1221 | switch (phone_state) | 1463 | switch (phone_state) |
1222 | { | 1464 | { |
1223 | case PS_LOOKUP_EGO: | 1465 | case PS_LOOKUP_EGO: |