static ITSMFDecoder* tsmf_load_decoder_by_name(const char* name, TS_AM_MEDIA_TYPE* media_type) { ITSMFDecoder* decoder; TSMF_DECODER_ENTRY entry; char* fullname; if (strrchr(name, '.') != NULL) entry = (TSMF_DECODER_ENTRY) freerdp_load_plugin(name, TSMF_DECODER_EXPORT_FUNC_NAME); else { fullname = xzalloc(strlen(name) + 6); strcpy(fullname, "tsmf_"); strcat(fullname, name); entry = (TSMF_DECODER_ENTRY) freerdp_load_plugin(fullname, TSMF_DECODER_EXPORT_FUNC_NAME); free(fullname); } if (entry == NULL) { return NULL; } decoder = entry(); if (decoder == NULL) { DEBUG_WARN("failed to call export function in %s", name); return NULL; } if (!decoder->SetFormat(decoder, media_type)) { decoder->Free(decoder); decoder = NULL; } return decoder; }
static boolean rdpsnd_load_device_plugin(rdpsndPlugin* rdpsnd, const char* name, RDP_PLUGIN_DATA* data) { FREERDP_RDPSND_DEVICE_ENTRY_POINTS entryPoints; PFREERDP_RDPSND_DEVICE_ENTRY entry; char* fullname; if (strrchr(name, '.') != NULL) entry = (PFREERDP_RDPSND_DEVICE_ENTRY)freerdp_load_plugin(name, RDPSND_DEVICE_EXPORT_FUNC_NAME); else { fullname = xzalloc(strlen(name) + 8); strcpy(fullname, "rdpsnd_"); strcat(fullname, name); entry = (PFREERDP_RDPSND_DEVICE_ENTRY)freerdp_load_plugin(fullname, RDPSND_DEVICE_EXPORT_FUNC_NAME); xfree(fullname); } if (entry == NULL) { return false; } entryPoints.rdpsnd = rdpsnd; entryPoints.pRegisterRdpsndDevice = rdpsnd_register_device_plugin; entryPoints.plugin_data = data; if (entry(&entryPoints) != 0) { DEBUG_WARN("%s entry returns error.", name); return false; } return true; }
static ITSMFAudioDevice* tsmf_load_audio_device_by_name(const char* name, const char* device) { ITSMFAudioDevice* audio; TSMF_AUDIO_DEVICE_ENTRY entry; char* fullname; if (strrchr(name, '.') != NULL) entry = (TSMF_AUDIO_DEVICE_ENTRY) freerdp_load_plugin(name, TSMF_AUDIO_DEVICE_EXPORT_FUNC_NAME); else { fullname = xzalloc(strlen(name) + 6); strcpy(fullname, "tsmf_"); strcat(fullname, name); entry = (TSMF_AUDIO_DEVICE_ENTRY) freerdp_load_plugin(fullname, TSMF_AUDIO_DEVICE_EXPORT_FUNC_NAME); xfree(fullname); } if (entry == NULL) { return NULL; } audio = entry(); if (audio == NULL) { DEBUG_WARN("failed to call export function in %s", name); return NULL; } if (!audio->Open(audio, device)) { audio->Free(audio); audio = NULL; } return audio; }
void test_load_plugin(void) { void* entry; #ifdef _WIN32 /* untested */ entry = freerdp_load_plugin("..\\channels\\cliprdr\\cliprdr", "VirtualChannelEntry"); #else entry = freerdp_load_plugin("../channels/cliprdr/cliprdr.so", "VirtualChannelEntry"); #endif CU_ASSERT(entry != NULL); }
BOOL devman_load_device_service(DEVMAN* devman, RDP_PLUGIN_DATA* plugin_data) { char* name; DEVICE_SERVICE_ENTRY_POINTS ep; PDEVICE_SERVICE_ENTRY entry = NULL; name = (char*) plugin_data->data[0]; entry = (PDEVICE_SERVICE_ENTRY) freerdp_channels_find_static_device_service_entry(name); if (!entry) { printf("loading device service %s (plugin)\n", name); entry = freerdp_load_plugin(name, "DeviceServiceEntry"); } else { printf("loading device service %s (static)\n", name); } if (entry == NULL) return FALSE; ep.devman = devman; ep.RegisterDevice = devman_register_device; ep.plugin_data = plugin_data; entry(&ep); return TRUE; }
/** * this is called when processing the command line parameters * called only from main thread */ int freerdp_channels_load_plugin(rdpChannels* chan_man, rdpSettings* settings, const char* name, void* data) { struct lib_data* lib; CHANNEL_ENTRY_POINTS_EX ep; int ok; DEBUG_CHANNELS("%s", name); if (chan_man->num_libs + 1 >= CHANNEL_MAX_COUNT) { DEBUG_CHANNELS("too many channels"); return 1; } lib = chan_man->libs + chan_man->num_libs; lib->entry = (PVIRTUALCHANNELENTRY)freerdp_load_plugin(name, CHANNEL_EXPORT_FUNC_NAME); if (lib->entry == NULL) { DEBUG_CHANNELS("failed to find export function"); return 1; } ep.cbSize = sizeof(ep); ep.protocolVersion = VIRTUAL_CHANNEL_VERSION_WIN2000; ep.pVirtualChannelInit = MyVirtualChannelInit; ep.pVirtualChannelOpen = MyVirtualChannelOpen; ep.pVirtualChannelClose = MyVirtualChannelClose; ep.pVirtualChannelWrite = MyVirtualChannelWrite; ep.pExtendedData = data; ep.pVirtualChannelEventPush = MyVirtualChannelEventPush; /* enable MyVirtualChannelInit */ chan_man->can_call_init = 1; chan_man->settings = settings; freerdp_mutex_lock(g_mutex_init); g_init_chan_man = chan_man; ok = lib->entry((PCHANNEL_ENTRY_POINTS)&ep); g_init_chan_man = NULL; freerdp_mutex_unlock(g_mutex_init); /* disable MyVirtualChannelInit */ chan_man->settings = 0; chan_man->can_call_init = 0; if (!ok) { DEBUG_CHANNELS("export function call failed"); return 1; } return 0; }
boolean devman_load_device_service(DEVMAN* devman, RDP_PLUGIN_DATA* plugin_data) { DEVICE_SERVICE_ENTRY_POINTS ep; PDEVICE_SERVICE_ENTRY entry; entry = freerdp_load_plugin((char*) plugin_data->data[0], "DeviceServiceEntry"); if (entry == NULL) return false; ep.devman = devman; ep.RegisterDevice = devman_register_device; ep.UnregisterDevice = devman_unregister_device; ep.plugin_data = plugin_data; entry(&ep); return true; }
int dvcman_load_plugin(IWTSVirtualChannelManager* pChannelMgr, FRDP_PLUGIN_DATA* data) { DVCMAN_ENTRY_POINTS entryPoints; PDVC_PLUGIN_ENTRY pDVCPluginEntry = NULL; if (data != NULL) { pDVCPluginEntry = freerdp_load_plugin((char*)data->data[0], "DVCPluginEntry"); if(pDVCPluginEntry != NULL) { entryPoints.iface.RegisterPlugin = dvcman_register_plugin; entryPoints.iface.GetPlugin = dvcman_get_plugin; entryPoints.iface.GetPluginData = dvcman_get_plugin_data; entryPoints.dvcman = (DVCMAN*)pChannelMgr; entryPoints.plugin_data = data; pDVCPluginEntry((IDRDYNVC_ENTRY_POINTS*)&entryPoints); } } return 0; }