aboutsummaryrefslogtreecommitdiff
path: root/src/conversation/gnunet-conversation-gtk_phone.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/conversation/gnunet-conversation-gtk_phone.c')
-rw-r--r--src/conversation/gnunet-conversation-gtk_phone.c376
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
885GNUNET_CONVERSATION_GTK_on_reject_clicked (GtkButton *button, 913GNUNET_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
922GNUNET_CONVERSATION_GTK_on_resume_clicked (GtkButton *button, 1011GNUNET_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
974GNUNET_CONVERSATION_GTK_on_pause_clicked (GtkButton *button, 1083GNUNET_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: