83
static int dvcman_get_configuration(IWTSListener* pListener,
83
static int dvcman_get_configuration(IWTSListener* pListener, void** ppPropertyBag)
86
85
*ppPropertyBag = NULL;
90
89
static int dvcman_create_listener(IWTSVirtualChannelManager* pChannelMgr,
91
const char* pszChannelName,
93
IWTSListenerCallback* pListenerCallback,
94
IWTSListener** ppListener)
90
const char* pszChannelName, uint32 ulFlags,
91
IWTSListenerCallback* pListenerCallback, IWTSListener** ppListener)
96
93
DVCMAN* dvcman = (DVCMAN*)pChannelMgr;
97
94
DVCMAN_LISTENER* listener;
121
static int dvcman_push_event(IWTSVirtualChannelManager* pChannelMgr,
118
static int dvcman_push_event(IWTSVirtualChannelManager* pChannelMgr, RDP_EVENT* pEvent)
124
DVCMAN* dvcman = (DVCMAN*)pChannelMgr;
121
DVCMAN* dvcman = (DVCMAN*) pChannelMgr;
127
123
error = drdynvc_push_event(dvcman->drdynvc, pEvent);
130
127
DEBUG_DVC("event_type %d pushed.", pEvent->event_type);
134
131
DEBUG_WARN("event_type %d push failed.", pEvent->event_type);
139
static int dvcman_register_plugin(IDRDYNVC_ENTRY_POINTS* pEntryPoints,
140
const char* name, IWTSPlugin* pPlugin)
137
static int dvcman_register_plugin(IDRDYNVC_ENTRY_POINTS* pEntryPoints, const char* name, IWTSPlugin* pPlugin)
142
DVCMAN* dvcman = ((DVCMAN_ENTRY_POINTS*)pEntryPoints)->dvcman;
139
DVCMAN* dvcman = ((DVCMAN_ENTRY_POINTS*) pEntryPoints)->dvcman;
144
141
if (dvcman->num_plugins < MAX_PLUGINS)
158
IWTSPlugin* dvcman_get_plugin(IDRDYNVC_ENTRY_POINTS* pEntryPoints,
155
IWTSPlugin* dvcman_get_plugin(IDRDYNVC_ENTRY_POINTS* pEntryPoints, const char* name)
161
DVCMAN* dvcman = ((DVCMAN_ENTRY_POINTS*)pEntryPoints)->dvcman;
158
DVCMAN* dvcman = ((DVCMAN_ENTRY_POINTS*) pEntryPoints)->dvcman;
164
160
for (i = 0; i < dvcman->num_plugins; i++)
169
165
return dvcman->plugins[i];
175
172
RDP_PLUGIN_DATA* dvcman_get_plugin_data(IDRDYNVC_ENTRY_POINTS* pEntryPoints)
177
return ((DVCMAN_ENTRY_POINTS*)pEntryPoints)->plugin_data;
174
return ((DVCMAN_ENTRY_POINTS*) pEntryPoints)->plugin_data;
180
177
IWTSVirtualChannelManager* dvcman_new(drdynvcPlugin* plugin)
187
184
dvcman->drdynvc = plugin;
188
185
dvcman->channels = list_new();
190
return (IWTSVirtualChannelManager*)dvcman;
187
return (IWTSVirtualChannelManager*) dvcman;
193
190
int dvcman_load_plugin(IWTSVirtualChannelManager* pChannelMgr, RDP_PLUGIN_DATA* data)
198
195
while (data && data->size > 0)
200
pDVCPluginEntry = freerdp_load_plugin((char*)data->data[0], "DVCPluginEntry");
197
pDVCPluginEntry = freerdp_load_plugin((char*) data->data[0], "DVCPluginEntry");
202
199
if (pDVCPluginEntry != NULL)
204
201
entryPoints.iface.RegisterPlugin = dvcman_register_plugin;
205
202
entryPoints.iface.GetPlugin = dvcman_get_plugin;
206
203
entryPoints.iface.GetPluginData = dvcman_get_plugin_data;
207
entryPoints.dvcman = (DVCMAN*)pChannelMgr;
204
entryPoints.dvcman = (DVCMAN*) pChannelMgr;
208
205
entryPoints.plugin_data = data;
209
pDVCPluginEntry((IDRDYNVC_ENTRY_POINTS*)&entryPoints);
206
pDVCPluginEntry((IDRDYNVC_ENTRY_POINTS*) &entryPoints);
212
data = (RDP_PLUGIN_DATA*)(((void*)data) + data->size);
209
data = (RDP_PLUGIN_DATA*)(((void*) data) + data->size);
220
217
if (channel->channel_callback)
221
218
channel->channel_callback->OnClose(channel->channel_callback);
225
223
void dvcman_free(IWTSVirtualChannelManager* pChannelMgr)
227
DVCMAN* dvcman = (DVCMAN*)pChannelMgr;
229
226
IWTSPlugin* pPlugin;
230
227
DVCMAN_LISTENER* listener;
231
228
DVCMAN_CHANNEL* channel;
229
DVCMAN* dvcman = (DVCMAN*) pChannelMgr;
233
while ((channel = (DVCMAN_CHANNEL*)list_dequeue(dvcman->channels)) != NULL)
231
while ((channel = (DVCMAN_CHANNEL*) list_dequeue(dvcman->channels)) != NULL)
234
232
dvcman_channel_free(channel);
235
234
list_free(dvcman->channels);
236
236
for (i = 0; i < dvcman->num_listeners; i++)
238
listener = (DVCMAN_LISTENER*)dvcman->listeners[i];
238
listener = (DVCMAN_LISTENER*) dvcman->listeners[i];
239
239
xfree(listener->channel_name);
242
243
for (i = 0; i < dvcman->num_plugins; i++)
244
245
pPlugin = dvcman->plugins[i];
245
247
if (pPlugin->Terminated)
246
248
pPlugin->Terminated(pPlugin);
251
254
int dvcman_init(IWTSVirtualChannelManager* pChannelMgr)
253
DVCMAN* dvcman = (DVCMAN*)pChannelMgr;
255
257
IWTSPlugin* pPlugin;
258
DVCMAN* dvcman = (DVCMAN*) pChannelMgr;
257
260
for (i = 0; i < dvcman->num_plugins; i++)
259
262
pPlugin = dvcman->plugins[i];
260
264
if (pPlugin->Initialize)
261
265
pPlugin->Initialize(pPlugin, pChannelMgr);
266
static int dvcman_write_channel(IWTSVirtualChannel* pChannel,
271
static int dvcman_write_channel(IWTSVirtualChannel* pChannel, uint32 cbSize, uint8* pBuffer, void* pReserved)
271
DVCMAN_CHANNEL* channel = (DVCMAN_CHANNEL*)pChannel;
273
DVCMAN_CHANNEL* channel = (DVCMAN_CHANNEL*) pChannel;
273
275
return drdynvc_write_data(channel->dvcman->drdynvc, channel->channel_id, pBuffer, cbSize);
276
278
static int dvcman_close_channel_iface(IWTSVirtualChannel* pChannel)
278
DVCMAN_CHANNEL* channel = (DVCMAN_CHANNEL*)pChannel;
280
DVCMAN_CHANNEL* channel = (DVCMAN_CHANNEL*) pChannel;
279
281
DVCMAN* dvcman = channel->dvcman;
281
283
DEBUG_DVC("id=%d", channel->channel_id);
283
285
if (list_remove(dvcman->channels, channel) == NULL)
284
286
DEBUG_WARN("channel not found");
285
288
dvcman_channel_free(channel);
290
293
int dvcman_create_channel(IWTSVirtualChannelManager* pChannelMgr, uint32 ChannelId, const char* ChannelName)
292
DVCMAN* dvcman = (DVCMAN*)pChannelMgr;
294
DVCMAN_LISTENER* listener;
295
DVCMAN_CHANNEL* channel;
297
DVCMAN_LISTENER* listener;
298
DVCMAN_CHANNEL* channel;
297
299
IWTSVirtualChannelCallback* pCallback;
300
DVCMAN* dvcman = (DVCMAN*) pChannelMgr;
299
302
for (i = 0; i < dvcman->num_listeners; i++)
301
304
listener = (DVCMAN_LISTENER*)dvcman->listeners[i];
302
306
if (strcmp(listener->channel_name, ChannelName) == 0)
304
308
channel = xnew(DVCMAN_CHANNEL);
311
315
pCallback = NULL;
312
317
if (listener->listener_callback->OnNewChannelConnection(listener->listener_callback,
313
(IWTSVirtualChannel*)channel, NULL, &bAccept, &pCallback) == 0 && bAccept == 1)
318
(IWTSVirtualChannel*) channel, NULL, &bAccept, &pCallback) == 0 && bAccept == 1)
315
320
DEBUG_DVC("listener %s created new channel %d",
316
321
listener->channel_name, channel->channel_id);
317
322
channel->channel_callback = pCallback;
318
323
list_add(dvcman->channels, channel);
332
339
static DVCMAN_CHANNEL* dvcman_find_channel_by_id(IWTSVirtualChannelManager* pChannelMgr, uint32 ChannelId)
334
DVCMAN* dvcman = (DVCMAN*)pChannelMgr;
342
DVCMAN* dvcman = (DVCMAN*) pChannelMgr;
337
344
for (curr = dvcman->channels->head; curr; curr = curr->next)
339
if (((DVCMAN_CHANNEL*)curr->data)->channel_id == ChannelId)
346
if (((DVCMAN_CHANNEL*) curr->data)->channel_id == ChannelId)
341
348
return (DVCMAN_CHANNEL*)curr->data;
350
358
IWTSVirtualChannel* ichannel;
352
360
channel = dvcman_find_channel_by_id(pChannelMgr, ChannelId);
353
362
if (channel == NULL)
355
364
DEBUG_WARN("ChannelId %d not found!", ChannelId);
358
368
if (channel->dvc_data)
360
370
stream_free(channel->dvc_data);
361
371
channel->dvc_data = NULL;
363
374
DEBUG_DVC("dvcman_close_channel: channel %d closed", ChannelId);
364
375
ichannel = (IWTSVirtualChannel*)channel;
365
376
ichannel->Close(ichannel);
386
401
int dvcman_receive_channel_data(IWTSVirtualChannelManager* pChannelMgr, uint32 ChannelId, uint8* data, uint32 data_size)
388
DVCMAN_CHANNEL* channel;
404
DVCMAN_CHANNEL* channel;
391
406
channel = dvcman_find_channel_by_id(pChannelMgr, ChannelId);
392
408
if (channel == NULL)
394
410
DEBUG_WARN("ChannelId %d not found!", ChannelId);
405
421
channel->dvc_data = NULL;
408
425
stream_write(channel->dvc_data, data, data_size);
409
427
if (stream_get_length(channel->dvc_data) >= stream_get_size(channel->dvc_data))
411
429
error = channel->channel_callback->OnDataReceived(channel->channel_callback,