📄 pluginmgr.cxx
字号:
return serviceList[i].descriptor; } return NULL;}PObject * PPluginManager::CreatePluginsDevice(const PString & serviceName, const PString & serviceType, int userData) const{ PDevicePluginServiceDescriptor * descr = (PDevicePluginServiceDescriptor *)GetServiceDescriptor(serviceName, serviceType); if (descr != NULL) return descr->CreateInstance(userData); return NULL;}PObject * PPluginManager::CreatePluginsDeviceByName(const PString & deviceName, const PString & serviceType, int userData) const{ // If have tab character, then have explicit driver name in device PINDEX tab = deviceName.Find(PDevicePluginServiceDescriptor::SeparatorChar); if (tab != P_MAX_INDEX) return CreatePluginsDevice(deviceName.Left(tab), serviceType, userData); // Otherwise search for the correct driver PWaitAndSignal m(serviceListMutex); for (PINDEX i = 0; i < serviceList.GetSize(); i++) { const PPluginService & service = serviceList[i]; if (service.serviceType *= serviceType) { PDevicePluginServiceDescriptor * descriptor = (PDevicePluginServiceDescriptor *)service.descriptor; if (descriptor->ValidateDeviceName(deviceName, userData)) return descriptor->CreateInstance(userData); } } return NULL;}bool PDevicePluginServiceDescriptor::ValidateDeviceName(const PString & deviceName, int userData) const{ PStringList devices = GetDeviceNames(userData); for (PINDEX j = 0; j < devices.GetSize(); j++) { if (devices[j] *= deviceName) return true; } return false;}PStringList PPluginManager::GetPluginsDeviceNames(const PString & serviceName, const PString & serviceType, int userData) const{ PStringList allDevices; if (serviceName.IsEmpty() || serviceName == "*") { PWaitAndSignal n(serviceListMutex); PINDEX i; PStringToString deviceToPluginMap; // First we run through all of the drivers and their lists of devices and // use the dictionary to assure all names are unique for (i = 0; i < serviceList.GetSize(); i++) { const PPluginService & service = serviceList[i]; if (service.serviceType *= serviceType) { PStringList devices = ((PDevicePluginServiceDescriptor *)service.descriptor)->GetDeviceNames(userData); for (PINDEX j = 0; j < devices.GetSize(); j++) { PCaselessString device = devices[j]; if (deviceToPluginMap.Contains(device)) { PString oldPlugin = deviceToPluginMap[device]; if (!oldPlugin.IsEmpty()) { // Make name unique by prepending driver name and a tab character deviceToPluginMap.SetAt(oldPlugin+PDevicePluginServiceDescriptor::SeparatorChar+device, ""); // Reset the original to empty string so we dont add it multiple times deviceToPluginMap.SetAt(device, ""); } // Now add the new one deviceToPluginMap.SetAt(service.serviceName+PDevicePluginServiceDescriptor::SeparatorChar+device, ""); } else deviceToPluginMap.SetAt(device, service.serviceName); } } } for (i = 0; i < deviceToPluginMap.GetSize(); i++) allDevices.AppendString(deviceToPluginMap.GetKeyAt(i)); } else { PDevicePluginServiceDescriptor * descr = (PDevicePluginServiceDescriptor *)GetServiceDescriptor(serviceName, serviceType); if (descr != NULL) allDevices = descr->GetDeviceNames(userData); } return allDevices;}BOOL PPluginManager::RegisterService(const PString & serviceName, const PString & serviceType, PPluginServiceDescriptor * descriptor){ PWaitAndSignal m(serviceListMutex); // first, check if it something didn't already register that name and type for (PINDEX i = 0; i < serviceList.GetSize(); i++) { if (serviceList[i].serviceName == serviceName && serviceList[i].serviceType == serviceType) return FALSE; } PPluginService * service = new PPluginService(serviceName, serviceType, descriptor); serviceList.Append(service); PDevicePluginAdapterBase * adapter = PFactory<PDevicePluginAdapterBase>::CreateInstance(serviceType); if (adapter != NULL) adapter->CreateFactory(serviceName); return TRUE;}void PPluginManager::AddNotifier(const PNotifier & notifyFunction, BOOL existing){ PWaitAndSignal m(notifierMutex); notifierList.Append(new PNotifier(notifyFunction)); if (existing) for (PINDEX i = 0; i < pluginList.GetSize(); i++) CallNotifier(pluginList[i], 0);}void PPluginManager::RemoveNotifier(const PNotifier & notifyFunction){ PWaitAndSignal m(notifierMutex); for (PINDEX i = 0; i < notifierList.GetSize(); i++) { if (notifierList[i] == notifyFunction) { notifierList.RemoveAt(i); i = 0; continue; } }}void PPluginManager::CallNotifier(PDynaLink & dll, INT code){ PWaitAndSignal m(notifierMutex); for (PINDEX i = 0; i < notifierList.GetSize(); i++) notifierList[i](dll, code);}////////////////////////////////////////////////////////////////////////////////////PPluginModuleManager::PPluginModuleManager(const char * _signatureFunctionName, PPluginManager * _pluginMgr) : signatureFunctionName(_signatureFunctionName){ pluginList.DisallowDeleteObjects(); pluginMgr = _pluginMgr;; if (pluginMgr == NULL) pluginMgr = &PPluginManager::GetPluginManager();}void PPluginModuleManager::OnLoadModule(PDynaLink & dll, INT code){ PDynaLink::Function dummyFunction; if (!dll.GetFunction(signatureFunctionName, dummyFunction)) return; switch (code) { case 0: pluginList.SetAt(dll.GetName(), &dll); break; case 1: { PINDEX idx = pluginList.GetValuesIndex(dll.GetName()); if (idx != P_MAX_INDEX) pluginList.RemoveAt(idx); } break; default: break; } OnLoadPlugin(dll, code);}////////////////////////////////////////////////////////////////////////////////////class PluginLoaderStartup : public PProcessStartup{ PCLASSINFO(PluginLoaderStartup, PProcessStartup); public: void OnStartup() { // load the actual DLLs, which will also load the system plugins PStringArray dirs = PPluginManager::GetPluginDirs(); PPluginManager & mgr = PPluginManager::GetPluginManager(); PINDEX i; for (i = 0; i < dirs.GetSize(); i++) mgr.LoadPluginDirectory(dirs[i]); // now load the plugin module managers PFactory<PPluginModuleManager>::KeyList_T keyList = PFactory<PPluginModuleManager>::GetKeyList(); PFactory<PPluginModuleManager>::KeyList_T::const_iterator r; for (r = keyList.begin(); r != keyList.end(); ++r) { PPluginModuleManager * mgr = PFactory<PPluginModuleManager>::CreateInstance(*r); if (mgr == NULL) { PTRACE(1, "PLUGIN\tCannot create manager for plugins of type " << *r); } else { PTRACE(1, "PLUGIN\tCreated manager for plugins of type " << *r); managers.push_back(mgr); } } } void OnShutdown() { while (managers.begin() != managers.end()) { std::vector<PPluginModuleManager *>::iterator r = managers.begin(); PPluginModuleManager * mgr = *r; managers.erase(r); mgr->OnShutdown(); } } protected: std::vector<PPluginModuleManager *> managers;};static PFactory<PProcessStartup>::Worker<PluginLoaderStartup> pluginLoaderStartupFactory("PluginLoader", true);PINSTANTIATE_FACTORY(PluginLoaderStartup, PString)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -