FreeRDP
Loading...
Searching...
No Matches
sdl_clip.hpp
1
21#pragma once
22
23#include <utility>
24#include <vector>
25#include <atomic>
26#include <queue>
27#include <map>
28
29#include <winpr/wtypes.h>
30#include <freerdp/freerdp.h>
31#include <freerdp/client/client_cliprdr_file.h>
32#include <SDL3/SDL.h>
33
34#include "sdl_types.hpp"
35#include "sdl_utils.hpp"
36
39{
40 public:
41 ClipRequest(UINT32 format, const std::string& mime);
42 ClipRequest(const ClipRequest& other) = default;
43 ClipRequest(ClipRequest&& other) = default;
44 ~ClipRequest() = default;
45
46 ClipRequest& operator=(const ClipRequest& other) = delete;
47 ClipRequest& operator=(ClipRequest&& other) = delete;
48
49 [[nodiscard]] uint32_t format() const;
50 [[nodiscard]] std::string formatstr() const;
51 [[nodiscard]] std::string mime() const;
52 [[nodiscard]] bool success() const;
53 void setSuccess(bool status);
54
55 private:
56 uint32_t _format;
57 std::string _mime;
58 bool _success;
59};
60
62{
63 public:
64 CliprdrFormat(uint32_t formatID, const char* formatName);
65
66 [[nodiscard]] uint32_t formatId() const;
67 [[nodiscard]] const char* formatName() const;
68
69 private:
70 uint32_t _formatID;
71 std::string _formatName;
72};
73
76{
77 public:
78 explicit sdlClip(SdlContext* sdl);
79 virtual ~sdlClip();
80
81 sdlClip(const sdlClip&) = delete;
82 sdlClip(sdlClip&&) = delete;
83
84 sdlClip& operator=(const sdlClip&) = delete;
85 sdlClip& operator=(sdlClip&&) = delete;
86
87 [[nodiscard]] bool init(CliprdrClientContext* clip);
88 [[nodiscard]] bool uninit(CliprdrClientContext* clip);
89
90 [[nodiscard]] bool handleEvent(const SDL_ClipboardEvent& ev);
91
92 private:
93 [[nodiscard]] UINT SendClientCapabilities();
94 void clearServerFormats();
95 [[nodiscard]] UINT SendFormatListResponse(BOOL status);
96 [[nodiscard]] UINT SendDataResponse(const BYTE* data, size_t size);
97 [[nodiscard]] UINT SendDataRequest(uint32_t formatID, const std::string& mime);
98
99 [[nodiscard]] std::string getServerFormat(uint32_t id);
100 [[nodiscard]] uint32_t serverIdForMime(const std::string& mime);
101
102 [[nodiscard]] bool contains(const char** mime_types, Sint32 count);
103
104 [[nodiscard]] static UINT MonitorReady(CliprdrClientContext* context,
105 const CLIPRDR_MONITOR_READY* monitorReady);
106
107 [[nodiscard]] static UINT ReceiveServerCapabilities(CliprdrClientContext* context,
108 const CLIPRDR_CAPABILITIES* capabilities);
109 [[nodiscard]] static UINT ReceiveServerFormatList(CliprdrClientContext* context,
110 const CLIPRDR_FORMAT_LIST* formatList);
111 [[nodiscard]] static UINT
112 ReceiveFormatListResponse(CliprdrClientContext* context,
113 const CLIPRDR_FORMAT_LIST_RESPONSE* formatListResponse);
114 [[nodiscard]] static std::shared_ptr<BYTE> ReceiveFormatDataRequestHandle(
115 sdlClip* clipboard, const CLIPRDR_FORMAT_DATA_REQUEST* formatDataRequest, uint32_t& len);
116 [[nodiscard]] static UINT
117 ReceiveFormatDataRequest(CliprdrClientContext* context,
118 const CLIPRDR_FORMAT_DATA_REQUEST* formatDataRequest);
119 [[nodiscard]] static UINT
120 ReceiveFormatDataResponse(CliprdrClientContext* context,
121 const CLIPRDR_FORMAT_DATA_RESPONSE* formatDataResponse);
122
123 [[nodiscard]] static const void* SDLCALL ClipDataCb(void* userdata, const char* mime_type,
124 size_t* size);
125 static void SDLCALL ClipCleanCb(void* userdata);
126
127 [[nodiscard]] static bool mime_is_file(const std::string& mime);
128 [[nodiscard]] static bool mime_is_text(const std::string& mime);
129 [[nodiscard]] static bool mime_is_image(const std::string& mime);
130 [[nodiscard]] static bool mime_is_bmp(const std::string& mime);
131 [[nodiscard]] static bool mime_is_html(const std::string& mime);
132
133 SdlContext* _sdl = nullptr;
134 CliprdrFileContext* _file = nullptr;
135 CliprdrClientContext* _ctx = nullptr;
136 wLog* _log = nullptr;
137 wClipboard* _system = nullptr;
138 std::atomic<bool> _sync = false;
139 HANDLE _event = nullptr;
140 Uint64 _last_timestamp = 0;
141
142 std::vector<CliprdrFormat> _serverFormats;
143 CriticalSection _lock;
144
145 std::queue<ClipRequest> _request_queue;
146
147 struct cache_entry
148 {
149 cache_entry(size_t len, std::shared_ptr<void> p) : size(len), ptr(std::move(p))
150 {
151 }
152
153 size_t size;
154 std::shared_ptr<void> ptr;
155 };
156 std::map<std::string, cache_entry> _cache_data;
157 std::vector<const char*> _current_mimetypes;
158 std::string _uuid;
159 std::string _mime_uuid;
160};
a clipboard format request
Definition sdl_clip.hpp:39
object that handles clipboard context for the SDL3 client
Definition sdl_clip.hpp:76