/* * Deskflow -- mouse and keyboard sharing utility * SPDX-FileCopyrightText: (C) 2013 - 2016 Symless Ltd. * SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception */ #include "deskflow/StreamChunker.h" #include "base/Event.h" #include "base/EventTypes.h" #include "base/IEventQueue.h" #include "base/Log.h" #include "base/String.h" #include "deskflow/ClipboardChunk.h" #include "deskflow/ProtocolTypes.h" #include #include using namespace std; static const size_t g_chunkSize = 512 * 1024; // 512kb void StreamChunker::sendClipboard( const std::string_view &data, size_t size, ClipboardID id, uint32_t sequence, IEventQueue *events, void *eventTarget ) { // send first message (data size) std::string dataSize = deskflow::string::sizeTypeToString(size); ClipboardChunk *sizeMessage = ClipboardChunk::start(id, sequence, dataSize); events->addEvent(Event(EventTypes::ClipboardSending, eventTarget, sizeMessage)); // send clipboard chunk with a fixed size size_t sentLength = 0; size_t chunkSize = g_chunkSize; while (true) { // make sure we don't read too much from the mock data. if (sentLength + chunkSize > size) { chunkSize = size - sentLength; } std::string chunk(data.substr(sentLength, chunkSize).data(), chunkSize); ClipboardChunk *dataChunk = ClipboardChunk::data(id, sequence, chunk); events->addEvent(Event(EventTypes::ClipboardSending, eventTarget, dataChunk)); sentLength += chunkSize; if (sentLength == size) { break; } } // send last message ClipboardChunk *end = ClipboardChunk::end(id, sequence); events->addEvent(Event(EventTypes::ClipboardSending, eventTarget, end)); LOG_DEBUG("sent clipboard size=%d", sentLength); }