gnunet-svn
[Top][All Lists]
Advanced

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

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


From: gnunet
Subject: [GNUnet-SVN] r6587 - GNUnet/src/applications/chat
Date: Fri, 21 Mar 2008 16:55:32 -0600 (MDT)

Author: nevans
Date: 2008-03-21 16:55:32 -0600 (Fri, 21 Mar 2008)
New Revision: 6587

Modified:
   GNUnet/src/applications/chat/chat.c
   GNUnet/src/applications/chat/chat.h
   GNUnet/src/applications/chat/clientapi.c
   GNUnet/src/applications/chat/gnunet-chat.c
Log:


Modified: GNUnet/src/applications/chat/chat.c
===================================================================
--- GNUnet/src/applications/chat/chat.c 2008-03-21 22:55:17 UTC (rev 6586)
+++ GNUnet/src/applications/chat/chat.c 2008-03-21 22:55:32 UTC (rev 6587)
@@ -33,6 +33,8 @@
 #include "gnunet_core.h"
 #include "chat.h"
 
+static int shutdown_flag;
+
 static GNUNET_CoreAPIForPlugins *coreAPI;
 
 static struct GNUNET_Mutex *chatMutex;
@@ -45,11 +47,55 @@
   struct GNUNET_CS_chat_client *next;
   struct GNUNET_CS_chat_client *prev;
   GNUNET_HashCode room_name_hash;
+  char *nick;
 
 };
 
 static struct GNUNET_CS_chat_client *client_list_head;
 
+/* Thread that tells clients about chat room members
+ */
+static void *
+update_client_thread (void *cls)
+{
+       struct GNUNET_CS_chat_client *pos;
+       struct GNUNET_CS_chat_client *compare_pos;
+       CS_chat_ROOM_MEMBER_MESSAGE *message;
+       int message_size;
+       
+       while(shutdown_flag != GNUNET_YES)
+       {
+               fprintf(stderr,"Checking room members\n");
+               pos = client_list_head;
+               compare_pos = client_list_head;
+               while(pos != NULL)
+               {
+                       while(compare_pos != NULL)
+                       {
+                               
if(memcmp(&pos->room_name_hash,&compare_pos->room_name_hash,sizeof(GNUNET_HashCode))
 == 0)
+                               {
+                                       /*Send nick to this client, so it knows 
who is in the same room! (Including itself...)*/
+                                       fprintf(stderr,"Found matching member 
%s length is %d\n",compare_pos->nick,strlen(compare_pos->nick));
+                                       
+                                       message_size = 
sizeof(CS_chat_ROOM_MEMBER_MESSAGE) + strlen(compare_pos->nick);
+                                       message = GNUNET_malloc(message_size);
+                                       message->header.size = 
htons(message_size);
+                                       message->header.type = 
htons(GNUNET_CS_PROTO_CHAT_ROOM_MEMBER_MESSAGE);
+                                       message->nick_len = 
htons(strlen(compare_pos->nick));
+                                       
memcpy(&message->nick[0],compare_pos->nick,strlen(compare_pos->nick));          
                        
+                                       
+                                       coreAPI->cs_send_to_client 
(pos->client,&message->header,GNUNET_YES);
+                               }
+                               compare_pos = compare_pos->next;
+                       }                       
+                       pos = pos->next;
+               }               
+               if(shutdown_flag == GNUNET_NO)
+                       GNUNET_thread_sleep(30 * GNUNET_CRON_SECONDS);
+       }
+       return NULL;
+}
+
 static int
 csHandleChatMSG (struct GNUNET_ClientHandle *client,
                  const GNUNET_MessageHeader * message)
@@ -228,8 +274,11 @@
     client_list_head->prev = tempClient;
   client_list_head = tempClient;
   tempClient->client = client;
+  tempClient->nick = GNUNET_malloc(nick_len + 1);
   memcpy (&tempClient->room_name_hash, &room_name_hash,
           sizeof (GNUNET_HashCode));
+  memcpy (tempClient->nick, nick,nick_len + 1);
+  
   tempCount = 0;
 
   while (tempClient != NULL)
@@ -255,18 +304,25 @@
 chatClientExitHandler (struct GNUNET_ClientHandle *client)
 {
   int tempCount;
+  int message_size;
+  int found;
   struct GNUNET_CS_chat_client *tempClient;
   struct GNUNET_CS_chat_client *pos;
   struct GNUNET_CS_chat_client *prev;
+  char *nick_to_remove;
+  CS_chat_ROOM_MEMBER_MESSAGE *message;
 
   GNUNET_GE_LOG (ectx,
                  GNUNET_GE_DEBUG | GNUNET_GE_REQUEST | GNUNET_GE_DEVELOPER,
                  "Received leave chat room message from client.\n");
 
   GNUNET_mutex_lock (chatMutex);
-
+  
+  
   pos = client_list_head;
   prev = NULL;
+  found = GNUNET_NO;
+  nick_to_remove = NULL;
   while ((pos != NULL) && (pos->client != client))
     {
       prev = pos;
@@ -274,6 +330,9 @@
     }
   if (pos != NULL)
     {
+       found = GNUNET_YES;
+       nick_to_remove = GNUNET_malloc(strlen(pos->nick));
+               strcpy(nick_to_remove,pos->nick);
       if (prev == NULL)
         client_list_head = pos->next;
       else
@@ -293,27 +352,42 @@
     }
   fprintf (stderr, "Number of clients currently is... %d\n", tempCount);
   /*End of client count code */
-
+  
+  /*Send remove member message here*/
+       if(found == GNUNET_YES)
+       {
+               message_size = sizeof(CS_chat_ROOM_MEMBER_MESSAGE) + 
strlen(nick_to_remove);
+               message = GNUNET_malloc(message_size);
+               message->header.size = htons(message_size);
+               message->header.type = 
htons(GNUNET_CS_PROTO_CHAT_ROOM_MEMBER_LEAVE_MESSAGE);
+               message->nick_len = htons(strlen(nick_to_remove));
+               
memcpy(&message->nick[0],nick_to_remove,strlen(nick_to_remove));                
                        
+               
+               pos = client_list_head;
+         while (pos != NULL)
+           {
+                       coreAPI->cs_send_to_client 
(pos->client,&message->header,GNUNET_YES);    
+             pos = pos->next;
+           }
+               
+               GNUNET_free(message);
+         GNUNET_free(nick_to_remove);
+         
+       }
   GNUNET_mutex_unlock (chatMutex);
   return;
 }
 
-static int
-csHandleChatRoomMemberRequest (struct GNUNET_ClientHandle *client,
-                 const GNUNET_MessageHeader * message)
-{
-       
-}
-
-
 int
 initialize_module_chat (GNUNET_CoreAPIForPlugins * capi)
 {
   int ok = GNUNET_OK;
+  shutdown_flag = GNUNET_NO;
 
   chatMutex = GNUNET_mutex_create (GNUNET_NO);
 
   coreAPI = capi;
+  GNUNET_thread_create(&update_client_thread,NULL,1024 * 128); /* What's a 
good stack size? */
   GNUNET_GE_LOG (ectx, GNUNET_GE_DEBUG | GNUNET_GE_REQUEST | GNUNET_GE_USER,
                  _("`%s' registering handlers %d and %d\n"),
                  "chat", GNUNET_P2P_PROTO_CHAT_MSG, GNUNET_CS_PROTO_CHAT_MSG);
@@ -347,6 +421,7 @@
 void
 done_module_chat ()
 {
+       shutdown_flag = GNUNET_YES;
   /*coreAPI->unregisterHandler (GNUNET_P2P_PROTO_CHAT_MSG, &handleChatMSG); */
   coreAPI->cs_exit_handler_unregister (&chatClientExitHandler);
   coreAPI->unregisterClientHandler (GNUNET_CS_PROTO_CHAT_MSG,

Modified: GNUnet/src/applications/chat/chat.h
===================================================================
--- GNUnet/src/applications/chat/chat.h 2008-03-21 22:55:17 UTC (rev 6586)
+++ GNUnet/src/applications/chat/chat.h 2008-03-21 22:55:32 UTC (rev 6587)
@@ -86,12 +86,16 @@
   GNUNET_CHAT_MessageCallback callback;
   
   GNUNET_CHAT_MemberListCallback member_list_callback;
+  
+  GNUNET_CHAT_MemberRemoveCallback member_remove_callback;
 
   int shutdown_flag;
 
   void *callback_cls;
 
   void *member_list_callback_cls;
+  
+  void *member_remove_callback_cls;
 
 };
 

Modified: GNUnet/src/applications/chat/clientapi.c
===================================================================
--- GNUnet/src/applications/chat/clientapi.c    2008-03-21 22:55:17 UTC (rev 
6586)
+++ GNUnet/src/applications/chat/clientapi.c    2008-03-21 22:55:32 UTC (rev 
6587)
@@ -33,7 +33,7 @@
 
 /**
  * Listen for incoming messages on this chat room.  When received,
- * call the client callback.  Also, support servers going away/coming
+ * call the proper client callback.  Also, support servers going away/coming
  * back (i.e. rejoin chat room to keep server state up to date)...
  */
 static void *
@@ -42,6 +42,7 @@
   struct GNUNET_CHAT_Room *room = rcls;
   GNUNET_MessageHeader *reply;
   CS_chat_MESSAGE *received_msg;
+  CS_chat_ROOM_MEMBER_MESSAGE *received_room_member_msg;
   unsigned int size;
   unsigned int nick_len;
   unsigned int msg_len;
@@ -77,40 +78,73 @@
           continue;
         }
 
-      if ((reply->size <
-           ntohs (sizeof (CS_chat_MESSAGE)))
-          || (reply->type != ntohs (GNUNET_CS_PROTO_CHAT_MSG)))
+      if (((reply->size < ntohs (sizeof (CS_chat_MESSAGE)))
+          || (reply->type != ntohs (GNUNET_CS_PROTO_CHAT_MSG))) && 
((reply->size < ntohs (sizeof (CS_chat_ROOM_MEMBER_MESSAGE)))
+          || (reply->type != ntohs 
(GNUNET_CS_PROTO_CHAT_ROOM_MEMBER_MESSAGE)))) 
         {
           GNUNET_GE_BREAK (NULL, 0);
           GNUNET_client_connection_close_temporarily (room->sock);
           disconnected = GNUNET_YES;
           continue;
         }
-      size = ntohs (reply->size);
-      received_msg = (CS_chat_MESSAGE *) reply;
-      nick_len = ntohs (received_msg->nick_len);
-      msg_len = ntohs (received_msg->msg_len);
-      /* NO NEED TO SEND ROOM! */
-      room_name_len = size - nick_len - msg_len - sizeof (CS_chat_MESSAGE);
-      if (size < (nick_len + msg_len + room_name_len))
-        {
-          GNUNET_GE_BREAK (NULL, 0);
-          GNUNET_client_connection_close_temporarily (room->sock);
-         disconnected = GNUNET_YES;
-         continue;
-        }
-      nick = GNUNET_malloc (nick_len + 1);
-      memcpy (nick, &received_msg->nick[0], nick_len);
-      nick[nick_len] = '\0';
-      message_content = GNUNET_malloc (msg_len + 1);
-      memcpy (message_content, &received_msg->nick[nick_len], msg_len);
-      message_content[msg_len] = '\0';
-      if (GNUNET_OK !=
-          room->callback (room->callback_cls, room, nick, message_content,
-                          GNUNET_get_time (), 0))
-       ret = GNUNET_SYSERR;
+      if (reply->type == ntohs (GNUNET_CS_PROTO_CHAT_ROOM_MEMBER_MESSAGE))
+      {
+       size = ntohs (reply->size);
+             received_room_member_msg = (CS_chat_ROOM_MEMBER_MESSAGE *) reply;
+             nick_len = ntohs (received_room_member_msg->nick_len);
+                  
+             if (size < nick_len)
+               {
+                 GNUNET_GE_BREAK (NULL, 0);
+                 GNUNET_client_connection_close_temporarily (room->sock);
+                                       disconnected = GNUNET_YES;
+                                       continue;
+               }
+             nick = GNUNET_malloc (nick_len + 1);
+             memcpy (nick, &received_room_member_msg->nick[0], nick_len);
+             nick[nick_len] = '\0';
+             
+             if (GNUNET_OK != room->member_list_callback 
(room->member_list_callback_cls, nick, GNUNET_get_time ()))
+               {
+                                               GNUNET_GE_BREAK (NULL, 0);
+                 GNUNET_client_connection_close_temporarily (room->sock);
+                                       disconnected = GNUNET_YES;
+                                       continue;
+               }
+      }
+      else
+      {
+             size = ntohs (reply->size);
+             received_msg = (CS_chat_MESSAGE *) reply;
+             nick_len = ntohs (received_msg->nick_len);
+             msg_len = ntohs (received_msg->msg_len);
+             /* NO NEED TO SEND ROOM! */
+             room_name_len = size - nick_len - msg_len - sizeof 
(CS_chat_MESSAGE);
+             if (size < (nick_len + msg_len + room_name_len))
+               {
+                 GNUNET_GE_BREAK (NULL, 0);
+                 GNUNET_client_connection_close_temporarily (room->sock);
+                                       disconnected = GNUNET_YES;
+                                       continue;
+               }
+             nick = GNUNET_malloc (nick_len + 1);
+             memcpy (nick, &received_msg->nick[0], nick_len);
+             nick[nick_len] = '\0';
+             message_content = GNUNET_malloc (msg_len + 1);
+             memcpy (message_content, &received_msg->nick[nick_len], msg_len);
+             message_content[msg_len] = '\0';
+             if (GNUNET_OK !=
+                 room->callback (room->callback_cls, room, nick, 
message_content,
+                                 GNUNET_get_time (), 0))
+               {
+                                               GNUNET_GE_BREAK (NULL, 0);
+                 GNUNET_client_connection_close_temporarily (room->sock);
+                                       disconnected = GNUNET_YES;
+                                       continue;
+               }
+       GNUNET_free(message_content);
+      }
       GNUNET_free(nick);
-      GNUNET_free(message_content);
     }
   return NULL;
 }
@@ -147,7 +181,8 @@
                        const struct GNUNET_RSA_PrivateKey *key,
                        const char *memberInfo,
                        GNUNET_CHAT_MessageCallback callback, void *cls,
-                       GNUNET_CHAT_MemberListCallback memberCallback,void 
*membercls)
+                       GNUNET_CHAT_MemberListCallback memberCallback,void 
*membercls,
+                       GNUNET_CHAT_MemberRemoveCallback removeCallback,void 
*removecls)
 {
   CS_chat_JOIN_MESSAGE *join_msg;
   GNUNET_HashCode hash_of_me;
@@ -199,6 +234,8 @@
   chat_room->callback_cls = cls;
   chat_room->member_list_callback = memberCallback;
   chat_room->member_list_callback_cls = membercls;
+  chat_room->member_remove_callback = removeCallback;
+  chat_room->member_remove_callback_cls = removecls;
   chat_room->ectx = ectx;
   chat_room->cfg = cfg;
   chat_room->memberInfo = GNUNET_strdup(memberInfo);

Modified: GNUnet/src/applications/chat/gnunet-chat.c
===================================================================
--- GNUnet/src/applications/chat/gnunet-chat.c  2008-03-21 22:55:17 UTC (rev 
6586)
+++ GNUnet/src/applications/chat/gnunet-chat.c  2008-03-21 22:55:32 UTC (rev 
6587)
@@ -94,6 +94,12 @@
   return GNUNET_OK;
 }
 
+static int
+member_remove_callback (void *cls,const char *senderNick, GNUNET_CronTime 
timestamp)
+{
+  return GNUNET_OK;
+}
+
 /**
  * Message delivery confirmations.
  *
@@ -157,7 +163,7 @@
                                 cfg,
                                 nickname, room_name,
                                 &my_pub, my_priv, "", &receive_callback,
-                                NULL,&member_list_callback,NULL);
+                                
NULL,&member_list_callback,NULL,&member_remove_callback,NULL);
   if (room == NULL)
     {
       fprintf (stderr, _("Failed to join room `%s'\n"), room_name);





reply via email to

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