JABBER_RESOURCE_STATUS *CJabberProto::ListFindResource( JABBER_LIST list, const TCHAR* jid ) { JABBER_RESOURCE_STATUS *result = NULL; EnterCriticalSection( &m_csLists ); int i = ListExist( list, jid ); if ( !i ) { LeaveCriticalSection( &m_csLists ); return 0; } JABBER_LIST_ITEM* LI = m_lstRoster[i-1]; const TCHAR* p = _tcschr( jid, '@' ); const TCHAR* q = _tcschr(( p == NULL ) ? jid : p, '/' ); if (q) { const TCHAR *resource = q+1; if (*resource) for ( int j=0; j < LI->resourceCount; j++ ) if ( !_tcscmp( LI->resource[j].resourceName, resource )) { result = LI->resource + j; break; } } LeaveCriticalSection( &m_csLists ); return result; }
int CJabberProto::OnContactDeleted( WPARAM wParam, LPARAM ) { if( !m_bJabberOnline ) // should never happen return 0; DBVARIANT dbv; if ( !JGetStringT(( HANDLE ) wParam, JGetByte( (HANDLE ) wParam, "ChatRoom", 0 )?(char*)"ChatRoomID":(char*)"jid", &dbv )) { if ( ListExist( LIST_ROSTER, dbv.ptszVal )) { if ( !_tcschr( dbv.ptszVal, _T( '@' ))) { TCHAR szStrippedJid[JABBER_MAX_JID_LEN]; JabberStripJid( m_ThreadInfo->fullJID, szStrippedJid, SIZEOF(szStrippedJid) ); TCHAR *szDog = _tcschr( szStrippedJid, _T('@')); if ( szDog && _tcsicmp( szDog + 1, dbv.ptszVal )) m_ThreadInfo->send( XmlNodeIq( _T("set"), SerialNext(), dbv.ptszVal ) << XQUERY( _T(JABBER_FEAT_REGISTER)) << XCHILD( _T("remove"))); } // Remove from roster, server also handles the presence unsubscription process. m_ThreadInfo->send( XmlNodeIq( _T("set"), SerialNext()) << XQUERY( _T(JABBER_FEAT_IQ_ROSTER)) << XCHILD( _T("item")) << XATTR( _T("jid"), dbv.ptszVal ) << XATTR( _T("subscription"), _T("remove"))); } JFreeVariant( &dbv ); } return 0; }
void CJabberProto::ListRemoveResource( JABBER_LIST list, const TCHAR* jid ) { EnterCriticalSection( &m_csLists ); int i = ListExist( list, jid ); JABBER_LIST_ITEM* LI = m_lstRoster[i-1]; if ( !i || LI == NULL ) { LeaveCriticalSection( &m_csLists ); return; } const TCHAR* p = _tcschr( jid, '@' ); const TCHAR* q = _tcschr(( p == NULL ) ? jid : p, '/' ); if ( q ) { const TCHAR* resource = q+1; if ( resource[0] ) { JABBER_RESOURCE_STATUS* r = LI->resource; int j; for ( j=0; j < LI->resourceCount; j++, r++ ) { if ( !_tcsicmp( r->resourceName, resource )) break; } if ( j < LI->resourceCount ) { // Found last seen resource ID to be removed if ( LI->lastSeenResource == j ) LI->lastSeenResource = -1; else if ( LI->lastSeenResource > j ) LI->lastSeenResource--; // update manually selected resource ID if (LI->resourceMode == RSMODE_MANUAL) { if ( LI->manualResource == j ) { LI->resourceMode = RSMODE_LASTSEEN; LI->manualResource = -1; } else if ( LI->manualResource > j ) LI->manualResource--; } // Update MirVer due to possible resource changes UpdateMirVer(LI); JabberListFreeResourceInternal( r ); if ( LI->resourceCount-- == 1 ) { mir_free( r ); LI->resource = NULL; } else { memmove( r, r+1, ( LI->resourceCount-j )*sizeof( JABBER_RESOURCE_STATUS )); LI->resource = ( JABBER_RESOURCE_STATUS* )mir_realloc( LI->resource, LI->resourceCount*sizeof( JABBER_RESOURCE_STATUS )); } } } } LeaveCriticalSection( &m_csLists ); MenuUpdateSrmmIcon(LI); }
void CJabberProto::ListRemove( JABBER_LIST list, const TCHAR* jid ) { EnterCriticalSection( &m_csLists ); int i = ListExist( list, jid ); if ( i != 0 ) { JabberListFreeItemInternal( m_lstRoster[ --i ] ); m_lstRoster.remove( i ); } LeaveCriticalSection( &m_csLists ); }
int CJabberProto::ListAddResource( JABBER_LIST list, const TCHAR* jid, int status, const TCHAR* statusMessage, char priority, const TCHAR* nick ) { EnterCriticalSection( &m_csLists ); int i = ListExist( list, jid ); if ( !i ) { LeaveCriticalSection( &m_csLists ); return 0; } JABBER_LIST_ITEM* LI = m_lstRoster[i-1]; int bIsNewResource = false, j; const TCHAR* p = _tcschr( jid, '@' ); const TCHAR* q = _tcschr(( p == NULL ) ? jid : p, '/' ); if ( q ) { const TCHAR* resource = q+1; if ( resource[0] ) { JABBER_RESOURCE_STATUS* r = LI->resource; for ( j=0; j < LI->resourceCount; j++, r++ ) { if ( !_tcscmp( r->resourceName, resource )) { // Already exist, update status and statusMessage r->status = status; replaceStr( r->statusMessage, statusMessage ); r->priority = priority; break; } } if ( j >= LI->resourceCount ) { // Not already exist, add new resource LI->resource = ( JABBER_RESOURCE_STATUS * ) mir_realloc( LI->resource, ( LI->resourceCount+1 )*sizeof( JABBER_RESOURCE_STATUS )); bIsNewResource = true; r = LI->resource + LI->resourceCount++; memset( r, 0, sizeof( JABBER_RESOURCE_STATUS )); r->status = status; r->affiliation = AFFILIATION_NONE; r->role = ROLE_NONE; r->resourceName = mir_tstrdup( resource ); r->nick = mir_tstrdup( nick ); if ( statusMessage ) r->statusMessage = mir_tstrdup( statusMessage ); r->priority = priority; } } } // No resource, update the main statusMessage else { LI->itemResource.status = status; replaceStr( LI->itemResource.statusMessage, statusMessage ); } LeaveCriticalSection( &m_csLists ); MenuUpdateSrmmIcon(LI); return bIsNewResource; }
JABBER_LIST_ITEM *CJabberProto::ListGetItemPtr( JABBER_LIST list, const TCHAR* jid ) { EnterCriticalSection( &m_csLists ); int i = ListExist( list, jid ); if ( !i ) { LeaveCriticalSection( &m_csLists ); return NULL; } i--; LeaveCriticalSection( &m_csLists ); return m_lstRoster[i]; }
BOOL TestListExist() { list<unsigned int >list ; TCHAR szBuffer[MAX_PATH] ={0} ; int i = 1 ; for (; i < 20; ++i) { list.push_back(i) ; } if (TRUE == ListExist(NULL, 0)) { OutputDebugString("TestListExist ListExist(NULL, 0) failed\r\n") ; return FALSE ; } for (i = 1; i < 20; ++i) { if (FALSE == ListExist(&list, i)) { sprintf_s(szBuffer, MAX_PATH * sizeof(TCHAR), _T("TestListExist ListExist(&list, %d) failed\r\n"), i) ; OutputDebugString(szBuffer) ; return FALSE ; } } for (; i < 40; ++i) { if (TRUE == ListExist(&list, i)) { sprintf_s(szBuffer, MAX_PATH * sizeof(TCHAR), _T("TestListExist ListExist(&list, %d) failed\r\n"), i) ; OutputDebugString(szBuffer) ; return FALSE ; } } OutputDebugString(_T("TestListExist pass !\r\n")) ; return TRUE ; }
JABBER_LIST_ITEM *CJabberProto::ListAdd( JABBER_LIST list, const TCHAR* jid ) { JABBER_LIST_ITEM* item; BOOL bUseResource=FALSE; EnterCriticalSection( &m_csLists ); if (( item = ListGetItemPtr( list, jid )) != NULL ) { LeaveCriticalSection( &m_csLists ); return item; } TCHAR *s = mir_tstrdup( jid ); TCHAR *q = NULL; // strip resource name if any //fyr if ( !((list== LIST_ROSTER ) && ListExist(LIST_CHATROOM, jid))) { // but only if it is not chat room contact if ( list != LIST_VCARD_TEMP ) { TCHAR *p; if (( p = _tcschr( s, '@' )) != NULL ) if (( q = _tcschr( p, '/' )) != NULL ) *q = '\0'; } } else { bUseResource=TRUE; } if ( !bUseResource && list== LIST_ROSTER ) { //if it is a chat room keep resource and made it resource sensitive if ( ChatRoomHContactFromJID( s ) ) { if (q != NULL) *q='/'; bUseResource=TRUE; } } item = ( JABBER_LIST_ITEM* )mir_alloc( sizeof( JABBER_LIST_ITEM )); ZeroMemory( item, sizeof( JABBER_LIST_ITEM )); item->list = list; item->jid = s; item->itemResource.status = ID_STATUS_OFFLINE; item->resource = NULL; item->resourceMode = RSMODE_LASTSEEN; item->lastSeenResource = -1; item->manualResource = -1; item->bUseResource = bUseResource; m_lstRoster.insert( item ); LeaveCriticalSection( &m_csLists ); MenuUpdateSrmmIcon(item); return item; }
//******************************************************************************* // // 函 数 名 : SetCallBreakPoint // 功能描述 : 在地址范围内下断点 // 参数列表 : pRunData -- RunData指针 // uFunctionStart -- 函数起始地址 // uFunctionEnd -- 函数结束地址 // 说 明 : 并没有对函数的正确性做检查 // 返回结果 : 成功返回TRUE,失败返回FALSE // //****************************************************************************** BOOL SetCallBreakPoint(PRunData pRunData, ulong uFunctionStart, ulong uFunctionEnd) { char szSrcDec[1024] = {0}; char szLine[1024] = {0}; char szName[TEXTLEN] = {0} ; t_disasm disasm = {0}; ulong uIndex = uFunctionStart ; ulong uSize = 0 ; ulong uInstructSize = 0 ; InitTreeHead(pRunData) ; // 保留函数起始地址 pRunData->pCurrentNode->dwFuncStart = uFunctionStart ; // 保留函数结束地址 pRunData->pCurrentNode->dwFuncEnd = uFunctionEnd ; for (; uIndex < uFunctionEnd; uIndex += uInstructSize) { uSize = Readcommand(uIndex, szLine) ; // 再判断是不是call // 反汇编二进制指令 uInstructSize = Disasm((uchar *)szLine, uSize, uIndex, (uchar *)szSrcDec, &disasm, DISASM_ALL, 0); if (StrStrI(disasm.result, "CALL") || StrStrI(disasm.result, "ret")) { // 是call直接下断点,方便日后api记录 if(0 == Setbreakpointext(uIndex,TY_ACTIVE,0,0)) { // 先判断断点是否存在,不存在的话丢进链表中去 if(FALSE == ListExist(&pRunData->BreakPointList, uIndex)) { pRunData->BreakPointList.push_back(uIndex) ; } } } } // 判断当前设的断点是不是在显示屏幕中,是的话刷新 ulong uBase = 0 ; Getdisassemblerrange(&uBase, &uSize) ; if (uFunctionStart >= uBase && uFunctionStart <= (uBase + uSize)) { Redrawdisassembler() ; } return TRUE ; }
TCHAR* CJabberProto::ListGetBestClientResourceNamePtr( const TCHAR* jid ) { EnterCriticalSection( &m_csLists ); int i = ListExist( LIST_ROSTER, jid ); if ( !i ) { LeaveCriticalSection( &m_csLists ); return NULL; } JABBER_LIST_ITEM* LI = m_lstRoster[i-1]; TCHAR* res = ListGetBestResourceNamePtr( jid ); if ( res == NULL ) { JABBER_RESOURCE_STATUS* r = LI->resource; int status = ID_STATUS_OFFLINE; res = NULL; for ( i=0; i < LI->resourceCount; i++ ) { int s = r[i].status; BOOL foundBetter = FALSE; switch ( s ) { case ID_STATUS_FREECHAT: foundBetter = TRUE; break; case ID_STATUS_ONLINE: if ( status != ID_STATUS_FREECHAT ) foundBetter = TRUE; break; case ID_STATUS_DND: if ( status != ID_STATUS_FREECHAT && status != ID_STATUS_ONLINE ) foundBetter = TRUE; break; case ID_STATUS_AWAY: if ( status != ID_STATUS_FREECHAT && status != ID_STATUS_ONLINE && status != ID_STATUS_DND ) foundBetter = TRUE; break; case ID_STATUS_NA: if ( status != ID_STATUS_FREECHAT && status != ID_STATUS_ONLINE && status != ID_STATUS_DND && status != ID_STATUS_AWAY ) foundBetter = TRUE; break; } if ( foundBetter ) { res = r[i].resourceName; status = s; } } } LeaveCriticalSection( &m_csLists ); return res; }
TCHAR* CJabberProto::ListGetBestResourceNamePtr( const TCHAR* jid ) { EnterCriticalSection( &m_csLists ); int i = ListExist( LIST_ROSTER, jid ); if ( !i ) { LeaveCriticalSection( &m_csLists ); return NULL; } TCHAR* res = NULL; JABBER_LIST_ITEM* LI = m_lstRoster[i-1]; if ( LI->resourceCount > 1 ) { if ( LI->resourceMode == RSMODE_LASTSEEN && LI->lastSeenResource>=0 && LI->lastSeenResource < LI->resourceCount ) res = LI->resource[ LI->lastSeenResource ].resourceName; else if (LI->resourceMode == RSMODE_MANUAL && LI->manualResource>=0 && LI->manualResource < LI->resourceCount ) res = LI->resource[ LI->manualResource ].resourceName; else { int nBestPos = -1, nBestPri = -200, j; for ( j = 0; j < LI->resourceCount; j++ ) { if ( LI->resource[ j ].priority > nBestPri ) { nBestPri = LI->resource[ j ].priority; nBestPos = j; } } if ( nBestPos != -1 ) res = LI->resource[ nBestPos ].resourceName; } } if ( !res && LI->resource) res = LI->resource[0].resourceName; LeaveCriticalSection( &m_csLists ); return res; }