bool PluginManager::InstallPluginPackage(const wxString& filePath) { wxFileSystem fs; std::auto_ptr<wxZipEntry> entry(new wxZipEntry()); wxFileInputStream in(filePath); if (!in.IsOk()) { MessageBoxes::ShowError(wxString::Format(_("Could not open %s"), filePath)); return false; } wxString targetDir = FilePaths::GetPluginsDirectory(); wxZipInputStream zip(in); while (entry.reset(zip.GetNextEntry()), entry.get() != NULL) { wxString name = entry->GetName(); name = targetDir + wxFileName::GetPathSeparator() + name; if (entry->IsDir()) { int perm = entry->GetMode(); wxFileName::Mkdir(name, perm, wxPATH_MKDIR_FULL); } else { zip.OpenEntry(*entry.get()); if (!zip.CanRead()) { MessageBoxes::ShowError(wxString::Format(_("Can not read zip entry '%s'"), name)); return false; } wxFileOutputStream file(name); if (!file) { MessageBoxes::ShowError(wxString::Format(_("Can not create file '%s'"), name)); return false; } zip.Read(file); } } Plugin* p = new Plugin(); plugins_.push_back(p); p->LoadMetadata(targetDir); p->Enable(true); p->SetInitiallyEnabled(false); MessageBoxes::ShowInformation(wxString::Format(_("The plugin has been installed successfully. It will be activated the next time %s is started"), APPLICATION_NAME)); return true; }
void PluginManager::Initialize() { eventNames_.Add(_T("iconMenuOpening")); eventNames_.Add(_T("click")); luaApplication = new azApplication(); luaOptionPanel = new azOptionPanel(); luaDialogs = new azDialogs(); luaSystem = new azSystem(); TiXmlDocument doc(FilePaths::GetPluginSettingsFile().mb_str()); doc.LoadFile(TIXML_ENCODING_UTF8); TiXmlElement* pluginSettingsXml = doc.FirstChildElement("Plugins"); if (!pluginSettingsXml) WLOG(_T("PluginManager::Initialize: Could not load XML. No Plugins element found.")); wxString pluginPath = FilePaths::GetPluginsDirectory(); wxDir pluginFolder; if (wxFileName::DirExists(pluginPath) && pluginFolder.Open(pluginPath)) { wxString folderName; bool success = pluginFolder.GetFirst(&folderName, wxALL_FILES_PATTERN, wxDIR_DIRS); while (success) { Plugin* p = new Plugin(); plugins_.push_back(p); wxString folderPath = pluginPath + wxFileName::GetPathSeparator() + folderName; p->LoadMetadata(folderPath); bool pluginIsEnabled = true; if (pluginSettingsXml) { for (TiXmlElement* element = pluginSettingsXml->FirstChildElement(); element; element = element->NextSiblingElement()) { wxString elementName = wxString::FromUTF8(element->Value()); TiXmlHandle handle(element); if (elementName == _T("Plugin")) { wxString uuid = XmlUtil::ReadElementText(handle, "UUID"); if (uuid == p->GetUUID()) { pluginIsEnabled = XmlUtil::ReadElementTextAsBool(handle, "Enabled", true); break; } } else { WLOG(wxString::Format(_T("PluginManager::Initialize: Unknown element: %s"), elementName)); } } // for } // if p->Enable(pluginIsEnabled); p->SetInitiallyEnabled(pluginIsEnabled); if (pluginIsEnabled) { ILOG(_T("Loading plugin: ") + folderName); p->Load(folderPath); } else { ILOG(_T("Skipping disabled plugin: ") + folderName); } success = pluginFolder.GetNext(&folderName); } } }