patch by Michiel van der Leeuw and Alex Evans

* removed varargs to improve portability (using sprintf)
* reversed endianness
* fixed keyboard up message modifiers
* added zlib license file
This commit is contained in:
Nick Bolton 2012-07-10 17:17:57 +00:00
parent f26e7b0d97
commit d48dfd62dd
3 changed files with 73 additions and 29 deletions

22
src/micro/COPYING.zlib Normal file
View File

@ -0,0 +1,22 @@
uSynergy client -- Implementation for the embedded Synergy client library
Copyright (c) 2012 Alex Evans
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source
distribution.

View File

@ -26,7 +26,6 @@ freely, subject to the following restrictions:
#include "uSynergy.h" #include "uSynergy.h"
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <varargs.h>
@ -42,9 +41,9 @@ freely, subject to the following restrictions:
static int16_t sNetToNative16(const unsigned char *value) static int16_t sNetToNative16(const unsigned char *value)
{ {
#ifdef USYNERGY_LITTLE_ENDIAN #ifdef USYNERGY_LITTLE_ENDIAN
return value[0] | (value[1] << 8);
#else
return value[1] | (value[0] << 8); return value[1] | (value[0] << 8);
#else
return value[0] | (value[1] << 8);
#endif #endif
} }
@ -56,9 +55,9 @@ static int16_t sNetToNative16(const unsigned char *value)
static int32_t sNetToNative32(const unsigned char *value) static int32_t sNetToNative32(const unsigned char *value)
{ {
#ifdef USYNERGY_LITTLE_ENDIAN #ifdef USYNERGY_LITTLE_ENDIAN
return value[0] | (value[1] << 8) | (value[2] << 16) | (value[3] << 24);
#else
return value[3] | (value[2] << 8) | (value[1] << 16) | (value[0] << 24); return value[3] | (value[2] << 8) | (value[1] << 16) | (value[0] << 24);
#else
return value[0] | (value[1] << 8) | (value[2] << 16) | (value[3] << 24);
#endif #endif
} }
@ -67,20 +66,11 @@ static int32_t sNetToNative32(const unsigned char *value)
/** /**
@brief Trace text to client @brief Trace text to client
**/ **/
static void sTrace(uSynergyContext *context, const char* fmt, ...) static void sTrace(uSynergyContext *context, const char* text)
{ {
// Print to buffer, then call callback
char buffer[USYNERGY_TRACE_BUFFER_SIZE];
va_list va_alist;
// Expand arguments and format to string
va_start(va_alist);
vsprintf_s(buffer, USYNERGY_TRACE_BUFFER_SIZE, fmt, va_alist);
va_end(va_alist);
// Don't trace if we don't have a trace function // Don't trace if we don't have a trace function
if (context->m_traceFunc != 0L) if (context->m_traceFunc != 0L)
context->m_traceFunc(context->m_cookie, buffer); context->m_traceFunc(context->m_cookie, text);
} }
@ -179,15 +169,14 @@ static void sSendMouseCallback(uSynergyContext *context)
/** /**
@brief Send keyboard callback when a key has been pressed or released @brief Send keyboard callback when a key has been pressed or released
**/ **/
static void sSendKeyboardCallback(uSynergyContext *context, uint16_t key, char down, char repeat, uint16_t modifiers) static void sSendKeyboardCallback(uSynergyContext *context, uint16_t key, uint16_t modifiers, uSynergyBool down, uSynergyBool repeat)
{ {
// Skip if no callback is installed // Skip if no callback is installed
if (context->m_keyboardCallback == 0L) if (context->m_keyboardCallback == 0L)
return; return;
// Send callback // Send callback
modifiers; context->m_keyboardCallback(context->m_cookie, key, modifiers, down, repeat);
context->m_keyboardCallback(context->m_cookie, key, down, repeat);
} }
@ -237,7 +226,9 @@ static void sProcessMessage(uSynergyContext *context, const uint8_t *message)
else else
{ {
// Let's assume we're connected // Let's assume we're connected
sTrace(context, "Connected as client \"%s\"", context->m_clientName); char buffer[256+1];
sprintf(buffer, "Connected as client \"%s\"", context->m_clientName);
sTrace(context, buffer);
context->m_hasReceivedHello = USYNERGY_TRUE; context->m_hasReceivedHello = USYNERGY_TRUE;
} }
return; return;
@ -345,13 +336,17 @@ static void sProcessMessage(uSynergyContext *context, const uint8_t *message)
//uint16_t id = sNetToNative16(message+8); //uint16_t id = sNetToNative16(message+8);
uint16_t mod = sNetToNative16(message+10); uint16_t mod = sNetToNative16(message+10);
uint16_t key = sNetToNative16(message+12); uint16_t key = sNetToNative16(message+12);
sSendKeyboardCallback(context, key, 1, 0, mod); sSendKeyboardCallback(context, key, mod, USYNERGY_TRUE, USYNERGY_FALSE);
} }
else if (USYNERGY_IS_PACKET("DKRP")) else if (USYNERGY_IS_PACKET("DKRP"))
{ {
// Key repeat // Key repeat
// kMsgDKeyRepeat = "DKRP%2i%2i%2i%2i" // kMsgDKeyRepeat = "DKRP%2i%2i%2i%2i"
// kMsgDKeyRepeat1_0 = "DKRP%2i%2i%2i" // kMsgDKeyRepeat1_0 = "DKRP%2i%2i%2i"
uint16_t mod = sNetToNative16(message+10);
// uint16_t count = sNetToNative16(message+12);
uint16_t key = sNetToNative16(message+14);
sSendKeyboardCallback(context, key, mod, USYNERGY_TRUE, USYNERGY_TRUE);
} }
else if (USYNERGY_IS_PACKET("DKUP")) else if (USYNERGY_IS_PACKET("DKUP"))
{ {
@ -361,7 +356,7 @@ static void sProcessMessage(uSynergyContext *context, const uint8_t *message)
//uint16 id=Endian::sNetToNative(sbuf[4]); //uint16 id=Endian::sNetToNative(sbuf[4]);
uint16_t mod = sNetToNative16(message+10); uint16_t mod = sNetToNative16(message+10);
uint16_t key = sNetToNative16(message+12); uint16_t key = sNetToNative16(message+12);
sSendKeyboardCallback(context, key, 0, 0, mod); sSendKeyboardCallback(context, key, mod, USYNERGY_FALSE, USYNERGY_FALSE);
} }
else if (USYNERGY_IS_PACKET("DGBT")) else if (USYNERGY_IS_PACKET("DGBT"))
{ {
@ -447,7 +442,9 @@ static void sProcessMessage(uSynergyContext *context, const uint8_t *message)
// kMsgEBusy = "EBSY" // kMsgEBusy = "EBSY"
// kMsgEUnknown = "EUNK" // kMsgEUnknown = "EUNK"
// kMsgEBad = "EBAD" // kMsgEBad = "EBAD"
sTrace(context, "Unknown packet '%c%c%c%c'", message[4], message[5], message[6], message[7]); char buffer[64];
sprintf(buffer, "Unknown packet '%c%c%c%c'", message[4], message[5], message[6], message[7]);
sTrace(context, buffer);
return; return;
} }
@ -485,7 +482,9 @@ static void sUpdateContext(uSynergyContext *context)
if (context->m_receiveFunc(context->m_cookie, context->m_receiveBuffer, receive_size, &num_received) == USYNERGY_FALSE) if (context->m_receiveFunc(context->m_cookie, context->m_receiveBuffer, receive_size, &num_received) == USYNERGY_FALSE)
{ {
/* Receive failed, let's try to reconnect */ /* Receive failed, let's try to reconnect */
sTrace(context, "Receive failed (%d bytes asked, %d bytes received), trying to reconnect in a second", receive_size, num_received); char buffer[128];
sprintf(buffer, "Receive failed (%d bytes asked, %d bytes received), trying to reconnect in a second", receive_size, num_received);
sTrace(context, buffer);
sSetDisconnected(context); sSetDisconnected(context);
context->m_sleepFunc(context->m_cookie, 1000); context->m_sleepFunc(context->m_cookie, 1000);
return; return;
@ -532,7 +531,9 @@ static void sUpdateContext(uSynergyContext *context)
if (packlen > USYNERGY_RECEIVE_BUFFER_SIZE) if (packlen > USYNERGY_RECEIVE_BUFFER_SIZE)
{ {
/* Oversized packet, ditch tail end */ /* Oversized packet, ditch tail end */
sTrace(context, "Oversized packet: '%c%c%c%c' (length %d)", context->m_receiveBuffer[4], context->m_receiveBuffer[5], context->m_receiveBuffer[6], context->m_receiveBuffer[7], packlen); char buffer[128];
sprintf(buffer, "Oversized packet: '%c%c%c%c' (length %d)", context->m_receiveBuffer[4], context->m_receiveBuffer[5], context->m_receiveBuffer[6], context->m_receiveBuffer[7], packlen);
sTrace(context, buffer);
num_received = context->m_receiveOfs-4; // 4 bytes for the size field num_received = context->m_receiveOfs-4; // 4 bytes for the size field
while (num_received != packlen) while (num_received != packlen)
{ {
@ -542,7 +543,7 @@ static void sUpdateContext(uSynergyContext *context)
if (context->m_receiveFunc(context->m_cookie, context->m_receiveBuffer, to_receive, &ditch_received) == USYNERGY_FALSE) if (context->m_receiveFunc(context->m_cookie, context->m_receiveBuffer, to_receive, &ditch_received) == USYNERGY_FALSE)
{ {
/* Receive failed, let's try to reconnect */ /* Receive failed, let's try to reconnect */
sTrace(context, "Synergy: Receive failed, trying to reconnect in a second"); sTrace(context, "Receive failed, trying to reconnect in a second");
sSetDisconnected(context); sSetDisconnected(context);
context->m_sleepFunc(context->m_cookie, 1000); context->m_sleepFunc(context->m_cookie, 1000);
break; break;
@ -616,7 +617,9 @@ void uSynergySendClipboard(uSynergyContext *context, const char *text)
uint32_t text_length = (uint32_t)strlen(text); uint32_t text_length = (uint32_t)strlen(text);
if (text_length > max_length) if (text_length > max_length)
{ {
sTrace(context, "Clipboard buffer too small, clipboard truncated at %d characters", max_length); char buffer[128];
sprintf(buffer, "Clipboard buffer too small, clipboard truncated at %d characters", max_length);
sTrace(context, buffer);
text_length = max_length; text_length = max_length;
} }

View File

@ -109,6 +109,24 @@ enum uSynergyClipboardFormat
#define USYNERGY_RECEIVE_BUFFER_SIZE 4096 /* Maximum size of an incoming packet */ #define USYNERGY_RECEIVE_BUFFER_SIZE 4096 /* Maximum size of an incoming packet */
/**
@brief Keyboard constants
**/
#define USYNERGY_MODIFIER_SHIFT 0x0001 /* Shift key modifier */
#define USYNERGY_MODIFIER_CTRL 0x0002 /* Ctrl key modifier */
#define USYNERGY_MODIFIER_ALT 0x0004 /* Alt key modifier */
#define USYNERGY_MODIFIER_META 0x0008 /* Meta key modifier */
#define USYNERGY_MODIFIER_WIN 0x0010 /* Windows key modifier */
#define USYNERGY_MODIFIER_ALT_GR 0x0020 /* AltGr key modifier */
#define USYNERGY_MODIFIER_LEVEL5LOCK 0x0040 /* Level5Lock key modifier */
#define USYNERGY_MODIFIER_CAPSLOCK 0x1000 /* CapsLock key modifier */
#define USYNERGY_MODIFIER_NUMLOCK 0x2000 /* NumLock key modifier */
#define USYNERGY_MODIFIER_SCROLLOCK 0x4000 /* ScrollLock key modifier */
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
// Functions and Callbacks // Functions and Callbacks
//--------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------
@ -243,10 +261,11 @@ This callback is called when a key is pressed or released.
@param cookie Cookie supplied in the Synergy context @param cookie Cookie supplied in the Synergy context
@param key Key code of key that was pressed or released @param key Key code of key that was pressed or released
@param modifiers Status of modifier keys (alt, shift, etc.)
@param down Down or up status, 1 is key is pressed down, 0 if key is released (up) @param down Down or up status, 1 is key is pressed down, 0 if key is released (up)
@param repeat Repeat flag, 1 if the key is down because the key is repeating, 0 if the key is initially pressed by the user @param repeat Repeat flag, 1 if the key is down because the key is repeating, 0 if the key is initially pressed by the user
**/ **/
typedef void (*uSynergyKeyboardCallback)(uSynergyCookie cookie, uint16_t key, uSynergyBool down, uSynergyBool repeat); typedef void (*uSynergyKeyboardCallback)(uSynergyCookie cookie, uint16_t key, uint16_t modifiers, uSynergyBool down, uSynergyBool repeat);