From bf172b368851c8202b763cda57fe09b3f98a7506 Mon Sep 17 00:00:00 2001 From: john30 Date: Sun, 22 Nov 2015 09:31:11 +0100 Subject: [PATCH] removed template param, moved tolower() to FileReader --- src/lib/ebus/filereader.h | 31 ++++++++++++++++--------- src/lib/ebus/message.cpp | 48 ++++++++++++++++++++------------------- src/lib/ebus/message.h | 16 +++++++------ 3 files changed, 54 insertions(+), 41 deletions(-) diff --git a/src/lib/ebus/filereader.h b/src/lib/ebus/filereader.h index ebb07e6c..62944abf 100644 --- a/src/lib/ebus/filereader.h +++ b/src/lib/ebus/filereader.h @@ -25,8 +25,8 @@ #include #include #include +#include #include -#include /** @file filereader.h * Helper class and constants for reading configuration files. @@ -56,7 +56,6 @@ extern unsigned int parseInt(const char* str, int base, const unsigned int minVa /** * An abstract class that support reading definitions from a file. */ -template class FileReader { public: @@ -75,11 +74,10 @@ public: /** * Read the definitions from a file. * @param filename the name of the file being read. - * @param arg an argument to pass to @a addFromFile(). * @param verbose whether to verbosely log problems. * @return @a RESULT_OK on success, or an error code. */ - virtual result_t readFromFile(const string filename, T arg=NULL, bool verbose=false) + virtual result_t readFromFile(const string filename, bool verbose=false) { ifstream ifs; ifs.open(filename.c_str(), ifstream::in); @@ -134,10 +132,10 @@ public: if (result == RESULT_OK) continue; } else - result = addFromFile(it, end, arg, &defaults, filename, lineNo); + result = addFromFile(it, end, &defaults, filename, lineNo); } else - result = addFromFile(it, end, arg, NULL, filename, lineNo); + result = addFromFile(it, end, NULL, filename, lineNo); if (result != RESULT_OK) { if (!verbose) { @@ -181,7 +179,8 @@ public: */ virtual result_t addDefaultFromFile(vector< vector >& defaults, vector& row, vector::iterator& begin, string defaultDest, string defaultCircuit, - const string& filename, unsigned int lineNo) { + const string& filename, unsigned int lineNo) + { defaults.push_back(row); begin = row.end(); return RESULT_OK; @@ -191,21 +190,21 @@ public: * Add a definition that was read from a file. * @param begin an iterator to the first column of the definition row to read. * @param end the end iterator of the definition row to read. - * @param arg the argument passed to @a readFromFile(). * @param defaults all previously read default rows (initial star char removed), or NULL if not supported. * @param filename the name of the file being read. * @param lineNo the current line number in the file being read. * @return @a RESULT_OK on success, or an error code. */ virtual result_t addFromFile(vector::iterator& begin, const vector::iterator end, - T arg, vector< vector >* defaults, + vector< vector >* defaults, const string& filename, unsigned int lineNo) = 0; /** * Left and right trim the string. * @param str the @a string to trim. */ - static void trim(string& str) { + static void trim(string& str) + { size_t pos = str.find_first_not_of(" \t"); if (pos!=string::npos) { str.erase(0, pos); @@ -216,13 +215,23 @@ public: } } + /** + * Convert all upper case characters in the string to lower case. + * @param str the @a string to convert. + */ + static void tolower(string& str) + { + transform(str.begin(), str.end(), str.begin(), ::tolower); + } + /** * Split the line into fields. * @param line the @a string with the line to split. * @param row the @a vector to which to add the fields. * @return true if the line was split, false if the line was completely empty or a comment line. */ - static bool splitFields(string& line, vector& row) { + static bool splitFields(string& line, vector& row) + { row.clear(); trim(line); // skip empty lines and comments diff --git a/src/lib/ebus/message.cpp b/src/lib/ebus/message.cpp index e5813682..5d1a5c0c 100644 --- a/src/lib/ebus/message.cpp +++ b/src/lib/ebus/message.cpp @@ -23,7 +23,6 @@ #include #include #include -#include #include #include #include @@ -42,6 +41,8 @@ using namespace std; /** the maximum poll priority for a @a Message referred to by a @a Condition. */ #define POLL_PRIORITY_CONDITION 5 +extern DataFieldTemplates* getTemplates(const string filename); + Message::Message(const string circuit, const string name, const bool isWrite, const bool isPassive, const string comment, const unsigned char srcAddress, const unsigned char dstAddress, @@ -199,7 +200,7 @@ result_t Message::create(vector::iterator& it, const vector::ite string token; bool first = true; while (getline(stream, token, VALUE_SEPARATOR) != 0) { - DataFieldTemplates::trim(token); + FileReader::trim(token); unsigned char dstAddress = (unsigned char)parseInt(token.c_str(), 16, 0, 0xff, result); if (result != RESULT_OK) return result; @@ -614,13 +615,6 @@ void Message::dump(ostream& output, vector* columns) } } -string strtolower(const string& str) -{ - string ret(str); - transform(ret.begin(), ret.end(), ret.begin(), ::tolower); - return ret; -} - Message* getFirstAvailable(vector &messages) { for (vector::iterator msgIt = messages.begin(); msgIt != messages.end(); msgIt++) if ((*msgIt)->isAvailable()) @@ -659,7 +653,7 @@ result_t Condition::create(const string condName, vector::iterator& it, string str; vector valueRanges; while (getline(stream, str, VALUE_SEPARATOR) != 0) { - DataFieldTemplates::trim(str); + FileReader::trim(str); if (str.length()==0) return RESULT_ERR_INVALID_ARG; bool upto = str[0]=='<'; @@ -842,8 +836,10 @@ result_t MessageMap::add(Message* message, bool storeByName) bool isPassive = message->isPassive(); if (storeByName) { bool isWrite = message->isWrite(); - string circuit = strtolower(message->getCircuit()); - string name = strtolower(message->getName()); + string circuit = message->getCircuit(); + FileReader::tolower(circuit); + string name = message->getName(); + FileReader::tolower(name); string nameKey = string(isPassive ? "P" : (isWrite ? "W" : "R")) + circuit + FIELD_SEPARATOR + name; if (!m_addAll) { map >::iterator nameIt = m_messagesByName.find(nameKey); @@ -914,7 +910,7 @@ result_t MessageMap::addDefaultFromFile(vector< vector >& defaults, vect } if (row.size()>5 && defaultDest.length()>0 && row[5].length()==0) row[5] = defaultDest; // set default destination - return FileReader::addDefaultFromFile(defaults, row, begin, defaultDest, defaultCircuit, filename, lineNo); + return FileReader::addDefaultFromFile(defaults, row, begin, defaultDest, defaultCircuit, filename, lineNo); } result_t MessageMap::readConditions(string& types, const string& filename, Condition*& condition) @@ -955,7 +951,7 @@ result_t MessageMap::readConditions(string& types, const string& filename, Condi } result_t MessageMap::addFromFile(vector::iterator& begin, const vector::iterator end, - DataFieldTemplates* arg, vector< vector >* defaults, + vector< vector >* defaults, const string& filename, unsigned int lineNo) { vector::iterator restart = begin; @@ -971,15 +967,16 @@ result_t MessageMap::addFromFile(vector::iterator& begin, const vector messages; while (getline(stream, type, VALUE_SEPARATOR) != 0) { - DataFieldTemplates::trim(type); + FileReader::trim(type); *restart = type; begin = restart; messages.clear(); - result = Message::create(begin, end, defaults, condition, filename, arg, messages); + result = Message::create(begin, end, defaults, condition, filename, templates, messages); for (vector::iterator it = messages.begin(); it != messages.end(); it++) { Message* message = *it; if (result == RESULT_OK) { @@ -1045,8 +1042,10 @@ vector* MessageMap::getByKey(const unsigned long long key) { Message* MessageMap::find(const string& circuit, const string& name, const bool isWrite, const bool isPassive) { - string lcircuit = strtolower(circuit); - string lname = strtolower(name); + string lcircuit = circuit; + FileReader::tolower(lcircuit); + string lname = name; + FileReader::tolower(lname); for (int i = 0; i < 2; i++) { string key; if (i == 0) @@ -1070,9 +1069,10 @@ deque MessageMap::findAll(const string& circuit, const string& name, c const bool withRead, const bool withWrite, const bool withPassive) { deque ret; - - string lcircuit = strtolower(circuit); - string lname = strtolower(name); + string lcircuit = circuit; + FileReader::tolower(lcircuit); + string lname = name; + FileReader::tolower(lname); bool checkCircuit = lcircuit.length() > 0; bool checkName = name.length() > 0; bool checkPb = pb >= 0; @@ -1083,12 +1083,14 @@ deque MessageMap::findAll(const string& circuit, const string& name, c if (!message) continue; if (checkCircuit) { - string check = strtolower(message->getCircuit()); + string check = message->getCircuit(); + FileReader::tolower(check); if (completeMatch ? (check != lcircuit) : (check.find(lcircuit) == check.npos)) continue; } if (checkName) { - string check = strtolower(message->getName()); + string check = message->getName(); + FileReader::tolower(check); if (completeMatch ? (check != lname) : (check.find(lname) == check.npos)) continue; } diff --git a/src/lib/ebus/message.h b/src/lib/ebus/message.h index 07e92d0b..955b9afb 100644 --- a/src/lib/ebus/message.h +++ b/src/lib/ebus/message.h @@ -32,7 +32,7 @@ * eBUS to and from readable values. * * A @a Message has a unique numeric key (see Message#getKey()) as well as a - * unique name and circuit (@see Message#getCircuit() and Message#getName()). + * unique name and circuit (see Message#getCircuit() and Message#getName()). * The numeric key is built from the message type (active/passive, read/write), * the source and destination address, the primary and secondary command byte, * as well as additional command ID bytes (see Message#getId()). @@ -45,11 +45,13 @@ * certain conditions only, it may have assigned a @a Condition instance. * * A @a Condition is either a @a SimpleCondition referencing another - * @a Message, field, and field value, or a @a CombinedCondition referencing - * two or more other @a Condition instances. + * @a Message, numeric field, and field value, or a @a CombinedCondition + * applying a logical AND on two or more other @a Condition instances. * * The @a MessageMap stores all @a Message and @a Condition instances by their - * unique keys, and also keeps track of messages with polling enabled. + * unique keys, and also keeps track of messages with polling enabled. It reads + * the instances from configuration files by inheriting the @a FileReader + * template class. */ using namespace std; @@ -631,7 +633,7 @@ private: /** * Holds a map of all known @a Message instances. */ -class MessageMap : public FileReader +class MessageMap : public FileReader { public: @@ -639,7 +641,7 @@ public: * Construct a new instance. * @param addAll whether to add all messages, even if duplicate. */ - MessageMap(const bool addAll=false) : FileReader::FileReader(true), + MessageMap(const bool addAll=false) : FileReader::FileReader(true), m_addAll(addAll), m_maxIdLength(0), m_messageCount(0), m_conditionalMessageCount(0), m_passiveMessageCount(0) { m_scanMessage = new Message(false, false, 0x07, 0x04, DataFieldSet::getIdentFields(), true); @@ -678,7 +680,7 @@ public: // @copydoc virtual result_t addFromFile(vector::iterator& begin, const vector::iterator end, - DataFieldTemplates* arg, vector< vector >* defaults, + vector< vector >* defaults, const string& filename, unsigned int lineNo); /**