mirror of
https://projects.vdr-developer.org/git/vdr-plugin-skindesigner.git
synced 2023-10-19 17:58:31 +02:00
added new files
This commit is contained in:
parent
f483aef4a8
commit
5c365b5762
255
libcore/skinrepo.c
Normal file
255
libcore/skinrepo.c
Normal file
@ -0,0 +1,255 @@
|
|||||||
|
#include "skinrepo.h"
|
||||||
|
#include "../libcore/helpers.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
// --- cSkinRepo -------------------------------------------------------------
|
||||||
|
|
||||||
|
cSkinRepo::cSkinRepo(void) {
|
||||||
|
name = "";
|
||||||
|
repoType = rtUndefined;
|
||||||
|
url = "";
|
||||||
|
command = "";
|
||||||
|
tempfile = "";
|
||||||
|
result = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
cSkinRepo::~cSkinRepo() {
|
||||||
|
}
|
||||||
|
|
||||||
|
void cSkinRepo::Install(string path) {
|
||||||
|
if (Running())
|
||||||
|
return;
|
||||||
|
if (repoType == rtGit) {
|
||||||
|
|
||||||
|
command = *cString::sprintf("git clone --progress %s %s%s", url.c_str(), path.c_str(), name.c_str());
|
||||||
|
tempfile = *cString::sprintf("gitclone_%s_%ld.out", name.c_str(), time(0));
|
||||||
|
|
||||||
|
Start();
|
||||||
|
|
||||||
|
} else if (repoType == rtZipUrl) {
|
||||||
|
|
||||||
|
//TODO
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void cSkinRepo::Action(void) {
|
||||||
|
if (command.size() < 1)
|
||||||
|
return;
|
||||||
|
if (tempfile.size() > 0) {
|
||||||
|
command = *cString::sprintf("%s > /tmp/%s 2>&1", command.c_str(), tempfile.c_str());
|
||||||
|
}
|
||||||
|
dsyslog("skindesigner: executing %s", command.c_str());
|
||||||
|
result = system (command.c_str());
|
||||||
|
dsyslog("skindesigner: execution done, result: %d", result);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cSkinRepo::Debug() {
|
||||||
|
string strRepoType = "Undefined";
|
||||||
|
if (repoType == rtGit)
|
||||||
|
strRepoType = "Git";
|
||||||
|
else if (repoType == rtZipUrl)
|
||||||
|
strRepoType = "ZipUrl";
|
||||||
|
dsyslog("skindesigner: --- skinrepo %s, Type %s ---", name.c_str(), strRepoType.c_str());
|
||||||
|
dsyslog("skindesigner: url %s", url.c_str());
|
||||||
|
if (specialFonts.size() > 0) {
|
||||||
|
for (vector<string>::iterator it = specialFonts.begin(); it != specialFonts.end(); it++) {
|
||||||
|
dsyslog("skindesigner: special font %s", (*it).c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (supportedPlugins.size() > 0) {
|
||||||
|
for (vector<string>::iterator it = supportedPlugins.begin(); it != supportedPlugins.end(); it++) {
|
||||||
|
dsyslog("skindesigner: supported plugin %s", (*it).c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (screenshots.size() > 0) {
|
||||||
|
for (vector<pair<string,string> >::iterator it = screenshots.begin(); it != screenshots.end(); it++) {
|
||||||
|
string desc = (it->first).c_str();
|
||||||
|
string url = (it->second).c_str();
|
||||||
|
dsyslog("skindesigner: screenshot \"%s\", url %s", desc.c_str(), url.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- cSkinRepos -------------------------------------------------------------
|
||||||
|
|
||||||
|
cSkinRepos::cSkinRepos(void) {
|
||||||
|
repoFile = "skinrepositories.xml";
|
||||||
|
doc = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
cSkinRepos::~cSkinRepos() {
|
||||||
|
for (vector<cSkinRepo*>::iterator it = repos.begin(); it != repos.end(); it++) {
|
||||||
|
delete (*it);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void cSkinRepos::Read(string path) {
|
||||||
|
string filepath = path + repoFile;
|
||||||
|
esyslog("skindesigner: reading skinrepos from %s", filepath.c_str());
|
||||||
|
xmlParserCtxtPtr ctxt = xmlNewParserCtxt();
|
||||||
|
xmlNodePtr root = NULL;
|
||||||
|
|
||||||
|
doc = xmlCtxtReadFile(ctxt, filepath.c_str(), NULL, XML_PARSE_NOENT);
|
||||||
|
if (doc == NULL) {
|
||||||
|
esyslog("skindesigner: ERROR: skinrepository file %s not loaded successfully.", filepath.c_str());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
root = xmlDocGetRootElement(doc);
|
||||||
|
if (root == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (xmlStrcmp(root->name, (const xmlChar *) "skinrepositories")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
xmlNodePtr node = root->xmlChildrenNode;
|
||||||
|
while (node != NULL) {
|
||||||
|
if (node->type != XML_ELEMENT_NODE) {
|
||||||
|
node = node->next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (xmlStrcmp(node->name, (const xmlChar *) "skinrepo")) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
ReadRepository(node->xmlChildrenNode);
|
||||||
|
node = node->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (doc) xmlFreeDoc(doc);
|
||||||
|
xmlFreeParserCtxt(ctxt);
|
||||||
|
}
|
||||||
|
|
||||||
|
cSkinRepo *cSkinRepos::GetRepo(string name) {
|
||||||
|
for (vector<cSkinRepo*>::iterator it = repos.begin(); it != repos.end(); it++) {
|
||||||
|
cSkinRepo *repo = (*it);
|
||||||
|
if (!name.compare(repo->Name()))
|
||||||
|
return repo;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void cSkinRepos::Debug(void) {
|
||||||
|
for (vector<cSkinRepo*>::iterator it = repos.begin(); it != repos.end(); it++) {
|
||||||
|
(*it)->Debug();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void cSkinRepos::ReadRepository(xmlNodePtr node) {
|
||||||
|
if (!node)
|
||||||
|
return;
|
||||||
|
cSkinRepo *repo = new cSkinRepo();
|
||||||
|
while (node != NULL) {
|
||||||
|
if (node->type != XML_ELEMENT_NODE) {
|
||||||
|
node = node->next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
xmlChar *value = NULL;
|
||||||
|
//Repo Name
|
||||||
|
if (!xmlStrcmp(node->name, (const xmlChar *) "name")) {
|
||||||
|
value = xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
|
||||||
|
if (value)
|
||||||
|
repo->SetName((const char *)value);
|
||||||
|
//Repo Type
|
||||||
|
} else if (!xmlStrcmp(node->name, (const xmlChar *) "type")) {
|
||||||
|
value = xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
|
||||||
|
if (value) {
|
||||||
|
eRepoType repoType = rtUndefined;
|
||||||
|
if (!xmlStrcmp(value, (const xmlChar *) "git"))
|
||||||
|
repoType = rtGit;
|
||||||
|
else if (!xmlStrcmp(value, (const xmlChar *) "zip"))
|
||||||
|
repoType = rtZipUrl;
|
||||||
|
repo->SetRepoType(repoType);
|
||||||
|
}
|
||||||
|
//Repo URL
|
||||||
|
} else if (!xmlStrcmp(node->name, (const xmlChar *) "url")) {
|
||||||
|
value = xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
|
||||||
|
if (value)
|
||||||
|
repo->SetUrl((const char *)value);
|
||||||
|
//Repo Specialfonts
|
||||||
|
} else if (!xmlStrcmp(node->name, (const xmlChar *) "specialfonts")) {
|
||||||
|
xmlNodePtr child = node->xmlChildrenNode;
|
||||||
|
while (child != NULL) {
|
||||||
|
if (child->type != XML_ELEMENT_NODE) {
|
||||||
|
child = child->next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!xmlStrcmp(child->name, (const xmlChar *) "font")) {
|
||||||
|
xmlChar *fontvalue = NULL;
|
||||||
|
fontvalue = xmlNodeListGetString(doc, child->xmlChildrenNode, 1);
|
||||||
|
if (fontvalue) {
|
||||||
|
repo->SetSpecialFont((const char *)fontvalue);
|
||||||
|
xmlFree(fontvalue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
child = child->next;
|
||||||
|
}
|
||||||
|
//Repo supported Plugins
|
||||||
|
} else if (!xmlStrcmp(node->name, (const xmlChar *) "supportedplugins")) {
|
||||||
|
xmlNodePtr child = node->xmlChildrenNode;
|
||||||
|
while (child != NULL) {
|
||||||
|
if (child->type != XML_ELEMENT_NODE) {
|
||||||
|
child = child->next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!xmlStrcmp(child->name, (const xmlChar *) "plugin")) {
|
||||||
|
xmlChar *plugvalue = NULL;
|
||||||
|
plugvalue = xmlNodeListGetString(doc, child->xmlChildrenNode, 1);
|
||||||
|
if (plugvalue) {
|
||||||
|
repo->SetSupportedPlugin((const char *)plugvalue);
|
||||||
|
xmlFree(plugvalue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
child = child->next;
|
||||||
|
}
|
||||||
|
//Repo Screenshots
|
||||||
|
} else if (!xmlStrcmp(node->name, (const xmlChar *) "screenshots")) {
|
||||||
|
xmlNodePtr child = node->xmlChildrenNode;
|
||||||
|
while (child != NULL) {
|
||||||
|
if (child->type != XML_ELEMENT_NODE) {
|
||||||
|
child = child->next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!xmlStrcmp(child->name, (const xmlChar *) "screenshot")) {
|
||||||
|
xmlNodePtr subchild = child->xmlChildrenNode;
|
||||||
|
string desc = "";
|
||||||
|
string url = "";
|
||||||
|
while (subchild != NULL) {
|
||||||
|
if (subchild->type != XML_ELEMENT_NODE) {
|
||||||
|
subchild = subchild->next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
xmlChar *screenshotvalue = NULL;
|
||||||
|
if (!xmlStrcmp(subchild->name, (const xmlChar *) "description")) {
|
||||||
|
screenshotvalue = xmlNodeListGetString(doc, subchild->xmlChildrenNode, 1);
|
||||||
|
if (screenshotvalue) {
|
||||||
|
desc = (const char *)screenshotvalue;
|
||||||
|
xmlFree(screenshotvalue);
|
||||||
|
}
|
||||||
|
} else if (!xmlStrcmp(subchild->name, (const xmlChar *) "url")) {
|
||||||
|
screenshotvalue = xmlNodeListGetString(doc, subchild->xmlChildrenNode, 1);
|
||||||
|
if (screenshotvalue) {
|
||||||
|
url = (const char *)screenshotvalue;
|
||||||
|
xmlFree(screenshotvalue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
subchild = subchild->next;
|
||||||
|
}
|
||||||
|
repo->SetScreenshot(desc, url);
|
||||||
|
}
|
||||||
|
child = child->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (value)
|
||||||
|
xmlFree(value);
|
||||||
|
node = node->next;
|
||||||
|
|
||||||
|
}
|
||||||
|
repos.push_back(repo);
|
||||||
|
}
|
||||||
|
|
67
libcore/skinrepo.h
Normal file
67
libcore/skinrepo.h
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
#ifndef __SKINREPO_H
|
||||||
|
#define __SKINREPO_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
#include <map>
|
||||||
|
#include <set>
|
||||||
|
#include <libxml/parser.h>
|
||||||
|
#include <libxml/tree.h>
|
||||||
|
#include <libxml/xmlerror.h>
|
||||||
|
#include <vdr/plugin.h>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
enum eRepoType {
|
||||||
|
rtUndefined,
|
||||||
|
rtGit,
|
||||||
|
rtZipUrl
|
||||||
|
};
|
||||||
|
|
||||||
|
// --- cSkinRepo -------------------------------------------------------------
|
||||||
|
|
||||||
|
class cSkinRepo : public cThread {
|
||||||
|
private:
|
||||||
|
string name;
|
||||||
|
eRepoType repoType;
|
||||||
|
string url;
|
||||||
|
vector<string> specialFonts;
|
||||||
|
vector<string> supportedPlugins;
|
||||||
|
vector< pair < string, string > > screenshots;
|
||||||
|
//helpers for execution
|
||||||
|
string command;
|
||||||
|
string tempfile;
|
||||||
|
int result;
|
||||||
|
virtual void Action(void);
|
||||||
|
public:
|
||||||
|
cSkinRepo(void);
|
||||||
|
virtual ~cSkinRepo(void);
|
||||||
|
void SetName(string name) { this->name = name; };
|
||||||
|
void SetRepoType(eRepoType type) { this->repoType = type; };
|
||||||
|
void SetUrl(string url) { this->url = url; };
|
||||||
|
void SetSpecialFont(string font) { specialFonts.push_back(font); };
|
||||||
|
void SetSupportedPlugin(string plugin) { supportedPlugins.push_back(plugin); };
|
||||||
|
void SetScreenshot(string desc, string url) { screenshots.push_back(pair<string, string>(desc, url)); };
|
||||||
|
string Name(void) { return name; };
|
||||||
|
void Install(string path);
|
||||||
|
bool InstallationFinished(void) { return !(Running()); };
|
||||||
|
void Debug(void);
|
||||||
|
};
|
||||||
|
|
||||||
|
// --- cSkinRepos -------------------------------------------------------------
|
||||||
|
|
||||||
|
class cSkinRepos {
|
||||||
|
private:
|
||||||
|
string repoFile;
|
||||||
|
xmlDocPtr doc;
|
||||||
|
vector<cSkinRepo*> repos;
|
||||||
|
void ReadRepository(xmlNodePtr node);
|
||||||
|
public:
|
||||||
|
cSkinRepos(void);
|
||||||
|
virtual ~cSkinRepos(void);
|
||||||
|
void Read(string path);
|
||||||
|
cSkinRepo *GetRepo(string name);
|
||||||
|
void Debug(void);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //__SKINREPO_H
|
32
skins/skinrepositories.xml
Normal file
32
skins/skinrepositories.xml
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
|
<skinrepositories>
|
||||||
|
<skinrepo>
|
||||||
|
<name>Holo</name>
|
||||||
|
<type>git</type>
|
||||||
|
<url>https://github.com/CReimer/Holo</url>
|
||||||
|
<specialfonts>
|
||||||
|
<font>Roboto</font>
|
||||||
|
<font>Gedöns</font>
|
||||||
|
</specialfonts>
|
||||||
|
</skinrepo>
|
||||||
|
<skinrepo>
|
||||||
|
<name>Tryouts</name>
|
||||||
|
<type>git</type>
|
||||||
|
<url>https://github.com/BooStars/tryouts</url>
|
||||||
|
<screenshots>
|
||||||
|
<screenshot>
|
||||||
|
<description>Main Menu</description>
|
||||||
|
<url>http://www.vdr-portal.de/index.php?page=AttachmentattachmentID=37054h=1e3680e599888c373fa21ad2fcbb9e4c2c73a620</url>
|
||||||
|
</screenshot>
|
||||||
|
<screenshot>
|
||||||
|
<description>display Channel</description>
|
||||||
|
<url>http://www.vdr-portal.de/index.php?page=AttachmentattachmentID=37056h=e7cd1c6d2bd8042b6c08629c8f5d4711e8196e5f</url>
|
||||||
|
</screenshot>
|
||||||
|
</screenshots>
|
||||||
|
<supportedplugins>
|
||||||
|
<plugin>Weatherforecast</plugin>
|
||||||
|
<plugin>TVGuideNG</plugin>
|
||||||
|
</supportedplugins>
|
||||||
|
</skinrepo>
|
||||||
|
</skinrepositories>
|
Loading…
Reference in New Issue
Block a user