From: munkyu.im Date: Tue, 18 Jun 2013 13:10:13 +0000 (+0900) Subject: ecp: add base64 X-Git-Tag: Tizen_Studio_1.3_Release_p2.3.1~875^2~10 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a07e43754d876ca3d81c22e855c5a5fb8b60d445;p=sdk%2Femulator%2Fqemu.git ecp: add base64 Signed-off-by: munkyu.im --- diff --git a/tizen/src/Makefile.tizen b/tizen/src/Makefile.tizen index 46bcf40f91..87292a1529 100755 --- a/tizen/src/Makefile.tizen +++ b/tizen/src/Makefile.tizen @@ -139,6 +139,10 @@ obj-y += maruskin_client.o maruskin_server.o maruskin_operation.o maruskin_keyma # guest server obj-y += guest_server.o +# base64 +obj-y += base64.o + + #ifndef CONFIG_DARWIN ########################################################### ## opengl library for i386 diff --git a/tizen/src/base64.c b/tizen/src/base64.c new file mode 100644 index 0000000000..63d255abe7 --- /dev/null +++ b/tizen/src/base64.c @@ -0,0 +1,113 @@ +#include "base64.h" + +/*------ Base64 Encoding Table ------*/ +static const char MimeBase64[] = { + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', + 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', + 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', + 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', + 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', + 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', + 'w', 'x', 'y', 'z', '0', '1', '2', '3', + '4', '5', '6', '7', '8', '9', '+', '/' +}; + +/*------ Base64 Decoding Table ------*/ +static int DecodeMimeBase64[256] = { + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* 00-0F */ + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* 10-1F */ + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63, /* 20-2F */ + 52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1, /* 30-3F */ + -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14, /* 40-4F */ + 15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1, /* 50-5F */ + -1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40, /* 60-6F */ + 41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1, /* 70-7F */ + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* 80-8F */ + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* 90-9F */ + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* A0-AF */ + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* B0-BF */ + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* C0-CF */ + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* D0-DF */ + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* E0-EF */ + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 /* F0-FF */ + }; + +int base64_decode(char *text, unsigned char *dst, int numBytes ) +{ + const char* cp; + int space_idx = 0, phase; + int d, prev_d = 0; + unsigned char c; + + space_idx = 0; + phase = 0; + + for ( cp = text; *cp != '\0'; ++cp ) { + d = DecodeMimeBase64[(int) *cp]; + if ( d != -1 ) { + switch ( phase ) { + case 0: + ++phase; + break; + case 1: + c = ( ( prev_d << 2 ) | ( ( d & 0x30 ) >> 4 ) ); + if ( space_idx < numBytes ) + dst[space_idx++] = c; + ++phase; + break; + case 2: + c = ( ( ( prev_d & 0xf ) << 4 ) | ( ( d & 0x3c ) >> 2 ) ); + if ( space_idx < numBytes ) + dst[space_idx++] = c; + ++phase; + break; + case 3: + c = ( ( ( prev_d & 0x03 ) << 6 ) | d ); + if ( space_idx < numBytes ) + dst[space_idx++] = c; + phase = 0; + break; + } + prev_d = d; + } + } + + return space_idx; + +} + +int base64_encode(char *text, int numBytes, char **encodedText) +{ + unsigned char input[3] = {0,0,0}; + unsigned char output[4] = {0,0,0,0}; + int index, i, j, size; + char *p, *plen; + + plen = text + numBytes - 1; + size = (4 * (numBytes / 3)) + (numBytes % 3? 4 : 0) + 1; + (*encodedText) = malloc(size); + j = 0; + + for (i = 0, p = text;p <= plen; i++, p++) { + index = i % 3; + input[index] = *p; + + if (index == 2 || p == plen) { + output[0] = ((input[0] & 0xFC) >> 2); + output[1] = ((input[0] & 0x3) << 4) | ((input[1] & 0xF0) >> 4); + output[2] = ((input[1] & 0xF) << 2) | ((input[2] & 0xC0) >> 6); + output[3] = (input[2] & 0x3F); + + (*encodedText)[j++] = MimeBase64[output[0]]; + (*encodedText)[j++] = MimeBase64[output[1]]; + (*encodedText)[j++] = index == 0? '=' : MimeBase64[output[2]]; + (*encodedText)[j++] = index < 2? '=' : MimeBase64[output[3]]; + + input[0] = input[1] = input[2] = 0; + } + } + + (*encodedText)[j] = '\0'; + + return 0; +} diff --git a/tizen/src/base64.h b/tizen/src/base64.h new file mode 100644 index 0000000000..242adadec7 --- /dev/null +++ b/tizen/src/base64.h @@ -0,0 +1,4 @@ +#include "maru_common.h" + +int base64_decode(char *text, unsigned char *dst, int numBytes); +int base64_encode(char *text, int numBytes, char **encodedText); diff --git a/tizen/src/ecs.c b/tizen/src/ecs.c index 560f8f6168..fdb783c80d 100644 --- a/tizen/src/ecs.c +++ b/tizen/src/ecs.c @@ -22,6 +22,7 @@ #include "hw/maru_virtio_evdi.h" #include #include +#include "base64.h" #define DEBUG @@ -762,26 +763,52 @@ static bool injector_command_proc(ECS_Client *clii, QObject *obj) { LOG(">> print len = %d, data\" %s\"", strlen(data), data); LOG(">> header = cmd = %s, length = %d, action=%d, group=%d", cmd, length, action, group); - + int datalen = strlen(data); int sndlen = datalen + 14; char* sndbuf = (char*) malloc(sndlen + 1); - if (!sndbuf) + if (!sndbuf) { return false; + } memset(sndbuf, 0, sndlen + 1); - // set data - memcpy(sndbuf, cmd, 10); - memcpy(sndbuf + 10, &length, 2); - memcpy(sndbuf + 12, &group, 1); - memcpy(sndbuf + 13, &action, 1); - - memcpy(sndbuf + 14, data, datalen); - - send_to_evdi(route_ij, sndbuf, sndlen); - - free(sndbuf); + if(!strcmp(cmd, "telephony")) { + unsigned char *decoded_data = (unsigned char*)malloc(datalen + 1); + + if (!decoded_data) { + return false; + } + + int len_b64 = base64_decode(data, decoded_data, datalen); + length = (type_length)len_b64; + sndlen = length + 14; + memcpy(sndbuf, cmd, 10); + memcpy(sndbuf + 10, &length, 2); + memcpy(sndbuf + 12, &group, 1); + memcpy(sndbuf + 13, &action, 1); + memcpy(sndbuf + 14, decoded_data, length); + + send_to_evdi(route_ij, sndbuf, sndlen); + + free(sndbuf); + + if(decoded_data != NULL) { + free(decoded_data); + } + + } else { + // set data + memcpy(sndbuf, cmd, 10); + memcpy(sndbuf + 10, &length, 2); + memcpy(sndbuf + 12, &group, 1); + memcpy(sndbuf + 13, &action, 1); + memcpy(sndbuf + 14, data, datalen); + + send_to_evdi(route_ij, sndbuf, sndlen); + + free(sndbuf); + } return true; }