TextMessage handling added.
authorfatbob313 <martin@fatbob.nu>
Wed, 30 Dec 2009 10:46:15 +0000 (10:46 +0000)
committerfatbob313 <martin@fatbob.nu>
Wed, 30 Dec 2009 10:46:15 +0000 (10:46 +0000)
src/client.c
src/messagehandler.c
src/messages.c
src/messages.h

index 706e3f5bfa98f277e2c63b51218791e158824521..79300ca94a323930d62ffeeb0af82109b7edb39b 100644 (file)
@@ -60,7 +60,7 @@ extern int udpsock;
 
 void Client_init()
 {
-       maxBandwidth = getIntConf(MAX_BANDWIDTH);
+       maxBandwidth = getIntConf(MAX_BANDWIDTH) / 8; /* From bits/s -> bytes/s */
 }
 
 int Client_count()
@@ -223,6 +223,10 @@ void Client_free(client_t *client)
                SSL_free(client->ssl);
        close(client->tcpfd);
        clientcount--;
+       if (client->release)
+               free(client->release);
+       if (client->os)
+               free(client->os);                       
        free(client);
 }
 
index dff80fedb19e377860e542fa264a56d35cacd97e..7da04d11b46aa64864ef7aea7d24868ed3c42607 100644 (file)
@@ -123,9 +123,7 @@ void Mh_handle_message(client_t *client, message_t *msg)
                /* Name & password */
                strncpy(client->playerName, msg->payload.authenticate->username, MAX_TEXT);
                client->playerId = client->sessionId;
-               
-               
-               /* XXX - Kick ghost? */
+                               
                
                /* Setup UDP encryption */
                CryptState_init(&client->cryptState);
@@ -317,46 +315,61 @@ void Mh_handle_message(client_t *client, message_t *msg)
                break;
                
        case TextMessage:
-#if 0
-               if (msg->payload.textMessage.bTree)
+               msg->payload.textMessage->has_actor = true;
+               msg->payload.textMessage->actor = client->sessionId;
+
+               /* XXX - Allow HTML stuff? */
+               
+               if (msg->payload.textMessage->n_tree_id > 0) {
                        sendPermissionDenied(client, "Tree message not supported");
-               else if (msg->payload.textMessage.channel != -1) { /* To channel */
-                       channel_t *ch_itr = NULL;
-                       do {
-                               Chan_iterate(&ch_itr);
-                       } while (ch_itr != NULL && ch_itr->id != msg->payload.textMessage.channel);
-                       if (ch_itr == NULL)
-                               Log_warn("Channel id %d not found - ignoring.", msg->payload.textMessage.channel);
-                       else {
-                               struct dlist *itr;
-                               list_iterate(itr, &ch_itr->clients) {
-                                       client_t *c;
-                                       c = list_get_entry(itr, client_t, chan_node);
-                                       if (c != client && !c->deaf) {
-                                               Msg_inc_ref(msg);
-                                               Client_send_message(c, msg);
-                                               Log_debug("Text message to player ID %d", c->playerId);
+                       break;
+               }
+                       
+               if (msg->payload.textMessage->n_channel_id > 0) { /* To channel */
+                       int i;
+                       channel_t *ch_itr;
+                       for (i = 0; i < msg->payload.textMessage->n_channel_id; i++) {
+                               ch_itr = NULL;
+                               do {
+                                       Chan_iterate(&ch_itr);
+                               } while (ch_itr != NULL && ch_itr->id != msg->payload.textMessage->channel_id[i]);
+                               if (ch_itr == NULL)
+                                       Log_warn("Channel id %d not found - ignoring.", msg->payload.textMessage->channel_id[i]);
+                               else {
+                                       struct dlist *itr;
+                                       list_iterate(itr, &ch_itr->clients) {
+                                               client_t *c;
+                                               c = list_get_entry(itr, client_t, chan_node);
+                                               if (c != client && !c->deaf) {
+                                                       Msg_inc_ref(msg);
+                                                       Client_send_message(c, msg);
+                                                       Log_debug("Text message to session ID %d", c->sessionId);
+                                               }
                                        }
                                }
-                       }
-               } else { /* To player */
-                       client_t *itr = NULL;
-                       while (Client_iterate(&itr) != NULL) {
-                               if (!IS_AUTH(itr))
-                                       continue;
-                               if (itr->playerId == msg->payload.textMessage.victim) {
-                                       if (!itr->deaf) {
-                                               Msg_inc_ref(msg);
-                                               Client_send_message(itr, msg);
+                       } /* for */
+               }
+               if (msg->payload.textMessage->n_session > 0) { /* To user */
+                       int i;
+                       client_t *itr;
+                       for (i = 0; i < msg->payload.textMessage->n_session; i++) {
+                               itr = NULL;
+                               while (Client_iterate(&itr) != NULL) {
+                                       if (!IS_AUTH(itr))
+                                               continue;
+                                       if (itr->playerId == msg->payload.textMessage->session[i]) {
+                                               if (!itr->deaf) {
+                                                       Msg_inc_ref(msg);
+                                                       Client_send_message(itr, msg);
+                                               }
+                                               break;
                                        }
-                                       break;
                                }
-                       }
-                       if (itr == NULL)
-                               Log_warn("TextMessage: Player ID %d not found", msg->payload.textMessage.victim);
+                               if (itr == NULL)
+                                       Log_warn("TextMessage: Session ID %d not found", msg->payload.textMessage->session[i]);
+                       } /* for */
                }
                break;
-#endif
 
        case VoiceTarget:
                /* XXX -TODO */
index 8b4c497e8679c638277e47ec8452f32d601b5161..9cd4dc775f191bb2fc54e8a39857f22d93953e6a 100644 (file)
@@ -541,6 +541,13 @@ message_t *Msg_networkToMessage(uint8_t *data, int size)
                msg->payload.codecVersion = mumble_proto__codec_version__unpack(NULL, msgLen, msgData);
                break;
        }
+       case PermissionQuery:
+       {
+               msg = Msg_create(PermissionQuery);
+               msg->unpacked = true;
+               msg->payload.permissionQuery = mumble_proto__permission_query__unpack(NULL, msgLen, msgData);
+               break;
+       }
 
        default:
                Log_warn("Unsupported message %d", messageType);
index 4582d6cc56fd9df51de4fea234bb14a2eff32706..2e7d1a759faf442c3cbd5ba6150ffd9ac9695992 100644 (file)
@@ -97,7 +97,7 @@ typedef union payload {
        struct  _MumbleProto__UserList *userList;
        struct  _MumbleProto__VoiceTarget__Target *voiceTarget_target;
        struct  _MumbleProto__VoiceTarget *voiceTarget;
-       /* PermissionQuery not supported */
+       struct  _MumbleProto__PermissionQuery *permissionQuery;
        struct  _MumbleProto__CodecVersion *codecVersion;
 } payload_t;