FreeRDP
Loading...
Searching...
No Matches
client/drdynvc_main.h
1
22#ifndef FREERDP_CHANNEL_DRDYNVC_CLIENT_MAIN_H
23#define FREERDP_CHANNEL_DRDYNVC_CLIENT_MAIN_H
24
25#include <freerdp/config.h>
26
27#include <winpr/wlog.h>
28#include <winpr/synch.h>
29#include <freerdp/settings.h>
30#include <winpr/collections.h>
31
32#include <freerdp/api.h>
33#include <freerdp/svc.h>
34#include <freerdp/dvc.h>
35#include <freerdp/addin.h>
36#include <freerdp/channels/log.h>
37#include <freerdp/client/drdynvc.h>
38#include <freerdp/codec/zgfx.h>
39#include <freerdp/freerdp.h>
40
41typedef struct drdynvc_plugin drdynvcPlugin;
42
43typedef struct
44{
45 IWTSVirtualChannelManager iface;
46
47 drdynvcPlugin* drdynvc;
48
49 wArrayList* plugin_names;
50 wArrayList* plugins;
51
52 wHashTable* listeners;
53 wHashTable* channelsById;
54 wStreamPool* pool;
55} DVCMAN;
56
57typedef struct
58{
59 IWTSListener iface;
60
61 DVCMAN* dvcman;
62 char* channel_name;
63 UINT32 flags;
64 IWTSListenerCallback* listener_callback;
66
67typedef struct
68{
69 IDRDYNVC_ENTRY_POINTS iface;
70
71 DVCMAN* dvcman;
72 const ADDIN_ARGV* args;
73 rdpContext* context;
75
76typedef enum
77{
78 DVC_CHANNEL_INIT,
79 DVC_CHANNEL_RUNNING,
80 DVC_CHANNEL_CLOSED
81} DVC_CHANNEL_STATE;
82
83typedef struct
84{
85 uint64_t bytesIn;
86 uint64_t bytesOut;
87 uint64_t fragmentsIn;
88 uint64_t fragmentsOut;
89 uint64_t packetsIn;
90 uint64_t packetsOut;
92
93typedef struct
94{
95 IWTSVirtualChannel iface;
96
97 volatile LONG refCounter;
98 DVC_CHANNEL_STATE state;
99 DVCMAN* dvcman;
100 void* pInterface;
101 UINT32 channel_id;
102 char* channel_name;
103 IWTSVirtualChannelCallback* channel_callback;
104
105 wStream* dvc_data;
106 UINT32 dvc_data_length;
107 ZGFX_CONTEXT* decompressor;
108 CRITICAL_SECTION lock;
110
111 /* TUNNELTYPE_ the channel's data is written on, 0 for the drdynvc static channel. Guarded by
112 * lock: a writer holds it for a whole message, so Soft-Sync cannot move the channel between
113 * two fragments, nor while a message is still on its way out over TCP. */
114 UINT32 tunnelType;
115#if defined(WITH_RDPEUDP)
116 /* The channel carries a static virtual channel's traffic, see dvcman_static_bridge_new. Its
117 * data is passed on in the chunks it came in: bridgeFragmented is set from a DATA_FIRST PDU
118 * until bridgeReceived reaches its length (dvc_data_length). */
119 BOOL staticBridge;
120 BOOL bridgeFragmented;
121 UINT32 bridgeReceived;
122#endif
124
125typedef enum
126{
127 DRDYNVC_STATE_INITIAL,
128 DRDYNVC_STATE_CAPABILITIES,
129 DRDYNVC_STATE_READY,
130 DRDYNVC_STATE_OPENING_CHANNEL,
131 DRDYNVC_STATE_SEND_RECEIVE,
132 DRDYNVC_STATE_FINAL
133} DRDYNVC_STATE;
134
136{
137 CHANNEL_DEF channelDef;
138 CHANNEL_ENTRY_POINTS_FREERDP_EX channelEntryPoints;
139
140 wLog* log;
141 HANDLE thread;
142 BOOL async;
143 wStream* data_in;
144 void* InitHandle;
145 DWORD OpenHandle;
146 wMessageQueue* queue;
147
148 DRDYNVC_STATE state;
149 DrdynvcClientContext* context;
150
151 UINT16 version;
152 int PriorityCharge0;
153 int PriorityCharge1;
154 int PriorityCharge2;
155 int PriorityCharge3;
156 rdpContext* rdpcontext;
157
158 IWTSVirtualChannelManager* channel_mgr;
159 BOOL firstFlagReceived;
160 UINT32 totalLength;
161
162 /* Soft-Sync ([MS-RDPEDYC] 3.1.5.3) */
163 BOOL softSyncDone;
164 wStream* pendingSoftSync;
165 wStream** tunnelBacklog;
166 UINT32* tunnelBacklogTypes;
167 size_t tunnelBacklogCount;
168 size_t tunnelBacklogCapacity;
169};
170
171#endif /* FREERDP_CHANNEL_DRDYNVC_CLIENT_MAIN_H */
Definition svc.h:60