From 4f768c2c74564c76410c704a7cd63cf6c5ecda9a Mon Sep 17 00:00:00 2001 From: Kirill Volinsky Date: Wed, 13 Mar 2013 11:06:51 +0000 Subject: StatusChange plugin adopted git-svn-id: http://svn.miranda-ng.org/main/trunk@3997 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/StatusChange/src/main.cpp | 356 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 356 insertions(+) create mode 100644 plugins/StatusChange/src/main.cpp (limited to 'plugins/StatusChange/src/main.cpp') diff --git a/plugins/StatusChange/src/main.cpp b/plugins/StatusChange/src/main.cpp new file mode 100644 index 0000000000..18e7802951 --- /dev/null +++ b/plugins/StatusChange/src/main.cpp @@ -0,0 +1,356 @@ +#include "Common.h" + +HINSTANCE hInst; +TOPTIONS Options; +HICON hIconMsg; +HICON hIconUrl; +HICON hIconFile; +int hLangpack; + +PLUGININFOEX pluginInfo={ + sizeof(PLUGININFOEX), + __PLUGIN_NAME, + PLUGIN_MAKE_VERSION(__MAJOR_VERSION, __MINOR_VERSION, __RELEASE_NUM, __BUILD_NUM), + __DESCRIPTION, + __AUTHOR, + __AUTHOREMAIL, + __COPYRIGHT, + __AUTHORWEB, + UNICODE_AWARE, + // {1ACB2ED1-C1ED-43EE-89BD-086686F6EBB5} + {0x1acb2ed1, 0xc1ed, 0x43ee, {0x89, 0xbd, 0x8, 0x66, 0x86, 0xf6, 0xeb, 0xb5}} +}; + +void LoadOptions() +{ + ZeroMemory(&Options, sizeof(Options)); + Options.MessageRead = (BOOL)db_get_b(NULL, PLUGINNAME, "MessageRead", FALSE); + Options.MessageSend = (BOOL)db_get_b(NULL, PLUGINNAME, "MessageSend", TRUE); + Options.UrlRead = (BOOL)db_get_b(NULL, PLUGINNAME, "UrlRead", FALSE); + Options.UrlSend = (BOOL)db_get_b(NULL, PLUGINNAME, "UrlSend", TRUE); + Options.FileRead = (BOOL)db_get_b(NULL, PLUGINNAME, "FileRead", FALSE); + Options.FileSend = (BOOL)db_get_b(NULL, PLUGINNAME, "FileSend", TRUE); + Options.ChangeTo = (INT)db_get_dw(NULL, PLUGINNAME, "ChangeTo", ID_STATUS_ONLINE); + Options.IfOffline = (BOOL)db_get_b(NULL, PLUGINNAME, "IfOffline", FALSE); + Options.IfOnline = (BOOL)db_get_b(NULL, PLUGINNAME, "IfOnline", FALSE); + Options.IfAway = (BOOL)db_get_b(NULL, PLUGINNAME, "IfAway", TRUE); + Options.IfNA = (BOOL)db_get_b(NULL, PLUGINNAME, "IfNA", TRUE); + Options.IfOccupied = (BOOL)db_get_b(NULL, PLUGINNAME, "IfOccupied", FALSE); + Options.IfDND = (BOOL)db_get_b(NULL, PLUGINNAME, "IfDND", FALSE); + Options.IfFreeforchat = (BOOL)db_get_b(NULL, PLUGINNAME, "IfFreeforchat", FALSE); + Options.IfInvisible = (BOOL)db_get_b(NULL, PLUGINNAME, "IfInvisible", FALSE); + Options.IfOnthephone = (BOOL)db_get_b(NULL, PLUGINNAME, "IfOnthephone", FALSE); + Options.IfOuttolunch = (BOOL)db_get_b(NULL, PLUGINNAME, "IfOuttolunch", FALSE); +} + +static int StatusChangeGetMessage(WPARAM wParam, LPARAM lParam) +{ + HANDLE hDbEvent = (HANDLE)lParam; + DBEVENTINFO dbe; + int status; + BOOL read, send, change_status; + + dbe.cbSize = sizeof(dbe); + dbe.cbBlob = 0; + CallService(MS_DB_EVENT_GET, (WPARAM)hDbEvent, (LPARAM)&dbe); + + status = (int)CallProtoService(dbe.szModule, PS_GETSTATUS, 0, 0); + if(!status) + status = CallService(MS_CLIST_GETSTATUSMODE, 0, 0); + + if(status == Options.ChangeTo) + return 0; + + switch (status) { + case ID_STATUS_OFFLINE : change_status = Options.IfOffline; break; + case ID_STATUS_ONLINE : change_status = Options.IfOnline; break; + case ID_STATUS_AWAY : change_status = Options.IfAway; break; + case ID_STATUS_NA : change_status = Options.IfNA; break; + case ID_STATUS_OCCUPIED : change_status = Options.IfOccupied; break; + case ID_STATUS_DND : change_status = Options.IfDND; break; + case ID_STATUS_FREECHAT : change_status = Options.IfFreeforchat; break; + case ID_STATUS_INVISIBLE : change_status = Options.IfInvisible; break; + case ID_STATUS_ONTHEPHONE : change_status = Options.IfOnthephone; break; + case ID_STATUS_OUTTOLUNCH : change_status = Options.IfOuttolunch; break; + default : change_status = FALSE; break; + } + + if (!change_status) + return 0; + + switch (dbe.eventType) { + case EVENTTYPE_MESSAGE : + read = Options.MessageRead; + send = Options.MessageSend; + break; + case EVENTTYPE_URL : + read = Options.UrlRead; + send = Options.UrlSend; + break; + case EVENTTYPE_FILE : + read = Options.FileRead; + send = Options.FileSend; + break; + break; + } + + // If is a message sent... + if (((DWORD)(dbe.flags & ((DWORD)DBEF_SENT))) == ((DWORD)(DBEF_SENT))) { + if (send) { + // change status + CallProtoService(dbe.szModule, PS_SETSTATUS, (LPARAM)(Options.ChangeTo), 0); + } + } + + // If is a message received... + else { + if (read) { + // change status + CallProtoService(dbe.szModule, PS_SETSTATUS, (LPARAM)(Options.ChangeTo), 0); + } + } + + return 0; +} + +static BOOL CALLBACK DlgProcStatusChangeOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch (msg) { + case WM_INITDIALOG: + TranslateDialogDefault(hwndDlg); + + hIconMsg = (HICON)CopyImage(LoadSkinnedIcon(SKINICON_EVENT_MESSAGE), IMAGE_ICON, 16, 16, LR_COPYFROMRESOURCE); + SendDlgItemMessage(hwndDlg, IDC_MSGICON, STM_SETICON, (WPARAM)hIconMsg, 0); + hIconUrl = (HICON)CopyImage(LoadSkinnedIcon(SKINICON_EVENT_URL), IMAGE_ICON, 16, 16, LR_COPYFROMRESOURCE); + SendDlgItemMessage(hwndDlg, IDC_URLICON, STM_SETICON, (WPARAM)hIconUrl, 0); + hIconFile = (HICON)CopyImage(LoadSkinnedIcon(SKINICON_EVENT_FILE), IMAGE_ICON, 16, 16, LR_COPYFROMRESOURCE); + SendDlgItemMessage(hwndDlg, IDC_FILEICON, STM_SETICON, (WPARAM)hIconFile, 0); + + CheckDlgButton(hwndDlg, IDC_CHK_MESSAGEREAD, Options.MessageRead?BST_CHECKED:BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_CHK_MESSAGESEND, Options.MessageSend?BST_CHECKED:BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_CHK_URLREAD, Options.UrlRead?BST_CHECKED:BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_CHK_URLSEND, Options.UrlSend?BST_CHECKED:BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_CHK_FILEREAD, Options.FileRead?BST_CHECKED:BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_CHK_FILESEND, Options.FileSend?BST_CHECKED:BST_UNCHECKED); + + switch(Options.ChangeTo) { + case ID_STATUS_OFFLINE : CheckDlgButton(hwndDlg, IDC_RAD_OFFLINE, BST_CHECKED); break; + case ID_STATUS_ONLINE : CheckDlgButton(hwndDlg, IDC_RAD_ONLINE, BST_CHECKED); break; + case ID_STATUS_AWAY : CheckDlgButton(hwndDlg, IDC_RAD_AWAY, BST_CHECKED); break; + case ID_STATUS_DND : CheckDlgButton(hwndDlg, IDC_RAD_DND, BST_CHECKED); break; + case ID_STATUS_NA : CheckDlgButton(hwndDlg, IDC_RAD_NA, BST_CHECKED); break; + case ID_STATUS_OCCUPIED : CheckDlgButton(hwndDlg, IDC_RAD_OCCUPIED, BST_CHECKED); break; + case ID_STATUS_FREECHAT : CheckDlgButton(hwndDlg, IDC_RAD_FREECHAT, BST_CHECKED); break; + case ID_STATUS_INVISIBLE : CheckDlgButton(hwndDlg, IDC_RAD_INVISIBLE, BST_CHECKED); break; + case ID_STATUS_ONTHEPHONE : CheckDlgButton(hwndDlg, IDC_RAD_ONTHEPHONE, BST_CHECKED); break; + case ID_STATUS_OUTTOLUNCH : CheckDlgButton(hwndDlg, IDC_RAD_OUTTOLUNCH, BST_CHECKED); break; + break; + } + + CheckDlgButton(hwndDlg, IDC_CHK_OFFLINE, Options.IfOffline?BST_CHECKED:BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_CHK_ONLINE, Options.IfOnline?BST_CHECKED:BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_CHK_AWAY, Options.IfAway?BST_CHECKED:BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_CHK_DND, Options.IfDND?BST_CHECKED:BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_CHK_NA, Options.IfNA?BST_CHECKED:BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_CHK_OCCUPIED, Options.IfOccupied?BST_CHECKED:BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_CHK_FREECHAT, Options.IfFreeforchat?BST_CHECKED:BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_CHK_INVISIBLE, Options.IfInvisible?BST_CHECKED:BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_CHK_ONTHEPHONE, Options.IfOnthephone?BST_CHECKED:BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_CHK_OUTTOLUNCH, Options.IfOuttolunch?BST_CHECKED:BST_UNCHECKED); + return TRUE; + + case WM_COMMAND: + switch(LOWORD(wParam)) { + case IDC_CHK_MESSAGEREAD: + Options.MessageRead = !Options.MessageRead; + PostMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + case IDC_CHK_MESSAGESEND: + Options.MessageSend = !Options.MessageSend; + PostMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + case IDC_CHK_URLREAD: + Options.UrlRead = !Options.UrlRead; + PostMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + case IDC_CHK_URLSEND: + Options.UrlSend = !Options.UrlSend; + PostMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + case IDC_CHK_FILEREAD: + Options.FileRead = !Options.FileRead; + PostMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + case IDC_CHK_FILESEND: + Options.FileSend = !Options.FileSend; + PostMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + + case IDC_RAD_OFFLINE: + Options.ChangeTo = ID_STATUS_OFFLINE; + PostMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + case IDC_RAD_ONLINE: + Options.ChangeTo = ID_STATUS_ONLINE; + PostMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + case IDC_RAD_AWAY: + Options.ChangeTo = ID_STATUS_AWAY; + PostMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + case IDC_RAD_DND: + Options.ChangeTo = ID_STATUS_DND; + PostMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + case IDC_RAD_NA: + Options.ChangeTo = ID_STATUS_NA; + PostMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + case IDC_RAD_OCCUPIED: + Options.ChangeTo = ID_STATUS_OCCUPIED; + PostMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + case IDC_RAD_FREECHAT: + Options.ChangeTo = ID_STATUS_FREECHAT; + PostMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + case IDC_RAD_INVISIBLE: + Options.ChangeTo = ID_STATUS_INVISIBLE; + PostMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + case IDC_RAD_ONTHEPHONE: + Options.ChangeTo = ID_STATUS_ONTHEPHONE; + PostMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + case IDC_RAD_OUTTOLUNCH: + Options.ChangeTo = ID_STATUS_OUTTOLUNCH; + PostMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + + case IDC_CHK_OFFLINE: + Options.IfOffline = !Options.IfOffline; + PostMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + case IDC_CHK_ONLINE: + Options.IfOnline = !Options.IfOnline; + PostMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + case IDC_CHK_AWAY: + Options.IfAway = !Options.IfAway; + PostMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + case IDC_CHK_DND: + Options.IfDND = !Options.IfDND; + PostMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + case IDC_CHK_NA: + Options.IfNA = !Options.IfNA; + PostMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + case IDC_CHK_OCCUPIED: + Options.IfOccupied = !Options.IfOccupied; + PostMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + case IDC_CHK_FREECHAT: + Options.IfFreeforchat = !Options.IfFreeforchat; + PostMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + case IDC_CHK_INVISIBLE: + Options.IfInvisible = !Options.IfInvisible; + PostMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + case IDC_CHK_ONTHEPHONE: + Options.IfOnthephone = !Options.IfOnthephone; + PostMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + case IDC_CHK_OUTTOLUNCH: + Options.IfOuttolunch = !Options.IfOuttolunch; + PostMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; + } + break; + + case WM_NOTIFY: + switch(((LPNMHDR)lParam)->idFrom) { + case 0: + switch (((LPNMHDR)lParam)->code) { + case PSN_RESET: + LoadOptions(); + return TRUE; + case PSN_APPLY: + db_set_b(NULL, PLUGINNAME, "MessageRead", (BYTE)Options.MessageRead); + db_set_b(NULL, PLUGINNAME, "MessageSend", (BYTE)Options.MessageSend); + db_set_b(NULL, PLUGINNAME, "UrlRead", (BYTE)Options.UrlRead); + db_set_b(NULL, PLUGINNAME, "UrlSend", (BYTE)Options.UrlSend); + db_set_b(NULL, PLUGINNAME, "FileRead", (BYTE)Options.FileRead); + db_set_b(NULL, PLUGINNAME, "FileSend", (BYTE)Options.FileSend); + db_set_dw(NULL, PLUGINNAME, "ChangeTo", (DWORD)Options.ChangeTo); + db_set_b(NULL, PLUGINNAME, "IfOffline", (BYTE)Options.IfOffline); + db_set_b(NULL, PLUGINNAME, "IfOnline", (BYTE)Options.IfOnline); + db_set_b(NULL, PLUGINNAME, "IfAway", (BYTE)Options.IfAway); + db_set_b(NULL, PLUGINNAME, "IfNA", (BYTE)Options.IfNA); + db_set_b(NULL, PLUGINNAME, "IfDND", (BYTE)Options.IfDND); + db_set_b(NULL, PLUGINNAME, "IfOccupied", (BYTE)Options.IfOccupied); + db_set_b(NULL, PLUGINNAME, "IfFreeforchat", (BYTE)Options.IfFreeforchat); + db_set_b(NULL, PLUGINNAME, "IfInvisible", (BYTE)Options.IfInvisible); + db_set_b(NULL, PLUGINNAME, "IfOnthephone", (BYTE)Options.IfOnthephone); + db_set_b(NULL, PLUGINNAME, "IfOuttolunch", (BYTE)Options.IfOuttolunch); + return TRUE; + break; + } + break; + break; + } + break; + + case WM_DESTROY: + DestroyIcon(hIconMsg); + DestroyIcon(hIconUrl); + DestroyIcon(hIconFile); + break; + } + + return FALSE; +} + +int StatusChangeOptInit(WPARAM wParam, LPARAM lParam) +{ + OPTIONSDIALOGPAGE odp = {0}; + odp.cbSize = sizeof(odp); + odp.hInstance = hInst; + odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPTIONS); + odp.ptszTitle = LPGENT("Status Change"); + odp.ptszGroup = LPGENT("Status"); + odp.flags = ODPF_BOLDGROUPS | ODPF_TCHAR; + odp.pfnDlgProc = DlgProcStatusChangeOpts; + Options_AddPage(wParam, &odp); + return 0; +} + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + hInst = hinstDLL; + return TRUE; +} + +extern "C" __declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD mirandaVersion) +{ + return &pluginInfo; +} + +extern "C" __declspec(dllexport) int Load(void) +{ + mir_getLP(&pluginInfo); + + HookEvent(ME_OPT_INITIALISE, StatusChangeOptInit); + HookEvent(ME_DB_EVENT_ADDED, StatusChangeGetMessage); + + LoadOptions(); + + return 0; +} + +extern "C" __declspec(dllexport) int Unload(void) +{ + return 0; +} -- cgit v1.2.3