added Plugin Interface

This commit is contained in:
louis
2014-11-15 09:47:22 +01:00
parent 7e7d7c994c
commit be3b49f695
36 changed files with 1907 additions and 18 deletions

View File

@@ -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) {

View File

@@ -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;

View File

@@ -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);

View File

@@ -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;

View File

@@ -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);
};