diff --git a/src/lib/server/ClientProxy1_5.cpp b/src/lib/server/ClientProxy1_5.cpp index 4135375b..fee91a4f 100644 --- a/src/lib/server/ClientProxy1_5.cpp +++ b/src/lib/server/ClientProxy1_5.cpp @@ -74,57 +74,6 @@ ClientProxy1_5::fileChunkSending(UInt8 mark, char* data, size_t dataSize) ProtocolUtil::writef(getStream(), kMsgDFileTransfer, mark, &chunk); } -void -ClientProxy1_5::setClipboard(ClipboardID id, const IClipboard* clipboard) -{ - // ignore if this clipboard is already clean - if (m_clipboard[id].m_dirty) { - // this clipboard is now clean - m_clipboard[id].m_dirty = false; - Clipboard::copy(&m_clipboard[id].m_clipboard, clipboard); - - String data = m_clipboard[id].m_clipboard.marshall(); - - size_t size = data.size(); - LOG((CLOG_DEBUG "sending clipboard %d to \"%s\" size=%d", id, getName().c_str(), size)); - - //TODO: refactor FileChunker and use thread - // send first message (file size) - std::stringstream ss; - ss << size; - String dataSize = ss.str(); - ProtocolUtil::writef(getStream(), kMsgDClipboard, id, 0, kDataStart, &dataSize); - - // send chunk messages with a fixed chunk size - size_t sentLength = 0; - size_t chunkSize = 2048; - Stopwatch stopwatch; - stopwatch.start(); - while (true) { - if (stopwatch.getTime() > 0.1f) { - // make sure we don't read too much from the mock data. - if (sentLength + chunkSize > size) { - chunkSize = size - sentLength; - } - - String chunk(data.substr(sentLength, chunkSize).c_str(), chunkSize); - ProtocolUtil::writef(getStream(), kMsgDClipboard, id, 0, kDataChunk, &chunk); - - sentLength += chunkSize; - - if (sentLength == size) { - break; - } - - stopwatch.reset(); - } - } - - // send last message - ProtocolUtil::writef(getStream(), kMsgDClipboard, id, 0, kDataEnd, "\0"); - } -} - bool ClientProxy1_5::parseMessage(const UInt8* code) { diff --git a/src/lib/server/ClientProxy1_5.h b/src/lib/server/ClientProxy1_5.h index 3705b85c..8229739f 100644 --- a/src/lib/server/ClientProxy1_5.h +++ b/src/lib/server/ClientProxy1_5.h @@ -32,7 +32,6 @@ public: virtual void sendDragInfo(UInt32 fileCount, const char* info, size_t size); virtual void fileChunkSending(UInt8 mark, char* data, size_t dataSize); - virtual void setClipboard(ClipboardID id, const IClipboard* clipboard); virtual bool parseMessage(const UInt8* code); void fileChunkReceived(); void dragInfoReceived(); diff --git a/src/lib/server/ClientProxy1_6.cpp b/src/lib/server/ClientProxy1_6.cpp new file mode 100644 index 00000000..3361d242 --- /dev/null +++ b/src/lib/server/ClientProxy1_6.cpp @@ -0,0 +1,56 @@ +/* + * synergy -- mouse and keyboard sharing utility + * Copyright (C) 2015 Synergy Si Inc. + * + * This package is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * found in the file LICENSE that should have accompanied this file. + * + * This package is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "server/ClientProxy1_6.h" + +#include "server/Server.h" +#include "synergy/StreamChunker.h" +#include "synergy/ProtocolUtil.h" +#include "io/IStream.h" +#include "base/Log.h" + +// +// ClientProxy1_6 +// + +ClientProxy1_6::ClientProxy1_6(const String& name, synergy::IStream* stream, Server* server, IEventQueue* events) : + ClientProxy1_5(name, stream, server, events), + m_events(events) +{ +} + +ClientProxy1_6::~ClientProxy1_6() +{ +} + +void +ClientProxy1_6::setClipboard(ClipboardID id, const IClipboard* clipboard) +{ + // ignore if this clipboard is already clean + if (m_clipboard[id].m_dirty) { + // this clipboard is now clean + m_clipboard[id].m_dirty = false; + Clipboard::copy(&m_clipboard[id].m_clipboard, clipboard); + + String data = m_clipboard[id].m_clipboard.marshall(); + + size_t size = data.size(); + LOG((CLOG_DEBUG "sending clipboard %d to \"%s\" size=%d", id, getName().c_str(), size)); + + StreamChunker::sendData(data, size, id, m_events, this); + } +} diff --git a/src/lib/server/ClientProxy1_6.h b/src/lib/server/ClientProxy1_6.h new file mode 100644 index 00000000..7077c9b8 --- /dev/null +++ b/src/lib/server/ClientProxy1_6.h @@ -0,0 +1,35 @@ +/* + * synergy -- mouse and keyboard sharing utility + * Copyright (C) 2015 Synergy Si Inc. + * + * This package is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * found in the file LICENSE that should have accompanied this file. + * + * This package is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include "server/ClientProxy1_5.h" + +class Server; +class IEventQueue; + +//! Proxy for client implementing protocol version 1.6 +class ClientProxy1_6 : public ClientProxy1_5 { +public: + ClientProxy1_6(const String& name, synergy::IStream* adoptedStream, Server* server, IEventQueue* events); + ~ClientProxy1_6(); + + virtual void setClipboard(ClipboardID id, const IClipboard* clipboard); + +private: + IEventQueue* m_events; +}; diff --git a/src/lib/synergy/protocol_types.h b/src/lib/synergy/protocol_types.h index 956f4f49..b34213f4 100644 --- a/src/lib/synergy/protocol_types.h +++ b/src/lib/synergy/protocol_types.h @@ -27,10 +27,11 @@ // 1.3: adds keep alive and deprecates heartbeats, // adds horizontal mouse scrolling // 1.4: adds crypto support -// 1.5: adds file/clipboard transfer and removes home brew crypto +// 1.5: adds file transfer and removes home brew crypto +// 1.6: adds clipboard streaming // NOTE: with new version, synergy minor version should increment static const SInt16 kProtocolMajorVersion = 1; -static const SInt16 kProtocolMinorVersion = 5; +static const SInt16 kProtocolMinorVersion = 6; // default contact port number static const UInt16 kDefaultPort = 24800;