From 340f86202667e32385c48caf7abe7dcf852b5715 Mon Sep 17 00:00:00 2001 From: john30 Date: Sun, 7 May 2017 15:31:09 +0200 Subject: [PATCH] simplified too complex CSV header line interpretation --- src/lib/ebus/data.cpp | 93 +++++++++++++++++++------------------- src/lib/ebus/message.cpp | 96 ++++++++++++++++------------------------ 2 files changed, 85 insertions(+), 104 deletions(-) diff --git a/src/lib/ebus/data.cpp b/src/lib/ebus/data.cpp index 8ea037ae..aaf06f60 100644 --- a/src/lib/ebus/data.cpp +++ b/src/lib/ebus/data.cpp @@ -184,8 +184,8 @@ string AttributedItem::getAttribute(const string& name) const { result_t DataField::create(bool isWriteMessage, bool isTemplate, bool isBroadcastOrMasterDestination, size_t maxFieldLength, const DataFieldTemplates* templates, vector< map >* rows, string* errorDescription, const DataField** returnField) { - // template: name,[,part]basetype[:len]|template[:name][,[divisor|values][,[unit][,[comment]]]] - // std: name,part,basetype[:len]|template[:name][,[divisor|values][,[unit][,[comment]]]] + // template: name[,part]basetype[:len]|template[:name][,[divisor|values][,[unit][,[comment]]]] + // std: name[,part],basetype[:len]|template[:name][,[divisor|values][,[unit][,[comment]]]] vector fields; string firstName; result_t result = RESULT_OK; @@ -1130,21 +1130,41 @@ result_t DataFieldTemplates::getFieldMap(const string& preferLanguage, vector::iterator previous; - if (langPos == lowerName.length()-3) { - string lang = lowerName.substr(langPos+1); - if (unknown) { - useName = lowerName.substr(0, langPos); + if (toDataFields) { + if (inDataFields) { + if (seen.find("type") == seen.end()) { + *errorDescription = "missing field type"; + return RESULT_ERR_EOF; // require at least name and type + } + } else { + if (seen.find("name") == seen.end()) { + *errorDescription = "missing template name"; + return RESULT_ERR_EOF; // require at least name + } + if (seen.size() > 1) { + *errorDescription = "extra template columns"; + return RESULT_ERR_INVALID_ARG; + } + inDataFields = true; } - previous = seen.find(useName); + seen.clear(); + } + size_t langPos = lowerName.find_last_of('.'); + if (langPos != string::npos && langPos > 0 && langPos == lowerName.length()-3) { + string lang = lowerName.substr(langPos+1); + lowerName.erase(langPos); + map::iterator previous = seen.find(lowerName); if (previous != seen.end()) { if (lang != preferLanguage) { // skip this column @@ -1153,45 +1173,21 @@ result_t DataFieldTemplates::getFieldMap(const string& preferLanguage, vectorsecond] = SKIP_COLUMN; - seen.erase(useName); - previous = seen.end(); + seen.erase(lowerName); } } else { - if (unknown) { - useName = lowerName; - } - previous = seen.find(useName); - } - if (inDataFields) { - if (!unknown && previous != seen.end()) { - if (seen.find("type") == seen.end()) { - *errorDescription = "missing field type"; - return RESULT_ERR_EOF; // require at least type + map::iterator previous = seen.find(lowerName); + if (seen.find(lowerName) != seen.end()) { + if (inDataFields) { + *errorDescription = "duplicate field " + name; + } else { + *errorDescription = "duplicate template " + name; } - seen.clear(); - } - } else { - if (!unknown && useName == "name" && seen.find("name") == seen.end()) { - // keep first name for template - } else if (!unknown) { - if (seen.find("name") == seen.end()) { - *errorDescription = "missing template name"; - return RESULT_ERR_EOF; // require at least name - } - inDataFields = true; - seen.clear(); - } - if (!inDataFields && seen.find(useName) != seen.end()) { - *errorDescription = "duplicate template " + useName; return RESULT_ERR_INVALID_ARG; } } - if (seen.empty() && inDataFields) { - name = "*" + useName; // data field repetition - } else { - name = useName; - } - seen[useName] = col; + name = toDataFields ? "*"+lowerName : lowerName; + seen[lowerName] = col; } if (!inDataFields) { *errorDescription = "missing template fields"; @@ -1216,8 +1212,11 @@ result_t DataFieldTemplates::addFromFile(const string& filename, unsigned int li name = name.substr(0, colon); } const DataField* field = NULL; - if (!subRows->empty() && (*subRows)[0].find("name") == (*subRows)[0].end()) { - (*subRows)[0]["name"] = firstFieldName; + if (!subRows->empty()) { + map::iterator it = (*subRows)[0].find("name"); + if (it == (*subRows)[0].end() || it->second.empty()) { + (*subRows)[0]["name"] = firstFieldName; + } } result_t result = DataField::create(false, true, false, MAX_POS, this, subRows, errorDescription, &field); if (result != RESULT_OK) { diff --git a/src/lib/ebus/message.cpp b/src/lib/ebus/message.cpp index 9ff99b24..f23d5c29 100644 --- a/src/lib/ebus/message.cpp +++ b/src/lib/ebus/message.cpp @@ -1772,9 +1772,8 @@ result_t MessageMap::add(bool storeByName, Message* message) { } result_t MessageMap::getFieldMap(const string& preferLanguage, vector* row, string* errorDescription) const { - // type (r[1-9];w;u),circuit,name,[comment],[QQ],ZZ,PBSB,[ID],field1,part (m/s),datatypes/templates,divider/values, - // unit,comment - // minimum: type,name,PBSB,field,datatype + // type,circuit,name,[comment],[QQ],ZZ,PBSB,[ID],*name,[part],type,divisor/values,unit,comment + // minimum: type,name,PBSB,*type if (row->empty()) { for (const auto& col : defaultMessageFieldMap) { row->push_back(col); @@ -1788,30 +1787,37 @@ result_t MessageMap::getFieldMap(const string& preferLanguage, vector* r string lowerName = name; tolower(&lowerName); trim(&lowerName); + bool toDataFields; + if (!lowerName.empty() && lowerName[0] == '*') { + lowerName.erase(0, 1); + toDataFields = true; + } else { + toDataFields = false; + } if (lowerName.empty()) { *errorDescription = "missing name in column " + AttributedItem::formatInt(col); return RESULT_ERR_INVALID_ARG; } - bool supportsLang = false, toDataFields = false; - string useName; - if (inDataFields) { - useName = getDataFieldName(lowerName, &supportsLang); - } else { - useName = getMessageFieldName(lowerName, &supportsLang); - if (useName.empty()) { - useName = getDataFieldName(lowerName, &supportsLang); - toDataFields = !useName.empty(); + if (toDataFields) { + if (inDataFields) { + if (seen.find("type") == seen.end()) { + *errorDescription = "missing field type"; + return RESULT_ERR_EOF; // require at least name and type + } + } else { + if (seen.find("type") == seen.end() || seen.find("name") == seen.end() || seen.find("pbsb") == seen.end()) { + *errorDescription = "missing message type/name/pbsb"; + return RESULT_ERR_EOF; // require at least type, name, and pbsb + } + inDataFields = true; } + seen.clear(); } - bool unknown = useName.empty(); - size_t langPos = supportsLang ? lowerName.find_last_of('.') : string::npos; - map::iterator previous; - if (langPos == lowerName.length()-3) { + size_t langPos = lowerName.find_last_of('.'); + if (langPos != string::npos && langPos > 0 && langPos == lowerName.length()-3) { string lang = lowerName.substr(langPos+1); - if (unknown) { - useName = lowerName.substr(0, langPos); - } - previous = seen.find(useName); + lowerName.erase(langPos); + map::iterator previous = seen.find(lowerName); if (previous != seen.end()) { if (lang != preferLanguage) { // skip this column @@ -1820,54 +1826,30 @@ result_t MessageMap::getFieldMap(const string& preferLanguage, vector* r } // replace previous (*row)[previous->second] = SKIP_COLUMN; - seen.erase(useName); - previous = seen.end(); + seen.erase(lowerName); } } else { - if (unknown) { - useName = lowerName; - } - previous = seen.find(useName); - } - if (inDataFields) { - if (!unknown && previous != seen.end()) { - if (seen.find("name") == seen.end() || seen.find("type") == seen.end()) { - *errorDescription = "missing field name/type as of already seen "+useName; - return RESULT_ERR_EOF; // require at least name and type + map::iterator previous = seen.find(lowerName); + if (seen.find(lowerName) != seen.end()) { + if (inDataFields) { + *errorDescription = "duplicate field " + name; + } else { + *errorDescription = "duplicate message " + name; } - seen.clear(); - } - } else { - /*if (!unknown && (useName != "name" || seen.find("name") == seen.end())) { - // keep first name for message - } else {*/ - if (toDataFields) { - if (seen.find("type") == seen.end() || seen.find("name") == seen.end() || seen.find("pbsb") == seen.end()) { - *errorDescription = "missing message name/type/pbsb"; - return RESULT_ERR_EOF; // require at least type, name, and pbsb - } - inDataFields = true; - seen.clear(); - } - if (!inDataFields && seen.find(useName) != seen.end()) { - *errorDescription = "duplicate message " + useName; return RESULT_ERR_INVALID_ARG; } } - if (seen.empty() && inDataFields) { - name = "*" + useName; // data field repetition - } else { - name = useName; - } - seen[useName] = col; +//std::cout<<(inDataFields?"data:":"msg:")<