added findAll(SymbolString) and invalidateCache()
This commit is contained in:
+46
-11
@@ -649,17 +649,26 @@ deque<Message*> MessageMap::findAll(const string& circuit, const string& name, c
|
|||||||
|
|
||||||
Message* MessageMap::find(SymbolString& master)
|
Message* MessageMap::find(SymbolString& master)
|
||||||
{
|
{
|
||||||
|
deque<Message*> ret = findAll(master);
|
||||||
|
|
||||||
|
return ret.size()>0 ? ret.front() : NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
deque<Message*> MessageMap::findAll(SymbolString& master)
|
||||||
|
{
|
||||||
|
deque<Message*> ret;
|
||||||
|
|
||||||
if (master.size() < 5)
|
if (master.size() < 5)
|
||||||
return NULL;
|
return ret;
|
||||||
unsigned char maxIdLength = master[4];
|
unsigned char maxIdLength = master[4];
|
||||||
if (maxIdLength < m_minIdLength)
|
if (maxIdLength < m_minIdLength)
|
||||||
return NULL;
|
return ret;
|
||||||
if (maxIdLength > m_maxIdLength)
|
if (maxIdLength > m_maxIdLength)
|
||||||
maxIdLength = m_maxIdLength;
|
maxIdLength = m_maxIdLength;
|
||||||
if (master.size() < 5+maxIdLength)
|
if (master.size() < 5+maxIdLength)
|
||||||
return NULL;
|
return ret;
|
||||||
|
|
||||||
for (int idLength = maxIdLength; idLength >= m_minIdLength; idLength--) {
|
for (int idLength = maxIdLength; ret.size()==0 && idLength >= m_minIdLength; idLength--) {
|
||||||
int exp = 7;
|
int exp = 7;
|
||||||
unsigned long long key = (unsigned long long)idLength << (8 * exp + 5);
|
unsigned long long key = (unsigned long long)idLength << (8 * exp + 5);
|
||||||
key |= (unsigned long long)getMasterNumber(master[0]) << (8 * exp--);
|
key |= (unsigned long long)getMasterNumber(master[0]) << (8 * exp--);
|
||||||
@@ -670,21 +679,47 @@ Message* MessageMap::find(SymbolString& master)
|
|||||||
key |= (unsigned long long)master[5 + i] << (8 * exp--);
|
key |= (unsigned long long)master[5 + i] << (8 * exp--);
|
||||||
|
|
||||||
map<unsigned long long , Message*>::iterator it = m_messagesByKey.find(key);
|
map<unsigned long long , Message*>::iterator it = m_messagesByKey.find(key);
|
||||||
if (it != m_messagesByKey.end())
|
if (it != m_messagesByKey.end()) {
|
||||||
return it->second;
|
ret.push_back(it->second);
|
||||||
|
}
|
||||||
if ((key & ID_SOURCE_MASK) != 0) {
|
if ((key & ID_SOURCE_MASK) != 0) {
|
||||||
it = m_messagesByKey.find(key & ~ID_SOURCE_MASK); // try again without specific source master
|
it = m_messagesByKey.find(key & ~ID_SOURCE_MASK); // try again without specific source master
|
||||||
if (it != m_messagesByKey.end())
|
if (it != m_messagesByKey.end())
|
||||||
return it->second;
|
ret.push_back(it->second);
|
||||||
}
|
}
|
||||||
|
|
||||||
it = m_messagesByKey.find(key | ID_SOURCE_MASK); // try again with special value for active
|
it = m_messagesByKey.find(key | ID_SOURCE_MASK); // try again with special value for active
|
||||||
if (it != m_messagesByKey.end())
|
if (it != m_messagesByKey.end())
|
||||||
return it->second;
|
ret.push_back(it->second);
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MessageMap::invalidateCache(Message* message)
|
||||||
|
{
|
||||||
|
message->m_lastUpdateTime = 0;
|
||||||
|
string circuit = message->getCircuit();
|
||||||
|
size_t pos = circuit.find('#');
|
||||||
|
if (pos!=string::npos)
|
||||||
|
circuit.resize(pos);
|
||||||
|
string name = message->getName();
|
||||||
|
deque<Message*> messages = findAll(circuit, name, -1, false, true, true, true);
|
||||||
|
for (deque<Message*>::iterator it = messages.begin(); it != messages.end(); it++) {
|
||||||
|
if (*it==message)
|
||||||
|
continue;
|
||||||
|
message = *it;
|
||||||
|
if (name!=message->getName())
|
||||||
|
continue; // check exact name
|
||||||
|
string check = message->getCircuit();
|
||||||
|
if (check!=circuit) {
|
||||||
|
size_t pos = check.find('#');
|
||||||
|
if (pos!=string::npos)
|
||||||
|
check.resize(pos);
|
||||||
|
if (check!=circuit)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
message->m_lastUpdateTime = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MessageMap::addPollMessage(Message* message)
|
void MessageMap::addPollMessage(Message* message)
|
||||||
|
|||||||
@@ -397,6 +397,20 @@ public:
|
|||||||
*/
|
*/
|
||||||
Message* find(SymbolString& master);
|
Message* find(SymbolString& master);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find all @a Message instances for the specified master data.
|
||||||
|
* @param master the master @a SymbolString for identifying the @a Message.
|
||||||
|
* @return the @a Message instance, or NULL.
|
||||||
|
* Note: the caller may not free the returned instances.
|
||||||
|
*/
|
||||||
|
deque<Message*> findAll(SymbolString& master);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Invalidate cached data of the @a Message and all other instances with a matching name key.
|
||||||
|
* @param message the @a Message to invalidate.
|
||||||
|
*/
|
||||||
|
void invalidateCache(Message* message);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a @a Message to the list of instances to poll.
|
* Add a @a Message to the list of instances to poll.
|
||||||
* @param message the @a Message to poll.
|
* @param message the @a Message to poll.
|
||||||
|
|||||||
Reference in New Issue
Block a user