From 5df94ff719eccd04c7450df35fb5e3f2b36e2ee7 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Sun, 13 Jul 2014 10:50:59 +0000 Subject: wrapping the most evident critical sections into a class git-svn-id: http://svn.miranda-ng.org/main/trunk@9785 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- protocols/JabberG/src/jabber_disco.cpp | 280 ++++++++++++++++----------------- 1 file changed, 138 insertions(+), 142 deletions(-) (limited to 'protocols/JabberG/src/jabber_disco.cpp') diff --git a/protocols/JabberG/src/jabber_disco.cpp b/protocols/JabberG/src/jabber_disco.cpp index 452cb746ae..d3030a3b7e 100644 --- a/protocols/JabberG/src/jabber_disco.cpp +++ b/protocols/JabberG/src/jabber_disco.cpp @@ -168,12 +168,10 @@ static void sttApplyNodeIcon(HTREELISTITEM hItem, CJabberSDNode *pNode); void CJabberProto::OnIqResultServiceDiscoveryInfo(HXML iqNode, CJabberIqInfo *pInfo) { - m_SDManager.Lock(); + mir_cslockfull lck(m_SDManager.cs()); CJabberSDNode *pNode = m_SDManager.FindByIqId(pInfo->GetIqId(), TRUE); - if (!pNode) { - m_SDManager.Unlock(); + if (!pNode) return; - } if (pInfo->GetIqType() == JABBER_IQ_TYPE_RESULT) { HXML query = xmlGetChild(iqNode , "query"); @@ -204,7 +202,7 @@ void CJabberProto::OnIqResultServiceDiscoveryInfo(HXML iqNode, CJabberIqInfo *pI pNode->SetInfoRequestId(JABBER_DISCO_RESULT_ERROR); } - m_SDManager.Unlock(); + lck.unlock(); if (m_pDlgServiceDiscovery) { ApplyNodeIcon(pNode->GetTreeItemHandle(), pNode); @@ -214,12 +212,10 @@ void CJabberProto::OnIqResultServiceDiscoveryInfo(HXML iqNode, CJabberIqInfo *pI void CJabberProto::OnIqResultServiceDiscoveryItems(HXML iqNode, CJabberIqInfo *pInfo) { - m_SDManager.Lock(); + mir_cslockfull lck(m_SDManager.cs()); CJabberSDNode *pNode = m_SDManager.FindByIqId(pInfo->GetIqId(), FALSE); - if (!pNode) { - m_SDManager.Unlock(); + if (!pNode) return; - } if (pInfo->GetIqType() == JABBER_IQ_TYPE_RESULT) { HXML query = xmlGetChild(iqNode , "query"); @@ -227,9 +223,8 @@ void CJabberProto::OnIqResultServiceDiscoveryItems(HXML iqNode, CJabberIqInfo *p pNode->SetItemsRequestId(JABBER_DISCO_RESULT_ERROR); else { HXML item; - for (int i = 1; (item = xmlGetNthChild(query, _T("item"), i)) != NULL; i++) { + for (int i = 1; (item = xmlGetNthChild(query, _T("item"), i)) != NULL; i++) pNode->AddChildNode(xmlGetAttrValue(item, _T("jid")), xmlGetAttrValue(item, _T("node")), xmlGetAttrValue(item, _T("name"))); - } pNode->SetItemsRequestId(JABBER_DISCO_RESULT_OK); pNode->SetItemsRequestErrorText(NULL); @@ -248,7 +243,7 @@ void CJabberProto::OnIqResultServiceDiscoveryItems(HXML iqNode, CJabberIqInfo *p pNode->SetItemsRequestId(JABBER_DISCO_RESULT_ERROR); } - m_SDManager.Unlock(); + lck.unlock(); if (m_pDlgServiceDiscovery) { ApplyNodeIcon(pNode->GetTreeItemHandle(), pNode); @@ -259,19 +254,19 @@ void CJabberProto::OnIqResultServiceDiscoveryItems(HXML iqNode, CJabberIqInfo *p void CJabberProto::OnIqResultServiceDiscoveryRootInfo(HXML iqNode, CJabberIqInfo *pInfo) { if (!pInfo->m_pUserData) return; - m_SDManager.Lock(); + + mir_cslockfull lck(m_SDManager.cs()); if (pInfo->GetIqType() == JABBER_IQ_TYPE_RESULT) { HXML query = xmlGetChild(iqNode , "query"); if (query) { HXML feature; - int i; - for (i = 1; (feature = xmlGetNthChild(query, _T("feature"), i)) != NULL; i++) { + for (int i = 1; (feature = xmlGetNthChild(query, _T("feature"), i)) != NULL; i++) { if (!lstrcmp(xmlGetAttrValue(feature, _T("var")), (TCHAR *)pInfo->m_pUserData)) { CJabberSDNode *pNode = m_SDManager.AddPrimaryNode(pInfo->GetReceiver(), xmlGetAttrValue(iqNode, _T("node")), NULL); SendBothRequests(pNode, NULL); break; } } } } - m_SDManager.Unlock(); + lck.unlock(); UI_SAFE_NOTIFY(m_pDlgServiceDiscovery, WM_JABBER_REFRESH); } @@ -282,7 +277,7 @@ void CJabberProto::OnIqResultServiceDiscoveryRootItems(HXML iqNode, CJabberIqInf return; XmlNode packet(NULL); - m_SDManager.Lock(); + mir_cslockfull lck(m_SDManager.cs()); if (pInfo->GetIqType() == JABBER_IQ_TYPE_RESULT) { HXML query = xmlGetChild(iqNode , "query"); if (query) { @@ -298,7 +293,7 @@ void CJabberProto::OnIqResultServiceDiscoveryRootItems(HXML iqNode, CJabberIqInf iq << XQUERY(JABBER_FEAT_DISCO_INFO) << XATTR(_T("node"), szNode); xmlAddChild(packet, iq); } } } - m_SDManager.Unlock(); + lck.unlock(); if (xmlGetChild(packet ,0)) m_ThreadInfo->send(packet); @@ -393,79 +388,80 @@ void CJabberProto::PerformBrowse(HWND hwndDlg) ComboAddRecentString(hwndDlg, IDC_COMBO_JID, "discoWnd_rcJid", szJid); ComboAddRecentString(hwndDlg, IDC_COMBO_NODE, "discoWnd_rcNode", szNode); - if (_tcslen(szJid)) { - HWND hwndList = GetDlgItem(hwndDlg, IDC_TREE_DISCO); - TreeList_Reset(hwndList); + if (szJid[0] == 0) + return; - m_SDManager.Lock(); - m_SDManager.RemoveAll(); - if (!lstrcmp(szJid, _T(SD_FAKEJID_MYAGENTS))) { - sttBrowseMode = SD_BROWSE_MYAGENTS; - JABBER_LIST_ITEM *item = NULL; - LISTFOREACH(i, this, LIST_ROSTER) - { - if ((item=ListGetItemPtrFromIndex(i)) != NULL) { - if (_tcschr(item->jid, '@') == NULL && _tcschr(item->jid, '/') == NULL && item->subscription!=SUB_NONE) { - MCONTACT hContact = HContactFromJID(item->jid); - if (hContact != NULL) - setByte(hContact, "IsTransport", TRUE); + HWND hwndList = GetDlgItem(hwndDlg, IDC_TREE_DISCO); + TreeList_Reset(hwndList); - if (m_lstTransports.getIndex(item->jid) == -1) - m_lstTransports.insert(mir_tstrdup(item->jid)); + mir_cslockfull lck(m_SDManager.cs()); + m_SDManager.RemoveAll(); + if (!lstrcmp(szJid, _T(SD_FAKEJID_MYAGENTS))) { + sttBrowseMode = SD_BROWSE_MYAGENTS; + JABBER_LIST_ITEM *item = NULL; + LISTFOREACH(i, this, LIST_ROSTER) + { + if ((item=ListGetItemPtrFromIndex(i)) != NULL) { + if (_tcschr(item->jid, '@') == NULL && _tcschr(item->jid, '/') == NULL && item->subscription!=SUB_NONE) { + MCONTACT hContact = HContactFromJID(item->jid); + if (hContact != NULL) + setByte(hContact, "IsTransport", TRUE); - CJabberSDNode *pNode = m_SDManager.AddPrimaryNode(item->jid, NULL, NULL); - SendBothRequests(pNode, NULL); - } } - } } - else if (!lstrcmp(szJid, _T(SD_FAKEJID_CONFERENCES))) { - sttBrowseMode = SD_BROWSE_CONFERENCES; - TCHAR *szServerJid = mir_a2t(m_ThreadInfo->server); - CJabberIqInfo *pInfo = AddIQ(&CJabberProto::OnIqResultServiceDiscoveryRootItems, JABBER_IQ_TYPE_GET, szServerJid); - pInfo->m_pUserData = (void*)JABBER_FEAT_MUC; - pInfo->SetTimeout(30000); - XmlNodeIq iq(pInfo); - iq << XQUERY(JABBER_FEAT_DISCO_ITEMS); - m_ThreadInfo->send(iq); - mir_free(szServerJid); - } - else if (!lstrcmp(szJid, _T(SD_FAKEJID_AGENTS))) { - sttBrowseMode = SD_BROWSE_AGENTS; - TCHAR *szServerJid = mir_a2t(m_ThreadInfo->server); - CJabberIqInfo *pInfo = AddIQ(&CJabberProto::OnIqResultServiceDiscoveryRootItems, JABBER_IQ_TYPE_GET, szServerJid); - pInfo->m_pUserData = (void*)_T("jabber:iq:gateway"); - pInfo->SetTimeout(30000); - XmlNodeIq iq(pInfo); - iq << XQUERY(JABBER_FEAT_DISCO_ITEMS); - m_ThreadInfo->send(iq); - mir_free(szServerJid); - } - else if (!lstrcmp(szJid, _T(SD_FAKEJID_FAVORITES))) { - sttBrowseMode = SD_BROWSE_FAVORITES; - int count = getDword("discoWnd_favCount", 0); - for (int i=0; i < count; i++) { - char setting[MAXMODULELABELLENGTH]; - mir_snprintf(setting, sizeof(setting), "discoWnd_favName_%d", i); - ptrT tszName( getTStringA(setting)); - if (tszName == NULL) - continue; + if (m_lstTransports.getIndex(item->jid) == -1) + m_lstTransports.insert(mir_tstrdup(item->jid)); + + CJabberSDNode *pNode = m_SDManager.AddPrimaryNode(item->jid, NULL, NULL); + SendBothRequests(pNode, NULL); + } } + } } + else if (!lstrcmp(szJid, _T(SD_FAKEJID_CONFERENCES))) { + sttBrowseMode = SD_BROWSE_CONFERENCES; + TCHAR *szServerJid = mir_a2t(m_ThreadInfo->server); + CJabberIqInfo *pInfo = AddIQ(&CJabberProto::OnIqResultServiceDiscoveryRootItems, JABBER_IQ_TYPE_GET, szServerJid); + pInfo->m_pUserData = (void*)JABBER_FEAT_MUC; + pInfo->SetTimeout(30000); + XmlNodeIq iq(pInfo); + iq << XQUERY(JABBER_FEAT_DISCO_ITEMS); + m_ThreadInfo->send(iq); + mir_free(szServerJid); + } + else if (!lstrcmp(szJid, _T(SD_FAKEJID_AGENTS))) { + sttBrowseMode = SD_BROWSE_AGENTS; + TCHAR *szServerJid = mir_a2t(m_ThreadInfo->server); + CJabberIqInfo *pInfo = AddIQ(&CJabberProto::OnIqResultServiceDiscoveryRootItems, JABBER_IQ_TYPE_GET, szServerJid); + pInfo->m_pUserData = (void*)_T("jabber:iq:gateway"); + pInfo->SetTimeout(30000); + XmlNodeIq iq(pInfo); + iq << XQUERY(JABBER_FEAT_DISCO_ITEMS); + m_ThreadInfo->send(iq); + mir_free(szServerJid); + } + else if (!lstrcmp(szJid, _T(SD_FAKEJID_FAVORITES))) { + sttBrowseMode = SD_BROWSE_FAVORITES; + int count = getDword("discoWnd_favCount", 0); + for (int i=0; i < count; i++) { + char setting[MAXMODULELABELLENGTH]; + mir_snprintf(setting, sizeof(setting), "discoWnd_favName_%d", i); + ptrT tszName( getTStringA(setting)); + if (tszName == NULL) + continue; - mir_snprintf(setting, sizeof(setting), "discoWnd_favJID_%d", i); - ptrT dbvJid( getTStringA(setting)); - mir_snprintf(setting, sizeof(setting), "discoWnd_favNode_%d", i); - ptrT dbvNode( getTStringA(setting)); - CJabberSDNode *pNode = m_SDManager.AddPrimaryNode(dbvJid, dbvNode, tszName); - SendBothRequests(pNode, NULL); - } - } - else { - sttBrowseMode = SD_BROWSE_NORMAL; - CJabberSDNode *pNode = m_SDManager.AddPrimaryNode(szJid, _tcslen(szNode) ? szNode : NULL, NULL); + mir_snprintf(setting, sizeof(setting), "discoWnd_favJID_%d", i); + ptrT dbvJid( getTStringA(setting)); + mir_snprintf(setting, sizeof(setting), "discoWnd_favNode_%d", i); + ptrT dbvNode( getTStringA(setting)); + CJabberSDNode *pNode = m_SDManager.AddPrimaryNode(dbvJid, dbvNode, tszName); SendBothRequests(pNode, NULL); } - m_SDManager.Unlock(); - - PostMessage(hwndDlg, WM_JABBER_REFRESH, 0, 0); } + else { + sttBrowseMode = SD_BROWSE_NORMAL; + CJabberSDNode *pNode = m_SDManager.AddPrimaryNode(szJid, _tcslen(szNode) ? szNode : NULL, NULL); + SendBothRequests(pNode, NULL); + } + lck.unlock(); + + PostMessage(hwndDlg, WM_JABBER_REFRESH, 0, 0); } BOOL CJabberProto::IsNodeRegistered(CJabberSDNode *pNode) @@ -731,9 +727,10 @@ void CJabberDlgDiscovery::OnClose() void CJabberDlgDiscovery::OnDestroy() { m_proto->m_pDlgServiceDiscovery = NULL; - m_proto->m_SDManager.Lock(); - m_proto->m_SDManager.RemoveAll(); - m_proto->m_SDManager.Unlock(); + { + mir_cslock lck(m_proto->m_SDManager.cs()); + m_proto->m_SDManager.RemoveAll(); + } TreeList_Destroy(GetDlgItem(m_hwnd, IDC_TREE_DISCO)); CSuper::OnDestroy(); @@ -901,10 +898,11 @@ void CJabberDlgDiscovery::btnBookmarks_OnClick(CCtrlButton *) void CJabberDlgDiscovery::btnRefresh_OnClick(CCtrlButton *) { HTREELISTITEM hItem = (HTREELISTITEM)TreeList_GetActiveItem(GetDlgItem(m_hwnd, IDC_TREE_DISCO)); - if (!hItem) return; + if (!hItem) + return; - m_proto->m_SDManager.Lock(); XmlNode packet(NULL); + mir_cslockfull lck(m_proto->m_SDManager.cs()); CJabberSDNode *pNode = (CJabberSDNode*)TreeList_GetData(hItem); if (pNode) { TreeList_ResetItem(GetDlgItem(m_hwnd, IDC_TREE_DISCO), hItem); @@ -912,7 +910,7 @@ void CJabberDlgDiscovery::btnRefresh_OnClick(CCtrlButton *) m_proto->SendBothRequests(pNode, packet); TreeList_MakeFakeParent(hItem, FALSE); } - m_proto->m_SDManager.Unlock(); + lck.unlock(); if (xmlGetChild(packet ,0)) m_proto->m_ThreadInfo->send(packet); @@ -966,7 +964,7 @@ INT_PTR CJabberDlgDiscovery::DlgProc(UINT msg, WPARAM wParam, LPARAM lParam) case WM_TIMER: if (wParam == REFRESH_TIMER) { - m_proto->m_SDManager.Lock(); + mir_cslockfull lck(m_proto->m_SDManager.cs()); CJabberSDNode *pNode = m_proto->m_SDManager.GetPrimaryNode(); while (pNode) @@ -984,7 +982,7 @@ INT_PTR CJabberDlgDiscovery::DlgProc(UINT msg, WPARAM wParam, LPARAM lParam) m_proto->SyncTree(NULL, pNode); pNode = pNode->GetNext(); } - m_proto->m_SDManager.Unlock(); + lck.unlock(); TreeList_Update(GetDlgItem(m_hwnd, IDC_TREE_DISCO)); KillTimer(m_hwnd, REFRESH_TIMER); m_proto->m_dwSDLastRefresh = GetTickCount(); @@ -1005,24 +1003,25 @@ INT_PTR CJabberDlgDiscovery::DlgProc(UINT msg, WPARAM wParam, LPARAM lParam) if (iFirst < 0) return FALSE; if (iLast < 0) iLast = ListView_GetItemCount(hwndList) - 1; - m_proto->m_SDManager.Lock(); XmlNode packet(NULL); - for (int i = iFirst; i <= iLast; i++) { - LVITEM lvi = {0}; - lvi.mask = LVIF_PARAM; - lvi.iItem = i; - ListView_GetItem(hwndList, &lvi); - if (!lvi.lParam) - continue; - - CJabberSDNode *pNode = (CJabberSDNode *)TreeList_GetData((HTREELISTITEM)lvi.lParam); - if (!pNode || pNode->GetInfoRequestId()) - continue; - - m_proto->SendInfoRequest(pNode, packet); + mir_cslock lck(m_proto->m_SDManager.cs()); + for (int i = iFirst; i <= iLast; i++) + { + LVITEM lvi = {0}; + lvi.mask = LVIF_PARAM; + lvi.iItem = i; + ListView_GetItem(hwndList, &lvi); + if (!lvi.lParam) + continue; + + CJabberSDNode *pNode = (CJabberSDNode *)TreeList_GetData((HTREELISTITEM)lvi.lParam); + if (!pNode || pNode->GetInfoRequestId()) + continue; + + m_proto->SendInfoRequest(pNode, packet); + } } - m_proto->m_SDManager.Unlock(); if (xmlGetChild(packet, 0)) m_proto->m_ThreadInfo->send(packet); @@ -1069,26 +1068,24 @@ INT_PTR CJabberDlgDiscovery::DlgProc(UINT msg, WPARAM wParam, LPARAM lParam) lvi.iItem = pInfoTip->iItem; ListView_GetItem(pHeader->hwndFrom, &lvi); HTREELISTITEM hItem = (HTREELISTITEM)lvi.lParam; - m_proto->m_SDManager.Lock(); + + mir_cslock lck(m_proto->m_SDManager.cs()); CJabberSDNode *pNode = (CJabberSDNode*)TreeList_GetData(hItem); if (pNode) pNode->GetTooltipText(pInfoTip->pszText, pInfoTip->cchTextMax); - - m_proto->m_SDManager.Unlock(); } else if (pHeader->code == TVN_ITEMEXPANDED) { NMTREEVIEW *pNmTreeView = (NMTREEVIEW *)lParam; HTREELISTITEM hItem = (HTREELISTITEM)pNmTreeView->itemNew.hItem; - - m_proto->m_SDManager.Lock(); XmlNode packet(NULL); - CJabberSDNode *pNode = (CJabberSDNode*)TreeList_GetData(hItem); - if (pNode) { - m_proto->SendBothRequests(pNode, packet); - TreeList_MakeFakeParent(hItem, FALSE); + { + mir_cslock lck(m_proto->m_SDManager.cs()); + CJabberSDNode *pNode = (CJabberSDNode*)TreeList_GetData(hItem); + if (pNode) { + m_proto->SendBothRequests(pNode, packet); + TreeList_MakeFakeParent(hItem, FALSE); + } } - m_proto->m_SDManager.Unlock(); - if (xmlGetChild(packet)) m_proto->m_ThreadInfo->send(packet); } @@ -1283,17 +1280,16 @@ void CJabberProto::ServiceDiscoveryShowMenu(CJabberSDNode *pNode, HTREELISTITEM switch (res) { case SD_ACT_REFRESH: { - m_SDManager.Lock(); XmlNode packet(NULL); - if (pNode) { - TreeList_ResetItem(GetDlgItem(m_pDlgServiceDiscovery->GetHwnd(), IDC_TREE_DISCO), hItem); - pNode->ResetInfo(); - SendBothRequests(pNode, packet); - TreeList_MakeFakeParent(hItem, FALSE); + mir_cslock lck(m_SDManager.cs()); + if (pNode) { + TreeList_ResetItem(GetDlgItem(m_pDlgServiceDiscovery->GetHwnd(), IDC_TREE_DISCO), hItem); + pNode->ResetInfo(); + SendBothRequests(pNode, packet); + TreeList_MakeFakeParent(hItem, FALSE); + } } - m_SDManager.Unlock(); - if (xmlGetChild(packet)) m_ThreadInfo->send(packet); } @@ -1301,25 +1297,25 @@ void CJabberProto::ServiceDiscoveryShowMenu(CJabberSDNode *pNode, HTREELISTITEM case SD_ACT_REFRESHCHILDREN: { - m_SDManager.Lock(); XmlNode packet(NULL); - for (int iChild = TreeList_GetChildrenCount(hItem); iChild--;) { - HTREELISTITEM hNode = TreeList_GetChild(hItem, iChild); - CJabberSDNode *pNode = (CJabberSDNode *)TreeList_GetData(hNode); - if (pNode) - { - TreeList_ResetItem(GetDlgItem(m_pDlgServiceDiscovery->GetHwnd(), IDC_TREE_DISCO), hNode); - pNode->ResetInfo(); - SendBothRequests(pNode, packet); - TreeList_MakeFakeParent(hNode, FALSE); - } - - if (xmlGetChildCount(packet) > 50) { - m_ThreadInfo->send(packet); - packet = XmlNode(NULL); + { + mir_cslock lck(m_SDManager.cs()); + for (int iChild = TreeList_GetChildrenCount(hItem); iChild--;) { + HTREELISTITEM hNode = TreeList_GetChild(hItem, iChild); + CJabberSDNode *pNode = (CJabberSDNode *)TreeList_GetData(hNode); + if (pNode) { + TreeList_ResetItem(GetDlgItem(m_pDlgServiceDiscovery->GetHwnd(), IDC_TREE_DISCO), hNode); + pNode->ResetInfo(); + SendBothRequests(pNode, packet); + TreeList_MakeFakeParent(hNode, FALSE); + } + + if (xmlGetChildCount(packet) > 50) { + m_ThreadInfo->send(packet); + packet = XmlNode(NULL); + } } } - m_SDManager.Unlock(); if (xmlGetChildCount(packet)) m_ThreadInfo->send(packet); -- cgit v1.2.3