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; }
static INT_PTR Service_NewChat(WPARAM wParam, LPARAM lParam) { MODULEINFO* mi; GCSESSION *gcw =(GCSESSION *)lParam; if (gcw== NULL) return GC_NEWSESSION_ERROR; if (gcw->cbSize != SIZEOF_STRUCT_GCWINDOW_V1) return GC_NEWSESSION_WRONGVER; EnterCriticalSection(&cs); if (( mi = MM_FindModule( gcw->pszModule )) != NULL ) { TCHAR* ptszID = a2tf( gcw->ptszID, gcw->dwFlags ); SESSION_INFO* si = SM_AddSession( ptszID, gcw->pszModule); if (mi->hOfflineIcon == NULL) { LoadModuleIcons(mi); } // create a new session and set the defaults if ( si != NULL ) { TCHAR szTemp[256]; si->dwItemData = gcw->dwItemData; if ( gcw->iType != GCW_SERVER ) si->wStatus = ID_STATUS_ONLINE; si->iType = gcw->iType; si->dwFlags = gcw->dwFlags; si->ptszName = a2tf( gcw->ptszName, gcw->dwFlags ); si->ptszStatusbarText = a2tf( gcw->ptszStatusbarText, gcw->dwFlags ); si->iSplitterX = g_Settings.iSplitterX; si->iSplitterY = g_Settings.iSplitterY; si->iLogFilterFlags = (int)DBGetContactSettingDword(NULL, "Chat", "FilterFlags", 0x03E0); si->bFilterEnabled = DBGetContactSettingByte(NULL, "Chat", "FilterEnabled", 0); si->bNicklistEnabled = DBGetContactSettingByte(NULL, "Chat", "ShowNicklist", 1); #if defined( _UNICODE ) if ( !( gcw->dwFlags & GC_UNICODE )) { si->pszID = mir_strdup( gcw->pszID ); si->pszName = mir_strdup( gcw->pszName ); } #endif if ( mi->bColor ) { si->iFG = 4; si->bFGSet = TRUE; } if ( mi->bBkgColor ) { si->iBG = 2; si->bBGSet = TRUE; } if (si->iType == GCW_SERVER) mir_sntprintf(szTemp, SIZEOF(szTemp), _T("Server: %s"), si->ptszName); else mir_sntprintf(szTemp, SIZEOF(szTemp), _T("%s"), si->ptszName); si->windowData.hContact = CList_AddRoom( gcw->pszModule, ptszID, szTemp, si->iType); si->windowData.codePage = DBGetContactSettingWord(si->windowData.hContact, si->pszModule, "CodePage", (WORD) CP_ACP); si->pszHeader = Log_CreateRtfHeader(mi, si); DBWriteContactSettingString(si->windowData.hContact, si->pszModule , "Topic", ""); DBDeleteContactSetting(si->windowData.hContact, "CList", "StatusMsg"); if (si->ptszStatusbarText) DBWriteContactSettingTString(si->windowData.hContact, si->pszModule, "StatusBar", si->ptszStatusbarText); else DBWriteContactSettingString(si->windowData.hContact, si->pszModule, "StatusBar", ""); } else { SESSION_INFO* si2 = SM_FindSession( ptszID, gcw->pszModule ); if ( si2 ) { UM_RemoveAll(&si2->pUsers); TM_RemoveAll(&si2->pStatuses); si2->iStatusCount = 0; si2->nUsersInNicklist = 0; if (si2->hWnd ) RedrawWindow(GetDlgItem(si2->hWnd, IDC_CHAT_LIST), NULL, NULL, RDW_INVALIDATE); } } LeaveCriticalSection(&cs); mir_free( ptszID ); return 0; } LeaveCriticalSection(&cs); return GC_NEWSESSION_ERROR; }
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; }