From 85b429453559d86491ac428a1028cbe4d5b382c9 Mon Sep 17 00:00:00 2001 From: Alexander Lantsev Date: Sat, 21 Jun 2014 19:31:51 +0000 Subject: Steam: second approach to block list support git-svn-id: http://svn.miranda-ng.org/main/trunk@9547 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- protocols/Steam/src/common.h | 1 + protocols/Steam/src/resource.h | 7 +- protocols/Steam/src/steam_dialogs.cpp | 242 ++++++++++++++++++++++++++++++++++ protocols/Steam/src/steam_events.cpp | 5 + protocols/Steam/src/steam_menus.cpp | 2 +- protocols/Steam/src/steam_proto.h | 6 +- 6 files changed, 258 insertions(+), 5 deletions(-) (limited to 'protocols/Steam/src') diff --git a/protocols/Steam/src/common.h b/protocols/Steam/src/common.h index 1597bd002d..2811c9a861 100644 --- a/protocols/Steam/src/common.h +++ b/protocols/Steam/src/common.h @@ -2,6 +2,7 @@ #define _COMMON_H_ #include +#include #include #include diff --git a/protocols/Steam/src/resource.h b/protocols/Steam/src/resource.h index f2817e7d20..e0df660de8 100644 --- a/protocols/Steam/src/resource.h +++ b/protocols/Steam/src/resource.h @@ -4,6 +4,8 @@ // #define IDD_ACCMGR 9 #define IDD_OPT_MAIN 10 +#define IDD_OPT_BLOCKED 20 +#define IDD_OPT_BLOCK_LIST 20 #define IDD_IGNORE_LIST 21 #define IDD_CAPTCHA 118 #define IDI_ICON1 119 @@ -21,10 +23,11 @@ #define IDC_REGISTER 1018 #define IDC_DEFAULT_GROUP 1020 #define IDC_GROUP 1021 +#define IDC_CONTACTS 1050 +#define IDC_BLOCK 1059 #define IDC_BM_LIST 1064 +#define IDC_LIST 1065 #define IDC_TEXT 1082 -#define IDC_CUSTOM1 1083 -#define IDC_BUTTON1 1084 #define IDC_OPENDOMAIN 1200 #define IDC_GETDOMAIN 1200 diff --git a/protocols/Steam/src/steam_dialogs.cpp b/protocols/Steam/src/steam_dialogs.cpp index 882a30b70a..af0cea11b7 100644 --- a/protocols/Steam/src/steam_dialogs.cpp +++ b/protocols/Steam/src/steam_dialogs.cpp @@ -232,5 +232,247 @@ INT_PTR CALLBACK CSteamProto::MainOptionsProc(HWND hwnd, UINT message, WPARAM wP break; } + return FALSE; +} + +static WNDPROC oldWndProc = NULL; + +LRESULT CALLBACK CSteamProto::BlockListOptionsSubProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + if (msg == WM_LBUTTONDOWN) + { + LVHITTESTINFO hi; + hi.pt.x = LOWORD(lParam); hi.pt.y = HIWORD(lParam); + ListView_SubItemHitTest(hwnd, &hi); + if (hi.iSubItem == 1) + { + LVITEM lvi = { 0 }; + lvi.mask = LVIF_IMAGE | LVIF_PARAM; + lvi.stateMask = -1; + lvi.iItem = hi.iItem; + if (ListView_GetItem(hwnd, &lvi)) + { + /*ContactParam *param = (ContactParam *)lvi.lParam; + + if (param->contact->SetBlocked(false)) + { + SEString data; + param->contact->GetIdentity(data); + ptrW sid(mir_utf8decodeW(data)); + + MCONTACT hContact = param->ppro->GetContactBySid(sid); + if (db_get_b(hContact, param->ppro->m_szModuleName, "IsSkypeOut", 0) > 0) + db_set_w(hContact, param->ppro->m_szModuleName, "Status", ID_STATUS_ONTHEPHONE); + + ListView_DeleteItem(hwnd, lvi.iItem); + + int nItem = SendMessage(::GetDlgItem(GetParent(hwnd), IDC_CONTACTS), CB_ADDSTRING, 0, (LPARAM)sid); + SendMessage(GetDlgItem(GetParent(hwnd), IDC_CONTACTS), CB_SETITEMDATA, nItem, hContact); + }*/ + } + } + } + + return CallWindowProc(oldWndProc, hwnd, msg, wParam, lParam); +} + +INT_PTR CALLBACK CSteamProto::BlockListOptionsProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + CSteamProto *ppro = (CSteamProto*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + + switch (msg) + { + case WM_INITDIALOG: + if (lParam) + { + ppro = (CSteamProto*)lParam; + SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam); + + TranslateDialogDefault(hwndDlg); + + HWND hwndList = ::GetDlgItem(hwndDlg, IDC_LIST); + { // IDC_BM_LIST setup + oldWndProc = (WNDPROC)SetWindowLongPtr(hwndList, GWLP_WNDPROC, (LONG_PTR)BlockListOptionsSubProc); + + HIMAGELIST hIml = ImageList_Create(16, 16, ILC_MASK | ILC_COLOR32, 4, 0); + //ImageList_AddIconFromIconLib(hIml, "Skype_contact"); + //ImageList_AddIconFromIconLib(hIml, "Skype_delete"); + ListView_SetImageList(hwndList, hIml, LVSIL_SMALL); + + LVCOLUMN lvc = { 0 }; + lvc.mask = LVCF_WIDTH | LVCF_TEXT; + //lvc.fmt = LVCFMT_JUSTIFYMASK; + lvc.pszText = TranslateT("Name"); + lvc.cx = 220; // width of column in pixels + ListView_InsertColumn(hwndList, 0, &lvc); + //lvc.fmt = LVCFMT_RIGHT; + lvc.pszText = L""; + lvc.cx = 32 - GetSystemMetrics(SM_CXVSCROLL); // width of column in pixels + ListView_InsertColumn(hwndList, 1, &lvc); + + SendMessage(hwndList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_SUBITEMIMAGES | LVS_EX_FULLROWSELECT | LVS_EX_LABELTIP); + + if (!ppro->IsOnline()) + { + EnableWindow(hwndList, FALSE); + EnableWindow(::GetDlgItem(hwndDlg, IDC_CONTACTS), FALSE); + } + } + + if (ppro->IsOnline()) + { + /*SEString data; + ContactGroupRef blockedList; + ppro->GetHardwiredContactGroup(ContactGroup::CONTACTS_BLOCKED_BY_ME, blockedList); + + CContact::Refs contacts; + blockedList->GetContacts(contacts); + for (size_t i = 0; i < contacts.size(); i++) + { + auto contact = contacts[i]; + + ptrW sid(::mir_utf8decodeW(contact->GetSid())); + + LVITEM lvi = { 0 }; + lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM; + lvi.iItem = (int)i; + lvi.iImage = 0; + lvi.lParam = (LPARAM)new ContactParam(contact, ppro); + lvi.pszText = sid; + int iRow = ListView_InsertItem(hwndList, &lvi); + + if (iRow != -1) + { + lvi.iItem = iRow; + lvi.mask = LVIF_IMAGE; + lvi.iSubItem = 1; + lvi.iImage = 1; + ListView_SetItem(hwndList, &lvi); + } + }*/ + + /*int nItem = 0; + MCONTACT hContact = NULL; + + EnterCriticalSection(&ppro->contact_search_lock); + + for (hContact = ::db_find_first(ppro->m_szModuleName); hContact && !ppro->isChatRoom(hContact); hContact = ::db_find_next(hContact, ppro->m_szModuleName)) + { + ptrW sid(::db_get_wsa(hContact, ppro->m_szModuleName, SKYPE_SETTINGS_SID)); + + ContactRef contact; + ppro->GetContact((char *)_T2A(sid), contact); + if (!contacts.contains(contact)) + { + nItem = ::SendMessage(::GetDlgItem(hwndDlg, IDC_CONTACTS), CB_ADDSTRING, 0, (LPARAM)sid); + ::SendMessage(::GetDlgItem(hwndDlg, IDC_CONTACTS), CB_SETITEMDATA, nItem, hContact); + } + } + + LeaveCriticalSection(&ppro->contact_search_lock);*/ + } + + } + break; + + case WM_COMMAND: + { + switch (LOWORD(wParam)) + { + case IDC_CONTACTS: + EnableWindow(GetDlgItem(hwndDlg, IDC_BLOCK), TRUE); + break; + + case IDC_BLOCK: + { + int i = ::SendMessage(::GetDlgItem(hwndDlg, IDC_CONTACTS), CB_GETCURSEL, 0, 0); + + MCONTACT hContact = (MCONTACT)::SendMessage(GetDlgItem(hwndDlg, IDC_CONTACTS), CB_GETITEMDATA, i, 0); + if (!hContact) + break; + + ptrA steamId(ppro->getStringA(hContact, "SteamID")); + + /*SEString data; + ContactRef contact; + if (!ppro->GetContact((char *)_T2A(sid), contact) || !contact) + break; + + BlockParam param(hContact, ppro); + if (::DialogBoxParam(g_hInstance, MAKEINTRESOURCE(IDD_BLOCK), NULL, CSkypeProto::SkypeBlockProc, (LPARAM)¶m) != IDOK) + break; + + contact->SetBlocked(true, param.abuse); + if (::db_get_b(hContact, ppro->m_szModuleName, "IsSkypeOut", 0) > 0) + ::db_set_w(hContact, ppro->m_szModuleName, "Status", ID_STATUS_OFFLINE); + + if (param.remove) + { + contact->SetBuddyStatus(false); + ppro->contactList.remove_val(contact); + ::CallService(MS_DB_CONTACT_DELETE, wParam, 0); + } + + if (contact->SetBlocked(true)) + { + LVITEM lvi = { 0 }; + lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM; + lvi.iItem = (int)i; + lvi.iImage = 0; + lvi.lParam = (LPARAM)new ContactParam(contact, ppro); + lvi.pszText = sid; + int iRow = ListView_InsertItem(::GetDlgItem(hwndDlg, IDC_LIST), &lvi); + + if (iRow != -1) + { + lvi.iItem = iRow; + lvi.mask = LVIF_IMAGE; + lvi.iSubItem = 1; + lvi.iImage = 1; + ListView_SetItem(::GetDlgItem(hwndDlg, IDC_LIST), &lvi); + } + ::SendMessage(::GetDlgItem(hwndDlg, IDC_CONTACTS), CB_DELETESTRING, i, 0); + }*/ + } + break; + } + } + break; + + case WM_NOTIFY: + if (reinterpret_cast(lParam)->code == PSN_APPLY && !ppro->IsOnline()) + { + return TRUE; + } + break; + + switch (LOWORD(wParam)) + { + case IDC_LIST: + if (((LPNMHDR)lParam)->code == NM_DBLCLK) + { + HWND hwndList = ::GetDlgItem(hwndDlg, IDC_BM_LIST); + int iItem = ListView_GetNextItem(hwndList, -1, LVNI_ALL | LVNI_SELECTED); + if (iItem < 0) break; + LVITEM lvi = { 0 }; + lvi.mask = LVIF_PARAM | LVIF_GROUPID; + lvi.stateMask = -1; + lvi.iItem = iItem; + if (ListView_GetItem(hwndList, &lvi)) + { + /*SEString data; + if (lvi.iGroupId == 1) + { + ContactParam *param = (ContactParam *)lvi.lParam; + + param->contact->GetIdentity(data); + ptrW sid(::mir_utf8decodeW(data)); + ::CallService(MS_MSG_SENDMESSAGE, (WPARAM)ppro->GetContactBySid(sid), 0); + }*/ + } + } + } + break; + } return FALSE; } \ No newline at end of file diff --git a/protocols/Steam/src/steam_events.cpp b/protocols/Steam/src/steam_events.cpp index 2d6daf07d3..4a61c913ef 100644 --- a/protocols/Steam/src/steam_events.cpp +++ b/protocols/Steam/src/steam_events.cpp @@ -56,6 +56,11 @@ int CSteamProto::OnOptionsInit(void *obj, WPARAM wParam, LPARAM lParam) odp.pfnDlgProc = MainOptionsProc; Options_AddPage(wParam, &odp); + odp.pszTab = LPGEN("Blocked contacts"); + odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT_BLOCK_LIST); + odp.pfnDlgProc = BlockListOptionsProc; + Options_AddPage(wParam, &odp); + mir_free(title); return 0; diff --git a/protocols/Steam/src/steam_menus.cpp b/protocols/Steam/src/steam_menus.cpp index 2f5e114cca..3fc7779e98 100644 --- a/protocols/Steam/src/steam_menus.cpp +++ b/protocols/Steam/src/steam_menus.cpp @@ -50,7 +50,7 @@ int CSteamProto::JoinToGameCommand(WPARAM hContact, LPARAM) return 0; } -int CSteamProto::OpenBlockListCommand(WPARAM, LPARAM) +INT_PTR CSteamProto::OpenBlockListCommand(WPARAM, LPARAM) { ptrA token(getStringA("TokenSecret")); ptrA steamId(getStringA("SteamID")); diff --git a/protocols/Steam/src/steam_proto.h b/protocols/Steam/src/steam_proto.h index 5e307965e8..192254fb46 100644 --- a/protocols/Steam/src/steam_proto.h +++ b/protocols/Steam/src/steam_proto.h @@ -230,7 +230,7 @@ protected: int __cdecl BlockCommand(WPARAM, LPARAM); int __cdecl JoinToGameCommand(WPARAM, LPARAM); - int __cdecl OpenBlockListCommand(WPARAM, LPARAM); + INT_PTR __cdecl OpenBlockListCommand(WPARAM, LPARAM); static INT_PTR MenuChooseService(WPARAM wParam, LPARAM lParam); @@ -263,10 +263,12 @@ protected: static void CSteamProto::ShowNotification(const wchar_t *message, int flags = 0, MCONTACT hContact = NULL); static void CSteamProto::ShowNotification(const wchar_t *caption, const wchar_t *message, int flags = 0, MCONTACT hContact = NULL); - // options + // dialog procs static INT_PTR CALLBACK GuardProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); static INT_PTR CALLBACK CaptchaProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); static INT_PTR CALLBACK MainOptionsProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); + static LRESULT CALLBACK BlockListOptionsSubProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); + static INT_PTR CALLBACK BlockListOptionsProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); }; #endif //_STEAM_PROTO_H_ \ No newline at end of file -- cgit v1.2.3