-/* Copyright (C) 2009-2010, Martin Johansson <martin@fatbob.nu>
- Copyright (C) 2005-2010, Thorvald Natvig <thorvald@natvig.com>
+/* Copyright (C) 2009-2011, Martin Johansson <martin@fatbob.nu>
+ Copyright (C) 2005-2011, Thorvald Natvig <thorvald@natvig.com>
All rights reserved.
// 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;
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);
}
newclient->availableBandwidth = maxBandwidth;
Timer_init(&newclient->lastActivity);
+ Timer_init(&newclient->connectTime);
+ Timer_init(&newclient->idleTime);
newclient->sessionId = findFreeSessionId();
if (newclient->sessionId < 0)
Log_fatal("Could not find a free session ID");
free(client->release);
if (client->os)
free(client->os);
+ if (client->os_version)
+ free(client->os_version);
if (client->username)
free(client->username);
if (client->context)
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) {
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) &&
memcpy(&itr->remote_udp, &from, sizeof(struct sockaddr_in));
break;
}
- else Log_warn("Bad cryptstate from peer");
}
} /* while */
}
goto out; /* Discard */
client->availableBandwidth -= packetsize;
+ Timer_restart(&client->idleTime);
+
counter = Pds_get_numval(pdi); /* step past session id */
do {
counter = Pds_next8(pdi);