ecp: add base64
authormunkyu.im <munkyu.im@samsung.com>
Tue, 18 Jun 2013 13:10:13 +0000 (22:10 +0900)
committermunkyu.im <munkyu.im@samsung.com>
Tue, 18 Jun 2013 13:10:39 +0000 (22:10 +0900)
Signed-off-by: munkyu.im <munkyu.im@samsung.com>
tizen/src/Makefile.tizen
tizen/src/base64.c [new file with mode: 0644]
tizen/src/base64.h [new file with mode: 0644]
tizen/src/ecs.c

index 46bcf40f91b0a6cfdf6f55012e9239c95f2d87b5..87292a1529cb1143d262a4570d5175ba1182f06b 100755 (executable)
@@ -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 (file)
index 0000000..63d255a
--- /dev/null
@@ -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 (file)
index 0000000..242adad
--- /dev/null
@@ -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);
index 560f8f6168951732485001b4f84f58302d440ec5..fdb783c80d085f647771cb4089fab4633356b8f1 100644 (file)
@@ -22,6 +22,7 @@
 #include "hw/maru_virtio_evdi.h"
 #include <stdbool.h>
 #include <pthread.h>
+#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;
 }