summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Lantsev <aunsane@gmail.com>2013-06-03 20:43:25 +0000
committerAlexander Lantsev <aunsane@gmail.com>2013-06-03 20:43:25 +0000
commit5e3b2449340245febd68b79c148a5ca3fd95336a (patch)
tree1046bf45634ca7ed7d685142c079263ac3500d82
parent1ec5a4ad845a3dcc413fc96cf8d07964f1a9fbaf (diff)
- added base64 encode/decode services in Miranda? utils
git-svn-id: http://svn.miranda-ng.org/main/trunk@4875 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
-rw-r--r--include/m_utils.h12
-rw-r--r--src/modules/utils/utils.cpp97
2 files changed, 109 insertions, 0 deletions
diff --git a/include/m_utils.h b/include/m_utils.h
index 17640c6d32..3c8a01af89 100644
--- a/include/m_utils.h
+++ b/include/m_utils.h
@@ -348,6 +348,18 @@ __forceinline INT_PTR Utils_AssertInsideScreen(RECT *rc) {
//Always returns 0
#define MS_UTILS_GETRANDOM "Utils/GetRandom"
+//Generates Base64 encoded string
+//wParam = 0 (unused)
+//lParam = (LPARAM)(char*)pointer to source string
+//Returns (char*)pointer to encoded string
+#define MS_UTILS_ENCODEBASE64 "Utils/EncodeBase64"
+
+//Generates Base64 decoded string
+//wParam = 0 (unused)
+//lParam = (LPARAM)(char*)pointer to encoded string
+//Returns (char*)pointer to decoded string
+#define MS_UTILS_DECODEBASE64 "Utils/DecodeBase64"
+
//Replace variables in text
//wParam = (char*/TCHAR*/WCHAR*)string (depends on RVF_UNICODE/RVF_TCHAR flag)
//lParam = (REPLACEVARSDATA *) data about variables, item with key = 0 terminates the list
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
@@ -471,6 +471,100 @@ static INT_PTR GenerateRandom(WPARAM wParam, LPARAM lParam)
}
/////////////////////////////////////////////////////////////////////////////////////////
+
+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)
{
bModuleInitialized = TRUE;
@@ -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();