From b9a3a98d6f2695a36ca27fa2d88e99fedd72cc98 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Fri, 10 Mar 2017 21:46:59 +0300 Subject: Group chats: - GC_CONTROL_MSG left us forever; - tons of old/unused/useless slack simply wiped out; - new function: CSrmmBaseDialog::ClearLog --- src/mir_app/src/chat.h | 7 +- src/mir_app/src/chat_manager.cpp | 143 ++++++++++++++------------------------- src/mir_app/src/chat_svc.cpp | 52 +++++++------- src/mir_app/src/mir_app.def | 1 + src/mir_app/src/mir_app64.def | 1 + src/mir_app/src/srmm_base.cpp | 16 +++++ 6 files changed, 97 insertions(+), 123 deletions(-) (limited to 'src/mir_app') diff --git a/src/mir_app/src/chat.h b/src/mir_app/src/chat.h index d081407ac6..dee0182b12 100644 --- a/src/mir_app/src/chat.h +++ b/src/mir_app/src/chat.h @@ -58,12 +58,11 @@ char* SM_GetUsers(SESSION_INFO *si); BOOL SM_GiveStatus(const wchar_t *pszID, const char *pszModule, const wchar_t *pszUID, const wchar_t *pszStatus); BOOL SM_MoveUser(const wchar_t *pszID, const char *pszModule, const wchar_t *pszUID); void SM_RemoveAll(void); -int SM_RemoveSession(const wchar_t *pszID, const char *pszModule, BOOL removeContact); +int SM_RemoveSession(const wchar_t *pszID, const char *pszModule, bool removeContact); BOOL SM_RemoveUser(const wchar_t *pszID, const char *pszModule, const wchar_t *pszUID); -LRESULT SM_SendMessage(const wchar_t *pszID, const char *pszModule, UINT msg, WPARAM wParam, LPARAM lParam); BOOL SM_SetContactStatus(const wchar_t *pszID, const char *pszModule, const wchar_t *pszUID, WORD wStatus); -BOOL SM_SetOffline(const wchar_t *pszID, const char *pszModule); -BOOL SM_SetStatus(const wchar_t *pszID, const char *pszModule, int wStatus); +BOOL SM_SetOffline(SESSION_INFO *si); +BOOL SM_SetStatus(SESSION_INFO *si, int wStatus); BOOL SM_TakeStatus(const wchar_t *pszID, const char *pszModule, const wchar_t *pszUID, const wchar_t *pszStatus); SESSION_INFO* SM_FindSession(const wchar_t *pszID, const char *pszModule); diff --git a/src/mir_app/src/chat_manager.cpp b/src/mir_app/src/chat_manager.cpp index 2fa68a3f90..0f9024d306 100644 --- a/src/mir_app/src/chat_manager.cpp +++ b/src/mir_app/src/chat_manager.cpp @@ -42,7 +42,7 @@ CHAT_MANAGER chatApi; MODULEINFO *m_ModList = 0; -static void SetActiveSessionEx(SESSION_INFO *si) +static void SetActiveSession(SESSION_INFO *si) { if (si) { replaceStrW(chatApi.szActiveWndID, si->ptszID); @@ -50,13 +50,6 @@ static void SetActiveSessionEx(SESSION_INFO *si) } } -static void SetActiveSession(const wchar_t *pszID, const char *pszModule) -{ - SESSION_INFO *si = SM_FindSession(pszID, pszModule); - if (si) - SetActiveSessionEx(si); -} - static SESSION_INFO* GetActiveSession(void) { SESSION_INFO *si = SM_FindSession(chatApi.szActiveWndID, chatApi.szActiveWndModule); @@ -72,8 +65,21 @@ static SESSION_INFO* GetActiveSession(void) // Keeps track of all sessions and its windows //--------------------------------------------------- -static void SM_FreeSession(SESSION_INFO *si) +static void SM_FreeSession(SESSION_INFO *si, bool bRemoveContact = false) { + if (cli.pfnGetEvent(si->hContact, 0)) + cli.pfnRemoveEvent(si->hContact, GC_FAKE_EVENT); + si->wState &= ~STATE_TALK; + db_set_w(si->hContact, si->pszModule, "ApparentMode", 0); + + if (si->pDlg) + SendMessage(si->pDlg->GetHwnd(), GC_CLOSEWINDOW, 0, 1); + + DoEventHook(si, GC_SESSION_TERMINATE, nullptr, nullptr, (INT_PTR)si->pItemData); + + if (si->hContact && bRemoveContact) + db_delete_contact(si->hContact); + // contact may have been deleted here already, since function may be called after deleting // contact so the handle may be invalid, therefore db_get_b shall return 0 if (si->hContact && db_get_b(si->hContact, si->pszModule, "ChatRoom", 0) != 0) { @@ -106,32 +112,28 @@ static void SM_FreeSession(SESSION_INFO *si) mir_free(si); } -int SM_RemoveSession(const wchar_t *pszID, const char *pszModule, BOOL removeContact) +int SM_RemoveSession(const wchar_t *pszID, const char *pszModule, bool removeContact) { - if (!pszModule) + if (pszModule == nullptr) return FALSE; - for (int i = g_arSessions.getCount() - 1; i >= 0; i--) { - SESSION_INFO *si = g_arSessions[i]; - // match - if ((!pszID && si->iType != GCW_SERVER || !mir_wstrcmpi(si->ptszID, pszID)) && !mir_strcmpi(si->pszModule, pszModule)) { - if (si->pDlg) - SendMessage(si->pDlg->GetHwnd(), GC_CONTROL_MSG, SESSION_TERMINATE, 0); - DoEventHook(si, GC_SESSION_TERMINATE, nullptr, nullptr, (INT_PTR)si->pItemData); + if (pszID != nullptr) { + SESSION_INFO *si = SM_FindSession(pszID, pszModule); + if (si == nullptr) + return FALSE; - // contact may have been deleted here already, since function may be called after deleting - // contact so the handle may be invalid, therefore db_get_b shall return 0 - if (si->hContact && removeContact) - db_delete_contact(si->hContact); + SM_FreeSession(si, removeContact); + return TRUE; + } - SM_FreeSession(si); + for (int i = g_arSessions.getCount() - 1; i >= 0; i--) { + SESSION_INFO *si = g_arSessions[i]; + if (si->iType != GCW_SERVER && !mir_strcmpi(si->pszModule, pszModule)) { + SM_FreeSession(si, removeContact); g_arSessions.remove(i); - - if (pszID) - return 1; } } - return FALSE; + return TRUE; } SESSION_INFO* SM_FindSession(const wchar_t *pszID, const char *pszModule) @@ -147,26 +149,18 @@ SESSION_INFO* SM_FindSession(const wchar_t *pszID, const char *pszModule) return g_arSessions.find(&tmp); } -BOOL SM_SetOffline(const wchar_t *pszID, const char *pszModule) +BOOL SM_SetOffline(SESSION_INFO *si) { - if (!pszModule) + if (si == nullptr) return FALSE; - for (int i = 0; i < g_arSessions.getCount(); i++) { - SESSION_INFO *si = g_arSessions[i]; - if ((pszID && mir_wstrcmpi(si->ptszID, pszID)) || mir_strcmpi(si->pszModule, pszModule)) - continue; - - chatApi.UM_RemoveAll(&si->pUsers); - si->pMe = nullptr; - si->nUsersInNicklist = 0; - if (si->iType != GCW_SERVER) - si->bInitDone = false; - if (chatApi.OnOfflineSession) - chatApi.OnOfflineSession(si); - if (pszID) - return TRUE; - } + chatApi.UM_RemoveAll(&si->pUsers); + si->pMe = nullptr; + si->nUsersInNicklist = 0; + if (si->iType != GCW_SERVER) + si->bInitDone = false; + if (chatApi.OnOfflineSession) + chatApi.OnOfflineSession(si); return TRUE; } @@ -308,27 +302,6 @@ BOOL SM_TakeStatus(const wchar_t *pszID, const char *pszModule, const wchar_t *p return TRUE; } -LRESULT SM_SendMessage(const wchar_t *pszID, const char *pszModule, UINT msg, WPARAM wParam, LPARAM lParam) -{ - if (pszModule == nullptr) - return 0; - - for (int i = 0; i < g_arSessions.getCount(); i++) { - SESSION_INFO *si = g_arSessions[i]; - if ((pszID && mir_wstrcmpi(si->ptszID, pszID)) || mir_strcmpi(si->pszModule, pszModule)) - continue; - - if (si->pDlg) { - LRESULT res = SendMessage(si->pDlg->GetHwnd(), msg, wParam, lParam); - if (pszID) - return res; - } - if (pszID) - return 0; - } - return 0; -} - static BOOL SM_BroadcastMessage(const char *pszModule, UINT msg, WPARAM wParam, LPARAM lParam, BOOL bAsync) { for (int i = 0; i < g_arSessions.getCount(); i++) { @@ -346,30 +319,19 @@ static BOOL SM_BroadcastMessage(const char *pszModule, UINT msg, WPARAM wParam, return TRUE; } -BOOL SM_SetStatus(const wchar_t *pszID, const char *pszModule, int wStatus) +BOOL SM_SetStatus(SESSION_INFO *si, int wStatus) { - if (!pszModule) - return FALSE; - - for (int i = 0; i < g_arSessions.getCount(); i++) { - SESSION_INFO *si = g_arSessions[i]; - if ((pszID && mir_wstrcmpi(si->ptszID, pszID)) || mir_strcmpi(si->pszModule, pszModule)) - continue; + si->wStatus = wStatus; + if (si->hContact) { + if (si->iType != GCW_SERVER && wStatus != ID_STATUS_OFFLINE) + db_unset(si->hContact, "CList", "Hidden"); - si->wStatus = wStatus; - if (si->hContact) { - if (si->iType != GCW_SERVER && wStatus != ID_STATUS_OFFLINE) - db_unset(si->hContact, "CList", "Hidden"); - - db_set_w(si->hContact, si->pszModule, "Status", (WORD)wStatus); - } + db_set_w(si->hContact, si->pszModule, "Status", (WORD)wStatus); + } - if (chatApi.OnSetStatus) - chatApi.OnSetStatus(si, wStatus); + if (chatApi.OnSetStatus) + chatApi.OnSetStatus(si, wStatus); - if (pszID) - return TRUE; - } return TRUE; } @@ -400,15 +362,9 @@ BOOL SM_ChangeNick(const wchar_t *pszID, const char *pszModule, GCEVENT *gce) void SM_RemoveAll(void) { - for (int i = 0; i < g_arSessions.getCount(); i++) { - SESSION_INFO *si = g_arSessions[i]; - - if (si->pDlg) - SendMessage(si->pDlg->GetHwnd(), GC_CONTROL_MSG, SESSION_TERMINATE, 0); - DoEventHook(si, GC_SESSION_TERMINATE, nullptr, nullptr, (INT_PTR)si->pItemData); + for (int i = 0; i < g_arSessions.getCount(); i++) + SM_FreeSession(g_arSessions[i], false); - SM_FreeSession(si); - } g_arSessions.destroy(); } @@ -1088,7 +1044,6 @@ MIR_APP_DLL(CHAT_MANAGER*) Chat_GetInterface(CHAT_MANAGER_INITDATA *pInit, int _ g_iChatLang = _hLangpack; chatApi.SetActiveSession = SetActiveSession; - chatApi.SetActiveSessionEx = SetActiveSessionEx; chatApi.GetActiveSession = GetActiveSession; chatApi.SM_FindSession = SM_FindSession; chatApi.SM_GetStatusIcon = SM_GetStatusIcon; diff --git a/src/mir_app/src/chat_svc.cpp b/src/mir_app/src/chat_svc.cpp index 0446d8979d..8bfb9d684d 100644 --- a/src/mir_app/src/chat_svc.cpp +++ b/src/mir_app/src/chat_svc.cpp @@ -275,50 +275,52 @@ static INT_PTR __stdcall stubRoomControl(void *param) ChatConrolParam *p = (ChatConrolParam*)param; mir_cslock lck(csChat); + SESSION_INFO *si = chatApi.SM_FindSession(p->wszId, p->szModule); + if (si == nullptr) + return GC_EVENT_ERROR; + switch (p->command) { case WINDOW_HIDDEN: - if (SESSION_INFO *si = chatApi.SM_FindSession(p->wszId, p->szModule)) { - SetInitDone(si); - chatApi.SetActiveSession(si->ptszID, si->pszModule); - } - return 0; + SetInitDone(si); + chatApi.SetActiveSession(si); + if (si->pDlg) + ::SendMessage(si->pDlg->GetHwnd(), GC_CLOSEWINDOW, 0, 0); + break; - case WINDOW_MINIMIZE: - case WINDOW_MAXIMIZE: case WINDOW_VISIBLE: case SESSION_INITDONE: - if (SESSION_INFO *si = chatApi.SM_FindSession(p->wszId, p->szModule)) { - SetInitDone(si); - if (p->command != SESSION_INITDONE || db_get_b(0, CHAT_MODULE, "PopupOnJoin", 0) == 0) - chatApi.ShowRoom(si); - return 0; - } + SetInitDone(si); + if (p->command != SESSION_INITDONE || db_get_b(0, CHAT_MODULE, "PopupOnJoin", 0) == 0) + chatApi.ShowRoom(si); break; case SESSION_OFFLINE: - SM_SetOffline(p->wszId, p->szModule); - // fall through + SM_SetOffline(si); + SM_SetStatus(si, ID_STATUS_OFFLINE); + if (si->pDlg) { + ::SendMessage(si->pDlg->GetHwnd(), GC_UPDATESTATUSBAR, 0, 0); + ::SendMessage(si->pDlg->GetHwnd(), GC_UPDATENICKLIST, 0, 0); + } + break; case SESSION_ONLINE: - SM_SetStatus(p->wszId, p->szModule, p->command == SESSION_ONLINE ? ID_STATUS_ONLINE : ID_STATUS_OFFLINE); + SM_SetStatus(si, ID_STATUS_ONLINE); + if (si->pDlg) + ::SendMessage(si->pDlg->GetHwnd(), GC_UPDATESTATUSBAR, 0, 0); break; - case SESSION_TERMINATE: - return SM_RemoveSession(p->wszId, p->szModule, false); - case WINDOW_CLEARLOG: - if (SESSION_INFO *si = chatApi.SM_FindSession(p->wszId, p->szModule)) { - chatApi.LM_RemoveAll(&si->pLog, &si->pLogEnd); - si->iEventCount = 0; - si->LastTime = 0; - } + chatApi.LM_RemoveAll(&si->pLog, &si->pLogEnd); + si->iEventCount = 0; + si->LastTime = 0; + if (si->pDlg) + si->pDlg->ClearLog(); break; default: return GC_EVENT_ERROR; } - SM_SendMessage(p->wszId, p->szModule, GC_CONTROL_MSG, p->command, 0); return 0; } diff --git a/src/mir_app/src/mir_app.def b/src/mir_app/src/mir_app.def index c2562b7c58..1628ca17a9 100644 --- a/src/mir_app/src/mir_app.def +++ b/src/mir_app/src/mir_app.def @@ -411,3 +411,4 @@ ProtoGetAvatarMimeType @401 Srmm_LogStreamCallback @412 Srmm_MessageStreamCallback @413 ?DoEventHook@CSrmmBaseDialog@@IAEXHPBUUSERINFO@@PB_WH@Z @414 NONAME +?ClearLog@CSrmmBaseDialog@@QAEXXZ @415 NONAME diff --git a/src/mir_app/src/mir_app64.def b/src/mir_app/src/mir_app64.def index 8c86e46402..ad9ab48e67 100644 --- a/src/mir_app/src/mir_app64.def +++ b/src/mir_app/src/mir_app64.def @@ -411,3 +411,4 @@ ProtoGetAvatarMimeType @401 Srmm_LogStreamCallback @412 Srmm_MessageStreamCallback @413 ?DoEventHook@CSrmmBaseDialog@@IEAAXHPEBUUSERINFO@@PEB_W_J@Z @414 NONAME +?ClearLog@CSrmmBaseDialog@@QEAAXXZ @415 NONAME diff --git a/src/mir_app/src/srmm_base.cpp b/src/mir_app/src/srmm_base.cpp index 03aa63c405..1f017289b4 100644 --- a/src/mir_app/src/srmm_base.cpp +++ b/src/mir_app/src/srmm_base.cpp @@ -58,6 +58,16 @@ CSrmmBaseDialog::CSrmmBaseDialog(HINSTANCE hInst, int idDialog, SESSION_INFO *si INT_PTR CSrmmBaseDialog::DlgProc(UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { + case WM_COMMAND: + if (!lParam && Clist_MenuProcessCommand(LOWORD(wParam), MPCF_CONTACTMENU, m_hContact)) + return 0; + + if (wParam >= MIN_CBUTTONID && wParam <= MAX_CBUTTONID) { + Srmm_ClickToolbarIcon(m_hContact, wParam, GetDlgItem(m_hwnd, wParam), 0); + return 0; + } + break; + case WM_NOTIFY: if (m_pLog != nullptr) { LPNMHDR hdr = (LPNMHDR)lParam; @@ -128,6 +138,12 @@ INT_PTR CSrmmBaseDialog::DlgProc(UINT msg, WPARAM wParam, LPARAM lParam) return CDlgBase::DlgProc(msg, wParam, lParam); } +void CSrmmBaseDialog::ClearLog() +{ + if (m_pLog != nullptr) + m_pLog->SetText(L""); +} + void CSrmmBaseDialog::DoEventHook(int iType, const USERINFO *pUser, const wchar_t *pszText, INT_PTR dwItem) { GCDEST gcd = {}; -- cgit v1.2.3