diff options
Diffstat (limited to 'protocols/JabberG/src/jabber_message_manager.cpp')
-rw-r--r-- | protocols/JabberG/src/jabber_message_manager.cpp | 87 |
1 files changed, 24 insertions, 63 deletions
diff --git a/protocols/JabberG/src/jabber_message_manager.cpp b/protocols/JabberG/src/jabber_message_manager.cpp index bea0d98def..cea9943c42 100644 --- a/protocols/JabberG/src/jabber_message_manager.cpp +++ b/protocols/JabberG/src/jabber_message_manager.cpp @@ -25,22 +25,20 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "jabber.h"
-#include "jabber_message_manager.h"
-CJabberMessageManager::CJabberMessageManager(CJabberProto *proto)
+static int CompareItems(const CJabberMessagePermanentInfo *p1, const CJabberMessagePermanentInfo *p2)
+{
+ return p1->getPriority() - p2->getPriority();
+}
+
+CJabberMessageManager::CJabberMessageManager(CJabberProto *proto) :
+ m_arHandlers(1, &CompareItems)
{
- m_pPermanentHandlers = NULL;
ppro = proto;
}
+
CJabberMessageManager::~CJabberMessageManager()
{
- CJabberMessagePermanentInfo *pInfo = m_pPermanentHandlers;
- while (pInfo) {
- CJabberMessagePermanentInfo *pTmp = pInfo->m_pNext;
- delete pInfo;
- pInfo = pTmp;
- }
- m_pPermanentHandlers = NULL;
}
void CJabberMessageManager::FillPermanentHandlers()
@@ -53,10 +51,9 @@ void CJabberMessageManager::FillPermanentHandlers() bool CJabberMessageManager::HandleMessagePermanent(HXML node, ThreadData *pThreadData)
{
- mir_cslock lck(m_cs);
+ for (int k = 0; k < m_arHandlers.getCount(); k++) {
+ CJabberMessagePermanentInfo &pInfo = m_arHandlers[k];
- CJabberMessagePermanentInfo *pInfo = m_pPermanentHandlers;
- while (pInfo) {
// have to get all data here, in the loop, because there's always possibility that previous handler modified it
CJabberMessageInfo messageInfo;
@@ -73,11 +70,11 @@ bool CJabberMessageManager::HandleMessagePermanent(HXML node, ThreadData *pThrea else if (!_tcsicmp(szType, _T("headline")))
messageInfo.m_nMessageType = JABBER_MESSAGE_TYPE_HEADLINE;
else
- return FALSE;
+ return false;
}
else messageInfo.m_nMessageType = JABBER_MESSAGE_TYPE_NORMAL;
- if (pInfo->m_nMessageTypes & messageInfo.m_nMessageType) {
+ if (pInfo.m_nMessageTypes & messageInfo.m_nMessageType) {
for (int i = xmlGetChildCount(node) - 1; i >= 0; i--) {
// enumerate all children and see whether this node suits handler criteria
HXML child = xmlGetChild(node, i);
@@ -85,34 +82,33 @@ bool CJabberMessageManager::HandleMessagePermanent(HXML node, ThreadData *pThrea LPCTSTR szTagName = xmlGetName(child);
LPCTSTR szXmlns = xmlGetAttrValue(child, _T("xmlns"));
- if ((!pInfo->m_szXmlns || (szXmlns && !_tcscmp(pInfo->m_szXmlns, szXmlns))) && (!pInfo->m_szTag || !_tcscmp(pInfo->m_szTag, szTagName))) {
+ if ((!pInfo.m_szXmlns || (szXmlns && !_tcscmp(pInfo.m_szXmlns, szXmlns))) && (!pInfo.m_szTag || !_tcscmp(pInfo.m_szTag, szTagName))) {
// node suits handler criteria, call the handler
messageInfo.m_hChildNode = child;
messageInfo.m_szChildTagName = szTagName;
messageInfo.m_szChildTagXmlns = szXmlns;
- messageInfo.m_pUserData = pInfo->m_pUserData;
+ messageInfo.m_pUserData = pInfo.m_pUserData;
messageInfo.m_szFrom = xmlGetAttrValue(node, _T("from")); // is necessary for ppro->debugLogA() below, that's why we must parse it even if JABBER_MESSAGE_PARSE_FROM flag is not set
- if (pInfo->m_dwParamsToParse & JABBER_MESSAGE_PARSE_ID_STR)
+ if (pInfo.m_dwParamsToParse & JABBER_MESSAGE_PARSE_ID_STR)
messageInfo.m_szId = xmlGetAttrValue(node, _T("id"));
- if (pInfo->m_dwParamsToParse & JABBER_IQ_PARSE_TO)
+ if (pInfo.m_dwParamsToParse & JABBER_IQ_PARSE_TO)
messageInfo.m_szTo = xmlGetAttrValue(node, _T("to"));
- if (pInfo->m_dwParamsToParse & JABBER_MESSAGE_PARSE_HCONTACT)
+ if (pInfo.m_dwParamsToParse & JABBER_MESSAGE_PARSE_HCONTACT)
messageInfo.m_hContact = ppro->HContactFromJID(messageInfo.m_szFrom, 3);
if (messageInfo.m_szFrom)
ppro->debugLog(_T("Handling message from %s"), messageInfo.m_szFrom);
- if ((ppro->*(pInfo->m_pHandler))(node, pThreadData, &messageInfo))
- return TRUE;
+ if ((ppro->*(pInfo.m_pHandler))(node, pThreadData, &messageInfo))
+ return true;
}
}
}
- pInfo = pInfo->m_pNext;
}
- return FALSE;
+ return false;
}
CJabberMessagePermanentInfo* CJabberMessageManager::AddPermanentHandler(
@@ -127,58 +123,23 @@ CJabberMessagePermanentInfo* CJabberMessageManager::AddPermanentHandler( int iPriority)
{
CJabberMessagePermanentInfo* pInfo = new CJabberMessagePermanentInfo();
- if (pInfo == NULL)
- return NULL;
-
pInfo->m_pHandler = pHandler;
pInfo->m_nMessageTypes = nMessageTypes ? nMessageTypes : JABBER_MESSAGE_TYPE_ANY;
- replaceStrT(pInfo->m_szXmlns, szXmlns);
+ pInfo->m_szXmlns = mir_tstrdup(szXmlns);
pInfo->m_bAllowPartialNs = bAllowPartialNs;
- replaceStrT(pInfo->m_szTag, szTag);
+ pInfo->m_szTag = mir_tstrdup(szTag);
pInfo->m_dwParamsToParse = dwParamsToParse;
pInfo->m_pUserData = pUserData;
pInfo->m_pUserDataFree = pUserDataFree;
pInfo->m_iPriority = iPriority;
mir_cslock lck(m_cs);
- if (!m_pPermanentHandlers)
- m_pPermanentHandlers = pInfo;
- else {
- if (m_pPermanentHandlers->m_iPriority > pInfo->m_iPriority) {
- pInfo->m_pNext = m_pPermanentHandlers;
- m_pPermanentHandlers = pInfo;
- }
- else {
- CJabberMessagePermanentInfo *pTmp = m_pPermanentHandlers;
- while (pTmp->m_pNext && pTmp->m_pNext->m_iPriority <= pInfo->m_iPriority)
- pTmp = pTmp->m_pNext;
- pInfo->m_pNext = pTmp->m_pNext;
- pTmp->m_pNext = pInfo;
- }
- }
+ m_arHandlers.insert(pInfo);
return pInfo;
}
bool CJabberMessageManager::DeletePermanentHandler(CJabberMessagePermanentInfo *pInfo)
{
mir_cslock lck(m_cs);
- if (!m_pPermanentHandlers)
- return FALSE;
-
- if (m_pPermanentHandlers == pInfo) { // check first item
- m_pPermanentHandlers = m_pPermanentHandlers->m_pNext;
- delete pInfo;
- return TRUE;
- }
-
- CJabberMessagePermanentInfo *pTmp = m_pPermanentHandlers;
- while (pTmp->m_pNext) {
- if (pTmp->m_pNext == pInfo) {
- pTmp->m_pNext = pTmp->m_pNext->m_pNext;
- delete pInfo;
- return TRUE;
- }
- pTmp = pTmp->m_pNext;
- }
- return FALSE;
+ return m_arHandlers.remove(pInfo) == 1;
}
|