From 3c50a9aa27d2138b757dd7822841c106f4c99b18 Mon Sep 17 00:00:00 2001 From: sje Date: Fri, 20 Jul 2007 17:26:51 +0000 Subject: convert to new popup api (see m_yapp.h in yapp/docs) git-svn-id: https://server.scottellis.com.au/svn/mim_plugs@297 4f64403b-2f21-0410-a795-97e2b3489a10 --- yapp/services.cpp | 294 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 177 insertions(+), 117 deletions(-) (limited to 'yapp/services.cpp') 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 #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]); } -- cgit v1.2.3