From 5e3b2449340245febd68b79c148a5ca3fd95336a Mon Sep 17 00:00:00 2001 From: Alexander Lantsev Date: Mon, 3 Jun 2013 20:43:25 +0000 Subject: - added base64 encode/decode services in Miranda? utils git-svn-id: http://svn.miranda-ng.org/main/trunk@4875 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- src/modules/utils/utils.cpp | 97 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) (limited to 'src/modules') diff --git a/src/modules/utils/utils.cpp b/src/modules/utils/utils.cpp index 276b8b1e84..c6bd60a59b 100644 --- a/src/modules/utils/utils.cpp +++ b/src/modules/utils/utils.cpp @@ -470,6 +470,100 @@ static INT_PTR GenerateRandom(WPARAM wParam, LPARAM lParam) return 0; } +///////////////////////////////////////////////////////////////////////////////////////// + +static INT_PTR EncodeBase64(WPARAM wParam, LPARAM lParam) +{ + size_t i = 0; + char chr[3], enc[4]; + static char cb64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + + const char *input = (const char *)lParam; + size_t length = strlen(input); + size_t nLength = 4 * ((length + 2) / 3) + 1; + + char *output = (char *)mir_alloc(nLength); + char *p = output; + + while (i < length) + { + chr[0] = input[i++]; + chr[1] = input[i++]; + chr[2] = input[i++]; + + enc[0] = chr[0] >> 2; + enc[1] = ((chr[0] & 0x03) << 4) | (chr[1] >> 4); + enc[2] = ((chr[1] & 0x0F) << 2) | (chr[2] >> 6); + enc[3] = chr[2] & 0x3F; + + *p++ = cb64[enc[0]]; *p++ = cb64[enc[1]]; + + if (i - 2 >= length) { *p++ = '='; *p++ = '='; } + else if (i - 1 >= length) { *p++ = cb64[enc[2]]; *p++ = '='; } + else { *p++ = cb64[enc[2]]; *p++ = cb64[enc[3]]; } + } + + *p = 0; + + return (INT_PTR)output; +} + +static int Base64DecodeTable[] = +{ + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,62, -1,-1,-1,63, + 52,53,54,55, 56,57,58,59, 60,61,-1,-1, -1,-1,-1,-1, + -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14, + 15,16,17,18, 19,20,21,22, 23,24,25,-1, -1,-1,-1,-1, + -1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40, + 41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1, + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1 +}; + +static INT_PTR DecodeBase64(WPARAM wParam, LPARAM lParam) +{ + size_t i = 0; + char chr[3], enc[4]; + + const char *input = (const char *)lParam; + size_t length = strlen(input); + size_t nLength = (length / 4) * 3 + 1; + + char *output = (char *)mir_alloc(nLength); + char *p = output; + + while (i < length) + { + enc[0] = Base64DecodeTable[input[i++]]; + enc[1] = Base64DecodeTable[input[i++]]; + enc[2] = Base64DecodeTable[input[i++]]; + enc[3] = Base64DecodeTable[input[i++]]; + + if (enc[0] == -1 || enc[1] == -1) break; + + chr[0] = (enc[0] << 2) | (enc[1] >> 4); + chr[1] = ((enc[1] & 15) << 4) | (enc[2] >> 2); + chr[2] = ((enc[2] & 3) << 6) | enc[3]; + + *p++ = chr[0]; + + if (enc[2] != -1) *p++ = chr[1]; + if (enc[3] != -1) *p++ = chr[2]; + } + + *p = 0; + + return (INT_PTR)output; +} + ///////////////////////////////////////////////////////////////////////////////////////// int LoadUtilsModule(void) { @@ -485,6 +579,9 @@ int LoadUtilsModule(void) CreateServiceFunction(MS_UTILS_GETRANDOM, GenerateRandom); CreateServiceFunction(MS_SYSTEM_RESTART, RestartMiranda); + CreateServiceFunction(MS_UTILS_ENCODEBASE64, EncodeBase64); + CreateServiceFunction(MS_UTILS_DECODEBASE64, DecodeBase64); + InitOpenUrl(); InitWindowList(); InitHyperlink(); -- cgit v1.2.3