summaryrefslogtreecommitdiff
path: root/libtemplate
diff options
context:
space:
mode:
authorlouis <louis.braun@gmx.de>2014-11-15 09:47:22 +0100
committerlouis <louis.braun@gmx.de>2014-11-15 09:47:22 +0100
commitbe3b49f695ca8cffef906d893fb2f6f205f75898 (patch)
tree5d10d1e1e481e22eaf84ef1d78e6625dca35377f /libtemplate
parent7e7d7c994caa612f8520a772c8dcc964a5207414 (diff)
downloadvdr-plugin-skindesigner-be3b49f695ca8cffef906d893fb2f6f205f75898.tar.gz
vdr-plugin-skindesigner-be3b49f695ca8cffef906d893fb2f6f205f75898.tar.bz2
added Plugin Interface
Diffstat (limited to 'libtemplate')
-rw-r--r--libtemplate/template.c19
-rw-r--r--libtemplate/templateview.c72
-rw-r--r--libtemplate/templateview.h11
-rw-r--r--libtemplate/xmlparser.c64
-rw-r--r--libtemplate/xmlparser.h2
5 files changed, 165 insertions, 3 deletions
diff --git a/libtemplate/template.c b/libtemplate/template.c
index b5889ad..4edbe4a 100644
--- a/libtemplate/template.c
+++ b/libtemplate/template.c
@@ -53,7 +53,24 @@ bool cTemplate::ReadFromXML(void) {
if (!parser.ParseView()) {
return false;
}
- return true;
+ //read additional plugin templates
+ bool ok = true;
+ if (viewType == vtDisplayMenu) {
+ config.InitPluginIterator();
+ map <int,string> *plugTemplates = NULL;
+ string plugName;
+ while ( plugTemplates = config.GetPluginTemplates(plugName) ) {
+ for (map <int,string>::iterator it = plugTemplates->begin(); it != plugTemplates->end(); it++) {
+ int templateNumber = it->first;
+ stringstream templateName;
+ templateName << "plug-" << plugName << "-" << it->second.c_str();
+ if (parser.ReadPluginView(plugName, templateNumber, templateName.str())) {
+ ok = parser.ParsePluginView(plugName, templateNumber);
+ }
+ }
+ }
+ }
+ return ok;
}
void cTemplate::SetGlobals(cGlobals *globals) {
diff --git a/libtemplate/templateview.c b/libtemplate/templateview.c
index 1dabe8c..e53d215 100644
--- a/libtemplate/templateview.c
+++ b/libtemplate/templateview.c
@@ -26,6 +26,17 @@ cTemplateView::~cTemplateView() {
delete *it;
}
+ for (map < eSubView, cTemplateView* >::iterator it = subViews.begin(); it != subViews.end(); it++) {
+ delete it->second;
+ }
+
+ for (map < string, map< int, cTemplateView*> >::iterator it = pluginViews.begin(); it != pluginViews.end(); it++) {
+ map< int, cTemplateView*> plugViews = it->second;
+ for (map< int, cTemplateView*>::iterator it2 = plugViews.begin(); it2 != plugViews.end(); it2++) {
+ delete it2->second;
+ }
+ }
+
if (parameters)
delete parameters;
@@ -93,6 +104,22 @@ cTemplateView *cTemplateView::GetSubView(eSubView sv) {
return hit->second;
}
+cTemplateView *cTemplateView::GetPluginView(string pluginName, int pluginMenu) {
+ map < string, map< int, cTemplateView*> >::iterator hit = pluginViews.find(pluginName);
+
+ if (hit == pluginViews.end())
+ return NULL;
+
+ map< int, cTemplateView*> plugViews = hit->second;
+ map< int, cTemplateView*>::iterator hit2 = plugViews.find(pluginMenu);
+
+ if (hit2 == plugViews.end())
+ return NULL;
+
+ return hit2->second;
+}
+
+
void cTemplateView::InitViewTabIterator(void) {
vtIt = viewTabs.begin();
}
@@ -388,6 +415,15 @@ void cTemplateView::PreCache(bool isSubview) {
subView->PreCache(true);
}
+ //Cache Plugin Subviews
+ for (map < string, map< int, cTemplateView*> >::iterator it = pluginViews.begin(); it != pluginViews.end(); it++) {
+ map< int, cTemplateView*> plugViews = it->second;
+ for (map< int, cTemplateView*>::iterator it2 = plugViews.begin(); it2 != plugViews.end(); it2++) {
+ cTemplateView *plugView = it2->second;
+ plugView->SetContainer(0, 0, osdWidth, osdHeight);
+ plugView->PreCache(true);
+ }
+ }
}
void cTemplateView::Debug(void) {
@@ -418,6 +454,15 @@ void cTemplateView::Debug(void) {
cTemplateView *subView = it->second;
subView->Debug();
}
+
+ for (map < string, map< int, cTemplateView*> >::iterator it = pluginViews.begin(); it!= pluginViews.end(); it++) {
+ esyslog("skindesigner: ++++++++ Plugin: %s", it->first.c_str());
+ map< int, cTemplateView*> plugViews = it->second;
+ for (map< int, cTemplateView*>::iterator it2 = plugViews.begin(); it2 != plugViews.end(); it2++) {
+ esyslog("skindesigner: Tmpl %d", it2->first);
+ ((cTemplateView*)it2->second)->Debug();
+ }
+ }
}
@@ -934,6 +979,19 @@ cTemplateViewMenu::cTemplateViewMenu(void) {
attributes.insert("scrollheight");
funcsAllowed.insert(pair< string, set<string> >("tab", attributes));
+ //definition of allowed parameters for plugin menus
+ attributes.clear();
+ attributes.insert("x");
+ attributes.insert("y");
+ attributes.insert("width");
+ attributes.insert("height");
+ attributes.insert("fadetime");
+ attributes.insert("scaletvx");
+ attributes.insert("scaletvy");
+ attributes.insert("scaletvwidth");
+ attributes.insert("scaletvheight");
+ funcsAllowed.insert(pair< string, set<string> >("menuplugin", attributes));
+
SetSubViews();
SetViewElements();
SetViewLists();
@@ -1120,6 +1178,20 @@ void cTemplateViewMenu::AddSubView(string sSubView, cTemplateView *subView) {
subViews.insert(pair<eSubView, cTemplateView*>(sv, subView));
}
+void cTemplateViewMenu::AddPluginView(string plugName, int templNo, cTemplateView *plugView) {
+ plugView->SetGlobals(globals);
+
+ map < string, map< int, cTemplateView*> >::iterator hit = pluginViews.find(plugName);
+
+ if (hit == pluginViews.end()) {
+ map< int, cTemplateView*> plugTemplates;
+ plugTemplates.insert(pair<int, cTemplateView*>(templNo, plugView));
+ pluginViews.insert(pair< string, map< int, cTemplateView*> >(plugName, plugTemplates));
+ } else {
+ hit->second.insert(pair<int, cTemplateView*>(templNo, plugView));
+ }
+}
+
void cTemplateViewMenu::AddPixmap(string sViewElement, cTemplatePixmap *pix, bool debugViewElement) {
eViewElement ve = veUndefined;
diff --git a/libtemplate/templateview.h b/libtemplate/templateview.h
index 6603275..828eb21 100644
--- a/libtemplate/templateview.h
+++ b/libtemplate/templateview.h
@@ -32,7 +32,8 @@ enum eSubView {
svMenuChannels,
svMenuDetailedEpg,
svMenuDetailedRecording,
- svMenuDetailedText
+ svMenuDetailedText,
+ svMenuPlugin,
};
class cTemplateView {
@@ -51,6 +52,7 @@ protected:
map < eViewList, cTemplateViewList* > viewLists;
map < eSubView, cTemplateView* > subViews;
vector< cTemplateViewTab* > viewTabs;
+ map < string, map< int, cTemplateView*> > pluginViews;
//helpers to iterate data structures
map < eViewElement, cTemplateViewElement* >::iterator veIt;
map < eViewList, cTemplateViewList* >::iterator vlIt;
@@ -68,7 +70,8 @@ public:
virtual string GetSubViewName(eSubView sv) { return ""; };
virtual string GetViewElementName(eViewElement ve) { return ""; };
virtual string GetViewListName(eViewList vl) { return ""; };
- virtual void AddSubView(string sSubView, cTemplateView *subView) {};
+ virtual void AddSubView(string sSubView, cTemplateView *subView) {};
+ virtual void AddPluginView(string plugName, int templNo, cTemplateView *plugView) {};
virtual void AddPixmap(string sViewElement, cTemplatePixmap *pix, bool debugViewElement) {};
virtual void AddViewList(string sViewList, cTemplateViewList *viewList) {};
virtual void AddViewTab(cTemplateViewTab *viewTab) {};
@@ -84,6 +87,7 @@ public:
cTemplateViewList *GetViewList(eViewList vl);
void InitViewListIterator(void);
cTemplateViewList *GetNextViewList(void);
+ bool IsListView(void) { return viewLists.size() > 0 ? true : false; };
//access tabs
void InitViewTabIterator(void);
cTemplateViewTab *GetNextViewTab(void);
@@ -91,6 +95,8 @@ public:
cTemplateView *GetSubView(eSubView sv);
void InitSubViewIterator(void);
cTemplateView *GetNextSubView(void);
+ //access plugin views
+ cTemplateView *GetPluginView(string pluginName, int pluginMenu);
//Getter Functions
const char *GetViewName(void) { return viewName.c_str(); };
int GetNumericParameter(eParamType type);
@@ -140,6 +146,7 @@ public:
string GetViewElementName(eViewElement ve);
string GetViewListName(eViewList vl);
void AddSubView(string sSubView, cTemplateView *subView);
+ void AddPluginView(string plugName, int templNo, cTemplateView *plugView);
void AddPixmap(string viewElement, cTemplatePixmap *pix, bool debugViewElement);
void AddViewList(string sViewList, cTemplateViewList *viewList);
void AddViewTab(cTemplateViewTab *viewTab);
diff --git a/libtemplate/xmlparser.c b/libtemplate/xmlparser.c
index 0e2c132..4b8e85a 100644
--- a/libtemplate/xmlparser.c
+++ b/libtemplate/xmlparser.c
@@ -1,5 +1,6 @@
#include "xmlparser.h"
#include "../config.h"
+#include "../libcore/helpers.h"
using namespace std;
@@ -61,6 +62,33 @@ bool cXmlParser::ReadView(cTemplateView *view, string xmlFile) {
return true;
}
+bool cXmlParser::ReadPluginView(string plugName, int templateNumber, string templateName) {
+
+ string xmlPath = GetPath(templateName);
+
+ if (!FileExists(xmlPath) || ctxt == NULL) {
+ return false;
+ }
+ DeleteDocument();
+ doc = xmlCtxtReadFile(ctxt, xmlPath.c_str(), NULL, XML_PARSE_NOENT | XML_PARSE_DTDVALID);
+
+ if (doc == NULL) {
+ return false;
+ }
+ if (ctxt->valid == 0) {
+ esyslog("skindesigner: Failed to validate %s", xmlPath.c_str());
+ return false;
+ }
+
+ root = xmlDocGetRootElement(doc);
+
+ if (root == NULL) {
+ return false;
+ }
+
+ return true;
+}
+
bool cXmlParser::ReadGlobals(cGlobals *globals, string xmlFile) {
this->globals = globals;
@@ -132,6 +160,42 @@ bool cXmlParser::ParseView(void) {
}
+bool cXmlParser::ParsePluginView(string plugName, int templateNumber) {
+
+ cTemplateView *plugView = new cTemplateViewMenu();
+ view->AddPluginView(plugName, templateNumber, plugView);
+
+ vector<pair<string, string> > attribs;
+ ParseAttributes(root->properties, root, attribs);
+
+ plugView->SetParameters(attribs);
+
+ xmlNodePtr childNode = root->xmlChildrenNode;
+
+ while (childNode != NULL) {
+
+ if (childNode->type != XML_ELEMENT_NODE) {
+ childNode = childNode->next;
+ continue;
+ }
+
+ if (plugView->ValidViewElement((const char*)childNode->name)) {
+ bool debugViewElement = DebugViewElement(childNode);
+ ParseViewElement(childNode->name, childNode->xmlChildrenNode, debugViewElement, plugView);
+ } else if (plugView->ValidViewList((const char*)childNode->name)) {
+ ParseViewList(childNode, plugView);
+ } else if (!xmlStrcmp(childNode->name, (const xmlChar *) "tab")) {
+ ParseViewTab(childNode, plugView);
+ } else {
+ return false;
+ }
+
+ childNode = childNode->next;
+ }
+
+ return true;
+}
+
bool cXmlParser::ParseGlobals(void) {
xmlNodePtr node = root->xmlChildrenNode;
diff --git a/libtemplate/xmlparser.h b/libtemplate/xmlparser.h
index ecdcca3..3156042 100644
--- a/libtemplate/xmlparser.h
+++ b/libtemplate/xmlparser.h
@@ -47,8 +47,10 @@ public:
cXmlParser(void);
virtual ~cXmlParser(void);
bool ReadView(cTemplateView *view, string xmlFile);
+ bool ReadPluginView(string plugName, int templateNumber, string templateName);
bool ReadGlobals(cGlobals *globals, string xmlFile);
bool ParseView(void);
+ bool ParsePluginView(string plugName, int templateNumber);
bool ParseGlobals(void);
void DeleteDocument(void);
};