mirror of
https://projects.vdr-developer.org/git/vdr-plugin-skindesigner.git
synced 2023-10-19 15:58:31 +00:00
added Plugin Interface
This commit is contained in:
@@ -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) {
|
||||
|
@@ -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;
|
||||
|
||||
|
@@ -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);
|
||||
|
@@ -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;
|
||||
|
||||
|
@@ -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);
|
||||
};
|
||||
|
Reference in New Issue
Block a user