From 3b55a62fdcb1f8222de3c2c8fbed530792c419a0 Mon Sep 17 00:00:00 2001 From: Vadim Dashevskiy Date: Fri, 12 Oct 2012 14:53:57 +0000 Subject: GTalkExt, ICQ, IRC, Jabber: folders restructurization git-svn-id: http://svn.miranda-ng.org/main/trunk@1890 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- protocols/JabberG/src/jabber_message_manager.h | 250 +++++++++++++++++++++++++ 1 file changed, 250 insertions(+) create mode 100644 protocols/JabberG/src/jabber_message_manager.h (limited to 'protocols/JabberG/src/jabber_message_manager.h') diff --git a/protocols/JabberG/src/jabber_message_manager.h b/protocols/JabberG/src/jabber_message_manager.h new file mode 100644 index 0000000000..dd52b50683 --- /dev/null +++ b/protocols/JabberG/src/jabber_message_manager.h @@ -0,0 +1,250 @@ +/* + +Jabber Protocol Plugin for Miranda IM +Copyright ( C ) 2002-04 Santithorn Bunchua +Copyright ( C ) 2005-08 George Hazan +Copyright ( C ) 2007 Maxim Mluhov +Copyright ( C ) 2008-09 Dmitriy Chervov + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or ( at your option ) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifndef _JABBER_MESSAGE_MANAGER_H_ +#define _JABBER_MESSAGE_MANAGER_H_ + +#include "jabber_xml.h" + +struct CJabberProto; +typedef void ( CJabberProto::*JABBER_MESSAGE_PFUNC )( HXML messageNode, void *usedata ); +typedef void ( *MESSAGE_USER_DATA_FREE_FUNC )( void *pUserData ); + +class CJabberMessageInfo; + +typedef BOOL ( CJabberProto::*JABBER_PERMANENT_MESSAGE_HANDLER )( HXML messageNode, ThreadData *pThreadData, CJabberMessageInfo* pInfo ); + +#define JABBER_MESSAGE_PARSE_FROM (1<<3) +#define JABBER_MESSAGE_PARSE_HCONTACT ((1<<4)|JABBER_MESSAGE_PARSE_FROM) +#define JABBER_MESSAGE_PARSE_TO (1<<5) +#define JABBER_MESSAGE_PARSE_ID_STR (1<<6) + +class CJabberMessageInfo +{ +protected: + friend class CJabberMessageManager; + JABBER_PERMANENT_MESSAGE_HANDLER m_pHandler; + CJabberMessageInfo* m_pNext; + +public: + void *m_pUserData; +// parsed data + int m_nMessageType; + LPCTSTR m_szFrom; + LPCTSTR m_szChildTagXmlns; + LPCTSTR m_szChildTagName; + HXML m_hChildNode; + HANDLE m_hContact; + LPCTSTR m_szTo; + LPCTSTR m_szId; + +public: + CJabberMessageInfo() + { + ZeroMemory(this, sizeof(*this)); + } + ~CJabberMessageInfo() + { + } + int GetMessageType() + { + return m_nMessageType; + } + void* GetUserData() + { + return m_pUserData; + } + LPCTSTR GetFrom() + { + return m_szFrom; + } + LPCTSTR GetTo() + { + return m_szTo; + } + LPCTSTR GetIdStr() + { + return m_szId; + } + HANDLE GetHContact() + { + return m_hContact; + } + HXML GetChildNode() + { + return m_hChildNode; + } + LPCTSTR GetChildNodeName() + { + return m_szChildTagName; + } +}; + +class CJabberMessagePermanentInfo +{ + friend class CJabberMessageManager; + + CJabberMessagePermanentInfo* m_pNext; + + JABBER_PERMANENT_MESSAGE_HANDLER m_pHandler; + DWORD m_dwParamsToParse; + int m_nMessageTypes; + LPTSTR m_szXmlns; + LPTSTR m_szTag; + BOOL m_bAllowPartialNs; + void *m_pUserData; + MESSAGE_USER_DATA_FREE_FUNC m_pUserDataFree; + int m_iPriority; +public: + CJabberMessagePermanentInfo() + { + ZeroMemory(this, sizeof(CJabberMessagePermanentInfo)); + } + ~CJabberMessagePermanentInfo() + { + if ( m_pUserDataFree ) + m_pUserDataFree(m_pUserData); + mir_free(m_szXmlns); + mir_free(m_szTag); + } +}; + +class CJabberMessageManager +{ +protected: + CJabberProto* ppro; + CRITICAL_SECTION m_cs; + CJabberMessagePermanentInfo* m_pPermanentHandlers; + +public: + CJabberMessageManager( CJabberProto* proto ) + { + InitializeCriticalSection(&m_cs); + m_pPermanentHandlers = NULL; + ppro = proto; + } + ~CJabberMessageManager() + { + Lock(); + CJabberMessagePermanentInfo *pInfo = m_pPermanentHandlers; + while ( pInfo ) + { + CJabberMessagePermanentInfo *pTmp = pInfo->m_pNext; + delete pInfo; + pInfo = pTmp; + } + m_pPermanentHandlers = NULL; + Unlock(); + DeleteCriticalSection(&m_cs); + } + BOOL Start() + { + return TRUE; + } + BOOL Shutdown() + { + return TRUE; + } + void Lock() + { + EnterCriticalSection(&m_cs); + } + void Unlock() + { + LeaveCriticalSection(&m_cs); + } + CJabberMessagePermanentInfo* AddPermanentHandler(JABBER_PERMANENT_MESSAGE_HANDLER pHandler, int nMessageTypes, DWORD dwParamsToParse, const TCHAR* szXmlns, BOOL bAllowPartialNs, const TCHAR* szTag, void *pUserData = NULL, MESSAGE_USER_DATA_FREE_FUNC pUserDataFree = NULL, int iPriority = JH_PRIORITY_DEFAULT) + { + CJabberMessagePermanentInfo* pInfo = new CJabberMessagePermanentInfo(); + if (!pInfo) + return NULL; + + pInfo->m_pHandler = pHandler; + pInfo->m_nMessageTypes = nMessageTypes ? nMessageTypes : JABBER_MESSAGE_TYPE_ANY; + replaceStrT( pInfo->m_szXmlns, szXmlns ); + pInfo->m_bAllowPartialNs = bAllowPartialNs; + replaceStrT( pInfo->m_szTag, szTag ); + pInfo->m_dwParamsToParse = dwParamsToParse; + pInfo->m_pUserData = pUserData; + pInfo->m_pUserDataFree = pUserDataFree; + pInfo->m_iPriority = iPriority; + + Lock(); + 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; + } + } + Unlock(); + + return pInfo; + } + BOOL DeletePermanentHandler(CJabberMessagePermanentInfo *pInfo) + { // returns TRUE when pInfo found, or FALSE otherwise + Lock(); + if (!m_pPermanentHandlers) + { + Unlock(); + return FALSE; + } + if (m_pPermanentHandlers == pInfo) // check first item + { + m_pPermanentHandlers = m_pPermanentHandlers->m_pNext; + delete pInfo; + Unlock(); + return TRUE; + } else + { + CJabberMessagePermanentInfo* pTmp = m_pPermanentHandlers; + while (pTmp->m_pNext) + { + if (pTmp->m_pNext == pInfo) + { + pTmp->m_pNext = pTmp->m_pNext->m_pNext; + delete pInfo; + Unlock(); + return TRUE; + } + pTmp = pTmp->m_pNext; + } + } + Unlock(); + return FALSE; + } + BOOL HandleMessagePermanent(HXML node, ThreadData *pThreadData); + BOOL FillPermanentHandlers(); +}; + +#endif -- cgit v1.2.3