summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlouis <louis.braun@gmx.de>2015-05-22 13:35:01 +0200
committerlouis <louis.braun@gmx.de>2015-05-22 13:35:01 +0200
commit5c365b57620282a2bfc52b77a5d22aea1bbbc46b (patch)
tree00420a6ef44caefbbeb6e38880c6d09ebb8608a7
parentf483aef4a85e9451e2e348541d981b31b5af51d3 (diff)
downloadvdr-plugin-skindesigner-5c365b57620282a2bfc52b77a5d22aea1bbbc46b.tar.gz
vdr-plugin-skindesigner-5c365b57620282a2bfc52b77a5d22aea1bbbc46b.tar.bz2
added new files
-rw-r--r--libcore/skinrepo.c255
-rw-r--r--libcore/skinrepo.h67
-rw-r--r--skins/skinrepositories.xml32
3 files changed, 354 insertions, 0 deletions
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<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);
+}
+
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 <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
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 @@
+<?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>