From 8d127430d057891fbd3ac5989d32090715d7923a Mon Sep 17 00:00:00 2001 From: George Hazan Date: Fri, 16 Feb 2018 22:07:43 +0200 Subject: fixes #1143 (CmdLine Plugin error when using Diacritics in message) --- plugins/CmdLine/src/mimcmd_handlers.cpp | 778 ++++++++++++++------------------ 1 file changed, 344 insertions(+), 434 deletions(-) (limited to 'plugins/CmdLine/src/mimcmd_handlers.cpp') diff --git a/plugins/CmdLine/src/mimcmd_handlers.cpp b/plugins/CmdLine/src/mimcmd_handlers.cpp index 039b4c76bc..10caca7621 100644 --- a/plugins/CmdLine/src/mimcmd_handlers.cpp +++ b/plugins/CmdLine/src/mimcmd_handlers.cpp @@ -38,46 +38,43 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define VALUE_STRING 4 #define VALUE_WIDE 5 -__inline static int matches(char *command, char *lower) +__inline static int matches(const wchar_t *command, const wchar_t *lower) { - return ((mir_strcmp(lower, command) == 0) || (mir_strcmp(lower, Translate(command)) == 0)); + return ((mir_wstrcmp(lower, command) == 0) || (mir_wstrcmp(lower, TranslateW(command)) == 0)); } -int Get2StateValue(char *state) +int Get2StateValue(wchar_t *state) { - char lower[512]; - strncpy_s(lower, state, sizeof(lower)); - _strlwr(lower); + wchar_t lower[512]; + wcsncpy_s(lower, state, _countof(lower)); + _wcslwr(lower); //if ((mir_strcmp(lower, "enable") == 0) || (mir_strcmp(lower, "show") == 0) || (mir_strcmp(lower, "on") == 0)) - if ((matches("enable", lower)) || (matches("show", lower)) || (matches("on", lower))) { + if ((matches(L"enable", lower)) || (matches(L"show", lower)) || (matches(L"on", lower))) return STATE_ON; - } //if ((mir_strcmp(lower, "disable") == 0) || (mir_strcmp(lower, "hide") == 0) || (mir_strcmp(lower, "off") == 0)) - if ((matches("disable", lower)) || (matches("hide", lower)) || (matches("off", lower))) { + if ((matches(L"disable", lower)) || (matches(L"hide", lower)) || (matches(L"off", lower))) return STATE_OFF; - } //if (mir_strcmp(lower, "toggle") == 0) - if (matches("toggle", lower)) { + if (matches(L"toggle", lower)) return STATE_TOGGLE; - } return STATE_UNKNOWN; } -int AccountName2Protocol(const char *accountName, OUT char *uniqueProtocolName, size_t length) +int AccountName2Protocol(const wchar_t *accountName, OUT char *uniqueProtocolName, size_t length) { int count; PROTOACCOUNT **accounts = nullptr; Proto_EnumAccounts(&count, &accounts); - strncpy_s(uniqueProtocolName, length, accountName, _TRUNCATE); + strncpy_s(uniqueProtocolName, length, _T2A(accountName), _TRUNCATE); for (int i = 0; i < count; i++) { if (accounts[i]->bIsEnabled) { - if (_stricmp(accountName, _T2A(accounts[i]->tszAccountName)) == 0) { + if (_wcsicmp(accountName, accounts[i]->tszAccountName) == 0) { strncpy_s(uniqueProtocolName, length, accounts[i]->szModuleName, _TRUNCATE); return 0; } @@ -90,37 +87,32 @@ int AccountName2Protocol(const char *accountName, OUT char *uniqueProtocolName, void HandleWrongParametersCount(PCommand command, PReply reply) { reply->code = MIMRES_WRONGPARAMSCOUNT; - mir_snprintf(reply->message, Translate("Wrong number of parameters for command '%s'."), command->command); + mir_snwprintf(reply->message, TranslateT("Wrong number of parameters for command '%s'."), command->command); } -void HandleUnknownParameter(PCommand command, char *param, PReply reply) +void HandleUnknownParameter(PCommand command, wchar_t *param, PReply reply) { reply->code = MIMRES_UNKNOWNPARAM; - mir_snprintf(reply->message, Translate("Unknown parameter '%s' for command '%s'."), param, command->command); + mir_snwprintf(reply->message, TranslateT("Unknown parameter '%s' for command '%s'."), param, command->command); } -int ParseValueParam(char *param, void *&result) +int ParseValueParam(wchar_t *param, void *&result) { - if (mir_strlen(param) > 0) { + if (mir_wstrlen(param) > 0) { switch (*param) { case 's': { - size_t len = mir_strlen(param); //- 1 + 1 - result = (char*)malloc(len * sizeof(char)); - strcpy((char*)result, param + 1); + size_t len = mir_wstrlen(param); //- 1 + 1 + result = malloc(len * sizeof(char)); + strcpy((char*)result, _T2A(param + 1)); return VALUE_STRING; } case 'w': { - size_t len = mir_strlen(param); + size_t len = mir_wstrlen(param); result = (WCHAR *)malloc(len * sizeof(WCHAR)); - char *buffer = (char*)malloc(len * sizeof(WCHAR)); - strncpy_s(buffer, len, param + 1, _TRUNCATE); - - MultiByteToWideChar(CP_ACP, 0, buffer, -1, (WCHAR *)result, (int)len); - - free(buffer); + wcsncpy_s((wchar_t*)result, len, param + 1, _TRUNCATE); return VALUE_WIDE; } @@ -128,8 +120,8 @@ int ParseValueParam(char *param, void *&result) { result = (char *)malloc(sizeof(char)); - char *stop; - long tmp = strtol(param + 1, &stop, 10); + wchar_t *stop; + long tmp = wcstol(param + 1, &stop, 10); *((char *)result) = tmp; return (*stop == 0) ? VALUE_BYTE : VALUE_ERROR; @@ -138,9 +130,9 @@ int ParseValueParam(char *param, void *&result) case 'i': { result = (int *)malloc(sizeof(int)); - char *stop; + wchar_t *stop; - long tmp = strtol(param + 1, &stop, 10); + long tmp = wcstol(param + 1, &stop, 10); *((int *)result) = tmp; return (*stop == 0) ? VALUE_WORD : VALUE_ERROR; @@ -149,11 +141,12 @@ int ParseValueParam(char *param, void *&result) case 'd': { result = (long *)malloc(sizeof(long)); - char *stop; - *((long *)result) = strtol(param + 1, &stop, 10); + wchar_t *stop; + *((long *)result) = wcstol(param + 1, &stop, 10); return (*stop == 0) ? VALUE_DWORD : VALUE_ERROR; } + default: return VALUE_UNKNOWN; } @@ -161,40 +154,39 @@ int ParseValueParam(char *param, void *&result) else return VALUE_ERROR; } -int ParseStatusParam(char *status) +int ParseStatusParam(const wchar_t *status) { - char *lower = NEWSTR_ALLOCA(status); - _strlwr(lower); + wchar_t *lower = NEWWSTR_ALLOCA(status); + CharLower(lower); - if (!mir_strcmp(lower, "offline")) + if (!mir_wstrcmp(lower, L"offline")) return ID_STATUS_OFFLINE; - else if (!mir_strcmp(lower, "online")) + if (!mir_wstrcmp(lower, L"online")) return ID_STATUS_ONLINE; - else if (!mir_strcmp(lower, "away")) + if (!mir_wstrcmp(lower, L"away")) return ID_STATUS_AWAY; - else if (!mir_strcmp(lower, "dnd")) + if (!mir_wstrcmp(lower, L"dnd")) return ID_STATUS_DND; - else if (!mir_strcmp(lower, "na")) + if (!mir_wstrcmp(lower, L"na")) return ID_STATUS_NA; - else if (!mir_strcmp(lower, "occupied")) + if (!mir_wstrcmp(lower, L"occupied")) return ID_STATUS_OCCUPIED; - else if (!mir_strcmp(lower, "freechat")) + if (!mir_wstrcmp(lower, L"freechat")) return ID_STATUS_FREECHAT; - else if (!mir_strcmp(lower, "invisible")) + if (!mir_wstrcmp(lower, L"invisible")) return ID_STATUS_INVISIBLE; - else if (!mir_strcmp(lower, "onthephone")) + if (!mir_wstrcmp(lower, L"onthephone")) return ID_STATUS_ONTHEPHONE; - else if (!mir_strcmp(lower, "outtolunch")) + if (!mir_wstrcmp(lower, L"outtolunch")) return ID_STATUS_OUTTOLUNCH; - else - return 0; + return 0; } -char *PrettyStatusMode(int status, char *buffer, int size) +wchar_t* PrettyStatusMode(int status, wchar_t *buffer, size_t size) { wchar_t *data = pcli->pfnGetStatusModeDescription(status, 0); if (data) - strncpy_s(buffer, size, _T2A(data), _TRUNCATE); + wcsncpy_s(buffer, size, data, _TRUNCATE); else *buffer = 0; @@ -207,102 +199,95 @@ void HandleStatusCommand(PCommand command, TArgument *argv, int argc, PReply rep case 2: { INT_PTR status = CallService(MS_CLIST_GETSTATUSMODE, 0, 0); - char pretty[128]; - PrettyStatusMode(status, pretty, sizeof(pretty)); + wchar_t pretty[128]; + PrettyStatusMode(status, pretty, _countof(pretty)); - CMStringA perAccountStatus; + CMStringW perAccountStatus; int count; PROTOACCOUNT **accounts = nullptr; Proto_EnumAccounts(&count, &accounts); - char pn[128]; + wchar_t pn[128]; for (int i = 0; i < count; i++) { if (accounts[i]->bIsEnabled) { status = CallProtoService(accounts[i]->szModuleName, PS_GETSTATUS, 0, 0); - PrettyStatusMode(status, pn, sizeof(pn)); + PrettyStatusMode(status, pn, _countof(pn)); perAccountStatus.AppendChar('\n'); - perAccountStatus.Append(_T2A(accounts[i]->tszAccountName)); - perAccountStatus.Append(": "); + perAccountStatus.Append(accounts[i]->tszAccountName); + perAccountStatus.Append(L": "); perAccountStatus.Append(pn); } } reply->code = MIMRES_SUCCESS; - mir_snprintf(reply->message, Translate("Current global status: %s.%s"), pretty, perAccountStatus.c_str()); - - return; + mir_snwprintf(reply->message, TranslateT("Current global status: %s.%s"), pretty, perAccountStatus.c_str()); } + return; case 3: { int status = ParseStatusParam(argv[2]); if (status) { INT_PTR old = CallService(MS_CLIST_GETSTATUSMODE, 0, 0); - char po[128]; + wchar_t po[128]; if (ServiceExists(MS_KS_ANNOUNCESTATUSCHANGE)) { announce_status_change(nullptr, status, nullptr); } - PrettyStatusMode(old, po, sizeof(po)); + PrettyStatusMode(old, po, _countof(po)); Clist_SetStatusMode(status); - char pn[128]; - PrettyStatusMode(status, pn, sizeof(pn)); + wchar_t pn[128]; + PrettyStatusMode(status, pn, _countof(pn)); reply->code = MIMRES_SUCCESS; - mir_snprintf(reply->message, Translate("Changed global status to '%s' (previous status was '%s')."), pn, po); - } - else { - HandleUnknownParameter(command, argv[2], reply); + mir_snwprintf(reply->message, TranslateT("Changed global status to '%s' (previous status was '%s')."), pn, po); } - - return; + else HandleUnknownParameter(command, argv[2], reply); } + return; case 4: { int status = ParseStatusParam(argv[2]); if (status) { char protocol[128]; - char *account = argv[3]; - AccountName2Protocol(account, protocol, sizeof(protocol)); + wchar_t *account = argv[3]; + AccountName2Protocol(account, protocol, _countof(protocol)); INT_PTR old = CallProtoService(protocol, PS_GETSTATUS, 0, 0); - char po[128]; + wchar_t po[128]; if (ServiceExists(MS_KS_ANNOUNCESTATUSCHANGE)) { announce_status_change(protocol, status, nullptr); } - PrettyStatusMode(old, po, sizeof(po)); + PrettyStatusMode(old, po, _countof(po)); INT_PTR res = CallProtoService(protocol, PS_SETSTATUS, status, 0); - char pn[128]; - PrettyStatusMode(status, pn, sizeof(pn)); + wchar_t pn[128]; + PrettyStatusMode(status, pn, _countof(pn)); switch (res) { case 0: reply->code = MIMRES_SUCCESS; - mir_snprintf(reply->message, Translate("Changed '%s' status to '%s' (previous status was '%s')."), account, pn, po); + mir_snwprintf(reply->message, TranslateT("Changed '%s' status to '%s' (previous status was '%s')."), account, pn, po); return; case CALLSERVICE_NOTFOUND: reply->code = MIMRES_FAILURE; - mir_snprintf(reply->message, Translate("'%s' doesn't seem to be a valid account."), account); + mir_snwprintf(reply->message, TranslateT("'%s' doesn't seem to be a valid account."), account); return; default: reply->code = MIMRES_FAILURE; - mir_snprintf(reply->message, Translate("Failed to change status for account '%s' to '%s'."), account, pn); + mir_snwprintf(reply->message, TranslateT("Failed to change status for account '%s' to '%s'."), account, pn); return; } } - else { - HandleUnknownParameter(command, argv[2], reply); - } - - return; + else HandleUnknownParameter(command, argv[2], reply); } + return; default: HandleWrongParametersCount(command, reply); @@ -314,58 +299,53 @@ void HandleAwayMsgCommand(PCommand command, TArgument *argv, int argc, PReply re switch (argc) { case 3: { - char *awayMsg = argv[2]; + wchar_t *awayMsg = argv[2]; int count = 0; PROTOACCOUNT **accounts = nullptr; Proto_EnumAccounts(&count, &accounts); - CMStringA szReply; - int i; - INT_PTR status; - INT_PTR res = 0; - char *protocol; - char pn[128]; - for (i = 0; i < count; i++) { + CMStringW szReply; + for (int i = 0; i < count; i++) { if (!accounts[i]->bIsEnabled) continue; if (i != 0) szReply.AppendChar('\n'); - protocol = accounts[i]->szModuleName; - if ((CallProtoService(protocol, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_MODEMSGSEND) != 0) //if the protocol supports away messages - { - status = CallProtoService(protocol, PS_GETSTATUS, 0, 0); - ptrW wszAwayMsg(mir_a2u(awayMsg)); - res = CallProtoService(protocol, PS_SETAWAYMSG, status, wszAwayMsg); - PrettyStatusMode(status, pn, sizeof(pn)); + char *protocol = accounts[i]->szModuleName; + if ((CallProtoService(protocol, PS_GETCAPS, PFLAGNUM_1, 0) & PF1_MODEMSGSEND) != 0) { //if the protocol supports away messages + INT_PTR status = CallProtoService(protocol, PS_GETSTATUS, 0, 0); + INT_PTR res = CallProtoService(protocol, PS_SETAWAYMSG, status, (LPARAM)awayMsg); + + wchar_t pn[128]; + PrettyStatusMode(status, pn, _countof(pn)); if (res) - szReply.AppendFormat(Translate("Failed to set '%S' status message to '%s' (status is '%s')."), accounts[i]->tszAccountName, awayMsg, pn); + szReply.AppendFormat(TranslateT("Failed to set '%s' status message to '%s' (status is '%s')."), accounts[i]->tszAccountName, awayMsg, pn); else - szReply.AppendFormat(Translate("Successfully set '%S' status message to '%s' (status is '%s')."), accounts[i]->tszAccountName, awayMsg, pn); + szReply.AppendFormat(TranslateT("Successfully set '%s' status message to '%s' (status is '%s')."), accounts[i]->tszAccountName, awayMsg, pn); } - else szReply.AppendFormat(Translate("Account '%S' does not support away messages, skipping."), accounts[i]->tszAccountName); + else szReply.AppendFormat(TranslateT("Account '%s' does not support away messages, skipping."), accounts[i]->tszAccountName); } - strncpy_s(reply->message, szReply, _TRUNCATE); + wcsncpy_s(reply->message, szReply, _TRUNCATE); reply->code = MIMRES_SUCCESS; return; } case 4: { - char *awayMsg = argv[2]; + wchar_t *awayMsg = argv[2]; char protocol[128]; - char *account = argv[3]; - AccountName2Protocol(account, protocol, sizeof(protocol)); + wchar_t *account = argv[3]; + AccountName2Protocol(account, protocol, _countof(protocol)); - char pn[128]; + wchar_t pn[128]; INT_PTR res = CallProtoService(protocol, PS_GETCAPS, PFLAGNUM_1, 0); if ((res & PF1_MODEMSGSEND) != 0) //if the protocol supports away messages { INT_PTR status = CallProtoService(protocol, PS_GETSTATUS, 0, 0); res = CallProtoService(protocol, PS_SETAWAYMSG, status, (LPARAM)awayMsg); - PrettyStatusMode(status, pn, sizeof(pn)); + PrettyStatusMode(status, pn, _countof(pn)); } else if (CallProtoService(protocol, PS_GETSTATUS, 0, 0) == CALLSERVICE_NOTFOUND) { res = CALLSERVICE_NOTFOUND; @@ -377,22 +357,22 @@ void HandleAwayMsgCommand(PCommand command, TArgument *argv, int argc, PReply re switch (res) { case 0: reply->code = MIMRES_SUCCESS; - mir_snprintf(reply->message, Translate("Changed '%s' status message to '%s' (status is '%s')."), account, awayMsg, pn); + mir_snwprintf(reply->message, TranslateT("Changed '%s' status message to '%s' (status is '%s')."), account, awayMsg, pn); return; case CALLSERVICE_NOTFOUND: reply->code = MIMRES_FAILURE; - mir_snprintf(reply->message, Translate("'%s' doesn't seem to be a valid account."), account); + mir_snwprintf(reply->message, TranslateT("'%s' doesn't seem to be a valid account."), account); return; case -2: reply->code = MIMRES_FAILURE; - mir_snprintf(reply->message, Translate("Account '%s' does not support away messages, skipping."), account); + mir_snwprintf(reply->message, TranslateT("Account '%s' does not support away messages, skipping."), account); return; default: reply->code = MIMRES_FAILURE; - mir_snprintf(reply->message, Translate("Failed to change status message for account '%s' to '%s' (status is '%s')."), account, awayMsg, pn); + mir_snwprintf(reply->message, TranslateT("Failed to change status message for account '%s' to '%s' (status is '%s')."), account, awayMsg, pn); return; } } @@ -402,26 +382,26 @@ void HandleAwayMsgCommand(PCommand command, TArgument *argv, int argc, PReply re } } -void Set2StateReply(PReply reply, int state, int failure, char *successTrue, char *failureTrue, char *successFalse, char *failureFalse) +void Set2StateReply(PReply reply, int state, int failure, wchar_t *successTrue, wchar_t *failureTrue, wchar_t *successFalse, wchar_t *failureFalse) { if (state) { if (failure) { reply->code = MIMRES_FAILURE; - mir_snprintf(reply->message, Translate(failureTrue)); + mir_snwprintf(reply->message, TranslateW(failureTrue)); } else { reply->code = MIMRES_SUCCESS; - mir_snprintf(reply->message, Translate(successTrue)); + mir_snwprintf(reply->message, TranslateW(successTrue)); } } else { if (failure) { reply->code = MIMRES_FAILURE; - mir_snprintf(reply->message, Translate(failureFalse)); + mir_snwprintf(reply->message, TranslateW(failureFalse)); } else { reply->code = MIMRES_SUCCESS; - mir_snprintf(reply->message, Translate(successFalse)); + mir_snwprintf(reply->message, TranslateW(successFalse)); } } } @@ -432,8 +412,7 @@ void HandlePopupsCommand(PCommand command, TArgument *argv, int argc, PReply rep case 2: { int state = CallService(MS_POPUP_QUERY, PUQS_GETSTATUS, 0); - Set2StateReply(reply, state, 0, LPGEN("Popups are currently enabled."), "", LPGEN("Popups are currently disabled."), ""); - + Set2StateReply(reply, state, 0, LPGENW("Popups are currently enabled."), L"", LPGENW("Popups are currently disabled."), L""); return; } @@ -464,8 +443,8 @@ void HandlePopupsCommand(PCommand command, TArgument *argv, int argc, PReply rep return; } - Set2StateReply(reply, state, failure, LPGEN("Popups were enabled successfully."), LPGEN("Popups could not be enabled."), - LPGEN("Popups were disabled successfully."), LPGEN("Popups could not be disabled.")); + Set2StateReply(reply, state, failure, LPGENW("Popups were enabled successfully."), LPGENW("Popups could not be enabled."), + LPGENW("Popups were disabled successfully."), LPGENW("Popups could not be disabled.")); return; } @@ -481,7 +460,7 @@ void HandleSoundsCommand(PCommand command, TArgument *argv, int argc, PReply rep case 2: { int state = db_get_b(NULL, "Skin", "UseSound", 1); - Set2StateReply(reply, state, 0, LPGEN("Sounds are currently enabled."), "", LPGEN("Sounds are currently disabled."), ""); + Set2StateReply(reply, state, 0, LPGENW("Sounds are currently enabled."), L"", LPGENW("Sounds are currently disabled."), L""); return; } @@ -511,7 +490,7 @@ void HandleSoundsCommand(PCommand command, TArgument *argv, int argc, PReply rep return; } - Set2StateReply(reply, state, 0, LPGEN("Sounds were enabled successfully."), "", LPGEN("Sounds were disabled successfully."), ""); + Set2StateReply(reply, state, 0, LPGENW("Sounds were enabled successfully."), L"", LPGENW("Sounds were disabled successfully."), L""); return; } @@ -527,7 +506,7 @@ void HandleClistCommand(PCommand command, TArgument *argv, int argc, PReply repl case 2: { int state = IsWindowVisible(pcli->hwndContactList); - Set2StateReply(reply, state, 0, LPGEN("Contact list is currently shown."), "", LPGEN("Contact list is currently hidden."), ""); + Set2StateReply(reply, state, 0, LPGENW("Contact list is currently shown."), L"", LPGENW("Contact list is currently hidden."), L""); return; } @@ -535,45 +514,29 @@ void HandleClistCommand(PCommand command, TArgument *argv, int argc, PReply repl case 3: { int state = 0; - HWND hClist = pcli->hwndContactList; switch (Get2StateValue(argv[2])) { case STATE_ON: - { - ShowWindow(hClist, SW_SHOW); - - state = TRUE; - - break; - } + ShowWindow(pcli->hwndContactList, SW_SHOW); + state = TRUE; + break; case STATE_OFF: - { - ShowWindow(hClist, SW_HIDE); - state = FALSE; - - break; - } + ShowWindow(pcli->hwndContactList, SW_HIDE); + state = FALSE; + break; case STATE_TOGGLE: - { - state = IsWindowVisible(hClist); - - state = 1 - state; - ShowWindow(hClist, (state) ? SW_SHOW : SW_HIDE); - - break; - } + state = !IsWindowVisible(pcli->hwndContactList); + ShowWindow(pcli->hwndContactList, (state) ? SW_SHOW : SW_HIDE); + break; default: HandleUnknownParameter(command, argv[2], reply); return; } - - Set2StateReply(reply, state, 0, LPGEN("Contact list was shown successfully."), "", - LPGEN("Contact list was hidden successfully."), ""); - + Set2StateReply(reply, state, 0, LPGENW("Contact list was shown successfully."), L"", LPGENW("Contact list was hidden successfully."), L""); return; } @@ -589,30 +552,28 @@ void HandleQuitCommand(PCommand command, TArgument *argv, int argc, PReply reply { CallService("CloseAction", 0, 0); - //try another quit method - HWND hWndMiranda = pcli->hwndContactList; - PostMessage(hWndMiranda, WM_COMMAND, ID_ICQ_EXIT, 0); + // try another quit method + PostMessage(pcli->hwndContactList, WM_COMMAND, ID_ICQ_EXIT, 0); reply->code = MIMRES_SUCCESS; - mir_snprintf(reply->message, Translate("Issued a quit command.")); + mir_snwprintf(reply->message, TranslateT("Issued a quit command.")); break; } case 3: { - char lower[128]; - strncpy_s(lower, argv[2], sizeof(lower)); - _strlwr(lower); + wchar_t lower[128]; + wcsncpy_s(lower, argv[2], _countof(lower)); + _wcslwr(lower); - if (mir_strcmp(lower, "wait") == 0) { + if (mir_wstrcmp(lower, L"wait") == 0) { CallService("CloseAction", 0, 0); //try another quit method - HWND hWndMiranda = pcli->hwndContactList; - PostMessage(hWndMiranda, WM_COMMAND, ID_ICQ_EXIT, 0); + PostMessage(pcli->hwndContactList, WM_COMMAND, ID_ICQ_EXIT, 0); reply->code = MIMRES_SUCCESS; - mir_snprintf(reply->message, Translate("Issued a quit and wait command.")); + mir_snwprintf(reply->message, TranslateT("Issued a quit and wait command.")); SetEvent(heServerBufferFull); @@ -622,9 +583,7 @@ void HandleQuitCommand(PCommand command, TArgument *argv, int argc, PReply reply Sleep(250); //wait for Miranda to quit. } } - else { - HandleUnknownParameter(command, argv[2], reply); - } + else HandleUnknownParameter(command, argv[2], reply); break; } @@ -639,23 +598,21 @@ void HandleExchangeCommand(PCommand command, TArgument *argv, int argc, PReply r switch (argc) { case 3: { - char lower[128]; - strncpy_s(lower, argv[2], sizeof(lower)); - _strlwr(lower); - if (mir_strcmp(lower, "check") == 0) { + wchar_t lower[128]; + wcsncpy_s(lower, argv[2], _countof(lower)); + _wcslwr(lower); + if (mir_wstrcmp(lower, L"check") == 0) { INT_PTR ret = CallService(MS_EXCHANGE_CHECKEMAIL, 0, 0); if (ret != CALLSERVICE_NOTFOUND) { reply->code = MIMRES_SUCCESS; - mir_snprintf(reply->message, Translate("Issued check email command to Exchange plugin.")); + mir_snwprintf(reply->message, TranslateT("Issued check email command to Exchange plugin.")); } else { reply->code = MIMRES_FAILURE; - mir_snprintf(reply->message, Translate("Exchange plugin is not running.")); + mir_snwprintf(reply->message, TranslateT("Exchange plugin is not running.")); } } - else { - HandleUnknownParameter(command, argv[2], reply); - } + else HandleUnknownParameter(command, argv[2], reply); return; } @@ -670,19 +627,19 @@ void HandleYAMNCommand(PCommand command, TArgument *argv, int argc, PReply reply switch (argc) { case 3: { - char lower[128]; - strncpy_s(lower, argv[2], sizeof(lower)); - _strlwr(lower); - if (mir_strcmp(lower, "check") == 0) { + wchar_t lower[128]; + wcsncpy_s(lower, argv[2], _countof(lower)); + _wcslwr(lower); + if (mir_wstrcmp(lower, L"check") == 0) { if (ServiceExists(MS_YAMN_FORCECHECK)) { CallService(MS_YAMN_FORCECHECK, 0, 0); reply->code = MIMRES_SUCCESS; - mir_snprintf(reply->message, Translate("Issued check email command to YAMN plugin.")); + mir_snwprintf(reply->message, TranslateT("Issued check email command to YAMN plugin.")); } else { reply->code = MIMRES_FAILURE; - mir_snprintf(reply->message, Translate("YAMN plugin is not running.")); + mir_snwprintf(reply->message, TranslateT("YAMN plugin is not running.")); } } else { @@ -702,22 +659,22 @@ void HandleCallServiceCommand(PCommand command, TArgument *argv, int argc, PRepl switch (argc) { case 5: { - char *service = argv[2]; - if (ServiceExists(service)) { + wchar_t *service = argv[2]; + if (ServiceExists(_T2A(service))) { void *wParam = nullptr; void *lParam = nullptr; INT_PTR res1 = ParseValueParam(argv[3], wParam); INT_PTR res2 = ParseValueParam(argv[4], lParam); if ((res1 != 0) && (res2 != 0)) { - //very dangerous but the user asked - INT_PTR res = CallService(service, ((res1 == 1) ? *((long *)wParam) : (WPARAM)wParam), (LPARAM)((res2 == 1) ? *((long *)lParam) : (LPARAM)lParam)); + // very dangerous but the user asked + INT_PTR res = CallService(_T2A(service), ((res1 == 1) ? *((long *)wParam) : (WPARAM)wParam), (LPARAM)((res2 == 1) ? *((long *)lParam) : (LPARAM)lParam)); reply->code = MIMRES_SUCCESS; - mir_snprintf(reply->message, Translate("CallService call successful: service '%s' returned %p."), service, res); + mir_snwprintf(reply->message, TranslateT("CallService call successful: service '%s' returned %p."), service, res); } else { reply->code = MIMRES_FAILURE; - mir_snprintf(reply->message, Translate("Invalid parameter '%s' passed to CallService command."), (wParam) ? argv[4] : argv[3]); + mir_snwprintf(reply->message, TranslateT("Invalid parameter '%s' passed to CallService command."), (wParam) ? argv[4] : argv[3]); } free(wParam); @@ -726,7 +683,7 @@ void HandleCallServiceCommand(PCommand command, TArgument *argv, int argc, PRepl } else { reply->code = MIMRES_FAILURE; - mir_snprintf(reply->message, Translate("Service '%s' does not exist."), service); + mir_snwprintf(reply->message, TranslateT("Service '%s' does not exist."), service); } break; @@ -737,12 +694,12 @@ void HandleCallServiceCommand(PCommand command, TArgument *argv, int argc, PRepl } } -void ParseMessage(char buffer[512], const char *message) +void ParseMessage(wchar_t buffer[512], const wchar_t *message) { unsigned int j = 0; - for (unsigned int i = 0; i < mir_strlen(message); ++i) { - char c = message[i]; - if (c == '\\' && i < (mir_strlen(message) - 1) && message[i + 1] == 'n') { + for (unsigned int i = 0; i < mir_wstrlen(message); ++i) { + wchar_t c = message[i]; + if (c == '\\' && i < (mir_wstrlen(message) - 1) && message[i + 1] == 'n') { c = '\n'; i++; } @@ -751,33 +708,33 @@ void ParseMessage(char buffer[512], const char *message) buffer[j] = '\0'; } -MCONTACT ParseContactParam(char *contact) +MCONTACT ParseContactParam(wchar_t *contact) { - char name[512]; - char account[128]; + wchar_t name[512]; + wchar_t account[128]; char protocol[128]; - char *p = strrchr(contact, ':'); + wchar_t *p = wcsrchr(contact, ':'); if (p == nullptr) - return GetContactFromID(contact, (char*)nullptr); + return GetContactFromID(contact, nullptr); *p = 0; - strncpy_s(name, contact, _TRUNCATE); - strncpy_s(account, p + 1, _TRUNCATE); + wcsncpy_s(name, contact, _TRUNCATE); + wcsncpy_s(account, p + 1, _TRUNCATE); *p = ':'; - AccountName2Protocol(account, protocol, sizeof(protocol)); + AccountName2Protocol(account, protocol, _countof(protocol)); return GetContactFromID(name, protocol); } void HandleMessageCommand(PCommand command, TArgument *argv, int argc, PReply reply) { if (argc >= 4) { - char message[512]; + wchar_t message[512]; ParseMessage(message, argv[argc - 1]); //get the message - CMStringA szReply; + CMStringW szReply; ACKDATA *ack = nullptr; for (int i = 2; i < argc - 1; i++) { - char *contact = argv[i]; + wchar_t *contact = argv[i]; MCONTACT hContact = ParseContactParam(contact); if (i != 3) @@ -785,7 +742,7 @@ void HandleMessageCommand(PCommand command, TArgument *argv, int argc, PReply re if (hContact) { bShouldProcessAcks = TRUE; - HANDLE hProcess = (HANDLE)ProtoChainSend(hContact, PSS_MESSAGE, 0, (LPARAM)message); + HANDLE hProcess = (HANDLE)ProtoChainSend(hContact, PSS_MESSAGE, 0, ptrA(Utf8EncodeW(message))); const int MAX_COUNT = 60; int counter = 0; while (((ack = GetAck(hProcess)) == nullptr) && (counter < MAX_COUNT)) { @@ -797,7 +754,7 @@ void HandleMessageCommand(PCommand command, TArgument *argv, int argc, PReply re if (counter < MAX_COUNT) { if (ack->result == ACKRESULT_SUCCESS) { if (ack->szModule) { - szReply.AppendFormat(Translate("Message sent to '%s'."), contact); + szReply.AppendFormat(TranslateT("Message sent to '%s'."), contact); DBEVENTINFO e = {}; char module[128]; @@ -807,21 +764,21 @@ void HandleMessageCommand(PCommand command, TArgument *argv, int argc, PReply re e.pBlob = (PBYTE)message; e.cbBlob = (DWORD)mir_strlen((char *)message) + 1; - strncpy_s(module, ack->szModule, sizeof(module)); + strncpy_s(module, ack->szModule, _countof(module)); e.szModule = module; e.timestamp = (DWORD)time(nullptr); db_event_add(ack->hContact, &e); } - else szReply.AppendFormat(Translate("Message to '%s' was marked as sent but the account seems to be offline"), contact); + else szReply.AppendFormat(TranslateT("Message to '%s' was marked as sent but the account seems to be offline"), contact); } - else szReply.AppendFormat(Translate("Could not send message to '%s'."), contact); + else szReply.AppendFormat(TranslateT("Could not send message to '%s'."), contact); } - else szReply.AppendFormat(Translate("Timed out while waiting for acknowledgment for contact '%s'."), contact); + else szReply.AppendFormat(TranslateT("Timed out while waiting for acknowledgment for contact '%s'."), contact); } - else szReply.AppendFormat(Translate("Could not find contact handle for contact '%s'."), contact); + else szReply.AppendFormat(TranslateT("Could not find contact handle for contact '%s'."), contact); } - strncpy_s(reply->message, szReply, _TRUNCATE); + wcsncpy_s(reply->message, szReply, _TRUNCATE); } else HandleWrongParametersCount(command, reply); } @@ -846,7 +803,6 @@ bool ParseDatabaseData(DBVARIANT *var, char *buffer, int size, int free) if (free) { mir_free(var->pszVal); } - return true; case DBVT_WCHAR: @@ -878,30 +834,26 @@ bool ParseDatabaseData(DBVARIANT *var, char *buffer, int size, int free) void HandleDatabaseCommand(PCommand command, TArgument *argv, int argc, PReply reply) { - if (argc >= 3) //we have something to parse - { - char dbcmd[128]; - strncpy_s(dbcmd, argv[2], sizeof(dbcmd)); - dbcmd[sizeof(dbcmd) - 1] = 0; - _strlwr(dbcmd); - if (mir_strcmp(dbcmd, "delete") == 0) { + if (argc >= 3) { // we have something to parse + wchar_t dbcmd[128]; + wcsncpy_s(dbcmd, argv[2], _TRUNCATE); + _wcslwr(dbcmd); + if (mir_wstrcmp(dbcmd, L"delete") == 0) { if (argc == 5) { - char *module = argv[3]; - char *key = argv[4]; + wchar_t *module = argv[3]; + wchar_t *key = argv[4]; - db_unset(NULL, module, key); + db_unset(NULL, _T2A(module), _T2A(key)); reply->code = MIMRES_SUCCESS; - mir_snprintf(reply->message, Translate("Setting '%s/%s' deleted."), module, key); - } - else { - HandleWrongParametersCount(command, reply); + mir_snwprintf(reply->message, TranslateT("Setting '%s/%s' deleted."), module, key); } + else HandleWrongParametersCount(command, reply); } - else if (mir_strcmp(dbcmd, "set") == 0) { + else if (mir_wstrcmp(dbcmd, L"set") == 0) { if (argc == 6) { - char *module = argv[3]; - char *key = argv[4]; + ptrA module(mir_u2a(argv[3])); + ptrA key(mir_u2a(argv[4])); void *value = nullptr; char *wrote = nullptr; @@ -940,18 +892,16 @@ void HandleDatabaseCommand(PCommand command, TArgument *argv, int argc, PReply r } reply->code = MIMRES_SUCCESS; - mir_snprintf(reply->message, Translate("Wrote '%s:%s' to database entry '%s/%s'."), wrote, argv[5] + 1, module, key); + mir_snwprintf(reply->message, TranslateT("Wrote '%S:%s' to database entry '%S/%S'."), wrote, argv[5] + 1, module, key); free(value); } - else { - HandleWrongParametersCount(command, reply); - } + else HandleWrongParametersCount(command, reply); } - else if (mir_strcmp(dbcmd, "get") == 0) { + else if (mir_wstrcmp(dbcmd, L"get") == 0) { if (argc == 5) { - char *module = argv[3]; - char *key = argv[4]; + ptrA module(mir_u2a(argv[3])); + ptrA key(mir_u2a(argv[4])); DBVARIANT var = { 0 }; @@ -959,58 +909,51 @@ void HandleDatabaseCommand(PCommand command, TArgument *argv, int argc, PReply r if (!res) { char buffer[1024]; - if (ParseDatabaseData(&var, buffer, sizeof(buffer), TRUE)) { + if (ParseDatabaseData(&var, buffer, _countof(buffer), TRUE)) { reply->code = MIMRES_SUCCESS; - mir_snprintf(reply->message, "'%s/%s' - %s.", module, key, buffer); + mir_snwprintf(reply->message, L"'%S/%S' - %S.", module, key, buffer); } else { reply->code = MIMRES_FAILURE; - mir_snprintf(reply->message, Translate("Could not retrieve setting '%s/%s': %s."), module, key, buffer); + mir_snwprintf(reply->message, TranslateT("Could not retrieve setting '%S/%S': %S."), module, key, buffer); } } else { reply->code = MIMRES_FAILURE; - mir_snprintf(reply->message, Translate("Setting '%s/%s' was not found."), module, key); + mir_snwprintf(reply->message, TranslateT("Setting '%S/%S' was not found."), module, key); } } - else { - HandleWrongParametersCount(command, reply); - } - } - else { - HandleUnknownParameter(command, dbcmd, reply); + else HandleWrongParametersCount(command, reply); } + else HandleUnknownParameter(command, dbcmd, reply); } - else { - HandleWrongParametersCount(command, reply); - } + else HandleWrongParametersCount(command, reply); } -int ParseProxyType(char *type) +int ParseProxyType(wchar_t *type) { - char lower[128]; - strncpy_s(lower, type, sizeof(lower)); - lower[sizeof(lower) - 1] = 0; - _strlwr(lower); + wchar_t lower[128]; + wcsncpy_s(lower, type, _countof(lower)); + lower[_countof(lower) - 1] = 0; + _wcslwr(lower); - if (mir_strcmp(lower, "socks4") == 0) { + if (mir_wstrcmp(lower, L"socks4") == 0) return PROXY_SOCKS4; - } - else if (mir_strcmp(lower, "socks5") == 0) { + + if (mir_wstrcmp(lower, L"socks5") == 0) return PROXY_SOCKS5; - } - else if (mir_strcmp(lower, "http") == 0) { + + if (mir_wstrcmp(lower, L"http") == 0) return PROXY_HTTP; - } - else if (mir_strcmp(lower, "https") == 0) { + + if (mir_wstrcmp(lower, L"https") == 0) return PROXY_HTTPS; - } - else - return 0; + + return 0; } -char *PrettyProxyType(int type, char *buffer, int size) +char* PrettyProxyType(int type, char *buffer, int size) { char *pretty = ""; switch (type) { @@ -1035,55 +978,46 @@ char *PrettyProxyType(int type, char *buffer, int size) } strncpy_s(buffer, size, pretty, _TRUNCATE); - return buffer; } void HandleProtocolProxyCommand(PCommand command, TArgument *argv, int argc, PReply reply, char *module, char *protocol) { - char proxycmd[128]; - strncpy_s(proxycmd, argv[3], sizeof(proxycmd)); - proxycmd[sizeof(proxycmd) - 1] = 0; - _strlwr(proxycmd); - - char buffer[1024]; + wchar_t proxycmd[128]; + wcsncpy_s(proxycmd, argv[3], _countof(proxycmd)); + proxycmd[_countof(proxycmd) - 1] = 0; + _wcslwr(proxycmd); + wchar_t buffer[1024]; - if (mir_strcmp(proxycmd, "status") == 0) {//status command + if (mir_wstrcmp(proxycmd, L"status") == 0) {//status command switch (argc) { case 4: { int value = db_get_b(NULL, module, "NLUseProxy", 0); reply->code = MIMRES_SUCCESS; - mir_snprintf(buffer, "%s proxy status is %s", protocol, (value) ? "enabled" : "disabled"); - - break; + mir_snwprintf(buffer, L"%S proxy status is %s", protocol, (value) ? L"enabled" : L"disabled"); } + break; case 5: { int state = Get2StateValue(argv[4]); switch (state) { case STATE_OFF: - { - db_set_b(NULL, module, "NLUseProxy", 0); - - reply->code = MIMRES_SUCCESS; - mir_snprintf(buffer, Translate("'%s' proxy was disabled."), protocol); + db_set_b(NULL, module, "NLUseProxy", 0); - break; - } + reply->code = MIMRES_SUCCESS; + mir_snwprintf(buffer, TranslateT("'%S' proxy was disabled."), protocol); + break; case STATE_ON: - { - db_set_b(NULL, module, "NLUseProxy", 1); - - reply->code = MIMRES_SUCCESS; - mir_snprintf(buffer, Translate("'%s' proxy was enabled."), protocol); + db_set_b(NULL, module, "NLUseProxy", 1); - break; - } + reply->code = MIMRES_SUCCESS; + mir_snwprintf(buffer, TranslateT("'%S' proxy was enabled."), protocol); + break; case STATE_TOGGLE: { @@ -1092,16 +1026,14 @@ void HandleProtocolProxyCommand(PCommand command, TArgument *argv, int argc, PRe db_set_b(NULL, module, "NLUseProxy", value); reply->code = MIMRES_SUCCESS; - mir_snprintf(buffer, (value) ? Translate("'%s' proxy was enabled.") : Translate("'%s' proxy was disabled.")); - - break; + mir_snwprintf(buffer, (value) ? TranslateT("'%S' proxy was enabled.") : TranslateT("'%S' proxy was disabled."), protocol); } + break; default: HandleUnknownParameter(command, argv[4], reply); return; } - break; } @@ -1110,28 +1042,26 @@ void HandleProtocolProxyCommand(PCommand command, TArgument *argv, int argc, PRe return; } } - else if (mir_strcmp(proxycmd, "server") == 0) { + else if (mir_wstrcmp(proxycmd, L"server") == 0) { switch (argc) { case 4: { char host[256], type[256]; - GetStringFromDatabase(NULL, module, "NLProxyServer", "", host, sizeof(host)); + GetStringFromDatabase(NULL, module, "NLProxyServer", "", host, _countof(host)); int port = db_get_w(NULL, module, "NLProxyPort", 0); - PrettyProxyType(db_get_b(NULL, module, "NLProxyType", 0), type, sizeof(type)); + PrettyProxyType(db_get_b(NULL, module, "NLProxyType", 0), type, _countof(type)); reply->code = MIMRES_SUCCESS; - mir_snprintf(buffer, Translate("%s proxy server: %s %s:%d."), protocol, type, host, port); - - break; + mir_snwprintf(buffer, TranslateT("%S proxy server: %S %S:%d."), protocol, type, host, port); } + break; case 7: { int type = ParseProxyType(argv[4]); - char *host = argv[5]; - long port; - char *stop = nullptr; - port = strtol(argv[6], &stop, 10); + ptrA host(mir_u2a(argv[5])); + wchar_t *stop = nullptr; + long port = wcstol(argv[6], &stop, 10); if ((*stop == 0) && (type > 0)) { db_set_s(NULL, module, "NLProxyServer", host); @@ -1139,15 +1069,14 @@ void HandleProtocolProxyCommand(PCommand command, TArgument *argv, int argc, PRe db_set_b(NULL, module, "NLProxyType", type); reply->code = MIMRES_SUCCESS; - mir_snprintf(buffer, Translate("%s proxy set to %s %s:%d."), protocol, argv[4], host, port); + mir_snwprintf(buffer, TranslateT("%S proxy set to %s %S:%d."), protocol, argv[4], host, port); } else { reply->code = MIMRES_FAILURE; - mir_snprintf(buffer, Translate("%s The port or the proxy type parameter is invalid."), protocol); + mir_snwprintf(buffer, TranslateT("%S The port or the proxy type parameter is invalid."), protocol); } - - break; } + break; default: HandleWrongParametersCount(command, reply); @@ -1159,26 +1088,23 @@ void HandleProtocolProxyCommand(PCommand command, TArgument *argv, int argc, PRe return; } - if (reply->message[0] != 0) { - mir_strncat(reply->message, "\n", _countof(reply->message) - mir_strlen(reply->message)); - mir_strncat(reply->message, buffer, _countof(reply->message) - mir_strlen(reply->message)); + mir_wstrncat(reply->message, L"\n", _countof(reply->message) - mir_wstrlen(reply->message)); + mir_wstrncat(reply->message, buffer, _countof(reply->message) - mir_wstrlen(reply->message)); reply->message[_countof(reply->message) - 1] = 0; } - else { - mir_snprintf(reply->message, buffer); - } + else mir_snwprintf(reply->message, buffer); } void HandleProxyCommand(PCommand command, TArgument *argv, int argc, PReply reply) { if (argc >= 4) { - char account[128]; - char protocol[128]; - strncpy_s(account, argv[2], sizeof(account)); - account[sizeof(account) - 1] = 0; + wchar_t account[128]; + wcsncpy_s(account, argv[2], _countof(account)); + account[_countof(account) - 1] = 0; - AccountName2Protocol(account, protocol, sizeof(protocol)); + char protocol[128]; + AccountName2Protocol(account, protocol, _countof(protocol)); int count = 0; PROTOACCOUNT **accounts = nullptr; @@ -1209,53 +1135,53 @@ void HandleProxyCommand(PCommand command, TArgument *argv, int argc, PReply repl if (!found) { reply->code = MIMRES_FAILURE; - mir_snprintf(reply->message, Translate("'%s' doesn't seem to be a valid account."), account); + mir_snwprintf(reply->message, TranslateT("'%s' doesn't seem to be a valid account."), account); } } - else { - HandleWrongParametersCount(command, reply); - } + else HandleWrongParametersCount(command, reply); } -int ContactMatchSearch(MCONTACT hContact, char *contact, char *id, char *account, TArgument *argv, int argc) +int ContactMatchSearch(MCONTACT hContact, wchar_t *contact, wchar_t *id, char *account, TArgument *argv, int argc) { int matches = 1; - char lwrName[2048] = "\0"; - char lwrAccount[128] = "\0"; - char lwrKeyword[512] = "\0"; - char lwrID[512] = "\0"; - char *pos; + wchar_t lwrName[2048]; + char lwrAccount[128]; + wchar_t lwrKeyword[512]; + wchar_t lwrID[512]; + wchar_t *pos; - strncpy_s(lwrName, contact, sizeof(lwrName)); - strncpy_s(lwrAccount, account, sizeof(lwrAccount)); + wcsncpy_s(lwrName, contact, _countof(lwrName)); + strncpy_s(lwrAccount, account, _countof(lwrAccount)); - if (id) { strncpy_s(lwrID, id, sizeof(lwrID)); } + if (id) + wcsncpy_s(lwrID, id, _countof(lwrID)); + else + lwrID[0] = 0; - _strlwr(lwrName); + _wcslwr(lwrName); _strlwr(lwrAccount); - _strlwr(lwrID); + _wcslwr(lwrID); for (int i = 0; i < argc; i++) { - strncpy_s(lwrKeyword, argv[i], sizeof(lwrKeyword)); - _strlwr(lwrKeyword); + wcsncpy_s(lwrKeyword, argv[i], _countof(lwrKeyword)); + _wcslwr(lwrKeyword); - pos = strstr(lwrKeyword, "account:"); + pos = wcsstr(lwrKeyword, L"account:"); if (pos) { pos += 8; - if (strstr(lwrAccount, pos) == nullptr) { + if (strstr(lwrAccount, _T2A(pos)) == nullptr) { matches = 0; - break; } } else { - pos = strstr(lwrKeyword, "status:"); + pos = wcsstr(lwrKeyword, L"status:"); if (pos) { int searchStatus = ParseStatusParam(pos + 7); char protocol[128]; - AccountName2Protocol(account, protocol, sizeof(protocol)); + AccountName2Protocol(_A2T(account), protocol, _countof(protocol)); WORD contactStatus = db_get_w(hContact, protocol, "Status", ID_STATUS_OFFLINE); if (searchStatus != contactStatus) { @@ -1264,15 +1190,15 @@ int ContactMatchSearch(MCONTACT hContact, char *contact, char *id, char *account } } else { - pos = strstr(lwrKeyword, "id:"); + pos = wcsstr(lwrKeyword, L"id:"); if (pos) { pos += 3; - if (strstr(lwrID, pos) == nullptr) { + if (wcsstr(lwrID, pos) == nullptr) { matches = 0; break; } } - else if ((strstr(lwrName, lwrKeyword) == nullptr)) { + else if ((wcsstr(lwrName, lwrKeyword) == nullptr)) { matches = 0; break; } @@ -1286,38 +1212,34 @@ int ContactMatchSearch(MCONTACT hContact, char *contact, char *id, char *account void __cdecl OpenMessageWindowThread(void *data) { MCONTACT hContact = (UINT_PTR)data; - if (hContact) { + if (hContact) CallServiceSync(MS_MSG_SENDMESSAGEW, hContact, 0); - } } - void HandleContactsCommand(PCommand command, TArgument *argv, int argc, PReply reply) { if (argc >= 3) { - if (_stricmp(argv[2], "list") == 0) { - char buffer[1024]; + if (_wcsicmp(argv[2], L"list") == 0) { + wchar_t buffer[1024]; char protocol[128]; int count = 0; reply->code = MIMRES_SUCCESS; for (MCONTACT hContact = db_find_first(); hContact; hContact = db_find_next(hContact)) { - GetContactProto(hContact, protocol, sizeof(protocol)); + GetContactProto(hContact, protocol, _countof(protocol)); - char *contact = GetContactName(hContact, protocol); - char *id = GetContactID(hContact, protocol); + ptrW contact(GetContactName(hContact, protocol)); + ptrW id(GetContactID(hContact, protocol)); if (ContactMatchSearch(hContact, contact, id, protocol, &argv[3], argc - 3)) { - mir_snprintf(buffer, "%s:[%s]:%s (%08d)", contact, id, protocol, hContact); + mir_snwprintf(buffer, L"%s:[%s]:%S (%08d)", contact, id, protocol, hContact); if (count) { - mir_strncat(reply->message, "\n", _countof(reply->message) - mir_strlen(reply->message)); - mir_strncat(reply->message, buffer, _countof(reply->message) - mir_strlen(reply->message)); - } - else { - strncpy_s(reply->message, buffer, _countof(reply->message)); + mir_wstrncat(reply->message, L"\n", _countof(reply->message) - mir_wstrlen(reply->message)); + mir_wstrncat(reply->message, buffer, _countof(reply->message) - mir_wstrlen(reply->message)); } + else wcsncpy_s(reply->message, buffer, _countof(reply->message)); - if (mir_strlen(reply->message) > 4096) { + if (mir_wstrlen(reply->message) > 4096) { SetEvent(heServerBufferFull); Sleep(750); //wait a few milliseconds for the event to be processed count = 0; @@ -1326,27 +1248,21 @@ void HandleContactsCommand(PCommand command, TArgument *argv, int argc, PReply r count++; } - - free(contact); - free(id); } } - else if (_stricmp(argv[2], "open") == 0) { + else if (_wcsicmp(argv[2], L"open") == 0) { if (argc > 3) { char protocol[128]; reply->code = MIMRES_SUCCESS; *reply->message = 0; for (MCONTACT hContact = db_find_first(); hContact; hContact = db_find_next(hContact)) { - GetContactProto(hContact, protocol, sizeof(protocol)); + GetContactProto(hContact, protocol, _countof(protocol)); - char *contact = GetContactName(hContact, protocol); - char *id = GetContactID(hContact, protocol); + ptrW contact(GetContactName(hContact, protocol)); + ptrW id(GetContactID(hContact, protocol)); if (ContactMatchSearch(hContact, contact, id, protocol, &argv[3], argc - 3)) mir_forkthread(OpenMessageWindowThread, (void*)hContact); - - free(contact); - free(id); } } else if (argc == 3) { @@ -1366,31 +1282,28 @@ void HandleContactsCommand(PCommand command, TArgument *argv, int argc, PReply r else HandleWrongParametersCount(command, reply); } -void AddHistoryEvent(DBEVENTINFO *dbEvent, char *contact, PReply reply) +void AddHistoryEvent(DBEVENTINFO *dbEvent, wchar_t *contact, PReply reply) { char timestamp[256]; - TimeZone_ToString(dbEvent->timestamp, "D, s", timestamp, sizeof(timestamp)); - - char *sender = (dbEvent->flags & DBEF_SENT) ? Translate("[me]") : contact; - char *message = DbEvent_GetTextA(dbEvent, CP_ACP); + TimeZone_ToString(dbEvent->timestamp, "D, s", timestamp, _countof(timestamp)); - static char buffer[8192]; - mir_snprintf(buffer, "[%s] %15s: %s", timestamp, sender, message); + wchar_t *sender = (dbEvent->flags & DBEF_SENT) ? TranslateT("[me]") : contact; + wchar_t *message = DbEvent_GetTextW(dbEvent, CP_ACP); + static wchar_t buffer[8192]; + mir_snwprintf(buffer, L"[%S] %15s: %s", timestamp, sender, message); if (reply->message[0] != 0) { - mir_strncat(reply->message, "\n", _countof(reply->message) - mir_strlen(reply->message)); - mir_strncat(reply->message, buffer, _countof(reply->message) - mir_strlen(reply->message)); - } - else { - strncpy_s(reply->message, buffer, _countof(reply->message)); + mir_wstrncat(reply->message, L"\n", _countof(reply->message) - mir_wstrlen(reply->message)); + mir_wstrncat(reply->message, buffer, _countof(reply->message) - mir_wstrlen(reply->message)); } + else wcsncpy_s(reply->message, buffer, _countof(reply->message)); - if (mir_strlen(reply->message) > (_countof(reply->message) / 2)) { + if (mir_wstrlen(reply->message) > (_countof(reply->message) / 2)) { SetEvent(heServerBufferFull); Sleep(750); - mir_strcpy(reply->message, "\n"); + mir_wstrcpy(reply->message, L"\n"); } mir_free(message); } @@ -1398,17 +1311,17 @@ void AddHistoryEvent(DBEVENTINFO *dbEvent, char *contact, PReply reply) void HandleHistoryCommand(PCommand command, TArgument *argv, int argc, PReply reply) { if (argc >= 3) { - char *cmd = argv[2]; + wchar_t *cmd = argv[2]; switch (argc) { case 3: - if (_stricmp(cmd, "unread") == 0) { - char buffer[4096]; + if (_wcsicmp(cmd, L"unread") == 0) { + wchar_t buffer[4096]; int count; int contacts = 0; DBEVENTINFO dbEvent = {}; reply->code = MIMRES_SUCCESS; - mir_snprintf(reply->message, Translate("No unread messages found.")); + mir_snwprintf(reply->message, TranslateT("No unread messages found.")); for (MCONTACT hContact = db_find_first(); hContact; hContact = db_find_next(hContact)) { MEVENT hEvent = db_event_firstUnread(hContact); @@ -1423,23 +1336,21 @@ void HandleHistoryCommand(PCommand command, TArgument *argv, int argc, PReply re } char protocol[128]; - GetContactProto(hContact, protocol, sizeof(protocol)); - char *contact = GetContactName(hContact, protocol); - mir_snprintf(buffer, Translate("%s:%s - %d unread events."), contact, protocol, count); + GetContactProto(hContact, protocol, _countof(protocol)); + ptrW contact(GetContactName(hContact, protocol)); + mir_snwprintf(buffer, TranslateT("%s:%S - %d unread events."), contact, protocol, count); if (contacts > 0) { - mir_strncat(reply->message, "\n", _countof(reply->message) - mir_strlen(reply->message)); - mir_strncat(reply->message, buffer, _countof(reply->message) - mir_strlen(reply->message)); + mir_wstrncat(reply->message, L"\n", _countof(reply->message) - mir_wstrlen(reply->message)); + mir_wstrncat(reply->message, buffer, _countof(reply->message) - mir_wstrlen(reply->message)); } - else strncpy_s(reply->message, buffer, _countof(reply->message)); + else wcsncpy_s(reply->message, buffer, _countof(reply->message)); contacts++; - - free(contact); } } } - else if (_stricmp(cmd, "show") == 0) + else if (_wcsicmp(cmd, L"show") == 0) HandleWrongParametersCount(command, reply); else HandleUnknownParameter(command, cmd, reply); @@ -1447,10 +1358,10 @@ void HandleHistoryCommand(PCommand command, TArgument *argv, int argc, PReply re case 4: { - char *contact = argv[3]; + wchar_t *contact = argv[3]; MCONTACT hContact = ParseContactParam(contact); if (hContact) { - if (_stricmp(cmd, "unread") == 0) { + if (_wcsicmp(cmd, L"unread") == 0) { MEVENT hEvent = db_event_firstUnread(hContact); reply->code = MIMRES_SUCCESS; @@ -1464,29 +1375,29 @@ void HandleHistoryCommand(PCommand command, TArgument *argv, int argc, PReply re hEvent = db_event_next(hContact, hEvent); } } - else if (_stricmp(cmd, "show") == 0) { + else if (_wcsicmp(cmd, L"show") == 0) { reply->code = MIMRES_SUCCESS; - mir_snprintf(reply->message, Translate("Contact '%s' has %d events in history."), contact, db_event_count(hContact)); + mir_snwprintf(reply->message, TranslateT("Contact '%s' has %d events in history."), contact, db_event_count(hContact)); } else HandleUnknownParameter(command, cmd, reply); } else { reply->code = MIMRES_FAILURE; - mir_snprintf(reply->message, Translate("Could not find contact handle for contact '%s'."), contact); + mir_snwprintf(reply->message, TranslateT("Could not find contact handle for contact '%s'."), contact); } } break; case 6: { - char *contact = argv[3]; + wchar_t *contact = argv[3]; MCONTACT hContact = ParseContactParam(contact); if (hContact) { - if (_stricmp(cmd, "show") == 0) { - char *stop1 = nullptr; - char *stop2 = nullptr; - long start = strtol(argv[4], &stop1, 10); - long stop = strtol(argv[5], &stop2, 10); + if (_wcsicmp(cmd, L"show") == 0) { + wchar_t *stop1 = nullptr; + wchar_t *stop2 = nullptr; + long start = wcstol(argv[4], &stop1, 10); + long stop = wcstol(argv[5], &stop2, 10); if (!(*stop1) && !(*stop2)) { int size = db_event_count(hContact); if (start < 0) { start = size + start + 1; } @@ -1503,9 +1414,8 @@ void HandleHistoryCommand(PCommand command, TArgument *argv, int argc, PReply re dbEvent.pBlob = (PBYTE)message; while (hEvent) { - dbEvent.cbBlob = sizeof(message); - if (!db_event_get(hEvent, &dbEvent)) // if successful call - { + dbEvent.cbBlob = _countof(message); + if (!db_event_get(hEvent, &dbEvent)) { // if successful call dbEvent.pBlob[dbEvent.cbBlob] = 0; if ((index >= start) && (index <= stop)) AddHistoryEvent(&dbEvent, contact, reply); @@ -1521,14 +1431,14 @@ void HandleHistoryCommand(PCommand command, TArgument *argv, int argc, PReply re } else HandleUnknownParameter(command, (*stop1) ? argv[4] : argv[5], reply); } - else if (_stricmp(cmd, "unread") == 0) + else if (_wcsicmp(cmd, L"unread") == 0) HandleWrongParametersCount(command, reply); else HandleUnknownParameter(command, cmd, reply); } else { reply->code = MIMRES_FAILURE; - mir_snprintf(reply->message, Translate("Could not find contact handle for contact '%s'."), contact); + mir_snwprintf(reply->message, TranslateT("Could not find contact handle for contact '%s'."), contact); } } break; @@ -1548,14 +1458,14 @@ void HandleVersionCommand(PCommand command, TArgument*, int argc, PReply reply) if (ServiceExists(MS_CRASHDUMPER_GETINFO)) { char *data; CallService(MS_CRASHDUMPER_GETINFO, (WPARAM)FALSE, (LPARAM)&data); - mir_snprintf(reply->message, data); + mir_snwprintf(reply->message, _A2T(data)); mir_free(data); } else { char miranda[512]; DWORD v = pluginInfo.version; - Miranda_GetVersionText(miranda, sizeof(miranda)); - mir_snprintf(reply->message, "Miranda %s\nCmdLine v.%d.%d.%d.%d", miranda, ((v >> 24) & 0xFF), ((v >> 16) & 0xFF), ((v >> 8) & 0xFF), (v & 0xFF)); + Miranda_GetVersionText(miranda, _countof(miranda)); + mir_snwprintf(reply->message, L"Miranda %S\nCmdLine v.%d.%d.%d.%d", miranda, ((v >> 24) & 0xFF), ((v >> 16) & 0xFF), ((v >> 8) & 0xFF), (v & 0xFF)); } } else HandleWrongParametersCount(command, reply); @@ -1564,11 +1474,11 @@ void HandleVersionCommand(PCommand command, TArgument*, int argc, PReply reply) void HandleSetNicknameCommand(PCommand command, TArgument *argv, int argc, PReply reply) { if (argc == 4) { - char protocol[512], nickname[512]; - mir_strcpy(protocol, argv[2]); - mir_strcpy(nickname, argv[3]); + wchar_t protocol[512], nickname[512]; + mir_wstrcpy(protocol, argv[2]); + mir_wstrcpy(nickname, argv[3]); - int res = CallProtoService(protocol, PS_SETMYNICKNAME, SMNN_UNICODE, (LPARAM)nickname); + int res = CallProtoService(_T2A(protocol), PS_SETMYNICKNAME, SMNN_UNICODE, (LPARAM)nickname); if (res == 0) { reply->code = MIMRES_SUCCESS; @@ -1576,7 +1486,7 @@ void HandleSetNicknameCommand(PCommand command, TArgument *argv, int argc, PRepl } else { reply->code = MIMRES_FAILURE; - mir_snprintf(reply->message, Translate("Error setting nickname to '%s' for protocol '%s'"), nickname, protocol); + mir_snwprintf(reply->message, TranslateT("Error setting nickname to '%s' for protocol '%s'"), nickname, protocol); } } else HandleWrongParametersCount(command, reply); @@ -1586,10 +1496,10 @@ void HandleIgnoreCommand(PCommand command, TArgument *argv, int argc, PReply rep { if (argc >= 4) { BOOL block = FALSE; - if (_stricmp(argv[2], "block") == 0) { + if (_wcsicmp(argv[2], L"block") == 0) { block = TRUE; } - else if (_stricmp(argv[2], "unblock") == 0) { + else if (_wcsicmp(argv[2], L"unblock") == 0) { block = FALSE; } else { @@ -1617,26 +1527,26 @@ void HandleLuaCommand(PCommand command, TArgument *argv, int argc, PReply reply) return; } - if (_stricmp(argv[2], "call") == 0) { + if (_wcsicmp(argv[2], L"call") == 0) { wchar_t *result = argc == 4 - ? lua_call(nullptr, _A2T(argv[3])) - : lua_call(_A2T(argv[3]), _A2T(argv[4])); - mir_strcpy(reply->message, _T2A(result)); + ? lua_call(nullptr, argv[3]) + : lua_call(argv[3], argv[4]); + mir_wstrcpy(reply->message, result); mir_free(result); reply->code = MIMRES_SUCCESS; return; } - if (_stricmp(argv[2], "exec") == 0) { - ptrW result(lua_exec(_A2T(argv[3]))); - mir_strcpy(reply->message, _T2A(result)); + if (_wcsicmp(argv[2], L"exec") == 0) { + ptrW result(lua_exec(argv[3])); + mir_wstrcpy(reply->message, result); reply->code = MIMRES_SUCCESS; return; } - if (_stricmp(argv[2], "eval") == 0) { - ptrW result(lua_eval(_A2T(argv[3]))); - mir_strcpy(reply->message, _T2A(result)); + if (_wcsicmp(argv[2], L"eval") == 0) { + ptrW result(lua_eval(argv[3])); + mir_wstrcpy(reply->message, result); reply->code = MIMRES_SUCCESS; return; } @@ -1721,6 +1631,6 @@ void HandleCommand(PCommand command, TArgument *argv, int argc, PReply reply) default: reply->code = MIMRES_NOTFOUND; - mir_snprintf(reply->message, Translate("Command '%s' is not currently supported."), command->command); + mir_snwprintf(reply->message, TranslateT("Command '%s' is not currently supported."), command->command); } } -- cgit v1.2.3