From 2a24763dc13f729f41f6909d9e74e9bc7d6243a8 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Wed, 17 Oct 2018 17:28:58 +0300 Subject: IRC: - useless variable m_evWndCreate removed; - fixes #1628 (IRC channel list window crashes when closed prematurely); - code cleaning; - version bump --- protocols/IRCG/src/commandmonitor.cpp | 175 ++++++++++++++++++---------------- protocols/IRCG/src/input.cpp | 9 +- protocols/IRCG/src/irclib.cpp | 2 - protocols/IRCG/src/ircproto.cpp | 3 - protocols/IRCG/src/ircproto.h | 5 +- protocols/IRCG/src/services.cpp | 9 +- protocols/IRCG/src/version.h | 2 +- protocols/IRCG/src/windows.cpp | 4 + 8 files changed, 107 insertions(+), 102 deletions(-) diff --git a/protocols/IRCG/src/commandmonitor.cpp b/protocols/IRCG/src/commandmonitor.cpp index 2d84403b90..1e7b262430 100644 --- a/protocols/IRCG/src/commandmonitor.cpp +++ b/protocols/IRCG/src/commandmonitor.cpp @@ -240,7 +240,7 @@ void __cdecl CIrcProto::ResolveIPThread(void *di) Thread_SetName("IRC: ResolveIPThread"); IPRESOLVE* ipr = (IPRESOLVE *)di; { - mir_cslock lock(m_resolve); + mir_cslock lock(m_csResolve); if (ipr != nullptr && (ipr->iType == IP_AUTO && mir_strlen(m_myHost) == 0 || ipr->iType == IP_MANUAL)) { hostent* myhost = gethostbyname(ipr->sAddr); @@ -1447,21 +1447,22 @@ bool CIrcProto::OnIrc_TOPIC(const CIrcMessage *pmsg) return true; } -static void __stdcall sttShowDlgList(void* param) +static INT_PTR __stdcall sttShowDlgList(void* param) { CIrcProto *ppro = (CIrcProto*)param; + + mir_cslock lck(ppro->m_csList); if (ppro->m_listDlg == nullptr) { ppro->m_listDlg = new CListDlg(ppro); ppro->m_listDlg->Show(); } - SetEvent(ppro->m_evWndCreate); + return 0; } bool CIrcProto::OnIrc_LISTSTART(const CIrcMessage *pmsg) { if (pmsg->m_bIncoming) { - CallFunctionAsync(sttShowDlgList, this); - WaitForSingleObject(m_evWndCreate, INFINITE); + CallFunctionSync(sttShowDlgList, this); m_channelNumber = 0; } @@ -1471,81 +1472,92 @@ bool CIrcProto::OnIrc_LISTSTART(const CIrcMessage *pmsg) bool CIrcProto::OnIrc_LIST(const CIrcMessage *pmsg) { - if (pmsg->m_bIncoming == 1 && m_listDlg && pmsg->parameters.getCount() > 2) { - m_channelNumber++; - LVITEM lvItem; - HWND hListView = GetDlgItem(m_listDlg->GetHwnd(), IDC_INFO_LISTVIEW); - lvItem.iItem = ListView_GetItemCount(hListView); - lvItem.mask = LVIF_TEXT | LVIF_PARAM; - lvItem.iSubItem = 0; - lvItem.pszText = pmsg->parameters[1].GetBuffer(); - lvItem.lParam = lvItem.iItem; - lvItem.iItem = ListView_InsertItem(hListView, &lvItem); - lvItem.mask = LVIF_TEXT; - lvItem.iSubItem = 1; - lvItem.pszText = pmsg->parameters[pmsg->parameters.getCount() - 2].GetBuffer(); - ListView_SetItem(hListView, &lvItem); - - wchar_t* temp = mir_wstrdup(pmsg->parameters[pmsg->parameters.getCount() - 1]); - wchar_t* find = wcsstr(temp, L"[+"); - wchar_t* find2 = wcsstr(temp, L"]"); - wchar_t* save = temp; - if (find == temp && find2 != nullptr && find + 8 >= find2) { - temp = wcsstr(temp, L"]"); - if (mir_wstrlen(temp) > 1) { - temp++; - temp[0] = 0; - lvItem.iSubItem = 2; - lvItem.pszText = save; - ListView_SetItem(hListView, &lvItem); - temp[0] = ' '; - temp++; - } - else temp = save; - } + if (!pmsg->m_bIncoming || pmsg->parameters.getCount() <= 2) + return true; - lvItem.iSubItem = 3; - CMStringW S = DoColorCodes(temp, TRUE, FALSE); - lvItem.pszText = S.GetBuffer(); - ListView_SetItem(hListView, &lvItem); - temp = save; - mir_free(temp); + mir_cslockfull lck(m_csList); + if (!m_listDlg) + return true; + + m_channelNumber++; + + HWND hListView = GetDlgItem(m_listDlg->GetHwnd(), IDC_INFO_LISTVIEW); + HWND hStatusWnd = m_listDlg->m_status.GetHwnd(); + lck.unlock(); + + LVITEM lvItem; + lvItem.iItem = ListView_GetItemCount(hListView); + lvItem.mask = LVIF_TEXT | LVIF_PARAM; + lvItem.iSubItem = 0; + lvItem.pszText = pmsg->parameters[1].GetBuffer(); + lvItem.lParam = lvItem.iItem; + lvItem.iItem = ListView_InsertItem(hListView, &lvItem); + lvItem.mask = LVIF_TEXT; + lvItem.iSubItem = 1; + lvItem.pszText = pmsg->parameters[pmsg->parameters.getCount() - 2].GetBuffer(); + ListView_SetItem(hListView, &lvItem); + + wchar_t* temp = mir_wstrdup(pmsg->parameters[pmsg->parameters.getCount() - 1]); + wchar_t* find = wcsstr(temp, L"[+"); + wchar_t* find2 = wcsstr(temp, L"]"); + wchar_t* save = temp; + if (find == temp && find2 != nullptr && find + 8 >= find2) { + temp = wcsstr(temp, L"]"); + if (mir_wstrlen(temp) > 1) { + temp++; + temp[0] = 0; + lvItem.iSubItem = 2; + lvItem.pszText = save; + ListView_SetItem(hListView, &lvItem); + temp[0] = ' '; + temp++; + } + else temp = save; + } - int percent = 100; - if (m_noOfChannels > 0) - percent = (int)(m_channelNumber * 100) / m_noOfChannels; + lvItem.iSubItem = 3; + CMStringW S = DoColorCodes(temp, TRUE, FALSE); + lvItem.pszText = S.GetBuffer(); + ListView_SetItem(hListView, &lvItem); + temp = save; + mir_free(temp); - wchar_t text[100]; - if (percent < 100) - mir_snwprintf(text, TranslateT("Downloading list (%u%%) - %u channels"), percent, m_channelNumber); - else - mir_snwprintf(text, TranslateT("Downloading list - %u channels"), m_channelNumber); - m_listDlg->m_status.SetText(text); - } + int percent = 100; + if (m_noOfChannels > 0) + percent = (int)(m_channelNumber * 100) / m_noOfChannels; + wchar_t text[100]; + if (percent < 100) + mir_snwprintf(text, TranslateT("Downloading list (%u%%) - %u channels"), percent, m_channelNumber); + else + mir_snwprintf(text, TranslateT("Downloading list - %u channels"), m_channelNumber); + SetWindowText(hStatusWnd, text); return true; } bool CIrcProto::OnIrc_LISTEND(const CIrcMessage *pmsg) { - if (pmsg->m_bIncoming && m_listDlg) { - EnableWindow(GetDlgItem(m_listDlg->GetHwnd(), IDC_JOIN), true); - ListView_SetSelectionMark(GetDlgItem(m_listDlg->GetHwnd(), IDC_INFO_LISTVIEW), 0); - ListView_SetColumnWidth(GetDlgItem(m_listDlg->GetHwnd(), IDC_INFO_LISTVIEW), 1, LVSCW_AUTOSIZE); - ListView_SetColumnWidth(GetDlgItem(m_listDlg->GetHwnd(), IDC_INFO_LISTVIEW), 2, LVSCW_AUTOSIZE); - ListView_SetColumnWidth(GetDlgItem(m_listDlg->GetHwnd(), IDC_INFO_LISTVIEW), 3, LVSCW_AUTOSIZE); - m_listDlg->UpdateList(); - - wchar_t text[100]; - mir_snwprintf(text, TranslateT("Done: %u channels"), m_channelNumber); - int percent = 100; - if (m_noOfChannels > 0) - percent = (int)(m_channelNumber * 100) / m_noOfChannels; - if (percent < 70) { - mir_wstrcat(text, L" "); - mir_wstrcat(text, TranslateT("(probably truncated by server)")); + if (pmsg->m_bIncoming) { + mir_cslock lck(m_csList); + if (m_listDlg) { + EnableWindow(GetDlgItem(m_listDlg->GetHwnd(), IDC_JOIN), true); + ListView_SetSelectionMark(GetDlgItem(m_listDlg->GetHwnd(), IDC_INFO_LISTVIEW), 0); + ListView_SetColumnWidth(GetDlgItem(m_listDlg->GetHwnd(), IDC_INFO_LISTVIEW), 1, LVSCW_AUTOSIZE); + ListView_SetColumnWidth(GetDlgItem(m_listDlg->GetHwnd(), IDC_INFO_LISTVIEW), 2, LVSCW_AUTOSIZE); + ListView_SetColumnWidth(GetDlgItem(m_listDlg->GetHwnd(), IDC_INFO_LISTVIEW), 3, LVSCW_AUTOSIZE); + m_listDlg->UpdateList(); + + wchar_t text[100]; + mir_snwprintf(text, TranslateT("Done: %u channels"), m_channelNumber); + int percent = 100; + if (m_noOfChannels > 0) + percent = (int)(m_channelNumber * 100) / m_noOfChannels; + if (percent < 70) { + mir_wstrcat(text, L" "); + mir_wstrcat(text, TranslateT("(probably truncated by server)")); + } + SetDlgItemText(m_listDlg->GetHwnd(), IDC_TEXT, text); } - SetDlgItemText(m_listDlg->GetHwnd(), IDC_TEXT, text); } ShowMessage(pmsg); return true; @@ -1603,7 +1615,7 @@ bool CIrcProto::OnIrc_BANLISTEND(const CIrcMessage *pmsg) return true; } -static void __stdcall sttShowWhoisWnd(void* param) +static INT_PTR __stdcall sttShowWhoisWnd(void* param) { CIrcMessage* pmsg = (CIrcMessage*)param; CIrcProto *ppro = (CIrcProto*)pmsg->m_proto; @@ -1611,18 +1623,16 @@ static void __stdcall sttShowWhoisWnd(void* param) ppro->m_whoisDlg = new CWhoisDlg(ppro); ppro->m_whoisDlg->Show(); } - SetEvent(ppro->m_evWndCreate); ppro->m_whoisDlg->ShowMessage(pmsg); - delete pmsg; + return 0; } bool CIrcProto::OnIrc_WHOIS_NAME(const CIrcMessage *pmsg) { - if (pmsg->m_bIncoming && pmsg->parameters.getCount() > 5 && m_manualWhoisCount > 0) { - CallFunctionAsync(sttShowWhoisWnd, new CIrcMessage(*pmsg)); - WaitForSingleObject(m_evWndCreate, INFINITE); - } + if (pmsg->m_bIncoming && pmsg->parameters.getCount() > 5 && m_manualWhoisCount > 0) + CallFunctionSync(sttShowWhoisWnd, (void*)pmsg); + ShowMessage(pmsg); return true; } @@ -1766,7 +1776,7 @@ bool CIrcProto::OnIrc_WHOIS_NO_USER(const CIrcMessage *pmsg) return true; } -static void __stdcall sttShowNickWnd(void* param) +static INT_PTR __stdcall sttShowNickWnd(void* param) { CIrcMessage* pmsg = (CIrcMessage*)param; CIrcProto *ppro = pmsg->m_proto; @@ -1774,12 +1784,12 @@ static void __stdcall sttShowNickWnd(void* param) ppro->m_nickDlg = new CNickDlg(ppro); ppro->m_nickDlg->Show(); } - SetEvent(ppro->m_evWndCreate); + SetDlgItemText(ppro->m_nickDlg->GetHwnd(), IDC_CAPTION, TranslateT("Change nickname")); SetDlgItemText(ppro->m_nickDlg->GetHwnd(), IDC_TEXT, pmsg->parameters.getCount() > 2 ? pmsg->parameters[2] : L""); ppro->m_nickDlg->m_Enick.SetText(pmsg->parameters[1]); ppro->m_nickDlg->m_Enick.SendMsg(CB_SETEDITSEL, 0, MAKELPARAM(0, -1)); - delete pmsg; + return 0; } bool CIrcProto::OnIrc_NICK_ERR(const CIrcMessage *pmsg) @@ -1791,10 +1801,7 @@ bool CIrcProto::OnIrc_NICK_ERR(const CIrcMessage *pmsg) if (IsConnected()) SendIrcMessage(m); } - else { - CallFunctionAsync(sttShowNickWnd, new CIrcMessage(*pmsg)); - WaitForSingleObject(m_evWndCreate, INFINITE); - } + else CallFunctionSync(sttShowNickWnd, (void*)pmsg); } ShowMessage(pmsg); diff --git a/protocols/IRCG/src/input.cpp b/protocols/IRCG/src/input.cpp index f7cf3b6f84..934d56abd5 100644 --- a/protocols/IRCG/src/input.cpp +++ b/protocols/IRCG/src/input.cpp @@ -477,9 +477,12 @@ BOOL CIrcProto::DoHardcodedCommand(CMStringW text, wchar_t *window, MCONTACT hCo } if (command == L"/list") { - if (m_listDlg == nullptr) { - m_listDlg = new CListDlg(this); - m_listDlg->Show(); + { + mir_cslock lck(m_csList); + if (m_listDlg == nullptr) { + m_listDlg = new CListDlg(this); + m_listDlg->Show(); + } } SetActiveWindow(m_listDlg->GetHwnd()); int minutes = (int)m_noOfChannels / 4000; diff --git a/protocols/IRCG/src/irclib.cpp b/protocols/IRCG/src/irclib.cpp index 96426b287e..04b26ec02f 100644 --- a/protocols/IRCG/src/irclib.cpp +++ b/protocols/IRCG/src/irclib.cpp @@ -270,7 +270,6 @@ void CIrcProto::Disconnect(void) Netlib_Shutdown(con); m_info.Reset(); - return; } void CIrcProto::Notify(const CIrcMessage* pmsg) @@ -340,7 +339,6 @@ void CIrcProto::InsertIncomingEvent(wchar_t* pszRaw) { CIrcMessage msg(this, pszRaw, true); Notify(&msg); - return; } void CIrcProto::createMessageFromPchar(const char* p) diff --git a/protocols/IRCG/src/ircproto.cpp b/protocols/IRCG/src/ircproto.cpp index 9c45c532ee..3fa02e20b1 100644 --- a/protocols/IRCG/src/ircproto.cpp +++ b/protocols/IRCG/src/ircproto.cpp @@ -39,8 +39,6 @@ CIrcProto::CIrcProto(const char* szModuleName, const wchar_t* tszUserName) : vUserhostReasons(10), vWhoInProgress(10) { - m_evWndCreate = ::CreateEvent(nullptr, FALSE, FALSE, nullptr); - CreateProtoService(PS_GETMYAWAYMSG, &CIrcProto::GetMyAwayMsg); CreateProtoService(PS_CREATEACCMGRUI, &CIrcProto::SvcCreateAccMgrUI); @@ -157,7 +155,6 @@ CIrcProto::~CIrcProto() mir_free(m_alias); - CloseHandle(m_evWndCreate); KillChatTimer(OnlineNotifTimer); KillChatTimer(OnlineNotifTimer3); } diff --git a/protocols/IRCG/src/ircproto.h b/protocols/IRCG/src/ircproto.h index 473ec06359..559a919a34 100644 --- a/protocols/IRCG/src/ircproto.h +++ b/protocols/IRCG/src/ircproto.h @@ -165,10 +165,7 @@ struct CIrcProto : public PROTO OBJLIST vUserhostReasons; OBJLIST vWhoInProgress; - mir_cs cs; - mir_cs m_gchook; - mir_cs m_resolve; - HANDLE m_evWndCreate; + mir_cs m_csSession, m_csGcHook, m_csResolve, m_csList; CMStringW m_statusMessage; int m_iTempCheckTime; diff --git a/protocols/IRCG/src/services.cpp b/protocols/IRCG/src/services.cpp index d1d79044e8..7d622ca3a0 100644 --- a/protocols/IRCG/src/services.cpp +++ b/protocols/IRCG/src/services.cpp @@ -458,7 +458,7 @@ int __cdecl CIrcProto::GCEventHook(WPARAM, LPARAM lParam) GCHOOK *gch = (GCHOOK*)lParam; CMStringW S = L""; - mir_cslock lock(m_gchook); + mir_cslock lock(m_csGcHook); // handle the hook if (gch) { @@ -839,7 +839,7 @@ int __cdecl CIrcProto::GCMenuHook(WPARAM, LPARAM lParam) void CIrcProto::OnShutdown() { - mir_cslock lock(cs); + mir_cslock lock(m_csSession); if (m_perform && IsConnected()) if (DoPerform("Event: Disconnect")) @@ -944,7 +944,7 @@ void __cdecl CIrcProto::ConnectServerThread(void*) ProtoBroadcastAck(NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)Temp, ID_STATUS_CONNECTING); Sleep(100); { - mir_cslock lock(cs); + mir_cslock lock(m_csSession); Connect(si); } if (IsConnected()) { @@ -969,10 +969,9 @@ void __cdecl CIrcProto::DisconnectServerThread(void*) { Thread_SetName("IRC: DisconnectServer"); - mir_cslock lck(cs); + mir_cslock lck(m_csSession); if (IsConnected()) Disconnect(); - return; } void CIrcProto::ConnectToServer(void) diff --git a/protocols/IRCG/src/version.h b/protocols/IRCG/src/version.h index 392dcb951f..1475e0a058 100644 --- a/protocols/IRCG/src/version.h +++ b/protocols/IRCG/src/version.h @@ -1,6 +1,6 @@ #define __MAJOR_VERSION 0 #define __MINOR_VERSION 95 -#define __RELEASE_NUM 9 +#define __RELEASE_NUM 10 #define __BUILD_NUM 1 #include diff --git a/protocols/IRCG/src/windows.cpp b/protocols/IRCG/src/windows.cpp index 947bc7b5c7..252417b914 100644 --- a/protocols/IRCG/src/windows.cpp +++ b/protocols/IRCG/src/windows.cpp @@ -405,9 +405,13 @@ void CListDlg::OnDestroy() if (m_timer) ::KillTimer(m_hwnd, m_timer); Utils_SaveWindowPosition(m_hwnd, NULL, m_proto->m_szModuleName, "channelList_"); + + mir_cslock lck(m_proto->m_csList); m_proto->m_listDlg = nullptr; } +///////////////////////////////////////////////////////////////////////////////////////// + struct ListViewSortParam { CCtrlListView* pList; -- cgit v1.2.3