diff options
Diffstat (limited to 'protocols/Skype/src/skype_ignore_list.cpp')
-rw-r--r-- | protocols/Skype/src/skype_ignore_list.cpp | 283 |
1 files changed, 283 insertions, 0 deletions
diff --git a/protocols/Skype/src/skype_ignore_list.cpp b/protocols/Skype/src/skype_ignore_list.cpp new file mode 100644 index 0000000000..008fd85045 --- /dev/null +++ b/protocols/Skype/src/skype_ignore_list.cpp @@ -0,0 +1,283 @@ +#include "skype.h"
+#include "skype_chat.h"
+
+int CSkypeProto::IgnoreCommand(WPARAM wParam, LPARAM)
+{
+ CContact::Ref contact;
+ HANDLE hContact = (HANDLE)wParam;
+ SEString sid(_T2A(::db_get_wsa(hContact, this->m_szModuleName, SKYPE_SETTINGS_SID)));
+ if (this->GetContact(sid, contact))
+ {
+ //bool state = ::CallService(MS_IGNORE_ISIGNORED, wParam, IGNOREEVENT_ALL);
+ bool state = ::db_get_b(hContact, this->m_szModuleName, "Ignore", 0) > 0;
+ if (contact->SetBlocked(!state))
+ {
+ //::CallService(!state ? MS_IGNORE_IGNORE : MS_IGNORE_UNIGNORE, wParam, IGNOREEVENT_ALL);
+ ::db_set_b(hContact, this->m_szModuleName, "Ignore", (int)!state);
+ }
+ }
+
+ return 0;
+}
+
+int CSkypeProto::BlockCommand(WPARAM wParam, LPARAM lParam)
+{
+ HANDLE hContact = (HANDLE)wParam;
+ if (hContact)
+ {
+ this->IgnoreCommand(wParam, lParam);
+
+ ::db_set_b(hContact, "CList", "Hidden", 1);
+ }
+
+ return 0;
+}
+
+INT_PTR CSkypeProto::OpenIgnoreListCommand(WPARAM, LPARAM)
+{
+ ::DialogBoxParam(g_hInstance, MAKEINTRESOURCE(IDD_IGNORE_LIST), NULL, CSkypeProto::IgnoreListWndProc, (LPARAM)this);
+
+ return 0;
+}
+
+static WNDPROC oldWndProc = NULL;
+
+static LRESULT CALLBACK IgnoreListSubProc(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 | LVIF_GROUPID;
+ lvi.stateMask = -1;
+ lvi.iItem = hi.iItem;
+ if (ListView_GetItem(hwnd, &lvi))
+ {
+ if (lvi.iGroupId == 1)
+ {
+ CContact *contact = (CContact *)lvi.lParam;
+
+ if (contact->SetBlocked(false))
+ ListView_DeleteItem(hwnd, lvi.iItem);
+ }
+ /*else if (lvi.iGroupId == 2)
+ {
+ CConversation *convo = (CConversation *)lvi.lParam;
+
+ if (convo->SetBlocked(false))
+ ListView_DeleteItem(hwnd, lvi.iItem);
+ }*/
+ }
+ }
+ }
+
+ return ::CallWindowProc(oldWndProc, hwnd, msg, wParam, lParam);
+}
+
+int ImageList_AddIconFromIconLib(HIMAGELIST hIml, const char *name)
+{
+ HICON icon = ::Skin_GetIconByHandle(::Skin_GetIconHandle(name));
+ int res = ImageList_AddIcon(hIml, icon);
+ ::Skin_ReleaseIcon(icon);
+ return res;
+}
+
+INT_PTR CALLBACK CSkypeProto::IgnoreListWndProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ CSkypeProto *ppro = (CSkypeProto *)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
+
+ switch (msg)
+ {
+ case WM_INITDIALOG:
+ if (lParam)
+ {
+ ppro = (CSkypeProto *)lParam;
+ ::TranslateDialogDefault(hwndDlg);
+
+ ::SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam);
+
+ ::SendMessage(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)::Skin_GetIcon("Skype_block", ICON_BIG));
+ ::SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)::Skin_GetIcon("Skype_block"));
+
+ HWND hwndList = ::GetDlgItem(hwndDlg, IDC_BM_LIST);
+ { // IDC_BM_LIST setup
+ oldWndProc = (WNDPROC)::SetWindowLongPtr(hwndList, GWLP_WNDPROC, (LONG_PTR)IgnoreListSubProc);
+
+ 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);
+
+ ///
+ LVGROUP lvg;
+ lvg.cbSize = sizeof(LVGROUP);
+ lvg.mask = LVGF_HEADER | LVGF_GROUPID;
+
+ lvg.pszHeader = ::TranslateT("Contacts");
+ lvg.iGroupId = 1;
+ ListView_InsertGroup(hwndList, 0, &lvg);
+
+ lvg.pszHeader = ::TranslateT("Conferences");
+ lvg.iGroupId = 2;
+ ListView_InsertGroup(hwndList, 0, &lvg);
+
+ ListView_EnableGroupView(hwndList, TRUE);
+
+ ::SendMessage(hwndList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_SUBITEMIMAGES | LVS_EX_FULLROWSELECT | LVS_EX_LABELTIP);
+
+ if ( !ppro->IsOnline())
+ ::EnableWindow(hwndList, FALSE);
+ }
+
+ SEString data;
+ ContactGroupRef blockedList;
+ ppro->GetHardwiredContactGroup(ContactGroup::CONTACTS_BLOCKED_BY_ME, blockedList);
+
+ ContactRefs contacts;
+ blockedList->GetContacts(contacts);
+ for (size_t i = 0; i < contacts.size(); i++)
+ {
+ auto contact = contacts[i];
+
+ contact->GetPropDisplayname(data);
+ ptrW name = ::mir_utf8decodeW(data);
+
+ LVITEM lvi = {0};
+ lvi.mask = LVIF_GROUPID | LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
+ lvi.iItem = (int)i;
+ lvi.iGroupId = 1;
+ lvi.iImage = 0;
+ lvi.lParam = (LPARAM)contact.fetch();
+ lvi.pszText = name;
+ 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);
+ }
+ }
+
+ ConversationRefs conversations;
+ blockedList->GetConversations(conversations);
+ for (size_t i = 0; i < conversations.size(); i++)
+ {
+ auto conversation = conversations[i];
+
+ uint type = conversation->GetUintProp(Conversation::P_TYPE);
+ if (type != Conversation::CONFERENCE)
+ continue;
+
+ conversation->GetPropDisplayname(data);
+ ptrW name = ::mir_utf8decodeW(data);
+
+ LVITEM lvi = {0};
+ lvi.mask = LVIF_GROUPID | LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
+ lvi.iItem = (int)i;
+ lvi.iGroupId = 2;
+ lvi.iImage = 0;
+ lvi.lParam = (LPARAM)conversation.fetch();
+ lvi.pszText = name;
+ 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);
+ }
+ }
+
+ ::Utils_RestoreWindowPosition(hwndDlg, 0, MODULE, "BookmarksWindow");
+ }
+ break;
+
+ case WM_NOTIFY:
+ switch(LOWORD(wParam))
+ {
+ case IDC_BM_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)
+ {
+ CContact *contact = (CContact *)lvi.lParam;
+
+ contact->GetIdentity(data);
+ ptrW sid(::mir_utf8decodeW(data));
+ ::CallService(MS_MSG_SENDMESSAGE, (WPARAM)ppro->GetContactBySid(sid), 0);
+ }
+ else if (lvi.iGroupId == 2)
+ {
+ CConversation *conversation = (CConversation *)lvi.lParam;
+
+ conversation->GetPropIdentity(data);
+ ptrW cid(::mir_utf8decodeW(data));
+ CSkypeProto::ReplaceSpecialChars(cid);
+
+ ChatRoom *room = ppro->FindChatRoom(cid);
+ if (room != NULL)
+ ::CallProtoService(ppro->m_szModuleName, PS_JOINCHAT, (WPARAM)room->GetContactHandle(), 0);
+ else
+ {
+ conversation->GetPropDisplayname(data);
+ ptrW name = ::mir_utf8decodeW(data);
+
+ ChatRoom *room = new ChatRoom(cid, name, ppro);
+ room->Start(conversation->ref(), true);
+ }
+ }
+ }
+ }
+ }
+ break;
+
+ case WM_COMMAND:
+ if (HIWORD( wParam ) == BN_CLICKED)
+ {
+ switch(LOWORD(wParam))
+ {
+ case IDCANCEL:
+ ::Utils_SaveWindowPosition(hwndDlg, NULL, MODULE, "BookmarksWindow");
+ ::Skin_ReleaseIcon((HICON)SendMessage(hwndDlg, WM_SETICON, ICON_BIG, 0));
+ ::Skin_ReleaseIcon((HICON)SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, 0));
+ ::DestroyWindow(hwndDlg);
+ return TRUE;
+ }
+ }
+ break;
+ }
+ return FALSE;
+}
\ No newline at end of file |