Read plugin list as json format (in progress)

This commit is contained in:
Don HO 2017-09-17 00:52:35 +02:00
parent ef3ad5d909
commit e2f5f51fbc
3 changed files with 64 additions and 128 deletions

View File

@ -70,16 +70,14 @@ void Notepad_plus::command(int id)
case IDM_FILE_NEW:
{
fileNew();
/*
bool isFirstTime = not _pluginsAdminDlg.isCreated();
bool isFirstTime = ! _pluginsAdminDlg.isCreated();
_pluginsAdminDlg.setPluginsManager(&_pluginsManager);
_pluginsAdminDlg.doDialog(_nativeLangSpeaker.isRTL());
if (isFirstTime)
{
_nativeLangSpeaker.changeConfigLang(_pluginsAdminDlg.getHSelf());
_pluginsAdminDlg.downloadPluginList();
_pluginsAdminDlg.loadFomList();
_pluginsAdminDlg.updateListAndLoadFromJson();
}
*/
}

View File

@ -25,7 +25,10 @@
// along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#include "json.hpp"
#include <algorithm>
#include <iostream>
#include <fstream>
#include <string>
#include <cctype>
#include <shlobj.h>
@ -38,6 +41,7 @@
#include "md5.h"
using namespace std;
using nlohmann::json;
void Version::setVersionFrom(generic_string filePath)
{
@ -350,7 +354,55 @@ bool PluginsAdminDlg::removePlugins()
return true;
}
bool PluginsAdminDlg::downloadPluginList()
bool loadFromJson(std::vector<PluginUpdateInfo> & pl, const json& j)
{
if (j.empty())
return false;
WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance();
json jArray = j["npp-plugins"];
if (jArray.empty() || jArray.type() != json::value_t::array)
return false;
for (auto& i : jArray)
{
PluginUpdateInfo pi;
string s = i["folder-name"];
std::wstring val = wmc->char2wchar(s.c_str(), CP_ACP);
pi.name = val;
s = i["display-name"];
val = wmc->char2wchar(s.c_str(), CP_ACP);
pi.alias = val;
s = i["author"];
val = wmc->char2wchar(s.c_str(), CP_ACP);
pi.author = val;
s = i["description"];
val = wmc->char2wchar(s.c_str(), CP_ACP);
pi.description = val;
s = i["repository"];
val = wmc->char2wchar(s.c_str(), CP_ACP);
pi.repository = val;
s = i["homepage"];
val = wmc->char2wchar(s.c_str(), CP_ACP);
pi.homepage = val;
s = i["version"];
val = wmc->char2wchar(s.c_str(), CP_ACP);
pi.version = val;
pl.push_back(pi);
}
return true;
}
bool PluginsAdminDlg::updateListAndLoadFromJson()
{
// check on default location : %APPDATA%\Notepad++\plugins\config\pl\pl.json or NPP_INST_DIR\plugins\config\pl\pl.json
@ -358,7 +410,7 @@ bool PluginsAdminDlg::downloadPluginList()
// if absent then download it
// check the update ofpl.json
// check the update of pl.json
// download update if present
@ -366,123 +418,13 @@ bool PluginsAdminDlg::downloadPluginList()
// check integrity of pl.json
// load pl.json
//
generic_string nppPluginListJsonPath = TEXT("C:\\tmp\\nppPluginList.json");
ifstream nppPluginListJson(nppPluginListJsonPath);
json pluginsJson;
nppPluginListJson >> pluginsJson;
generic_string pluginListXmlPath(TEXT("c:\\tmp\\pl.xml"));
_pPluginsXmlDoc = new TiXmlDocument(pluginListXmlPath);
if (not _pPluginsXmlDoc->LoadFile())
return false;
return true;
}
bool PluginsAdminDlg::readFromXml()
{
TiXmlNode *root = _pPluginsXmlDoc->FirstChild(TEXT("NotepadPlus"));
if (not root)
return false;
_availablePluginList.clear();
for (TiXmlNode *childNode = root->FirstChildElement(TEXT("plugin"));
childNode;
childNode = childNode->NextSibling(TEXT("plugin")))
{
PluginUpdateInfo pui;
const TCHAR *name = (childNode->ToElement())->Attribute(TEXT("name"));
if (name)
{
pui.name = name;
}
else
{
continue;
}
const TCHAR *version = (childNode->ToElement())->Attribute(TEXT("version"));
if (version)
{
pui.version = version;
}
else
{
continue;
}
const TCHAR *homepage = (childNode->ToElement())->Attribute(TEXT("homepage"));
if (homepage)
{
pui.homepage = homepage;
}
const TCHAR *sourceUrl = (childNode->ToElement())->Attribute(TEXT("sourceUrl"));
if (sourceUrl)
{
pui.sourceUrl = sourceUrl;
}
const TCHAR *description = (childNode->ToElement())->Attribute(TEXT("description"));
if (description)
{
pui.description = description;
}
const TCHAR *author = (childNode->ToElement())->Attribute(TEXT("author"));
if (author)
{
pui.author = author;
}
else
{
continue;
}
const TCHAR *md5 = (childNode->ToElement())->Attribute(TEXT("md5"));
if (md5)
{
pui.md5 = md5;
}
else
{
continue;
}
const TCHAR *alias = (childNode->ToElement())->Attribute(TEXT("alias"));
if (alias)
{
pui.alias = alias;
}
const TCHAR *download = (childNode->ToElement())->Attribute(TEXT("download"));
if (download)
{
pui.download = download;
}
else
{
continue;
}
_availablePluginList.push_back(pui);
}
return true;
}
bool PluginsAdminDlg::loadFomList()
{
if (not _pPluginsXmlDoc)
return false;
if (not readFromXml())
return false;
size_t i = 0;
// all - installed = available
for (auto it = _availablePluginList.begin(); it != _availablePluginList.end(); ++it)
{
vector<generic_string> values2Add;
values2Add.push_back(it->name);
values2Add.push_back(it->version);
values2Add.push_back(TEXT("Yes"));
_availableListView.addLine(values2Add, i++);
}
getLoadedPluginInfos();
loadFromJson(_availablePluginList, pluginsJson);
return true;
}

View File

@ -46,7 +46,7 @@ struct PluginUpdateInfo
generic_string author;
generic_string md5;
generic_string alias;
generic_string download;
generic_string repository;
generic_string describe();
};
@ -98,7 +98,6 @@ public :
_availableListView.destroy();
_updateListView.destroy();
_installedListView.destroy();
if (_pPluginsXmlDoc) delete _pPluginsXmlDoc;
}
void init(HINSTANCE hInst, HWND parent) {
Window::init(hInst, parent);
@ -121,8 +120,7 @@ public :
void switchDialog(int indexToSwitch);
bool downloadPluginList(); // call GitUup for the 1st time
bool loadFomList();
bool updateListAndLoadFromJson(); // call GitUup for the 1st time
void setPluginsManager(PluginsManager *pluginsManager) { _pPluginsManager = pluginsManager; };
void setAdminMode(bool isAdm) { _nppCurrentStatus._isAdminMode = isAdm; };
@ -143,7 +141,6 @@ private :
std::vector<PluginUpdateInfo> _updatePluginList;
std::vector<PluginUpdateInfo> _installedPluginList;
TiXmlDocument *_pPluginsXmlDoc = nullptr;
PluginsManager *_pPluginsManager = nullptr;
std::vector<LoadedPluginInfo> _loadedPluginInfos;
@ -151,7 +148,6 @@ private :
NppCurrentStatus _nppCurrentStatus;
void collectNppCurrentStatusInfos();
bool readFromXml();
bool searchInPlugins(bool isNextMode) const;
const bool inNames = true;
const bool inDescs = false;