--#include <stdbool.h>\r
--#include <pthread.h>\r
--\r
--#include "hw/qdev.h"\r
--#include "net/net.h"\r
--#include "ui/console.h"\r
--#include "migration/migration.h"\r
--#include "qapi/qmp/qint.h"\r
--#include "qapi/qmp/qbool.h"\r
--#include "qapi/qmp/qjson.h"\r
--#include "qapi/qmp/json-parser.h"\r
--#include "ui/qemu-spice.h"\r
--#include "qemu/queue.h"\r
--#include "qemu/option.h"\r
--#include "sysemu/char.h"\r
--#include "qemu/main-loop.h"\r
--\r
--#ifndef _WIN32\r
--#include <sys/epoll.h>\r
--#endif\r
--\r
--#include "qemu-common.h"\r
--//#include "qemu_socket.h"\r
--#include "sdb.h"\r
--#include "ecs-json-streamer.h"\r
--#include "qmp-commands.h"\r
--\r
--#include "ecs.h"\r
--#include "hw/maru_virtio_evdi.h"\r
-#include "hw/maru_virtio_sensor.h"\r
--#include "skin/maruskin_operation.h"\r
--\r
--// utility functions\r
--\r
--void* build_master(ECS__Master* master, int* payloadsize)\r
--{\r
-- int len_pack = ecs__master__get_packed_size(master);\r
-- *payloadsize = len_pack + 4;\r
-- LOG("pack size=%d", len_pack);\r
-- void* buf = g_malloc(len_pack + 4);\r
-- if (!buf)\r
-- return NULL;\r
--\r
-- ecs__master__pack(master, buf + 4);\r
--\r
-- len_pack = htonl(len_pack);\r
-- memcpy(buf, &len_pack, 4);\r
--\r
-- return buf;\r
--}\r
--\r
--bool send_to_ecp(ECS__Master* master)\r
--{\r
-- int payloadsize = 0;\r
-- void* buf = build_master(master, &payloadsize);\r
-- if (!buf)\r
-- {\r
-- LOG("invalid buf");\r
-- return false;\r
-- }\r
--\r
-- if (!send_to_all_client(buf, payloadsize))\r
-- return false;\r
--\r
-- if (buf)\r
-- {\r
-- g_free(buf);\r
-- }\r
-- return true;\r
--}\r
--\r
--\r
--// message handlers\r
--\r
--\r
--bool msgproc_start_req(ECS_Client* ccli, ECS__StartReq* msg)\r
--{\r
-- LOG("ecs_startinfo_req");\r
--\r
--\r
-- int hostkbd_status = mloop_evcmd_get_hostkbd_status();\r
--\r
-- LOG("hostkbd_status = %d", hostkbd_status);\r
--\r
-- send_start_ans(hostkbd_status);\r
--\r
-- return true;\r
--}\r
--\r
--bool msgproc_injector_req(ECS_Client* ccli, ECS__InjectorReq* msg)\r
--{\r
-- char cmd[10];\r
-- memset(cmd, 0, 10);\r
-- strcpy(cmd, msg->category);\r
-- type_length length = (type_length) msg->length;\r
-- type_group group = (type_group) (msg->group & 0xff);\r
-- type_action action = (type_action) (msg->action & 0xff);\r
--\r
--\r
-- int datalen = 0;\r
-- if (msg->has_data)\r
-- {\r
-- datalen = msg->data.len;\r
-- }\r
-- //LOG(">> count= %d", ++ijcount);\r
--\r
-- LOG(">> header = cmd = %s, length = %d, action=%d, group=%d", cmd, length,\r
-- action, group);\r
--\r
--\r
-- int sndlen = datalen + 14;\r
-- char* sndbuf = (char*) g_malloc(sndlen + 1);\r
-- if (!sndbuf) {\r
-- return false;\r
-- }\r
--\r
-- memset(sndbuf, 0, sndlen + 1);\r
--\r
-- // set data\r
-- memcpy(sndbuf, cmd, 10);\r
-- memcpy(sndbuf + 10, &length, 2);\r
-- memcpy(sndbuf + 12, &group, 1);\r
-- memcpy(sndbuf + 13, &action, 1);\r
--\r
--\r
-- if (msg->has_data)\r
-- {\r
-- if (msg->data.data && msg->data.len > 0)\r
-- {\r
-- const char* data = msg->data.data;\r
-- memcpy(sndbuf + 14, data, datalen);\r
-- LOG(">> print len = %d, data\" %s\"", strlen(data), data);\r
-- }\r
-- }\r
--\r
--\r
-- send_to_evdi(route_ij, sndbuf, sndlen);\r
--\r
-- g_free(sndbuf);\r
--\r
-- return true;\r
--}\r
--\r
- bool msgproc_control_msg(ECS_Client *cli, ECS__ControlMsg* msg)\r
-bool msgproc_control_req(ECS_Client *ccli, ECS__ControlReq* msg)\r
--{\r
- if (msg->type == ECS__CONTROL_MSG__CONTROL_TYPE__HOSTKEYBOARD_REQ)\r
- {\r
- ECS__HostKeyboardReq* hkr = msg->hostkeyboard_req;\r
- if (!hkr)\r
- return false;\r
- msgproc_control_hostkeyboard_req(cli, hkr);\r
- }\r
--\r
-- return true;\r
--}\r
--\r
--bool msgproc_monitor_req(ECS_Client *ccli, ECS__MonitorReq* msg)\r
-{\r
-\r
- return true;\r
-}\r
-\r
-bool msgproc_device_req(ECS_Client* ccli, ECS__DeviceReq* msg)\r
--{\r
- char cmd[10];\r
- char* data;\r
- memset(cmd, 0, 10);\r
- strcpy(cmd, msg->category);\r
- type_length length = (type_length) msg->length;\r
- type_group group = (type_group) (msg->group & 0xff);\r
- type_action action = (type_action) (msg->action & 0xff);\r
-\r
- if (msg->has_data && msg->data.len > 0)\r
- {\r
- data = msg->data.data;\r
- }\r
-\r
- LOG(">> header = cmd = %s, length = %d, action=%d, group=%d", cmd, length,\r
- action, group);\r
- \r
- if (!strncmp(cmd, MSG_TYPE_SENSOR, 6)) {\r
- if (group == MSG_GROUP_STATUS) {\r
- if (action ==MSG_ACTION_ACCEL) {\r
- get_sensor_accel();\r
- } else if (action == MSG_ACTION_GYRO) {\r
- get_sensor_gyro();\r
- } else if (action == MSG_ACTION_MAG) {\r
- get_sensor_mag();\r
- } else if (action == MSG_ACTION_LIGHT) {\r
- get_sensor_light();\r
- } else if (action == MSG_ACTION_PROXI) {\r
- get_sensor_proxi();\r
- }\r
- } else {\r
- set_sensor_data(length, data);\r
- }\r
- }\r
- else if (!strncmp(cmd, MSG_TYPE_NFC, 3)) {\r
- if (group == MSG_GROUP_STATUS) {\r
- send_to_nfc(request_get, data, length);\r
- } \r
- else \r
- {\r
- send_to_nfc(request_set, data, length);\r
- }\r
- }\r
--\r
-- return true;\r
--}\r
--\r
--bool msgproc_screen_dump_req(ECS_Client *ccli, ECS__ScreenDumpReq* msg)\r
--{\r
--\r
-- return true;\r
--}\r
--\r
-/*\r
-void ecs_startinfo_req(ECS_Client *clii)\r
-{\r
- LOG("ecs_startinfo_req");\r
--\r
- // begin control command\r
- int usbkbd_status = mloop_evcmd_get_hostkbd_status();\r
--\r
- void msgproc_control_hostkeyboard_req(ECS_Client *clii, ECS__HostKeyboardReq* req)\r
- LOG("usbkbd_status = %d", usbkbd_status);\r
-\r
-\r
-\r
- QDict* objData = qdict_new();\r
- qdict_put(objData, "host_keyboard_onoff", qint_from_int((int64_t )usbkbd_status));\r
-\r
- QDict* objMsg = qdict_new();\r
- qobject_incref(QOBJECT(objData));\r
-\r
- qdict_put(objMsg, "type", qstring_from_str(ECS_MSG_STARTINFO_ANS));\r
- qdict_put(objMsg, "result", qstring_from_str("success"));\r
- qdict_put(objMsg, "data", objData);\r
-\r
- QString *json;\r
- json = qobject_to_json(QOBJECT(objMsg));\r
-\r
- assert(json != NULL);\r
-\r
- qstring_append_chr(json, '\n');\r
- const char* snddata = qstring_get_str(json);\r
-\r
- LOG("<< startinfo json str = %s", snddata);\r
-\r
- send_to_client(clii->client_fd, snddata);\r
-\r
- QDECREF(json);\r
- QDECREF(objData);\r
- QDECREF(objMsg);\r
-}\r
-*/\r
-\r
-void control_host_keyboard_onoff_req(ECS_Client *clii, QDict* data)\r
--{\r
- int64_t is_on = req->ison;\r
- int64_t is_on = qdict_get_int(data, "is_on");\r
-- onoff_host_kbd(is_on);\r
--}\r
--\r
- // end control command\r
-void host_keyboard_onoff_ntf(int is_on)\r
-{\r
- QDict* objMsg = qdict_new();\r
-\r
- qdict_put(objMsg, "type", qstring_from_str("host_keyboard_onoff_ntf"));\r
- qdict_put(objMsg, "ison", qbool_from_int((int64_t)is_on));\r
-\r
- QString *json;\r
- json = qobject_to_json(QOBJECT(objMsg));\r
-\r
- assert(json != NULL);\r
-\r
- qstring_append_chr(json, '\n');\r
- const char* snddata = qstring_get_str(json);\r
-\r
- LOG("<< json str = %s", snddata);\r
-\r
- send_to_all_client(snddata, strlen(snddata));\r
-\r
- QDECREF(json);\r
-\r
- QDECREF(objMsg);\r
-}\r
--\r
--\r
--//\r
--\r
--bool ntf_to_injector(const char* data, const int len) {\r
-- type_length length = 0;\r
-- type_group group = 0;\r
-- type_action action = 0;\r
--\r
-- const int catsize = 10;\r
-- char cat[catsize + 1];\r
-- memset(cat, 0, catsize + 1);\r
--\r
-- read_val_str(data, cat, catsize);\r
-- read_val_short(data + catsize, &length);\r
-- read_val_char(data + catsize + 2, &group);\r
-- read_val_char(data + catsize + 2 + 1, &action);\r
--\r
--\r
-- const char* ijdata = (data + catsize + 2 + 1 + 1);\r
--\r
-- char *encoded_ijdata = NULL;\r
-- LOG("<< header cat = %s, length = %d, action=%d, group=%d", cat, length,\r
-- action, group);\r
--\r
-- if(!strcmp(cat, "telephony")) {\r
-- base64_encode(ijdata, length, &encoded_ijdata);\r
-- }\r
--\r
-- QDict* obj_header = qdict_new();\r
-- make_header(obj_header, length, group, action);\r
--\r
-- QDict* objData = qdict_new();\r
-- qobject_incref(QOBJECT(obj_header));\r
--\r
-- qdict_put(objData, "cat", qstring_from_str(cat));\r
-- qdict_put(objData, "header", obj_header);\r
-- if(!strcmp(cat, "telephony")) {\r
-- qdict_put(objData, "ijdata", qstring_from_str(encoded_ijdata));\r
-- } else {\r
-- qdict_put(objData, "ijdata", qstring_from_str(ijdata));\r
-- }\r
--\r
-- QDict* objMsg = qdict_new();\r
-- qobject_incref(QOBJECT(objData));\r
--\r
-- qdict_put(objMsg, "type", qstring_from_str("injector"));\r
-- qdict_put(objMsg, "result", qstring_from_str("success"));\r
-- qdict_put(objMsg, "data", objData);\r
--\r
-- QString *json;\r
-- json = qobject_to_json(QOBJECT(objMsg));\r
--\r
-- assert(json != NULL);\r
--\r
-- qstring_append_chr(json, '\n');\r
-- const char* snddata = qstring_get_str(json);\r
--\r
-- LOG("<< json str = %s", snddata);\r
--\r
-- send_to_all_client(snddata, strlen(snddata));\r
--\r
-- QDECREF(json);\r
--\r
-- QDECREF(obj_header);\r
-- QDECREF(objData);\r
-- QDECREF(objMsg);\r
--\r
-- return true;\r
--}\r
--\r
--bool send_start_ans(int host_keyboard_onff)\r
--{\r
-- ECS__Master master = ECS__MASTER__INIT;\r
-- ECS__StartAns ans = ECS__START_ANS__INIT;\r
--\r
- ans.has_host_keyboard_onoff = 1;\r
-- ans.host_keyboard_onoff = host_keyboard_onff;\r
- \r
- ans.has_camera_onoff = 1;\r
- ans.camera_onoff = 1;\r
- \r
- ans.has_earjack_onoff = 1;\r
- ans.earjack_onoff = 1;\r
--\r
- master.type = ECS__MASTER__TYPE__START_ANS;\r
-- master.start_ans = &ans;\r
--\r
-- return send_to_ecp(&master);\r
--}\r
--\r
--bool send_injector_ntf(const char* data, const int len)\r
--{\r
-- type_length length = 0;\r
-- type_group group = 0;\r
-- type_action action = 0;\r
--\r
-- const int catsize = 10;\r
-- char cat[catsize + 1];\r
-- memset(cat, 0, catsize + 1);\r
--\r
-- read_val_str(data, cat, catsize);\r
-- read_val_short(data + catsize, &length);\r
-- read_val_char(data + catsize + 2, &group);\r
-- read_val_char(data + catsize + 2 + 1, &action);\r
--\r
--\r
-- const char* ijdata = (data + catsize + 2 + 1 + 1);\r
--\r
-- LOG("<< header cat = %s, length = %d, action=%d, group=%d", cat, length,action, group);\r
--\r
-- ECS__Master master = ECS__MASTER__INIT;\r
-- ECS__InjectorNtf ntf = ECS__INJECTOR_NTF__INIT;\r
--\r
-- ntf.category = (char*) g_malloc(catsize + 1);\r
-- strncpy(ntf.category, cat, 10);\r
--\r
--\r
-- ntf.length = length;\r
-- ntf.group = group;\r
-- ntf.action = action;\r
--\r
-- if (length > 0)\r
-- {\r
-- ntf.has_data = 1;\r
--\r
-- ntf.data.data = g_malloc(length);\r
-- ntf.data.len = length;\r
-- memcpy(ntf.data.data, ijdata, length);\r
-- }\r
--\r
-- master.type = ECS__MASTER__TYPE__INJECTOR_NTF;\r
-- master.injector_ntf = &ntf;\r
--\r
-- send_to_ecp(&master);\r
--\r
-- if (ntf.data.data && ntf.data.len > 0)\r
-- {\r
-- g_free(ntf.data.data);\r
-- }\r
--\r
-- if (ntf.category)\r
-- g_free(ntf.category);\r
--\r
-- return true;\r
--}\r
--\r
--\r
- bool send_hostkeyboard_ntf(int is_on)\r
-bool send_device_ntf(const char* data, const int len)\r
--{\r
- ECS__Master master = ECS__MASTER__INIT;\r
- ECS__ControlMsg ctl = ECS__CONTROL_MSG__INIT;\r
- \r
- ECS__HostKeyboardNtf ntf = ECS__HOST_KEYBOARD_NTF__INIT;\r
- \r
- ntf.has_ison = 1;\r
- ntf.ison = is_on;\r
- \r
- ctl.type = ECS__CONTROL_MSG__CONTROL_TYPE__HOSTKEYBOARD_NTF;\r
- ctl.hostkeyboard_ntf = &ntf;\r
- \r
- master.type = ECS__MASTER__TYPE__CONTROL_MSG;\r
- master.control_msg = &ctl;\r
- \r
- return send_to_ecp(&master);\r
- return send_injector_ntf(data, len);\r
--}\r
--\r
++#include <stdbool.h>
++#include <pthread.h>
++
++#include "hw/qdev.h"
++#include "net/net.h"
++#include "ui/console.h"
++#include "migration/migration.h"
++#include "qapi/qmp/qint.h"
++#include "qapi/qmp/qbool.h"
++#include "qapi/qmp/qjson.h"
++#include "qapi/qmp/json-parser.h"
++#include "ui/qemu-spice.h"
++#include "qemu/queue.h"
++#include "qemu/option.h"
++#include "sysemu/char.h"
++#include "qemu/main-loop.h"
++
++#ifndef _WIN32
++#include <sys/epoll.h>
++#endif
++
++#include "qemu-common.h"
++//#include "qemu_socket.h"
++#include "sdb.h"
++#include "ecs-json-streamer.h"
++#include "qmp-commands.h"
++
++#include "ecs.h"
++#include "hw/maru_virtio_evdi.h"
++#include "hw/maru_virtio_sensor.h"
++#include "skin/maruskin_operation.h"
++
++// utility functions
++
++void* build_master(ECS__Master* master, int* payloadsize)
++{
++ int len_pack = ecs__master__get_packed_size(master);
++ *payloadsize = len_pack + 4;
++ LOG("pack size=%d", len_pack);
++ void* buf = g_malloc(len_pack + 4);
++ if (!buf)
++ return NULL;
++
++ ecs__master__pack(master, buf + 4);
++
++ len_pack = htonl(len_pack);
++ memcpy(buf, &len_pack, 4);
++
++ return buf;
++}
++
++bool send_to_ecp(ECS__Master* master)
++{
++ int payloadsize = 0;
++ void* buf = build_master(master, &payloadsize);
++ if (!buf)
++ {
++ LOG("invalid buf");
++ return false;
++ }
++
++ if (!send_to_all_client(buf, payloadsize))
++ return false;
++
++ if (buf)
++ {
++ g_free(buf);
++ }
++ return true;
++}
++
++
++// message handlers
++
++
++bool msgproc_start_req(ECS_Client* ccli, ECS__StartReq* msg)
++{
++ LOG("ecs_startinfo_req");
++
++
++ int hostkbd_status = mloop_evcmd_get_hostkbd_status();
++
++ LOG("hostkbd_status = %d", hostkbd_status);
++
++ send_start_ans(hostkbd_status);
++
++ return true;
++}
++
++bool msgproc_injector_req(ECS_Client* ccli, ECS__InjectorReq* msg)
++{
++ char cmd[10];
++ memset(cmd, 0, 10);
++ strcpy(cmd, msg->category);
++ type_length length = (type_length) msg->length;
++ type_group group = (type_group) (msg->group & 0xff);
++ type_action action = (type_action) (msg->action & 0xff);
++
++
++ int datalen = 0;
++ if (msg->has_data)
++ {
++ datalen = msg->data.len;
++ }
++ //LOG(">> count= %d", ++ijcount);
++
++ LOG(">> header = cmd = %s, length = %d, action=%d, group=%d", cmd, length,
++ action, group);
++
++
++ int sndlen = datalen + 14;
++ char* sndbuf = (char*) g_malloc(sndlen + 1);
++ 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);
++
++
++ if (msg->has_data)
++ {
++ if (msg->data.data && msg->data.len > 0)
++ {
++ const char* data = msg->data.data;
++ memcpy(sndbuf + 14, data, datalen);
++ LOG(">> print len = %d, data\" %s\"", strlen(data), data);
++ }
++ }
++
++
++ send_to_evdi(route_ij, sndbuf, sndlen);
++
++ g_free(sndbuf);
++
++ return true;
++}
++
++bool msgproc_control_msg(ECS_Client *cli, ECS__ControlMsg* msg)
++{
++ if (msg->type == ECS__CONTROL_MSG__CONTROL_TYPE__HOSTKEYBOARD_REQ)
++ {
++ ECS__HostKeyboardReq* hkr = msg->hostkeyboard_req;
++ if (!hkr)
++ return false;
++ msgproc_control_hostkeyboard_req(cli, hkr);
++ }
++
++ return true;
++}
++
++bool msgproc_monitor_req(ECS_Client *ccli, ECS__MonitorReq* msg)
++{
++
++ return true;
++}
++
++bool msgproc_device_req(ECS_Client* ccli, ECS__DeviceReq* msg)
++{
++ char cmd[10];
++ char* data;
++ memset(cmd, 0, 10);
++ strcpy(cmd, msg->category);
++ type_length length = (type_length) msg->length;
++ type_group group = (type_group) (msg->group & 0xff);
++ type_action action = (type_action) (msg->action & 0xff);
++
++ if (msg->has_data && msg->data.len > 0)
++ {
++ data = msg->data.data;
++ }
++
++ LOG(">> header = cmd = %s, length = %d, action=%d, group=%d", cmd, length,
++ action, group);
++
++ if (!strncmp(cmd, MSG_TYPE_SENSOR, 6)) {
++ if (group == MSG_GROUP_STATUS) {
++ if (action ==MSG_ACTION_ACCEL) {
++ get_sensor_accel();
++ } else if (action == MSG_ACTION_GYRO) {
++ get_sensor_gyro();
++ } else if (action == MSG_ACTION_MAG) {
++ get_sensor_mag();
++ } else if (action == MSG_ACTION_LIGHT) {
++ get_sensor_light();
++ } else if (action == MSG_ACTION_PROXI) {
++ get_sensor_proxi();
++ }
++ } else {
++ set_sensor_data(length, data);
++ }
++ }
++ else if (!strncmp(cmd, MSG_TYPE_NFC, 3)) {
++ if (group == MSG_GROUP_STATUS) {
++ send_to_nfc(request_get, data, length);
++ }
++ else
++ {
++ send_to_nfc(request_set, data, length);
++ }
++ }
++
++ return true;
++}
++
++bool msgproc_screen_dump_req(ECS_Client *ccli, ECS__ScreenDumpReq* msg)
++{
++
++ return true;
++}
++
++
++// begin control command
++
++void msgproc_control_hostkeyboard_req(ECS_Client *clii, ECS__HostKeyboardReq* req)
++{
++ int64_t is_on = req->ison;
++ onoff_host_kbd(is_on);
++}
++
++// end control command
++
++
++//
++
++bool ntf_to_injector(const char* data, const int len) {
++ type_length length = 0;
++ type_group group = 0;
++ type_action action = 0;
++
++ const int catsize = 10;
++ char cat[catsize + 1];
++ memset(cat, 0, catsize + 1);
++
++ read_val_str(data, cat, catsize);
++ read_val_short(data + catsize, &length);
++ read_val_char(data + catsize + 2, &group);
++ read_val_char(data + catsize + 2 + 1, &action);
++
++
++ const char* ijdata = (data + catsize + 2 + 1 + 1);
++
++ char *encoded_ijdata = NULL;
++ LOG("<< header cat = %s, length = %d, action=%d, group=%d", cat, length,
++ action, group);
++
++ if(!strcmp(cat, "telephony")) {
++ base64_encode(ijdata, length, &encoded_ijdata);
++ }
++
++ QDict* obj_header = qdict_new();
++ make_header(obj_header, length, group, action);
++
++ QDict* objData = qdict_new();
++ qobject_incref(QOBJECT(obj_header));
++
++ qdict_put(objData, "cat", qstring_from_str(cat));
++ qdict_put(objData, "header", obj_header);
++ if(!strcmp(cat, "telephony")) {
++ qdict_put(objData, "ijdata", qstring_from_str(encoded_ijdata));
++ } else {
++ qdict_put(objData, "ijdata", qstring_from_str(ijdata));
++ }
++
++ QDict* objMsg = qdict_new();
++ qobject_incref(QOBJECT(objData));
++
++ qdict_put(objMsg, "type", qstring_from_str("injector"));
++ qdict_put(objMsg, "result", qstring_from_str("success"));
++ qdict_put(objMsg, "data", objData);
++
++ QString *json;
++ json = qobject_to_json(QOBJECT(objMsg));
++
++ assert(json != NULL);
++
++ qstring_append_chr(json, '\n');
++ const char* snddata = qstring_get_str(json);
++
++ LOG("<< json str = %s", snddata);
++
++ send_to_all_client(snddata, strlen(snddata));
++
++ QDECREF(json);
++
++ QDECREF(obj_header);
++ QDECREF(objData);
++ QDECREF(objMsg);
++
++ return true;
++}
++
++bool send_start_ans(int host_keyboard_onff)
++{
++ ECS__Master master = ECS__MASTER__INIT;
++ ECS__StartAns ans = ECS__START_ANS__INIT;
++
++ ans.has_host_keyboard_onoff = 1;
++ ans.host_keyboard_onoff = host_keyboard_onff;
++
++ ans.has_camera_onoff = 1;
++ ans.camera_onoff = 1;
++
++ ans.has_earjack_onoff = 1;
++ ans.earjack_onoff = 1;
++
++ master.type = ECS__MASTER__TYPE__START_ANS;
++ master.start_ans = &ans;
++
++ return send_to_ecp(&master);
++}
++
++bool send_injector_ntf(const char* data, const int len)
++{
++ type_length length = 0;
++ type_group group = 0;
++ type_action action = 0;
++
++ const int catsize = 10;
++ char cat[catsize + 1];
++ memset(cat, 0, catsize + 1);
++
++ read_val_str(data, cat, catsize);
++ read_val_short(data + catsize, &length);
++ read_val_char(data + catsize + 2, &group);
++ read_val_char(data + catsize + 2 + 1, &action);
++
++
++ const char* ijdata = (data + catsize + 2 + 1 + 1);
++
++ LOG("<< header cat = %s, length = %d, action=%d, group=%d", cat, length,action, group);
++
++ ECS__Master master = ECS__MASTER__INIT;
++ ECS__InjectorNtf ntf = ECS__INJECTOR_NTF__INIT;
++
++ ntf.category = (char*) g_malloc(catsize + 1);
++ strncpy(ntf.category, cat, 10);
++
++
++ ntf.length = length;
++ ntf.group = group;
++ ntf.action = action;
++
++ if (length > 0)
++ {
++ ntf.has_data = 1;
++
++ ntf.data.data = g_malloc(length);
++ ntf.data.len = length;
++ memcpy(ntf.data.data, ijdata, length);
++ }
++
++ master.type = ECS__MASTER__TYPE__INJECTOR_NTF;
++ master.injector_ntf = &ntf;
++
++ send_to_ecp(&master);
++
++ if (ntf.data.data && ntf.data.len > 0)
++ {
++ g_free(ntf.data.data);
++ }
++
++ if (ntf.category)
++ g_free(ntf.category);
++
++ return true;
++}
++
++
++bool send_hostkeyboard_ntf(int is_on)
++{
++ ECS__Master master = ECS__MASTER__INIT;
++ ECS__ControlMsg ctl = ECS__CONTROL_MSG__INIT;
++
++ ECS__HostKeyboardNtf ntf = ECS__HOST_KEYBOARD_NTF__INIT;
++
++ ntf.has_ison = 1;
++ ntf.ison = is_on;
++
++ ctl.type = ECS__CONTROL_MSG__CONTROL_TYPE__HOSTKEYBOARD_NTF;
++ ctl.hostkeyboard_ntf = &ntf;
++
++ master.type = ECS__MASTER__TYPE__CONTROL_MSG;
++ master.control_msg = &ctl;
++
++ return send_to_ecp(&master);
++}
++
++
++bool send_device_ntf(const char* data, const int len)
++{
++ return send_injector_ntf(data, len);
++}
++