summaryrefslogtreecommitdiff
path: root/protocols/JabberG/src/jabber_presence_manager.h
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/JabberG/src/jabber_presence_manager.h')
-rw-r--r--protocols/JabberG/src/jabber_presence_manager.h195
1 files changed, 195 insertions, 0 deletions
diff --git a/protocols/JabberG/src/jabber_presence_manager.h b/protocols/JabberG/src/jabber_presence_manager.h
new file mode 100644
index 0000000000..be138d3b93
--- /dev/null
+++ b/protocols/JabberG/src/jabber_presence_manager.h
@@ -0,0 +1,195 @@
+/*
+
+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_PRESENCE_MANAGER_H_
+#define _JABBER_PRESENCE_MANAGER_H_
+
+#include "jabber_xml.h"
+
+struct CJabberProto;
+typedef void ( CJabberProto::*JABBER_PRESENCE_PFUNC )( HXML node, void *usedata );
+typedef void ( *PRESENCE_USER_DATA_FREE_FUNC )( void *pUserData );
+
+class CJabberPresenceInfo;
+
+typedef BOOL ( CJabberProto::*JABBER_PRESENCE_HANDLER )( HXML node, ThreadData *pThreadData, CJabberPresenceInfo* pInfo );
+
+class CJabberPresenceInfo
+{
+protected:
+ friend class CJabberPresenceManager;
+ JABBER_PRESENCE_HANDLER m_pHandler;
+ CJabberPresenceInfo* m_pNext;
+
+public:
+ void *m_pUserData;
+
+ CJabberPresenceInfo()
+ {
+ ZeroMemory(this, sizeof(*this));
+ }
+ ~CJabberPresenceInfo()
+ {
+ }
+ void* GetUserData()
+ {
+ return m_pUserData;
+ }
+};
+
+class CJabberPresencePermanentInfo
+{
+ friend class CJabberPresenceManager;
+
+ CJabberPresencePermanentInfo* m_pNext;
+
+ JABBER_PRESENCE_HANDLER m_pHandler;
+ void *m_pUserData;
+ PRESENCE_USER_DATA_FREE_FUNC m_pUserDataFree;
+ int m_iPriority;
+public:
+ CJabberPresencePermanentInfo()
+ {
+ ZeroMemory(this, sizeof(CJabberPresencePermanentInfo));
+ }
+ ~CJabberPresencePermanentInfo()
+ {
+ if ( m_pUserDataFree )
+ m_pUserDataFree(m_pUserData);
+ }
+};
+
+class CJabberPresenceManager
+{
+protected:
+ CJabberProto* ppro;
+ CRITICAL_SECTION m_cs;
+ CJabberPresencePermanentInfo* m_pPermanentHandlers;
+
+public:
+ CJabberPresenceManager( CJabberProto* proto )
+ {
+ InitializeCriticalSection(&m_cs);
+ m_pPermanentHandlers = NULL;
+ ppro = proto;
+ }
+ ~CJabberPresenceManager()
+ {
+ Lock();
+ CJabberPresencePermanentInfo *pInfo = m_pPermanentHandlers;
+ while ( pInfo )
+ {
+ CJabberPresencePermanentInfo *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);
+ }
+ CJabberPresencePermanentInfo* AddPermanentHandler(JABBER_PRESENCE_HANDLER pHandler, void *pUserData = NULL, PRESENCE_USER_DATA_FREE_FUNC pUserDataFree = NULL, int iPriority = JH_PRIORITY_DEFAULT)
+ {
+ CJabberPresencePermanentInfo* pInfo = new CJabberPresencePermanentInfo();
+ if (!pInfo)
+ return NULL;
+
+ pInfo->m_pHandler = pHandler;
+ 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
+ {
+ CJabberPresencePermanentInfo* 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(CJabberPresencePermanentInfo *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
+ {
+ CJabberPresencePermanentInfo* 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 HandlePresencePermanent(HXML node, ThreadData *pThreadData);
+ BOOL FillPermanentHandlers();
+};
+
+#endif