BOOL SM_RemoveAll (void) { while (m_WndList) { SESSION_INFO *pLast = m_WndList->next; if(m_WndList->hWnd) { SendMessage(m_WndList->hWnd, GC_EVENT_CONTROL+WM_USER+500, SESSION_TERMINATE, 2); } DoEventHook(m_WndList->pszID, m_WndList->pszModule, GC_SESSION_TERMINATE, NULL, NULL, (DWORD)m_WndList->dwItemData); if(m_WndList->hContact) CList_SetOffline(m_WndList->hContact, m_WndList->iType == GCW_CHATROOM?TRUE:FALSE); DBWriteContactSettingString(m_WndList->hContact, m_WndList->pszModule , "Topic", ""); DBDeleteContactSetting(m_WndList->hContact, "CList", "StatusMsg"); DBWriteContactSettingString(m_WndList->hContact, m_WndList->pszModule, "StatusBar", ""); UM_RemoveAll(&m_WndList->pUsers); TM_RemoveAll(&m_WndList->pStatuses); LM_RemoveAll(&m_WndList->pLog, &m_WndList->pLogEnd); m_WndList->iStatusCount = 0; m_WndList->nUsersInNicklist = 0; free (m_WndList->pszID); free (m_WndList->pszModule); if(m_WndList->pszName) free(m_WndList->pszName); if(m_WndList->pszStatusbarText) free(m_WndList->pszStatusbarText); if(m_WndList->pszTopic) free(m_WndList->pszTopic); while (m_WndList->lpCommands != NULL) { COMMAND_INFO *pNext = m_WndList->lpCommands->next; free(m_WndList->lpCommands->lpCommand); free(m_WndList->lpCommands); m_WndList->lpCommands = pNext; } free (m_WndList); m_WndList = pLast; } m_WndList = NULL; return TRUE; }
int SM_RemoveSession( const TCHAR* pszID, const char* pszModule) { SESSION_INFO *pTemp = m_WndList, *pLast = NULL; if (!pszModule) return FALSE; while (pTemp != NULL) { if ((!pszID && pTemp->iType != GCW_SERVER || !lstrcmpi(pTemp->ptszID,pszID)) && !lstrcmpiA(pTemp->pszModule,pszModule)) // match { COMMAND_INFO *pCurComm; DWORD dw = pTemp->dwItemData; if (!g_Settings.TabsEnable) { if (pTemp->hWnd ) SendMessage(pTemp->hWnd, GC_EVENT_CONTROL+WM_USER+500, SESSION_TERMINATE, 0); } else { if (g_TabSession.hWnd) SendMessage(g_TabSession.hWnd, GC_REMOVETAB, 1, (LPARAM)pTemp); } if (pTemp->hWnd) g_TabSession.nUsersInNicklist = 0; DoEventHook(pTemp->ptszID, pTemp->pszModule, GC_SESSION_TERMINATE, NULL, NULL, (DWORD)pTemp->dwItemData); if (pLast == NULL) m_WndList = pTemp->next; else pLast->next = pTemp->next; UM_RemoveAll(&pTemp->pUsers); TM_RemoveAll(&pTemp->pStatuses); LM_RemoveAll(&pTemp->pLog, &pTemp->pLogEnd); pTemp->iStatusCount = 0; pTemp->nUsersInNicklist = 0; // contact may have been deleted here already, since function may be called after deleting // contact so the handle may be invalid, therefore DBGetContactSettingByte shall return 0 if (pTemp->hContact && DBGetContactSettingByte( pTemp->hContact, pTemp->pszModule, "ChatRoom", 0 ) != 0) { CList_SetOffline(pTemp->hContact, pTemp->iType == GCW_CHATROOM?TRUE:FALSE); /* if (pTemp->iType != GCW_SERVER) DBWriteContactSettingByte(pTemp->hContact, "CList", "Hidden", 1);*/ DBWriteContactSettingString(pTemp->hContact, pTemp->pszModule, "Topic", ""); DBWriteContactSettingString(pTemp->hContact, pTemp->pszModule, "StatusBar", ""); DBDeleteContactSetting(pTemp->hContact, "CList", "StatusMsg"); } mir_free( pTemp->pszModule ); mir_free( pTemp->ptszID ); mir_free( pTemp->ptszName ); mir_free( pTemp->ptszStatusbarText ); mir_free( pTemp->ptszTopic ); #if defined( _UNICODE ) mir_free( pTemp->pszID ); mir_free( pTemp->pszName ); #endif // delete commands pCurComm = pTemp->lpCommands; while (pCurComm != NULL) { COMMAND_INFO *pNext = pCurComm->next; mir_free(pCurComm->lpCommand); mir_free(pCurComm); pCurComm = pNext; } mir_free(pTemp); if (pszID) return (int)dw; if (pLast) pTemp = pLast->next; else pTemp = m_WndList; } else { pLast = pTemp; pTemp = pTemp->next; } } return FALSE; }
int SM_RemoveSession(const TCHAR* pszID, const char* pszModule, bool removeContact) { SESSION_INFO* pTemp = m_WndList, *pLast = NULL; if (!pszModule) return FALSE; while (pTemp != NULL) { if ((!pszID && pTemp->iType != GCW_SERVER || !lstrcmpi(pTemp->ptszID, pszID)) && !lstrcmpiA(pTemp->pszModule, pszModule)) { // match COMMAND_INFO *pCurComm; DWORD dw = pTemp->dwItemData; if (pTemp->hWnd) SendMessage(pTemp->hWnd, GC_EVENT_CONTROL + WM_USER + 500, SESSION_TERMINATE, 0); DoEventHook(pTemp->ptszID, pTemp->pszModule, GC_SESSION_TERMINATE, NULL, NULL, (DWORD)pTemp->dwItemData); if (pLast == NULL) m_WndList = pTemp->next; else pLast->next = pTemp->next; UM_RemoveAll(&pTemp->pUsers); TM_RemoveAll(&pTemp->pStatuses); LM_RemoveAll(&pTemp->pLog, &pTemp->pLogEnd); pTemp->iStatusCount = 0; pTemp->nUsersInNicklist = 0; if (pTemp->hContact) { CList_SetOffline(pTemp->hContact, pTemp->iType == GCW_CHATROOM ? TRUE : FALSE); //if (pTemp->iType != GCW_SERVER) //DBWriteContactSettingByte(pTemp->hContact, "CList", "Hidden", 1); } DBWriteContactSettingString(pTemp->hContact, pTemp->pszModule , "Topic", ""); DBWriteContactSettingString(pTemp->hContact, pTemp->pszModule, "StatusBar", ""); DBDeleteContactSetting(pTemp->hContact, "CList", "StatusMsg"); if (removeContact) CallService(MS_DB_CONTACT_DELETE, (WPARAM)pTemp->hContact, 0); mir_free(pTemp->pszModule); mir_free(pTemp->ptszID); mir_free(pTemp->ptszName); mir_free(pTemp->ptszStatusbarText); mir_free(pTemp->ptszTopic); mir_free(pTemp->pszID); mir_free(pTemp->pszName); // delete commands pCurComm = pTemp->lpCommands; while (pCurComm != NULL) { COMMAND_INFO *pNext = pCurComm->next; mir_free(pCurComm->lpCommand); mir_free(pCurComm); pCurComm = pNext; } mir_free(pTemp); if (pszID) return (int)dw; if (pLast) pTemp = pLast->next; else pTemp = m_WndList; } else { pLast = pTemp; pTemp = pTemp->next; } } return FALSE; }