gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r33454 - gnunet-gtk/src/conversation


From: gnunet
Subject: [GNUnet-SVN] r33454 - gnunet-gtk/src/conversation
Date: Sun, 1 Jun 2014 00:30:10 +0200

Author: grothoff
Date: 2014-06-01 00:30:10 +0200 (Sun, 01 Jun 2014)
New Revision: 33454

Modified:
   gnunet-gtk/src/conversation/gnunet-conversation-gtk_phone.c
Log:
towards completing phone logic

Modified: gnunet-gtk/src/conversation/gnunet-conversation-gtk_phone.c
===================================================================
--- gnunet-gtk/src/conversation/gnunet-conversation-gtk_phone.c 2014-05-31 
22:20:12 UTC (rev 33453)
+++ gnunet-gtk/src/conversation/gnunet-conversation-gtk_phone.c 2014-05-31 
22:30:10 UTC (rev 33454)
@@ -188,10 +188,20 @@
   OUT_STATE_ACTIVE,
 
   /**
-   * This phone call is currently suspended.
+   * This phone call is currently suspended by local.
    */
-  OUT_STATE_SUSPENDED
+  OUT_STATE_SUSPENDED_LOCAL,
 
+  /**
+   * This phone call is currently suspended by remote.
+   */
+  OUT_STATE_SUSPENDED_REMOTE,
+
+  /**
+   * This phone call is currently suspended from both sides.
+   */
+  OUT_STATE_SUSPENDED_BOTH
+
 };
 
 
@@ -455,6 +465,7 @@
 {
   GtkTreeIter iter;
   GtkTreeModel *model;
+  struct IncomingCall *ic;
   gint type;
   gint in_state;
   gint out_state;
@@ -477,6 +488,7 @@
                      GCG_PHONE_LS_TYPE, &type,
                      GCG_PHONE_LS_CALL_STATE, &out_state,
                      GCG_PHONE_LS_CALLER_STATE, &in_state,
+                     GCG_PHONE_LS_CALLER, &ic,
                      -1);
   switch ((enum TypeOfConversation) type)
   {
@@ -495,7 +507,7 @@
     case IN_STATE_CONNECTED:
       gtk_widget_set_sensitive (b_add_contact, TRUE); 
       gtk_widget_set_sensitive (b_accept, FALSE);
-      gtk_widget_set_sensitive (b_refuse, FALSE);
+      gtk_widget_set_sensitive (b_refuse, (active_in != ic));
       gtk_widget_set_sensitive (b_resume, FALSE);
       break;
     case IN_STATE_SUSPENDED_LOCAL:
@@ -527,23 +539,33 @@
     case OUT_STATE_RESOLVING:
       gtk_widget_set_sensitive (b_add_contact, TRUE); 
       gtk_widget_set_sensitive (b_accept, FALSE);
-      gtk_widget_set_sensitive (b_refuse, TRUE);
+      gtk_widget_set_sensitive (b_refuse, FALSE);
       gtk_widget_set_sensitive (b_resume, FALSE);
     case OUT_STATE_RINGING:
       gtk_widget_set_sensitive (b_add_contact, TRUE); 
       gtk_widget_set_sensitive (b_accept, ! in_call);
-      gtk_widget_set_sensitive (b_refuse, TRUE);
+      gtk_widget_set_sensitive (b_refuse, FALSE);
       gtk_widget_set_sensitive (b_resume, ! in_call);
     case OUT_STATE_ACTIVE:
       gtk_widget_set_sensitive (b_add_contact, TRUE); 
       gtk_widget_set_sensitive (b_accept, FALSE);
       gtk_widget_set_sensitive (b_refuse, FALSE);
       gtk_widget_set_sensitive (b_resume, FALSE);
-    case OUT_STATE_SUSPENDED:
+    case OUT_STATE_SUSPENDED_LOCAL:
       gtk_widget_set_sensitive (b_add_contact, TRUE); 
-      gtk_widget_set_sensitive (b_accept, ! in_call);
+      gtk_widget_set_sensitive (b_accept, FALSE);
       gtk_widget_set_sensitive (b_refuse, TRUE);
       gtk_widget_set_sensitive (b_resume, ! in_call);
+    case OUT_STATE_SUSPENDED_REMOTE:
+      gtk_widget_set_sensitive (b_add_contact, TRUE); 
+      gtk_widget_set_sensitive (b_accept, FALSE);
+      gtk_widget_set_sensitive (b_refuse, TRUE);
+      gtk_widget_set_sensitive (b_resume, FALSE);
+    case OUT_STATE_SUSPENDED_BOTH:
+      gtk_widget_set_sensitive (b_add_contact, TRUE); 
+      gtk_widget_set_sensitive (b_accept, FALSE);
+      gtk_widget_set_sensitive (b_refuse, TRUE);
+      gtk_widget_set_sensitive (b_resume, ! in_call);
     default:
       GNUNET_assert (0);
     }
@@ -599,8 +621,12 @@
     break;
   case OUT_STATE_ACTIVE:
     break;
-  case OUT_STATE_SUSPENDED:
+  case OUT_STATE_SUSPENDED_LOCAL:
     break;
+  case OUT_STATE_SUSPENDED_REMOTE:
+    break;
+  case OUT_STATE_SUSPENDED_BOTH:
+    break;
   }
   gtk_list_store_set (active_liststore,
                       &iter,
@@ -700,6 +726,7 @@
              caller_num_gen);
     break;
   case GNUNET_CONVERSATION_EC_PHONE_HUNG_UP:
+    GNUNET_break (in_ring_counter > 0);
     in_ring_counter--;
     valid = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (active_liststore),
                                            &iter);
@@ -852,7 +879,7 @@
   }
   gtk_tree_model_get (model,
                      &iter,
-                     GCG_PHONE_LS_CALLER_STATE, &ic,
+                     GCG_PHONE_LS_CALLER, &ic,
                      -1);
   if (NULL == ic)
   {
@@ -860,6 +887,7 @@
     GNUNET_break (0);
     return;
   }
+  phone_state = PS_ACCEPTED;
   active_in = ic;
   set_incoming_call_state (ic,
                            IN_STATE_CONNECTED);
@@ -885,8 +913,69 @@
 GNUNET_CONVERSATION_GTK_on_reject_clicked (GtkButton *button,
                                            gpointer user_data)
 {
-  //  do_reject (); // FIXME!
-  do_status ();
+  struct IncomingCall *ic;
+  struct OutgoingCall *oc;
+  GtkTreeSelection *sel;
+  GtkTreeIter iter;
+  GtkTreeModel *model;
+
+  sel = gtk_tree_view_get_selection (active_treeview);
+  if (! gtk_tree_selection_get_selected (sel,
+                                        &model,
+                                        &iter))
+  {
+    /* reject button should not have been sensitive! */
+    GNUNET_break (0);
+    return;
+  }
+  gtk_tree_model_get (model,
+                     &iter,
+                     GCG_PHONE_LS_CALLER, &ic,
+                     GCG_PHONE_LS_CALL, &oc,
+                     -1);
+  if (NULL != ic)
+  {
+    if (active_in == ic)
+    {
+      /* reject button should not have been sensitive! */
+      GNUNET_break (0);
+      return;
+    }
+    GNUNET_break (in_ring_counter > 0);
+    in_ring_counter--;
+    GCG_update_status_bar (_("Rejected conversation with `%s'.\n"),
+                          ic->caller_id);
+    GCG_HISTORY_add (GCG_HISTORY_TYPE_REJECTED,
+                    ic->caller_id);
+    set_incoming_call_state (ic,
+                            IN_STATE_NONE);
+    destroy_in (ic);
+    phone_state = PS_LISTEN; /* FIXME: or error... */
+    do_status ();
+    return;
+  }
+  if (NULL != oc)
+  {
+    /* terminate suspended outgoing call */
+    if (active_out == oc)
+    {
+      /* reject button should not have been sensitive! */
+      GNUNET_break (0);
+      return;
+    }
+    GCG_update_status_bar (_("Terminated suspended conversation with `%s'.\n"),
+                          oc->peer_name);
+    GCG_HISTORY_add (GCG_HISTORY_TYPE_HANGUP,
+                    oc->peer_name);
+    set_outgoing_call_state (oc,
+                            OUT_STATE_NONE);
+    destroy_out (oc);
+    phone_state = PS_LISTEN; /* FIXME: or error... */
+    do_status ();
+    return;
+  }
+  /* reject button should not have been sensitive! */
+  GNUNET_break (0);
 }
 
 
@@ -922,9 +1011,11 @@
 GNUNET_CONVERSATION_GTK_on_resume_clicked (GtkButton *button,
                                            gpointer user_data)
 {
-  enum TypeOfConversation toc;
   struct IncomingCall *ic;
   struct OutgoingCall *oc;
+  GtkTreeSelection *sel;
+  GtkTreeIter iter;
+  GtkTreeModel *model;
 
   if ( (NULL != active_in) ||
        (NULL != active_out) ||
@@ -935,31 +1026,49 @@
     GNUNET_break(0);
     return;
   }
-  toc = 42; // FIXME: get from selection!
 
-  switch (toc)
+  sel = gtk_tree_view_get_selection (active_treeview);
+  if (! gtk_tree_selection_get_selected (sel,
+                                        &model,
+                                        &iter))
   {
-  case CALL_IN:
-    ic = NULL; // FIXME: get from selection
-    GNUNET_CONVERSATION_caller_resume (ic->caller, speaker, mic);
-    set_incoming_call_state (ic, IN_STATE_CONNECTED);
+    /* resume button should not have been sensitive! */
+    GNUNET_break (0);
+    return;
+  }
+  gtk_tree_model_get (model,
+                     &iter,
+                     GCG_PHONE_LS_CALLER, &ic,
+                     GCG_PHONE_LS_CALL, &oc,
+                     -1);
+  if (NULL != ic)
+  {
     phone_state = PS_ACCEPTED;
-    GCG_update_status_bar (_("Resumed a conversation with `%s'.\n"),
-                           ic->caller_id);
+    active_in = ic;
+    set_incoming_call_state (ic,
+                            IN_STATE_CONNECTED);
+    GCG_update_status_bar (_("Resumed conversation with `%s'.\n"),
+                          ic->caller_id);
     GCG_set_status_icon ("gnunet-conversation-call-active");
-    // FIXME: update visibility/sensitivity
+    GNUNET_CONVERSATION_caller_resume (ic->caller,
+                                      speaker, mic);
+    // GCG_HISTORY_add (GCG_HISTORY_TYPE_RESUMED, ic->caller_id);
     do_status ();
     return;
-  case CALL_OUT:
-    oc = NULL; // FIXME: get from selection
+  }
+  if (NULL != oc)
+  {
+    phone_state = PS_ACCEPTED;
+    active_out = oc;
     GNUNET_CONVERSATION_call_resume (oc->call,
                                      speaker, mic);
     set_outgoing_call_state (oc,
                              OUT_STATE_ACTIVE);
-    // FIXME: update visibility/sensitivity
+    // GCG_HISTORY_add (GCG_HISTORY_TYPE_RESUMED, ic->caller_id);
     do_status ();
     return;
   }
+  /* resume button should not have been sensitive! */
   GNUNET_break (0);
 }
 
@@ -974,6 +1083,9 @@
 GNUNET_CONVERSATION_GTK_on_pause_clicked (GtkButton *button,
                                           gpointer user_data)
 {
+  enum OutCallState os;
+  enum InCallState is;
+
   if ( (NULL != active_in) &&
        (NULL != active_out) )
   {
@@ -983,10 +1095,39 @@
   if (NULL != active_out)
   {
     /* outgoing */
+    os = active_out->state;
+    switch (active_out->state)
+    {
+    case OUT_STATE_NONE:
+      GNUNET_assert (0);
+      break;
+    case OUT_STATE_RESOLVING:
+      GNUNET_assert (0);
+      break;
+    case OUT_STATE_RINGING:
+      GNUNET_assert (0);
+      break;
+    case OUT_STATE_ACTIVE:
+      os = OUT_STATE_SUSPENDED_LOCAL;
+      break;
+    case OUT_STATE_SUSPENDED_LOCAL:
+      GNUNET_assert (0);
+      break;
+    case OUT_STATE_SUSPENDED_REMOTE:
+      os = OUT_STATE_SUSPENDED_BOTH;
+      break;
+    case OUT_STATE_SUSPENDED_BOTH:
+      GNUNET_assert (0);
+      break;
+    default:
+      GNUNET_assert (0);
+      break;
+    }
     GNUNET_CONVERSATION_call_suspend (active_out->call);
     set_outgoing_call_state (active_out,
-                             OUT_STATE_SUSPENDED);
+                             os);
     active_out = NULL;
+    phone_state = PS_LISTEN;
     gtk_widget_hide (b_suspend);
     gtk_widget_hide (b_hangup);
     gtk_widget_show (b_call);
@@ -1002,11 +1143,43 @@
   {
     /* incoming */
     GNUNET_CONVERSATION_caller_suspend (active_in->caller);
+    phone_state = PS_LISTEN;
+    is = active_in->state;
+    switch (active_in->state)
+    {
+    case IN_STATE_NONE:
+      GNUNET_assert (0);
+      break;
+    case IN_STATE_RINGING:
+      GNUNET_assert (0);
+      break;
+    case IN_STATE_CONNECTED:
+      is = IN_STATE_SUSPENDED_LOCAL;
+      break;
+    case IN_STATE_SUSPENDED_LOCAL:
+      GNUNET_assert (0);
+      break;
+    case IN_STATE_SUSPENDED_REMOTE:
+      is = IN_STATE_SUSPENDED_BOTH;
+      break;
+    case IN_STATE_SUSPENDED_BOTH:
+      GNUNET_assert (0);
+      break;
+    default:
+      GNUNET_assert (0);
+      break;
+    }
     set_incoming_call_state (active_in,
-                             IN_STATE_SUSPENDED_LOCAL);
+                             is);
     active_in = NULL;
-    phone_state = PS_LISTEN;
-    // FIXME: visibility
+    gtk_widget_hide (b_suspend);
+    gtk_widget_hide (b_hangup);
+    gtk_widget_show (b_call);
+    gtk_widget_set_sensitive (b_hangup, FALSE);
+    gtk_widget_set_sensitive (b_suspend, FALSE);
+    gtk_widget_set_sensitive (GTK_WIDGET (address_entry), TRUE);
+    check_call_sensitivity ();
+    do_status ();
     // FIXME: logging
     return;
   }
@@ -1035,8 +1208,7 @@
     /* if current call is outgoing, stop it */
     set_outgoing_call_state (active_out,
                              OUT_STATE_NONE);
-    // FIXME: rather: remove call state!
-    GNUNET_CONVERSATION_call_stop (active_out->call);
+    destroy_out (active_out);
     active_out = NULL;
     // FIXME: logging
     gtk_widget_hide (b_suspend);
@@ -1054,12 +1226,18 @@
     /* if selected call is incoming, hang it up */
     set_incoming_call_state (active_in,
                              IN_STATE_NONE);
-    // FIXME: rather: remove call state!
-    GNUNET_CONVERSATION_caller_hang_up (active_in->caller);
+    destroy_in (active_in);
+    active_in = NULL;
     phone_state = PS_LISTEN;
-    active_in = NULL;
+    gtk_widget_hide (b_suspend);
+    gtk_widget_hide (b_hangup);
+    gtk_widget_show (b_call);
+    gtk_widget_set_sensitive (b_hangup, FALSE);
+    gtk_widget_set_sensitive (b_suspend, FALSE);
+    gtk_widget_set_sensitive (GTK_WIDGET (address_entry), TRUE);
+    check_call_sensitivity ();
+    do_status ();
     // FIXME: logging
-    // FIXME: visibility
     return;
   }
   GNUNET_break (0);
@@ -1077,16 +1255,18 @@
                     enum GNUNET_CONVERSATION_CallEventCode code)
 {
   struct OutgoingCall *oc = cls;
+  enum OutCallState os;
 
   set_outgoing_call_state (oc, code);
   switch (code)
   {
   case GNUNET_CONVERSATION_EC_CALL_RINGING:
     GNUNET_break (OUT_STATE_RESOLVING == oc->state);
+    GNUNET_break (active_out == oc);
     GCG_log (_("Resolved address of `%s'. Now ringing other party."),
              oc->peer_name);
-    // FIXME: use oc->rr here!
-    set_outgoing_call_state (oc, OUT_STATE_RINGING);
+    set_outgoing_call_state (oc,
+                            OUT_STATE_RINGING);
     GCG_log (_("Ringing `%s'.\n"),
              oc->peer_name);
     GCG_update_status_bar (_("Ringing `%s'."),
@@ -1096,6 +1276,7 @@
   case GNUNET_CONVERSATION_EC_CALL_PICKED_UP:
     GNUNET_break (OUT_STATE_RINGING == oc->state);
     set_outgoing_call_state (oc, OUT_STATE_ACTIVE);
+    GNUNET_break (active_out == oc);
     gtk_widget_set_sensitive (b_suspend, TRUE);
     GCG_log (_("Connection established to `%s'."),
              oc->peer_name);
@@ -1105,12 +1286,14 @@
     break;
   case GNUNET_CONVERSATION_EC_CALL_GNS_FAIL:
     GNUNET_break (OUT_STATE_RESOLVING == oc->state);
-    set_outgoing_call_state (oc, OUT_STATE_NONE);
-    // FIXME: rather: remove from list!
+    GNUNET_break (active_out == oc);
+    set_outgoing_call_state (oc,
+                            OUT_STATE_NONE);
+    oc->call = NULL;
+    destroy_out (oc);
+    active_out = NULL;
     GCG_log (_("Failed to resolve %s in current zone."),
              oc->peer_name);
-    GNUNET_free (oc);
-    active_out = NULL;
     gtk_widget_hide (b_suspend);
     gtk_widget_hide (b_hangup);
     gtk_widget_show (b_call);
@@ -1122,8 +1305,9 @@
   case GNUNET_CONVERSATION_EC_CALL_HUNG_UP:
     GCG_log ("%s", _("Call terminated"));
     set_outgoing_call_state (oc, OUT_STATE_NONE);
-    // FIXME: rather: remove from list!
-    GNUNET_free (oc);
+    GNUNET_break (active_out == oc);
+    oc->call = NULL;
+    destroy_out (oc);
     active_out = NULL;
     gtk_widget_hide (b_suspend);
     gtk_widget_hide (b_hangup);
@@ -1135,42 +1319,93 @@
     do_status ();
     break;
   case GNUNET_CONVERSATION_EC_CALL_SUSPENDED:
-    GNUNET_break (OUT_STATE_ACTIVE == oc->state);
-    set_outgoing_call_state (oc, OUT_STATE_SUSPENDED);
+    os = oc->state;
+    switch (oc->state)
+    {
+    case OUT_STATE_NONE:
+      GNUNET_assert (0);
+      break;
+    case OUT_STATE_RESOLVING:
+      GNUNET_assert (0);
+      break;
+    case OUT_STATE_RINGING:
+      GNUNET_assert (0);
+      break;
+    case OUT_STATE_ACTIVE:
+      os = OUT_STATE_SUSPENDED_REMOTE;
+      break;
+    case OUT_STATE_SUSPENDED_LOCAL:
+      os = OUT_STATE_SUSPENDED_BOTH;
+      break;
+    case OUT_STATE_SUSPENDED_REMOTE:
+      GNUNET_assert (0);
+      break;
+    case OUT_STATE_SUSPENDED_BOTH:
+      GNUNET_assert (0);
+      break;
+    default:
+      GNUNET_assert (0);
+      break;
+    }
+    set_outgoing_call_state (oc, os);
     GCG_log (_("Connection to `%s' suspended (by other user)\n"),
              oc->peer_name);
-    active_out = NULL;
-    gtk_widget_hide (b_suspend);
-    gtk_widget_hide (b_hangup);
-    gtk_widget_show (b_call);
-    gtk_widget_set_sensitive (b_hangup, FALSE);
-    gtk_widget_set_sensitive (b_suspend, FALSE);
-    gtk_widget_set_sensitive (GTK_WIDGET (address_entry), TRUE);
-    check_call_sensitivity ();
     do_status ();
    break;
   case GNUNET_CONVERSATION_EC_CALL_RESUMED:
-    GNUNET_break (OUT_STATE_ACTIVE == oc->state);
-    GCG_log (_("Connection to `%s' resumed\n"),
+    os = oc->state;
+    switch (oc->state)
+    {
+    case OUT_STATE_NONE:
+      GNUNET_assert (0);
+      break;
+    case OUT_STATE_RESOLVING:
+      GNUNET_assert (0);
+      break;
+    case OUT_STATE_RINGING:
+      GNUNET_assert (0);
+      break;
+    case OUT_STATE_ACTIVE:
+      GNUNET_assert (0);
+      break;
+    case OUT_STATE_SUSPENDED_LOCAL:
+      GNUNET_assert (0);
+      break;
+    case OUT_STATE_SUSPENDED_REMOTE:
+      os = OUT_STATE_ACTIVE;
+      break;
+    case OUT_STATE_SUSPENDED_BOTH:
+      os = OUT_STATE_SUSPENDED_LOCAL;
+      break;
+    default:
+      GNUNET_assert (0);
+      break;
+    }
+    GCG_log (_("Connection to `%s' resumed by remote\n"),
              oc->peer_name);
-    GCG_update_status_bar (_("Talking to `%s'."),
-                           oc->peer_name);
-    GCG_set_status_icon ("gnunet-conversation-gtk-tray-call-active");
-    active_out = oc;
-    set_outgoing_call_state (oc, OUT_STATE_ACTIVE);
-    gtk_widget_show (b_suspend);
-    gtk_widget_show (b_hangup);
-    gtk_widget_hide (b_call);
-    gtk_widget_set_sensitive (b_hangup, TRUE);
-    gtk_widget_set_sensitive (b_suspend, TRUE);
-    gtk_widget_set_sensitive (GTK_WIDGET (address_entry), FALSE);
+    set_outgoing_call_state (oc, os);
+    if (OUT_STATE_ACTIVE == os)
+    {
+      GCG_update_status_bar (_("Talking to `%s'."),
+                            oc->peer_name);
+      GCG_set_status_icon ("gnunet-conversation-gtk-tray-call-active");
+      GNUNET_break (active_out == oc);
+      gtk_widget_show (b_suspend);
+      gtk_widget_show (b_hangup);
+      gtk_widget_hide (b_call);
+      gtk_widget_set_sensitive (b_hangup, TRUE);
+      gtk_widget_set_sensitive (b_suspend, TRUE);
+      gtk_widget_set_sensitive (GTK_WIDGET (address_entry), FALSE);
+    }
     break;
   case GNUNET_CONVERSATION_EC_CALL_ERROR:
     GCG_log ("GNUNET_CONVERSATION_EC_CALL_ERROR %s",
              oc->peer_name);
     set_outgoing_call_state (oc, OUT_STATE_NONE);
-    // FIXME: rather: remove from list!
-    active_out = NULL;
+    oc->call = NULL;
+    if (active_out == oc)
+      active_out = NULL;
+    destroy_out (oc);
     gtk_widget_hide (b_suspend);
     gtk_widget_hide (b_hangup);
     gtk_widget_show (b_call);
@@ -1218,6 +1453,13 @@
              arg);
     return;
   }
+  if (NULL != active_in)
+  {
+    GCG_log (_("You are on the phone with `%s', suspend or hang up before 
trying to call `%s'!\n"),
+             active_in->caller_id,
+             arg);
+    return;
+  }
   switch (phone_state)
   {
   case PS_LOOKUP_EGO:




reply via email to

[Prev in Thread] Current Thread [Next in Thread]