--- /dev/null
+#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;
+}
#include "hw/maru_virtio_evdi.h"
#include <stdbool.h>
#include <pthread.h>
+#include "base64.h"
#define DEBUG
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;
}