[Top][All Lists]
[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 */
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r6984 - gnunet-gtk/src/plugins/chat,
gnunet <=