gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r6984 - gnunet-gtk/src/plugins/chat


From: gnunet
Subject: [GNUnet-SVN] r6984 - gnunet-gtk/src/plugins/chat
Date: Sun, 1 Jun 2008 18:02:55 -0600 (MDT)

Author: grothoff
Date: 2008-06-01 18:02:55 -0600 (Sun, 01 Jun 2008)
New Revision: 6984

Modified:
   gnunet-gtk/src/plugins/chat/chat.c
Log:
fixing compile errors

Modified: gnunet-gtk/src/plugins/chat/chat.c
===================================================================
--- gnunet-gtk/src/plugins/chat/chat.c  2008-06-01 21:29:40 UTC (rev 6983)
+++ gnunet-gtk/src/plugins/chat/chat.c  2008-06-02 00:02:55 UTC (rev 6984)
@@ -23,165 +23,157 @@
  * @author Christian Grothoff
  * @author Igor Wronsky
  * @author Nathan Evans
- * 
  */
 
 #include "platform.h"
 #include <GNUnet/gnunet_chat_lib.h>
+#include <GNUnet/gnunet_pseudonym_lib.h>
 #include "gnunetgtk_common.h"
 
-/* YUCK -- why? */
-#include "../fs/meta.h"
-#include "../fs/meta.c"
-
-
 struct GNUNET_CHAT_safe_write_struct
 {
-  GtkWidget *chatWindow;
+  GtkWidget * text_view;
   const char *message;
-  const GNUNET_HashCode *sender;
+  const char *sender;
 };
 
 struct GNUNET_CHAT_safe_nick_write_struct
 {
-  GtkWidget *nickList;
+  GtkListStore *model;
+  GdkPixbuf * icon;
+  const struct GNUNET_ECRS_MetaData *meta;
   const char *nick;
+  GNUNET_HashCode pid;
 };
 
 struct GNUNET_CHAT_gui_chat_client
 {
   struct GNUNET_CHAT_gui_chat_client *next;
-  struct GNUNET_CHAT_gui_chat_client *prev;
-  int number;
+  GtkWidget * text_view;
+  GtkListStore * nick_model;
   GtkWidget *chatFrame;
+  GtkWidget *chat_entry;
+  GladeXML *chatXML;
   struct GNUNET_CHAT_Room *room;
-  gchar *room_name;
-
+  GNUNET_HashCode mypid;
 };
 
-struct GNUNET_CHAT_member_list
+/**
+ * For nicknames in chat view.
+ */
+enum
 {
-  struct GNUNET_CHAT_member_list *next;
-  struct GNUNET_CHAT_member_list *prev;
-  char *nick;
+  CHAT_NICKNAME = 0,
+  CHAT_METADATA,
+  CHAT_ICON,
+  CHAT_PID,
+  CHAT_NUM,
 };
 
 
-static struct GNUNET_ClientServerConnection *sock;
-
 static struct GNUNET_Mutex *lock;
 
-static struct GNUNET_CronManager *cron;
-
 static struct GNUNET_GE_Context *chat_ectx;
 
 static struct GNUNET_GC_Configuration *chat_cfg;
 
 static struct GNUNET_CHAT_gui_chat_client *list;
 
-static struct GNUNET_CHAT_member_list *room_member_list;
-
 static void *
 write_save_call (void *arg)
 {
-  struct GNUNET_CHAT_safe_write_struct *writeholder = arg;
+  struct GNUNET_CHAT_safe_write_struct *cls = arg;
   GtkTextBuffer *buffer;
   char *message_buf;
   int message_buf_size;
 
-  buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (writeholder->chatWindow));
+  buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (cls->text_view));
   message_buf_size =
-    snprintf (NULL, 0, "<> %s", /* writeholder->senderNick,*/
-              writeholder->message);
-  message_buf = GNUNET_malloc (message_buf_size + 2);
-  snprintf (message_buf, message_buf_size + 2, "<FIXME> %s\n",
-            /*writeholder->senderNick,*/ writeholder->message);
-  gtk_text_buffer_insert_at_cursor (buffer, message_buf,
+    snprintf (NULL, 0,
+             "<%s> %s\n", 
+             cls->sender,
+              cls->message);
+  message_buf = GNUNET_malloc (message_buf_size + 1);
+  GNUNET_snprintf (message_buf, 
+                  message_buf_size + 1,
+                  "<%s> %s\n",
+                  cls->sender,
+                  cls->message);
+  gtk_text_buffer_insert_at_cursor (buffer,
+                                   message_buf,
                                     message_buf_size + 1);
-
+  GNUNET_free(message_buf);
   return NULL;
 }
 
-/* Safe call to add a nick to the chat room view */
-/* static */ void *
-write_nick_save_call (void *arg)
+/**
+ * Safe call to add a nick to the chat room view 
+ */
+static void *
+add_nick_save_call (void *arg)
 {
-  struct GNUNET_CHAT_safe_nick_write_struct *writeholder = arg;
+  struct GNUNET_CHAT_safe_nick_write_struct *cls = arg;
+  GtkListStore * model;
+  GtkTreeIter iter;
+  GNUNET_HashCode * pid;
 
-  GtkTextBuffer *buffer;
-  char *message_buf;
-  int message_buf_size;
-  struct GNUNET_CHAT_member_list *pos = room_member_list;
-
-  g_print ("received chat name %s\n", writeholder->nick);
-  while (pos != NULL)
-    {
-      if (strcmp (pos->nick, writeholder->nick) == 0)
-        return NULL;
-      pos = pos->next;
-    }
-
-  g_print ("adding chat name %s to the list\n", writeholder->nick);
-
-  pos = GNUNET_malloc (sizeof (struct GNUNET_CHAT_member_list));
-  pos->nick = GNUNET_malloc (strlen (writeholder->nick) + 1);
-  strcpy (pos->nick, writeholder->nick);
-  pos->next = room_member_list;
-  if (room_member_list != NULL)
-    room_member_list->prev = pos;
-  room_member_list = pos;
-  buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (writeholder->nickList));
-  message_buf_size = snprintf (NULL, 0, "%s", writeholder->nick);
-  message_buf = GNUNET_malloc (message_buf_size + 2);
-  snprintf (message_buf, message_buf_size + 2, "%s\n", writeholder->nick);
-  gtk_text_buffer_insert_at_cursor (buffer, message_buf,
-                                    message_buf_size + 1);
-
+  model = GTK_LIST_STORE (cls->model);
+  gtk_list_store_append (model, &iter);
+  pid = GNUNET_malloc(sizeof(GNUNET_HashCode));
+  *pid = cls->pid;
+  gtk_list_store_set(model,
+                    &iter,
+                    CHAT_PID, pid,
+                    CHAT_METADATA, GNUNET_ECRS_meta_data_duplicate(cls->meta),
+                    CHAT_ICON, cls->icon,
+                    CHAT_NICKNAME, cls->nick,
+                    -1);
   return NULL;
 }
 
-/* Safe call to remove a nick from the chat room view */
-/* static */ void *
+/**
+ * Safe call to remove a nick from the chat room view 
+ */
+static void *
 remove_nick_save_call (void *arg)
 {
-  struct GNUNET_CHAT_safe_nick_write_struct *writeholder = arg;
+  struct GNUNET_CHAT_safe_nick_write_struct *cls = arg;
+  GtkListStore * model;
+  GtkTreeIter iter;
+  GNUNET_HashCode * pid;
+  struct GNUNET_ECRS_MetaData * meta;
 
-  GtkTextBuffer *buffer =
-    gtk_text_view_get_buffer (GTK_TEXT_VIEW (writeholder->nickList));
-  char *message_buf;
-  int message_buf_size;
-  struct GNUNET_CHAT_member_list *pos = room_member_list;
-
-  while (pos != NULL)
+  model = GTK_LIST_STORE (cls->model);
+  /* find and remove existing entry */
+  if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (model), &iter))
     {
-      if (strcmp (pos->nick, writeholder->nick) == 0)
+      do
         {
-          pos->prev->next = pos->next;
-          pos->next->prev = pos->prev;
-          GNUNET_free (pos);
-          /*buffer = 
gtk_text_view_get_buffer(GTK_TEXT_VIEW(writeholder->nickList)); */
-          buffer = gtk_text_buffer_new (NULL);
-          return NULL;
+          pid = NULL;
+          gtk_tree_model_get (GTK_TREE_MODEL (model),
+                              &iter,
+                             CHAT_PID, &pid,
+                             CHAT_METADATA, &meta,
+                             -1);
+          if ( (pid != NULL) && 
+              (0 == memcmp(pid,
+                           &cls->pid,
+                           sizeof(GNUNET_HashCode))) )
+           {
+             GNUNET_ECRS_meta_data_destroy(meta);
+             GNUNET_free(pid);
+             gtk_list_store_remove(model, &iter);
+             return NULL; /* done! */
+           }
         }
-      pos = pos->next;
+      while (gtk_tree_model_iter_next (GTK_TREE_MODEL (model), &iter));
     }
-
   return NULL;
-
-
-  message_buf_size = snprintf (NULL, 0, "%s", writeholder->nick);
-  message_buf = GNUNET_malloc (message_buf_size + 2);
-  snprintf (message_buf, message_buf_size + 2, "%s\n", writeholder->nick);
-  gtk_text_buffer_insert_at_cursor (buffer, message_buf,
-                                    message_buf_size + 1);
-
-  return NULL;
 }
 
 /**
  * A message was sent in the chat to us.
  *
- * @param timestamp when was the message sent?
  * @param senderNick what is the nickname of the sender? (maybe NULL)
  * @param message the message (maybe NULL, especially if confirmation
  *        is requested before delivery; the protocol will ensure
@@ -202,28 +194,15 @@
                  GNUNET_CHAT_MSG_OPTIONS options)
 {
   struct GNUNET_CHAT_gui_chat_client *client = cls;
-  GtkWidget *chattextviewer;
-  GList *children;
   struct GNUNET_CHAT_safe_write_struct writearg;
-
-  children = gtk_container_get_children (GTK_CONTAINER (client->chatFrame));
-  chattextviewer =
-    g_list_nth_data ((gtk_container_get_children
-                      (GTK_CONTAINER
-                       (g_list_nth_data
-                        (gtk_container_get_children
-                         (GTK_CONTAINER (children->data)), 0)))), 0);
-
-  writearg.chatWindow = chattextviewer;
+  char * sndr;
+  
+  sndr = sender == NULL ? _("anonymous") : GNUNET_PSEUDO_id_to_name(chat_ectx, 
chat_cfg, sender);  
+  writearg.text_view = client->text_view;
   writearg.message = message;
-  writearg.sender = sender;
+  writearg.sender = sndr;
   GNUNET_GTK_save_call (&write_save_call, &writearg);
-
-  /*Write the message to the appropriate room... 
-   * Somehow G wants me to do this without knowing which room it's headed to, 
but I don't see how...
-   * perhaps with the closure argument...*/
-
-
+  GNUNET_free_non_null(sndr);
   return GNUNET_OK;
 }
 
@@ -234,88 +213,144 @@
                      GNUNET_CHAT_MSG_OPTIONS opt)
 {
   struct GNUNET_CHAT_gui_chat_client *client = cls;
-  GtkWidget *chatnicklist;
-#if 0
   struct GNUNET_CHAT_safe_nick_write_struct writearg;
-#endif
-  chatnicklist =
-    g_list_nth_data (gtk_container_get_children
-                     (GTK_CONTAINER (client->chatFrame)), 1);
-  chatnicklist =
-    g_list_nth_data (gtk_container_get_children
-                     (GTK_CONTAINER (chatnicklist)), 0);
-#if 0
-  /* chatnicklist is the GtkTextView object */
-  writearg.nick = member_info;
-  writearg.nickList = chatnicklist;
+  char *nick;
 
-  if (is_joining)
-    GNUNET_GTK_save_call (&write_nick_save_call, &writearg);
+  GNUNET_hash(pkey,
+             sizeof(GNUNET_RSA_PublicKey),
+             &writearg.pid);
+  nick = GNUNET_PSEUDO_id_to_name(chat_ectx,
+                                 chat_cfg,
+                                 &writearg.pid);
+  writearg.model = client->nick_model;
+  /* FIXME: set icon if pid == ours */
+  writearg.icon = NULL;
+  writearg.meta = member_info;
+  writearg.nick = nick;
+  if (member_info != NULL)
+    GNUNET_GTK_save_call (&add_nick_save_call, &writearg);
   else
     GNUNET_GTK_save_call (&remove_nick_save_call, &writearg);
-#endif
+  GNUNET_free(nick);
   return GNUNET_OK;
 }
 
 void
-init_chat (struct GNUNET_GE_Context *ectx,
-           struct GNUNET_GC_Configuration *cfg)
+on_chat_frame_send_button_click_event_chat (GtkWidget * widget, gpointer data)
 {
-  GtkWidget *tab;
+  GtkWidget *chatnotebook;
+  unsigned int seq;
+  const char *message;
+  struct GNUNET_CHAT_gui_chat_client *pos;
 
-  chat_ectx = ectx;
-  chat_cfg = cfg;
-  room_member_list = NULL;
+  chatnotebook = gtk_widget_get_ancestor (widget, GTK_TYPE_NOTEBOOK);
+  GNUNET_mutex_lock(lock);
+  pos = list;
+  while ( (pos != NULL) &&
+         (pos->chatFrame != chatnotebook) )
+    pos = pos->next;
+  GNUNET_GE_ASSERT(NULL, pos != NULL);
+  
+  message = (const char *) gtk_entry_get_text (GTK_ENTRY(pos->chat_entry));
+  GNUNET_CHAT_send_message (pos->room, 
+                           message,
+                            GNUNET_CHAT_MSG_OPTION_NONE, 
+                           NULL, &seq);
+  gtk_entry_set_text (GTK_ENTRY(pos->chat_entry), "");
+}
 
+/** FIXME: move to gtkcommon! */
+static GtkWidget *
+extractMainWidgetFromWindow (GladeXML * xml, const char *windowName)
+{
+  GtkContainer *window;
+  GtkWidget *ret;
 
-  /*priv_key = GNUNET_RSA_create_key ();
-     GNUNET_RSA_get_public_key (priv_key, &pub_key); */
-
-  sock = GNUNET_client_connection_create (chat_ectx, chat_cfg);
-  lock = GNUNET_mutex_create (GNUNET_NO);
-  cron = GNUNET_GTK_get_cron_manager ();
-
-  tab =
-    glade_xml_get_widget (GNUNET_GTK_get_main_glade_XML (),
-                          "chatnotebookvbox");
-
-  gtk_widget_show (tab);
+  window = GTK_CONTAINER (glade_xml_get_widget (xml, windowName));
+  ret = gtk_bin_get_child (GTK_BIN (window));
+  gtk_widget_ref (ret);
+  gtk_container_remove (window, ret);
+  gtk_widget_destroy (GTK_WIDGET (window));
+  return ret;
 }
 
-static int
-create_chat_room_tab (char *room_name, char *nick)
+static void
+create_chat_room_tab (const char *room_name, 
+                     const char *nick)
 {
-  GladeXML *chatXML;
-  GtkWidget *newChatWindow;
-  GtkWidget *chatnotebook;
   GtkWidget *chatLabel;
-  struct GNUNET_CHAT_Room *chatRoom;
+  GtkWidget *chatnotebook;
+  GtkTreeView *treeview;
   struct GNUNET_CHAT_gui_chat_client *client;
-  struct GNUNET_CHAT_gui_chat_client *pos;
   struct GNUNET_ECRS_MetaData * meta;
-  GNUNET_HashCode me;
-
+  GtkCellRenderer *renderer;
+  GtkTreeViewColumn *column;
+  int col;
+ 
   chatnotebook =
     glade_xml_get_widget (GNUNET_GTK_get_main_glade_XML (), "chatnotebook");
-  chatXML =
-    glade_xml_new (GNUNET_GTK_get_glade_filename (), "chatFrame",
-                   PACKAGE_NAME);
-  GNUNET_GTK_connect_glade_with_plugins (chatXML);
-  newChatWindow = extractMainWidgetFromWindow (chatXML, "chatFrame");
 
+  client = GNUNET_malloc (sizeof (struct GNUNET_CHAT_gui_chat_client));
+  client->chatXML =
+    glade_xml_new (GNUNET_GTK_get_glade_filename (),
+                  "chatFrame",
+                   PACKAGE_NAME);
+  GNUNET_GTK_connect_glade_with_plugins (client->chatXML);
+  client->chatFrame = extractMainWidgetFromWindow (client->chatXML,
+                                                  "chatFrame");
   chatLabel = gtk_label_new (room_name);
-  gtk_notebook_insert_page (GTK_NOTEBOOK (chatnotebook), newChatWindow,
+  gtk_notebook_insert_page (GTK_NOTEBOOK (chatnotebook), 
+                           client->chatFrame,
                             chatLabel, 1);
+  gtk_widget_show (client->chatFrame);
+  gtk_widget_show (chatLabel);
 
-  gtk_widget_show (chatnotebook);
+  client->nick_model = gtk_list_store_new (CHAT_NUM,
+                                          G_TYPE_STRING,       /* nickname */
+                                          G_TYPE_POINTER,      /* metadata */
+                                          GDK_TYPE_PIXBUF,     /* icon */
+                                          G_TYPE_POINTER);      /* pid */
+  client->text_view = glade_xml_get_widget (client->chatXML, "chatLogViewer");
+  client->chat_entry = glade_xml_get_widget (client->chatXML, 
"chatLineTextEntry");
+  treeview = GTK_TREE_VIEW(glade_xml_get_widget (client->chatXML, 
"roomMembersTreeView"));
+  gtk_tree_view_set_model (treeview, GTK_TREE_MODEL (list->nick_model));
 
-  client = GNUNET_malloc (sizeof (struct GNUNET_CHAT_gui_chat_client));
-  client->room_name = GNUNET_malloc (strlen (room_name));
-  strcpy (client->room_name, room_name);
+  renderer = gtk_cell_renderer_text_new ();
+  col = gtk_tree_view_insert_column_with_attributes (treeview,
+                                                     -1,
+                                                     _("Nickname"),
+                                                     renderer,
+                                                     "text", CHAT_NICKNAME,
+                                                     NULL);
+  column = gtk_tree_view_get_column (treeview, col - 1);
+  gtk_tree_view_column_set_resizable (column, TRUE);
+  gtk_tree_view_column_set_clickable (column, TRUE);
+  gtk_tree_view_column_set_reorderable (column, TRUE);
+  gtk_tree_view_column_set_sort_column_id (column, CHAT_NICKNAME);
+  gtk_tree_view_column_set_min_width (column, 0);
+  
+  renderer = gtk_cell_renderer_pixbuf_new ();
+  col = gtk_tree_view_insert_column_with_attributes (treeview,
+                                                     -1,
+                                                     "",
+                                                     renderer,
+                                                     "pixbuf", CHAT_ICON,
+                                                     NULL);
+  column = gtk_tree_view_get_column (treeview, col - 1);
+  gtk_tree_view_column_set_resizable (column, TRUE);
+  gtk_tree_view_column_set_clickable (column, FALSE);
+  gtk_tree_view_column_set_reorderable (column, FALSE);
 
-  /* We do a silly strdup later on member_info... either check for NULL or 
only pass "" for member_info!! */
+  GNUNET_mutex_lock(lock);
+  client->next = list;
+  list = client;
+  GNUNET_mutex_unlock(lock);
+
   meta = GNUNET_ECRS_meta_data_create();
-  chatRoom =
+  GNUNET_ECRS_meta_data_insert(meta,
+                              EXTRACTOR_TITLE,
+                              nick);
+  client->room =
     GNUNET_CHAT_join_room (chat_ectx, chat_cfg, nick,
                           meta,
                           room_name,
@@ -323,37 +358,17 @@
                            &receive_callback, client, &member_list_callback,
                            client,
                           NULL, NULL,
-                          &me);
+                          &client->mypid);
   GNUNET_ECRS_meta_data_destroy(meta);
-  client->room = chatRoom;
-  client->chatFrame = newChatWindow;
-  client->number =
-    gtk_notebook_get_current_page (GTK_NOTEBOOK (chatnotebook));
-
-  if (list == NULL)
-    list = client;
-  else
-    {
-      pos = list;
-      while (pos->next != NULL)
-        {
-          pos = pos->next;
-        }
-      pos->next = client;
-    }
-
-  return GNUNET_OK;
 }
 
-
-
 void
 on_chat_room_name_button_click_event_chat (GtkWidget * widget, gpointer data)
 {
   GtkEntry *room_entry;
   GtkEntry *nick_entry;
-  char *room_text;
-  char *nick_text;
+  const char *room_text;
+  const char *nick_text;
 
   room_entry =
     GTK_ENTRY (glade_xml_get_widget
@@ -361,80 +376,26 @@
   nick_entry =
     GTK_ENTRY (glade_xml_get_widget
                (GNUNET_GTK_get_main_glade_XML (), "chatRoomMonikerEntry"));
-
-  room_text = (char *) gtk_entry_get_text (room_entry);
-  nick_text = (char *) gtk_entry_get_text (nick_entry);
-
+  room_text = (const char *) gtk_entry_get_text (room_entry);
+  nick_text = (const char *) gtk_entry_get_text (nick_entry);
   create_chat_room_tab (room_text, nick_text);
-
   gtk_entry_set_text (nick_entry, "");
   gtk_entry_set_text (room_entry, "");
 }
 
 void
-on_chat_frame_send_button_click_event_chat (GtkWidget * widget, gpointer data)
+init_chat (struct GNUNET_GE_Context *ectx,
+           struct GNUNET_GC_Configuration *cfg)
 {
-  GtkWidget *chatnotebook;
-  GtkWidget *chathbox;
-  GtkWidget *chatlabel;
-  GtkWidget *curr_page;
-  GList *children;
-  GtkEntry *chat_entry;
-  unsigned int seq;
-  char *message;
-  const gchar *room_name;
-  struct GNUNET_CHAT_gui_chat_client *client;
-  struct GNUNET_CHAT_gui_chat_client *pos;
+  GtkWidget *tab;
 
-  chatnotebook = gtk_widget_get_ancestor (widget, GTK_TYPE_NOTEBOOK);
-  curr_page =
-    gtk_notebook_get_nth_page (GTK_NOTEBOOK (chatnotebook),
-                               gtk_notebook_get_current_page (GTK_NOTEBOOK
-                                                              (chatnotebook)));
-  chatlabel =
-    gtk_notebook_get_tab_label (GTK_NOTEBOOK (chatnotebook), curr_page);
-
-  room_name = gtk_label_get_text (GTK_LABEL (chatlabel));
-
-  chathbox = gtk_widget_get_ancestor (widget, GTK_TYPE_HBOX);
-  children = gtk_container_get_children (GTK_CONTAINER (chathbox));
-
-  chat_entry = NULL;
-  while (children != NULL)
-    {
-      if (strcmp (gtk_widget_get_name (children->data), "chatLineTextEntry")
-          == 0)
-        {
-          chat_entry = GTK_ENTRY (children->data);
-        }
-      children = children->next;
-    }
-
-  message = (char *) gtk_entry_get_text (chat_entry);
-
-  /* Almost there... need to find room in linked list (provided it exists!) 
-   * before sending out the message...
-   */
-  if (list == NULL)
-    return;
-  else
-    {
-      pos = list;
-      while ((pos != NULL) && (strcmp (pos->room_name, room_name) != 0))
-        {
-          pos = pos->next;
-        }
-    }
-  if (pos != NULL)
-    client = pos;
-  else
-    return;
-
-  GNUNET_CHAT_send_message (client->room, message,
-                            GNUNET_CHAT_MSG_OPTION_NONE, NULL, &seq);
-
-  gtk_entry_set_text (chat_entry, "");
-
+  chat_ectx = ectx;
+  chat_cfg = cfg;
+  lock = GNUNET_mutex_create (GNUNET_NO);
+  tab =
+    glade_xml_get_widget (GNUNET_GTK_get_main_glade_XML (),
+                          "chatnotebookvbox");
+  gtk_widget_show (tab);
 }
 
 /* end of chat.c */





reply via email to

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