diff --git a/src/lib/base/EventTypes.cpp b/src/lib/base/EventTypes.cpp index 0629cef3..d1617d45 100644 --- a/src/lib/base/EventTypes.cpp +++ b/src/lib/base/EventTypes.cpp @@ -116,6 +116,7 @@ REGISTER_EVENT(ClientListener, connected) REGISTER_EVENT(ClientProxy, ready) REGISTER_EVENT(ClientProxy, disconnected) REGISTER_EVENT(ClientProxy, clipboardChanged) +REGISTER_EVENT(ClientProxy, clipboardSending) // // ClientProxyUnknown diff --git a/src/lib/base/EventTypes.h b/src/lib/base/EventTypes.h index 75a0800c..7eea4eea 100644 --- a/src/lib/base/EventTypes.h +++ b/src/lib/base/EventTypes.h @@ -351,7 +351,8 @@ public: ClientProxyEvents() : m_ready(Event::kUnknown), m_disconnected(Event::kUnknown), - m_clipboardChanged(Event::kUnknown) { } + m_clipboardChanged(Event::kUnknown), + m_clipboardSending(Event::kUnknown) { } //! @name accessors //@{ @@ -379,12 +380,20 @@ public: */ Event::Type clipboardChanged(); + //! Clipboard sending event type + /*! + Returns the clipboard sending event type. This is used to send + clipboard chunks. + */ + Event::Type clipboardSending(); + //@} private: Event::Type m_ready; Event::Type m_disconnected; Event::Type m_clipboardChanged; + Event::Type m_clipboardSending; }; class ClientProxyUnknownEvents : public EventTypes { diff --git a/src/lib/server/ClientProxy1_6.cpp b/src/lib/server/ClientProxy1_6.cpp index acdb7dfd..7c778ad1 100644 --- a/src/lib/server/ClientProxy1_6.cpp +++ b/src/lib/server/ClientProxy1_6.cpp @@ -18,8 +18,11 @@ #include "server/ClientProxy1_6.h" #include "server/Server.h" +#include "synergy/ProtocolUtil.h" #include "synergy/StreamChunker.h" +#include "synergy/ClipboardChunk.h" #include "io/IStream.h" +#include "base/TMethodEventJob.h" #include "base/Log.h" // @@ -30,6 +33,10 @@ ClientProxy1_6::ClientProxy1_6(const String& name, synergy::IStream* stream, Ser ClientProxy1_5(name, stream, server, events), m_events(events) { + m_events->adoptHandler(m_events->forClientProxy().clipboardSending(), + this, + new TMethodEventJob(this, + &ClientProxy1_6::handleClipboardSendingEvent)); } ClientProxy1_6::~ClientProxy1_6() @@ -67,3 +74,35 @@ ClientProxy1_6::setClipboard(ClipboardID id, const IClipboard* clipboard) StreamChunker::sendClipboard(data, size, id, 0, m_events, this); } } + +void +ClientProxy1_6::handleClipboardSendingEvent(const Event& event, void*) +{ + void* data = event.getData(); + ClipboardChunk* clipboardData = reinterpret_cast(data); + + LOG((CLOG_DEBUG1 "sending clipboard chunk")); + + char* chunk = clipboardData->m_chunk; + ClipboardID id = chunk[0]; + UInt32* seq = reinterpret_cast(&chunk[1]); + UInt32 sequence = *seq; + UInt8 mark = chunk[5]; + String dataChunk(&chunk[6], clipboardData->m_dataSize); + + switch (mark) { + case kDataStart: + LOG((CLOG_DEBUG2 "file sending start: size=%s", dataChunk.c_str())); + break; + + case kDataChunk: + LOG((CLOG_DEBUG2 "file chunk sending: size=%i", dataChunk.size())); + break; + + case kDataEnd: + LOG((CLOG_DEBUG2 "file sending finished")); + break; + } + + ProtocolUtil::writef(getStream(), kMsgDClipboard, id, sequence, mark, &dataChunk); +} diff --git a/src/lib/server/ClientProxy1_6.h b/src/lib/server/ClientProxy1_6.h index 3290ffe6..4e5fba0f 100644 --- a/src/lib/server/ClientProxy1_6.h +++ b/src/lib/server/ClientProxy1_6.h @@ -31,6 +31,9 @@ public: virtual bool parseMessage(const UInt8* code); virtual void setClipboard(ClipboardID id, const IClipboard* clipboard); +private: + void handleClipboardSendingEvent(const Event&, void*); + private: IEventQueue* m_events; }; diff --git a/src/lib/synergy/StreamChunker.cpp b/src/lib/synergy/StreamChunker.cpp index 46d19e3c..e471622c 100644 --- a/src/lib/synergy/StreamChunker.cpp +++ b/src/lib/synergy/StreamChunker.cpp @@ -112,7 +112,7 @@ StreamChunker::sendClipboard( String dataSize = synergy::string::intToString(size); ClipboardChunk* sizeMessage = ClipboardChunk::start(id, sequence, dataSize); - events->addEvent(Event(events->forIScreen().fileChunkSending(), eventTarget, sizeMessage)); + events->addEvent(Event(events->forClientProxy().clipboardSending(), eventTarget, sizeMessage)); // send clipboard chunk with a fixed size // TODO: 4096 fails and this shouldn't a magic number @@ -130,7 +130,7 @@ StreamChunker::sendClipboard( String chunk(data.substr(sentLength, chunkSize).c_str(), chunkSize); ClipboardChunk* dataChunk = ClipboardChunk::data(id, sequence, chunk); - events->addEvent(Event(events->forIScreen().fileChunkSending(), eventTarget, dataChunk)); + events->addEvent(Event(events->forClientProxy().clipboardSending(), eventTarget, dataChunk)); sentLength += chunkSize; @@ -145,5 +145,5 @@ StreamChunker::sendClipboard( // send last message ClipboardChunk* end = ClipboardChunk::end(id, sequence); - events->addEvent(Event(events->forIScreen().fileChunkSending(), eventTarget, end)); + events->addEvent(Event(events->forClientProxy().clipboardSending(), eventTarget, end)); }