Author: nevans Date: 2008-02-13 14:33:40 -0700 (Wed, 13 Feb 2008) New Revision: 6285
Modified: GNUnet/src/applications/chat/chat.c Log: Modified: GNUnet/src/applications/chat/chat.c =================================================================== --- GNUnet/src/applications/chat/chat.c 2008-02-13 21:33:01 UTC (rev 6284) +++ GNUnet/src/applications/chat/chat.c 2008-02-13 21:33:40 UTC (rev 6285) @@ -38,7 +38,7 @@ #define MAX_CLIENTS 4 static struct GNUNET_ClientHandle **clients; -static int clientCount; +static unsigned int clientCount; static struct GNUNET_HashCode **lastMsgs; static int ringIndex; static struct GNUNET_Mutex *chatMutex; @@ -79,7 +79,7 @@ } static int -handleChatMSG (const GNUNET_PeerIdentity * sender, +csHandleChatMSG (struct GNUNET_ClientHandle *client, const GNUNET_MessageHeader * message) { int i; @@ -87,47 +87,49 @@ CS_chat_MESSAGE *cmsg; GNUNET_HashCode hc; - + char *nick; char *message_content; char *room_name; - + int header_size; unsigned long nick_len; unsigned long msg_len; - unsigned long room_size; + unsigned long room_name_len; cmsg = (CS_chat_MESSAGE *) message; - if (ntohs (message->size) < sizeof (CS_chat_MESSAGE)) + if (ntohs (cmsg->header.size) < sizeof (CS_chat_MESSAGE)) { GNUNET_GE_LOG (ectx, GNUNET_GE_WARNING | GNUNET_GE_BULK | GNUNET_GE_USER, _("Message received from client is invalid\n")); - return GNUNET_SYSERR; /* invalid message */ - + return GNUNET_SYSERR; /* invalid message */ + } + - - header_size = ntohs (cmsg->header.size); - nick_len = ntohl (cmsg->nick_len); - msg_len = ntohl (cmsg->msg_len); - room_size = ntohl (cmsg->nick_len); - - nick = GNUNET_malloc (nick_len + 1); - message_content = GNUNET_malloc (msg_len + 1); - room_name = GNUNET_malloc (room_size + 1); - - memcpy (nick, &cmsg->nick[0], nick_len); - memcpy (message_content, &cmsg->nick[sizeof (nick)], msg_len); - memcpy (room_name, &cmsg->nick[sizeof (nick) + sizeof (message_content)], - msg_len); - - nick[nick_len] = '\0'; + header_size = ntohs(cmsg->header.size); + nick_len = ntohl(cmsg->nick_len); + msg_len = ntohl(cmsg->msg_len); + room_name_len = ntohl(cmsg->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,&cmsg->nick[0],nick_len); + memcpy(message_content,&cmsg->nick[nick_len],msg_len); + memcpy(room_name,&cmsg->nick[nick_len+msg_len],room_name_len); + + nick[nick_len] = '\0'; message_content[msg_len] = '\0'; - room_name[room_size] = '\0'; - - + room_name[room_name_len] = '\0'; + + GNUNET_GE_LOG (ectx, + GNUNET_GE_WARNING | GNUNET_GE_BULK | GNUNET_GE_USER, + "Received chat message from client.\n Message is %s\n from %s\n intended for room %s\n",message_content,nick,room_name); + GNUNET_hash (cmsg, header_size, &hc); /* check if we have seen this message already */ @@ -144,10 +146,10 @@ broadcastToConnected (message, 5, 1); cmsg->header.type = htons (GNUNET_CS_PROTO_CHAT_MSG); for (j = 0; j < clientCount; j++) - coreAPI->cs_send_to_client (clients[j], &cmsg->header, GNUNET_YES); + coreAPI->cs_send_to_client (clients[j], &cmsg->header,GNUNET_YES); /*pmsg->nick[CHAT_NICK_LENGTH - 1] = '\0'; - pmsg->message[CHAT_MSG_LENGTH - 1] = '\0'; */ - + pmsg->message[CHAT_MSG_LENGTH - 1] = '\0';*/ + /* GNUNET_GE_LOG(ectx, GNUNET_GE_DEBUG | GNUNET_GE_REQUEST | GNUNET_GE_USER, " CHAT: received new message from %s: %s\n", @@ -165,49 +167,51 @@ { int i; int j; - CS_chat_MESSAGE *cmsg; + const CS_chat_JOIN_MESSAGE *cmsg; P2P_chat_MESSAGE *pmsg; GNUNET_HashCode hc; + char *nick; - char *message_content; + GNUNET_RSA_PublicKey *client_key; char *room_name; - + int header_size; unsigned long nick_len; - unsigned long msg_len; - unsigned long room_size; - + unsigned long pubkey_len; + unsigned long room_name_len; + pmsg = (P2P_chat_MESSAGE *) message; - cmsg = (CS_chat_MESSAGE *) message; + cmsg = (CS_chat_JOIN_MESSAGE *) message; - if (ntohs (cmsg->header.size) < sizeof (CS_chat_MESSAGE)) + if (ntohs (cmsg->header.size) < sizeof (CS_chat_JOIN_MESSAGE)) { GNUNET_GE_LOG (ectx, GNUNET_GE_WARNING | GNUNET_GE_BULK | GNUNET_GE_USER, - _("Message received from client is invalid\n")); - return GNUNET_SYSERR; /* invalid message */ - + _("Room join from client is invalid! Size is: %d, should be at least %d\n"),ntohs(cmsg->header.size),sizeof(CS_chat_JOIN_MESSAGE)); + return GNUNET_SYSERR; /* invalid message */ + } - - header_size = ntohs (cmsg->header.size); - nick_len = ntohl (cmsg->nick_len); - msg_len = ntohl (cmsg->msg_len); - room_size = ntohl (cmsg->nick_len); - - nick = GNUNET_malloc (nick_len + 1); - message_content = GNUNET_malloc (msg_len + 1); - room_name = GNUNET_malloc (room_size + 1); - - memcpy (nick, &cmsg->nick[0], nick_len); - memcpy (message_content, &cmsg->nick[sizeof (nick)], msg_len); - memcpy (room_name, &cmsg->nick[sizeof (nick) + sizeof (message_content)], - msg_len); - + + header_size = ntohs(cmsg->header.size); + nick_len = ntohl(cmsg->nick_len); + pubkey_len = ntohl(cmsg->pubkey_len); + room_name_len = ntohl(cmsg->room_name_len); + + nick = GNUNET_malloc(nick_len + 1); + client_key = GNUNET_malloc(sizeof(GNUNET_RSA_PublicKey)); + room_name = GNUNET_malloc(room_name_len + 1); + + memcpy(nick,&cmsg->nick[0],nick_len); + memcpy(client_key,&cmsg->nick[nick_len],pubkey_len); + memcpy(room_name,&cmsg->nick[nick_len + pubkey_len],room_name_len); + + GNUNET_GE_LOG (ectx, + GNUNET_GE_DEBUG | GNUNET_GE_REQUEST | GNUNET_GE_DEVELOPER, + "Received join chat room message from client.\n From %s\n for room %s\n",nick,room_name); + nick[nick_len] = '\0'; - message_content[msg_len] = '\0'; - room_name[room_size] = '\0'; - - GNUNET_hash (pmsg, header_size, &hc); + room_name[room_name_len] = '\0'; + GNUNET_hash (cmsg, header_size, &hc); GNUNET_mutex_lock (chatMutex); markSeen (&hc); @@ -217,7 +221,7 @@ if (clients[i] == client) j = i; else - coreAPI->cs_send_to_client (clients[i], message, GNUNET_YES); + coreAPI->cs_send_to_client (clients[i], message,GNUNET_YES); if (j == -1) { if (clientCount == MAX_CLIENTS) @@ -226,7 +230,9 @@ _("Maximum number of chat clients reached.\n")); else { - clients[clientCount++] = client; + GNUNET_array_grow (clients, clientCount, clientCount + 1); + clients[clientCount] = client; + ++clientCount; GNUNET_GE_LOG (ectx, GNUNET_GE_DEBUG | GNUNET_GE_REQUEST | GNUNET_GE_USER, _("Now %d of %d chat clients at this node.\n"), @@ -234,9 +240,10 @@ } } /* forward to all other nodes in the network */ - pmsg->header.type = htons (GNUNET_P2P_PROTO_CHAT_MSG); - broadcastToConnected (&pmsg->header, 5, 1); + /*pmsg->header.type = htons (GNUNET_P2P_PROTO_CHAT_MSG); + broadcastToConnected (&pmsg->header, 5, 1);*/ GNUNET_mutex_unlock (chatMutex); + fprintf(stderr,"End of handleChatRequest\n"); return GNUNET_OK; } @@ -262,6 +269,9 @@ initialize_module_chat (GNUNET_CoreAPIForPlugins * capi) { int ok = GNUNET_OK; + clientCount = 0; + + lastMsgs = GNUNET_malloc(sizeof(GNUNET_HashCode) * MAX_LAST_MESSAGES); GNUNET_GE_ASSERT (ectx, sizeof (P2P_chat_MESSAGE) == sizeof (CS_chat_MESSAGE)); @@ -272,15 +282,18 @@ _("`%s' registering handlers %d and %d\n"), "chat", GNUNET_P2P_PROTO_CHAT_MSG, GNUNET_CS_PROTO_CHAT_MSG); - if (GNUNET_SYSERR == + /*if (GNUNET_SYSERR == capi->registerHandler (GNUNET_P2P_PROTO_CHAT_MSG, &handleChatMSG)) - ok = GNUNET_SYSERR; + ok = GNUNET_SYSERR;*/ if (GNUNET_SYSERR == capi->cs_exit_handler_register (&chatClientExitHandler)) ok = GNUNET_SYSERR; - if (GNUNET_SYSERR == capi->registerClientHandler (GNUNET_CS_PROTO_CHAT_MSG, + if (GNUNET_SYSERR == capi->registerClientHandler (GNUNET_CS_PROTO_CHAT_JOIN_MSG, &csHandleChatRequest)) ok = GNUNET_SYSERR; + if (GNUNET_SYSERR == capi->registerClientHandler (GNUNET_CS_PROTO_CHAT_MSG, + &csHandleChatMSG)) + ok = GNUNET_SYSERR; GNUNET_GE_ASSERT (capi->ectx, 0 == GNUNET_GC_set_configuration_value_string (capi->cfg, @@ -295,9 +308,11 @@ void done_module_chat () { - coreAPI->unregisterHandler (GNUNET_P2P_PROTO_CHAT_MSG, &handleChatMSG); + /*coreAPI->unregisterHandler (GNUNET_P2P_PROTO_CHAT_MSG, &handleChatMSG);*/ coreAPI->cs_exit_handler_unregister (&chatClientExitHandler); coreAPI->unregisterClientHandler (GNUNET_CS_PROTO_CHAT_MSG, + &csHandleChatMSG); + coreAPI->unregisterClientHandler (GNUNET_CS_PROTO_CHAT_JOIN_MSG, &csHandleChatRequest); GNUNET_mutex_destroy (chatMutex); coreAPI = NULL; _______________________________________________ GNUnet-SVN mailing list GNUnet-SVN@gnu.org http://lists.gnu.org/mailman/listinfo/gnunet-svn