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:
parent
f26e7b0d97
commit
d48dfd62dd
|
@ -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.
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -142,7 +132,7 @@ static uSynergyBool sSendReply(uSynergyContext *context)
|
||||||
{
|
{
|
||||||
// Set header size
|
// Set header size
|
||||||
uint8_t *reply_buf = context->m_replyBuffer;
|
uint8_t *reply_buf = context->m_replyBuffer;
|
||||||
uint32_t reply_len = (uint32_t)(context->m_replyCur - reply_buf); /* Total size of reply */
|
uint32_t reply_len = (uint32_t)(context->m_replyCur - reply_buf); /* Total size of reply */
|
||||||
uint32_t body_len = reply_len - 4; /* Size of body */
|
uint32_t body_len = reply_len - 4; /* Size of body */
|
||||||
uSynergyBool ret;
|
uSynergyBool ret;
|
||||||
reply_buf[0] = (uint8_t)(body_len >> 24);
|
reply_buf[0] = (uint8_t)(body_len >> 24);
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue