Fix codec alpha/beta in message to client. Copied change from Murmur sources.
[umurmur.git] / src / client.c
index 963ec4dd5fb8b1b62a4acb1d99fa59500cd00c33..92dbeea10d64ffb3dd187415807f1720b8ebc794 100644 (file)
@@ -200,7 +200,7 @@ void recheckCodecVersions()
        // it as alpha and announce it. If another codec now got the
        // majority set it as the opposite of the currently valid bPreferAlpha
        // and announce it.
-       if (version == (uint32_t)0x8000000a)
+       if (version == (uint32_t)0x8000000b)
                bPreferAlpha = true;
        else
                bPreferAlpha = ! bPreferAlpha;
@@ -211,8 +211,8 @@ void recheckCodecVersions()
                iCodecBeta = version;
        
        sendmsg = Msg_create(CodecVersion);
-       sendmsg->payload.codecVersion->alpha = version;
-       sendmsg->payload.codecVersion->beta = version;
+       sendmsg->payload.codecVersion->alpha = iCodecAlpha;
+       sendmsg->payload.codecVersion->beta = iCodecBeta;
        sendmsg->payload.codecVersion->prefer_alpha = bPreferAlpha;
        Client_send_message_except(NULL, sendmsg);
        
@@ -505,6 +505,15 @@ int Client_write(client_t *client)
        return 0;
 }
 
+int Client_send_message_ver(client_t *client, message_t *msg, uint32_t version)
+{
+       if ((version == 0) || (client->version >= version) ||
+               ((version & 0x80000000) && (client->version < (~version))))
+               return Client_send_message(client, msg);
+       else
+               Msg_free(msg);
+}
+
 int Client_send_message(client_t *client, message_t *msg)
 {
        if (!client->authenticated && msg->messageType != Version) {
@@ -577,6 +586,29 @@ int Client_send_message_except(client_t *client, message_t *msg)
        return 0;
 }
 
+int Client_send_message_except_ver(client_t *client, message_t *msg, uint32_t version)
+{
+       client_t *itr = NULL;
+       int count = 0;
+       
+       Msg_inc_ref(msg); /* Make sure a reference is held during the whole iteration. */
+       while (Client_iterate(&itr) != NULL) {
+               if (itr != client) {
+                       if (count++ > 0)
+                               Msg_inc_ref(msg); /* One extra reference for each new copy */
+                       Log_debug("Msg %d to %s refcount %d",  msg->messageType, itr->username, msg->refcount);
+                       Client_send_message_ver(itr, msg, version);
+               }
+       }
+       Msg_free(msg); /* Free our reference to the message */
+       
+       if (count == 0)
+               Msg_free(msg); /* If only 1 client is connected then no message is passed
+                                               * to Client_send_message(). Free it here. */
+               
+       return 0;
+}
+
 static bool_t checkDecrypt(client_t *client, const uint8_t *encrypted, uint8_t *plain, unsigned int len)
 {
        if (CryptState_isValid(&client->cryptState) &&