[client/idd] network: add clipboard and bulk transfer

This commit is contained in:
Geoffrey McRae
2026-10-01 01:56:48 +10:00
parent a43227cba6
commit d24d11c3b7
15 changed files with 10384 additions and 253 deletions

View File

@@ -89,6 +89,7 @@
<ClCompile Include="transport\lgmp\CLGMPInputTransport.cpp" />
<ClCompile Include="transport\lgmp\CLGMPTransport.cpp" />
<ClCompile Include="transport\network\CNetworkAudio.cpp" />
<ClCompile Include="transport\network\CNetworkClipboard.cpp" />
<ClCompile Include="transport\network\CNetworkServer.cpp" />
<ClCompile Include="transport\network\CNetworkSession.cpp" />
<ClCompile Include="transport\network\CNetworkTransport.cpp" />
@@ -175,6 +176,7 @@
<ClInclude Include="transport\lgmp\CLGMPInputTransport.h" />
<ClInclude Include="transport\lgmp\CLGMPTransport.h" />
<ClInclude Include="transport\network\CNetworkAudio.h" />
<ClInclude Include="transport\network\CNetworkClipboard.h" />
<ClInclude Include="transport\network\CNetworkServer.h" />
<ClInclude Include="transport\network\CNetworkSession.h" />
<ClInclude Include="transport\network\CNetworkTransport.h" />

View File

@@ -289,6 +289,9 @@
<ClInclude Include="transport\network\CNetworkAudio.h">
<Filter>Transport\Network</Filter>
</ClInclude>
<ClInclude Include="transport\network\CNetworkClipboard.h">
<Filter>Transport\Network</Filter>
</ClInclude>
<ClInclude Include="transport\network\CNetworkServer.h">
<Filter>Transport\Network</Filter>
</ClInclude>
@@ -483,6 +486,9 @@
<ClCompile Include="transport\network\CNetworkAudio.cpp">
<Filter>Transport\Network</Filter>
</ClCompile>
<ClCompile Include="transport\network\CNetworkClipboard.cpp">
<Filter>Transport\Network</Filter>
</ClCompile>
<ClCompile Include="transport\network\CNetworkServer.cpp">
<Filter>Transport\Network</Filter>
</ClCompile>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,105 @@
/**
* Looking Glass
* Copyright © 2017-2026 The Looking Glass Authors
* https://looking-glass.io
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program 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, write to the Free Software Foundation, Inc., 59
* Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#pragma once
#include "transport/IClipboardSource.h"
#include <LGProtocol/NetworkProtocol.h>
#include <memory>
#include <stdint.h>
struct NetworkClipboardPeer
{
uint32_t client = 0;
uint32_t generation = 0;
};
struct NetworkClipboardPeerInfo
{
uint16_t clipboardVersion = 0;
uint16_t fileVersion = 0;
LGNetCapabilityFlags clipboardFlags = 0;
LGNetCapabilityFlags fileFlags = 0;
uint32_t clipboardReliablePayload = 0;
uint32_t clipboardBulkPayload = 0;
uint32_t fileReliablePayload = 0;
uint32_t fileBulkPayload = 0;
};
enum class NetworkClipboardSendResult
{
ACCEPTED,
BLOCKED,
FAILED,
};
enum class NetworkClipboardPacketResult
{
HANDLED,
IGNORED,
INVALID,
};
class INetworkClipboardSender
{
public:
virtual ~INetworkClipboardSender() = default;
virtual bool ClipboardPeerInfo(
const NetworkClipboardPeer& peer, NetworkClipboardPeerInfo& info) = 0;
virtual NetworkClipboardSendResult SendClipboard(
const NetworkClipboardPeer& peer, bool bulk, LGNetService service,
uint16_t messageType, LGNetEnvelopeFlags flags, uint64_t componentEpoch,
uint64_t requestID, const void * payload, uint32_t payloadLength) = 0;
};
class CNetworkClipboard final : public IClipboardSource
{
private:
struct Impl;
std::unique_ptr<Impl> m_impl;
public:
CNetworkClipboard();
~CNetworkClipboard() override;
CNetworkClipboard(const CNetworkClipboard&) = delete;
CNetworkClipboard& operator=(const CNetworkClipboard&) = delete;
bool AttachSender(INetworkClipboardSender& sender);
void DetachSender();
bool PeerConnected(const NetworkClipboardPeer& peer);
void PeerDisconnected(const NetworkClipboardPeer& peer);
NetworkClipboardPacketResult HandlePacket(
const NetworkClipboardPeer& peer, const LGNetPacketView& packet, bool bulk);
void Process(uint64_t nowMs);
void SendReady(
const NetworkClipboardPeer& peer, LGNetService service, bool bulk);
bool Start(IClipboardTarget& target) override;
void Stop() override;
void ClipboardState(bool available, uint32_t generation) override;
ClipboardChannelResult SendClipboard(
const KVMFRClipboardMessage& record, const uint8_t * data) override;
void ClipboardReset(uint32_t generation, uint32_t reason) override;
};

File diff suppressed because it is too large Load Diff

View File

@@ -21,13 +21,16 @@
#pragma once
#include "transport/network/CNetworkAudio.h"
#include "transport/network/CNetworkClipboard.h"
#include <memory>
class CNetworkTransport;
struct NetworkSettings;
class CNetworkServer final : public INetworkAudioSender
class CNetworkServer final :
public INetworkAudioSender,
public INetworkClipboardSender
{
private:
struct Impl;
@@ -35,7 +38,7 @@ private:
public:
CNetworkServer(CNetworkTransport& transport, CNetworkAudio& audio,
const NetworkSettings& settings);
CNetworkClipboard& clipboard, const NetworkSettings& settings);
~CNetworkServer();
CNetworkServer(const CNetworkServer&) = delete;
@@ -52,4 +55,12 @@ public:
uint16_t messageType, LGNetEnvelopeFlags flags,
uint64_t componentEpoch, uint64_t requestID,
const void * payload, uint32_t payloadLength) override;
bool ClipboardPeerInfo(const NetworkClipboardPeer& peer,
NetworkClipboardPeerInfo& info) override;
NetworkClipboardSendResult SendClipboard(
const NetworkClipboardPeer& peer, bool bulk, LGNetService service,
uint16_t messageType, LGNetEnvelopeFlags flags,
uint64_t componentEpoch, uint64_t requestID,
const void * payload, uint32_t payloadLength) override;
};

View File

@@ -76,7 +76,8 @@ bool CNetworkTransport::Initialize()
try
{
m_server.reset(new CNetworkServer(*this, m_audio, m_settings));
m_server.reset(
new CNetworkServer(*this, m_audio, m_clipboard, m_settings));
}
catch (...)
{
@@ -89,6 +90,13 @@ bool CNetworkTransport::Initialize()
m_server.reset();
return false;
}
if (!m_clipboard.AttachSender(*m_server))
{
DEBUG_ERROR("Failed to attach the network clipboard sender");
m_audio.DetachSender();
m_server.reset();
return false;
}
m_state = State::INITIALIZED;
if (m_config.services & TRANSPORT_SERVICE_FRAME)
@@ -163,6 +171,7 @@ void CNetworkTransport::Stop()
if (server)
server->Stop();
m_clipboard.DetachSender();
m_audio.DetachSender();
std::vector<SessionPtr> sessions;
@@ -175,6 +184,7 @@ void CNetworkTransport::Stop()
m_input.Stop();
m_audio.Stop();
m_clipboard.Stop();
m_control.SetControlEvents(nullptr, {});
m_events.Reset();
}
@@ -204,13 +214,13 @@ const FrameProfile * CNetworkTransport::Profiles(unsigned& count) const
CfgResult CNetworkTransport::Probe(const FrameCfg& cfg) const
{
UNREFERENCED_PARAMETER(cfg);
(void)cfg;
return CfgResult::REJECTED;
}
CfgResult CNetworkTransport::Prepare(const FrameCfg& cfg)
{
UNREFERENCED_PARAMETER(cfg);
(void)cfg;
return CfgResult::REJECTED;
}
@@ -237,6 +247,12 @@ IAudioSource * CNetworkTransport::Audio()
return (m_config.services & TRANSPORT_SERVICE_AUDIO) ? &m_audio : nullptr;
}
IClipboardSource * CNetworkTransport::Clipboard()
{
return (m_config.services & TRANSPORT_SERVICE_CLIPBOARD) ?
&m_clipboard : nullptr;
}
IControlSink * CNetworkTransport::Control()
{
return (m_config.services & TRANSPORT_SERVICE_CONTROL) ?

View File

@@ -23,6 +23,7 @@
#include "CSRWLock.h"
#include "transport/ITransport.h"
#include "transport/network/CNetworkAudio.h"
#include "transport/network/CNetworkClipboard.h"
#include "transport/network/CNetworkSession.h"
#include "transport/network/NetworkSettings.h"
@@ -51,6 +52,7 @@ private:
TransportInstance m_config;
NetworkSettings m_settings;
CNetworkAudio m_audio;
CNetworkClipboard m_clipboard;
std::unique_ptr<CNetworkServer> m_server;
mutable CSRWLock m_lifecycleLock;
@@ -92,6 +94,7 @@ public:
std::shared_ptr<const FrameCaps> GetFrameCaps() const override;
DirectFrameBufferMemory GetDirectMemory() const override;
IAudioSource * Audio() override;
IClipboardSource * Clipboard() override;
IControlSink * Control() override;
IInputSource * Input() override;