Esempio n. 1
0
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;
}
Esempio n. 3
0
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;
}