Initial project snapshot

This commit is contained in:
2026-04-28 22:29:50 +03:00
commit 8ba0561f4f
365 changed files with 91832 additions and 0 deletions
@@ -0,0 +1,31 @@
#pragma once
#include <string>
#include <string_view>
#include "rdp_worker/adapter/service_adapter_protocol.hpp"
#include "rdp_worker/runtime/models.hpp"
namespace rdp_worker::adapter {
struct AdapterEventDescriptor {
AdapterChannel channel;
std::string_view normalized_type;
bool adapter_origin;
bool reliable;
bool droppable;
};
class AdapterEventRouter {
public:
[[nodiscard]] AdapterEventDescriptor DescribeRenderNotification(const runtime::RenderNotification& notification) const;
[[nodiscard]] AdapterEventDescriptor DescribeClipboardNotification(const runtime::ClipboardNotification& notification) const;
[[nodiscard]] AdapterEventDescriptor DescribeClientEnvelope(std::string_view envelope_type,
std::string_view payload_kind,
std::string_view payload_action) const;
};
[[nodiscard]] std::string AdapterEventDescriptorLogLine(const AdapterEventDescriptor& descriptor);
} // namespace rdp_worker::adapter
@@ -0,0 +1,54 @@
#pragma once
#include <chrono>
#include <cstdint>
#include <memory>
#include <optional>
#include <string>
#include "rdp_worker/adapter/adapter_event_router.hpp"
#include "rdp_worker/common/logger.hpp"
#include "rdp_worker/freerdp/rdp_runtime.hpp"
#include "rdp_worker/runtime/models.hpp"
namespace rdp_worker::adapter {
class RdpAdapterRuntime {
public:
explicit RdpAdapterRuntime(std::shared_ptr<common::Logger> logger);
bool Start(const runtime::ConnectionSpec& spec);
void Disconnect(bool terminate);
bool IsConnected() const;
bool PumpEvents(std::chrono::milliseconds timeout);
int DesktopWidth() const;
int DesktopHeight() const;
bool SendFocusEvent(bool focused);
bool SendKeyboardInput(uint16_t scan_code, bool key_down, bool extended);
bool SendMouseMove(double normalized_x, double normalized_y);
bool SendMouseButton(const std::string& button, bool pressed, double normalized_x, double normalized_y);
bool SendMouseWheel(int wheel_delta, bool horizontal, double normalized_x, double normalized_y);
bool SetClipboardText(const std::string& text);
void MarkInputAppliedForGraphicsTrace(const std::string& correlation_id);
std::optional<runtime::RenderNotification> CaptureFullFrameNotification(
const std::string& state,
const std::string& capture_source);
std::optional<runtime::RenderNotification> PopRenderNotification();
std::optional<runtime::ClipboardNotification> PopClipboardNotification();
const std::string& RenderQualityProfile() const;
[[nodiscard]] const AdapterEventRouter& EventRouter() const;
private:
void TraceClientEnvelope(std::string_view envelope_type,
std::string_view payload_kind,
std::string_view payload_action);
void TraceAdapterEvent(const AdapterEventDescriptor& descriptor);
std::shared_ptr<common::Logger> logger_;
freerdp_runtime::RdpRuntime freerdp_;
AdapterEventRouter event_router_;
bool lifecycle_logged_{false};
};
} // namespace rdp_worker::adapter
@@ -0,0 +1,76 @@
#pragma once
#include <array>
#include <optional>
#include <string_view>
namespace rdp_worker::adapter {
enum class AdapterChannel {
kInput,
kControl,
kDisplay,
kCursor,
kClipboard,
kFileTransfer,
kAudio,
kDevice,
kTelemetry,
};
enum class ChannelDirection {
kClientToAdapter,
kAdapterToClient,
kBidirectional,
};
enum class ChannelReliability {
kReliableOrdered,
kReliableChunked,
kDroppableLatest,
kAdaptiveDroppable,
kSampledDroppable,
};
enum class ChannelPriority {
kCritical = 0,
kHigh = 10,
kMedium = 50,
kLow = 90,
};
struct ChannelSpec {
AdapterChannel channel;
std::string_view name;
ChannelDirection direction;
ChannelReliability reliability;
ChannelPriority priority;
bool stale_updates_droppable;
bool may_block_input;
};
[[nodiscard]] constexpr std::array<ChannelSpec, 9> AllChannelSpecs() {
return {{
{AdapterChannel::kInput, "input", ChannelDirection::kClientToAdapter, ChannelReliability::kReliableOrdered, ChannelPriority::kCritical, true, false},
{AdapterChannel::kControl, "control", ChannelDirection::kBidirectional, ChannelReliability::kReliableOrdered, ChannelPriority::kHigh, false, false},
{AdapterChannel::kDisplay, "display", ChannelDirection::kAdapterToClient, ChannelReliability::kDroppableLatest, ChannelPriority::kHigh, true, false},
{AdapterChannel::kCursor, "cursor", ChannelDirection::kAdapterToClient, ChannelReliability::kDroppableLatest, ChannelPriority::kHigh, true, false},
{AdapterChannel::kClipboard, "clipboard", ChannelDirection::kBidirectional, ChannelReliability::kReliableOrdered, ChannelPriority::kMedium, false, false},
{AdapterChannel::kFileTransfer, "file_transfer", ChannelDirection::kBidirectional, ChannelReliability::kReliableChunked, ChannelPriority::kMedium, false, false},
{AdapterChannel::kAudio, "audio", ChannelDirection::kAdapterToClient, ChannelReliability::kAdaptiveDroppable, ChannelPriority::kMedium, true, false},
{AdapterChannel::kDevice, "device", ChannelDirection::kBidirectional, ChannelReliability::kReliableOrdered, ChannelPriority::kMedium, false, false},
{AdapterChannel::kTelemetry, "telemetry", ChannelDirection::kAdapterToClient, ChannelReliability::kSampledDroppable, ChannelPriority::kLow, true, false},
}};
}
[[nodiscard]] std::optional<ChannelSpec> FindChannelSpec(std::string_view name);
[[nodiscard]] std::string_view ChannelName(AdapterChannel channel);
[[nodiscard]] std::string_view DirectionName(ChannelDirection direction);
[[nodiscard]] std::string_view ReliabilityName(ChannelReliability reliability);
[[nodiscard]] int PriorityValue(ChannelPriority priority);
[[nodiscard]] bool IsDroppable(AdapterChannel channel);
[[nodiscard]] bool IsReliable(AdapterChannel channel);
[[nodiscard]] bool ValidateAdapterChannelInvariants();
} // namespace rdp_worker::adapter