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_rc.h | 314 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 314 insertions(+) create mode 100644 protocols/JabberG/src/jabber_rc.h (limited to 'protocols/JabberG/src/jabber_rc.h') diff --git a/protocols/JabberG/src/jabber_rc.h b/protocols/JabberG/src/jabber_rc.h new file mode 100644 index 0000000000..cb3bf1b9cc --- /dev/null +++ b/protocols/JabberG/src/jabber_rc.h @@ -0,0 +1,314 @@ +/* + +Jabber Protocol Plugin for Miranda IM +Copyright ( C ) 2002-04 Santithorn Bunchua +Copyright ( C ) 2005-12 George Hazan +Copyright ( C ) 2007 Maxim Mluhov + +XEP-0146 support for Miranda IM + +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_RC_H_ +#define _JABBER_RC_H_ + +class CJabberAdhocSession; + +#define JABBER_ADHOC_HANDLER_STATUS_EXECUTING 1 +#define JABBER_ADHOC_HANDLER_STATUS_COMPLETED 2 +#define JABBER_ADHOC_HANDLER_STATUS_CANCEL 3 +#define JABBER_ADHOC_HANDLER_STATUS_REMOVE_SESSION 4 +typedef int ( CJabberProto::*JABBER_ADHOC_HANDLER )( HXML iqNode, CJabberIqInfo* pInfo, CJabberAdhocSession* pSession ); + +// 5 minutes to fill out form :) +#define JABBER_ADHOC_SESSION_EXPIRE_TIME 300000 + +class CJabberAdhocSession +{ +protected: + CMString m_szSessionId; + CJabberAdhocSession* m_pNext; + DWORD m_dwStartTime; + + void* m_pUserData; + BOOL m_bAutofreeUserData; + + DWORD m_dwStage; +public: + CJabberProto* ppro; + CJabberAdhocSession( CJabberProto* global ); + ~CJabberAdhocSession() + { + if ( m_bAutofreeUserData && m_pUserData ) + mir_free( m_pUserData ); + if ( m_pNext ) + delete m_pNext; + } + CJabberAdhocSession* GetNext() + { + return m_pNext; + } + CJabberAdhocSession* SetNext( CJabberAdhocSession *pNext ) + { + CJabberAdhocSession *pRetVal = m_pNext; + m_pNext = pNext; + return pRetVal; + } + DWORD GetSessionStartTime() + { + return m_dwStartTime; + } + LPCTSTR GetSessionId() + { + return m_szSessionId; + } + BOOL SetUserData( void* pUserData, BOOL bAutofree = FALSE ) + { + if ( m_bAutofreeUserData && m_pUserData ) + mir_free( m_pUserData ); + m_pUserData = pUserData; + m_bAutofreeUserData = bAutofree; + return TRUE; + } + DWORD SetStage( DWORD dwStage ) + { + DWORD dwRetVal = m_dwStage; + m_dwStage = dwStage; + return dwRetVal; + } + DWORD GetStage() + { + return m_dwStage; + } +}; + +class CJabberAdhocNode; +class CJabberAdhocNode +{ +protected: + TCHAR* m_szJid; + TCHAR* m_szNode; + TCHAR* m_szName; + CJabberAdhocNode* m_pNext; + JABBER_ADHOC_HANDLER m_pHandler; + CJabberProto* m_pProto; +public: + CJabberAdhocNode( CJabberProto* pProto, TCHAR* szJid, TCHAR* szNode, TCHAR* szName, JABBER_ADHOC_HANDLER pHandler ) + { + ZeroMemory( this, sizeof( CJabberAdhocNode )); + replaceStrT( m_szJid, szJid ); + replaceStrT( m_szNode, szNode ); + replaceStrT( m_szName, szName ); + m_pHandler = pHandler; + m_pProto = pProto; + } + ~CJabberAdhocNode() + { + if ( m_szJid) + mir_free( m_szJid ); + if ( m_szNode ) + mir_free( m_szNode ); + if ( m_szName ) + mir_free( m_szName ); + if ( m_pNext ) + delete m_pNext; + } + CJabberAdhocNode* GetNext() + { + return m_pNext; + } + CJabberAdhocNode* SetNext( CJabberAdhocNode *pNext ) + { + CJabberAdhocNode *pRetVal = m_pNext; + m_pNext = pNext; + return pRetVal; + } + TCHAR* GetJid() + { + return m_szJid; + } + TCHAR* GetNode() + { + return m_szNode; + } + TCHAR* GetName() + { + return m_szName; + } + BOOL CallHandler( HXML iqNode, CJabberIqInfo* pInfo, CJabberAdhocSession* pSession ) + { + if ( m_pHandler == NULL ) + return FALSE; + return (m_pProto->*m_pHandler)( iqNode, pInfo, pSession ); + } +}; + +class CJabberAdhocManager +{ +protected: + CJabberProto* m_pProto; + CJabberAdhocNode* m_pNodes; + CJabberAdhocSession* m_pSessions; + CRITICAL_SECTION m_cs; + + CJabberAdhocSession* FindSession( const TCHAR* szSession ) + { + CJabberAdhocSession* pSession = m_pSessions; + while ( pSession ) { + if ( !_tcscmp( pSession->GetSessionId(), szSession )) + return pSession; + pSession = pSession->GetNext(); + } + return NULL; + } + + CJabberAdhocSession* AddNewSession() + { + CJabberAdhocSession* pSession = new CJabberAdhocSession( m_pProto ); + if ( !pSession ) + return NULL; + + pSession->SetNext( m_pSessions ); + m_pSessions = pSession; + + return pSession; + } + + CJabberAdhocNode* FindNode( const TCHAR* szNode ) + { + CJabberAdhocNode* pNode = m_pNodes; + while ( pNode ) { + if ( !_tcscmp( pNode->GetNode(), szNode )) + return pNode; + pNode = pNode->GetNext(); + } + return NULL; + } + + BOOL RemoveSession( CJabberAdhocSession* pSession ) + { + if ( !m_pSessions ) + return FALSE; + + if ( pSession == m_pSessions ) { + m_pSessions = m_pSessions->GetNext(); + pSession->SetNext( NULL ); + delete pSession; + return TRUE; + } + + CJabberAdhocSession* pTmp = m_pSessions; + while ( pTmp->GetNext()) { + if ( pTmp->GetNext() == pSession ) { + pTmp->SetNext( pSession->GetNext()); + pSession->SetNext( NULL ); + delete pSession; + return TRUE; + } + pTmp = pTmp->GetNext(); + } + return FALSE; + } + + BOOL _ExpireSession( DWORD dwExpireTime ) + { + if ( !m_pSessions ) + return FALSE; + + CJabberAdhocSession* pSession = m_pSessions; + if ( pSession->GetSessionStartTime() < dwExpireTime ) { + m_pSessions = pSession->GetNext(); + pSession->SetNext( NULL ); + delete pSession; + return TRUE; + } + + while ( pSession->GetNext()) { + if ( pSession->GetNext()->GetSessionStartTime() < dwExpireTime ) { + CJabberAdhocSession* pRetVal = pSession->GetNext(); + pSession->SetNext( pSession->GetNext()->GetNext()); + pRetVal->SetNext( NULL ); + delete pRetVal; + return TRUE; + } + pSession = pSession->GetNext(); + } + return FALSE; + } + +public: + CJabberAdhocManager( CJabberProto* pProto ) + { + ZeroMemory( this, sizeof( CJabberAdhocManager )); + m_pProto = pProto; + InitializeCriticalSection( &m_cs ); + } + ~CJabberAdhocManager() + { + if ( m_pNodes ) + delete m_pNodes; + if ( m_pSessions ) + delete m_pSessions; + DeleteCriticalSection( &m_cs ); + } + void Lock() + { + EnterCriticalSection( &m_cs ); + } + void Unlock() + { + LeaveCriticalSection( &m_cs ); + } + BOOL FillDefaultNodes(); + BOOL AddNode( TCHAR* szJid, TCHAR* szNode, TCHAR* szName, JABBER_ADHOC_HANDLER pHandler ) + { + CJabberAdhocNode* pNode = new CJabberAdhocNode( m_pProto, szJid, szNode, szName, pHandler ); + if ( !pNode ) + return FALSE; + + Lock(); + if ( !m_pNodes ) + m_pNodes = pNode; + else { + CJabberAdhocNode* pTmp = m_pNodes; + while ( pTmp->GetNext()) + pTmp = pTmp->GetNext(); + pTmp->SetNext( pNode ); + } + Unlock(); + + return TRUE; + } + CJabberAdhocNode* GetFirstNode() + { + return m_pNodes; + } + BOOL HandleItemsRequest( HXML iqNode, CJabberIqInfo* pInfo, const TCHAR* szNode ); + BOOL HandleInfoRequest( HXML iqNode, CJabberIqInfo* pInfo, const TCHAR* szNode ); + BOOL HandleCommandRequest( HXML iqNode, CJabberIqInfo* pInfo, const TCHAR* szNode ); + + BOOL ExpireSessions() + { + Lock(); + DWORD dwExpireTime = GetTickCount() - JABBER_ADHOC_SESSION_EXPIRE_TIME; + while ( _ExpireSession( dwExpireTime )); + Unlock(); + return TRUE; + } +}; + +#endif //_JABBER_RC_H_ -- cgit v1.2.3