summaryrefslogtreecommitdiff
path: root/libtemplate
diff options
context:
space:
mode:
authorlouis <louis.braun@gmx.de>2015-01-24 10:47:47 +0100
committerlouis <louis.braun@gmx.de>2015-01-24 10:47:47 +0100
commita74cb93163146e547abc641638874697904672e5 (patch)
tree5ade879d4ad7808cfb8eca6ad2bd40636a4fa22b /libtemplate
parent5733a499407a11b095887e06df09c4e5d6debeda (diff)
downloadvdr-plugin-skindesigner-a74cb93163146e547abc641638874697904672e5.tar.gz
vdr-plugin-skindesigner-a74cb93163146e547abc641638874697904672e5.tar.bz2
introduced globals.xml in skinpath, theme.xml in theme path
Diffstat (limited to 'libtemplate')
-rw-r--r--libtemplate/globals.c153
-rw-r--r--libtemplate/globals.h26
-rw-r--r--libtemplate/parameter.c43
-rw-r--r--libtemplate/templatefunction.c36
-rw-r--r--libtemplate/templateview.h4
-rw-r--r--libtemplate/templateviewlist.c27
-rw-r--r--libtemplate/xmlparser.c46
-rw-r--r--libtemplate/xmlparser.h2
8 files changed, 227 insertions, 110 deletions
diff --git a/libtemplate/globals.c b/libtemplate/globals.c
index 9a94b4f..36e2c19 100644
--- a/libtemplate/globals.c
+++ b/libtemplate/globals.c
@@ -1,5 +1,6 @@
#include "globals.h"
#include "xmlparser.h"
+#include "../config.h"
#include <locale.h>
cGlobals::cGlobals(void) {
@@ -11,15 +12,134 @@ cGlobals::cGlobals(void) {
}
bool cGlobals::ReadFromXML(void) {
+ //globals.xml is mandatory
string xmlFile = "globals.xml";
cXmlParser parser;
- if (!parser.ReadGlobals(this, xmlFile))
+ if (!parser.ReadGlobals(this, xmlFile, true))
return false;
if (!parser.ParseGlobals())
return false;
+ //theme.xml is optional
+ xmlFile = "theme.xml";
+ if (parser.ReadGlobals(this, xmlFile, false)) {
+ parser.ParseGlobals();
+ }
return true;
}
+void cGlobals::AddColor(string &name, tColor &col) {
+ colors.erase(name);
+ colors.insert(pair<string, tColor>(name, col));
+}
+
+bool cGlobals::GetColor(string &name, tColor &col) {
+ int size = name.size();
+ if (size < 2)
+ return false;
+ string nameCutted = name.substr(1, size-2);
+ map <string, tColor>::iterator hit = colors.find(nameCutted);
+ if (hit != colors.end()) {
+ col = hit->second;
+ return true;
+ }
+ return false;
+}
+
+void cGlobals::AddFont(string &name, string &font) {
+ fonts.erase(name);
+ fonts.insert(pair<string, string>(name, font));
+}
+
+bool cGlobals::GetFont(string name, string &font) {
+ int size = name.size();
+ if (size < 2)
+ return false;
+ string nameCutted = name.substr(1, size-2);
+ map<string,string>::iterator hit = fonts.find(nameCutted);
+ if (hit != fonts.end()) {
+ font = hit->second;
+ return true;
+ }
+ return false;
+}
+
+void cGlobals::AddInt(string &name, int value) {
+ intVars.erase(name);
+ intVars.insert(pair<string, int>(name, value));
+}
+
+void cGlobals::ReplaceIntVars(string &value) {
+ for (map<string, int>::iterator it = intVars.begin(); it != intVars.end(); it++) {
+ stringstream sToken;
+ sToken << "{" << it->first << "}";
+ string token = sToken.str();
+ size_t foundToken = value.find(token);
+ if (foundToken != string::npos) {
+ stringstream st;
+ st << it->second;
+ value = value.replace(foundToken, token.size(), st.str());
+ }
+ }
+}
+
+bool cGlobals::GetInt(string name, int &val) {
+ map < string, int >::iterator hit = intVars.find(name);
+ if (hit != intVars.end()) {
+ val = hit->second;
+ return true;
+ }
+ return false;
+}
+
+void cGlobals::AddDouble(string &name, string &value) {
+ doubleVars.erase(name);
+ if (config.replaceDecPoint) {
+ if (value.find_first_of('.') != string::npos) {
+ std::replace( value.begin(), value.end(), '.', config.decPoint);
+ }
+ }
+ double val = atof(value.c_str());
+ doubleVars.insert(pair<string, double>(name, val));
+}
+
+void cGlobals::ReplaceDoubleVars(string &value) {
+ for (map<string, double>::iterator it = doubleVars.begin(); it != doubleVars.end(); it++) {
+ stringstream sToken;
+ sToken << "{" << it->first << "}";
+ string token = sToken.str();
+ size_t foundToken = value.find(token);
+ if (foundToken != string::npos) {
+ stringstream st;
+ st << it->second;
+ string doubleVal = st.str();
+ value = value.replace(foundToken, token.size(), doubleVal);
+ }
+ }
+}
+
+void cGlobals::AddString(string &name, string &value) {
+ stringVars.erase(name);
+ stringVars.insert(pair<string, string>(name, value));
+}
+
+void cGlobals::ReplaceStringVars(string &value) {
+ for (map<string,string>::iterator it = stringVars.begin(); it != stringVars.end(); it++) {
+ stringstream sToken;
+ sToken << "{" << it->first << "}";
+ string token = sToken.str();
+ size_t foundToken = value.find(token);
+ if (foundToken != string::npos) {
+ value = value.replace(foundToken, token.size(), it->second);
+ }
+ }
+
+}
+
+bool cGlobals::AddTranslation(string name, map < string, string > transl) {
+ translations.erase(name);
+ translations.insert(pair<string, map < string, string > >(name, transl));
+}
+
bool cGlobals::Translate(string text, string &translation) {
string transStart = "{tr(";
string transEnd = ")}";
@@ -63,6 +183,34 @@ string cGlobals::DoTranslate(string token) {
return translation;
}
+void cGlobals::AddCustomInt(string &name, int value) {
+ customIntTokens.erase(name);
+ customIntTokens.insert(pair<string,int>(name, value));
+}
+
+void cGlobals::AddCustomString(string &name, string &value) {
+ customStringTokens.erase(name);
+ customStringTokens.insert(pair<string,string>(name, value));
+}
+
+bool cGlobals::GetCustomInt(string name, int &val) {
+ map < string, int >::iterator hit = customIntTokens.find(name);
+ if (hit != customIntTokens.end()) {
+ val = hit->second;
+ return true;
+ }
+ return false;
+}
+
+void cGlobals::ListCustomTokens(void) {
+ for (map<string, string>::iterator it = customStringTokens.begin(); it != customStringTokens.end(); it++) {
+ dsyslog("skindesigner: custom string token \"%s\" = \"%s\"", (it->first).c_str(), (it->second).c_str());
+ }
+ for (map<string, int>::iterator it = customIntTokens.begin(); it != customIntTokens.end(); it++) {
+ dsyslog("skindesigner: custom int token \"%s\" = \"%d\"", (it->first).c_str(), it->second);
+ }
+}
+
void cGlobals::Debug(void) {
dsyslog("skindesigner: GLOBAL VARIABLES");
for (map <string, tColor>::iterator col = colors.begin(); col != colors.end(); col++) {
@@ -80,7 +228,7 @@ void cGlobals::Debug(void) {
for (map <string, string>::iterator font = fonts.begin(); font != fonts.end(); font++) {
dsyslog("skindesigner: Font \"%s\": \"%s\"", (font->first).c_str(), (font->second).c_str());
}
- /*
+
for (map <string, map< string, string > >::iterator trans = translations.begin(); trans != translations.end(); trans++) {
dsyslog("skindesigner: Translation Token %s", (trans->first).c_str());
map< string, string > tokenTrans = trans->second;
@@ -88,5 +236,4 @@ void cGlobals::Debug(void) {
dsyslog("skindesigner: language %s, translation %s", (transTok->first).c_str(), (transTok->second).c_str());
}
}
- */
}
diff --git a/libtemplate/globals.h b/libtemplate/globals.h
index 17f5242..9629e63 100644
--- a/libtemplate/globals.h
+++ b/libtemplate/globals.h
@@ -22,19 +22,37 @@ class cGlobals {
private:
string language;
string DoTranslate(string token);
-public:
- cGlobals(void);
- virtual ~cGlobals(void) {};
map <string, tColor> colors;
+ map <string, string> fonts;
map <string, int> intVars;
map <string, double> doubleVars;
map <string, string> stringVars;
- map <string, string> fonts;
map <string, map< string, string > > translations;
map <string, string> customStringTokens;
map <string, int> customIntTokens;
+public:
+ cGlobals(void);
+ virtual ~cGlobals(void) {};
bool ReadFromXML(void);
+ void AddColor(string &name, tColor &col);
+ bool GetColor(string &name, tColor &col);
+ void AddFont(string &name, string &font);
+ bool GetFont(string name, string &font);
+ void AddInt(string &name, int value);
+ void ReplaceIntVars(string &value);
+ bool GetInt(string name, int &val);
+ void AddDouble(string &name, string &value);
+ void ReplaceDoubleVars(string &value);
+ void AddString(string &name, string &value);
+ void ReplaceStringVars(string &value);
+ bool AddTranslation(string name, map < string, string > transl);
bool Translate(string text, string &translation);
+ void AddCustomInt(string &name, int value);
+ void AddCustomString(string &name, string &value);
+ bool GetCustomInt(string name, int &val);
+ map <string, string> GetCustomStringTokens(void) { return customStringTokens; };
+ map <string, int> GetCustomIntTokens(void) { return customIntTokens; };
+ void ListCustomTokens(void);
void Debug(void);
};
diff --git a/libtemplate/parameter.c b/libtemplate/parameter.c
index 83597c8..1479014 100644
--- a/libtemplate/parameter.c
+++ b/libtemplate/parameter.c
@@ -146,34 +146,8 @@ bool cNumericParameter::CheckExpression(int &val, string &parsedVal) {
}
if (globals) {
- for (map<string, int>::iterator globInt = globals->intVars.begin(); globInt != globals->intVars.end(); globInt++) {
- stringstream sToken;
- sToken << "{" << globInt->first << "}";
- string token = sToken.str();
- size_t foundToken = parsedValue.find(token);
- if (foundToken != string::npos) {
- stringstream st;
- st << globInt->second;
- parsedValue = parsedValue.replace(foundToken, token.size(), st.str());
- }
- }
- for (map<string, double>::iterator globDouble = globals->doubleVars.begin(); globDouble != globals->doubleVars.end(); globDouble++) {
- stringstream sToken;
- sToken << "{" << globDouble->first << "}";
- string token = sToken.str();
- size_t foundToken = parsedValue.find(token);
- if (foundToken != string::npos) {
- stringstream st;
- st << globDouble->second;
- string doubleVal = st.str();
- if (config.replaceDecPoint) {
- if (doubleVal.find_first_of('.') != string::npos) {
- std::replace( doubleVal.begin(), doubleVal.end(), '.', config.decPoint);
- }
- }
- parsedValue = parsedValue.replace(foundToken, token.size(), doubleVal);
- }
- }
+ globals->ReplaceIntVars(parsedValue);
+ globals->ReplaceDoubleVars(parsedValue);
}
if (IsNumber(parsedValue)) {
@@ -339,15 +313,12 @@ bool cConditionalParameter::Evaluate(map < string, int > *intTokens, map < strin
int cConditionalParameter::EvaluateParameter(string token, map < string, int > *intTokens, map < string, string > *stringTokens) {
//first check globals
- map < string, int >::iterator hitGlobals = globals->intVars.find(token);
- if (hitGlobals != globals->intVars.end()) {
- return hitGlobals->second;
- }
+ int result = 0;
+ if (globals->GetInt(token, result))
+ return result;
//then check custom tokens
- map < string, int >::iterator hitCustomTokens = globals->customIntTokens.find(token);
- if (hitCustomTokens != globals->customIntTokens.end()) {
- return hitCustomTokens->second;
- }
+ if (globals->GetCustomInt(token, result))
+ return result;
//then check tokens
if (intTokens) {
map < string, int >::iterator hit = intTokens->find(token);
diff --git a/libtemplate/templatefunction.c b/libtemplate/templatefunction.c
index 80cf762..0b3de8a 100644
--- a/libtemplate/templatefunction.c
+++ b/libtemplate/templatefunction.c
@@ -777,16 +777,11 @@ bool cTemplateFunction::SetAlign(eParamType type, string value) {
bool cTemplateFunction::SetFont(eParamType type, string value) {
//check if token
- if ((value.find("{") == 0) && (value.find("}") == (value.size()-1))) {
- value = value.substr(1, value.size()-2);
- map<string,string>::iterator hit = globals->fonts.find(value);
- if (hit != globals->fonts.end()) {
- fontName = hit->second;
- } else {
- map<string,string>::iterator def = globals->fonts.find("vdrOsd");
- if (def == globals->fonts.end())
+ if (IsToken(value)) {
+ if (!globals->GetFont(value, fontName)) {
+ if (!globals->GetFont("{vdrOsd}", fontName)) {
return false;
- fontName = def->second;
+ }
}
} else {
//if no token, directly use input
@@ -820,15 +815,10 @@ bool cTemplateFunction::SetImageType(eParamType type, string value) {
bool cTemplateFunction::SetColor(eParamType type, string value) {
if (globals) {
- for (map<string, tColor>::iterator col = globals->colors.begin(); col != globals->colors.end(); col++) {
- stringstream sColName;
- sColName << "{" << col->first << "}";
- string colName = sColName.str();
- if (!colName.compare(value)) {
- tColor colVal = col->second;
- colorParameters.insert(pair<eParamType, tColor>(type, colVal));
- return true;
- }
+ tColor colVal = 0x00000000;
+ if (globals->GetColor(value, colVal)) {
+ colorParameters.insert(pair<eParamType, tColor>(type, colVal));
+ return true;
}
}
if (value.size() != 8)
@@ -844,15 +834,7 @@ bool cTemplateFunction::SetColor(eParamType type, string value) {
bool cTemplateFunction::SetTextTokens(string value) {
textTokens.clear();
//first replace globals
- for (map<string,string>::iterator globStr = globals->stringVars.begin(); globStr != globals->stringVars.end(); globStr++) {
- stringstream sToken;
- sToken << "{" << globStr->first << "}";
- string token = sToken.str();
- size_t foundToken = value.find(token);
- if (foundToken != string::npos) {
- value = value.replace(foundToken, token.size(), globStr->second);
- }
- }
+ globals->ReplaceStringVars(value);
//now tokenize
bool tokenFound = true;
while (tokenFound) {
diff --git a/libtemplate/templateview.h b/libtemplate/templateview.h
index 1ad5734..1cd4289 100644
--- a/libtemplate/templateview.h
+++ b/libtemplate/templateview.h
@@ -105,8 +105,8 @@ public:
int GetNumPixmapsViewElement(eViewElement ve);
int GetNumListViewMenuItems(void);
bool GetScalingWindow(cRect &scalingWindow);
- map<string,string> GetCustomStringTokens(void) { return globals->customStringTokens; };
- map<string,int> GetCustomIntTokens(void) { return globals->customIntTokens; };
+ map<string,string> GetCustomStringTokens(void) { return globals->GetCustomStringTokens(); };
+ map<string,int> GetCustomIntTokens(void) { return globals->GetCustomIntTokens(); };
//Checks for parsing template XML files
bool ValidSubView(const char *subView);
bool ValidViewElement(const char *viewElement);
diff --git a/libtemplate/templateviewlist.c b/libtemplate/templateviewlist.c
index e75c528..0a6cabc 100644
--- a/libtemplate/templateviewlist.c
+++ b/libtemplate/templateviewlist.c
@@ -1,5 +1,6 @@
#include "templateviewlist.h"
#include "../config.h"
+#include "../libcore/helpers.h"
cTemplateViewList::cTemplateViewList(void) : cTemplateViewElement() {
listElement = NULL;
@@ -87,16 +88,11 @@ int cTemplateViewList::GetAverageFontWidth(void) {
string paramFontSize = fontFunc->GetParameter(ptFontSize);
string fontName = "";
- if ((fontNameToken.find("{") == 0) && (fontNameToken.find("}") == (fontNameToken.size()-1))) {
- fontNameToken = fontNameToken.substr(1, fontNameToken.size()-2);
- map<string,string>::iterator hit = globals->fonts.find(fontNameToken);
- if (hit != globals->fonts.end()) {
- fontName = hit->second;
- } else {
- map<string,string>::iterator def = globals->fonts.find("vdrOsd");
- if (def == globals->fonts.end())
+ if (IsToken(fontNameToken)) {
+ if (!globals->GetFont(fontNameToken, fontName)) {
+ if (!globals->GetFont("{vdrOsd}", fontName)) {
return defaultAverageFontWidth;
- fontName = def->second;
+ }
}
} else {
//if no token, directly use input
@@ -135,16 +131,11 @@ cFont *cTemplateViewList::GetTextAreaFont(void) {
string paramFontSize = fontFunc->GetParameter(ptFontSize);
string fontName = "";
- if ((fontNameToken.find("{") == 0) && (fontNameToken.find("}") == (fontNameToken.size()-1))) {
- fontNameToken = fontNameToken.substr(1, fontNameToken.size()-2);
- map<string,string>::iterator hit = globals->fonts.find(fontNameToken);
- if (hit != globals->fonts.end()) {
- fontName = hit->second;
- } else {
- map<string,string>::iterator def = globals->fonts.find("vdrOsd");
- if (def == globals->fonts.end())
+ if (IsToken(fontNameToken)) {
+ if (!globals->GetFont(fontNameToken, fontName)) {
+ if (!globals->GetFont("{vdrOsd}", fontName)) {
return NULL;
- fontName = def->second;
+ }
}
} else {
//if no token, directly use input
diff --git a/libtemplate/xmlparser.c b/libtemplate/xmlparser.c
index 01b48a6..9e095a4 100644
--- a/libtemplate/xmlparser.c
+++ b/libtemplate/xmlparser.c
@@ -89,7 +89,7 @@ bool cXmlParser::ReadPluginView(string plugName, int templateNumber, string temp
return true;
}
-bool cXmlParser::ReadGlobals(cGlobals *globals, string xmlFile) {
+bool cXmlParser::ReadGlobals(cGlobals *globals, string xmlFile, bool mandatory) {
this->globals = globals;
string xmlPath = GetPath(xmlFile);
@@ -101,20 +101,30 @@ bool cXmlParser::ReadGlobals(cGlobals *globals, string xmlFile) {
doc = xmlCtxtReadFile(ctxt, xmlPath.c_str(), NULL, XML_PARSE_NOENT | XML_PARSE_DTDVALID);
- if (doc == NULL ) {
- esyslog("skindesigner: ERROR: Globals %s not parsed successfully.", xmlPath.c_str());
+ if (doc == NULL) {
+ if (mandatory) {
+ esyslog("skindesigner: ERROR: Globals %s not parsed successfully.", xmlPath.c_str());
+ } else {
+ dsyslog("skindesigner: Globals %s not parsed successfully.", xmlPath.c_str());
+ }
return false;
}
root = xmlDocGetRootElement(doc);
if (ctxt->valid == 0) {
- esyslog("skindesigner: Failed to validate %s", xmlPath.c_str());
+ if (mandatory) {
+ esyslog("skindesigner: ERROR: Failed to validate %s", xmlPath.c_str());
+ } else {
+ dsyslog("skindesigner: Failed to validate %s", xmlPath.c_str());
+ }
return false;
}
if (root == NULL) {
- esyslog("skindesigner: ERROR: Globals %s is empty", xmlPath.c_str());
+ if (mandatory) {
+ esyslog("skindesigner: ERROR: Globals %s is empty", xmlPath.c_str());
+ }
return false;
}
@@ -234,7 +244,6 @@ bool cXmlParser::ParsePluginView(string plugName, int templateNumber) {
bool cXmlParser::ParseGlobals(void) {
xmlNodePtr node = root->xmlChildrenNode;
-
while (node != NULL) {
if (node->type != XML_ELEMENT_NODE) {
node = node->next;
@@ -304,6 +313,8 @@ string cXmlParser::GetPath(string xmlFile) {
string activeTheme = Setup.OSDTheme;
string path = "";
if (!xmlFile.compare("globals.xml")) {
+ path = *cString::sprintf("%s%s/%s", *config.skinPath, activeSkin.c_str(), xmlFile.c_str());
+ } else if (!xmlFile.compare("theme.xml")) {
path = *cString::sprintf("%s%s/themes/%s/%s", *config.skinPath, activeSkin.c_str(), activeTheme.c_str(), xmlFile.c_str());
} else if (!xmlFile.compare("setup.xml")) {
path = *cString::sprintf("%s%s/%s", *config.skinPath, activeSkin.c_str(), xmlFile.c_str());
@@ -424,7 +435,7 @@ void cXmlParser::InsertColor(string name, string value) {
str << value;
tColor colVal;
str >> std::hex >> colVal;
- globals->colors.insert(pair<string, tColor>(name, colVal));
+ globals->AddColor(name, colVal);
}
void cXmlParser::ParseGlobalVariables(xmlNodePtr node) {
@@ -476,17 +487,11 @@ void cXmlParser::ParseGlobalVariables(xmlNodePtr node) {
void cXmlParser::InsertVariable(string name, string type, string value) {
if (!type.compare("int")) {
int val = atoi(value.c_str());
- globals->intVars.insert(pair<string, int>(name, val));
+ globals->AddInt(name, val);
} else if (!type.compare("double")) {
- if (config.replaceDecPoint) {
- if (value.find_first_of('.') != string::npos) {
- std::replace( value.begin(), value.end(), '.', config.decPoint);
- }
- }
- double val = atof(value.c_str());
- globals->doubleVars.insert(pair<string, double>(name, val));
+ globals->AddDouble(name, value);
} else if (!type.compare("string")) {
- globals->stringVars.insert(pair<string, string>(name, value));
+ globals->AddString(name, value);
}
}
@@ -523,8 +528,11 @@ void cXmlParser::ParseGlobalFonts(xmlNodePtr node) {
}
if (ok) {
fontValue = xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
- if (fontName && fontValue)
- globals->fonts.insert(pair<string, string>((const char*)fontName, (const char*)fontValue));
+ if (fontName && fontValue) {
+ string fN = (const char*)fontName;
+ string fV = (const char*)fontValue;
+ globals->AddFont(fN, fV);
+ }
}
if (fontName)
xmlFree(fontName);
@@ -607,7 +615,7 @@ void cXmlParser::ParseTranslations(xmlNodePtr node) {
nodeTrans = nodeTrans->next;
}
if (globals) {
- globals->translations.insert(pair<string, map < string, string > >((const char*)tokenName, tokenTranslations));
+ globals->AddTranslation((const char*)tokenName, tokenTranslations);
} else if (skinSetup) {
skinSetup->SetTranslation((const char*)tokenName, tokenTranslations);
}
diff --git a/libtemplate/xmlparser.h b/libtemplate/xmlparser.h
index 0369622..27399bd 100644
--- a/libtemplate/xmlparser.h
+++ b/libtemplate/xmlparser.h
@@ -50,7 +50,7 @@ public:
virtual ~cXmlParser(void);
bool ReadView(cTemplateView *view, string xmlFile);
bool ReadPluginView(string plugName, int templateNumber, string templateName);
- bool ReadGlobals(cGlobals *globals, string xmlFile);
+ bool ReadGlobals(cGlobals *globals, string xmlFile, bool mandatory);
bool ReadSkinSetup(cSkinSetup *skinSetup, string skin, string xmlFile);
bool ParseView(void);
bool ParsePluginView(string plugName, int templateNumber);