void PluginCache::scanPluginFiles() { std::set<std::string> foundBinFiles; for (std::list<std::string>::iterator paths= _pluginPath.begin(); paths != _pluginPath.end(); paths++) { scanDirectory(foundBinFiles, *paths, _nonrecursePath.find(*paths) == _nonrecursePath.end()); } std::list<PluginBinary *>::iterator i=_binaries.begin(); while (i!=_binaries.end()) { PluginBinary *pb = *i; if (foundBinFiles.find(pb->getFilePath()) == foundBinFiles.end()) { // the binary was in the cache, but was not on the path _dirty = true; i = _binaries.erase(i); delete pb; } else { bool binChanged = pb->hasBinaryChanged(); // the binary was in the cache, but the binary has changed and thus we need to reload if (binChanged) { pb->loadPluginInfo(this); _dirty = true; } for (int j=0;j<pb->getNPlugins();j++) { Plugin *plug = &pb->getPlugin(j); APICache::PluginAPICacheI &api = plug->getApiHandler(); if (binChanged) { api.loadFromPlugin(plug); } std::string reason; if (api.pluginSupported(plug, reason)) { _plugins.push_back(plug); api.confirmPlugin(plug); } else { std::cerr << "ignoring plugin " << plug->getIdentifier() << " as unsupported (" << reason << ")" << std::endl; } } i++; } } }
void PluginCache::writePluginCache(std::ostream &os) const { #ifdef CACHE_DEBUG printf("writing pluginCache with version = %s\n", _cacheVersion.c_str()); #endif os << "<cache version=\"" << _cacheVersion << "\">\n"; for (std::list<PluginBinary *>::const_iterator i=_binaries.begin();i!=_binaries.end();i++) { PluginBinary *b = *i; os << "<bundle>\n"; os << " <binary " << XML::attribute("bundle_path", b->getBundlePath()) << XML::attribute("path", b->getFilePath()) << XML::attribute("mtime", int(b->getFileModificationTime())) << XML::attribute("size", int(b->getFileSize())) << "/>\n"; for (int j=0;j<b->getNPlugins();j++) { Plugin *p = &b->getPlugin(j); os << " <plugin " << XML::attribute("name", p->getRawIdentifier()) << XML::attribute("index", p->getIndex()) << XML::attribute("api", p->getPluginApi()) << XML::attribute("api_version", p->getApiVersion()) << XML::attribute("major_version", p->getVersionMajor()) << XML::attribute("minor_version", p->getVersionMinor()) << ">\n"; const APICache::PluginAPICacheI &api = p->getApiHandler(); os << " <apiproperties>\n"; api.saveXML(p, os); os << " </apiproperties>\n"; os << " </plugin>\n"; } os << "</bundle>\n"; } os << "</cache>\n"; }