// -*- c-basic-offset: 4 -*- /** @file PluginItems.cpp * * @brief Reading python plugins metadata * * @author Y. Levy, T. Modes * */ /* * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this software. If not, see * . * */ #include #include #include //for natural sorting #include "hugin_utils/alphanum.h" #include "PluginItems.h" //for console/debugging output #include bool comparePluginItem(PluginItem item1,PluginItem item2) { int res=doj::alphanum_comp( std::string(item1.GetCategory().mb_str(wxConvLocal)), std::string(item2.GetCategory().mb_str(wxConvLocal))); if(res<0) { return true; } else { if(res==0) { return (doj::alphanum_comp( std::string(item1.GetName().mb_str(wxConvLocal)), std::string(item2.GetName().mb_str(wxConvLocal)))<0); } else { return false; }; }; }; bool compareVersion(wxString v1, wxString v2) { return doj::alphanum_comp(std::string(v1.mb_str(wxConvLocal)),std::string(v2.mb_str(wxConvLocal))) < 0; }; PluginItem::PluginItem(wxFileName filename) { // default category if nothing else found m_category = _("Miscellaneous"); // default plugin name if nothing else found is the file name m_name=filename.GetFullName(); m_filename=filename; m_description=wxT(""); m_validAPI=true; ParseMetadata(); }; void PluginItem::ParseMetadata() { // use wxWidgets to read the plugin files in search for meta data wxFileInputStream in(m_filename.GetFullPath()); wxTextInputStream text(in); // read the plugin file and search if it contains meta data bool foundCategory=false; bool foundName=false; bool foundAPImin=false; bool foundAPImax=false; bool foundSYS=false; bool foundDescription=false; #if defined __WXMSW__ wxString system(wxT("win")); #elif defined __WXMAC__ wxString system(wxT("mac")); #else wxString system(wxT("nix")); #endif wxString tagSYS(wxT("@sys")); wxString tagAPImin(wxT("@api-min")); wxString tagAPImax(wxT("@api-max")); wxString tagCategory(wxT("@category")); wxString tagName(wxT("@name")); wxString tagDescription(wxT("@description")); // tell me who you are processing std::cout << m_filename.GetFullPath().mb_str(wxConvLocal) << std::endl; while(!in.Eof() && !(foundCategory && foundName && foundAPImin && foundAPImax && foundSYS && foundDescription)) { int pos; wxString line=text.ReadLine(); //convert to lower case to make search for tag name case insensitive wxString lowerLine=line.Lower(); pos=lowerLine.Find(tagSYS); if(pos!=wxNOT_FOUND) { foundSYS=true; pos=lowerLine.Find(system); if(pos==wxNOT_FOUND) { m_validAPI=false; std::cout << " fails @sys" << std::endl; }; continue; }; pos=lowerLine.Find(tagAPImin); if(pos!=wxNOT_FOUND) { foundAPImin=true; wxString APImin = line.Mid(pos+1+tagAPImin.length()).Trim().Trim(false); if(compareVersion(wxT(HUGIN_API_VERSION),APImin)) { m_validAPI=false; std::cout << " fails @api-min" << std::endl; }; continue; }; pos=lowerLine.Find(tagAPImax); if(pos!=wxNOT_FOUND) { foundAPImax=true; wxString APImax = line.Mid(pos+1+tagAPImax.length()).Trim().Trim(false); if(compareVersion(APImax,wxT(HUGIN_API_VERSION))) { m_validAPI=false; std::cout << " fails @api-max" << std::endl; }; continue; }; pos=lowerLine.Find(tagCategory); if(pos!=wxNOT_FOUND) { m_category = line.Mid(pos+1+tagCategory.length()).Trim().Trim(false); foundCategory=true; std::cout << " CAT:" << m_category.mb_str(wxConvLocal) << std::endl; continue; }; pos=lowerLine.Find(tagName); if(pos!=wxNOT_FOUND) { m_name = line.Mid(pos+1+tagName.length()).Trim().Trim(false); foundName=true; std::cout << " NAM:" << m_name.mb_str(wxConvLocal) << std::endl; continue; }; pos=lowerLine.Find(tagDescription); if(pos!=wxNOT_FOUND) { m_description = line.Mid(pos+1+tagDescription.length()).Trim().Trim(false); foundDescription=true; continue; }; }; }; const bool PluginItem::IsAPIValid() const { return m_validAPI; }; const wxString PluginItem::GetCategory() const { return m_category; }; const wxFileName PluginItem::GetFilename() const { return m_filename; }; const wxString PluginItem::GetName() const { return m_name; }; const wxString PluginItem::GetDescription() const { return m_description; };