fixed storage for messages by name only

This commit is contained in:
john30
2014-12-01 22:15:30 +01:00
parent 671aa54468
commit c9015eb4f4
+14 -6
View File
@@ -284,13 +284,18 @@ result_t Message::decode(SymbolString& masterData, SymbolString& slaveData,
result_t MessageMap::add(Message* message) result_t MessageMap::add(Message* message)
{ {
if (message->isPassive() == false) { if (message->isPassive() == false) {
string key = message->getClass().append(";").append(message->getName()); bool isSet = message->isSet();
key.append(message->isSet() ? ";W" : ";R"); string clazz = message->getClass();
string name = message->getName();
string key = string(isSet ? "W" : "R") + clazz + ";" + name;
map<string, Message*>::iterator nameIt = m_messagesByName.find(key); map<string, Message*>::iterator nameIt = m_messagesByName.find(key);
if (nameIt != m_messagesByName.end()) { if (nameIt != m_messagesByName.end()) {
return RESULT_ERR_DUPLICATE; // duplicate key return RESULT_ERR_DUPLICATE; // duplicate key
} }
m_messagesByName[key] = message;
key = string(isSet ? "-W" : "-R") + name; // also store without class
m_messagesByName[key] = message; m_messagesByName[key] = message;
return RESULT_OK; return RESULT_OK;
} }
@@ -339,13 +344,15 @@ result_t MessageMap::addFromFile(vector<string>& row, DataFieldTemplates* arg, v
Message* MessageMap::find(const string& clazz, const string& name, const bool isSet) Message* MessageMap::find(const string& clazz, const string& name, const bool isSet)
{ {
string key = clazz; string key;
for (int i=0; i<2; i++) { for (int i=0; i<2; i++) {
key.append(";").append(name).append(isSet ? ";W" : ";R"); if (i==0)
key = string(isSet ? "W" : "R") + clazz + ";" + name;
else
key = string(isSet ? "-W" : "-R") + name; // second try: without class
map<string, Message*>::iterator it = m_messagesByName.find(key); map<string, Message*>::iterator it = m_messagesByName.find(key);
if (it != m_messagesByName.end()) if (it != m_messagesByName.end())
return it->second; return it->second;
key.clear(); // try again without class name
} }
return NULL; return NULL;
@@ -392,7 +399,8 @@ Message* MessageMap::find(SymbolString& master)
void MessageMap::clear() void MessageMap::clear()
{ {
for (map<string, Message*>::iterator it=m_messagesByName.begin(); it!=m_messagesByName.end(); it++) { for (map<string, Message*>::iterator it=m_messagesByName.begin(); it!=m_messagesByName.end(); it++) {
delete it->second; if (it->first[0] != '-') // avoid double free
delete it->second;
it->second = NULL; it->second = NULL;
} }
m_messagesByName.clear(); m_messagesByName.clear();