mirror of
				https://projects.vdr-developer.org/git/vdr-plugin-skindesigner.git
				synced 2023-10-19 15:58:31 +00:00 
			
		
		
		
	added strequal, strnotequal, strcontains, strnotcontains functions to compare strings in conditions
This commit is contained in:
		
							
								
								
									
										3
									
								
								HISTORY
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								HISTORY
									
									
									
									
									
								
							@@ -296,3 +296,6 @@ Version 0.4.2
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Version 0.4.3
 | 
					Version 0.4.3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- added strequal, strnotequal, strcontains, strnotcontains functions
 | 
				
			||||||
 | 
					  to compare strings in conditions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -282,6 +282,50 @@ void cConditionalParameter::Evaluate(map < string, int > *intTokens, map < strin
 | 
				
			|||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                tokenTrue = true;
 | 
					                tokenTrue = true;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					        } else if (cond->type == ctStringEquals) {
 | 
				
			||||||
 | 
					            if (stringTokens) {
 | 
				
			||||||
 | 
					                map < string, string >::iterator hit = stringTokens->find(cond->tokenName);
 | 
				
			||||||
 | 
					                if (hit != stringTokens->end()) {
 | 
				
			||||||
 | 
					                    string value = hit->second;
 | 
				
			||||||
 | 
					                    if (!value.compare(cond->strCompareValue))
 | 
				
			||||||
 | 
					                        tokenTrue = true;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } else if (cond->type == ctStringNotEquals) {
 | 
				
			||||||
 | 
					            if (stringTokens) {
 | 
				
			||||||
 | 
					                map < string, string >::iterator hit = stringTokens->find(cond->tokenName);
 | 
				
			||||||
 | 
					                if (hit != stringTokens->end()) {
 | 
				
			||||||
 | 
					                    string value = hit->second;
 | 
				
			||||||
 | 
					                    if (value.compare(cond->strCompareValue))
 | 
				
			||||||
 | 
					                        tokenTrue = true;
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    tokenTrue = true;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                tokenTrue = true;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } else if (cond->type == ctStringContains) {
 | 
				
			||||||
 | 
					            if (stringTokens) {
 | 
				
			||||||
 | 
					                map < string, string >::iterator hit = stringTokens->find(cond->tokenName);
 | 
				
			||||||
 | 
					                if (hit != stringTokens->end()) {
 | 
				
			||||||
 | 
					                    string value = hit->second;
 | 
				
			||||||
 | 
					                    if (value.find(cond->strCompareValue) != string::npos)
 | 
				
			||||||
 | 
					                        tokenTrue = true;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } else if (cond->type == ctStringNotContains) {
 | 
				
			||||||
 | 
					            if (stringTokens) {
 | 
				
			||||||
 | 
					                map < string, string >::iterator hit = stringTokens->find(cond->tokenName);
 | 
				
			||||||
 | 
					                if (hit != stringTokens->end()) {
 | 
				
			||||||
 | 
					                    string value = hit->second;
 | 
				
			||||||
 | 
					                    if (value.find(cond->strCompareValue) == string::npos)
 | 
				
			||||||
 | 
					                        tokenTrue = true;
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    tokenTrue = true;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                tokenTrue = true;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            int tokenValue = EvaluateParameter(cond->tokenName, intTokens, stringTokens);
 | 
					            int tokenValue = EvaluateParameter(cond->tokenName, intTokens, stringTokens);
 | 
				
			||||||
            if (cond->type == ctBool) {
 | 
					            if (cond->type == ctBool) {
 | 
				
			||||||
@@ -352,8 +396,7 @@ void cConditionalParameter::TokenizeValue(string sep) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void cConditionalParameter::InsertCondition(string cond) {
 | 
					void cConditionalParameter::InsertCondition(string cond) {
 | 
				
			||||||
    cond.erase( std::remove_if( cond.begin(), cond.end(), ::isspace ), cond.end() );
 | 
					    cond = StripWhitespaces(cond);
 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (cond.size() < 1)
 | 
					    if (cond.size() < 1)
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -370,6 +413,7 @@ void cConditionalParameter::InsertCondition(string cond) {
 | 
				
			|||||||
    sCond.tokenName = tokenName;
 | 
					    sCond.tokenName = tokenName;
 | 
				
			||||||
    sCond.type = ctBool;
 | 
					    sCond.type = ctBool;
 | 
				
			||||||
    sCond.compareValue = 0;
 | 
					    sCond.compareValue = 0;
 | 
				
			||||||
 | 
					    sCond.strCompareValue = "";
 | 
				
			||||||
    sCond.isNegated = false;
 | 
					    sCond.isNegated = false;
 | 
				
			||||||
    if (!rest.compare("not")) {
 | 
					    if (!rest.compare("not")) {
 | 
				
			||||||
        sCond.isNegated = true;
 | 
					        sCond.isNegated = true;
 | 
				
			||||||
@@ -377,6 +421,18 @@ void cConditionalParameter::InsertCondition(string cond) {
 | 
				
			|||||||
        sCond.type = ctStringSet;
 | 
					        sCond.type = ctStringSet;
 | 
				
			||||||
    } else if (!rest.compare("empty")) {
 | 
					    } else if (!rest.compare("empty")) {
 | 
				
			||||||
        sCond.type = ctStringEmpty;
 | 
					        sCond.type = ctStringEmpty;
 | 
				
			||||||
 | 
					    } else if (startswith(rest.c_str(), "strequal(")) {
 | 
				
			||||||
 | 
					        sCond.strCompareValue = rest.substr(10, rest.size() - 11);
 | 
				
			||||||
 | 
					        sCond.type = ctStringEquals;
 | 
				
			||||||
 | 
					    } else if (startswith(rest.c_str(), "strnotequal(")) {
 | 
				
			||||||
 | 
					        sCond.strCompareValue = rest.substr(13, rest.size() - 14);
 | 
				
			||||||
 | 
					        sCond.type = ctStringNotEquals;
 | 
				
			||||||
 | 
					    } else if (startswith(rest.c_str(), "strcontains(")) {
 | 
				
			||||||
 | 
					        sCond.strCompareValue = rest.substr(13, rest.size() - 14);
 | 
				
			||||||
 | 
					        sCond.type = ctStringContains;
 | 
				
			||||||
 | 
					    } else if (startswith(rest.c_str(), "strnotcontains(")) {
 | 
				
			||||||
 | 
					        sCond.strCompareValue = rest.substr(16, rest.size() - 17);
 | 
				
			||||||
 | 
					        sCond.type = ctStringNotContains;
 | 
				
			||||||
    } else if (startswith(rest.c_str(), "gt(")) {
 | 
					    } else if (startswith(rest.c_str(), "gt(")) {
 | 
				
			||||||
        string compVal = rest.substr(4, rest.size() - 5);
 | 
					        string compVal = rest.substr(4, rest.size() - 5);
 | 
				
			||||||
        sCond.compareValue = atoi(compVal.c_str());
 | 
					        sCond.compareValue = atoi(compVal.c_str());
 | 
				
			||||||
@@ -394,6 +450,25 @@ void cConditionalParameter::InsertCondition(string cond) {
 | 
				
			|||||||
    conditions.push_back(sCond);
 | 
					    conditions.push_back(sCond);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					string cConditionalParameter::StripWhitespaces(string value) {
 | 
				
			||||||
 | 
					    size_t startEqual = value.find("strequal(");
 | 
				
			||||||
 | 
					    size_t startNotEqual = value.find("strnotequal(");
 | 
				
			||||||
 | 
					    size_t startContains = value.find("strcontains(");
 | 
				
			||||||
 | 
					    size_t startNotContains = value.find("strnotcontains(");
 | 
				
			||||||
 | 
					    if (startEqual != string::npos || startContains != string::npos || startNotEqual != string::npos || startNotContains != string::npos) {
 | 
				
			||||||
 | 
					        size_t startString = value.find_first_of('\'');
 | 
				
			||||||
 | 
					        size_t stopString = value.find_last_of('\'');
 | 
				
			||||||
 | 
					        string text = value.substr(startString + 1, stopString - startString - 1);
 | 
				
			||||||
 | 
					        value.replace(startString, stopString - startString + 1, "xxxxxx");
 | 
				
			||||||
 | 
					        value.erase( std::remove_if( value.begin(), value.end(), ::isspace ), value.end() );
 | 
				
			||||||
 | 
					        size_t startPlaceholder = value.find("xxxxxx");
 | 
				
			||||||
 | 
					        value.replace(startPlaceholder, 6, text);
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					       value.erase( std::remove_if( value.begin(), value.end(), ::isspace ), value.end() );
 | 
				
			||||||
 | 
					    }   
 | 
				
			||||||
 | 
					    return value;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void cConditionalParameter::Debug(void) {
 | 
					void cConditionalParameter::Debug(void) {
 | 
				
			||||||
    dsyslog("skindesigner: Condition %s, Type: %s, cond is %s", value.c_str(), (type == cpAnd)?"and combination":((type == cpOr)?"or combination":"single param") , isTrue?"true":"false");
 | 
					    dsyslog("skindesigner: Condition %s, Type: %s, cond is %s", value.c_str(), (type == cpAnd)?"and combination":((type == cpOr)?"or combination":"single param") , isTrue?"true":"false");
 | 
				
			||||||
    for (vector<sCondition>::iterator it = conditions.begin(); it != conditions.end(); it++) {
 | 
					    for (vector<sCondition>::iterator it = conditions.begin(); it != conditions.end(); it++) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -110,6 +110,10 @@ enum eCondType {
 | 
				
			|||||||
    ctBool,
 | 
					    ctBool,
 | 
				
			||||||
    ctStringSet,
 | 
					    ctStringSet,
 | 
				
			||||||
    ctStringEmpty,
 | 
					    ctStringEmpty,
 | 
				
			||||||
 | 
					    ctStringEquals,
 | 
				
			||||||
 | 
					    ctStringNotEquals,
 | 
				
			||||||
 | 
					    ctStringContains,
 | 
				
			||||||
 | 
					    ctStringNotContains,
 | 
				
			||||||
    ctNone
 | 
					    ctNone
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -118,6 +122,7 @@ struct sCondition {
 | 
				
			|||||||
    bool isNegated;
 | 
					    bool isNegated;
 | 
				
			||||||
    eCondType type;
 | 
					    eCondType type;
 | 
				
			||||||
    int compareValue;
 | 
					    int compareValue;
 | 
				
			||||||
 | 
					    string strCompareValue;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class cConditionalParameter {
 | 
					class cConditionalParameter {
 | 
				
			||||||
@@ -129,6 +134,7 @@ private:
 | 
				
			|||||||
    vector<sCondition> conditions;
 | 
					    vector<sCondition> conditions;
 | 
				
			||||||
    void TokenizeValue(string sep);
 | 
					    void TokenizeValue(string sep);
 | 
				
			||||||
    void InsertCondition(string cond);
 | 
					    void InsertCondition(string cond);
 | 
				
			||||||
 | 
					    string StripWhitespaces(string value);
 | 
				
			||||||
    int EvaluateParameter(string token, map < string, int > *intTokens, map < string, string > *stringTokens);
 | 
					    int EvaluateParameter(string token, map < string, int > *intTokens, map < string, string > *stringTokens);
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    cConditionalParameter(cGlobals *globals, string value);
 | 
					    cConditionalParameter(cGlobals *globals, string value);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user