diff options
author | sje <sje@4f64403b-2f21-0410-a795-97e2b3489a10> | 2006-11-01 14:58:39 +0000 |
---|---|---|
committer | sje <sje@4f64403b-2f21-0410-a795-97e2b3489a10> | 2006-11-01 14:58:39 +0000 |
commit | 0c3d3e587e699d06352f269d887d749a8542559a (patch) | |
tree | 2ebcd55584339b04645f0bb79318f987c7efaa46 /yapp/services.cpp | |
parent | 9a1b2f988762967da30e6f4d2575dc2dfe99a21a (diff) |
git-svn-id: https://server.scottellis.com.au/svn/mim_plugs@26 4f64403b-2f21-0410-a795-97e2b3489a10
Diffstat (limited to 'yapp/services.cpp')
-rw-r--r-- | yapp/services.cpp | 363 |
1 files changed, 363 insertions, 0 deletions
diff --git a/yapp/services.cpp b/yapp/services.cpp new file mode 100644 index 0000000..28f2b5b --- /dev/null +++ b/yapp/services.cpp @@ -0,0 +1,363 @@ +#include "common.h" +#include "services.h" +#include "popwin.h" +#include "message_pump.h" +#include "resource.h" +#include "popup_history.h" +#include <time.h> + +#define NUM_SERVICES 13 +HANDLE hService[NUM_SERVICES]; +HANDLE hMenuShowHistory, hMenuToggleOnOff; + +void StripBBCodesInPlace(wchar_t *text) { + if(!DBGetContactSettingByte(0, MODULE, "StripBBCodes", 1)) + return; + + int read = 0, write = 0; + int len = wcslen(text); + + while(read <= len) { // copy terminating null too + while(read <= len && text[read] != L'[') { + if(text[read] != text[write]) text[write] = text[read]; + read++; write++; + } + if(read == len) break; + + if(len - read >= 3 && (wcsnicmp(text + read, L"[b]", 3) == 0 || wcsnicmp(text + read, L"[i]", 3) == 0)) + read += 3; + else if(len - read >= 4 && (wcsnicmp(text + read, L"[/b]", 4) == 0 || wcsnicmp(text + read, L"[/i]", 4) == 0)) + read += 4; + else if(len - read >= 6 && (wcsnicmp(text + read, L"[color", 6) == 0)) { + while(read < len && text[read] != L']') read++; + read++;// skip the ']' + } else if(len - read >= 8 && (wcsnicmp(text + read, L"[/color]", 8) == 0)) + read += 8; + else { + if(text[read] != text[write]) text[write] = text[read]; + read++; write++; + } + } +} + +int CreatePopupA(WPARAM wParam, LPARAM lParam) { + if(!DBGetContactSettingByte(0, MODULE, "Enabled", 1)) return 0; + + POPUPDATA *pd_in = (POPUPDATA *)wParam; + POPUPDATAW *pd_out = (POPUPDATAW *)malloc(sizeof(POPUPDATAW)); + + MultiByteToWideChar(code_page, 0, pd_in->lpzContactName, -1, pd_out->lpwzContactName, MAX_CONTACTNAME); + MultiByteToWideChar(code_page, 0, pd_in->lpzText, -1, pd_out->lpwzText, MAX_SECONDLINE); + pd_out->lpwzContactName[MAX_CONTACTNAME - 1] = 0; + pd_out->lpwzText[MAX_SECONDLINE - 1] = 0; + StripBBCodesInPlace(pd_out->lpwzContactName); + StripBBCodesInPlace(pd_out->lpwzText); + + pd_out->lchContact = pd_in->lchContact; + pd_out->lchIcon = pd_in->lchIcon; + if(pd_in->colorBack == 0xffffffff) // that's the old #define for 'skinned bg' + pd_out->colorBack = pd_out->colorText = 0; + else { + pd_out->colorBack = pd_in->colorBack & 0xFFFFFF; + pd_out->colorText = pd_in->colorText & 0xFFFFFF; + } + pd_out->PluginWindowProc = pd_in->PluginWindowProc; + pd_out->PluginData = pd_in->PluginData; + pd_out->iSeconds = 0; + + lstPopupHistory.Add(pd_out->lpwzContactName, pd_out->lpwzText, time(0)); + + if(!DBGetContactSettingByte(0, MODULE, "Enabled", 1)) { + free(pd_out); + return 0; + } + + //MessageBox(0, pd_out->lpwzContactName, _T("CreatePopupA"), MB_OK); + PostMPMessage(MUM_CREATEPOPUP, 0, (LPARAM)pd_out); + return 0; +} + +int CreatePopupExA(WPARAM wParam, LPARAM lParam) { + + POPUPDATAEX *pd_in = (POPUPDATAEX *)wParam; + POPUPDATAW *pd_out = (POPUPDATAW *)malloc(sizeof(POPUPDATAW)); + + MultiByteToWideChar(code_page, 0, pd_in->lpzContactName, -1, pd_out->lpwzContactName, MAX_CONTACTNAME); + MultiByteToWideChar(code_page, 0, pd_in->lpzText, -1, pd_out->lpwzText, MAX_SECONDLINE); + pd_out->lpwzContactName[MAX_CONTACTNAME - 1] = 0; + pd_out->lpwzText[MAX_SECONDLINE - 1] = 0; + StripBBCodesInPlace(pd_out->lpwzContactName); + StripBBCodesInPlace(pd_out->lpwzText); + + pd_out->lchContact = pd_in->lchContact; + pd_out->lchIcon = pd_in->lchIcon; + if(pd_in->colorBack == 0xffffffff) // that's the old #define for 'skinned bg' + pd_out->colorBack = pd_out->colorText = 0; + else { + pd_out->colorBack = pd_in->colorBack & 0xFFFFFF; + pd_out->colorText = pd_in->colorText & 0xFFFFFF; + } + pd_out->PluginWindowProc = pd_in->PluginWindowProc; + pd_out->PluginData = pd_in->PluginData; + pd_out->iSeconds = pd_in->iSeconds; + + lstPopupHistory.Add(pd_out->lpwzContactName, pd_out->lpwzText, time(0)); + if(!DBGetContactSettingByte(0, MODULE, "Enabled", 1)) { + free(pd_out); + return 0; + } + + //MessageBox(0, pd_out->lpwzContactName, _T("CreatePopupExA"), MB_OK); + PostMPMessage(MUM_CREATEPOPUP, 0, (LPARAM)pd_out); + return 0; +} + +int CreatePopupW(WPARAM wParam, LPARAM lParam) { + + POPUPDATAW *pd_in = (POPUPDATAW *)wParam; + POPUPDATAW *pd_out = (POPUPDATAW *)malloc(sizeof(POPUPDATAW)); + memcpy(pd_out, pd_in, sizeof(POPUPDATAW)); + pd_out->lpwzContactName[MAX_CONTACTNAME - 1] = 0; + pd_out->lpwzText[MAX_SECONDLINE - 1] = 0; + StripBBCodesInPlace(pd_out->lpwzContactName); + StripBBCodesInPlace(pd_out->lpwzText); + + if(pd_in->colorBack == 0xffffffff) // that's the old #define for 'skinned bg' + pd_out->colorBack = pd_out->colorText = 0; + else { + pd_out->colorBack &= 0xFFFFFF; + pd_out->colorText &= 0xFFFFFF; + } + + lstPopupHistory.Add(pd_out->lpwzContactName, pd_out->lpwzText, time(0)); + if(!DBGetContactSettingByte(0, MODULE, "Enabled", 1)) { + free(pd_out); + return 0; + } + + //MessageBox(0, pd_out->lpwzContactName, _T("CreatePopupW"), MB_OK); + PostMPMessage(MUM_CREATEPOPUP, 0, (LPARAM)pd_out); + return 0; +} + +int ChangeTextW(WPARAM wParam, LPARAM lParam) { + HWND hwndPop = (HWND)wParam; + wchar_t *newText = wcsdup((wchar_t *)lParam); + StripBBCodesInPlace(newText); + + if(IsWindow(hwndPop)) + PostMessage(hwndPop, PUM_SETTEXT, 0, (LPARAM)newText); + return 0; +} + +int ChangeTextA(WPARAM wParam, LPARAM lParam) { + HWND hwndPop = (HWND)wParam; + char *newText = (char *)lParam; + wchar_t buff[MAX_SECONDLINE]; + MultiByteToWideChar(code_page, 0, newText, -1, buff, MAX_SECONDLINE); + buff[MAX_SECONDLINE - 1] = 0; + StripBBCodesInPlace(buff); + + if(IsWindow(hwndPop)) + PostMessage(hwndPop, PUM_SETTEXT, 0, (LPARAM)wcsdup(buff)); + return 0; +} + +int GetContact(WPARAM wParam, LPARAM lParam) { + HWND hwndPop = (HWND)wParam; + HANDLE hContact; + if(GetCurrentThreadId() == message_pump_thread_id) { + SendMessage(hwndPop, PUM_GETCONTACT, (WPARAM)&hContact, 0); + } else { + HANDLE hEvent = CreateEvent(0, 0, 0, 0); + PostMessage(hwndPop, PUM_GETCONTACT, (WPARAM)&hContact, (LPARAM)hEvent); + //WaitForSingleObject(hEvent, INFINITE); + MsgWaitForMultipleObjectsEx(1, &hEvent, INFINITE, 0, 0); + CloseHandle(hEvent); + } + + return (int)hContact; +} + +int GetPluginData(WPARAM wParam, LPARAM lParam) { + HWND hwndPop = (HWND)wParam; + void *data = 0; + if(GetCurrentThreadId() == message_pump_thread_id) { + SendMessage(hwndPop, PUM_GETPLUGINDATA, (WPARAM)&data, 0); + } else { + HANDLE hEvent = CreateEvent(0, 0, 0, 0); + PostMessage(hwndPop, PUM_GETPLUGINDATA, (WPARAM)&data, (LPARAM)hEvent); + //WaitForSingleObject(hEvent, INFINITE); + MsgWaitForMultipleObjectsEx(1, &hEvent, INFINITE, 0, 0); + CloseHandle(hEvent); + } + + if(lParam && !ignore_gpd_passed_addy) { + void **pData = (void **)lParam; + *pData = data; + } + + return (int)data; +} + +int IsSecondLineShown(WPARAM wParam, LPARAM lParam) { + return TRUE; +} + +int PopupQuery(WPARAM wParam, LPARAM lParam) { + switch(wParam) { + case PUQS_ENABLEPOPUPS: + { + bool enabled = (DBGetContactSettingByte(0, MODULE, "Enabled", 1) == 1); + if(!enabled) DBWriteContactSettingByte(0, MODULE, "Enabled", 1); + return enabled ? 0: 1; + } + break; + case PUQS_DISABLEPOPUPS: + { + bool enabled = (DBGetContactSettingByte(0, MODULE, "Enabled", 1) == 1); + if(enabled) DBWriteContactSettingByte(0, MODULE, "Enabled", 0); + DBWriteContactSettingByte(0, MODULE, "Enabled", 0); + return enabled ? 1 : 0; + } + break; + case PUQS_GETSTATUS: + return DBGetContactSettingByte(0, MODULE, "Enabled", 1); + default: + return 1; + } + return 0; +} + +int TogglePopups(WPARAM wParam, LPARAM lParam) { + CLISTMENUITEM menu; + menu.cbSize = sizeof(CLISTMENUITEM); + // just write to db - the rest is handled in the Meta_SettingChanged function + if(DBGetContactSettingByte(0, MODULE, "Enabled", 1)) { + DBWriteContactSettingByte(0, MODULE, "Enabled", 0); + // modify main menu item + menu.flags = CMIM_NAME;// | CMIM_ICON; + menu.hIcon=0; //LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MCMENUOFF)); + menu.pszName = (char *)Translate("Enable Popups"); + CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hMenuToggleOnOff, (LPARAM)&menu); + } else { + DBWriteContactSettingByte(0, MODULE, "Enabled", 1); + // modify main menu item + menu.flags = CMIM_NAME;// | CMIM_ICON; + menu.hIcon=0;//LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MCMENU)); + menu.pszName = (char *)Translate("Disable Popups"); + CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)hMenuToggleOnOff, (LPARAM)&menu); + } + return 0; +} + +int PopupChange(WPARAM wParam, LPARAM lParam) { + HWND hwndPop = (HWND)wParam; + POPUPDATAEX *pd_in = (POPUPDATAEX *)lParam; + + if(IsWindow(hwndPop)) { + POPUPDATAW *pd_out = (POPUPDATAW *)malloc(sizeof(POPUPDATAW)); + + MultiByteToWideChar(code_page, 0, pd_in->lpzContactName, -1, pd_out->lpwzContactName, MAX_CONTACTNAME); + MultiByteToWideChar(code_page, 0, pd_in->lpzText, -1, pd_out->lpwzText, MAX_SECONDLINE); + + pd_out->lchContact = pd_in->lchContact; + pd_out->lchIcon = pd_in->lchIcon; + if(pd_in->colorBack == 0xffffffff) // that's the old #define for 'skinned bg' + pd_out->colorBack = pd_out->colorText = 0; + else { + pd_out->colorBack = pd_in->colorBack & 0xFFFFFF; + pd_out->colorText = pd_in->colorText & 0xFFFFFF; + } + pd_out->colorBack = pd_in->colorBack; + pd_out->colorText = pd_in->colorText; + pd_out->PluginWindowProc = pd_in->PluginWindowProc; + pd_out->PluginData = pd_in->PluginData; + pd_out->iSeconds = pd_in->iSeconds; + + lstPopupHistory.Add(pd_out->lpwzContactName, pd_out->lpwzText, time(0)); + + PostMessage(hwndPop, PUM_CHANGE, 0, (LPARAM)pd_out); + } + return 0; +} + +int ShowMessage(WPARAM wParam, LPARAM lParam) { + if(!DBGetContactSettingByte(0, MODULE, "Enabled", 1)) return 0; + + POPUPDATAW pd = {0}; + wcscpy(pd.lpwzContactName, lParam == SM_WARNING ? _T("Warning") : _T("Notification")); + pd.lchIcon = LoadIcon(0, lParam == SM_WARNING ? IDI_WARNING : IDI_INFORMATION); + wchar_t buff[MAX_SECONDLINE]; + MultiByteToWideChar(code_page, 0, (char *)wParam, -1, buff, MAX_SECONDLINE); + wcscpy(pd.lpwzText, buff); + + CallService(MS_POPUP_ADDPOPUPW, (WPARAM)&pd, 0); + + return 0; +} + +//=====PopUp/ShowHistory +//extern BOOL CALLBACK DlgProcHistLstOpts(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); +int PopUp_ShowHistory(WPARAM wParam, LPARAM lParam) +{ + if (!hHistoryWindow) { + hHistoryWindow = CreateDialog(hInst, MAKEINTRESOURCE(IDD_LST_HISTORY), NULL, DlgProcHistLst); + } + ShowWindow(hHistoryWindow, SW_SHOW); + return 0; +} + +int PrebuildMenu(WPARAM wParam, LPARAM lParam) { + return 0; +} + +HANDLE hEventBuildMenu; + +void InitServices() { + int i = 0; + hService[i++] = CreateServiceFunction(MS_POPUP_ADDPOPUP, CreatePopupA); + hService[i++] = CreateServiceFunction(MS_POPUP_ADDPOPUPEX, CreatePopupExA); + hService[i++] = CreateServiceFunction(MS_POPUP_ADDPOPUPW, CreatePopupW); + hService[i++] = CreateServiceFunction(MS_POPUP_CHANGETEXTW, ChangeTextW); + hService[i++] = CreateServiceFunction(MS_POPUP_CHANGETEXT, ChangeTextA); + hService[i++] = CreateServiceFunction(MS_POPUP_CHANGE, PopupChange); + hService[i++] = CreateServiceFunction(MS_POPUP_GETCONTACT, GetContact); + hService[i++] = CreateServiceFunction(MS_POPUP_GETPLUGINDATA, GetPluginData); + hService[i++] = CreateServiceFunction(MS_POPUP_ISSECONDLINESHOWN, IsSecondLineShown); + hService[i++] = CreateServiceFunction(MS_POPUP_QUERY, PopupQuery); + + hService[i++] = CreateServiceFunction(MS_POPUP_SHOWMESSAGE, ShowMessage); + + hService[i++] = CreateServiceFunction(MS_POPUP_SHOWHISTORY, PopUp_ShowHistory); + hService[i++] = CreateServiceFunction("PopUp/ToggleEnabled", TogglePopups); + + CLISTMENUITEM menu = {0}; + + menu.cbSize=sizeof(menu); + menu.flags = CMIM_ALL; + + menu.hIcon=0; + menu.position = 500010000; + menu.pszPopupName = Translate("PopUps"); + + menu.pszService= MS_POPUP_SHOWHISTORY; + menu.pszName = Translate("Popup History"); + hMenuShowHistory = (HANDLE)CallService(MS_CLIST_ADDMAINMENUITEM, 0, (LPARAM)&menu); + + menu.pszService= "PopUp/ToggleEnabled"; + menu.pszName = (DBGetContactSettingByte(0, MODULE, "Enabled", 1) == 1 ? Translate("Disable Popups") : Translate("Enable Popups")); + hMenuToggleOnOff = (HANDLE)CallService(MS_CLIST_ADDMAINMENUITEM, 0, (LPARAM)&menu); + + hEventBuildMenu = HookEvent(ME_CLIST_PREBUILDCONTACTMENU, PrebuildMenu); + + if(ServiceExists(MS_LANGPACK_GETCODEPAGE)) + code_page = CallService(MS_LANGPACK_GETCODEPAGE, 0, 0); +} + +void DeinitServices() { + UnhookEvent(hEventBuildMenu); + + for(int i = 0; i < NUM_SERVICES; i++) + if(hService[i]) DestroyServiceFunction(hService[i]); +} |