allow empty field list, formatting
This commit is contained in:
+15
-12
@@ -193,18 +193,16 @@ result_t Message::create(vector<string>::iterator& it, const vector<string>::ite
|
|||||||
}
|
}
|
||||||
|
|
||||||
vector<unsigned char> id;
|
vector<unsigned char> id;
|
||||||
for (int pos=0, useDefaults=1; pos<2; pos++) { // message id (PBSB, optional master data)
|
bool useDefaults = true;
|
||||||
|
for (int pos = 0; pos < 2 && it != end; pos++) { // message id (PBSB, optional master data)
|
||||||
string token = *it++;
|
string token = *it++;
|
||||||
if (useDefaults == 1) {
|
if (useDefaults) {
|
||||||
if (pos == 0 && token.size() > 0)
|
if (pos == 0 && token.size() > 0)
|
||||||
useDefaults = 0;
|
useDefaults = false;
|
||||||
else
|
else
|
||||||
token = getDefault("", defaults, defaultPos).append(token);
|
token = getDefault("", defaults, defaultPos).append(token);
|
||||||
|
|
||||||
}
|
}
|
||||||
istringstream input(token);
|
istringstream input(token);
|
||||||
if (it == end)
|
|
||||||
return RESULT_ERR_EOF;
|
|
||||||
while (!input.eof()) {
|
while (!input.eof()) {
|
||||||
while (input.peek() == ' ')
|
while (input.peek() == ' ')
|
||||||
input.get();
|
input.get();
|
||||||
@@ -223,9 +221,9 @@ result_t Message::create(vector<string>::iterator& it, const vector<string>::ite
|
|||||||
}
|
}
|
||||||
id.push_back(value);
|
id.push_back(value);
|
||||||
}
|
}
|
||||||
if (pos == 0 && id.size() != 2) {
|
if (pos == 0 && id.size() != 2)
|
||||||
return RESULT_ERR_INVALID_ARG; // missing/too short/too PBSB
|
return RESULT_ERR_INVALID_ARG; // missing/too short/too PBSB
|
||||||
}
|
|
||||||
defaultPos++;
|
defaultPos++;
|
||||||
}
|
}
|
||||||
if (id.size() < 2 || id.size() > 6) {
|
if (id.size() < 2 || id.size() > 6) {
|
||||||
@@ -254,10 +252,15 @@ result_t Message::create(vector<string>::iterator& it, const vector<string>::ite
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
DataField* data = NULL;
|
DataField* data = NULL;
|
||||||
|
if (it==realEnd) {
|
||||||
|
vector<SingleDataField*> fields;
|
||||||
|
data = new DataFieldSet("", "", fields);
|
||||||
|
} else {
|
||||||
result = DataField::create(it, realEnd, templates, data, isWrite, false, isBroadcastOrMasterDestination);
|
result = DataField::create(it, realEnd, templates, data, isWrite, false, isBroadcastOrMasterDestination);
|
||||||
if (result != RESULT_OK) {
|
if (result != RESULT_OK) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (id.size() + data->getLength(pt_masterData) > 2 + MAX_POS || data->getLength(pt_slaveData) > MAX_POS) {
|
if (id.size() + data->getLength(pt_masterData) > 2 + MAX_POS || data->getLength(pt_slaveData) > MAX_POS) {
|
||||||
// max NN exceeded
|
// max NN exceeded
|
||||||
delete data;
|
delete data;
|
||||||
@@ -358,7 +361,7 @@ result_t Message::decode(const PartType partType, SymbolString& data,
|
|||||||
result_t result = m_data->read(partType, data, offset, output, leadingSeparator, verbose, fieldName, fieldIndex, separator);
|
result_t result = m_data->read(partType, data, offset, output, leadingSeparator, verbose, fieldName, fieldIndex, separator);
|
||||||
if (result < RESULT_OK)
|
if (result < RESULT_OK)
|
||||||
return result;
|
return result;
|
||||||
if (result == RESULT_EMPTY)
|
if (result == RESULT_EMPTY && fieldName != NULL)
|
||||||
return RESULT_ERR_NOTFOUND;
|
return RESULT_ERR_NOTFOUND;
|
||||||
|
|
||||||
time(&m_lastUpdateTime);
|
time(&m_lastUpdateTime);
|
||||||
@@ -391,8 +394,8 @@ result_t Message::decode(SymbolString& masterData, SymbolString& slaveData,
|
|||||||
result = m_data->read(pt_slaveData, slaveData, offset, output, leadingSeparator, verbose, NULL, -1, separator);
|
result = m_data->read(pt_slaveData, slaveData, offset, output, leadingSeparator, verbose, NULL, -1, separator);
|
||||||
if (result < RESULT_OK)
|
if (result < RESULT_OK)
|
||||||
return result;
|
return result;
|
||||||
if (empty && result == RESULT_EMPTY)
|
if (result == RESULT_EMPTY && !empty)
|
||||||
return RESULT_ERR_NOTFOUND;
|
result = RESULT_OK;
|
||||||
|
|
||||||
time(&m_lastUpdateTime);
|
time(&m_lastUpdateTime);
|
||||||
if (masterData != m_lastMasterData) {
|
if (masterData != m_lastMasterData) {
|
||||||
@@ -422,7 +425,7 @@ result_t Message::decodeLastData(ostringstream& output,
|
|||||||
result = m_data->read(pt_slaveData, m_lastSlaveData, offset, output, leadingSeparator, verbose, fieldName, fieldIndex, separator);
|
result = m_data->read(pt_slaveData, m_lastSlaveData, offset, output, leadingSeparator, verbose, fieldName, fieldIndex, separator);
|
||||||
if (result < RESULT_OK)
|
if (result < RESULT_OK)
|
||||||
return result;
|
return result;
|
||||||
if (empty && result == RESULT_EMPTY)
|
if (empty && result == RESULT_EMPTY && fieldName != NULL)
|
||||||
return RESULT_ERR_NOTFOUND;
|
return RESULT_ERR_NOTFOUND;
|
||||||
return RESULT_OK;
|
return RESULT_OK;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ int main()
|
|||||||
{"u,,first,,,fe,0700,,x,,bda", "26.10.2014", "fffe07000426100614", "00", "p"},
|
{"u,,first,,,fe,0700,,x,,bda", "26.10.2014", "fffe07000426100614", "00", "p"},
|
||||||
{"u,broadcast,hwStatus,,,fe,b505,27,,,UCH,,,,,,UCH,,,,,,UCH,,,", "0;19;0", "10feb505042700130097", "00", ""},
|
{"u,broadcast,hwStatus,,,fe,b505,27,,,UCH,,,,,,UCH,,,,,,UCH,,,", "0;19;0", "10feb505042700130097", "00", ""},
|
||||||
{"w,,first,,,15,b509,0400,date,,bda", "26.10.2014", "ff15b50906040026100614", "00", "m"},
|
{"w,,first,,,15,b509,0400,date,,bda", "26.10.2014", "ff15b50906040026100614", "00", "m"},
|
||||||
|
{"w,,first,,,15,b509", "", "ff15b50900", "00", "m"},
|
||||||
{"r,ehp,time,,,08,b509,0d2800,,,time", "15:00:17", "ff08b509030d2800", "0311000f", "md"},
|
{"r,ehp,time,,,08,b509,0d2800,,,time", "15:00:17", "ff08b509030d2800", "0311000f", "md"},
|
||||||
{"r,ehp,time,,,08;10,b509,0d2800,,,time", "15:00:17", "ff08b509030d2800", "0311000f", "c"},
|
{"r,ehp,time,,,08;10,b509,0d2800,,,time", "15:00:17", "ff08b509030d2800", "0311000f", "c"},
|
||||||
{"r,ehp,time,,,08;09,b509,0d2800,,,time", "15:00:17", "ff08b509030d2800", "0311000f", "md*"},
|
{"r,ehp,time,,,08;09,b509,0d2800,,,time", "15:00:17", "ff08b509030d2800", "0311000f", "md*"},
|
||||||
@@ -117,7 +118,7 @@ int main()
|
|||||||
// store new template
|
// store new template
|
||||||
DataField* fields = NULL;
|
DataField* fields = NULL;
|
||||||
vector<string>::iterator it = entries.begin();
|
vector<string>::iterator it = entries.begin();
|
||||||
result = DataField::create(it, entries.end(), templates, fields);
|
result = DataField::create(it, entries.end(), templates, fields, false, true, false);
|
||||||
if (result != RESULT_OK)
|
if (result != RESULT_OK)
|
||||||
cout << "\"" << check[0] << "\": template fields create error: " << getResultCode(result) << endl;
|
cout << "\"" << check[0] << "\": template fields create error: " << getResultCode(result) << endl;
|
||||||
else if (it != entries.end()) {
|
else if (it != entries.end()) {
|
||||||
|
|||||||
Reference in New Issue
Block a user