⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pluginmgr.cxx

📁 pwlib源码库
💻 CXX
📖 第 1 页 / 共 2 页
字号:
      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 + -