24#include <freerdp/config.h>
31#include <winpr/stream.h>
33#include <freerdp/types.h>
34#include <freerdp/addin.h>
35#include <freerdp/client/channels.h>
36#include <freerdp/channels/log.h>
38#include "rdpdr_main.h"
42#define TAG CHANNELS_TAG("rdpdr.client")
44static void devman_device_free(
void* obj)
46 DEVICE* device = (DEVICE*)obj;
57 DEVMAN* devman = NULL;
62 devman = (DEVMAN*)calloc(1,
sizeof(DEVMAN));
66 WLog_Print(rdpdr->log, WLOG_INFO,
"calloc failed!");
70 devman->plugin = (
void*)rdpdr;
71 devman->id_sequence = 1;
72 devman->devices = ListDictionary_New(TRUE);
76 WLog_Print(rdpdr->log, WLOG_INFO,
"ListDictionary_New failed!");
81 ListDictionary_ValueObject(devman->devices)->
fnObjectFree = devman_device_free;
85void devman_free(DEVMAN* devman)
87 ListDictionary_Free(devman->devices);
91void devman_unregister_device(DEVMAN* devman,
void* key)
93 DEVICE* device = NULL;
98 device = (DEVICE*)ListDictionary_Take(devman->devices, key);
101 devman_device_free(device);
109static UINT devman_register_device(DEVMAN* devman, DEVICE* device)
113 if (!devman || !device)
114 return ERROR_INVALID_PARAMETER;
116 device->id = devman->id_sequence++;
117 key = (
void*)(
size_t)device->id;
119 if (!ListDictionary_Add(devman->devices, key, device))
121 WLog_INFO(TAG,
"ListDictionary_Add failed!");
122 return ERROR_INTERNAL_ERROR;
125 return CHANNEL_RC_OK;
128DEVICE* devman_get_device_by_id(DEVMAN* devman, UINT32
id)
130 DEVICE* device = NULL;
131 void* key = (
void*)(
size_t)id;
135 WLog_ERR(TAG,
"device manager=NULL");
139 device = (DEVICE*)ListDictionary_GetItemValue(devman->devices, key);
141 WLog_WARN(TAG,
"could not find device ID 0x%08" PRIx32,
id);
145DEVICE* devman_get_device_by_type(DEVMAN* devman, UINT32 type)
147 DEVICE* device = NULL;
148 ULONG_PTR* keys = NULL;
153 ListDictionary_Lock(devman->devices);
154 const size_t count = ListDictionary_GetKeys(devman->devices, &keys);
156 for (
size_t x = 0; x < count; x++)
158 DEVICE* cur = (DEVICE*)ListDictionary_GetItemValue(devman->devices, (
void*)keys[x]);
163 if (cur->type != type)
171 ListDictionary_Unlock(devman->devices);
175static const char DRIVE_SERVICE_NAME[] =
"drive";
176static const char PRINTER_SERVICE_NAME[] =
"printer";
177static const char SMARTCARD_SERVICE_NAME[] =
"smartcard";
178static const char SERIAL_SERVICE_NAME[] =
"serial";
179static const char PARALLEL_SERVICE_NAME[] =
"parallel";
186UINT devman_load_device_service(DEVMAN* devman,
RDPDR_DEVICE* device, rdpContext* rdpcontext)
188 const char* ServiceName = NULL;
196 devconv.cdp = device;
197 if (!devman || !device || !rdpcontext)
198 return ERROR_INVALID_PARAMETER;
200 if (device->Type == RDPDR_DTYP_FILESYSTEM)
201 ServiceName = DRIVE_SERVICE_NAME;
202 else if (device->Type == RDPDR_DTYP_PRINT)
203 ServiceName = PRINTER_SERVICE_NAME;
204 else if (device->Type == RDPDR_DTYP_SMARTCARD)
205 ServiceName = SMARTCARD_SERVICE_NAME;
206 else if (device->Type == RDPDR_DTYP_SERIAL)
207 ServiceName = SERIAL_SERVICE_NAME;
208 else if (device->Type == RDPDR_DTYP_PARALLEL)
209 ServiceName = PARALLEL_SERVICE_NAME;
213 WLog_INFO(TAG,
"ServiceName %s did not match!", ServiceName);
214 return ERROR_INVALID_NAME;
218 WLog_INFO(TAG,
"Loading device service %s [%s] (static)", ServiceName, device->Name);
220 WLog_INFO(TAG,
"Loading device service %s (static)", ServiceName);
222 PVIRTUALCHANNELENTRY pvce =
223 freerdp_load_channel_addin_entry(ServiceName, NULL,
"DeviceServiceEntry", 0);
224 PDEVICE_SERVICE_ENTRY entry = WINPR_FUNC_PTR_CAST(pvce, PDEVICE_SERVICE_ENTRY);
228 WLog_INFO(TAG,
"freerdp_load_channel_addin_entry failed!");
229 return ERROR_INTERNAL_ERROR;
233 ep.RegisterDevice = devman_register_device;
234 ep.device = devconv.dp;
235 ep.rdpcontext = rdpcontext;
OBJECT_FREE_FN fnObjectFree