diff options
Diffstat (limited to 'yapp/services.cpp')
-rw-r--r-- | yapp/services.cpp | 294 |
1 files changed, 177 insertions, 117 deletions
diff --git a/yapp/services.cpp b/yapp/services.cpp index 573ae58..ad920cd 100644 --- a/yapp/services.cpp +++ b/yapp/services.cpp @@ -7,12 +7,12 @@ #include <time.h> #include "str_utils.h" -#define NUM_SERVICES 16 +#define NUM_SERVICES 20 HANDLE hService[NUM_SERVICES]; HANDLE hMenuShowHistory, hMenuToggleOnOff; void StripBBCodesInPlace(wchar_t *text) { - if(!DBGetContactSettingByte(0, MODULE, "StripBBCodes", 1)) + if(text == 0 || DBGetContactSettingByte(0, MODULE, "StripBBCodes", 1) == 0) return; int read = 0, write = 0; @@ -41,36 +41,37 @@ void StripBBCodesInPlace(wchar_t *text) { } } -int CreatePopupA(WPARAM wParam, LPARAM lParam) { - if(!DBGetContactSettingByte(0, MODULE, "Enabled", 1)) return 0; - +int OldCreatePopupA(WPARAM wParam, LPARAM lParam) { 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; + PopupData *pd_out = (PopupData *)malloc(sizeof(PopupData)); + ZeroMemory(pd_out, sizeof(PopupData)); + + pd_out->cbSize = sizeof(PopupData); + pd_out->flags = PDF_UNICODE; + pd_out->pwzTitle = a2w(pd_in->lpzContactName); + pd_out->pwzText = a2w(pd_in->lpzText); + StripBBCodesInPlace(pd_out->pwzTitle); + StripBBCodesInPlace(pd_out->pwzText); + + pd_out->hContact = pd_in->lchContact; + pd_out->hIcon = 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; + pd_out->windowProc = pd_in->PluginWindowProc; + pd_out->opaque = pd_in->PluginData; + pd_out->timeout = 0; - lstPopupHistory.Add(pd_out->lpwzContactName, pd_out->lpwzText, time(0)); + lstPopupHistory.Add(pd_out->pwzTitle, pd_out->pwzText, time(0)); if(!DBGetContactSettingByte(0, MODULE, "Enabled", 1)) { + free(pd_out->pwzTitle); + free(pd_out->pwzText); free(pd_out); - return 0; + return -1; } //MessageBox(0, pd_out->lpwzContactName, _T("CreatePopupA"), MB_OK); @@ -78,34 +79,36 @@ int CreatePopupA(WPARAM wParam, LPARAM lParam) { return 0; } -int CreatePopupExA(WPARAM wParam, LPARAM lParam) { +int OldCreatePopupExA(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; + PopupData *pd_out = (PopupData *)malloc(sizeof(PopupData)); + ZeroMemory(pd_out, sizeof(PopupData)); + pd_out->cbSize = sizeof(PopupData); + pd_out->flags = PDF_UNICODE; + pd_out->pwzTitle = a2w(pd_in->lpzContactName); + pd_out->pwzText = a2w(pd_in->lpzText); + StripBBCodesInPlace(pd_out->pwzTitle); + StripBBCodesInPlace(pd_out->pwzText); + + pd_out->hContact = pd_in->lchContact; + pd_out->hIcon = 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; + pd_out->windowProc = pd_in->PluginWindowProc; + pd_out->opaque= pd_in->PluginData; + pd_out->timeout = pd_in->iSeconds; - lstPopupHistory.Add(pd_out->lpwzContactName, pd_out->lpwzText, time(0)); + lstPopupHistory.Add(pd_out->pwzTitle, pd_out->pwzText, time(0)); if(!DBGetContactSettingByte(0, MODULE, "Enabled", 1)) { + free(pd_out->pwzTitle); + free(pd_out->pwzText); free(pd_out); - return 0; + return -1; } //MessageBox(0, pd_out->lpwzContactName, _T("CreatePopupExA"), MB_OK); @@ -113,16 +116,20 @@ int CreatePopupExA(WPARAM wParam, LPARAM lParam) { return 0; } -int CreatePopupW(WPARAM wParam, LPARAM lParam) { +int OldCreatePopupW(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); - + PopupData *pd_out = (PopupData *)malloc(sizeof(PopupData)); + ZeroMemory(pd_out, sizeof(PopupData)); + pd_out->cbSize = sizeof(PopupData); + pd_out->flags = PDF_UNICODE; + pd_out->pwzTitle = wcsdup(pd_in->lpwzContactName); + pd_out->pwzText = wcsdup(pd_in->lpwzText); + StripBBCodesInPlace(pd_out->pwzTitle); + StripBBCodesInPlace(pd_out->pwzText); + + pd_out->hContact = pd_in->lchContact; + pd_out->hIcon = pd_in->lchIcon; if(pd_in->colorBack == 0xffffffff) // that's the old #define for 'skinned bg' pd_out->colorBack = pd_out->colorText = 0; else { @@ -130,10 +137,12 @@ int CreatePopupW(WPARAM wParam, LPARAM lParam) { pd_out->colorText &= 0xFFFFFF; } - lstPopupHistory.Add(pd_out->lpwzContactName, pd_out->lpwzText, time(0)); + lstPopupHistory.Add(pd_out->pwzTitle, pd_out->pwzText, time(0)); if(!DBGetContactSettingByte(0, MODULE, "Enabled", 1)) { + free(pd_out->pwzTitle); + free(pd_out->pwzText); free(pd_out); - return 0; + return -1; } //MessageBox(0, pd_out->lpwzContactName, _T("CreatePopupW"), MB_OK); @@ -155,8 +164,7 @@ 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; + a2w(newText, buff, MAX_SECONDLINE); StripBBCodesInPlace(buff); if(IsWindow(hwndPop)) @@ -164,6 +172,34 @@ int ChangeTextA(WPARAM wParam, LPARAM lParam) { return 0; } +int ShowPopup(WPARAM wParam, LPARAM lParam) { + PopupData *pd_in = (PopupData *)wParam; + PopupData *pd_out = (PopupData *)malloc(sizeof(PopupData)); + *pd_out = *pd_in; + if(pd_in->flags & PDF_UNICODE) {
+ if(pd_in->pwzTitle) pd_out->pwzTitle = wcsdup(pd_in->pwzTitle);
+ if(pd_in->pwzText) pd_out->pwzText = wcsdup(pd_in->pwzText);
+ } else {
+ pd_out->flags |= PDF_UNICODE;
+ if(pd_in->pszTitle) pd_out->pwzTitle = a2w(pd_in->pszTitle);
+ if(pd_in->pszText) pd_out->pwzText = a2w(pd_in->pszText);
+ } + StripBBCodesInPlace(pd_out->pwzTitle); + StripBBCodesInPlace(pd_out->pwzText); + + lstPopupHistory.Add(pd_out->pwzTitle, pd_out->pwzText, time(0)); + if(!DBGetContactSettingByte(0, MODULE, "Enabled", 1)) { + if(pd_out->pwzTitle) free(pd_out->pwzTitle); + if(pd_out->pwzText) free(pd_out->pwzText); + free(pd_out); + return -1; + } + + //MessageBox(0, pd_out->lpwzContactName, _T("CreatePopupW"), MB_OK); + PostMPMessage(MUM_CREATEPOPUP, 0, (LPARAM)pd_out); + return 0; +} + int GetContact(WPARAM wParam, LPARAM lParam) { HWND hwndPop = (HWND)wParam; HANDLE hContact; @@ -172,7 +208,6 @@ int GetContact(WPARAM wParam, LPARAM lParam) { } 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); } @@ -180,24 +215,18 @@ int GetContact(WPARAM wParam, LPARAM lParam) { return (int)hContact; } -int GetPluginData(WPARAM wParam, LPARAM lParam) { +int GetOpaque(WPARAM wParam, LPARAM lParam) { HWND hwndPop = (HWND)wParam; void *data = 0; if(GetCurrentThreadId() == message_pump_thread_id) { - SendMessage(hwndPop, PUM_GETPLUGINDATA, (WPARAM)&data, 0); + SendMessage(hwndPop, PUM_GETOPAQUE, (WPARAM)&data, 0); } else { HANDLE hEvent = CreateEvent(0, 0, 0, 0); - PostMessage(hwndPop, PUM_GETPLUGINDATA, (WPARAM)&data, (LPARAM)hEvent); - //WaitForSingleObject(hEvent, INFINITE); + PostMessage(hwndPop, PUM_GETOPAQUE, (WPARAM)&data, (LPARAM)hEvent); MsgWaitForMultipleObjectsEx(1, &hEvent, INFINITE, 0, 0); CloseHandle(hEvent); } - if(lParam && !ignore_gpd_passed_addy) { - void **pData = (void **)lParam; - *pData = data; - } - return (int)data; } @@ -249,18 +278,22 @@ int TogglePopups(WPARAM wParam, LPARAM lParam) { return 0; } -int PopupChange(WPARAM wParam, LPARAM lParam) { +int PopupChangeA(WPARAM wParam, LPARAM lParam) { HWND hwndPop = (HWND)wParam; POPUPDATAEX *pd_in = (POPUPDATAEX *)lParam; if(IsWindow(hwndPop)) { - POPUPDATAW *pd_out = (POPUPDATAW *)malloc(sizeof(POPUPDATAW)); + PopupData *pd_out = (PopupData *)malloc(sizeof(PopupData)); + pd_out->cbSize = sizeof(PopupData); + pd_out->flags = PDF_UNICODE; - 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->pwzTitle = a2w(pd_in->lpzContactName); + pd_out->pwzText = a2w(pd_in->lpzText); + StripBBCodesInPlace(pd_out->pwzTitle); + StripBBCodesInPlace(pd_out->pwzText); - pd_out->lchContact = pd_in->lchContact; - pd_out->lchIcon = pd_in->lchIcon; + pd_out->hContact = pd_in->lchContact; + pd_out->hIcon = pd_in->lchIcon; if(pd_in->colorBack == 0xffffffff) // that's the old #define for 'skinned bg' pd_out->colorBack = pd_out->colorText = 0; else { @@ -269,11 +302,46 @@ int PopupChange(WPARAM wParam, LPARAM lParam) { } 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; + pd_out->windowProc = pd_in->PluginWindowProc; + pd_out->opaque = pd_in->PluginData; + pd_out->timeout = pd_in->iSeconds; - lstPopupHistory.Add(pd_out->lpwzContactName, pd_out->lpwzText, time(0)); + lstPopupHistory.Add(pd_out->pwzTitle, pd_out->pwzText, time(0)); + + PostMessage(hwndPop, PUM_CHANGE, 0, (LPARAM)pd_out); + } + return 0; +} + +int PopupChangeW(WPARAM wParam, LPARAM lParam) { + HWND hwndPop = (HWND)wParam; + POPUPDATAW *pd_in = (POPUPDATAW *)lParam; + + if(IsWindow(hwndPop)) { + PopupData *pd_out = (PopupData *)malloc(sizeof(PopupData)); + pd_out->cbSize = sizeof(PopupData); + pd_out->flags = PDF_UNICODE; + + pd_out->pwzTitle = wcsdup(pd_in->lpwzContactName); + pd_out->pwzText = wcsdup(pd_in->lpwzText); + StripBBCodesInPlace(pd_out->pwzTitle); + StripBBCodesInPlace(pd_out->pwzText); + + pd_out->hContact = pd_in->lchContact; + pd_out->hIcon = 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->windowProc = pd_in->PluginWindowProc; + pd_out->opaque = pd_in->PluginData; + pd_out->timeout = pd_in->iSeconds; + + lstPopupHistory.Add(pd_out->pwzTitle, pd_out->pwzText, time(0)); PostMessage(hwndPop, PUM_CHANGE, 0, (LPARAM)pd_out); } @@ -320,10 +388,10 @@ int PopUp_ShowHistory(WPARAM wParam, LPARAM lParam) } int num_classes = 0; -POPUPCLASS *classes = 0; +PopupClass *classes = 0; int RegisterPopupClass(WPARAM wParam, LPARAM lParam) {
- POPUPCLASS *pc = (POPUPCLASS *)lParam;
+ PopupClass *pc = (PopupClass *)lParam;
pc->pszName = strdup(pc->pszName);
if(pc->flags & PCF_UNICODE)
pc->pwszDescription = wcsdup(pc->pwszDescription);
@@ -332,25 +400,25 @@ int RegisterPopupClass(WPARAM wParam, LPARAM lParam) { char setting[256];
mir_snprintf(setting, 256, "%s/Timeout", pc->pszName);
- pc->iSeconds = DBGetContactSettingWord(0, MODULE, setting, pc->iSeconds);
- if(pc->iSeconds == (WORD)-1) pc->iSeconds = -1;
+ pc->timeout = DBGetContactSettingWord(0, MODULE, setting, pc->timeout);
+ if(pc->timeout == (WORD)-1) pc->timeout = -1;
mir_snprintf(setting, 256, "%s/TextCol", pc->pszName);
pc->colorText = (COLORREF)DBGetContactSettingDword(0, MODULE, setting, (DWORD)pc->colorText);
mir_snprintf(setting, 256, "%s/BgCol", pc->pszName);
pc->colorBack = (COLORREF)DBGetContactSettingDword(0, MODULE, setting, (DWORD)pc->colorBack);
- classes = (POPUPCLASS *)realloc(classes, sizeof(POPUPCLASS) * (num_classes + 1));
- memcpy(classes + num_classes, pc, sizeof(POPUPCLASS));
+ classes = (PopupClass *)realloc(classes, sizeof(PopupClass) * (num_classes + 1));
+ memcpy(classes + num_classes, pc, sizeof(PopupClass));
num_classes++;
return 0;
}
int CreateClassPopup(WPARAM wParam, LPARAM lParam) {
- POPUPDATACLASS *pdc = (POPUPDATACLASS *)lParam;
- if(pdc->cbSize != sizeof(POPUPDATACLASS)) return 1;
+ PopupClassInstance *pdc = (PopupClassInstance *)lParam;
+ if(pdc->cbSize != sizeof(PopupClassInstance)) return 1;
- POPUPCLASS *pc = 0;
- if(wParam) pc = (POPUPCLASS *)wParam;
+ PopupClass *pc = 0;
+ if(wParam) pc = (PopupClass *)wParam;
else {
for(int i = 0; i < num_classes; i++) {
if(strcmp(classes[i].pszName, pdc->pszClassName) == 0) {
@@ -360,35 +428,20 @@ int CreateClassPopup(WPARAM wParam, LPARAM lParam) { }
}
if(pc) {
- if(pc->flags & PCF_UNICODE) {
- POPUPDATAW pdw = {0};
- pdw.colorBack = pc->colorBack;
- pdw.colorText = pc->colorText;
- pdw.lchIcon = pc->hIcon;
- pdw.iSeconds = pc->iSeconds;
- pdw.PluginWindowProc = pc->PluginWindowProc;
-
- pdw.lchContact = pdc->hContact;
- pdw.PluginData = pdc->PluginData;
- wcsncpy(pdw.lpwzContactName, pdc->pwszTitle, MAX_CONTACTNAME);
- wcsncpy(pdw.lpwzText, pdc->pwszText, MAX_SECONDLINE);
- - CallService(MS_POPUP_ADDPOPUPW, (WPARAM)&pdw, 0); - } else {
- POPUPDATAEX pd = {0};
- pd.colorBack = pc->colorBack;
- pd.colorText = pc->colorText;
- pd.lchIcon = pc->hIcon;
- pd.iSeconds = pc->iSeconds;
- pd.PluginWindowProc = pc->PluginWindowProc;
+ PopupData pd = {sizeof(PopupData)};
+ if(pc->flags & PCF_UNICODE) pd.flags |= PDF_UNICODE;
+ pd.colorBack = pc->colorBack;
+ pd.colorText = pc->colorText;
+ pd.hIcon = pc->hIcon;
+ pd.timeout = pc->timeout;
+ pd.windowProc = pc->windowProc;
- pd.lchContact = pdc->hContact;
- pd.PluginData = pdc->PluginData;
- strncpy(pd.lpzContactName, pdc->pszTitle, MAX_CONTACTNAME);
- strncpy(pd.lpzText, pdc->pszText, MAX_SECONDLINE);
- - CallService(MS_POPUP_ADDPOPUP, (WPARAM)&pd, 0); - }
+ pd.hContact = pdc->hContact;
+ pd.opaque = pdc->opaque;
+ pd.pszTitle = (char *)pdc->pszTitle;
+ pd.pszText = (char *)pdc->pszText;
+ + CallService(MS_YAPP_SHOWPOPUP, (WPARAM)&pd, 0); }
return 0;
} @@ -401,14 +454,22 @@ 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_YAPP_SHOWPOPUP, ShowPopup); + hService[i++] = CreateServiceFunction(MS_YAPP_REGISTERCLASS, RegisterPopupClass); + hService[i++] = CreateServiceFunction(MS_YAPP_CLASSINSTANCE, CreateClassPopup); + hService[i++] = CreateServiceFunction(MS_YAPP_GETCONTACT, GetContact); + hService[i++] = CreateServiceFunction(MS_YAPP_GETOPAQUE, GetOpaque); + + // legacy support + hService[i++] = CreateServiceFunction(MS_POPUP_ADDPOPUP, OldCreatePopupA); + hService[i++] = CreateServiceFunction(MS_POPUP_ADDPOPUPEX, OldCreatePopupExA); + hService[i++] = CreateServiceFunction(MS_POPUP_ADDPOPUPW, OldCreatePopupW); 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_CHANGE, PopupChangeA); + hService[i++] = CreateServiceFunction(MS_POPUP_CHANGEW, PopupChangeW); hService[i++] = CreateServiceFunction(MS_POPUP_GETCONTACT, GetContact); - hService[i++] = CreateServiceFunction(MS_POPUP_GETPLUGINDATA, GetPluginData); + hService[i++] = CreateServiceFunction(MS_POPUP_GETPLUGINDATA, GetOpaque); hService[i++] = CreateServiceFunction(MS_POPUP_ISSECONDLINESHOWN, IsSecondLineShown); hService[i++] = CreateServiceFunction(MS_POPUP_QUERY, PopupQuery); @@ -418,8 +479,6 @@ void InitServices() { hService[i++] = CreateServiceFunction(MS_POPUP_SHOWHISTORY, PopUp_ShowHistory); hService[i++] = CreateServiceFunction("PopUp/ToggleEnabled", TogglePopups); - hService[i++] = CreateServiceFunction(MS_POPUP_REGISTERCLASS, RegisterPopupClass); - hService[i++] = CreateServiceFunction(MS_POPUP_ADDPOPUPCLASS, CreateClassPopup); CLISTMENUITEM menu = {0}; @@ -448,7 +507,8 @@ void InitServices() { } void DeinitServices() { - for(int i = 0; i < num_classes; i++) { + int i; + for(i = 0; i < num_classes; i++) { free(classes[i].pszName); free(classes[i].pszDescription); } @@ -456,6 +516,6 @@ void DeinitServices() { UnhookEvent(hEventBuildMenu); - for(int i = 0; i < NUM_SERVICES; i++) + for(i = 0; i < NUM_SERVICES; i++) if(hService[i]) DestroyServiceFunction(hService[i]); } |