gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r6383 - GNUnet/src/applications/chat


From: gnunet
Subject: [GNUnet-SVN] r6383 - GNUnet/src/applications/chat
Date: Tue, 19 Feb 2008 16:12:25 -0700 (MST)

Author: nevans
Date: 2008-02-19 16:12:25 -0700 (Tue, 19 Feb 2008)
New Revision: 6383

Modified:
   GNUnet/src/applications/chat/clientapi.c
Log:


Modified: GNUnet/src/applications/chat/clientapi.c
===================================================================
--- GNUnet/src/applications/chat/clientapi.c    2008-02-19 21:06:41 UTC (rev 
6382)
+++ GNUnet/src/applications/chat/clientapi.c    2008-02-19 23:12:25 UTC (rev 
6383)
@@ -30,6 +30,7 @@
 #include "gnunet_chat_lib.h"
 #include "chat.h"
 
+#define MAX_RETRIES 5
 /**
  * Handle for a (joined) chat room.
  */
@@ -71,6 +72,86 @@
 }
 
 /**
+ * Listen for incoming messages on this chat room.  When received, call the 
client callback.
+ * Also, support servers going away/coming back (i.e. rejoin chat room to keep 
server state up to date)... 
+ */
+static void *
+poll_thread (void *rcls)
+{
+       int ret = GNUNET_OK;
+  struct GNUNET_CHAT_Room *room = (struct GNUNET_CHAT_Room *)rcls;
+  GNUNET_MessageHeader *reply;
+       
+       CS_chat_MESSAGE *received_msg;
+  
+  unsigned int size;
+  unsigned int nick_len;
+  unsigned int msg_len;
+  unsigned int room_name_len;
+  unsigned int retries;
+  
+  char *nick;
+  char *message_content;
+  char *room_name;
+     
+  while(ret == GNUNET_OK)
+  {
+       GNUNET_client_connection_test_connected (room->sock);
+       fprintf(stderr,"Polling...\n");
+       if (GNUNET_client_connection_test_connected (room->sock) == GNUNET_NO)
+       {
+               
+               retries = 0;
+               while((GNUNET_client_connection_test_connected (room->sock) == 
GNUNET_NO) && (retries < MAX_RETRIES))
+               {
+                       
+               }
+       }
+       fprintf(stderr,"Client is connected\n");
+       
+       reply = NULL;
+       
+               if (GNUNET_OK != GNUNET_client_connection_read (room->sock, 
&reply))
+               {
+      fprintf(stderr,"Read failed\n");
+      break;
+               }
+    fprintf(stderr,"Read sucessful\n");  
+    
+    if ((reply->size < ntohs(sizeof (GNUNET_MessageHeader) + sizeof 
(CS_chat_MESSAGE)))||(reply->type != ntohs (GNUNET_CS_PROTO_CHAT_MSG)))
+       break;
+       
+               fprintf(stderr,"Received a callback??\n");
+               size = ntohs(reply->size);
+               
+               received_msg = (CS_chat_MESSAGE *)reply;
+               
+               nick_len = ntohl (received_msg->nick_len);
+               msg_len = ntohl (received_msg->msg_len);
+               room_name_len = ntohl (received_msg->room_name_len);
+               
+               nick = GNUNET_malloc (nick_len + 1);
+               message_content = GNUNET_malloc (msg_len + 1);
+               room_name = GNUNET_malloc (room_name_len + 1);
+               
+               memcpy (nick, &received_msg->nick[0], nick_len);
+               memcpy (message_content, &received_msg->nick[nick_len], 
msg_len);
+               memcpy (room_name, &received_msg->nick[nick_len + msg_len], 
room_name_len);
+               
+               nick[nick_len] = '\0';
+               message_content[msg_len] = '\0';
+               room_name[room_name_len] = '\0';
+               
+               if(GNUNET_OK != 
room->callback(room->callback_cls,room,nick,message_content,GNUNET_get_time(),0))
+               {
+                       ret = GNUNET_SYSERR;
+               }
+       
+       }    
+
+  return (void *)ret;
+}
+/**
  * List all of the (publically visible) chat rooms.
  * @return number of rooms on success, GNUNET_SYSERR if iterator aborted
  */
@@ -180,11 +261,14 @@
   chat_room->sock = sock;
 
   // create pthread
+  chat_room->listen_thread = GNUNET_thread_create (&poll_thread, &chat_room, 
1024 * 2);
 
   // return room struct
   if (ret != GNUNET_OK)
+  {
+    GNUNET_free(chat_room);
     return NULL;
-
+  }
   return chat_room;
 }
 
@@ -194,6 +278,15 @@
 void
 GNUNET_CHAT_leave_room (struct GNUNET_CHAT_Room *chat_room)
 {
+       GNUNET_MessageHeader csHdr;
+       csHdr.type = htons(GNUNET_CS_PROTO_CHAT_LEAVE_MSG);
+       csHdr.size = htons(sizeof(csHdr));
+               
+  /*If this fails we don't care, this means the socket is already gone and the 
server should know how to deal with that!*/
+  /*We may not even need this message at all, just let the server handle a 
dead socket*/
+  GNUNET_GE_ASSERT(NULL,GNUNET_client_connection_write (chat_room->sock, 
&csHdr) == GNUNET_OK);
+  
+  
   // stop thread
   // join thread
   // free room struct





reply via email to

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