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;