[Top][All Lists]
[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);
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r6587 - GNUnet/src/applications/chat,
gnunet <=