From 5c365b57620282a2bfc52b77a5d22aea1bbbc46b Mon Sep 17 00:00:00 2001 From: louis Date: Fri, 22 May 2015 13:35:01 +0200 Subject: [PATCH] added new files --- libcore/skinrepo.c | 255 +++++++++++++++++++++++++++++++++++++ libcore/skinrepo.h | 67 ++++++++++ skins/skinrepositories.xml | 32 +++++ 3 files changed, 354 insertions(+) create mode 100644 libcore/skinrepo.c create mode 100644 libcore/skinrepo.h create mode 100644 skins/skinrepositories.xml diff --git a/libcore/skinrepo.c b/libcore/skinrepo.c new file mode 100644 index 0000000..1d5e3e4 --- /dev/null +++ b/libcore/skinrepo.c @@ -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::iterator it = specialFonts.begin(); it != specialFonts.end(); it++) { + dsyslog("skindesigner: special font %s", (*it).c_str()); + } + } + if (supportedPlugins.size() > 0) { + for (vector::iterator it = supportedPlugins.begin(); it != supportedPlugins.end(); it++) { + dsyslog("skindesigner: supported plugin %s", (*it).c_str()); + } + } + if (screenshots.size() > 0) { + for (vector >::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::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::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::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); +} + diff --git a/libcore/skinrepo.h b/libcore/skinrepo.h new file mode 100644 index 0000000..c3daaf0 --- /dev/null +++ b/libcore/skinrepo.h @@ -0,0 +1,67 @@ +#ifndef __SKINREPO_H +#define __SKINREPO_H + +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + +enum eRepoType { + rtUndefined, + rtGit, + rtZipUrl +}; + +// --- cSkinRepo ------------------------------------------------------------- + +class cSkinRepo : public cThread { +private: + string name; + eRepoType repoType; + string url; + vector specialFonts; + vector 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(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 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 diff --git a/skins/skinrepositories.xml b/skins/skinrepositories.xml new file mode 100644 index 0000000..051471d --- /dev/null +++ b/skins/skinrepositories.xml @@ -0,0 +1,32 @@ + + + + + Holo + git + https://github.com/CReimer/Holo + + Roboto + Gedöns + + + + Tryouts + git + https://github.com/BooStars/tryouts + + + Main Menu + http://www.vdr-portal.de/index.php?page=AttachmentattachmentID=37054h=1e3680e599888c373fa21ad2fcbb9e4c2c73a620 + + + display Channel + http://www.vdr-portal.de/index.php?page=AttachmentattachmentID=37056h=e7cd1c6d2bd8042b6c08629c8f5d4711e8196e5f + + + + Weatherforecast + TVGuideNG + + +