diff options
author | louis <louis.braun@gmx.de> | 2014-11-15 09:47:22 +0100 |
---|---|---|
committer | louis <louis.braun@gmx.de> | 2014-11-15 09:47:22 +0100 |
commit | be3b49f695ca8cffef906d893fb2f6f205f75898 (patch) | |
tree | 5d10d1e1e481e22eaf84ef1d78e6625dca35377f /libtemplate | |
parent | 7e7d7c994caa612f8520a772c8dcc964a5207414 (diff) | |
download | vdr-plugin-skindesigner-be3b49f695ca8cffef906d893fb2f6f205f75898.tar.gz vdr-plugin-skindesigner-be3b49f695ca8cffef906d893fb2f6f205f75898.tar.bz2 |
added Plugin Interface
Diffstat (limited to 'libtemplate')
-rw-r--r-- | libtemplate/template.c | 19 | ||||
-rw-r--r-- | libtemplate/templateview.c | 72 | ||||
-rw-r--r-- | libtemplate/templateview.h | 11 | ||||
-rw-r--r-- | libtemplate/xmlparser.c | 64 | ||||
-rw-r--r-- | libtemplate/xmlparser.h | 2 |
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); }; |