gnunet-svn
[Top][All Lists]
Advanced

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

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


From: gnunet
Subject: [GNUnet-SVN] r33451 - gnunet-gtk/src/conversation
Date: Sat, 31 May 2014 23:46:05 +0200

Author: grothoff
Date: 2014-05-31 23:46:05 +0200 (Sat, 31 May 2014)
New Revision: 33451

Modified:
   gnunet-gtk/src/conversation/gnunet-conversation-gtk_phone.c
Log:
more work on phone logic

Modified: gnunet-gtk/src/conversation/gnunet-conversation-gtk_phone.c
===================================================================
--- gnunet-gtk/src/conversation/gnunet-conversation-gtk_phone.c 2014-05-31 
21:06:02 UTC (rev 33450)
+++ gnunet-gtk/src/conversation/gnunet-conversation-gtk_phone.c 2014-05-31 
21:46:05 UTC (rev 33451)
@@ -148,7 +148,17 @@
   /**
    * The call is currently suspended (by us).
    */
-  IN_STATE_SUSPENDED
+  IN_STATE_SUSPENDED_LOCAL,
+
+  /**
+   * The call is currently suspended (by remote).
+   */
+  IN_STATE_SUSPENDED_REMOTE,
+
+  /**
+   * The call is currently suspended (by both).
+   */
+  IN_STATE_SUSPENDED_BOTH
 };
 
 
@@ -436,12 +446,125 @@
 
 
 /**
+ * Update sensitivity of buttons associated with the call list.
+ *
+ * @param sel selection that changed (belongs to #active_treeview)
+ */
+static void
+update_call_buttons (GtkTreeSelection *sel) 
+{
+  GtkTreeIter iter;
+  GtkTreeModel *model;
+  gint type;
+  gint in_state;
+  gint out_state;
+  gboolean in_call;
+
+  if (! gtk_tree_selection_get_selected (sel,
+                                        &model,
+                                        &iter))
+  {
+    /* nothing selected, disable buttons */
+    gtk_widget_set_sensitive (b_add_contact, FALSE); 
+    gtk_widget_set_sensitive (b_accept, FALSE);
+    gtk_widget_set_sensitive (b_refuse, FALSE);
+    gtk_widget_set_sensitive (b_resume, FALSE);
+    return;
+  }
+  in_call = (NULL != active_in) || (NULL != active_out);
+  gtk_tree_model_get (model,
+                     &iter,
+                     GCG_PHONE_LS_TYPE, &type,
+                     GCG_PHONE_LS_CALL_STATE, &out_state,
+                     GCG_PHONE_LS_CALLER_STATE, &in_state,
+                     -1);
+  switch ((enum TypeOfConversation) type)
+  {
+  case CALL_IN:
+    switch ((enum InCallState) in_state)
+    {
+    case IN_STATE_NONE:
+      GNUNET_break (0);
+      break;
+    case IN_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_resume, ! in_call);
+      break;
+    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_resume, FALSE);
+      break;
+    case IN_STATE_SUSPENDED_LOCAL:
+      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, TRUE);
+    case IN_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 IN_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, TRUE);
+      break;
+    default:
+      GNUNET_assert (0);
+    }
+    break;
+  case CALL_OUT:
+    switch ((enum OutCallState) out_state)
+    {
+    case OUT_STATE_NONE:
+      GNUNET_break (0);
+      break;
+    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_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_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:
+      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_resume, ! in_call);
+    default:
+      GNUNET_assert (0);
+    }
+    break;
+  default:
+    GNUNET_assert (0);
+  }
+}
+
+
+/**
  * @brief executed when selecting a different item in active call list
+ *
+ * @param sel selection that changed (belongs to #active_treeview)
+ * @param user_data builder context (unused)
  */
 void
-gnunet_conversation_gtk_active_calls_treeview_selection_changed_cb ()
+gnunet_conversation_gtk_active_calls_treeview_selection_changed_cb  
(GtkTreeSelection *sel,
+                                                                    gpointer 
user_data) 
 {
-  // FIXME
+  update_call_buttons (sel);
 }
 
 
@@ -458,6 +581,7 @@
   GtkTreePath *path;
   GtkTreeIter iter;
 
+  oc->state = state;
   path = gtk_tree_row_reference_get_path (oc->rr);
   GNUNET_assert (gtk_tree_model_get_iter (GTK_TREE_MODEL (active_liststore),
                                           &iter,
@@ -482,6 +606,7 @@
                       &iter,
                       GCG_PHONE_LS_CALL_STATE, state,
                       -1);
+  update_call_buttons (gtk_tree_view_get_selection (active_treeview));
 }
 
 
@@ -498,6 +623,7 @@
   GtkTreePath *path;
   GtkTreeIter iter;
 
+  ic->state = state;
   path = gtk_tree_row_reference_get_path (ic->rr);
   GNUNET_assert (gtk_tree_model_get_iter (GTK_TREE_MODEL (active_liststore),
                                           &iter,
@@ -513,13 +639,18 @@
     break;
   case IN_STATE_CONNECTED:
     break;
-  case IN_STATE_SUSPENDED:
+  case IN_STATE_SUSPENDED_LOCAL:
     break;
+  case IN_STATE_SUSPENDED_REMOTE:
+    break;
+  case IN_STATE_SUSPENDED_BOTH:
+    break;
   }
   gtk_list_store_set (active_liststore,
                       &iter,
                       GCG_PHONE_LS_CALLER_STATE, state,
                       -1);
+  update_call_buttons (gtk_tree_view_get_selection (active_treeview));
 }
 
 
@@ -540,10 +671,12 @@
   GtkTreeIter iter;
   gboolean valid;
   struct IncomingCall *ic;
+  GtkTreePath *path;
 
   switch (code)
   {
   case GNUNET_CONVERSATION_EC_PHONE_RING:
+    in_ring_counter++;
     ic = GNUNET_new (struct IncomingCall);
     ic->caller = caller;
     ic->caller_id = GNUNET_strdup (caller_id);
@@ -557,40 +690,39 @@
                                        GCG_PHONE_LS_CALLER_STATE, 
IN_STATE_RINGING,
                                        GCG_PHONE_LS_TYPE, CALL_IN,
                                        -1);
-    // FIXME: initialize ic->rr
+    path = gtk_tree_model_get_path (GTK_TREE_MODEL (active_liststore),
+                                   &iter);
+    ic->rr = gtk_tree_row_reference_new (GTK_TREE_MODEL (active_liststore),
+                                        path);
+    gtk_tree_path_free (path);
     GCG_log (_("A Incoming call from `%s' with number %u\n"),
              caller_id,
              caller_num_gen);
     break;
   case GNUNET_CONVERSATION_EC_PHONE_HUNG_UP:
+    in_ring_counter--;
     valid = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (active_liststore),
                                            &iter);
     GNUNET_break (valid);
     while (valid)
     {
-      gchar *str_data;
-      gint   int_data;
-      struct IncomingCall *ic;
-
       gtk_tree_model_get (GTK_TREE_MODEL (active_liststore),
                           &iter,
                           GCG_PHONE_LS_CALLER, &ic,
-                          GCG_PHONE_LS_CALLER_ID, &str_data,
-                          GCG_PHONE_LS_CALLER_NUM, &int_data,
                           -1);
       if (caller == ic->caller)
       {
-        GCG_log (_("phone hung up:%s number: %u "),
-                 str_data,
-                 int_data);
+        GCG_log (_("phone hung up: %s number: %u"),
+                 ic->caller_id,
+                 ic->caller_num);
         set_incoming_call_state (ic,
                                  IN_STATE_NONE);
         break;
       }
-      g_free (str_data);
       valid = gtk_tree_model_iter_next (GTK_TREE_MODEL (active_liststore),
                                         &iter);
     }
+    GNUNET_break (valid);
     phone_state = PS_LISTEN;
     break;
   }
@@ -601,16 +733,17 @@
 /**
  * Function called with an event emitted by a caller.
  *
- * @param cls closure with the `struct CallList` of the caller
+ * @param cls closure with the `struct IncomingCall` of the caller
  * @param code type of the event issued by the caller
  */
 static void
 caller_event_handler (void *cls,
                       enum GNUNET_CONVERSATION_CallerEventCode code)
 {
-  struct IncomingCall *cl = cls;
+  struct IncomingCall *ic = cls;
+  enum InCallState is;
 
-  if (NULL == cl)
+  if (NULL == ic)
   {
     GNUNET_break (0);
     return;
@@ -618,17 +751,66 @@
   switch (code)
   {
   case GNUNET_CONVERSATION_EC_CALLER_SUSPEND:
-    //TODO: should this be cls? not cl->caller
-    set_incoming_call_state (cl,
-                             IN_STATE_SUSPENDED);
+    is = ic->state;
+    switch (ic->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_REMOTE;
+      break;
+    case IN_STATE_SUSPENDED_LOCAL:
+      is = IN_STATE_SUSPENDED_BOTH;
+      break;
+    case IN_STATE_SUSPENDED_REMOTE:
+      GNUNET_assert (0);
+      break;
+    case IN_STATE_SUSPENDED_BOTH:
+      GNUNET_assert (0);
+      break;
+    default:
+      GNUNET_assert (0);
+      break;
+    }
+    set_incoming_call_state (ic,
+                             is);
     GCG_log (_("Call from `%s' suspended by other user\n"),
-             cl->caller_id);
+             ic->caller_id);
     break;
   case GNUNET_CONVERSATION_EC_CALLER_RESUME:
-    set_incoming_call_state(cl,
-                            IN_STATE_CONNECTED);
+    is = ic->state;
+    switch (ic->state)
+    {
+    case IN_STATE_NONE:
+      GNUNET_assert (0);
+      break;
+    case IN_STATE_RINGING:
+      GNUNET_assert (0);
+      break;
+    case IN_STATE_CONNECTED:
+      GNUNET_assert (0);
+      break;
+    case IN_STATE_SUSPENDED_LOCAL:
+      GNUNET_assert (0);
+      break;
+    case IN_STATE_SUSPENDED_REMOTE:
+      is = IN_STATE_CONNECTED;
+      break;
+    case IN_STATE_SUSPENDED_BOTH:
+      is = IN_STATE_SUSPENDED_LOCAL;
+      break;
+    default:
+      GNUNET_assert (0);
+      break;
+    }
+    set_incoming_call_state (ic,
+                            is);
     GCG_log (_("Call from `%s' resumed by other user\n"),
-             cl->caller_id);
+             ic->caller_id);
     break;
   }
   do_status();
@@ -646,6 +828,9 @@
                                            gpointer user_data)
 {
   struct IncomingCall *ic;
+  GtkTreeSelection *sel;
+  GtkTreeIter iter;
+  GtkTreeModel *model;
 
   if ( (NULL != active_in) ||
        (NULL != active_out) ||
@@ -656,7 +841,26 @@
     return;
   }
   phone_state = PS_ACCEPTED;
-  ic = NULL; // FIXME: get 'ic' from selection!
+  sel = gtk_tree_view_get_selection (active_treeview);
+  if (! gtk_tree_selection_get_selected (sel,
+                                        &model,
+                                        &iter))
+  {
+    /* accept button should not have been sensitive! */
+    GNUNET_break (0);
+    return;
+  }
+  gtk_tree_model_get (model,
+                     &iter,
+                     GCG_PHONE_LS_CALLER_STATE, &ic,
+                     -1);
+  if (NULL == ic)
+  {
+    /* accept button should not have been sensitive! */
+    GNUNET_break (0);
+    return;
+  }
+  active_in = ic;
   set_incoming_call_state (ic,
                            IN_STATE_CONNECTED);
   GCG_update_status_bar (_("Started a conversation with `%s'.\n"),
@@ -667,7 +871,6 @@
                                       speaker, mic);
   GCG_HISTORY_add (GCG_HISTORY_TYPE_ACCEPTED,
                    ic->caller_id);
-  // FIXME: update visibility properly...
   do_status ();
 }
 
@@ -800,7 +1003,7 @@
     /* incoming */
     GNUNET_CONVERSATION_caller_suspend (active_in->caller);
     set_incoming_call_state (active_in,
-                             IN_STATE_SUSPENDED);
+                             IN_STATE_SUSPENDED_LOCAL);
     active_in = NULL;
     phone_state = PS_LISTEN;
     // FIXME: visibility
@@ -990,7 +1193,8 @@
 GSC_PHONE_make_call (const char *arg)
 {
   struct GNUNET_IDENTITY_Ego *caller_id;
-  GtkTreeIter gtkiter;
+  GtkTreePath *path;
+  GtkTreeIter iter;
   struct OutgoingCall *oc;
 
   gtk_entry_set_text (address_entry,
@@ -1042,7 +1246,7 @@
                                     speaker, mic,
                                     &call_event_handler, oc);
   gtk_list_store_insert_with_values (active_liststore,
-                                     &gtkiter,
+                                     &iter,
                                      -1,
                                      GCG_PHONE_LS_CALLER_ID, oc->peer_name,
                                      GCG_PHONE_LS_CALLER, NULL,
@@ -1052,7 +1256,12 @@
                                      GCG_PHONE_LS_CALL, oc,
                                      GCG_PHONE_LS_CALL_NUM, call_counter,
                                      GCG_PHONE_LS_CALL_STATE, 
OUT_STATE_RESOLVING,
-                                     -1);
+                                     -1); 
+  path = gtk_tree_model_get_path (GTK_TREE_MODEL (active_liststore),
+                                 &iter);
+  oc->rr = gtk_tree_row_reference_new (GTK_TREE_MODEL (active_liststore),
+                                      path);   
+  gtk_tree_path_free (path);
   /* log event */
   GCG_log (_("Resolving `%s'.\n"),
            oc->peer_name);




reply via email to

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