From b83dc29e99d5e4f3a9d378fc9c07213e9d277aca Mon Sep 17 00:00:00 2001 From: HuangXin Date: Thu, 5 Jul 2018 10:19:12 +0800 Subject: [PATCH] Init projects --- Example/global.db | Bin 0 -> 16384 bytes Example/main.c | 2039 ++++++++++++++++++++++ Framework/Compress/zlib.c | 110 ++ Framework/Configure/config_engine.c | 1042 +++++++++++ Framework/Configure/ini_prase.c | 217 +++ Framework/Crypto/aes.c | 104 ++ Framework/Crypto/base64.c | 158 ++ Framework/Crypto/crypto.c | 187 ++ Framework/Crypto/md5.c | 156 ++ Framework/Fifo/fifo.c | 554 ++++++ Framework/HeartDaemon/heart_daemon.c | 197 +++ Framework/JsonUtils/json_struct.c | 1218 +++++++++++++ Framework/Monitor/monitor.c | 347 ++++ Framework/Network/inet_api.c | 1396 +++++++++++++++ Framework/Network/inet_api.c.bak | 1327 ++++++++++++++ Framework/Skins/skin_res_vtbl.c | 320 ++++ Framework/Skins/skins.c | 1442 +++++++++++++++ Framework/SvrManager/svr_manager.c | 224 +++ Framework/Timer/timer.c | 769 ++++++++ Framework/WireshartScript/log_pv1.lua | 93 + Framework/libuvEngine/libuv_dbus.c | 2308 +++++++++++++++++++++++++ Makefile | 90 + Modules/Alarm/assistant.c | 789 +++++++++ Modules/ConfigServer/config_server.c | 210 +++ Modules/LogCtrl/log_ctrl.c | 323 ++++ Modules/OTA/ota.c | 1389 +++++++++++++++ Modules/voice/SrcApi.h | 75 + Modules/voice/data.pcm | Bin 0 -> 159990 bytes Modules/voice/demo.c | 93 + Modules/voice/libSRC.so | Bin 0 -> 3495452 bytes Modules/voice/voice | Bin 0 -> 10064 bytes build/Makefile.alarm.cross | 76 + build/Makefile.app.cross | 75 + build/Makefile.cfgsvr.cross | 68 + build/Makefile.def.cross | 2 + build/Makefile.lib.cross | 79 + build/Makefile.logctrl.cross | 76 + build/Makefile.ota.cross | 76 + build/Makefile.voice.cross | 72 + compile.sh | 4 + include/assistant.h | 168 ++ include/config_engine.h | 58 + include/crypto.h | 81 + include/fifo.h | 724 ++++++++ include/inet_api.h | 51 + include/json_struct.h | 150 ++ include/libuv_dbus.h | 225 +++ include/log.h | 233 +++ include/log_info.h | 13 + include/monitor.h | 21 + include/ota.h | 156 ++ include/server_addr.h | 48 + include/skins.h | 58 + include/skins_res.h | 294 ++++ include/smart_sound.h | 507 ++++++ linux32/inc/cjson/cJSON.h | 154 ++ linux32/inc/cjson/s2j.h | 91 + linux32/inc/cjson/s2jdef.h | 150 ++ linux32/inc/uthash/utarray.h | 238 +++ linux32/inc/uthash/uthash.h | 1107 ++++++++++++ linux32/inc/uthash/utlist.h | 1073 ++++++++++++ linux32/inc/uthash/utringbuffer.h | 108 ++ linux32/inc/uthash/utstring.h | 398 +++++ linux32/src/cJSON.c | 762 ++++++++ linux32/src/s2j.c | 52 + log/hexdump.c | 326 ++++ log/log.c | 1314 ++++++++++++++ 67 files changed, 26265 insertions(+) create mode 100644 Example/global.db create mode 100644 Example/main.c create mode 100644 Framework/Compress/zlib.c create mode 100644 Framework/Configure/config_engine.c create mode 100644 Framework/Configure/ini_prase.c create mode 100644 Framework/Crypto/aes.c create mode 100644 Framework/Crypto/base64.c create mode 100644 Framework/Crypto/crypto.c create mode 100644 Framework/Crypto/md5.c create mode 100644 Framework/Fifo/fifo.c create mode 100644 Framework/HeartDaemon/heart_daemon.c create mode 100644 Framework/JsonUtils/json_struct.c create mode 100644 Framework/Monitor/monitor.c create mode 100644 Framework/Network/inet_api.c create mode 100644 Framework/Network/inet_api.c.bak create mode 100644 Framework/Skins/skin_res_vtbl.c create mode 100644 Framework/Skins/skins.c create mode 100644 Framework/SvrManager/svr_manager.c create mode 100644 Framework/Timer/timer.c create mode 100644 Framework/WireshartScript/log_pv1.lua create mode 100644 Framework/libuvEngine/libuv_dbus.c create mode 100644 Makefile create mode 100644 Modules/Alarm/assistant.c create mode 100644 Modules/ConfigServer/config_server.c create mode 100644 Modules/LogCtrl/log_ctrl.c create mode 100644 Modules/OTA/ota.c create mode 100644 Modules/voice/SrcApi.h create mode 100644 Modules/voice/data.pcm create mode 100644 Modules/voice/demo.c create mode 100644 Modules/voice/libSRC.so create mode 100644 Modules/voice/voice create mode 100644 build/Makefile.alarm.cross create mode 100644 build/Makefile.app.cross create mode 100644 build/Makefile.cfgsvr.cross create mode 100644 build/Makefile.def.cross create mode 100644 build/Makefile.lib.cross create mode 100644 build/Makefile.logctrl.cross create mode 100644 build/Makefile.ota.cross create mode 100644 build/Makefile.voice.cross create mode 100755 compile.sh create mode 100644 include/assistant.h create mode 100644 include/config_engine.h create mode 100644 include/crypto.h create mode 100644 include/fifo.h create mode 100644 include/inet_api.h create mode 100644 include/json_struct.h create mode 100644 include/libuv_dbus.h create mode 100644 include/log.h create mode 100644 include/log_info.h create mode 100644 include/monitor.h create mode 100644 include/ota.h create mode 100644 include/server_addr.h create mode 100644 include/skins.h create mode 100644 include/skins_res.h create mode 100644 include/smart_sound.h create mode 100644 linux32/inc/cjson/cJSON.h create mode 100644 linux32/inc/cjson/s2j.h create mode 100644 linux32/inc/cjson/s2jdef.h create mode 100644 linux32/inc/uthash/utarray.h create mode 100644 linux32/inc/uthash/uthash.h create mode 100644 linux32/inc/uthash/utlist.h create mode 100644 linux32/inc/uthash/utringbuffer.h create mode 100644 linux32/inc/uthash/utstring.h create mode 100644 linux32/src/cJSON.c create mode 100644 linux32/src/s2j.c create mode 100644 log/hexdump.c create mode 100644 log/log.c diff --git a/Example/global.db b/Example/global.db new file mode 100644 index 0000000000000000000000000000000000000000..947d92fa9b42fe5b2d4f86fd57a4273b6e53fcd6 GIT binary patch literal 16384 zcmeI(J#W)M7zgmXI8L3A^ioA3sw%5DwrVMYs$wM+3nEfC4GtwN;b^Z(AhD_KsO^YQ zzW_5IgQZ^pcErwtgcw*50}>18D2GZUCOV=2Dbc<7xhLnJy!erFf2ZD$B|iwlp@{i9 zDH2M_P0k5XLqgK(s~c5=>AAl4x4uZ$ia!hN2Qg+}k=ak|o$Ama009U<00Izz00bZa z0SG_<0!pA^WGX8wv>l5l0~s9-)az*{l7}Pd?@dqBn@y+cIozw>sylotcF7k*xvF+9 zzj#b%Dz;5umc}^``r+_Mgi`mZKeFi6rP^(NzSUgMx#Ki>qgmUkHrxE3)8^Hdw_S79 z_ASTtR-efeSN){kF}xO^I_h}a~;L?DJF?^ z*z(m>rm|^M()ah}@dQGQ;$S@Q=zHp1(<4JcTgl^AU|&dvof7t*y=8CMYj(=MChKSr zfB*y_009U<00Izz00bZa0SH`>fNhz?zGAh?NpD-NNQOxT;aEKFjfCI5Y?@@zw(7y2 zi2H#b-BoLkdcmleHpzUM?#h0*7vH$PwvoyiCMnHjt6jOiQBIAMHAEC01>wFBVw_AJ zIX#y($wI~2l_KuRFzWSvnN#Z-c1GAo_5S~vow4ui!v) +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "log.h" +#include "libuv_dbus.h" +#include "crypto.h" +#include "json_struct.h" +#include "config_engine.h" +#include "ota.h" +#include "skins.h" +#include "assistant.h" +#include "inet_api.h" +#include "skins_res.h" +#include "server_addr.h" + +static MOD_INFO_TABLE g_ModInfo; +static uv_timer_t g_tmTest; +static uv_barrier_t g_tmSync; +static uv_loop_t* pUserLoop = NULL; +static int g_isExitLoop = 0; + +static void test_task_new(uv_thread_cb pCallback, void* pParams); + +static void OnCfgMsgCb(DBUS_CMD cmd, PCFG_ITEM pMsg, int err) +{ + fprintf(stdout, "Cmd = %d, Cfg = %s\n", cmd, pMsg->pKeyName); + + if(err != 0) + { + LOG_EX(LOG_Error, "Cmd %d Error: %d\n", cmd, err); + return; + } + + switch(cmd) + { + case CMD_CFG_GET_RSP: + CfgItemPrint("Add Configure: ", pMsg); + break; + } +} + +static void __dBusDeameonCb(MODULE_NAME modName, int status) +{ +#if 1 + if(status) + { + LOG_EX(LOG_Error, "Daemon(%d) Msg: [%s]\n", modName, status == 0 ? "Connect" : "Disconnect"); + } + else + { + LOG_EX(LOG_Info, "Daemon(%d) Msg: [%s]\n", modName, status == 0 ? "Connect" : "Disconnect"); + } +#endif + if(modName == MODULE_OTA && status == 0) + { + int ret = DBusSendToCommand(NULL, + g_pModInfoTable[MODULE_OTA].modAliase, + CMD_SYSTEM_STANDBY, "{\"status\" : 0}"); + + LOG_EX(LOG_Debug, "Send Standby Command: %d\n", ret); + } + + LOG_EX(LOG_Debug, "Set Exit Loop\n"); + g_isExitLoop = TRUE; +} + +static void KeyEventCb(uint16_t uType, uint16_t uKey, int32_t iValue) +{ + LOG_EX(LOG_Info, "type = %u, code = %u, value = %u\n", uType, uKey, iValue); +} + +static void __uvThreadOTA(void *pParams) +{ + OTA_DATA_INFO otaInfo; + POTA_DATA_INFO pInfo = NULL; + int ret; + int version = (int)(intptr_t)pParams; + + memset(&otaInfo, 0, sizeof(OTA_DATA_INFO)); + + if(version == 130) + { + otaInfo.version = 132; + strcpy(otaInfo.otaFileInfo.url, "http://10.241.0.70/tina/tina_r16_ota_132.tar.gz"); + strcpy(otaInfo.otaFileInfo.md5, "3bda58a2eb4e90fbb35b0d33db44cf57"); + otaInfo.otaFileInfo.size = 22966488; + } + else if(version == 132) + { + otaInfo.version = 133; + strcpy(otaInfo.otaFileInfo.url, "http://10.241.0.70/tina/tina_r16_ota_133.tar.gz"); + strcpy(otaInfo.otaFileInfo.md5, "c4085cb33d6dbd5ae5fdae948365023c"); + otaInfo.otaFileInfo.size = 22966524; + } + else + { + otaInfo.version = 4; + strcpy(otaInfo.otaFileInfo.url, "http://api.multimedia.netease.com/imgtest/ota/tina_r16_ota_133.tar.gz"); + strcpy(otaInfo.otaFileInfo.md5, "c4085cb33d6dbd5ae5fdae948365023c"); + otaInfo.otaFileInfo.size = 22963814; + } + + otaInfo.otaCmd = OTA_CMD_DOWNLOAD; + otaInfo.otaMode = OTA_MODE_FORCE_NOW; + + ret = DBusJsonSendToCommand(NULL, + g_pModInfoTable[MODULE_OTA].modAliase, + CMD_OTA_NOTIFY, + JSON_ENGINE_OTA_REQ, + &otaInfo, TRUE); + + LOG_EX(LOG_Debug, "Send OTA Command: OTA_CMD_DOWNLOAD --> %d\n", ret); +} + +#if 0 +static void __radomAlarmItem(PASSISTANT_ITEM_INFO pInfo) +{ + static unsigned int alarmId = 0; + time_t tmVal = time(NULL); + struct tm *pTmNow = localtime(&tmVal); + + if(pInfo == NULL) + { + return; + } + + memset(pInfo, 0, sizeof(ALARM_ITEM_INFO)); + + pInfo->alarmId = __sync_fetch_and_add(&alarmId, 1); + pInfo->itemType = (random() % 2 == 0) ? ALARM_TYPE_REMAIND : ALARM_TYPE_CLOCK; + pInfo->priority = random() % 10; + pInfo->repeatMode = random() % (REPEAT_MODE_EVERY_YEAR_DAY + 1); + + pTmNow->tm_hour = random() % 24; + pTmNow->tm_min = random() % 60; + + //strftime(pInfo->strDateTime, MAX_DT_LEN, "%Y-%m-%d %H:%M", pTmNow); + sprintf(pInfo->strTips, "TTS %llu", pInfo->itemId); +} +#endif + +static PDBUS_MSG_PACK DBusOnMessage(uv_loop_t* pLoop, DBusConnection* pConn, PDBUS_MSG_PACK pMsg) +{ + int i, ret, err; + uint32_t tm = LIBUV_CURRENT_TIME_US(); + PCFG_API_RSP pRsp = NULL; + POTA_RSP_STATUS pOTAStatus = NULL; + //PALARM_RSP_STATUS pAlarmStatus = NULL; + //PALARM_SYNC_INFO pSyncInfo = NULL; + static unsigned int iCnt = 0; + + if(!pMsg || !pLoop || !pConn) + { + return NULL; + } + +#if 1 + if(iCnt++ % 1000 == 0) + { + LOG_EX(LOG_Info, "Receive: %s\n", pMsg->pMsg); + } +#endif + + //LOG_EX(LOG_Info, "Process Message(%u --> 0x%08X) at [%lu.%06lu]: cmd = %u, size = %u, key = %d, msg(%d) = [%s]\n", + // pMsg->msgSrc, pMsg->msgDests, tm / 1000000, tm % 1000000, pMsg->busCmd, pMsg->msgSize, pMsg->msgKey, pMsg->msgSize, pMsg->pMsg); + + switch(pMsg->busCmd) + { + case CMD_CALL_DIAL: + LOG_EX(LOG_Debug, "Recv: %s\n", pMsg->pMsg); + break; + + case CMD_MISC_OTA: + print_hex_dump_bytes("OTA", DUMP_PREFIX_ADDRESS, pMsg->pMsg, (pMsg->msgSize > 128) ? 128 : pMsg->msgSize); + break; + + case CMD_CFG_GET_RSP: + pRsp = (PCFG_API_RSP)Json2Struct(pMsg->pMsg, JSON_ENGINE_CFG_RSP, TRUE, &err); + + if(pRsp == NULL || err != 0) + { + LOG_EX(LOG_Error, "CMD_CFG_GET: pRsp = %p, err = %d\n", pRsp, err); + return (NULL); + } + + LOG_EX(LOG_Debug, "Get Configure: [%s](%d) --> \"%s\"\n", pRsp->keyName, pRsp->keyType, pRsp->keyValue); + + free(pRsp); + break; + + case CMD_OTA_STATUS: + pOTAStatus = (POTA_RSP_STATUS)Json2Struct(pMsg->pMsg, JSON_ENGINE_OTA_RSP, TRUE, &err); + + LOG_EX(LOG_Debug, "%s --> %d(0x%08X)\n", otaStatusName(pOTAStatus->status), pOTAStatus->val, pOTAStatus->val); + + if(pOTAStatus->status == OTA_CURRENT_VERSION) + { + test_task_new(__uvThreadOTA, (void*)(intptr_t)pOTAStatus->val); + } + + free(pOTAStatus); + break; + + case CMD_ALARM_SYNC_REQ: + LOG_EX(LOG_Debug, "Receive CMD_ALARM_SYNC_REQ Command\n"); + + if(iCnt++ > 0) + { + break; + } +#if 0 + const char *pAddCmd = "{\"data\":[{\"createTime\":1509419640000,\"id\":672,\"label\":1,\"type\":8,\"status\":1," + "\"updateTime\":1509419640000,\"vboxDate\":{\"dayofMonth\":\"17\",\"dayofWeek\":" + "\"1,2,3,4,5\",\"hour\":\"0\",\"minute\":\"0\",\"month\":\"11\",\"second\":\"10\",\"year\":\"\"}," + "\"vboxid\":\"0-52AEDB2DF9F45FEB\",\"voiceName\":\"音效2\",\"voiceType\":2}," + "{\"createTime\":1509419547000,\"id\":671,\"label\":0,\"type\":1,\"status\":1,\"updateTime\":" + "1509419547000,\"vboxDate\":{\"dayofMonth\":\"\",\"dayofWeek\":\"\",\"hour\":\"0\"," + "\"minute\":\"0\",\"month\":\"\",\"second\":\"10\",\"year\":\"\"},\"vboxid\":\"0-52AEDB2DF9F45FEB\"," + "\"voiceName\":\"音效2\",\"voiceType\":2}]}"; +#else +#if 0 + const char *pAddCmd = "{\"data\":[{\"id\":6734,\"vboxid\":\"0-D04CDF28BB622AF7\",\"label\":0," + "\"type\":1,\"voiceType\":1,\"voiceName\":\"音效1\",\"status\":2," + "\"updateTime\":1515576709000,\"createTime\":1515576709000," + "\"vboxDate\":{\"second\":\"0\",\"minute\":\"41\",\"hour\":\"18\"," + "\"dayofMonth\":\"10\",\"month\":\"1\",\"dayofWeek\":\"3\",\"year\":" + "\"2018\"}},{\"id\":6733,\"vboxid\":\"0-D04CDF28BB622AF7\",\"label\":0," + "\"type\":1,\"voiceType\":1,\"voiceName\":\"音效1\",\"status\":2," + "\"updateTime\":1515576701000,\"createTime\":1515576701000,\"vboxDate\":" + "{\"second\":\"0\",\"minute\":\"42\",\"hour\":\"18\",\"dayofMonth\":\"10\"," + "\"month\":\"1\",\"dayofWeek\":\"3\",\"year\":\"2018\"}}]}"; +#else + const char *pAddCmd = "{\"data\":[{\"id\":8136,\"vboxid\":\"0-ADC8ED8631B2032D\",\"label\":0," + "\"type\":3,\"voiceType\":1,\"voiceName\":\"音效1\",\"status\":2," + "\"updateTime\":1520841240000,\"createTime\":1520841240000," + "\"vboxDate\":{\"second\":\"\",\"minute\":\"56\",\"hour\":\"9\"," + "\"dayofMonth\":\"13\",\"month\":\"3\",\"dayofWeek\":\"2\"," + "\"year\":\"2018\"}}]}"; +#endif +#endif +#if 0 + ALARM_SYNC_INFO alarmInfo; + ALARM_REMOVE_INFO rmInfo; + + memset(&alarmInfo, 0, sizeof(ALARM_SYNC_INFO)); + memset(&rmInfo, 0, sizeof(ALARM_REMOVE_INFO)); + + alarmInfo.nItems = 10; + //alarmInfo.cmd = CMD_ALARM_SYNC_RSP; + alarmInfo.pAlarmInfo = (PALARM_ITEM_INFO)malloc(sizeof(ALARM_ITEM_INFO) * 10); + + for(i = 0; i < 10; i++) + { + __radomAlarmItem(&alarmInfo.pAlarmInfo[i]); + } + + + ret = DBusJsonSendToCommand(NULL, + g_pModInfoTable[MODULE_ALARM].modAliase, + CMD_ALARM_SYNC_RSP, + JSON_ENGINE_ALARM_SYNC_RSP, + &alarmInfo, TRUE); +#endif + ret = DBusSendToCommand(NULL, + g_pModInfoTable[MODULE_ALARM].modAliase, + CMD_ALARM_SYNC_RSP, + pAddCmd); + + LOG_EX(LOG_Debug, "Send Alarm Command: JSON_ENGINE_ALARM_SYNC_RSP --> %d\n", ret); +#if 0 + rmInfo.nItems = 3; + + for(i = 0; i < 3; i++) + { + // rmInfo.rmItemId[i] = alarmInfo.pAlarmInfo[i * 2].alarmId; + } + + ret = DBusJsonSendToCommand(NULL, + g_pModInfoTable[MODULE_ALARM].modAliase, + CMD_ALARM_REMOVE, + JSON_ENGINE_ALARM_REMOVE, + &rmInfo, TRUE); + + LOG_EX(LOG_Debug, "Send Alarm Command: JSON_ENGINE_ALARM_SYNC_RSP --> %d\n", ret); + + free(alarmInfo.pAlarmInfo); +#endif + break; +#if 0 + case CMD_ALARM_STATUS: + //LOG_EX(LOG_Debug, "CMD_ALARM_STATUS: %s\n", (const char *)pMsg->pMsg); + pAlarmStatus = (PALARM_RSP_STATUS)Json2Struct(pMsg->pMsg, JSON_ENGINE_ALARM_STATUS, TRUE, &err); + LOG_EX(LOG_Debug, "%s --> %d(0x%08X)\n", alarmStatusName(pAlarmStatus->cmd), pAlarmStatus->val, pAlarmStatus->val); + + free(pAlarmStatus); + break; + + case CMD_ALARM_NOTIFY_EVT: + //LOG_EX(LOG_Debug, "CMD_ALARM_NOTIFY_EVT: %s\n", (const char *)pMsg->pMsg); + pSyncInfo = (PALARM_SYNC_INFO)Json2Struct((const char *)pMsg->pMsg, JSON_ENGINE_ALARM_SYNC_RSP, TRUE, &err); + + if(pSyncInfo) + { + __printAlarmSyncInfo("CMD_ALARM_NOTIFY_EVT", pSyncInfo); + free(pSyncInfo); + } + + break; +#endif + default: + break; + } + + return NULL; +} + +static unsigned int g_Delay = 1000; +static void uvSndLessCb(uv_timer_t* pTimer) +{ +#if 0 + DBusConnection* pBus = (DBusConnection*)pTimer->data; + unsigned char* pData = (unsigned char*)malloc(2048); + + memset(pData, 0x3f, 2048); + *pData = 0; + + if(g_ModInfo.modName != MODULE_CONTROLLER) + { + DBusSendToCommand(pBus, g_pModInfoTable[MODULE_CONTROLLER].modAliase, CMD_MISC_OTA, pData, 2048); + } + + free(pData); +#endif + LOG_EX(LOG_Info, "Timer Runing delay = %u ....\n", g_Delay); + uv_barrier_wait(&g_tmSync); +// AESEncrypto(); + +} + +#define TEST_AES_LEN (93) + +void test_evp_aes(void) +{ + int i; + unsigned char enData[ALIGN_AES_BLOCK(TEST_AES_LEN)]; + unsigned char* pData = (unsigned char*)malloc(ALIGN_AES_BLOCK(TEST_AES_LEN)); + int outSize = 0; + char* pKey = "0123456789abcedf"; + + for(i = 0; i < TEST_AES_LEN; i++) + { + enData[i] = i % 0xFF; + } + + strcpy(enData, "hello world"); + + fprintf(stdout, "EvpAESEncrypto: %s\n", + EvpAESEncrypto(enData, TEST_AES_LEN, pData, &outSize, (unsigned char*)pKey) == 0 ? "Success" : "Fail"); + + print_hex_dump_bytes("en_", 2, pData, outSize); + fprintf(stdout, "enc: %s --> %s\n",enData, EvpBase64EncodeNoAlignV2(pData, outSize)); + + memset(enData, 0, ALIGN_AES_BLOCK(TEST_AES_LEN)); + + fprintf(stdout, "EvpAESDecrypto: %s\n", + EvpAESDecrypto(pData, outSize, enData, &outSize, (unsigned char*)pKey) == 0 ? "Success" : "Fail"); + + fprintf(stdout, "dec:%s\n", (char*)enData); + free(pData); +} + +static void uvTimeoutCb(uv_timer_t* pTimer) +{ + PCFG_ITEM pItem = NULL; + + int ret = 0; + + if((ret = CfgGetKeyValue("Age", &pItem)) == 0) + { + CfgItemPrint("Get KeyValue: ", pItem); + } + else + { + LOG_EX(LOG_Error, "Get Key [Age] Error: %d\n", ret); + } +} + +static void EVPEncryptCb(CRYPTO_TYPE type, + const unsigned char* pData, + int iSize, + const unsigned char* pSrcData, + int iError) +{ + int i = 0; + + if(iError == 0) + { + if(type == CRYPTO_AES_ENCRYPT) + { + char* pKey = "xajhuang12345678"; + unsigned char* enData = (unsigned char*)malloc(ALIGN_AES_BLOCK(TEST_AES_LEN)); + + memset(enData, 0, ALIGN_AES_BLOCK(TEST_AES_LEN)); + + print_hex_dump_bytes("AES_Encrypt_", DUMP_PREFIX_ADDRESS, pData, iSize); + + i = EvpAddCryptoTask(CRYPTO_AES_DECRYPT, (unsigned char*)pData, iSize, enData, pKey, EVPEncryptCb); + + if(i != 0) + { + free(enData); + LOG_EX(LOG_Error, "EvpAddCryptoTask Error: %d\n", i); + } + } + else if(type == CRYPTO_AES_DECRYPT) + { + print_hex_dump_bytes("AES_Decrypt_", DUMP_PREFIX_ADDRESS, pData, iSize); + } + else if(type == CRYPTO_BASE64_ENCODE) + { + int ret = 0; + + LOG_EX(LOG_Info, "Base64(%d):[\n%s]\n", iSize, (char*)pData); + ret = EvpAddCryptoTask(CRYPTO_BASE64_DECODE, (unsigned char*)pData, iSize, NULL, NULL, EVPEncryptCb); + + if(ret != 0) + { + LOG_EX(LOG_Error, "EvpAddCryptoTask Error: %d\n", ret); + } + } + else if(type == CRYPTO_BASE64_DECODE) + { + LOG_EX(LOG_Info, "Base64(%d):[\n%s]\n", iSize, (char*)pData); + } + else if(type == CRYPTO_MD5_FILE) + { + LOG_EX(LOG_Info, "%s MD5 value [%s]\n", (char*)pSrcData, (char*)pData); + } + } + else + { + LOG_EX(LOG_Error, "pData = %p, iError = %d\n", pData, iError); + } + + free((void*)pData); +} + +static void test_aes_async(void) +{ + int i; + unsigned char enData[ALIGN_AES_BLOCK(TEST_AES_LEN)]; + unsigned char* pData = (unsigned char*)malloc(ALIGN_AES_BLOCK(TEST_AES_LEN)); + int outSize = 0; + char* pKey = "xajhuang12345678"; + + for(i = 0; i < TEST_AES_LEN; i++) + { + enData[i] = i % 0xFF; + } + + i = EvpAddCryptoTask(CRYPTO_BASE64_ENCODE, enData, TEST_AES_LEN, pData, pKey, EVPEncryptCb); + + if(i != 0) + { + LOG_EX(LOG_Error, "EvpAddCryptoTask Error: %d\n", i); + free(pData); + } + +} + +static void test_base64_async(void) +{ + int ret = 0; +#if 1 + const char* pSrc = "Wikiversity is a Wikimedia Foundation project devoted to learning resources, learning projects, \ +and research for use in all levels, types, and styles of education from pre-school to university, including professional \ +training and informal learning. We invite teachers, students, and researchers to join us in creating open educational \ +resources and collaborative learning communities. \ +This page is an index of all Wikiversity help and maintenance pages. The following articles contain guidance and \ +information about Editing, Policies and guidelines, and participating in the Wikiversity community. \ +Having trouble finding out what you need to know? If it is not covered by the FAQ, try asking at the Colloquium."; +#else + const char *pSrc = "http://www.164.com"; +#endif + const char *pBase64 = EvpBase64EncodeNoAlign(pSrc); + const char *pDecode = EvpBase64DecodeNoAlign(pBase64); + + fprintf(stdout, "Encode:\n%s\n", pBase64); + fprintf(stdout, "Decode:\n%s\n", pDecode); + +#if 0 + ret = EvpAddCryptoTask(CRYPTO_BASE64_ENCODE, (unsigned char*)pSrc, strlen(pSrc), NULL, NULL, EVPEncryptCb); + + if(ret != 0) + { + LOG_EX(LOG_Error, "EvpAddCryptoTask Error: %d\n", ret); + } +#endif + +} + +static void test_md5file_async(void) +{ + int ret = 0; + const char* pFile = "/root/time.txt"; + + ret = EvpAddCryptoTask(CRYPTO_MD5_FILE, (unsigned char*)pFile, strlen(pFile), NULL, NULL, EVPEncryptCb); + + if(ret != 0) + { + LOG_EX(LOG_Error, "EvpAddCryptoTask Error: %d\n", ret); + } +} + +static void test_s2j_task(void) +{ + PLAYER_TO_CTRL plyCtl; + PPLAYER_TO_CTRL pPlyCtl = NULL; + int err; + const char* pJson = NULL; + + strcpy(plyCtl.musicUuid, "http://www.164.com"); + plyCtl.plySt = 1; + plyCtl.curPos = 12133; + plyCtl.duration = 321000; + + pJson = Struct2Json(&plyCtl, JSON_ENGINE_P2C, TRUE, &err); + + if(pJson != NULL) + { + LOG_EX(LOG_Debug, "Json:\n %s\n", pJson); + + pPlyCtl = (PPLAYER_TO_CTRL)Json2Struct(pJson, JSON_ENGINE_P2C, TRUE, &err); + + if(pPlyCtl != NULL) + { + LOG_EX(LOG_Debug, "Struct:\nmusicUuid: %s\nplySt: %d\ncurPos: %d\nduration: %d\n", + pPlyCtl->musicUuid, pPlyCtl->plySt, pPlyCtl->curPos, pPlyCtl->duration); + + free(pPlyCtl); + } + else + { + LOG_EX(LOG_Debug, "Json2Struct Test Error\n"); + } + + free((void*)pJson); + } + else + { + LOG_EX(LOG_Debug, "test error\n"); + } +} + +extern const char* __ota_Notify_REQ2Json(void *pData); +extern void* __json2OTA_Notify_REQ(const char *pJsonS); +static void __uvThreadTestOTA(void *pParam) +{ + int err = 0, i = 0; + int ret; + const char *pMD5 = NULL; + + char* strMenu[] = { + "Usage:\n", + + "OTA Cmd download : download\n", + "OTA Cmd local : local\n", + "OTA Cmd exec : exec\n", + "Batch Test : batch\n", + "Set Config : ready\n", + "Exit : quit\n", + }; + + while(TRUE) + { + char *pInput = NULL; + char *pSub = NULL; + + + for(i = 0; i < sizeof(strMenu) / sizeof(strMenu[0]); i++) + { + fprintf(stdout, "%s", strMenu[i]); + } + + pInput = readline("Please Choise:"); + + if(pInput == NULL) + { + continue; + } + + pSub = strtok(pInput, " "); + i = 0; + + while(pSub != NULL) + { + OTA_DATA_INFO otaInfo; + POTA_DATA_INFO pInfo = NULL; + + memset(&otaInfo, 0, sizeof(OTA_DATA_INFO)); + + otaInfo.version = 1; + + if(strcmp(pSub, "download") == 0) + { + otaInfo.otaCmd = OTA_CMD_DOWNLOAD; + otaInfo.otaMode = OTA_MODE_NORMAL; + otaInfo.otaFileInfo.size = 21484772; + strcpy(otaInfo.otaFileInfo.url, "http://10.241.0.70/tina/tina_r16_ota.tar.gz"); + strcpy(otaInfo.otaFileInfo.md5, "2d58366a0846f6345730e28b021816d0"); + + ret = DBusJsonSendToCommand(NULL, + g_pModInfoTable[MODULE_OTA].modAliase, + CMD_OTA_NOTIFY, + JSON_ENGINE_OTA_REQ, + &otaInfo, TRUE); + + LOG_EX(LOG_Debug, "Send OTA Command %s: %d\n", pSub, ret); + } + else if(strcmp(pSub, "local") == 0) + { + otaInfo.otaCmd = OTA_CMD_USED_LOCAL_IMAGE; + otaInfo.otaMode = OTA_MODE_FORCE_NOW; + + ret = DBusJsonSendToCommand(NULL, + g_pModInfoTable[MODULE_OTA].modAliase, + CMD_OTA_NOTIFY, + JSON_ENGINE_OTA_REQ, + &otaInfo, TRUE); + + LOG_EX(LOG_Debug, "Send OTA Command %s: %d\n", pSub, ret); + } + else if(strcmp(pSub, "exec") == 0) + { + otaInfo.otaCmd = OTA_CMD_EXEC; + otaInfo.otaMode = OTA_MODE_FORCE_NOW; + + ret = DBusJsonSendToCommand(NULL, + g_pModInfoTable[MODULE_OTA].modAliase, + CMD_OTA_NOTIFY, + JSON_ENGINE_OTA_REQ, + &otaInfo, TRUE); + + LOG_EX(LOG_Debug, "Send OTA Command %s: %d\n", pSub, ret); + } + else if(strcmp(pSub, "batch") == 0) + { +#if 0 + int err; + POTA_DATA_INFO pInfo = NULL; + const char *pJson = NULL; +#endif + +#if 0 + pJson = Struct2Json(&otaInfo, JSON_ENGINE_OTA_REQ, TRUE, &err); + fprintf(stdout, "Json(%p->%d): \n%s\n", &otaInfo, err, pJson); + + + + pInfo = (POTA_DATA_INFO)Json2Struct(pJson, JSON_ENGINE_OTA_REQ, TRUE, &err); + if(pInfo) + { + fprintf(stdout, "JsonInfo: \n%s\n", __ota_Notify_REQ2Json(pInfo)); + } + +#else + pMD5 = EvpMD5HashBufV2((const unsigned char *)&otaInfo, sizeof(OTA_DATA_INFO)); + + err = 0; + for(i = 0; i < 1000000; i++) + { + POTA_DATA_INFO pOInfo = (POTA_DATA_INFO)malloc(sizeof(OTA_DATA_INFO)); + + memcpy(pOInfo, &otaInfo, sizeof(OTA_DATA_INFO)); + + ret = DBusJsonSendToCommand(NULL, + g_pModInfoTable[MODULE_OTA].modAliase, + CMD_OTA_NOTIFY, + JSON_ENGINE_OTA_REQ, + pOInfo, TRUE); + + free(pOInfo); + + if(ret != 0) + { + err++; + break; + //fprintf(stderr, "ret = %d\n", ret); + } + + + + //fprintf(stdout, "send [%d]: %d\n", i, err); + //LOG_EX(LOG_Debug, "Send OTA Command: %d\n", ret); + //usleep(1000); + } + + fprintf(stdout, "%s\n", pMD5); + free((void*)pMD5); + //fprintf(stdout, "send [%d]: %d\n", i, err); +#endif + } + else if(strcmp(pSub, "ready") == 0) + { + ret = DBusSendToCommand(NULL, + g_pModInfoTable[MODULE_OTA].modAliase, + CMD_SYSTEM_STANDBY, "{\"status\" : 0}"); + + LOG_EX(LOG_Debug, "Send Standby Command: %d\n", ret); + } + else if(strcmp(pSub, "quit") == 0) + { + return; + } + + pSub = strtok(NULL, " "); + } + + free(pInput); + + usleep(1000); + } +} + +static void __uvThreadTimer(void *pParams) +{ + while(TRUE) + { + uv_barrier_init(&g_tmSync, 2); + + g_Delay += 1000; + uv_timer_stop(&g_tmTest); + LOG_EX(LOG_Info, "Re Start Timer %u...\n", g_Delay); + uv_timer_start(&g_tmTest, uvSndLessCb, g_Delay, 0); + + uv_barrier_wait(&g_tmSync); + uv_barrier_destroy(&g_tmSync); + + sleep(1); + } +} + +static void __uvThreadTestConfigure(void *pParams) +{ + int i = 0; + int ret; + + char* g_Menu[] = { + "Usage:\n", + "Get Config : get \n", + "Set Config : set \n", + "Change Config : change \n", + "Exit: quit\n", + }; + + while(TRUE) + { + char *pInput = NULL; + char *pSub = NULL; + + + for(i = 0; i < sizeof(g_Menu) / sizeof(g_Menu[0]); i++) + { + fprintf(stdout, "%s", g_Menu[i]); + } + + pInput = readline("Please Choise:"); + + if(pInput == NULL) + { + continue; + } + + pSub = strtok(pInput, " "); + i = 0; + + while(pSub != NULL) + { + if(strcmp(pSub, "get") == 0) + { + char* pKeyName = strtok(NULL, " "); + + if(pKeyName != NULL && strlen(pKeyName) > 0) + { + CFG_ITEM* pCfg; + ret = CfgGetKeyValue(pKeyName, &pCfg); + + if(ret == 0) + { + CfgItemPrint("GetLocalCfg: ", pCfg); + } + else if(ret == -ERR_CFG_WAIT_RSP) + { + LOG_EX(LOG_Debug, "Wait for server response\n"); + } + else + { + LOG_EX(LOG_Error, "Get Configure [%s] Error: %d\n", pKeyName, ret); + } + } + } + else if(strcmp(pSub, "set") == 0) + { + char* pKeyName = strtok(NULL, " "); + char *pKeyType = strtok(NULL, " "); + char* pKeyValue = strtok(NULL, " "); + char* pSaveTo = strtok(NULL, " "); + + if(pKeyName && pKeyValue && pKeyType && pSaveTo + && strlen(pKeyName) > 0 && strlen(pKeyValue) > 0 && strlen(pKeyType) > 0 && strlen(pSaveTo) > 0) + { + CFG_ITEM item; + + item.pKeyName = pKeyName; + item.keyType = strtoul(pKeyType, NULL, 10); + + if(item.keyType == CFG_TYPE_STRING) + { + item.pStrValue = pKeyValue; + } + else if(item.keyType == CFG_TYPE_INT) + { + item.intValue = strtol(pKeyValue, NULL, 10); + } + else if(item.keyType == CFG_TYPE_DOUBLE) + { + item.doubleValue = strtod(pKeyValue, NULL); + } + + ret = CfgAddKeyValue(pKeyName, &item, strtol(pSaveTo, NULL, 10)); + + if(ret == 0) + { + CfgItemPrint("Add Configure: ", &item); + } + else + { + LOG_EX(LOG_Error, "Add Configure [%s] Error: %d\n", pKeyName, ret); + } + } + } + else if(strcmp(pSub, "quit") == 0) + { + return; + } + + pSub = strtok(NULL, " "); + } + + usleep(1000); + } +} + +static void test_task_new(uv_thread_cb pCallback, void* pParams) +{ + uv_thread_t uvSyncThread; + + uv_thread_create(&uvSyncThread, pCallback, pParams); +} + +#define WAKE_CACHE_SIZE (10) + +static unsigned char g_AudioCache[WAKE_CACHE_SIZE]; +static unsigned int g_wtPos = 0; +static unsigned int g_tolCache = 0; + +static void __cacheCAEAudio(unsigned char* pBuf, unsigned int iSize) +{ + if(iSize > WAKE_CACHE_SIZE) + { + return; + } + + memmove(g_AudioCache, g_AudioCache + iSize, WAKE_CACHE_SIZE - iSize); + memcpy(g_AudioCache + WAKE_CACHE_SIZE - iSize, pBuf, iSize); +} + +static void test_move_data(void) +{ + +} + +static void __onAlarmCb(unsigned int tmId, unsigned int status, void *pUserData) +{ + LOG_EX(LOG_Debug, "Time %u On......\n", tmId); +} + +static int g_isExitApp = FALSE; + +static void uvExitLoopCb(uv_timer_t *pParams) +{ + DEBUG_CODE_LINE(); + uv_stop(GetDBusDefaultLoop()); +} + +static void __uvLoopExit(void *pParams) +{ + int ret = 0; + uv_timer_t tmExit; + uv_loop_t* pLoop = GetDBusDefaultLoop(); + DBusConnection* pBus = DBusWithLibuvInit(pLoop, g_ModInfo.modAliase, + DBusOnMessage, + __dBusDeameonCb, + NULL, //KeyEventCb, + &ret); + + if(pBus == NULL) + { + fprintf(stderr, "DBusWithLibuvInit Error: %d\n", ret); + return; + } + + DBusBoardcastCommand(NULL, 0x11, 10, "xajhuang"); + + //test_task_new(uvExitLoopCb, NULL); + uv_timer_init(pLoop, &tmExit); + uv_timer_start(&tmExit, uvExitLoopCb, 3000, 3000); + + DEBUG_CODE_LINE(); + //RunUVLoop(pLoop); + uv_run(pLoop, UV_RUN_DEFAULT); + //uv_loop_close(pLoop); + DEBUG_CODE_LINE(); + + g_isExitApp = TRUE; + return; +} + +static void __fs_event_handle_cb(uv_fs_event_t *pEvent, const char *pFileName, int events, int status) +{ + char path[MAX_PATH]; + size_t pathSize = MAX_PATH - 1; + + memset(path, 0, MAX_PATH); + uv_fs_event_getpath(pEvent, path, &pathSize); + + fprintf(stdout, "%s: %d, %d\n", path, events, status); +} + +static void __onPrgCb(const char *pReqUrl, const char *pTaskUuid, unsigned char uPercent, void *pUserData) +{ + static unsigned char preCnt = 0; + + if(preCnt != uPercent) + { + preCnt = uPercent; + LOG_EX(LOG_Debug, "[%s](%s): %u%%\n", pReqUrl, pTaskUuid, uPercent); + } + + if(uPercent > 50) + { + //InetCancelDownload(pTaskUuid); + } +} + +static unsigned int g_DlCount = 0; +static void __onDlCb(void *pData, unsigned int size, const char *pReqUrl, const char* pDlPath, const char *pTaskUuid, int iFinished, void *pUserData) +{ + if(g_DlCount > 0) + { + g_DlCount--; + } + + if(iFinished == 0) + { + LOG_EX(LOG_Debug, "Request(%s): [%s] --> [%s] Response: [%u] OK\n", pTaskUuid, pReqUrl, pDlPath, size); + } + else if(iFinished == 1) + { + LOG_EX(LOG_Error, "Request(%s): [%s] --> [%s] Response: [%u] Error\n", pTaskUuid, pReqUrl, pDlPath, size); + } + else + { + LOG_EX(LOG_Error, "Download Error Code: %d\n", iFinished); + } +#if 1 + if(iFinished != 0) + { + const char* pId = InetHttpDlFileAsync(pReqUrl, + pDlPath, + __onDlCb, + NULL,//__onPrgCb, + NULL); + + LOG_EX(LOG_Debug, "Download ID: %s\n", pId); + } +#endif +} + +static void __uvTestSkin(void *pParams) +{ + int tolItems = sizeof(g_SkinDefaultResTable) / sizeof(g_SkinDefaultResTable[0]); +#if 0 + char *pUpg = "[ \ + { \ + \"createTime\": 1510570174000, \ + \"enable\": 1, \ + \"id\": 3, \ + \"md5\": \"af065860c3667ca2508c283d660990f7\", \ + \"osType\": 0, \ + \"remark\": \"音效1文件\", \ + \"resourceName\": \"v111\", \ + \"resourceType\": 1, \ + \"resourceVersion\": \"v0.3.1\", \ + \"size\": 164460, \ + \"updateTime\": 1510570227000, \ + \"url\": \"http://vbox-resource.nos.netease.com/d627159f-bccd-4364-bccc-f196c2b83ffd.mp3\", \ + \"versionId\": 10, \ + \"versionName\": \"0.0.9\", \ + \"versionOsType\": \"0\" \ + } ]"; +#endif +#if 0 + static int i = 0; + + while(i++ < 100) + { + char *pKeyName = (char*)(g_SkinDefaultResTable[random() % tolItems].pKeyName); + char *pResPath = GetSkinsResource(pKeyName, NULL, NULL, NULL); + LOG_EX(LOG_Debug, "[%s] = {%s}\n", pKeyName, pResPath); + + free(pResPath); + sleep(3); + } +#else + for(int i = 0; i < tolItems; i++) + { + int tmUsed = 0; + struct timeval tmStart, tmEnd; + char *pKeyName = (char*)(g_SkinDefaultResTable[i].pKeyName); + char *pResPath = NULL; + + gettimeofday(&tmStart, NULL); + pResPath = GetSkinsResource(pKeyName, NULL, NULL, NULL); + gettimeofday(&tmEnd, NULL); + + tmUsed = (tmEnd.tv_sec * 1000000 + tmEnd.tv_usec) - (tmStart.tv_sec * 1000000 + tmStart.tv_usec); + LOG_EX(LOG_Debug, "(%d):[%s] = {%s}\n", tmUsed, pKeyName, pResPath); + + free(pResPath); + } +#if 0 + fprintf(stdout, "-----------------------\n"); + for(int i = 0; i < tolItems; i++) + { + int tmUsed = 0; + struct timeval tmStart, tmEnd; + char *pKeyName = (char*)(g_SkinDefaultResTable[i].pKeyName); + char *pResPath = NULL; + + gettimeofday(&tmStart, NULL); + pResPath = GetSkinsResource(pKeyName, NULL, NULL, NULL); + gettimeofday(&tmEnd, NULL); + + tmUsed = (tmEnd.tv_sec * 1000000 + tmEnd.tv_usec) - (tmStart.tv_sec * 1000000 + tmStart.tv_usec); + LOG_EX(LOG_Debug, "(%d):[%s] = {%s}\n", tmUsed, pKeyName, pResPath); + + free(pResPath); + } +#endif +#endif +#if 0 + SkinUpgrade(pUpg); + + sleep(5); + + GetSkinsResource("v111", NULL, NULL, NULL); +#endif +} + +static LOG_LEVEL g_logLevelInfo[] = { + LOG_Fatal, LOG_Error, LOG_Warn, LOG_Debug, LOG_Info, + LOG_Test, LOG_Call, LOG_Devp, LOG_Step, LOG_Unknown, LOG_All, LOG_Close + }; + +static void __uvLogTestProc(void *pParams) +{ + while(TRUE) + { + //SysPointMark("-----------------------------------------------------\n"); + + for(int i = 0; i < sizeof(g_logLevelInfo) / sizeof(g_logLevelInfo[0]); i++) + { + UT_string* pString = NULL; + + utstring_new(pString); + utstring_printf(pString, "This is LogLevel %s\n", LogLeveToString(g_logLevelInfo[i])); + //SysPointMark(utstring_body(pString)); + LOG_EX(g_logLevelInfo[i], "This is LogLevel %s\n", LogLeveToString(g_logLevelInfo[i])); + utstring_free(pString); + } + + sleep(1); + } +} + +static void __uvLogCtrlProc(void *pParams) +{ + int i = 0; + int ret; + + const char* g_Menu[] = { + "Usage: enable/disable [params1] [params2]\n" + " help\n", + " quit\n", + }; + + const char* pOptMenu[] = { + "\n operation:\n" + " |--------------------------------------------------------------------------|\n", + " | command | operation | params1 | params2 |\n", + " |--------------------------------------------------------------------------|\n", + " | enable | | | |\n", + " |----------| 0: Set log level | Log level | Unused |\n", + " | disable | | | |\n", + " |----------|---------------------|-----------------------|-----------------|\n", + " | enable | | | |\n", + " |----------| 1: Print to file | Unused | Unused |\n", + " | disable | | | |\n", + " |----------|---------------------|-----------------------|-----------------|\n", + " | enable | | | |\n", + " |----------| 2: Backup to email | Unused | Unused |\n", + " | disable | | | |\n", + " |----------|---------------------|-----------------------|-----------------|\n", + " | enable | | Log server ip address | Log server port |\n", + " |----------| 3: Send to network |-----------------------|-----------------|\n", + " | disable | | Unused | Unused |\n", + " |--------------------------------------------------------------------------|\n", + }; + + while(TRUE) + { + char *pInput = NULL; + char *pCmd = NULL; + + for(i = 0; i < sizeof(g_Menu) / sizeof(g_Menu[0]); i++) + { + fprintf(stdout, "%s", g_Menu[i]); + } + + pInput = readline("Enter Command:"); + + if(pInput == NULL) + { + continue; + } +#if 1 + pCmd = strtok(pInput, " "); + i = 0; + + while(pCmd != NULL) + { + if(strcmp(pCmd, "help") == 0) + { + for(i = 0; i < sizeof(g_pModInfoTable) / sizeof(g_pModInfoTable[0]); i++) + { + if(i == 0) + { + fprintf(stdout, " modName : %-2d --> %s\n", + i, ModuleNameToString(g_pModInfoTable[i].modName)); + } + else + { + fprintf(stdout, "%15s%-2d --> %s\n", "", + i, ModuleNameToString(g_pModInfoTable[i].modName)); + } + } + + for(i = 0; i < sizeof(g_logLevelInfo) / sizeof(g_logLevelInfo[0]); i++) + { + if(i == 0) + { + fprintf(stdout, "\n Log Level: %-2d --> %s\n", i, LogLeveToString(g_logLevelInfo[i])); + } + else + { + fprintf(stdout, "%15s%-2d --> %s\n", "", i, LogLeveToString(g_logLevelInfo[i])); + } + } + + for(i = 0; i < sizeof(pOptMenu) / sizeof(pOptMenu[0]); i++) + { + fprintf(stdout, "%s", pOptMenu[i]); + } + } + else if(strcmp(pCmd, "enable") == 0 + || strcmp(pCmd, "disable") == 0) + { + LOG_CFG_PROTOCOL logItem; + int iCmd, iMod; + char *pParams1 = NULL, *pParams2 = NULL; + char* pMod = strtok(NULL, " "); + char* pOperat = strtok(NULL, " "); + + if(pMod == NULL || strlen(pMod) == 0) + { + LOG_EX(LOG_Error, "Input error, see help\n"); + break; + } + + if(pOperat == NULL || strlen(pOperat) == 0) + { + LOG_EX(LOG_Error, "Input error, see help\n"); + break; + } + + iMod = strtol(pMod, NULL, 10); + + if(iMod < 0 || iMod >= MODULE_MAX) + { + LOG_EX(LOG_Error, "Input error: %s(%d)\n", pMod, iMod); + break; + } + + iCmd = strtol(pOperat, NULL, 10); + + memset(&logItem, 0, sizeof(LOG_CFG_PROTOCOL)); + + + + switch(iCmd) + { + case 0: + pParams1 = strtok(NULL, " "); + if(pParams1 && strlen(pParams1) > 0) + { + int logLevel = strtol(pParams1, NULL, 10); + + if(logLevel >= 0 && logLevel < sizeof(g_logLevelInfo) / sizeof(g_logLevelInfo[0])) + { + fprintf(stdout, "%s %d 0x%08X\n", pCmd, iCmd, g_logLevelInfo[logLevel]); + + logItem.cfgCmd = CMD_LOG_LEVEL; + logItem.iParams2 = (strcmp(pCmd, "disable") == 0) ? FALSE : TRUE; + logItem.iParams1 = g_logLevelInfo[logLevel]; + + DBusJsonSendToCommand(NULL, + g_pModInfoTable[iMod].modAliase, + CMD_LOG_CONFIG, + JSON_ENGINE_LOG_CFG_CMD, + &logItem, TRUE); + } + else + { + LOG_EX(LOG_Error, "Input error, see help\n"); + } + } + else + { + LOG_EX(LOG_Error, "Input error, see help\n"); + } + break; + + case 1: + logItem.cfgCmd = CMD_LOG_FILE; + logItem.iParams1 = (strcmp(pCmd, "disable") == 0) ? FALSE : TRUE; + DBusJsonSendToCommand(NULL, + g_pModInfoTable[iMod].modAliase, + CMD_LOG_CONFIG, + JSON_ENGINE_LOG_CFG_CMD, + &logItem, TRUE); + break; + + case 2: + logItem.cfgCmd = CMD_LOG_MAIL; + logItem.iParams1 = (strcmp(pCmd, "disable") == 0) ? FALSE : TRUE; + DBusJsonSendToCommand(NULL, + g_pModInfoTable[iMod].modAliase, + CMD_LOG_CONFIG, + JSON_ENGINE_LOG_CFG_CMD, + &logItem, TRUE); + break; + + case 3: + pParams1 = strtok(NULL, " "); + + logItem.cfgCmd = CMD_LOG_NETWORK; + if(pParams1 == NULL || strlen(pParams1) == 0) + { + + logItem.iParams1 = 0; + DBusJsonSendToCommand(NULL, + g_pModInfoTable[iMod].modAliase, + CMD_LOG_CONFIG, + JSON_ENGINE_LOG_CFG_CMD, + &logItem, TRUE); + } + else + { + pParams2 = strtok(NULL, " "); + + if(pParams2 != NULL && strlen(pParams2) > 0) + { + logItem.iParams1 = inet_addr(pParams1); + logItem.iParams2 = strtol(pParams2, NULL, 10); + DBusJsonSendToCommand(NULL, + g_pModInfoTable[iMod].modAliase, + CMD_LOG_CONFIG, + JSON_ENGINE_LOG_CFG_CMD, + &logItem, TRUE); + } + else + { + LOG_EX(LOG_Error, "Input error, pParams2 = %s\n", + SAFE_STRING_VALUE(pParams2)); + } + } + + break; + + default: + LOG_EX(LOG_Error, "Unknown operation(0-3) %s, see help\n", pOperat); + break; + } + +#if 0 + char* pKeyName = strtok(NULL, " "); + char *pKeyType = strtok(NULL, " "); + char* pKeyValue = strtok(NULL, " "); + char* pSaveTo = strtok(NULL, " "); + + if(pKeyName && pKeyValue && pKeyType && pSaveTo + && strlen(pKeyName) > 0 && strlen(pKeyValue) > 0 && strlen(pKeyType) > 0 && strlen(pSaveTo) > 0) + { + CFG_ITEM item; + + item.pKeyName = pKeyName; + item.keyType = strtoul(pKeyType, NULL, 10); + + if(item.keyType == CFG_TYPE_STRING) + { + item.pStrValue = pKeyValue; + } + else if(item.keyType == CFG_TYPE_INT) + { + item.intValue = strtol(pKeyValue, NULL, 10); + } + else if(item.keyType == CFG_TYPE_DOUBLE) + { + item.doubleValue = strtod(pKeyValue, NULL); + } + + ret = CfgAddKeyValue(pKeyName, &item, strtol(pSaveTo, NULL, 10)); + + if(ret == 0) + { + CfgItemPrint("Add Configure: ", &item); + } + else + { + LOG_EX(LOG_Error, "Add Configure [%s] Error: %d\n", pKeyName, ret); + } + } +#endif + } + else if(strcmp(pCmd, "quit") == 0) + { + return; + } + + pCmd = strtok(NULL, " "); + } +#endif + usleep(1000); + } +} + +static void __uvMsgSendTestProc(void *pParams) +{ + char buf[DBUS_MSG_MAX_PAD_SIZE]; + unsigned int i = 0; + + memset(buf, 'a', DBUS_MSG_MAX_PAD_SIZE - 1); + buf[DBUS_MSG_MAX_PAD_SIZE - 1] = 0; + + while(TRUE) + { + // memset(buf, 0, 256); + // sprintf(buf, "%u", i); + + fprintf(stdout, "Send Message: %u\n", i); + DBusSendToCommand(NULL, g_pModInfoTable[MODULE_CONTROLLER].modAliase, CMD_CALL_DIAL, buf); + i++; + sleep(3); + } +} + +static void __uvMsgRecvProc(void *pParams) +{ + while(TRUE) + { + PDBUS_MSG_PACK pMsg = DBusGetMessage(); + PLIBUV_DBUS_PARAMS pInfo = DBusLibuvGetRuntime(); + + do + { + if(pMsg && pInfo) + { + //static PDBUS_MSG_PACK DBusOnMessage(uv_loop_t* pLoop, DBusConnection* pConn, PDBUS_MSG_PACK pMsg) + DBusOnMessage(pInfo->pLoop, pInfo->pBus, pMsg); + DBusMsgCleanup(pMsg); + } + + pMsg = DBusGetMessage(); + } while(pMsg && pInfo); + + + usleep(100); + } +} + +void test_dbus(void) +{ + DBusError error; + DBusConnection* pBus = NULL; + + dbus_error_init(&error); + + pBus = dbus_bus_get(DBUS_BUS_SYSTEM, &error); + + if (dbus_error_is_set(&error)) + { + fprintf(stdout, "dbus: Could not acquire the session bus\n"); + + dbus_error_free(&error); + return; + } + else + { + fprintf(stdout, "Create Session OK\n"); + } +} + +static unsigned int g_Count1 = 0; +static void __uvThreadRun(void *pParams) +{ + g_Count1++; + usleep(10); +} + +static void __uvThreadTestProc(void *pParams) +{ + LOG_EX(LOG_Debug, "Test Create Thread\n"); + + for(int i = 0; i < 1000; i++) + { + test_task_new(__uvThreadRun, NULL); + usleep(1); + } + + while(TRUE) + { + LOG_EX(LOG_Debug, "Current Cnt: %u\n", g_Count1); + sleep(1); + } +} + +#include "fifo.h" + +static DECLARE_KFIFO(g_TestFifo, unsigned char, 128); + +static void __fifoPut(void *pParams) +{ + int ret = 0; + static unsigned char val = 0; + while(TRUE) + { + for(int i = 0; i < 130; i++) + { + if(kfifo_avail(&g_TestFifo) < 1) + { + ret = kfifo_out(&g_TestFifo, NULL, 1); + } + + ret = kfifo_in_locked(&g_TestFifo, &val, 1); + + if(ret != 1) + { + LOG_EX(LOG_Error, "Add %d ret %d\n", val, ret); + } + val++; + } + + + usleep(10); + return; + } +} + +static void __fifoGet(void *pParams) +{ + unsigned char val[128]; + + while(TRUE) + { + int len = kfifo_len(&g_TestFifo); + + if(len > 0) + { + len = kfifo_out_locked(&g_TestFifo, val, len); + + print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, val, len); + fprintf(stdout, "Peek %d\n", len); + } + + usleep(1000); + } +} + +static void __uvThreadTestFifo(void *pParams) +{ + INIT_KFIFO(g_TestFifo); + + test_task_new(__fifoPut, NULL); + sleep(3); + test_task_new(__fifoGet, NULL); +} + +#if 0 +static inline int round_up_pow_of_two(unsigned long x) +{ + x |= (x >> 1); + x |= (x >> 2); + x |= (x >> 4); + x |= (x >> 8); + x |= (x >> 16); + return x + 1; +} + +#define WAKE_CACHE_DATA_SIZE1 (1920000U) +#endif + +typedef struct +{ + char* mcuCmd; +} BYPASS_INFO, *PBYPASS_INFO; + +typedef struct +{ + BYPASS_INFO reported; +} SHADOW_STATE, *PSHADOW_STATE; + +typedef struct +{ + char* method; + int version; + SHADOW_STATE state; +} SHADOW_UPDATE, *PSHADOW_UPDATE; + +static const char* __shadow2Json(PSHADOW_UPDATE pInfo) +{ + cJSON *pRoot, *pStatus, *pReports; + + const char* pJsonS; + + pRoot = cJSON_CreateObject(); + + cJSON_AddNumberToObject(pRoot, "version", pInfo->version); + cJSON_AddItemToObject(pRoot, "method", cJSON_CreateString(pInfo->method)); + + pStatus = cJSON_CreateObject(); + pReports = cJSON_CreateObject(); + + cJSON_AddItemToObject(pRoot, "status", pStatus); + cJSON_AddItemToObject(pStatus, "reports", pReports); + cJSON_AddItemToObject(pReports, "mcuCmd", cJSON_CreateString(pInfo->state.reported.mcuCmd)); + + + pJsonS = cJSON_Print(pRoot); + + + cJSON_Delete(pRoot); + + return pJsonS; +} + +static void __dlThreadRuntimeCb(void *pParams) +{ + pthread_detach(pthread_self()); + pthread_exit(0); +} + +static void __uvThreadTest(void *pParams) +{ + for(int i = 0; i < 100000; i++) + { + uv_thread_t uvThread; + int err = uv_thread_create(&uvThread, __dlThreadRuntimeCb, NULL); + + if(err != 0) + { + LOG_EX(LOG_Error, "Create Thread Error: %d(%d)\n", err, i); + return; + } + + if(i % 1000 == 0) + { + LOG_EX(LOG_Debug, "Create Thread: %d\n", i); + } + usleep(1000); + } +} + +static void __dlTestThread(void* p) +{ + static char* testURL[] = { + "http://vbox-resource.nos.netease.com/20180309192932533Alianwang003.mp3", + "http://vbox-resource.nos.netease.com/20180309192932594Alianwang004.mp3", + "http://vbox-resource.nos.netease.com/20180309192932882Alianwang005.mp3", + "http://vbox-resource.nos.netease.com/20180309192933094Alianwang006.mp3", + "http://vbox-resource.nos.netease.com/20180309192933355Alianwang007.mp3", + "http://vbox-resource.nos.netease.com/20180309192933571Alianwang008.mp3", + "http://vbox-resource.nos.netease.com/20180309192933805Alianwang009.mp3", + "http://vbox-resource.nos.netease.com/20180309192934929Ashiyong002.mp3", + "http://vbox-resource.nos.netease.com/20180309192935659Ashiyong003.mp3", + "http://vbox-resource.nos.netease.com/20180309192935729Ashiyong004.mp3", + "http://vbox-resource.nos.netease.com/20180309192936130Ashiyong005.mp3", + "http://vbox-resource.nos.netease.com/20180309192936192Ashiyong006.mp3", + "http://vbox-resource.nos.netease.com/20180309192936289S001.mp3", + "http://vbox-resource.nos.netease.com/20180309192936471S002.mp3", + "http://vbox-resource.nos.netease.com/20180309192937566S006.mp3", + "http://vbox-resource.nos.netease.com/20180309192937735S007.mp3", + "http://vbox-resource.nos.netease.com/20180309192937793S008.mp3", + "http://vbox-resource.nos.netease.com/20180309192938129S009.mp3", + "http://vbox-resource.nos.netease.com/20180309192938262S010.mp3", + "http://vbox-resource.nos.netease.com/20180309192938975S011.mp3", + "http://vbox-resource.nos.netease.com/20180309192933845Alianwang010.mp3", + "http://vbox-resource.nos.netease.com/20180309192933937Alianwang011.mp3", + "http://vbox-resource.nos.netease.com/20180309192934678Ashiyong001.mp3", + "http://vbox-resource.nos.netease.com/20180605170040224Alianwang012.mp3", + "http://vbox-resource.nos.netease.com/20180605170146178Alianwang014.mp3", + "http://vbox-resource.nos.netease.com/20180605170324285Alianwang013.mp3", + "http://vbox-resource.nos.netease.com/20180605165854636Alianwang002.mp3", + "http://vbox-resource.nos.netease.com/20180607095314669S004-13DB.mp3", + "http://vbox-resource.nos.netease.com/20180607095347590S0053DB.mp3", + "https://vbox-resource.nos-hz.163yun.com/20180625120349098S003+3.mp3", + }; + + //while(TRUE) + { + for(int i = 0; i < sizeof(testURL) / sizeof(testURL[2]); i++) + { + char buf[256]; + + g_DlCount++; + memset(buf, 0, 256); + sprintf(buf, "./dl_%d.mp3", i); + InetHttpDlFileAsync(testURL[i], + buf, + __onDlCb, + NULL,//__onPrgCb, + NULL); + } + + while(g_DlCount) + { + usleep(100000); + } + } +} + +int main(int argc, char **argv) +{ + int i, j, ret = 0; + DBusConnection* pBus = NULL; + uv_timer_t uvSndLess, uvSndMore; + uv_loop_t* pLoop = GetDBusDefaultLoop(); + int modIdx = -1; + char buf[256]; + +#if 0 + FILE* pFile = fopen("/mnt/UDISK/time.txt", "w+"); + + fprintf(stdout, "WAKE_CACHE_DATA_SIZE1(%u) --> %u\n", WAKE_CACHE_DATA_SIZE1, round_up_pow_of_two(WAKE_CACHE_DATA_SIZE1)); + + fprintf(stdout, "127 --> %u\n", roundup_pow_of_two(127)); + + fprintf(stdout, "3 --> %u\n", roundup_pow_of_two(3)); + + fprintf(stdout, "256 --> %u\n", roundup_pow_of_two(256)); + + fprintf(stdout, "1024 * 2 - 1 --> %u\n", roundup_pow_of_two(1024 * 2 - 1)); +#endif +#if 0 + fprintf(stdout, "Wait system reboot for 10s"); + ret = system("sync && ubus call system watchdog \'{\"stop\" : true}\'"); + + sleep(20); + + fprintf(stdout, "Wait WDT 20s End\n"); +#endif + +#if 0 + int fd = open("/dev/watchdog", O_WRONLY); + + if(fd == -1) + { + perror("Open WDT"); + } + + sleep(20); + + fprintf(stdout, "Wait WDT 20s\n"); +#endif + +#ifdef PLATFORM_R16 +#endif + + //fprintf(stdout, "uv_default_loop = %p\n", pLoop); + + if(argc <= 1) + { + fprintf(stderr, "usage: ./dbus-r16.exe <0-%d>\n", MODULE_MAX - 1); + return 0; + } + + modIdx = strtol(argv[1], NULL, 10); + + if(modIdx >= MODULE_MAX || modIdx < 0) + { + fprintf(stderr, "Bad params of %s, max value is %d\n", argv[1], MODULE_MAX - 1); + return 0; + } + + memcpy(&g_ModInfo, &g_pModInfoTable[modIdx], sizeof(MOD_INFO_TABLE)); + + pBus = DBusWithLibuvInit(pLoop, g_ModInfo.modAliase, + DBusOnMessage, + NULL, + NULL, + &ret); + + if(pBus == NULL) + { + fprintf(stderr, "DBusWithLibuvInit Error: %d\n", ret); + exit(1); + return 0; + } + + //test_task_new(__uvThreadTest, NULL); + + DumpCurServerAddr("Default"); + +#if 1 + for(int i = 0; i < 1; i++) + { + char buf[256]; + + memset(buf, 0, 256); + + sprintf(buf, "dl_%d.bin", i); + + InetHttpDlFileAsync("http://10.240.84.163/tina_r16_ota_21.tar.gz", + //"https://vbox-resource.nos-hz.163yun.com/20180628092806976tina_r16_ota_32.tar.gz", + buf, + __onDlCb, + NULL,//__onPrgCb, + NULL); + } +#endif + //SetCurrentServerMode(DEV_MODE); + //DumpCurServerAddr("DEV_MODE"); + +#if 0 + SetCurrentServerMode(TEST_MODE); + DumpCurServerAddr("TEST_MODE"); + + SetCurrentServerMode(PUBLISH_MODE); + DumpCurServerAddr("PUBLISH_MODE"); +#endif + + //test_task_new(__uvMsgRecvProc, NULL); + + //HttpPostLogFile("{}"); + + //SysPointMarkInit("123456", -1, -1); + + //SysPointMarkUpload(); +#if 0 + for(int i = 0; i < 1000; i++) + { + void* pMalloc = malloc(1024 * 1024); + + if(pMalloc == NULL) + { + LOG_EX(LOG_Error, "%d: Malloc Error\n", i); + } + else + { + LOG_EX(LOG_Debug, "%d: Malloc %p\n", i, pMalloc); + + memset(pMalloc, 0, 1024 * 1024); + } + + usleep(100000); + } +#endif + +#if 0 + g_pOnKevEvt = (uv_fs_event_t*)malloc(sizeof(uv_fs_event_t)); + + uv_fs_event_init(pLoop, g_pOnKevEvt); + + uv_fs_event_start(g_pOnKevEvt, run_command, "./1.txt", UV_FS_EVENT_RECURSIVE); +#endif + + //test_task_new(__dlTestThread, NULL); +#if 0 + if(modIdx == 20) + { + IHW_EnableLogLevel(LOG_All, 1); + test_task_new(__uvLogCtrlProc, NULL); + } + else if(modIdx == 19) + { + test_task_new(__uvLogTestProc, NULL); + } + else if(modIdx == 21) + { + test_task_new(__uvMsgSendTestProc, NULL); + } + else if(modIdx == 15) + { + test_task_new(__uvThreadTestProc, NULL); + } + else if(modIdx == 16) + { + test_task_new(__uvThreadTestFifo, NULL); + } +#endif + //LOG_EX(LOG_Debug, "Chip Serial: [%s]\n", GetCpuSerial()); + //LOG_EX(LOG_Debug, "Chip ID: [%s]\n", GetCpuChipId()); + + //LOG_BUF(LOG_Error, g_pModInfoTable, 64); + +// DBusWithLibuvCfgInit(OnCfgMsgCb); + +#if 0 + uv_timer_init(pLoop, &uvSndLess); + uvSndLess.data = pBus; + uv_timer_start(&uvSndLess, uvSndLessCb, 1000, 3000); +#endif + //uv_timer_init(pLoop, &uvSndMore); + //uv_timer_start(&uvSndMore, uvTimeoutCb, 3000, 10000); + //EvpEncrypto(); + //LOG_EX(LOG_Info, "Struct --> Json: [%s]\n", Struct2Json(NULL, 0)); + + //Json2Struct(NULL, 0); + + //free((void*)EvpBase64Encode(pSrc)); + + //LOG_EX(LOG_Debug, "Base") + //free((void*)EvpMD5HashFile("/root/time.txt")); + //test_evp_aes(); + //test_aes_async(); + //test_base64_async(); + //test_md5file_async(); + //test_task_new(__uvThreadTestConfigure); + //test_task_new(__uvThreadTestOTA, NULL); + //test_task_new(__uvThreadTimer, NULL); + //uv_timer_init(GetDBusDefaultLoop(), &g_tmTest); + //LOG_EX(LOG_Info, "Start Timer............\n"); + //uv_timer_start(&g_tmTest, uvSndLessCb, g_Delay, 0); + + //test_task_new(__uvThreadTimer, NULL); + //test_s2j_task(); + + //test_base64_async(); + + //test_move_data(); + + //AlarmTimerInit(pLoop); + +#if 0 + for(i = REPEAT_MODE_NONE; i <= REPEAT_MODE_HOLIDAY; i++) + { + { + AlarmTimerAdd2(2017 - 1900, 11 - 1, 28, + 13, 50, 30, + 0, + i, + NULL, 0, 0, NULL, NULL); + + AlarmTimerAdd2(2017-1900, 11-1, 28, + 23, 50, 30, + 0, + i, + NULL, 0, 1, NULL, NULL); + } + } +#endif +#if 0 + struct tm localTime; + time_t timeStamp = time((time_t*)NULL) + 10; + localtime_r(&timeStamp, &localTime); + + AlarmTimerAdd(2018-1900, 6-1, 26, + localTime.tm_hour, localTime.tm_min, localTime.tm_sec, + 0, + REPEAT_MODE_MONTH_LAST_DAY, + __onAlarmCb, 0, NULL, NULL); +#endif +#if 0 + for(i = REPEAT_MODE_NONE; i <= REPEAT_MODE_HOLIDAY; i++) + { + struct tm localTime; + + localtime_r(&timeStamp, &localTime); + + AlarmTimerAdd(2017-1900, 11-1, 29, + localTime.tm_hour, localTime.tm_min, localTime.tm_sec, + 0, + 1, + NULL, 0, i % 2, NULL, NULL); + } +#endif + + //InetSmtpSendEmail(); + +#if 1 +#if 1 + +#endif +#if 0 + if(modIdx == 18) + { + SkinInit(); + //SkinIsVerifyRes(TRUE); +#if 0 + char* path = "/mnt/UDISK/skinupgrade.txt"; + char* pUpgCmd = "[{\"createTime\":1517832224000,\"enable\":1,\"id\":170," + "\"md5\":\"0c8d2d487e485cf3553d7e2818ac42d9\",\"osType\":0," + "\"remark\":\"101\",\"resourceName\":\"v101\",\"resourceType\":1," + "\"resourceVersion\":\"0.3.2\",\"size\":33734,\"updateTime\":1517832224000," + "\"url\":\"http://vbox-resource.nos.netease.com/2536ded2-71a5-40ab-98dc-fe824fbbfb64.mp3\"," + "\"versionId\":68,\"versionName\":\"0.3.2\",\"versionOsType\":\"0\"}]"; + + + FILE* pFp = fopen(path, "rw"); + int fileSize = 0; + + GET_FILE_SIZE(path, fileSize); + + + fprintf(stdout, "%s size = %d\n", path, fileSize); + + if(pFp && fileSize > 0) + { + char* pData = (char*)malloc(fileSize); + + ret = fread(pData, fileSize, 1, pFp); + + fprintf(stdout, "Read: %s\n", pData); + + fclose(pFp); + + SkinUpgrade(pData); + + free(pData); + } +#else + //const char* GetSkinsResource(const char [in] *pKeyName, int [out] *pResType, int [out] *pVersion, const char [out] **pComeFrom) + + //fprintf(stdout, "[v001] = {%s}\n", GetSkinsResource("v001", NULL, NULL, NULL)); + //fprintf(stdout, "[v109] = {%s}\n", GetSkinsResource("v109", NULL, NULL, NULL)); + //fprintf(stdout, "[v311] = {%s}\n", GetSkinsResource("v311", NULL, NULL, NULL)); + + //test_task_new(__uvTestSkin, NULL); +#endif + } +#endif +#endif + +#if 0 +#define MAIL_SENDER ("pv1_es2@163.com") +#define SENDER_PASSWORD ("pv1Dev163") +#define MAIL_RECEIVER ("pv1_es2@163.com") +#define MAIL_SERVER ("smtps://smtp.163.com") +//#else +#define MAIL_SENDER ("pv1_es2@hotmail.com") +#define SENDER_PASSWORD ("netEase163") +#define MAIL_RECEIVER ("pv1_es2@163.com") +#define MAIL_SERVER ("smtp://smtp-mail.outlook.com") +#endif + +#if 0 + SMTP_MAIL_CONFIG smtpCfg; + memset(&smtpCfg, 0, sizeof(SMTP_MAIL_CONFIG)); + + smtpCfg.pUserName = MAIL_SENDER; + smtpCfg.pPassword = SENDER_PASSWORD; + smtpCfg.pSmtpServer = MAIL_SERVER; + + const char *pFrom = MAIL_SENDER; + const char *pTo[] = {"pv1_es2@163.com", "pv1_es2@126.com", NULL}; + const char *pCc[] = {"xajhuang@qq.com", "xajhuang@163.com", NULL}; + const char *pTitle = "Log Message"; + const char *pMessage = "Hi All: This is log backup mail."; + const char *pAttact[] = {"mail.txt", "time.txt", NULL}; + + InetSmtpSendEmail(pFrom, pTo, pCc, pTitle, pMessage, pAttact, &smtpCfg); +#endif + + // InetHttpUploadFileSync(UPL_HTTP_URL, "./time.txt"); +#if 0 + if((i = GZipFileCompress("./input.txt", "./input.gz")) != 0) + { + LOG_EX(LOG_Error, "Create Gzip File Error: %d\n", i); + } +//#else + + while(TRUE) + { + for(i = 0; i < 3010; i++) + { + LOG_EX(LOG_Debug, "This is log %d\n", j++); + } + + sleep(1); + } +#endif + + RunUVLoop(pLoop); + + while(TRUE) + { + usleep(1000); + } + + return (0); +} diff --git a/Framework/Compress/zlib.c b/Framework/Compress/zlib.c new file mode 100644 index 0000000..b78f863 --- /dev/null +++ b/Framework/Compress/zlib.c @@ -0,0 +1,110 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "crypto.h" + +#define CHUNK_BLOCK (16384) + +/* Compress from file source to file dest until EOF on source. + def() returns Z_OK on success, Z_MEM_ERROR if memory could not be + allocated for processing, Z_STREAM_ERROR if an invalid compression + level is supplied, Z_VERSION_ERROR if the version of zlib.h and the + version of the library linked do not match, or Z_ERRNO if there is + an error reading or writing the files. */ +int GZipFileCompress(const char* pInput, const char* pOutput) +{ + int ret, isFlush; + unsigned int have; + z_stream strm; + char strPath[256]; + unsigned char in[CHUNK_BLOCK]; + unsigned char out[CHUNK_BLOCK]; + FILE *source, *dest; + + if (pInput == NULL) + { + return (Z_ERRNO); + } + + if(access(pInput, F_OK) != 0) + { + return (Z_ERRNO); + } + + //fprintf(stdout, "in: %s\n", pInput); + + source = fopen(pInput, "r+"); + + memset(strPath, 0, 256); + if (pOutput == NULL || strlen(pOutput) == 0) + { + sprintf(strPath, "%s.gz", pInput); + dest = fopen(strPath, "w+"); + + //fprintf(stdout, "out: %s\n", strPath); + } + else + { + dest = fopen(pOutput, "w+"); + //fprintf(stdout, "out: %s\n", pOutput); + } + + /* allocate deflate state */ + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + //ret = deflateInit(&strm, level); + ret = deflateInit2(&strm, Z_DEFAULT_COMPRESSION, Z_DEFLATED, MAX_WBITS + 16, 8, Z_DEFAULT_STRATEGY); + + if (ret != Z_OK) + { + fclose(source); + fclose(dest); + return ret; + } + + /* compress until end of file */ + do { + strm.avail_in = fread(in, 1, CHUNK_BLOCK, source); + if (ferror(source)) { + (void)deflateEnd(&strm); + fclose(source); + fclose(dest); + return Z_ERRNO; + } + isFlush = feof(source) ? Z_FINISH : Z_NO_FLUSH; + strm.next_in = in; + + /* run deflate() on input until output buffer not full, finish + compression if all of source has been read in */ + do { + strm.avail_out = CHUNK_BLOCK; + strm.next_out = out; + ret = deflate(&strm, isFlush); /* no bad return value */ + have = CHUNK_BLOCK - strm.avail_out; + if (fwrite(out, 1, have, dest) != have || ferror(dest)) { + (void)deflateEnd(&strm); + fclose(source); + fclose(dest); + return Z_ERRNO; + } + } while (strm.avail_out == 0); + + /* done when last data in file processed */ + } while (isFlush != Z_FINISH); + + /* clean up and return */ + (void)deflateEnd(&strm); + + fflush(dest); + + fclose(source); + fclose(dest); + return Z_OK; +} + diff --git a/Framework/Configure/config_engine.c b/Framework/Configure/config_engine.c new file mode 100644 index 0000000..4b5c276 --- /dev/null +++ b/Framework/Configure/config_engine.c @@ -0,0 +1,1042 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "log.h" +#include "config_engine.h" +#include "libuv_dbus.h" + +#define PROCESS_MUTEX_KEY ("/root/config_server.pid") +#define CFG_SYNC_TIME_OF_SECONDS (1) + + +static PCFG_ITEM __cfgAddItem(const char *pKeyName, const char *pKeyValue, int iType, int overWrite, int saveToDB, int* pErr); + +typedef struct +{ + char keyName[MAX_CFG_KEY_NAME]; + uint32_t tmCached; + + UT_hash_handle hh; ///< UT Hash handle +} CFG_CACHE_ITEM, *PCFG_CACHE_ITEM; + +static sqlite3* g_pSqlFileDB = NULL; +static PCFG_ITEM g_pCfgItems = NULL; +static PCFG_CACHE_ITEM g_pCfgCacheItems = NULL; +static int g_bIsCfgSvr = FALSE; +static uv_rwlock_t g_uvHashRwLock; +static uv_rwlock_t g_uvCacheRwLock; +static uv_timer_t g_uvSyncSvr; + +#if 0 +#define INT_TBL_SQL_CMD ("CREATE TABLE IF NOT EXISTS integer(" \ + "keyName TEXT PRIMARY KEY NOT NULL," \ + "keyValue INTEGER NOT NULL," \ + "keyModule INTEGER NOT NULL," \ + "CreatedTime TimeStamp NOT NULL DEFAULT (datetime('now','localtime')));") + +#define STRING_TBL_SQL_CMD ("CREATE TABLE IF NOT EXISTS string(" \ + "keyName TEXT PRIMARY KEY NOT NULL," \ + "keyValue TEXT NOT NULL," \ + "keyModule INTEGER NOT NULL," \ + "CreatedTime TimeStamp NOT NULL DEFAULT (datetime('now','localtime')));") + +#define FLOAT_TBL_SQL_CMD ("CREATE TABLE IF NOT EXISTS double(" \ + "keyName TEXT PRIMARY KEY NOT NULL," \ + "keyValue NUMERIC NOT NULL," \ + "keyModule INTEGER NOT NULL," \ + "CreatedTime TimeStamp NOT NULL DEFAULT (datetime('now','localtime')));") +#endif + +#define FIRMWARE_TBL_SQL_CMD ("CREATE TABLE IF NOT EXISTS %s (" \ + "ID INTEGER PRIMARY KEY AUTOINCREMENT," \ + "keyName TEXT UNIQUE NOT NULL," \ + "keyValue TEXT NOT NULL," \ + "keyType INTEGER NOT NULL);") + + +static const char* __cfgGetKeyTypeString(int keyType) +{ + switch(keyType) + { + case 0: + return ("string"); + case 1: + return ("integer"); + case 2: + return ("double"); + } + + return ("Unknown Type"); +} + + +static int __cfgItem2CfgRsp(PCFG_ITEM pCfgItem, PCFG_API_RSP pRsp) +{ + if(pCfgItem == NULL || pRsp == NULL) + { + return (-ERR_INPUT_PARAMS); + } + + memset(pRsp->keyValue, 0, MAX_CFG_KEY_VALUE); + pRsp->keyType = pCfgItem->keyType; + + if(pCfgItem->keyType == CFG_TYPE_STRING) + { + strncpy(pRsp->keyValue, pCfgItem->pStrValue, MAX_CFG_KEY_VALUE); + } + else if(pCfgItem->keyType == CFG_TYPE_INT) + { + sprintf(pRsp->keyValue, "%d", pCfgItem->intValue); + } + else if(pCfgItem->keyType == CFG_TYPE_DOUBLE) + { + sprintf(pRsp->keyValue, "%f", pCfgItem->doubleValue); + } + + pRsp->errNo = 0; + + return (0); +} + +static int __cfgMsg2CfgItem(int keyType, const char *pKeyName, const char *pKeyValue, PCFG_ITEM pCfgItem) +{ + int iValue; + double dValue; + char *pEndPtr = NULL; + + if(pKeyName == NULL || pKeyValue == NULL || pCfgItem == NULL) + { + return (-ERR_INPUT_PARAMS); + } + + strcpy(pCfgItem->pKeyName, pKeyName); + pCfgItem->keyType = keyType; + pCfgItem->keyModule = DBusLibuvGetRuntime()->modName; + + switch(keyType) + { + case CFG_TYPE_STRING: + strcpy(pCfgItem->pStrValue, pKeyValue); + break; + + case CFG_TYPE_INT: + iValue = strtol(pKeyValue, NULL, 10); + + if(errno == ERANGE || errno == EINVAL) + { + return (-ERR_STR_CONVERT); + } + else + { + pCfgItem->intValue = iValue; + } + break; + + case CFG_TYPE_DOUBLE: + dValue = strtod(pKeyValue, &pEndPtr); + + if((errno == ERANGE) || (dValue == 0 && (strcmp(pKeyValue, pEndPtr) == 0))) + { + return (-ERR_STR_CONVERT); + } + else + { + pCfgItem->doubleValue = dValue; + } + + break; + + default : + return (-ERR_UNKNOWN_TYPE); + } + + return (0); +} + +static int __cfgMsg2CfgItemV2(int keyType, const char *pKeyName, const char *pKeyValue, PCFG_ITEM* pItem) +{ + int iSize; + PCFG_ITEM pCfgItem = (PCFG_ITEM)malloc(sizeof(CFG_ITEM)); + char* pCache = NULL; + + if(pKeyName == NULL || pKeyValue == NULL || pCfgItem == NULL) + { + free(pCfgItem); + return (-ERR_INPUT_PARAMS); + } + + switch(keyType) + { + case CFG_TYPE_STRING: + iSize += strlen(pKeyValue) + 1; + pCache = (char*)malloc(iSize); + memset(pCache, 0, iSize); + pCfgItem->pKeyName = pCache; + pCfgItem->pStrValue = pCache + strlen(pKeyName) + 1; + __cfgMsg2CfgItem(pCfgItem->keyType, pKeyName, pKeyValue, pCfgItem);; + break; + + case CFG_TYPE_INT: + pCfgItem->pKeyName = (char*)malloc(iSize); + memset(pCfgItem->pKeyName, 0, iSize); + strcpy(pCfgItem->pKeyName, pKeyName); + __cfgMsg2CfgItem(pCfgItem->keyType, pKeyName, pKeyValue, pCfgItem);; + break; + + case CFG_TYPE_DOUBLE: + pCfgItem->pKeyName = (char*)malloc(iSize); + memset(pCfgItem->pKeyName, 0, iSize); + strcpy(pCfgItem->pKeyName, pKeyName); + __cfgMsg2CfgItem(pCfgItem->keyType, pKeyName, pKeyValue, pCfgItem);; + break; + + default: + free(pCfgItem); + return -ERR_UNKNOWN_TYPE; + } + + *pItem = pCfgItem; + + return 0; +} + +int Sqlite3SyncDB(sqlite3* pSqlMemory, const char* pMemDbName, const char* pDBFilePath, const char* pFileDbName, int isSave) +{ + int rc; + sqlite3* pSqlFile; + sqlite3_backup* pSqlBackup; + sqlite3* pSyncDest; + sqlite3* pSyncSrc; + + rc = sqlite3_open(pDBFilePath, &pSqlFile); + + if(rc != SQLITE_OK) + { + return -ERR_OPEN_SQLITE3_DB; + } + + if(pDBFilePath == NULL || strlen(pDBFilePath) == 0) + { + pMemDbName = "main"; + } + + if(pFileDbName == NULL || strlen(pFileDbName) == 0) + { + pFileDbName = "main"; + } + + pSyncSrc = isSave ? pSqlMemory : pSqlFile; + pSyncDest = isSave ? pSqlFile : pSqlMemory; + + pSqlBackup = sqlite3_backup_init(pSyncDest, pMemDbName, pSyncSrc, pFileDbName); + + if(pSqlBackup != NULL) + { +#if 1 + do + { + rc = sqlite3_backup_step(pSqlBackup, 10); + + if(rc == SQLITE_OK || rc == SQLITE_BUSY || rc == SQLITE_LOCKED) + { + sqlite3_sleep(100); + } + } while (rc == SQLITE_OK || rc == SQLITE_BUSY || rc == SQLITE_LOCKED); +#else + sqlite3_backup_step(pSqlBackup, -1); +#endif + sqlite3_backup_finish(pSqlBackup); + } + else + { + LOG_EX(LOG_Error, "Backup Database Error\n"); + } + + rc = sqlite3_errcode(pSyncDest); + + return rc; +} + +static int __sqlite3LoadCb(void* data, int argc, char** argv, char** azColName) +{ + + if(argc == 4) + { + int iSize; + PCFG_ITEM pCfgItem = (PCFG_ITEM)malloc(sizeof(CFG_ITEM)); + char* pCache = NULL; + int ret = 0; + + pCfgItem->keyType = atoi(argv[3]); + pCfgItem->keyModule = *(int*)data; + iSize = strlen(argv[1]) + 1; + + switch(pCfgItem->keyType) + { + case CFG_TYPE_STRING: + iSize += strlen(argv[2]) + 1; + pCache = (char*)malloc(iSize); + memset(pCache, 0, iSize); + pCfgItem->pKeyName = pCache; + pCfgItem->pStrValue = pCache + strlen(argv[1]) + 1; + ret = __cfgMsg2CfgItem(pCfgItem->keyType, argv[1], argv[2], pCfgItem);; + break; + + case CFG_TYPE_INT: + pCfgItem->pKeyName = (char*)malloc(iSize); + memset(pCfgItem->pKeyName, 0, iSize); + strcpy(pCfgItem->pKeyName, argv[1]); + ret = __cfgMsg2CfgItem(pCfgItem->keyType, argv[1], argv[2], pCfgItem);; + break; + + case CFG_TYPE_DOUBLE: + pCfgItem->pKeyName = (char*)malloc(iSize); + memset(pCfgItem->pKeyName, 0, iSize); + strcpy(pCfgItem->pKeyName, argv[1]); + ret = __cfgMsg2CfgItem(pCfgItem->keyType, argv[1], argv[2], pCfgItem);; + break; + + default: + free(pCfgItem); + return -ERR_UNKNOWN_TYPE; + } + + uv_rwlock_wrlock(&g_uvHashRwLock); + HASH_ADD_STR(g_pCfgItems, pKeyName, pCfgItem); + uv_rwlock_wrunlock(&g_uvHashRwLock); + + if(ret == 0) + { + CfgItemPrint("Load Configure: ", pCfgItem); + } + } + else + { + LOG_EX(LOG_Error, "argc = %d\n", argc); + } + + return 0; +} + +static int __cfgLoadGlobalConfig(void) +{ + int rc = 0; + char* pErrMsg = NULL; + char sqlCmd[1024]; + PLIBUV_DBUS_PARAMS pContext = DBusLibuvGetRuntime(); + + memset(sqlCmd, 0, 1024); + sprintf(sqlCmd, "SELECT * FROM %s", MODULE_ALIAS_NAME(MODULE_CONFIGURE)); + + // get global configure + rc = sqlite3_exec(g_pSqlFileDB, sqlCmd, __sqlite3LoadCb, (void*)MODULE_CONFIGURE, &pErrMsg); + + if(rc != SQLITE_OK) + { + LOG_EX(LOG_Error, "SQLite3 Query Error: %s\n", pErrMsg); + return -ERR_SQL_QUERY; + } + + if(pContext->modName != MODULE_CONFIGURE) + { + memset(sqlCmd, 0, 1024); + sprintf(sqlCmd, "SELECT * FROM %s", MODULE_ALIAS_NAME(pContext->modName)); + + // get local configure + rc = sqlite3_exec(g_pSqlFileDB, sqlCmd, __sqlite3LoadCb, (void*)&pContext->modName, &pErrMsg); + + if(rc != SQLITE_OK) + { + LOG_EX(LOG_Error, "SQLite3 Query Error: %s\n", pErrMsg); + sqlite3_free(pErrMsg); + return -ERR_SQL_QUERY; + } + } + + return 0; +} + + +void CfgItemPrint(const char* pPrefix, PCFG_ITEM pCfgItem) +{ + if(pCfgItem == NULL) + { + fprintf(stderr, "CfgItemPrint: NULL\n"); + return; + } + + switch(pCfgItem->keyType) + { + case 0: + LOG_EX(LOG_Debug, "%s[%s] = \"%s\", \ttype = %s, \tmodule = %s\n", pPrefix ? pPrefix : "", + pCfgItem->pKeyName, pCfgItem->pStrValue, __cfgGetKeyTypeString(pCfgItem->keyType), ModuleNameToString(pCfgItem->keyModule)); + break; + + case 1: + LOG_EX(LOG_Debug, "%s[%s] = %d, \ttype = %s, \tmodule = %s\n", pPrefix ? pPrefix : "", + pCfgItem->pKeyName, pCfgItem->intValue, __cfgGetKeyTypeString(pCfgItem->keyType), ModuleNameToString(pCfgItem->keyModule)); + break; + + case 2: + LOG_EX(LOG_Debug, "%s[%s] = %f, \ttype = %s, \tmodule = %s\n", pPrefix ? pPrefix : "", + pCfgItem->pKeyName, pCfgItem->doubleValue, __cfgGetKeyTypeString(pCfgItem->keyType), ModuleNameToString(pCfgItem->keyModule)); + break; + + default: + LOG_EX(LOG_Error, "Unknown type = %d\n", pCfgItem->keyType); + break; + } + +} + +int CfgAddGlobalConfig(const char *pKeyName, const char *pKeyValue, CFG_DATA_TYPE keyType) +{ + CFG_API_REQ req; + int ret; + + if(pKeyName == NULL || pKeyValue == NULL || strlen(pKeyName) == 0 || strlen(pKeyValue) == 0) + { + return (-ERR_INPUT_PARAMS); + } + + if(keyType < 0 || keyType > CFG_TYPE_DOUBLE) + { + return (-ERR_INPUT_PARAMS); + } + + memset(&req, 0, sizeof(CFG_API_REQ)); + + strncpy(req.keyName, pKeyName, MAX_CFG_KEY_NAME); + strncpy(req.keyValue, pKeyValue, MAX_CFG_KEY_VALUE); + + ret = DBusJsonSendToCommand(NULL, + g_pModInfoTable[MODULE_CONFIGURE].modAliase, + CMD_CFG_ADD_REQ, + JSON_ENGINE_CFG_REQ, + &req, TRUE); + + if(ret == 0) + { + return (-ERR_CFG_WAIT_RSP); + } + else + { + return (ret); + } +} + +int CfgAddKeyValue(const char *pKeyName, PCFG_ITEM pItem, int saveToDB) +{ + int err = 0; + PCFG_ITEM pCfgItem = NULL; + + if(pItem == NULL || pKeyName == NULL || strlen(pKeyName) == 0) + { + return (-ERR_INPUT_PARAMS); + } + + uv_rwlock_rdlock(&g_uvHashRwLock); + HASH_FIND_STR(g_pCfgItems, pKeyName, pCfgItem); + uv_rwlock_rdunlock(&g_uvHashRwLock); + + if(pCfgItem != NULL) + { + return (-ERR_CFG_ITEM_EXIST); + } + + if(pItem->keyType == CFG_TYPE_STRING) + { + __cfgAddItem(pKeyName, (const char*)pItem->pStrValue, pItem->keyType, FALSE, saveToDB, &err); + } + else + { + char buf[256]; + memset(buf, 0, 256); + + if(pItem->keyType == CFG_TYPE_INT) + { + sprintf(buf, "%d", pItem->intValue); + } + else if(pItem->keyType == CFG_TYPE_DOUBLE) + { + sprintf(buf, "%f", pItem->doubleValue); + } + + __cfgAddItem(pKeyName, (const char*)buf, pItem->keyType, FALSE, saveToDB, &err); + } + + return (err); +} + +int CfgChangeKeyValue(const char *pKeyName, PCFG_ITEM pItem, int saveToDB) +{ + int err = 0; + PCFG_ITEM pCfgItem = NULL; + + if(pItem == NULL || pKeyName == NULL || strlen(pKeyName) == 0) + { + return (-ERR_INPUT_PARAMS); + } + + uv_rwlock_rdlock(&g_uvHashRwLock); + HASH_FIND_STR(g_pCfgItems, pKeyName, pCfgItem); + uv_rwlock_rdunlock(&g_uvHashRwLock); + + if(pCfgItem == NULL) + { + return (-ERR_CFG_NOITEM); + } + + HASH_DEL(g_pCfgItems, pCfgItem); + + if(pItem->keyType == CFG_TYPE_STRING) + { + __cfgAddItem(pKeyName, (const char*)pItem->pStrValue, pItem->keyType, FALSE, saveToDB, &err); + } + else + { + char buf[256]; + memset(buf, 0, 256); + + if(pItem->keyType == CFG_TYPE_INT) + { + sprintf(buf, "%d", pItem->intValue); + } + else if(pItem->keyType == CFG_TYPE_DOUBLE) + { + sprintf(buf, "%f", pItem->doubleValue); + } + + __cfgAddItem(pKeyName, (const char*)buf, pItem->keyType, FALSE, saveToDB, &err); + } + + return (err); +} + +int CfgGetKeyValue(const char* pKeyName, PCFG_ITEM* pItem) +{ + PCFG_ITEM pCfgItem = NULL; + PLIBUV_DBUS_PARAMS pContext = DBusLibuvGetRuntime(); + + if(pItem == NULL || pKeyName == NULL || strlen(pKeyName) == 0) + { + return (-ERR_INPUT_PARAMS); + } + + uv_rwlock_rdlock(&g_uvHashRwLock); + HASH_FIND_STR(g_pCfgItems, pKeyName, pCfgItem); + uv_rwlock_rdunlock(&g_uvHashRwLock); + + if(pCfgItem == NULL) + { + if(pContext->modName == MODULE_CONFIGURE) + { + return (-ERR_CFG_NOITEM); + } + else + { + CFG_API_REQ req; + int ret = 0; + memset(&req, 0, sizeof(CFG_API_REQ)); + strncpy(req.keyName, pKeyName, MAX_CFG_KEY_NAME); + ret = DBusJsonSendToCommand(NULL, g_pModInfoTable[MODULE_CONFIGURE].modAliase, CMD_CFG_GET_REQ, JSON_ENGINE_CFG_REQ, &req, TRUE); + + if(ret == 0) + { + return (-ERR_CFG_WAIT_RSP); + } + else + { + return (ret); + } + } + } + + *pItem = pCfgItem; + + return 0; +} + +static int __cfgCreateCfgFile(const char* pCfgFilePath) +{ + /*const char* pSqlIntDB = NULL; + const char* pSqlFloatDB = NULL; + const char* pSqlStringDB = NULL; */ + char* pErrMsg = NULL; + int rc = 0; + int i = 0; + + rc = sqlite3_open_v2(pCfgFilePath, &g_pSqlFileDB, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL); + + if(rc) + { + LOG_EX(LOG_Error, "sqlite3_open_v2 error: %s\n", pCfgFilePath); + return -ERR_OPEN_SQLITE3_DB; + } + + for(i = 0; (i < sizeof(g_pModInfoTable) / sizeof(g_pModInfoTable[0])); i++) + { + char sqlBuf[1024]; + + memset(sqlBuf, 0, 1024); + + sprintf(sqlBuf, FIRMWARE_TBL_SQL_CMD, MODULE_ALIAS_NAME(i)); + + rc = sqlite3_exec(g_pSqlFileDB, sqlBuf, NULL, 0, &pErrMsg); + + if(rc != SQLITE_OK) + { + uv_fs_t uvFs; + LOG_EX(LOG_Error, "Create Tbl[%d] Error: %s\n", i, pErrMsg); + sqlite3_free(pErrMsg); + uv_fs_unlink(GetDBusDefaultLoop(), &uvFs, pCfgFilePath, NULL); + return -ERR_SQLITE3_CREATE_TABLE; + } + } + + return 0; +} + +#if 0 +static void onSigTermProgressExit(int sign) +{ + if(g_bIsCfgSvr) + { + } + + kill(getpid(), SIGKILL); +} + +static void onProgressExit(void) +{ + onSigTermProgressExit(0); +} +#endif + + +static int __cfgCheckCfgSvrRun(void) +{ + int rc; + int fd = open(PROCESS_MUTEX_KEY, O_CREAT | O_RDWR, 0666); + + if(fd == -1) + { + LOG_EX(LOG_Debug, "Open File Error\n"); + } + + rc = flock(fd, LOCK_EX | LOCK_NB); + + if(rc == -1) + { + LOG_EX(LOG_Debug, "Configure server running\n"); + return FALSE; + } + else + { + LOG_EX(LOG_Debug, "Configure server stoped\n"); + return TRUE; + } +} + +static int __cfgAddToCache(const char *pKeyName) +{ + PCFG_CACHE_ITEM pItem = NULL; + + uv_rwlock_rdlock(&g_uvCacheRwLock); + HASH_FIND_STR(g_pCfgCacheItems, pKeyName, pItem); + uv_rwlock_rdunlock(&g_uvCacheRwLock); + + if(pItem != NULL) + { + HASH_DEL(g_pCfgCacheItems, pItem); + free(pItem); + } + + pItem = (PCFG_CACHE_ITEM)malloc(sizeof(CFG_CACHE_ITEM)); + + strncpy(pItem->keyName, pKeyName, MAX_CFG_KEY_NAME); + pItem->tmCached = LIBUV_CURRENT_TIME_MS(); + + uv_rwlock_wrlock(&g_uvCacheRwLock); + HASH_ADD_STR(g_pCfgCacheItems, keyName, pItem); + uv_rwlock_wrunlock(&g_uvCacheRwLock); + + return (0); +} + +static PCFG_ITEM __cfgAddItem(const char *pKeyName, const char *pKeyValue, int iType, int overWrite, int saveToDB, int* pErr) +{ + PCFG_ITEM pCfgItem = NULL; + int iSize = 0; + char *pCache = NULL; + + uv_rwlock_rdlock(&g_uvHashRwLock); + HASH_FIND_STR(g_pCfgItems, pKeyName, pCfgItem); + uv_rwlock_rdunlock(&g_uvHashRwLock); + + if(pCfgItem != NULL) + { + if(overWrite) + { + HASH_DEL(g_pCfgItems, pCfgItem); + free(pCfgItem->pKeyName); + free(pCfgItem); + } + else + { + if(pErr) + { + *pErr = -ERR_CFG_NOITEM; + } + + return NULL; + } + } + + if(iType == CFG_TYPE_STRING) + { + iSize = strlen(pKeyName) + strlen(pKeyValue) + 2; + } + else + { + iSize = strlen(pKeyName) + 1; + } + + pCache = (char *)malloc(iSize); + + memset(pCache, 0, iSize); + pCfgItem = (PCFG_ITEM)malloc(sizeof(CFG_ITEM)); + + + pCfgItem->pKeyName = pCache; + + if(iType == CFG_TYPE_STRING) + { + pCfgItem->pStrValue = pCache + strlen(pKeyName) + 1; + } + + __cfgMsg2CfgItem(iType, pKeyName, pKeyValue, pCfgItem); + + uv_rwlock_wrlock(&g_uvHashRwLock); + HASH_ADD_STR(g_pCfgItems, pKeyName, pCfgItem); + uv_rwlock_wrunlock(&g_uvHashRwLock); + + // if need save this configure item to database + if(saveToDB) + { + __cfgAddToCache(pKeyName); + } + + if(pErr) + { + *pErr = 0; + } + + return (pCfgItem); +} + +static void __cfgSyncServer(void) +{ + if(HASH_COUNT(g_pCfgCacheItems) > 0) + { + PCFG_CACHE_ITEM pItem = NULL, pTemp = NULL; + + sqlite3_exec(g_pSqlFileDB, "BEGIN TRANSACTION;", NULL, NULL, NULL); + + HASH_ITER(hh, g_pCfgCacheItems, pItem, pTemp) + { + PCFG_ITEM pCfgItem = NULL; + + if(CfgGetKeyValue(pItem->keyName, &pCfgItem) == 0) + { + char* pSqlInsertCmd = (char*)malloc(1024 * 4); + char* pSqlUpgradeCmd = (char*)malloc(1024 * 4); + memset(pSqlInsertCmd, 0, 1024 * 4); + memset(pSqlUpgradeCmd, 0, 1024 * 4); + + if(pCfgItem->keyType == CFG_TYPE_STRING) + { + sprintf(pSqlInsertCmd, "INSERT OR IGNORE INTO %s (keyName, keyValue, keyType) VALUES (\'%s\', \'%s\', %d)", + MODULE_ALIAS_NAME(pCfgItem->keyModule), pCfgItem->pKeyName, pCfgItem->pStrValue, pCfgItem->keyType); + + sprintf(pSqlUpgradeCmd, "UPDATE %s SET keyValue = \'%s\', keyType = %d WHERE keyName = \'%s\'", + MODULE_ALIAS_NAME(pCfgItem->keyModule), pCfgItem->pStrValue, pCfgItem->keyType, pCfgItem->pKeyName); + } + else if(pCfgItem->keyType == CFG_TYPE_INT) + { + sprintf(pSqlInsertCmd, "INSERT OR IGNORE INTO %s (keyName, keyValue, keyType) VALUES (\'%s\', \'%d\', %d)", + MODULE_ALIAS_NAME(pCfgItem->keyModule), pCfgItem->pKeyName, pCfgItem->intValue, pCfgItem->keyType); + + sprintf(pSqlUpgradeCmd, "UPDATE %s SET keyValue = \'%d\', keyType = %d WHERE keyName = \'%s\'", + MODULE_ALIAS_NAME(pCfgItem->keyModule), pCfgItem->intValue, pCfgItem->keyType, pCfgItem->pKeyName); + } + else if(pCfgItem->keyType == CFG_TYPE_DOUBLE) + { + sprintf(pSqlInsertCmd, "INSERT OR IGNORE INTO %s (keyName, keyValue, keyType) VALUES (\'%s\', \'%f\', %d)", + MODULE_ALIAS_NAME(pCfgItem->keyModule), pCfgItem->pKeyName, pCfgItem->doubleValue, pCfgItem->keyType); + + sprintf(pSqlUpgradeCmd, "UPDATE %s SET keyValue = \'%f\', keyType = %d WHERE keyName = \'%s\'", + MODULE_ALIAS_NAME(pCfgItem->keyModule), pCfgItem->doubleValue, pCfgItem->keyType, pCfgItem->pKeyName); + } + + if((sqlite3_exec(g_pSqlFileDB, pSqlInsertCmd, NULL, NULL, NULL) == SQLITE_OK) + && (sqlite3_exec(g_pSqlFileDB, pSqlUpgradeCmd, NULL, NULL, NULL) == SQLITE_OK)) + { + // Delete this Key + HASH_DEL(g_pCfgCacheItems, pItem); + LOG_EX(LOG_Debug, "Sync Configure %s To Database\n", pCfgItem->pKeyName); + } + else + { + free(pSqlInsertCmd); + free(pSqlUpgradeCmd); + return; + } + + free(pSqlInsertCmd); + free(pSqlUpgradeCmd); + } + else + { + // Delete this Key + HASH_DEL(g_pCfgCacheItems, pItem); + } + } + + sqlite3_exec(g_pSqlFileDB, "END TRANSACTION;", NULL, NULL, NULL); + } +} +static void __uvThreadSyncCfg(void *pParams) +{ + while(TRUE) + { + __cfgSyncServer(); + sleep(CFG_SYNC_TIME_OF_SECONDS); + } + + pthread_detach(pthread_self()); +} + +static void __cfgStartSyncGlobalCfgSvr(void) +{ + uv_thread_t uvSyncThread; + + uv_rwlock_init(&g_uvCacheRwLock); + + uv_thread_create(&uvSyncThread, __uvThreadSyncCfg, NULL); +} + +static PCFG_ITEM __onCMD_CFG_GET_REQ(const char* pKeyName, int* pErr) +{ + PCFG_ITEM pItem = NULL; + + *pErr = CfgGetKeyValue(pKeyName, &pItem); + + if(*pErr == 0) + { + return (pItem); + } + + return (NULL); +} + +static int __onCMD_CFG_ADD_REQ(const char* pKeyName, const char* pKeyValue, int keyType) +{ + PCFG_ITEM pCfgItem = NULL; + int ret; + + if(pKeyName == NULL || pKeyValue == NULL || strlen(pKeyName) == 0 || strlen(pKeyValue) == 0) + { + return (-ERR_INPUT_PARAMS); + } + + if(keyType < 0 || keyType > CFG_TYPE_DOUBLE) + { + return (-ERR_INPUT_PARAMS); + } + + ret = __cfgMsg2CfgItemV2(keyType, pKeyName, pKeyValue, &pCfgItem); + + if(ret != 0) + { + return (ret); + } + + return CfgAddKeyValue(pKeyName, pCfgItem, TRUE); +} + +static void __cfgSvrProcessCmd(DBUS_CMD cmd, const char* pKeyName, const char* pKeyValue, int keyType, PCFG_API_RSP pRsp) +{ + PCFG_ITEM pItem = NULL; + int err; + + memset(pRsp, 0, sizeof(CFG_API_RSP)); + pRsp->errNo = -ERR_UNKNOWN_TYPE; + + if(pKeyName == NULL) + { + pRsp->errNo = -ERR_INPUT_PARAMS; + return; + } + + strncpy(pRsp->keyName, pKeyName, MAX_CFG_KEY_NAME); + + switch(cmd) + { + case CMD_CFG_ADD_REQ: + err = __onCMD_CFG_ADD_REQ(pKeyName, pKeyValue, keyType); + + pRsp->keyType = keyType; + pRsp->errNo = err; + strncpy(pRsp->keyName, pKeyName, MAX_CFG_KEY_NAME); + strncpy(pRsp->keyValue, pKeyValue, MAX_CFG_KEY_VALUE); + + break; + + case CMD_CFG_GET_REQ: + + pItem = __onCMD_CFG_GET_REQ(pKeyName, &err); + + if(pItem == NULL || err != 0) + { + pRsp->keyType = -1; + pRsp->errNo = err; + strncpy(pRsp->keyName, pKeyName, MAX_CFG_KEY_NAME); + return; + } + else + { + __cfgItem2CfgRsp(pItem, pRsp); + return; + } + + break; + } + + return; +} + +int CfgGlobalEnvInit(void) +{ + int rc = 0; + + uv_rwlock_init(&g_uvHashRwLock); + + rc = __cfgCreateCfgFile(GLOBAL_CFG_FILE_PATH); + + if(rc != SQLITE_OK) + { + return rc; + } + +#if 0 + rc = sqlite3_open_v2(":memory:", &g_pSqlMemDB, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL); + + if(rc != SQLITE_OK) + { + LOG_EX(LOG_Error, "Create Memory SQLite3 DB Error\n"); + return -ERR_CREATE_SQLITE3_DB; + } + + //rc = sqlite3SyncDatabase(g_pSqlMemDB, GLOBAL_CFG_FILE_PATH, 0); +#endif + rc = __cfgLoadGlobalConfig(); + + if(rc != SQLITE_OK) + { + return (-ERR_OPEN_SQLITE3_DB); + //sqlite3_close(g_pSqlFileDB); + } + +#if 0 + g_bIsCfgSvr = cfgCheckCfgSvrRun(); + + if(atexit(onProgressExit) != 0) + { + fprintf(stderr, "atexit error\n"); + } + + signal(SIGINT, onSigTermProgressExit); +#endif + + __cfgStartSyncGlobalCfgSvr(); + + return 0; +} + +void OnCfgMsgProcess(MODULE_NAME dest, DBUS_CMD busCmd, const char* pJsonStr) +{ + CFG_API_RSP cfgRsp; + int err = 0; + PCFG_API_REQ pReq = NULL; + PCFG_API_RSP pRsp = NULL; + PLIBUV_DBUS_PARAMS pParams = DBusLibuvGetRuntime(); + + switch(busCmd) + { + case CMD_CFG_ADD_REQ: + case CMD_CFG_GET_REQ: + pReq = Json2Struct(pJsonStr, JSON_ENGINE_CFG_REQ, TRUE, &err); + + if(pReq != NULL && err == 0) + { + pRsp = &cfgRsp; + __cfgSvrProcessCmd(busCmd, pReq->keyName, pReq->keyValue, pReq->keyType, pRsp); + DBusJsonSendToCommand(NULL, g_pModInfoTable[dest].modAliase, busCmd + 1, JSON_ENGINE_CFG_RSP, pRsp, TRUE); + } + + free(pReq); + break; +#if 0 + case CMD_CFG_GET_REQ: + pReq = Json2Struct(pJsonStr, JSON_ENGINE_CFG_REQ, TRUE, &err); + + if(pReq != NULL && err == 0) + { + pRsp = &cfgRsp; + __cfgSvrProcessCmd(busCmd, pReq->keyName, NULL, pReq->keyType, pRsp); + DBusJsonSendToCommand(NULL, g_pModInfoTable[dest].modAliase, CMD_CFG_GET_RSP, JSON_ENGINE_CFG_RSP, pRsp, TRUE); + } + break; +#endif + case CMD_CFG_ADD_RSP: + case CMD_CFG_GET_RSP: + pRsp = Json2Struct(pJsonStr, JSON_ENGINE_CFG_RSP, TRUE, &err); + + if(pRsp != NULL && err == 0 && pRsp->errNo == 0) + { + // Add to local Hash Table cache + PCFG_ITEM pCfgItem = __cfgAddItem(pRsp->keyName, pRsp->keyValue, pRsp->keyType, TRUE, FALSE, &err); + + if(err == 0 && pCfgItem != NULL) + { + if(pParams->onCfgCb) + { + pParams->onCfgCb(busCmd, pCfgItem, 0); + } + } + else + { + LOG_EX(LOG_Error, "Add Configure {[%s]<%d> = \"%s\"} Error: %d\n", + pRsp->keyName, pRsp->keyValue, pRsp->keyType, err); + } + } + else + { + if(pParams->onCfgCb) + { + pParams->onCfgCb(busCmd, NULL, (err == 0) ? pRsp->errNo : err); + } + + LOG_EX(LOG_Error, "pRsp = %p, err = %d, rspErr = %d\n", pRsp, err, pRsp ? pRsp->errNo : -err); + } + + free(pRsp); + break; + } +} diff --git a/Framework/Configure/ini_prase.c b/Framework/Configure/ini_prase.c new file mode 100644 index 0000000..8a85617 --- /dev/null +++ b/Framework/Configure/ini_prase.c @@ -0,0 +1,217 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "log.h" +#include "libuv_dbus.h" +#include "server_addr.h" + +#ifdef PLATFORM_R16 +#define DEVICE_CFG_FILE ("/mnt/UDISK/dev.conf") +#else +#define DEVICE_CFG_FILE ("./dev.conf") +#endif + +static config_t g_cfgInfo; + +void InitCfgToCfgFile(config_t* pCfg) +{ + config_setting_t *pRoot, *pSetting, *pGlobalgrp, *pLogGrp, *pSubGrp; + + if(pCfg == NULL) + { + return; + } + + pRoot = config_root_setting(pCfg); + + pGlobalgrp = config_setting_add(pRoot, "Global", CONFIG_TYPE_GROUP); + + pSetting = config_setting_add(pGlobalgrp, "ServerMode", CONFIG_TYPE_INT); + config_setting_set_int(pSetting, PUBLISH_MODE); + + pLogGrp = config_setting_add(pGlobalgrp, "Log", CONFIG_TYPE_GROUP); + + pSetting = config_setting_add(pLogGrp, "Enable", CONFIG_TYPE_BOOL); + config_setting_set_bool(pSetting, TRUE); + + pSetting = config_setting_add(pLogGrp, "Level", CONFIG_TYPE_INT); + config_setting_set_format(pSetting, CONFIG_FORMAT_HEX); + config_setting_set_int(pSetting, 0x000003FF); + + pSubGrp = config_setting_add(pLogGrp, "LogToEMail", CONFIG_TYPE_GROUP); + pSetting = config_setting_add(pSubGrp, "Enable", CONFIG_TYPE_BOOL); + config_setting_set_bool(pSetting, FALSE); + pSetting = config_setting_add(pSubGrp, "EMail", CONFIG_TYPE_STRING); + config_setting_set_string(pSetting, "pv1_es2@163.com"); + + pSetting = config_setting_add(pLogGrp, "LogToFile", CONFIG_TYPE_BOOL); + config_setting_set_bool(pSetting, TRUE); + + pSetting = config_setting_add(pLogGrp, "LogToServer", CONFIG_TYPE_BOOL); + config_setting_set_bool(pSetting, TRUE); + + pSubGrp = config_setting_add(pLogGrp, "LogToUDPServer", CONFIG_TYPE_GROUP); + pSetting = config_setting_add(pSubGrp, "Enable", CONFIG_TYPE_BOOL); + config_setting_set_bool(pSetting, FALSE); + pSetting = config_setting_add(pSubGrp, "UdpServerIp", CONFIG_TYPE_STRING); + config_setting_set_string(pSetting, "10.240.84.163"); + pSetting = config_setting_add(pSubGrp, "UdpBasePort", CONFIG_TYPE_INT); + config_setting_set_int(pSetting, 10000); + + + if(!config_write_file(pCfg, DEVICE_CFG_FILE)) + { + LOG_EX(LOG_Error, "Create Configure File %s Error\n", DEVICE_CFG_FILE); + } +} + +int CfgGetIntValue(const char* pTags, int defValue) +{ + int iValue = defValue; + + if(pTags == NULL || strlen(pTags) == 0) + { + return defValue; + } + + if(!config_lookup_int(&g_cfgInfo, pTags, &iValue)) + { + return defValue; + } + + return iValue; +} + +void CfgSetIntValue(const char* pTags, int iValue) +{ + config_setting_t *pRoot, *pGlobalgrp, *pSet; + + LOG_EX(LOG_Debug, "Set: %s --> %d\n", pTags, iValue); + + if(pTags == NULL || strlen(pTags) == 0) + { + LOG_EX(LOG_Error, "Input Params error: pTags = [%s]\n", pTags ? pTags : "NULL"); + return; + } + + pRoot = config_root_setting(&g_cfgInfo); + + if(pRoot == NULL) + { + LOG_EX(LOG_Error, "pRoot = NULL\n"); + return; + } + + pGlobalgrp = config_setting_get_member(pRoot, "Global"); + + if(pGlobalgrp == NULL) + { + LOG_EX(LOG_Error, "pGlobalgrp = NULL\n"); + return; + } + + pSet = config_setting_get_member(pGlobalgrp, pTags); + + if(!pSet) + { + pSet = config_setting_add(pGlobalgrp, pTags, CONFIG_TYPE_INT); + } + + if(pSet == NULL) + { + LOG_EX(LOG_Error, "pSet = NULL\n"); + return; + } + + config_setting_set_int(pSet, iValue); + + + if(!config_write_file(&g_cfgInfo, DEVICE_CFG_FILE)) + { + LOG_EX(LOG_Error, "Set %s Value Error\n", pTags); + } +} + +char* CfgGetStringValue(const char* pTags, char* pDefValue) +{ + char* pValue = pDefValue; + + if(pTags == NULL || strlen(pTags) == 0) + { + return pDefValue; + } + + if(!config_lookup_string(&g_cfgInfo, pTags, (const char**)&pValue)) + { + return pDefValue; + } + + return pValue; +} + +double CfgGetFloatValue(const char* pTags, double defValue) +{ + double dValue = defValue; + + if(pTags == NULL || strlen(pTags) == 0) + { + return defValue; + } + + if(!config_lookup_float(&g_cfgInfo, pTags, &dValue)) + { + return defValue; + } + + return dValue; +} + +int CfgGetBoolValue(const char* pTags, int defValue) +{ + int iValue = defValue; + + if(pTags == NULL || strlen(pTags) == 0) + { + return defValue; + } + + if(!config_lookup_bool(&g_cfgInfo, pTags, &iValue)) + { + return defValue; + } + + return iValue; +} + +void CfgFileInit(void) +{ + //config_setting_t *pRoot, *pSetting; + + config_init(&g_cfgInfo); + +#if 0 + config_set_options(&g_cfgInfo, + (CONFIG_OPTION_SEMICOLON_SEPARATORS + | CONFIG_OPTION_COLON_ASSIGNMENT_FOR_GROUPS + | CONFIG_OPTION_OPEN_BRACE_ON_SEPARATE_LINE)); +#endif + + config_set_tab_width(&g_cfgInfo, 4); + + if(access(DEVICE_CFG_FILE, F_OK) != 0) + { + InitCfgToCfgFile(&g_cfgInfo); + } + else if(!config_read_file(&g_cfgInfo, DEVICE_CFG_FILE)) + { + LOG_EX(LOG_Error, "Read Configure File %s Error\n", DEVICE_CFG_FILE); + return; + } +} diff --git a/Framework/Crypto/aes.c b/Framework/Crypto/aes.c new file mode 100644 index 0000000..afff0ac --- /dev/null +++ b/Framework/Crypto/aes.c @@ -0,0 +1,104 @@ +#include +#include +#include +#include + +#include "log.h" +#include "smart_sound.h" +#include "crypto.h" +#include "libuv_dbus.h" + +int EvpAESEncrypto(unsigned char* pInBuf, + int iSize, + unsigned char* pOutBuf, + int* pOutSize, + unsigned char* pKey) +{ + int enBytes = 0; + EVP_CIPHER_CTX ctx; + //int decDataLen = 0; + if(!pInBuf || !pOutBuf || !pOutSize || !pKey) + { + return -ERR_INPUT_PARAMS; + } + + *pOutSize = 0; + //decDataLen = ((iSize + AES_BLOCK_SIZE - 1) / AES_BLOCK_SIZE) * AES_BLOCK_SIZE; + + EVP_CIPHER_CTX_init(&ctx); + + if(EVP_EncryptInit_ex(&ctx, EVP_aes_128_ecb(), NULL, pKey, NULL) == 0) + { + LOG_EX(LOG_Error, "EVP_EncryptInit_ex Error\n"); + return -ERR_EVP_INIT_KEY; + } + + if(EVP_EncryptUpdate(&ctx, pOutBuf, &enBytes, pInBuf, iSize) == 0) + { + LOG_EX(LOG_Error, "EVP_EncryptUpdate Error\n"); + return -ERR_EVP_UPDATE; + } + + pOutBuf += enBytes; + pInBuf += enBytes; + *pOutSize += enBytes; + + if(EVP_EncryptFinal_ex(&ctx, pOutBuf, &enBytes) == 0) + { + LOG_EX(LOG_Error, "EVP_EncryptFinal_ex Error\n"); + return -ERR_EVP_FINALE; + } + + *pOutSize += enBytes; + + EVP_CIPHER_CTX_cleanup(&ctx); + + return 0; +} + +int EvpAESDecrypto(unsigned char* pInBuf, + int iSize, + unsigned char* pOutBuf, + int* pOutSize, + unsigned char* pKey) +{ + int deBytes = 0; + EVP_CIPHER_CTX ctx; + + if(!pInBuf || !pOutBuf || !pOutSize || !pKey) + { + return -ERR_INPUT_PARAMS; + } + + EVP_CIPHER_CTX_init(&ctx); + + *pOutSize = 0; + + if(EVP_DecryptInit_ex(&ctx, EVP_aes_128_ecb(), NULL, pKey, NULL) == 0) + { + LOG_EX(LOG_Error, "EVP_DecryptInit_ex Error\n"); + return -ERR_EVP_INIT_KEY; + } + + if(EVP_DecryptUpdate(&ctx, pOutBuf, &deBytes, pInBuf, iSize) == 0) + { + LOG_EX(LOG_Error, "EVP_EncryptUpdate Error\n"); + return -ERR_EVP_UPDATE; + } + + pOutBuf += deBytes; + pInBuf += deBytes; + *pOutSize += deBytes; + + if(EVP_DecryptFinal_ex(&ctx, pOutBuf, &deBytes) == 0) + { + LOG_EX(LOG_Error, "EVP_EncryptFinal_ex Error\n"); + return -ERR_EVP_FINALE; + } + + *pOutSize += deBytes; + EVP_CIPHER_CTX_cleanup(&ctx); + + return 0; +} + diff --git a/Framework/Crypto/base64.c b/Framework/Crypto/base64.c new file mode 100644 index 0000000..6941073 --- /dev/null +++ b/Framework/Crypto/base64.c @@ -0,0 +1,158 @@ +#include +#include +#include +#include + +#include "log.h" +#include "crypto.h" + +const char* EvpBase64Encode(const char* pSrc) +{ + EVP_ENCODE_CTX ctx; + int enSize = 0; + int sLen, size; + char* pEncode = NULL; + + if(pSrc == NULL || strlen(pSrc) == 0) + { + return (NULL); + } + + sLen = strlen(pSrc); + size = ((sLen / 3) * 4) + 4 + (sLen / 64) + sLen % 64; + + pEncode = (char*)malloc(size); + memset(pEncode, 0, size); + + EVP_EncodeInit(&ctx); + EVP_EncodeUpdate(&ctx, pEncode, &enSize, pSrc, strlen(pSrc)); + EVP_EncodeFinal(&ctx, pEncode + enSize, &enSize); + +// fprintf(stdout, "Src: \n[%s]\n", pSrc); +// fprintf(stdout, "Base64(%d --> %d | %d) Bytes: \n[%s]\n", sLen, size, strlen(pEncode), pEncode); + + return pEncode; +} + +const char* EvpBase64Decode(const char* pBase64) +{ + EVP_ENCODE_CTX ctx; + int enSize = 0; + int size = 0; + char *pDecode = NULL; + + if(pBase64 == NULL || strlen(pBase64) == 0) + { + return (NULL); + } + + size = strlen(pBase64); + pDecode = (char*)malloc(size); + memset(pDecode, 0, size); + + EVP_DecodeInit(&ctx); + EVP_DecodeUpdate(&ctx, pDecode, &enSize, pBase64, strlen(pBase64)); + EVP_DecodeFinal(&ctx, pDecode + enSize, &enSize); + +// fprintf(stdout, "Decode(%d --> %d) Bytes: \n[%s]\n", size, strlen(pDecode), pDecode); + + return pDecode; +} + +const char* EvpBase64EncodeNoAlign(const char* pSrc) +{ + int size, sLen; + char* pEncode = NULL; + + if(pSrc == NULL || strlen(pSrc) == 0) + { + return (NULL); + } + + sLen = strlen(pSrc); + size = ((sLen / 3) * 4) + 4 + (sLen / 64) + sLen % 64; + + pEncode = (char*)malloc(size); + memset(pEncode, 0, size); + + EVP_EncodeBlock(pEncode, (const unsigned char *)pSrc, sLen); +// fprintf(stdout, "Src: \n[%s]\n", pSrc); +// fprintf(stdout, "Base64(%d --> %d | %d) Bytes: \n[%s]\n", sLen, size, strlen(pEncode), pEncode); + + return pEncode; +} + +const char* EvpBase64EncodeNoAlignV2(unsigned char* pSrc, int sLen) +{ + int size; + char* pEncode = NULL; + + if(pSrc == NULL || sLen <= 0) + { + return (NULL); + } + + size = ((sLen / 3) * 4) + 4 + (sLen / 64) + sLen % 64; + + pEncode = (char*)malloc(size); + memset(pEncode, 0, size); + + EVP_EncodeBlock(pEncode, (const unsigned char *)pSrc, sLen); +// fprintf(stdout, "Src: \n[%s]\n", pSrc); +// fprintf(stdout, "Base64(%d --> %d | %d) Bytes: \n[%s]\n", sLen, size, strlen(pEncode), pEncode); + + return pEncode; +} + +const char* EvpBase64DecodeNoAlign(const char *pBase64) +{ + int size = 0; + char *pDecode = NULL; + + if(pBase64 == NULL || strlen(pBase64) == 0) + { + return (NULL); + } + + size = strlen(pBase64); + + pDecode = (char*)malloc(size); + memset(pDecode, 0, size); + + //CRYPTO_w_lock(CRYPTO_LOCK_DYNLOCK); + EVP_DecodeBlock(pDecode, (const unsigned char *)pBase64, size); + //CRYPTO_w_unlock(CRYPTO_LOCK_DYNLOCK); + +// fprintf(stdout, "Decode(%d --> %d) Bytes: \n[%s]\n", size, strlen(pDecode), pDecode); + + return pDecode; +} + +unsigned char* EvpBase64DecodeNoAlignV2(const char *pBase64, int* pOutSize) +{ + int size = 0; + unsigned char *pDecode = NULL; + + if(pBase64 == NULL || strlen(pBase64) == 0) + { + return (NULL); + } + + size = strlen(pBase64); + + pDecode = (char*)malloc(size); + memset(pDecode, 0, size); + + //CRYPTO_w_lock(CRYPTO_LOCK_DYNLOCK); + size = EVP_DecodeBlock(pDecode, (const unsigned char *)pBase64, size); + //CRYPTO_w_unlock(CRYPTO_LOCK_DYNLOCK); + +// fprintf(stdout, "Decode(%d --> %d) Bytes: \n[%s]\n", size, strlen(pDecode), pDecode); + + if(pOutSize) + { + *pOutSize = size; + } + + return (pDecode); +} diff --git a/Framework/Crypto/crypto.c b/Framework/Crypto/crypto.c new file mode 100644 index 0000000..226f1a3 --- /dev/null +++ b/Framework/Crypto/crypto.c @@ -0,0 +1,187 @@ +#include +#include +#include +#include + +#include "log.h" +#include "smart_sound.h" +#include "crypto.h" +#include "libuv_dbus.h" + +static uv_mutex_t *pEvpMutex = NULL; +typedef struct +{ + CRYPTO_TYPE type; + unsigned char* pInData; + int iInSize; + unsigned char* pOutData; + unsigned char pKey[EVP_MAX_KEY_LENGTH + 1]; + OnEVPCrypto onEvpEventCb; +} CRYPT_TASK_PARAMS, *PCRYPT_TASK_PARAMS; + +static void FreeEVPWorkCb(uv_work_t* pWork, int status) +{ + PCRYPT_TASK_PARAMS pTask = (PCRYPT_TASK_PARAMS)pWork->data; + free(pTask->pInData); + free(pTask); + free(pWork); +} + +static void OnEVPWorkCb(uv_work_t* pWork) +{ + PCRYPT_TASK_PARAMS pTask = (PCRYPT_TASK_PARAMS)pWork->data; + int iOutSize = 0; + int iError = 0; + + switch(pTask->type) + { + case CRYPTO_AES_ENCRYPT: + iError = EvpAESEncrypto(pTask->pInData, + pTask->iInSize, + pTask->pOutData, + &iOutSize, + pTask->pKey); + break; + + case CRYPTO_AES_DECRYPT: + iError = EvpAESDecrypto(pTask->pInData, + pTask->iInSize, + pTask->pOutData, + &iOutSize, + pTask->pKey); + break; + + case CRYPTO_BASE64_ENCODE: + pTask->pOutData = (unsigned char*)EvpBase64Encode((const char*)pTask->pInData); + iOutSize = strlen((char*)pTask->pOutData); + break; + + case CRYPTO_BASE64_DECODE: + pTask->pOutData = (unsigned char*)EvpBase64Decode((const char*)pTask->pInData); + iOutSize = strlen((char*)pTask->pOutData); + break; + + case CRYPTO_MD5_FILE: + pTask->pOutData = (unsigned char*)EvpMD5HashFile((const char*)pTask->pInData); + iOutSize = strlen((char*)pTask->pOutData); + break; + + default: + iError = -ERR_UNSUP_EVP_TYPE; + } + + if(iError != 0) + { + pTask->onEvpEventCb(pTask->type, pTask->pOutData, 0, pTask->pInData, iError); + } + else + { + pTask->onEvpEventCb(pTask->type, pTask->pOutData, iOutSize, pTask->pInData, 0); + } +} + +int EvpAddCryptoTask(CRYPTO_TYPE type, + unsigned char* pInBuf, + int iSize, + unsigned char* pOutBuf, + char* pKey, + OnEVPCrypto onEvpCryptCb) +{ + uv_work_t* puvWork = NULL; + PCRYPT_TASK_PARAMS pTask = NULL; + PLIBUV_DBUS_PARAMS pContext = DBusLibuvGetRuntime(); + + if(!pContext || !onEvpCryptCb) + { + return -ERR_INPUT_PARAMS; + } + + if(type == CRYPTO_AES_ENCRYPT || type == CRYPTO_AES_DECRYPT) + { + if(pKey == NULL || pOutBuf == NULL) + { + return -ERR_INPUT_PARAMS; + } + + switch(strlen(pKey) * 8) + { + case 128: + case 192: + case 256: + break; + default: + return -ERR_EVP_KEY_SIZE; + } + } + else if(type == CRYPTO_MD5_FILE) + { + uv_fs_t uvFs; + if(uv_fs_access(pContext->pLoop, &uvFs, (const char*)pInBuf, F_OK, NULL) != 0) + { + return -ERR_FILE_NOT_EXISTS; + } + } + + pTask = (PCRYPT_TASK_PARAMS)malloc(sizeof(CRYPT_TASK_PARAMS)); + puvWork = (uv_work_t*)malloc(sizeof(uv_work_t)); + + puvWork->data = (void*)pTask; + + pTask->type = type; + pTask->pInData = (unsigned char*)malloc(iSize + 1); + pTask->iInSize = iSize; + pTask->pOutData = pOutBuf; + pTask->onEvpEventCb = onEvpCryptCb; + + memset(pTask->pInData, 0, iSize + 1); + memset(pTask->pKey, 0, EVP_MAX_KEY_LENGTH + 1); + + if(pKey) + { + strncpy(pTask->pKey, pKey, EVP_MAX_KEY_LENGTH); + } + + memcpy(pTask->pInData, pInBuf, iSize); + + uv_queue_work(pContext->pLoop, puvWork, OnEVPWorkCb, FreeEVPWorkCb); + + return 0; +} + +static void __evpLockCb(int mode, int n, const char *pFile, int line) +{ + if(n >= CRYPTO_num_locks()) + { + return; + } + + if(mode & CRYPTO_LOCK) + { + uv_mutex_lock(&pEvpMutex[n]); + } + else + { + uv_mutex_unlock(&pEvpMutex[n]); + } +} + + +static unsigned long __evpIdCb(void) +{ + return ((unsigned long)uv_thread_self()); +} + +void EvpSystemInit(void) +{ + int i = 0; + + pEvpMutex = (uv_mutex_t *)malloc(CRYPTO_num_locks() * sizeof(uv_mutex_t)); + + for(i = 0; i < CRYPTO_num_locks(); i++) + { + uv_mutex_init(&pEvpMutex[i]); + } + + CRYPTO_set_id_callback(__evpIdCb); + CRYPTO_set_locking_callback(__evpLockCb); +} diff --git a/Framework/Crypto/md5.c b/Framework/Crypto/md5.c new file mode 100644 index 0000000..655e7b0 --- /dev/null +++ b/Framework/Crypto/md5.c @@ -0,0 +1,156 @@ +#include +#include +#include +#include +#include +#include + +#include "log.h" +#include "crypto.h" +#include "libuv_dbus.h" + +const char* EvpMD5HashFile(const char* pFileName) +{ + int rdSize = 0; + int fd, size; + uint8_t md5[EVP_MAX_MD_SIZE]; + uint8_t buf[1024]; + EVP_MD_CTX ctx; + char* pString = NULL; + + memset(md5, 0, EVP_MAX_MD_SIZE); + EVP_MD_CTX_init(&ctx); + EVP_DigestInit_ex(&ctx, EVP_md5(), NULL); + + fd = open(pFileName, O_RDONLY); + + if(fd == -1) + { + LOG_EX(LOG_Error, "Open File \'%s\' error\n", pFileName); + return NULL; + } + do + { + rdSize = read(fd, buf, 1024); + + if(rdSize > 0) + { + EVP_DigestUpdate(&ctx, buf, rdSize); + } + } while(rdSize > 0); + + close(fd); + + EVP_DigestFinal_ex(&ctx, md5, &rdSize); + EVP_MD_CTX_cleanup(&ctx); + + size = rdSize * 2 + 1; + + pString = (char*)malloc(size); + memset(pString, 0, size); + + IHW_bin2hex(pString, md5, rdSize); + +// print_hex_dump_bytes("MD5_", DUMP_PREFIX_ADDRESS, md5, rdSize); +// fprintf(stdout, "MD5: [%s]\n", pString); + + return (const char*)pString; +} + +int EvpMD5HashFileV2(const char* pFileName, unsigned char md5[16]) +{ + int rdSize = 0; + int fd; + uint8_t buf[1024]; + EVP_MD_CTX ctx; + //char* pString = NULL; + + memset(md5, 0, 16); + EVP_MD_CTX_init(&ctx); + EVP_DigestInit_ex(&ctx, EVP_md5(), NULL); + + fd = open(pFileName, O_RDONLY); + + if(fd == -1) + { + LOG_EX(LOG_Error, "Open File %s error\n", pFileName); + return (-ERR_OPEN_FILE); + } + do + { + rdSize = read(fd, buf, 1024); + + EVP_DigestUpdate(&ctx, buf, rdSize); + } while(rdSize > 0); + + close(fd); + + EVP_DigestFinal_ex(&ctx, md5, &rdSize); + EVP_MD_CTX_cleanup(&ctx); + + +// print_hex_dump_bytes("MD5_", DUMP_PREFIX_ADDRESS, md5, rdSize); +// fprintf(stdout, "MD5: [%s]\n", pString); + + return 0; +} + +int EvpMD5HashBuf(const unsigned char* pBuf, int iBufLen, unsigned char* pOutBuf, int* pOutSize) +{ + EVP_MD_CTX ctx; + + if(pBuf == NULL || pOutBuf == NULL) + { + return (-ERR_INPUT_PARAMS); + } + + memset(pOutBuf, 0, EVP_MAX_MD_SIZE); + EVP_MD_CTX_init(&ctx); + EVP_DigestInit_ex(&ctx, EVP_md5(), NULL); + EVP_DigestUpdate(&ctx, pBuf, iBufLen); + EVP_DigestFinal_ex(&ctx, pOutBuf, &iBufLen); + EVP_MD_CTX_cleanup(&ctx); + + if(pOutSize) + { + *pOutSize = iBufLen; + } + + //print_hex_dump_bytes("MD5_", DUMP_PREFIX_ADDRESS, pOutBuf, iBufLen); + + return 0; +} + +const char* EvpMD5HashBufV2(const unsigned char* pBuf, int iBufLen) +{ + int size = 0; + EVP_MD_CTX ctx; + uint8_t md5[EVP_MAX_MD_SIZE]; + char* pString = NULL; + + if(pBuf == NULL || iBufLen <= 0) + { + return NULL; + } + + memset(md5, 0, EVP_MAX_MD_SIZE); + EVP_MD_CTX_init(&ctx); + EVP_DigestInit_ex(&ctx, EVP_md5(), NULL); + EVP_DigestUpdate(&ctx, pBuf, iBufLen); + EVP_DigestFinal_ex(&ctx, md5, &iBufLen); + EVP_MD_CTX_cleanup(&ctx); + + //print_hex_dump_bytes("MD5_", DUMP_PREFIX_ADDRESS, pOutBuf, iBufLen); + + size = iBufLen * 2 + 1; + + pString = (char*)malloc(size); + memset(pString, 0, size); + + IHW_bin2hex(pString, md5, iBufLen); + +// print_hex_dump_bytes("MD5_", DUMP_PREFIX_ADDRESS, md5, rdSize); +// fprintf(stdout, "MD5: [%s]\n", pString); + + return (const char*)pString; +} diff --git a/Framework/Fifo/fifo.c b/Framework/Fifo/fifo.c new file mode 100644 index 0000000..d81a3e9 --- /dev/null +++ b/Framework/Fifo/fifo.c @@ -0,0 +1,554 @@ +/* + * A generic kernel FIFO implementation + * + * Copyright (C) 2009/2010 Stefani Seibold + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ +#if 0 +#include +#include +#include +#include +#include +#include +#include +#endif + +#include +#include +#include +#include + +#include "fifo.h" + +#define is_power_of_2(x) ((x) != 0 && (((x) & ((x) - 1)) == 0)) +#define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) +#define min(x,y) ({ \ + typeof(x) _x = (x); \ + typeof(y) _y = (y); \ + (void) (&_x == &_y); \ + _x < _y ? _x : _y; }) + +#define max(x,y) ({ \ + typeof(x) _x = (x); \ + typeof(y) _y = (y); \ + (void) (&_x == &_y); \ + _x > _y ? _x : _y; }) + +//#define EINVAL (1) +//#define ENOMEM (2) + +static inline int fls(int x); + +#ifdef PLATFORM_R16 +static inline int constant_fls(int x) +{ + int r = 32; + + if (!x) + return 0; + if (!(x & 0xffff0000u)) { + x <<= 16; + r -= 16; + } + if (!(x & 0xff000000u)) { + x <<= 8; + r -= 8; + } + if (!(x & 0xf0000000u)) { + x <<= 4; + r -= 4; + } + if (!(x & 0xc0000000u)) { + x <<= 2; + r -= 2; + } + if (!(x & 0x80000000u)) { + x <<= 1; + r -= 1; + } + return r; +} + +static int fls64(unsigned long long x) +{ + unsigned int h = x >> 32; + if (h) + return fls(h) + 32; + return fls(x); +} + +static inline int fls(int x) +{ + int ret; + + if (__builtin_constant_p(x)) + return constant_fls(x); + + asm("clz\t%0, %1" : "=r" (ret) : "r" (x)); + ret = 32 - ret; + return ret; +} +#endif + +#ifdef PLATFORM_CPU +#define __fls(x) (fls(x) - 1) +static __always_inline int fls64(unsigned long x) +{ + if (x == 0) + return 0; + return __fls(x) + 1; +} + +static inline int fls(int x) +{ + int r; + + long tmp = -1; + asm("bsrl %1,%0" + : "=r" (r) + : "rm" (x), "0" (tmp)); +#if 0 +#ifdef CONFIG_X86_64 + /* + * AMD64 says BSRL won't clobber the dest reg if x==0; Intel64 says the + * dest reg is undefined if x==0, but their CPU architect says its + * value is written to set it to the same as before, except that the + * top 32 bits will be cleared. + * + * We cannot do this on 32 bits because at the very least some + * 486 CPUs did not behave this way. + */ + long tmp = -1; + asm("bsrl %1,%0" + : "=r" (r) + : "rm" (x), "0" (tmp)); +#elif defined(CONFIG_X86_CMOV) + asm("bsrl %1,%0\n\t" + "cmovzl %2,%0" + : "=&r" (r) : "rm" (x), "rm" (-1)); +#else + asm("bsrl %1,%0\n\t" + "jnz 1f\n\t" + "movl $-1,%0\n" + "1:" : "=r" (r) : "rm" (x)); +#endif +#endif + return r + 1; +} +#endif +/* + * internal helper to calculate the unused elements in a fifo + */ +static inline unsigned int kfifo_unused(struct __kfifo *fifo) +{ + return (fifo->mask + 1) - (fifo->in - fifo->out); +} + +static inline unsigned fls_long(unsigned long l) +{ + if (sizeof(l) == 4) + return fls(l); + return fls64(l); +} + +unsigned long roundup_pow_of_two(unsigned long n) +{ + return 1UL << (fls_long(n)); +} + +int __kfifo_alloc(struct __kfifo *fifo, unsigned int size, unsigned int esize) +{ + /* + * round down to the next power of 2, since our 'let the indices + * wrap' technique works only in this case. + */ + if (!is_power_of_2(size)) + size = roundup_pow_of_two(size); + + fprintf(stdout, "+++++++++++kfifo malloc size = %u\n", size); + + fifo->in = 0; + fifo->out = 0; + fifo->esize = esize; + + if (size < 2) { + fifo->data = NULL; + fifo->mask = 0; + return -EINVAL; + } + + fifo->data = malloc(size * esize); + + if (!fifo->data) { + fifo->mask = 0; + return -ENOMEM; + } + fifo->mask = size - 1; + uv_mutex_init(&fifo->lock); + + return 0; +} + +void __kfifo_free(struct __kfifo *fifo) +{ + free(fifo->data); + fifo->in = 0; + fifo->out = 0; + fifo->esize = 0; + fifo->data = NULL; + fifo->mask = 0; +} + +int __kfifo_init(struct __kfifo *fifo, void *buffer, + unsigned int size, unsigned int esize) +{ + size /= esize; + + if (!is_power_of_2(size)) + size = roundup_pow_of_two(size); + + fifo->in = 0; + fifo->out = 0; + fifo->esize = esize; + fifo->data = buffer; + + if (size < 2) { + fifo->mask = 0; + return -EINVAL; + } + fifo->mask = size - 1; + uv_mutex_init(&fifo->lock); + + return 0; +} + +static void kfifo_copy_in(struct __kfifo *fifo, const void *src, + unsigned int len, unsigned int off) +{ + unsigned int size = fifo->mask + 1; + unsigned int esize = fifo->esize; + unsigned int l; + + off &= fifo->mask; + if (esize != 1) { + off *= esize; + size *= esize; + len *= esize; + } + l = min(len, size - off); + + memcpy(fifo->data + off, src, l); + memcpy(fifo->data, src + l, len - l); + /* + * make sure that the data in the fifo is up to date before + * incrementing the fifo->in index counter + */ +// smp_wmb(); +} + +unsigned int __kfifo_in(struct __kfifo *fifo, + const void *buf, unsigned int len) +{ + unsigned int l; + + l = kfifo_unused(fifo); + if (len > l) + len = l; + + kfifo_copy_in(fifo, buf, len, fifo->in); + fifo->in += len; + return len; +} + +static void kfifo_copy_out(struct __kfifo *fifo, void *dst, + unsigned int len, unsigned int off) +{ + unsigned int size = fifo->mask + 1; + unsigned int esize = fifo->esize; + unsigned int l; + + off &= fifo->mask; + if (esize != 1) { + off *= esize; + size *= esize; + len *= esize; + } + l = min(len, size - off); + + if (dst) { + memcpy(dst, fifo->data + off, l); + memcpy(dst + l, fifo->data, len - l); + } + /* + * make sure that the data is copied before + * incrementing the fifo->out index counter + */ +// smp_wmb(); +} + +unsigned int __kfifo_out_peek(struct __kfifo *fifo, + void *buf, unsigned int len) +{ + unsigned int l; + + l = fifo->in - fifo->out; + if (len > l) + len = l; + + kfifo_copy_out(fifo, buf, len, fifo->out); + return len; +} + +unsigned int __kfifo_out(struct __kfifo *fifo, + void *buf, unsigned int len) +{ + len = __kfifo_out_peek(fifo, buf, len); + fifo->out += len; + return len; +} + +#if 0 +static unsigned long kfifo_copy_from_user(struct __kfifo *fifo, + const void *from, unsigned int len, unsigned int off, + unsigned int *copied) +{ + unsigned int size = fifo->mask + 1; + unsigned int esize = fifo->esize; + unsigned int l; + unsigned long ret; + + off &= fifo->mask; + if (esize != 1) { + off *= esize; + size *= esize; + len *= esize; + } + l = min(len, size - off); + + ret = memcpy(fifo->data + off, from, l); + if (unlikely(ret)) + ret = DIV_ROUND_UP(ret + len - l, esize); + else { + ret = memcpy(fifo->data, from + l, len - l); + if (unlikely(ret)) + ret = DIV_ROUND_UP(ret, esize); + } + /* + * make sure that the data in the fifo is up to date before + * incrementing the fifo->in index counter + */ +// smp_wmb(); + *copied = len - ret; + /* return the number of elements which are not copied */ + return ret; +} + +int __kfifo_from_user(struct __kfifo *fifo, const void __user *from, + unsigned long len, unsigned int *copied) +{ + unsigned int l; + unsigned long ret; + unsigned int esize = fifo->esize; + int err; + + if (esize != 1) + len /= esize; + + l = kfifo_unused(fifo); + if (len > l) + len = l; + + ret = kfifo_copy_from_user(fifo, from, len, fifo->in, copied); + if (unlikely(ret)) { + len -= ret; + err = -EFAULT; + } else + err = 0; + fifo->in += len; + return err; +} + +static unsigned long kfifo_copy_to_user(struct __kfifo *fifo, void __user *to, + unsigned int len, unsigned int off, unsigned int *copied) +{ + unsigned int l; + unsigned long ret; + unsigned int size = fifo->mask + 1; + unsigned int esize = fifo->esize; + + off &= fifo->mask; + if (esize != 1) { + off *= esize; + size *= esize; + len *= esize; + } + l = min(len, size - off); + + ret = memcpy(to, fifo->data + off, l); + if (unlikely(ret)) + ret = DIV_ROUND_UP(ret + len - l, esize); + else { + ret = memcpy(to + l, fifo->data, len - l); + if (unlikely(ret)) + ret = DIV_ROUND_UP(ret, esize); + } + /* + * make sure that the data is copied before + * incrementing the fifo->out index counter + */ + //smp_wmb(); + *copied = len - ret; + /* return the number of elements which are not copied */ + return ret; +} + +int __kfifo_to_user(struct __kfifo *fifo, void __user *to, + unsigned long len, unsigned int *copied) +{ + unsigned int l; + unsigned long ret; + unsigned int esize = fifo->esize; + int err; + + if (esize != 1) + len /= esize; + + l = fifo->in - fifo->out; + if (len > l) + len = l; + ret = kfifo_copy_to_user(fifo, to, len, fifo->out, copied); + if (unlikely(ret)) { + len -= ret; + err = -EFAULT; + } else + err = 0; + fifo->out += len; + return err; +} +#endif + +unsigned int __kfifo_max_r(unsigned int len, unsigned int recsize) +{ + unsigned int max = (1 << (recsize << 3)) - 1; + + if (len > max) + return max; + return len; +} + +#define __KFIFO_PEEK(data, out, mask) \ + ((data)[(out) & (mask)]) +/* + * __kfifo_peek_n internal helper function for determinate the length of + * the next record in the fifo + */ +static unsigned int __kfifo_peek_n(struct __kfifo *fifo, unsigned int recsize) +{ + unsigned int l; + unsigned int mask = fifo->mask; + unsigned char *data = fifo->data; + + l = __KFIFO_PEEK(data, fifo->out, mask); + + if (--recsize) + l |= __KFIFO_PEEK(data, fifo->out + 1, mask) << 8; + + return l; +} + +#define __KFIFO_POKE(data, in, mask, val) \ + ( \ + (data)[(in) & (mask)] = (unsigned char)(val) \ + ) + +/* + * __kfifo_poke_n internal helper function for storeing the length of + * the record into the fifo + */ +static void __kfifo_poke_n(struct __kfifo *fifo, unsigned int n, unsigned int recsize) +{ + unsigned int mask = fifo->mask; + unsigned char *data = fifo->data; + + __KFIFO_POKE(data, fifo->in, mask, n); + + if (recsize > 1) + __KFIFO_POKE(data, fifo->in + 1, mask, n >> 8); +} + +unsigned int __kfifo_len_r(struct __kfifo *fifo, unsigned int recsize) +{ + return __kfifo_peek_n(fifo, recsize); +} + +unsigned int __kfifo_in_r(struct __kfifo *fifo, const void *buf, + unsigned int len, unsigned int recsize) +{ + if (len + recsize > kfifo_unused(fifo)) + return 0; + + __kfifo_poke_n(fifo, len, recsize); + + kfifo_copy_in(fifo, buf, len, fifo->in + recsize); + fifo->in += len + recsize; + return len; +} + +static unsigned int kfifo_out_copy_r(struct __kfifo *fifo, + void *buf, unsigned int len, unsigned int recsize, unsigned int *n) +{ + *n = __kfifo_peek_n(fifo, recsize); + + if (len > *n) + len = *n; + + kfifo_copy_out(fifo, buf, len, fifo->out + recsize); + return len; +} + +unsigned int __kfifo_out_peek_r(struct __kfifo *fifo, void *buf, + unsigned int len, unsigned int recsize) +{ + unsigned int n; + + if (fifo->in == fifo->out) + return 0; + + return kfifo_out_copy_r(fifo, buf, len, recsize, &n); +} + +unsigned int __kfifo_out_r(struct __kfifo *fifo, void *buf, + unsigned int len, unsigned int recsize) +{ + unsigned int n; + + if (fifo->in == fifo->out) + return 0; + + len = kfifo_out_copy_r(fifo, buf, len, recsize, &n); + fifo->out += n + recsize; + return len; +} + +void __kfifo_skip_r(struct __kfifo *fifo, unsigned int recsize) +{ + unsigned int n; + + n = __kfifo_peek_n(fifo, recsize); + fifo->out += n + recsize; +} diff --git a/Framework/HeartDaemon/heart_daemon.c b/Framework/HeartDaemon/heart_daemon.c new file mode 100644 index 0000000..80e190b --- /dev/null +++ b/Framework/HeartDaemon/heart_daemon.c @@ -0,0 +1,197 @@ +#include +#include +#include +#include +#include "log.h" +#include "libuv_dbus.h" + +typedef struct +{ + MODULE_NAME modName; + uint32_t hTm[MODULE_MAX]; + int isDaemonWork[MODULE_MAX]; + int isConnected[MODULE_MAX]; + OnDaemonMsg pOnHeartLostCb; +} HEART_DAEMON, *PHEART_DAEMON; + +uint32_t g_hblTout = HEART_LOST_DELAY; ///< nano second: heart lost timeout, default 1s +static uv_loop_t *g_DeamonLoop; +static uv_idle_t g_uvDeamonIdle; +static HEART_DAEMON g_heartDaemon; + +static unsigned int g_Cnt = 0; +static int timerExpire(uint32_t tm, uint32_t tExp) +{ + uint32_t now = LIBUV_CURRENT_TIME_MS(); + int64_t diff = now - tm; + + if(tm == 0 || tExp == 0) + { + return 0; + } + + if(diff > tExp * 1000) + { + return 0; + } + else if(diff >= tExp) + { + return 1; + } + + return (0); +} + +static void RunPingSvr(void) +{ + int ret = 0; + unsigned int tm = LIBUV_CURRENT_TIME_MS(); + PING_MSG pMsg; + struct timeval tv; + + gettimeofday(&tv, NULL); + + pMsg.PING = (double)tm / 1000; + pMsg.tmSec = tv.tv_sec; + pMsg.tmMSec = tv.tv_usec; + + ret = DBusJsonBoardcastCommand(NULL, 0xFFFFFFFF, CMD_MISC_PING, JSON_ENGINE_PING, &pMsg, FALSE); + + if(ret != 0) + { + LOG_EX(LOG_Error, "DBus boardcast message error: %d\n", ret); + } +} + +void HeartDaemonHblCheck(void) +{ + if(g_heartDaemon.modName != MODULE_CONTROLLER) + { + if(g_heartDaemon.isDaemonWork[MODULE_CONTROLLER] && timerExpire(g_heartDaemon.hTm[MODULE_CONTROLLER], g_hblTout)) + { + g_heartDaemon.pOnHeartLostCb(MODULE_CONTROLLER, TRUE); + g_heartDaemon.hTm[MODULE_CONTROLLER] = 0; + g_heartDaemon.isConnected[MODULE_CONTROLLER] = FALSE; + } + } + else + { + int i; + + for(i = 0; i < MODULE_MAX; i++) + { + if(g_heartDaemon.isDaemonWork[i] + && i != MODULE_CONTROLLER + && timerExpire(g_heartDaemon.hTm[i], g_hblTout)) + { + g_heartDaemon.pOnHeartLostCb(i, TRUE); + g_heartDaemon.hTm[i] = 0; + g_heartDaemon.isConnected[i] = FALSE; + } + } + } +} + +void HeartDaemonUpgrade(int iWatcher) +{ + if(iWatcher >= MODULE_MAX) + { + return; + } + + if(g_heartDaemon.hTm[iWatcher] == 0) + { + if(g_heartDaemon.modName == MODULE_CONTROLLER) + { + g_heartDaemon.pOnHeartLostCb(iWatcher, FALSE); + } + else if(iWatcher == MODULE_CONTROLLER) + { + g_heartDaemon.pOnHeartLostCb(iWatcher, FALSE); + } + + g_heartDaemon.isConnected[iWatcher] = TRUE; + RunPingSvr(); + } + + g_heartDaemon.hTm[iWatcher] = LIBUV_CURRENT_TIME_MS(); +} + +static int __isSendPingOnTime(void) +{ + static unsigned int tmPre = 0; + unsigned int tm = LIBUV_CURRENT_TIME_MS(); + unsigned int tmOut = HEART_SEND_DELAY; + + if(g_heartDaemon.modName != MODULE_CONTROLLER + && g_heartDaemon.isConnected[MODULE_CONTROLLER] == FALSE) + { + tmOut = 5000; + } + + if(tmPre != 0 && tm - tmPre < tmOut) + { + return (FALSE); + } + + tmPre = tm; + + return (TRUE); +} + +static void __uvIdleCb(uv_idle_t* phuvIdle) +{ + if(DBusLibuvGetRuntime()->onHblCb + && __isSendPingOnTime()) + { + RunPingSvr(); + } + + HeartDaemonHblCheck(); + sleep(1); +} + +static void __uvThreadDaemon(void *pParams) +{ + g_DeamonLoop = uv_loop_new(); + + uv_idle_init(g_DeamonLoop, &g_uvDeamonIdle); + uv_idle_start(&g_uvDeamonIdle, __uvIdleCb); + + uv_run(g_DeamonLoop, UV_RUN_DEFAULT); + + pthread_detach(pthread_self()); +} + +void HeartDaemonInit(MODULE_NAME mod, int msHblTout, OnDaemonMsg cb) +{ + uv_thread_t uvDaemonThread; + int i; + + memset(&g_heartDaemon, 0, sizeof(HEART_DAEMON)); + + if(msHblTout > 0) + { + g_hblTout = msHblTout; + } + + g_heartDaemon.modName = mod; + + for(i = 0; i < MODULE_MAX; i++) + { + if(mod == MODULE_CONTROLLER) + { + g_heartDaemon.isDaemonWork[i] = (g_pModInfoTable[i].modName != MODULE_CONTROLLER) ? TRUE : FALSE; + } + else + { + g_heartDaemon.isDaemonWork[i] = (g_pModInfoTable[i].modName == MODULE_CONTROLLER) ? TRUE : FALSE; + } + + g_heartDaemon.isConnected[i] = FALSE; + } + + g_heartDaemon.pOnHeartLostCb = cb; + + uv_thread_create(&uvDaemonThread, __uvThreadDaemon, NULL); +} diff --git a/Framework/JsonUtils/json_struct.c b/Framework/JsonUtils/json_struct.c new file mode 100644 index 0000000..c9be8c3 --- /dev/null +++ b/Framework/JsonUtils/json_struct.c @@ -0,0 +1,1218 @@ +#include +#include +#include +#include + +#include "log.h" +#include "smart_sound.h" +#include "libuv_dbus.h" +#include "json_struct.h" +#include "crypto.h" +#include "ota.h" +#include "assistant.h" + +typedef const char* (*StructToJsonCb)(void* pStruct); +typedef void* (*JsonToStructCb)(const char* pJsonStr); +typedef void (*Base64Code)(void *pStruct, int enCode); + +typedef struct +{ + JSON_ENGINE_TYPE typeId; + StructToJsonCb s2jCb; + JsonToStructCb j2sCb; + Base64Code base64Cb; +} JSON_ENGINE, *PJSON_ENGINE; + +static const char* __ping_MSG2Json(void* pData) +{ + PPING_MSG pReq = (PPING_MSG)pData; + const char* pJsonS; + + s2j_create_json_obj(jObject); + + s2j_json_set_basic_element(jObject, pReq, double, PING); + s2j_json_set_basic_element(jObject, pReq, int, tmSec); + s2j_json_set_basic_element(jObject, pReq, int, tmMSec); + + pJsonS = cJSON_Print(jObject); + cJSON_Delete(jObject); + + return pJsonS; +} + +static void* __json2PING_MSG(const char* pJsonS) +{ + cJSON* pJson = cJSON_Parse(pJsonS); + + s2j_create_struct_obj(sObject, PING_MSG); + + memset(sObject, 0, sizeof(PING_MSG)); + + s2j_struct_get_basic_element(sObject, pJson, double, PING); + s2j_struct_get_basic_element(sObject, pJson, int, tmSec); + s2j_struct_get_basic_element(sObject, pJson, int, tmMSec); + + cJSON_Delete(pJson); + + return sObject; +} + +static const char* __cfg_API_REQ2Json(void* pData) +{ + PCFG_API_REQ pReq = (PCFG_API_REQ)pData; + const char* pJsonS; + + s2j_create_json_obj(jObject); + + s2j_json_set_basic_element(jObject, pReq, string, keyName); + s2j_json_set_basic_element(jObject, pReq, string, keyValue); + s2j_json_set_basic_element(jObject, pReq, int, keyType); + + pJsonS = cJSON_Print(jObject); + cJSON_Delete(jObject); + + return pJsonS; +} + +static void* __json2CFG_API_REQ(const char* pJsonS) +{ + cJSON* pJson = cJSON_Parse(pJsonS); + + s2j_create_struct_obj(sObject, CFG_API_REQ); + + memset(sObject, 0, sizeof(CFG_API_REQ)); + + s2j_struct_get_basic_element(sObject, pJson, string, keyName); + s2j_struct_get_basic_element(sObject, pJson, string, keyValue); + s2j_struct_get_basic_element(sObject, pJson, int, keyType); + + cJSON_Delete(pJson); + + return sObject; +} + +static void __cfg_API_REQBase64(void *pData, int enCode) +{ + PCFG_API_REQ pReq = (PCFG_API_REQ)pData; + + if(enCode) + { + if(strlen(pReq->keyName) > 0) + { + char* pBase64 = (char *)EvpBase64Encode(pReq->keyName); + memset(pReq->keyName, 0, MAX_CFG_KEY_NAME); + strcpy(pReq->keyName, pBase64); + free(pBase64); + } + + if(strlen(pReq->keyValue) > 0) + { + char* pBase64 = (char *)EvpBase64Encode(pReq->keyValue); + memset(pReq->keyValue, 0, MAX_CFG_KEY_VALUE); + strcpy(pReq->keyValue, pBase64); + free(pBase64); + } + } + else + { + if(strlen(pReq->keyName) > 0) + { + + char *pBase64 = (char *)EvpBase64Decode(pReq->keyName); + memset(pReq->keyName, 0, MAX_CFG_KEY_NAME); + strcpy(pReq->keyName, pBase64); + free(pBase64); + } + + if(strlen(pReq->keyValue) > 0) + { + char *pBase64 = (char *)EvpBase64Decode(pReq->keyValue); + memset(pReq->keyValue, 0, MAX_CFG_KEY_VALUE); + strcpy(pReq->keyValue, pBase64); + free(pBase64); + } + } +} + +static const char* __cfg_API_RSP2Json(void* pData) +{ + PCFG_API_RSP pReq = (PCFG_API_RSP)pData; + const char* pJsonS; + + s2j_create_json_obj(jObject); + + s2j_json_set_basic_element(jObject, pReq, string, keyName); + s2j_json_set_basic_element(jObject, pReq, string, keyValue); + s2j_json_set_basic_element(jObject, pReq, int, keyType); + s2j_json_set_basic_element(jObject, pReq, int, errNo); + + pJsonS = cJSON_Print(jObject); + cJSON_Delete(jObject); + + return pJsonS; +} + +static void* __json2CFG_API_RSP(const char* pJsonS) +{ + cJSON* pJson = cJSON_Parse(pJsonS); + + s2j_create_struct_obj(sObject, CFG_API_RSP); + + memset(sObject, 0, sizeof(CFG_API_RSP)); + + s2j_struct_get_basic_element(sObject, pJson, string, keyName); + s2j_struct_get_basic_element(sObject, pJson, string, keyValue); + s2j_struct_get_basic_element(sObject, pJson, int, keyType); + s2j_struct_get_basic_element(sObject, pJson, int, errNo); + + cJSON_Delete(pJson); + + return sObject; +} + +static void __cfg_API_RSPBase64(void *pData, int enCode) +{ + PCFG_API_RSP pReq = (PCFG_API_RSP)pData; + + if(enCode) + { + if(strlen(pReq->keyName) > 0) + { + char *pBase64 = (char *)EvpBase64Encode(pReq->keyName); + memset(pReq->keyName, 0, MAX_CFG_KEY_NAME); + strcpy(pReq->keyName, pBase64); + free(pBase64); + } + + if(strlen(pReq->keyValue) > 0) + { + char *pBase64 = (char *)EvpBase64Encode(pReq->keyValue); + memset(pReq->keyValue, 0, MAX_CFG_KEY_VALUE); + strcpy(pReq->keyValue, pBase64); + free(pBase64); + } + } + else + { + if(strlen(pReq->keyName) > 0) + { + char *pBase64 = (char *)EvpBase64Decode(pReq->keyName); + memset(pReq->keyName, 0, MAX_CFG_KEY_NAME); + strcpy(pReq->keyName, pBase64); + free(pBase64); + } + + if(strlen(pReq->keyValue) > 0) + { + char *pBase64 = (char *)EvpBase64Decode(pReq->keyValue); + memset(pReq->keyValue, 0, MAX_CFG_KEY_VALUE); + strcpy(pReq->keyValue, pBase64); + free(pBase64); + } + } +} + +static const char* __player_TO_CTRL2Json(void* pData) +{ + PPLAYER_TO_CTRL pP2C = (PPLAYER_TO_CTRL)pData; + const char* pJsonS; + + s2j_create_json_obj(jObject); + + s2j_json_set_basic_element(jObject, pP2C, string, musicUuid); + s2j_json_set_basic_element(jObject, pP2C, int, plySt); + s2j_json_set_basic_element(jObject, pP2C, int, curPos); + s2j_json_set_basic_element(jObject, pP2C, int, duration); + + s2j_json_set_basic_element(jObject, pP2C, int, playerId); + + pJsonS = cJSON_Print(jObject); + cJSON_Delete(jObject); + + return pJsonS; +} + +static void* __json2PLAYER_TO_CTRL(const char* pJsonS) +{ + cJSON* pJson = cJSON_Parse(pJsonS); + + s2j_create_struct_obj(sObject, PLAYER_TO_CTRL); + + memset(sObject, 0, sizeof(PLAYER_TO_CTRL)); + + s2j_struct_get_basic_element(sObject, pJson, string, musicUuid); + s2j_struct_get_basic_element(sObject, pJson, int, plySt); + s2j_struct_get_basic_element(sObject, pJson, int, curPos); + s2j_struct_get_basic_element(sObject, pJson, int, duration); + + cJSON_Delete(pJson); + + return sObject; +} + +static void __player_TO_CTRLBase64(void *pData, int enCode) +{ + PPLAYER_TO_CTRL pReq = (PPLAYER_TO_CTRL)pData; + + if(enCode) + { + if(strlen(pReq->musicUuid) > 0) + { + char *pBase64 = (char *)EvpBase64Encode(pReq->musicUuid); + memset(pReq->musicUuid, 0, MAX_MUSIC_UUID); + strcpy(pReq->musicUuid, pBase64); + free(pBase64); + } + } + else + { + if(strlen(pReq->musicUuid) > 0) + { + char *pBase64 = (char *)EvpBase64Decode(pReq->musicUuid); + memset(pReq->musicUuid, 0, MAX_MUSIC_UUID); + strcpy(pReq->musicUuid, pBase64); + free(pBase64); + } + } +} + +static const char* __ctrl_TO_PLAYER2Json(void* pData) +{ + PCTRL_TO_PLAYER pC2P = (PCTRL_TO_PLAYER)pData; + const char* pJsonS; + + s2j_create_json_obj(jObject); + + s2j_json_set_basic_element(jObject, pC2P, string, src); + s2j_json_set_basic_element(jObject, pC2P, string, srcUuid); + s2j_json_set_basic_element(jObject, pC2P, string, ttsText); + s2j_json_set_basic_element(jObject, pC2P, int, skTime); + s2j_json_set_basic_element(jObject, pC2P, int, plyMode); + s2j_json_set_basic_element(jObject, pC2P, int, plyListType); + s2j_json_set_basic_element(jObject, pC2P, int, adSrcType); + + pJsonS = cJSON_Print(jObject); + cJSON_Delete(jObject); + + return pJsonS; +} + +static void* __json2CTRL_TO_PLAYER(const char* pJsonS) +{ + cJSON* pJson = cJSON_Parse(pJsonS); + + s2j_create_struct_obj(sObject, CTRL_TO_PLAYER); + + memset(sObject, 0, sizeof(CTRL_TO_PLAYER)); + + s2j_struct_get_basic_element(sObject, pJson, string, src); + s2j_struct_get_basic_element(sObject, pJson, string, srcUuid); + s2j_struct_get_basic_element(sObject, pJson, string, ttsText); + s2j_struct_get_basic_element(sObject, pJson, int, skTime); + s2j_struct_get_basic_element(sObject, pJson, int, plyMode); + s2j_struct_get_basic_element(sObject, pJson, int, plyListType); + s2j_struct_get_basic_element(sObject, pJson, int, adSrcType); + s2j_struct_get_basic_element(sObject, pJson, int, duration); + s2j_struct_get_basic_element(sObject, pJson, int, volRestoreTime); + s2j_struct_get_basic_element(sObject, pJson, int, volBegin); + s2j_struct_get_basic_element(sObject, pJson, string, fifo); + s2j_struct_get_basic_element(sObject, pJson, int, channel); + s2j_struct_get_basic_element(sObject, pJson, int, bytes); + s2j_struct_get_basic_element(sObject, pJson, int, sampleRate); + s2j_struct_get_basic_element(sObject, pJson, int, playerId); + s2j_struct_get_basic_element(sObject, pJson, double, gain); + s2j_struct_get_basic_element(sObject, pJson, string, backGroundUrl); + + cJSON_Delete(pJson); + + return sObject; +} + +static void __ctrl_TO_PLAYERBase64(void *pData, int enCode) +{ + PCTRL_TO_PLAYER pReq = (PCTRL_TO_PLAYER)pData; + + if(enCode) + { + if(strlen(pReq->src) > 0) + { + char *pBase64 = (char *)EvpBase64Encode(pReq->src); + memset(pReq->src, 0, MAX_MUSIC_UUID); + strcpy(pReq->src, pBase64); + free(pBase64); + } + + if(strlen(pReq->srcUuid) > 0) + { + char *pBase64 = (char *)EvpBase64Encode(pReq->srcUuid); + memset(pReq->srcUuid, 0, MAX_MUSIC_UUID); + strcpy(pReq->srcUuid, pBase64); + free(pBase64); + } + } + else + { + if(strlen(pReq->src) > 0) + { + char *pBase64 = (char *)EvpBase64Decode(pReq->src); + memset(pReq->src, 0, MAX_MUSIC_UUID); + strcpy(pReq->src, pBase64); + free(pBase64); + } + + if(strlen(pReq->srcUuid) > 0) + { + char *pBase64 = (char *)EvpBase64Decode(pReq->srcUuid); + memset(pReq->srcUuid, 0, MAX_MUSIC_UUID); + strcpy(pReq->srcUuid, pBase64); + free(pBase64); + } + } +} + +#if 0 +const char* __ota_Notify_REQ2Json(void* pData) +{ + int i; + POTA_DATA_INFO pReq = (POTA_DATA_INFO)pData; + cJSON* pRoot = NULL; + cJSON* pSubArray = NULL; + const char* pJsonS; + + pRoot = cJSON_CreateObject(); + + cJSON_AddNumberToObject(pRoot, "version", pReq->version); + cJSON_AddNumberToObject(pRoot, "otaMode", pReq->otaMode); + + pSubArray = cJSON_CreateArray(); + cJSON_AddItemToObject(pRoot, "otaFile", pSubArray); + + for(i = 0; i < sizeof(pReq->otaFile) / sizeof(pReq->otaFile[0]); i++) + { + cJSON *pItem = cJSON_CreateObject(); + + cJSON_AddItemToObject(pSubArray, "", pItem); + + + cJSON_AddStringToObject(pItem, "url", pReq->otaFile[i].url); + cJSON_AddStringToObject(pItem, "md5", pReq->otaFile[i].md5); + cJSON_AddNumberToObject(pItem, "size", pReq->otaFile[i].size); + } + + pJsonS = cJSON_Print(pRoot); + cJSON_Delete(pRoot); + + return pJsonS; +} + +void* __json2OTA_Notify_REQ(const char* pJsonS) +{ + POTA_DATA_INFO pInfo; + cJSON* pSubArray = NULL; + cJSON* pItem = NULL; + + cJSON* pRoot = cJSON_Parse(pJsonS); + if(pRoot == NULL) + { + return (NULL); + } + + pSubArray = cJSON_GetObjectItem(pRoot, "otaFile"); + + pInfo = (POTA_DATA_INFO)malloc(sizeof(OTA_DATA_INFO)); + memset(pInfo, 0, sizeof(OTA_DATA_INFO)); + + pItem = cJSON_GetObjectItem(pRoot, "version"); + pInfo->version = pItem->valueint; + + pItem = cJSON_GetObjectItem(pRoot, "otaMode"); + pInfo->otaMode = pItem->valueint; + + if(pSubArray) + { + int i; + cJSON *pList = pSubArray->child; + + for(i = 0; i < cJSON_GetArraySize(pSubArray); i++) + { + strcpy(pInfo->otaFile[i].url, cJSON_GetObjectItem(pList, "url")->valuestring); + strcpy(pInfo->otaFile[i].md5, cJSON_GetObjectItem(pList, "md5")->valuestring); + pInfo->otaFile[i].size = cJSON_GetObjectItem(pList, "size")->valueint; + + pList = pList->next; + } + } + + cJSON_Delete(pRoot); + + return pInfo; +} +#else +const char* __ota_Notify_REQ2Json(void* pData) +{ + POTA_DATA_INFO pReq = (POTA_DATA_INFO)pData; + const char* pJsonS; + + s2j_create_json_obj(jObject); + + s2j_json_set_basic_element(jObject, pReq, int, version); + s2j_json_set_basic_element(jObject, pReq, int, otaCmd); + s2j_json_set_basic_element(jObject, pReq, int, otaMode); + + s2j_json_set_struct_element(json_otaRes, jObject, struct_otaRes, pReq, OTA_FILE_INFO, otaFileInfo); + s2j_json_set_basic_element(json_otaRes, struct_otaRes, string, url); + s2j_json_set_basic_element(json_otaRes, struct_otaRes, string, md5); + s2j_json_set_basic_element(json_otaRes, struct_otaRes, int, size); + + pJsonS = cJSON_Print(jObject); + cJSON_Delete(jObject); + + return pJsonS; +} + +void* __json2OTA_Notify_REQ(const char* pJsonS) +{ + cJSON* pJson = cJSON_Parse(pJsonS); + + s2j_create_struct_obj(sObject, OTA_DATA_INFO); + + memset(sObject, 0, sizeof(OTA_DATA_INFO)); + + s2j_struct_get_basic_element(sObject, pJson, int, version); + s2j_struct_get_basic_element(sObject, pJson, int, otaCmd); + s2j_struct_get_basic_element(sObject, pJson, int, otaMode); + + s2j_struct_get_struct_element(struct_otaRes, sObject, json_otaRes, pJson, OTA_FILE_INFO, otaFileInfo); + s2j_struct_get_basic_element(struct_otaRes, json_otaRes, string, url); + s2j_struct_get_basic_element(struct_otaRes, json_otaRes, string, md5); + s2j_struct_get_basic_element(struct_otaRes, json_otaRes, int, size); + + cJSON_Delete(pJson); + + return sObject; +} +#endif +static void __ota_NotifyBase64(void *pData, int enCode) +{ + POTA_DATA_INFO pReq = (POTA_DATA_INFO)pData; + + if(enCode) + { + if(strlen(pReq->otaFileInfo.url) > 0) + { + char *pBase64 = (char *)EvpBase64EncodeNoAlign(pReq->otaFileInfo.url); + memset(pReq->otaFileInfo.url, 0, SIZE_1K); + strcpy(pReq->otaFileInfo.url, pBase64); + free(pBase64); + } + } + else + { + if(strlen(pReq->otaFileInfo.url) > 0) + { + char *pBase64 = (char *)EvpBase64DecodeNoAlign(pReq->otaFileInfo.url); + memset(pReq->otaFileInfo.url, 0, SIZE_1K); + strcpy(pReq->otaFileInfo.url, pBase64); + free(pBase64); + } + } +} + +const char* __ota_Status_RSP2Json(void* pData) +{ + POTA_RSP_STATUS pReq = (POTA_RSP_STATUS)pData; + const char* pJsonS; + + s2j_create_json_obj(jObject); + + s2j_json_set_basic_element(jObject, pReq, int, status); + s2j_json_set_basic_element(jObject, pReq, int, val); + + pJsonS = cJSON_Print(jObject); + cJSON_Delete(jObject); + + return pJsonS; +} + +void* __json2OTA_Status_RSP(const char* pJsonS) +{ + cJSON* pJson = cJSON_Parse(pJsonS); + + s2j_create_struct_obj(sObject, OTA_RSP_STATUS); + + memset(sObject, 0, sizeof(OTA_RSP_STATUS)); + + s2j_struct_get_basic_element(sObject, pJson, int, status); + s2j_struct_get_basic_element(sObject, pJson, int, val); + + cJSON_Delete(pJson); + + return sObject; +} + +const char* __alarm_Run_Event_RSP2Json(void* pData) +{ + const char* pJsonS; + PASSISTANT_ITEM_INFO pReq = (PASSISTANT_ITEM_INFO)pData; + cJSON* pRoot = cJSON_CreateObject(); + cJSON* pSubArray = cJSON_CreateArray(); + + cJSON_AddItemToObject(pRoot, "data", pSubArray); + + cJSON *pItem = cJSON_CreateObject(); + + cJSON_AddItemToObject(pSubArray, "", pItem); + + cJSON_AddNumberToObject(pItem, "alarmId", pReq->itemId); + cJSON_AddNumberToObject(pItem, "itemType", pReq->itemType); + cJSON_AddNumberToObject(pItem, "priority", pReq->priority); + cJSON_AddNumberToObject(pItem, "repeatMode", pReq->repeatMode); + + cJSON_AddNumberToObject(pItem, "year", pReq->year); + cJSON_AddNumberToObject(pItem, "month", pReq->month); + cJSON_AddNumberToObject(pItem, "day", pReq->day); + cJSON_AddNumberToObject(pItem, "hour", pReq->hour); + cJSON_AddNumberToObject(pItem, "minute", pReq->minute); + cJSON_AddNumberToObject(pItem, "second", pReq->second); + cJSON_AddNumberToObject(pItem, "weekDay", pReq->weekDay); + + cJSON_AddNumberToObject(pItem, "voiceId", pReq->voiceId); + cJSON_AddStringToObject(pItem, "strTips", pReq->strTips); + cJSON_AddStringToObject(pItem, "resUrl", pReq->resUrl); + + cJSON_AddStringToObject(pItem, "voiceResType", pReq->voiceResType); + cJSON_AddStringToObject(pItem, "voiceRes", pReq->voiceRes); + + pJsonS = cJSON_Print(pRoot); + cJSON_Delete(pRoot); + + return pJsonS; +} + +static void __getAlarmDateTimeInfo(cJSON* pJson, PASSISTANT_ITEM_INFO pAlarmInfo) +{ + struct tm tmNow; + time_t timep; + + const char *pStrYear = cJSON_GetObjectItem(pJson, "year")->valuestring; + const char *pStrMonth = cJSON_GetObjectItem(pJson, "month")->valuestring; + const char *pStrDay = cJSON_GetObjectItem(pJson, "dayofMonth")->valuestring; + const char *pStrHour = cJSON_GetObjectItem(pJson, "hour")->valuestring; + const char *pStrMinute = cJSON_GetObjectItem(pJson, "minute")->valuestring; + const char *pStrSecond = cJSON_GetObjectItem(pJson, "second")->valuestring; + const char *pStrWeekDay = cJSON_GetObjectItem(pJson, "dayofWeek")->valuestring; + + time(&timep); + localtime_r(&timep, &tmNow); + + if(pStrYear != NULL && strlen(pStrYear) > 0) + { + pAlarmInfo->year = strtoul(pStrYear, NULL, 10) - 1900; + } + else + { + pAlarmInfo->year = -1;//tmNow.tm_year; + } + + if(pStrMonth != NULL && strlen(pStrMonth) > 0) + { + pAlarmInfo->month = strtoul(pStrMonth, NULL, 10) - 1; + } + else + { + pAlarmInfo->month = -1;//tmNow.tm_mon; + } + + if(pStrDay != NULL && strlen(pStrDay) > 0) + { + pAlarmInfo->day = strtoul(pStrDay, NULL, 10); + } + else + { + pAlarmInfo->day = -1; //tmNow.tm_mday; + } + + if(pStrHour != NULL && strlen(pStrHour) > 0) + { + pAlarmInfo->hour = strtoul(pStrHour, NULL, 10); + } + else + { + pAlarmInfo->hour = -1; + } + + if(pStrMinute != NULL && strlen(pStrMinute) > 0) + { + pAlarmInfo->minute = strtoul(pStrMinute, NULL, 10); + } + else + { + pAlarmInfo->minute = -1; + } + + if(pStrSecond != NULL && strlen(pStrSecond) > 0) + { + pAlarmInfo->second = strtoul(pStrSecond, NULL, 10); + } + else + { + pAlarmInfo->second = -1; + } + + if(pStrWeekDay != NULL && strlen(pStrWeekDay) > 0) + { + if(strchr(pStrWeekDay, '7') != NULL) + { + pAlarmInfo->weekDay |= 1; + } + + if(strchr(pStrWeekDay, '1') != NULL) + { + pAlarmInfo->weekDay |= 1 << 1; + } + + if(strchr(pStrWeekDay, '2') != NULL) + { + pAlarmInfo->weekDay |= 1 << 2; + } + + if(strchr(pStrWeekDay, '3') != NULL) + { + pAlarmInfo->weekDay |= 1 << 3; + } + + if(strchr(pStrWeekDay, '4') != NULL) + { + pAlarmInfo->weekDay |= 1 << 4; + } + + if(strchr(pStrWeekDay, '5') != NULL) + { + pAlarmInfo->weekDay |= 1 << 5; + } + + if(strchr(pStrWeekDay, '6') != NULL) + { + pAlarmInfo->weekDay |= 1 << 6; + } + } + else + { + pAlarmInfo->weekDay = 0; + } +} + +void* __json2Alarm_sync_RSP(const char *pJsonS) +{ + PASSISTANT_SYNC_INFO pInfo; + cJSON* pSubArray = NULL; + //cJSON* pItem = NULL; + + cJSON* pRoot = cJSON_Parse(pJsonS); + if(pRoot == NULL) + { + return (NULL); + } + + pSubArray = cJSON_GetObjectItem(pRoot, "data"); + + pInfo = (PASSISTANT_SYNC_INFO)malloc(sizeof(ASSISTANT_SYNC_INFO)); + memset(pInfo, 0, sizeof(ASSISTANT_SYNC_INFO)); + + pInfo->pAlarmInfo = NULL; + + if(pSubArray) + { + cJSON *pList = pSubArray->child; + int arraySize = cJSON_GetArraySize(pSubArray); + + if(arraySize > 0) + { + pInfo->pAlarmInfo = (PASSISTANT_ITEM_INFO)malloc(sizeof(ASSISTANT_ITEM_INFO) * arraySize); + + pInfo->nItems = arraySize; + + for(int i = 0; i < arraySize; i++) + { + cJSON* pData = cJSON_GetObjectItem(pList, "vboxDate"); + + memset(&pInfo->pAlarmInfo[i], 0, sizeof(ASSISTANT_ITEM_INFO)); + + if(pData != NULL) + { + cJSON *pItem; + + __getAlarmDateTimeInfo(pData, &pInfo->pAlarmInfo[i]); + + pInfo->pAlarmInfo[i].itemType = cJSON_GetObjectItem(pList, "label")->valueint; + pInfo->pAlarmInfo[i].itemId = cJSON_GetObjectItem(pList, "id")->valueint; + pInfo->pAlarmInfo[i].repeatMode = cJSON_GetObjectItem(pList, "type")->valueint; + pInfo->pAlarmInfo[i].voiceId = cJSON_GetObjectItem(pList, "voiceType")->valueint; + + pItem = cJSON_GetObjectItem(pList, "remark"); + + if(pInfo->pAlarmInfo[i].itemType != ASSISTANT_TYPE_CLOCK && pItem) + { + strcpy(pInfo->pAlarmInfo[i].strTips, pItem->valuestring); + } + + pItem = cJSON_GetObjectItem(pList, "resUrl"); + + if(pItem) + { + strcpy(pInfo->pAlarmInfo[i].resUrl, pItem->valuestring); + } + + pItem = cJSON_GetObjectItem(pList, "voiceRes"); + + if(pItem) + { + strcpy(pInfo->pAlarmInfo[i].voiceRes, pItem->valuestring); + } + + pItem = cJSON_GetObjectItem(pList, "voiceResType"); + + if(pItem) + { + strcpy(pInfo->pAlarmInfo[i].voiceResType, pItem->valuestring); + } + + pList = pList->next; +#if 0 + fprintf(stdout, "%04u-%02u-%02u %02u:%02u:%02u %u\n", + pInfo->pAlarmInfo[i].year, + pInfo->pAlarmInfo[i].month, + pInfo->pAlarmInfo[i].day, + pInfo->pAlarmInfo[i].hour, + pInfo->pAlarmInfo[i].minute, + pInfo->pAlarmInfo[i].second, + pInfo->pAlarmInfo[i].weekDay); +#endif + } + } + } + } + + cJSON_Delete(pRoot); + + return pInfo; +} + +const char* __alarm_Status_RSP2Json(void* pData) +{ + const char* pJsonS; + + PASSISTANT_RSP_STATUS pReq = (PASSISTANT_RSP_STATUS)pData; + + + s2j_create_json_obj(jObject); + + s2j_json_set_basic_element(jObject, pReq, int, cmd); + s2j_json_set_basic_element(jObject, pReq, int, val); + + pJsonS = cJSON_Print(jObject); + cJSON_Delete(jObject); + + return pJsonS; +} + +void* __json2Alarm_Status_RSP(const char* pJsonS) +{ + cJSON* pJson = cJSON_Parse(pJsonS); + + s2j_create_struct_obj(sObject, ASSISTANT_RSP_STATUS); + + memset(sObject, 0, sizeof(ASSISTANT_RSP_STATUS)); + + s2j_struct_get_basic_element(sObject, pJson, int, cmd); + s2j_struct_get_basic_element(sObject, pJson, int, val); + + cJSON_Delete(pJson); + + return sObject; + +} + +const char* __alarm_change_RSP2Json(void* pData) +{ + const char* pJsonS; + PASSISTANT_NOTIFY_INFO pReq = (PASSISTANT_NOTIFY_INFO)pData; + + s2j_create_json_obj(jObject); + + s2j_json_set_basic_element(jObject, pReq, int, cmd); + s2j_json_set_basic_element(jObject, pReq, int, type); + s2j_json_set_array_element(jObject, pReq, double, ids, pReq->nItems); + + pJsonS = cJSON_Print(jObject); + cJSON_Delete(jObject); + + return pJsonS; +} + +void* __json2Alarm_change_RSP(const char* pJsonS) +{ + PASSISTANT_NOTIFY_INFO pInfo = NULL; + cJSON* pSubArray = NULL; + cJSON* pItem = NULL; + + cJSON* pRoot = cJSON_Parse(pJsonS); + if(pRoot == NULL) + { + return (NULL); + } + + pSubArray = cJSON_GetObjectItem(pRoot, "ids"); + + pInfo = (PASSISTANT_NOTIFY_INFO)malloc(sizeof(ASSISTANT_NOTIFY_INFO)); + memset(pInfo, 0, sizeof(ASSISTANT_NOTIFY_INFO)); + + pItem = cJSON_GetObjectItem(pRoot, "type"); + pInfo->type = pItem->valueint; + +#if 0 + pItem = cJSON_GetObjectItem(pRoot, "cmd"); + pInfo->cmd = pItem->valueint; +#endif + + if(pSubArray) + { + int arraySize = cJSON_GetArraySize(pSubArray); + + if(arraySize > 0) + { + pInfo->nItems = arraySize; + + for(int i = 0; i < arraySize; i++) + { + pInfo->ids[i] = (unsigned long long)(cJSON_GetArrayItem(pSubArray, i)->valuedouble); + } + } + } + + cJSON_Delete(pRoot); + + return pInfo; +} +#if 0 +const char* __alarm_change_RSP2Json(void* pData) +{ + int i = 0; + PALARM_REMOVE_INFO pReq = (PALARM_REMOVE_INFO)pData; + cJSON* pRoot = NULL; + cJSON* pSubArray = NULL; + const char* pJsonS; + + pRoot = cJSON_CreateObject(); + + cJSON_AddNumberToObject(pRoot, "nItems", pReq->nItems); + + pSubArray = cJSON_CreateArray(); + cJSON_AddItemToObject(pRoot, "data", pSubArray); + + for(i = 0; i < pReq->nItems; i++) + { + cJSON *pItem = cJSON_CreateObject(); + + cJSON_AddItemToObject(pSubArray, "", pItem); + + cJSON_AddNumberToObject(pItem, "alarmId", pReq->pItemInfo[i].alarmId); + cJSON_AddNumberToObject(pItem, "itemType", pReq->pItemInfo[i].itemType); + } + + pJsonS = cJSON_Print(pRoot); + cJSON_Delete(pRoot); + + return pJsonS; +} + +void* __json2Alarm_change_RSP(const char* pJsonS) +{ + PALARM_REMOVE_INFO pInfo = NULL; + cJSON* pRoot = cJSON_Parse(pJsonS); + cJSON* pSubArray = NULL; + cJSON* pItem = NULL; + int itemType = 0; + + if(pRoot == NULL) + { + return (NULL); + } + + pSubArray = cJSON_GetObjectItem(pRoot, "data"); + + pInfo = (PALARM_REMOVE_INFO)malloc(sizeof(ALARM_REMOVE_INFO)); + memset(pInfo, 0, sizeof(ALARM_REMOVE_INFO)); + + pItem = cJSON_GetObjectItem(pRoot, "type"); + itemType = pItem->valueint; + + pInfo->pItemInfo = NULL; + + if(pSubArray) + { + int i; + cJSON *pList = pSubArray->child; + int arraySize = cJSON_GetArraySize(pSubArray); + + if(arraySize > 0) + { + pInfo->pItemInfo = (PITEM_INFO)malloc(sizeof(ITEM_INFO) * arraySize); + pInfo->nItems = arraySize; + + for(i = 0; i < arraySize; i++) + { + memset(&pInfo->pItemInfo[i], 0, sizeof(ALARM_ITEM_INFO)); + + pInfo->pItemInfo[i].itemType = itemType; + pInfo->pItemInfo[i].alarmId = cJSON_GetObjectItem(pList, "id")->valueint; + + pList = pList->next; + } + } + } + + cJSON_Delete(pRoot); + + return pInfo; +} +#endif + +const char* __alarm_WorkData_RSP2Json(void* pData) +{ + const char* pJsonS; + PWORKDAY_INFO pReq = (PWORKDAY_INFO)pData; + + s2j_create_json_obj(jObject); + + s2j_json_set_basic_element(jObject, pReq, int, year); + + pJsonS = cJSON_Print(jObject); + cJSON_Delete(jObject); + + return pJsonS; +} + +void* __json2Alarm_WorkData_RSP(const char* pJsonS) +{ + cJSON* pJson = cJSON_Parse(pJsonS); + + s2j_create_struct_obj(sObject, WORKDAY_INFO); + + memset(sObject, 0, sizeof(WORKDAY_INFO)); + + s2j_struct_get_basic_element(sObject, pJson, int, year); + s2j_struct_get_array_element(sObject, pJson, int, days); + + cJSON_Delete(pJson); + + return sObject; +} + + +const char* __logCfg_RSP2Json(void* pData) +{ + PLOG_CFG_PROTOCOL pReq = (PLOG_CFG_PROTOCOL)pData; + const char* pJsonS; + + s2j_create_json_obj(jObject); + + s2j_json_set_basic_element(jObject, pReq, int, cfgCmd); + s2j_json_set_basic_element(jObject, pReq, int, iParams1); + s2j_json_set_basic_element(jObject, pReq, int, iParams2); + + pJsonS = cJSON_Print(jObject); + cJSON_Delete(jObject); + + return pJsonS; +} + +void* __json2LogCfg_RSP(const char* pJsonS) +{ + cJSON* pJson = cJSON_Parse(pJsonS); + + s2j_create_struct_obj(sObject, LOG_CFG_PROTOCOL); + + memset(sObject, 0, sizeof(LOG_CFG_PROTOCOL)); + + s2j_struct_get_basic_element(sObject, pJson, int, cfgCmd); + s2j_struct_get_basic_element(sObject, pJson, int, iParams1); + s2j_struct_get_basic_element(sObject, pJson, int, iParams2); + + cJSON_Delete(pJson); + + return sObject; +} + +const char* __wifiStatus_RSP2Json(void* pData) +{ + PWIFI_STATUS_PRO pReq = (PWIFI_STATUS_PRO)pData; + const char* pJsonS; + + s2j_create_json_obj(jObject); + + s2j_json_set_basic_element(jObject, pReq, int, wifi_evt); + + pJsonS = cJSON_Print(jObject); + cJSON_Delete(jObject); + + return pJsonS; +} + +void* __json2WifiStatus_RSP(const char* pJsonS) +{ + cJSON* pJson = cJSON_Parse(pJsonS); + + s2j_create_struct_obj(sObject, WIFI_STATUS_PRO); + + memset(sObject, 0, sizeof(WIFI_STATUS_PRO)); + + s2j_struct_get_basic_element(sObject, pJson, int, wifi_evt); + + cJSON_Delete(pJson); + + return sObject; +} + +void* __json2McuGuideCmd_RSP(const char* pJsonS) +{ + cJSON* pJson = cJSON_Parse(pJsonS); + + s2j_create_struct_obj(sObject, MCU_TEST_GUIDE_CMD); + + memset(sObject, 0, sizeof(MCU_TEST_GUIDE_CMD)); + + s2j_struct_get_basic_element(sObject, pJson, int, red); + s2j_struct_get_basic_element(sObject, pJson, int, green); + s2j_struct_get_basic_element(sObject, pJson, int, blue); + + cJSON_Delete(pJson); + + return sObject; +} + +void* __json2McuMatrixCmd_RSP(const char* pJsonS) +{ + cJSON* pJson = cJSON_Parse(pJsonS); + + s2j_create_struct_obj(sObject, MCU_TEST_MATRIX_CMD); + + memset(sObject, 0, sizeof(MCU_TEST_MATRIX_CMD)); + + s2j_struct_get_basic_element(sObject, pJson, int, level); + + cJSON_Delete(pJson); + + return sObject; +} + +const char* __mcuVersion_RSP2Json(void* pData) +{ + PMCU_TEST_VER_CMD pReq = (PMCU_TEST_VER_CMD)pData; + const char* pJsonS; + + s2j_create_json_obj(jObject); + + s2j_json_set_basic_element(jObject, pReq, string, McuVer); + + pJsonS = cJSON_Print(jObject); + cJSON_Delete(jObject); + + return pJsonS; +} + +static JSON_ENGINE g_jSonEngine[] = +{ + {JSON_ENGINE_P2C, __player_TO_CTRL2Json, __json2PLAYER_TO_CTRL, __player_TO_CTRLBase64}, + {JSON_ENGINE_C2P, __ctrl_TO_PLAYER2Json, __json2CTRL_TO_PLAYER, __ctrl_TO_PLAYERBase64}, + {JSON_ENGINE_CFG_REQ, __cfg_API_REQ2Json, __json2CFG_API_REQ, __cfg_API_REQBase64}, + {JSON_ENGINE_CFG_RSP, __cfg_API_RSP2Json, __json2CFG_API_RSP, __cfg_API_RSPBase64 }, + {JSON_ENGINE_ASSISTANT_SYNC_RSP, NULL, __json2Alarm_sync_RSP, NULL}, + {JSON_ENGINE_ASSISTANT_NOTIFY, __alarm_change_RSP2Json, __json2Alarm_change_RSP, NULL}, + {JSON_ENGINE_ASSISTANT_STATUS, __alarm_Status_RSP2Json, __json2Alarm_Status_RSP, NULL}, + {JSON_ENGINE_ASSISTANT_RUNNING, __alarm_Run_Event_RSP2Json, NULL, NULL}, + {JSON_ENGINE_WORKDAY_REQ, __alarm_WorkData_RSP2Json, __json2Alarm_WorkData_RSP, NULL}, + {JSON_ENGINE_PING, __ping_MSG2Json, __json2PING_MSG, NULL}, + {JSON_ENGINE_OTA_REQ, __ota_Notify_REQ2Json, __json2OTA_Notify_REQ, __ota_NotifyBase64}, + {JSON_ENGINE_OTA_RSP, __ota_Status_RSP2Json, __json2OTA_Status_RSP, NULL}, + {JSON_ENGINE_LOG_CFG_CMD, __logCfg_RSP2Json, __json2LogCfg_RSP, NULL}, + {JSON_WIFI_STATUS_NOTIFY, __wifiStatus_RSP2Json, __json2WifiStatus_RSP, NULL}, + {JSON_MCU_GUIDE_TEST_CMD, NULL, __json2McuGuideCmd_RSP, NULL}, + {JSON_MCU_MATRIX_TEST_CMD, NULL, __json2McuMatrixCmd_RSP, NULL}, + {JSON_MCU_TEST_GET_VER_CMD, __mcuVersion_RSP2Json, NULL, NULL}, +}; + +void* Json2Struct(const char* pJsonStr, JSON_ENGINE_TYPE type, int enBase64, int* pErr) +{ + if(pJsonStr == NULL || pErr == NULL) + { + if(pErr) + { + *pErr = -ERR_INPUT_PARAMS; + } + return NULL; + } + + if(type < 0 || type >= JSON_ENGINE_MAX) + { + *pErr = -ERR_INPUT_PARAMS; + return NULL; + } + + *pErr = 0; + + //LOG_EX(LOG_Debug, "Json:\n%s\n", pJsonStr); + + if(g_jSonEngine[type].j2sCb) + { + void *pStruct = g_jSonEngine[type].j2sCb(pJsonStr); + + if(enBase64 && g_jSonEngine[type].base64Cb) + { + g_jSonEngine[type].base64Cb(pStruct, FALSE); + } + + return (pStruct); + } + else + { + return (NULL); + } +} + +const char* Struct2Json(void* pStruct, JSON_ENGINE_TYPE type, int enBase64, int* pErr) +{ + if(pStruct == NULL || pErr == NULL) + { + if(pErr) + { + *pErr = -ERR_INPUT_PARAMS; + } + return NULL; + } + + if(type < 0 || type >= JSON_ENGINE_MAX) + { + *pErr = -ERR_INPUT_PARAMS; + return NULL; + } + + *pErr = 0; + + if(enBase64 && g_jSonEngine[type].base64Cb) + { + g_jSonEngine[type].base64Cb(pStruct, TRUE); + } + + if(g_jSonEngine[type].s2jCb) + { + const char *pJsongStr = g_jSonEngine[type].s2jCb(pStruct); + + //LOG_EX(LOG_Debug, "Json: \n%s\n", pJsongStr); + return (pJsongStr); + } + else + { + return NULL; + } +} diff --git a/Framework/Monitor/monitor.c b/Framework/Monitor/monitor.c new file mode 100644 index 0000000..6e78f6b --- /dev/null +++ b/Framework/Monitor/monitor.c @@ -0,0 +1,347 @@ +#ifdef ENABLE_COUNT_DEBUG +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "log.h" +#include "libuv_dbus.h" + +#define LOG_SAVE_TIME (1000) + +typedef struct +{ + long long maxValue; + long long minValue; + long long avgValue; +} STATISTICAL_VALUE, *PSTATISTICAL_VALUE; + +typedef struct +{ + long long curVaule; + long long tolValue; + unsigned int tolCount; + STATISTICAL_VALUE cVal; +} CSTATISTICAL_INFO, *PSTATISTICAL_INFO; + +typedef struct +{ + char* pMonName; + unsigned long nCount; + CSTATISTICAL_INFO nCstInfo; + uv_rwlock_t rwLock; + + uv_timer_t logTimer; + unsigned int logTime; + + UT_hash_handle hh; ///< UT Hash handle +} MONITOR_INFO, *PMONITOR_INFO; + +static uv_rwlock_t g_uvMonRwLock; +static PMONITOR_INFO g_MonTbl = NULL; +static uv_loop_t* g_MonLogLoop = NULL; + +static void __uvMonLogProc(void *pParams) +{ + RunUVLoop(g_MonLogLoop); + + while(TRUE) + { + usleep(1000); + } + + pthread_detach(pthread_self()); +} + +static void __logMonTimerProc(uv_timer_t* pTimer) +{ + PMONITOR_INFO pInfo = (PMONITOR_INFO)pTimer->data; + + if(pInfo && (pInfo->nCount + pInfo->nCstInfo.tolCount > 0)) + { + UT_string* pMsg = NULL; + utstring_new(pMsg); + + uv_rwlock_rdlock(&pInfo->rwLock); + + utstring_printf(pMsg, "%s Statistical Information:\n", pInfo->pMonName); + //LOG_EX(LOG_Debug, "%s Statistical Information:\n", pInfo->pMonName); + + if(pInfo->nCount) + { + UT_string* pMsgCount = NULL; + utstring_new(pMsgCount); + utstring_printf(pMsgCount, " Total Count = %lu\n", pInfo->nCount); + utstring_concat(pMsg, pMsgCount); + utstring_free(pMsgCount); + //LOG_EX(LOG_Debug, " Total Count = %u\n", pInfo->nCount); + } + + if(pInfo->nCstInfo.tolCount > 0) + { + UT_string* pMsgStat = NULL; + utstring_new(pMsgStat); + utstring_printf(pMsgStat, " Max Value = %lld\n" + " Min Value = %lld\n" + " Avg Value = %lld\n" + " ---- Statistical by total %lld of %u times\n", + pInfo->nCstInfo.cVal.maxValue, + pInfo->nCstInfo.cVal.minValue, + pInfo->nCstInfo.cVal.avgValue, + pInfo->nCstInfo.tolValue, + pInfo->nCstInfo.tolCount); + utstring_concat(pMsg, pMsgStat); + utstring_free(pMsgStat); +#if 0 + LOG_EX(LOG_Debug, " Max Value = %lld\n", pInfo->nCstInfo.cVal.maxValue); + LOG_EX(LOG_Debug, " Min Value = %lld\n", pInfo->nCstInfo.cVal.minValue); + LOG_EX(LOG_Debug, " Avg Value = %lld\n", pInfo->nCstInfo.cVal.avgValue); + LOG_EX(LOG_Debug, " ---- Statistical by total %lld of %u times\n", + pInfo->nCstInfo.tolValue, pInfo->nCstInfo.tolCount); +#endif + } + + LOG_EX(LOG_Debug, "%s", utstring_body(pMsg)); + + uv_rwlock_rdunlock(&pInfo->rwLock); + utstring_free(pMsg); + } +} + +int MonitorInit(void) +{ + uv_thread_t uvMonLogThread; + + g_MonLogLoop = uv_loop_new(); + + uv_rwlock_init(&g_uvMonRwLock); + + uv_thread_create(&uvMonLogThread, __uvMonLogProc, NULL); + + return 0; +} + +int MonAddNewItem(const char* pName, int logSaveTime) +{ + PMONITOR_INFO pInfo; + + if(pName == NULL || strlen(pName) == 0) + { + return -ERR_INPUT_PARAMS; + } + + uv_rwlock_rdlock(&g_uvMonRwLock); + HASH_FIND_STR(g_MonTbl, pName, pInfo); + uv_rwlock_rdunlock(&g_uvMonRwLock); + + if(pInfo != NULL) + { + return -ERR_CFG_ITEM_EXIST; + } + + pInfo = (PMONITOR_INFO)malloc(sizeof(MONITOR_INFO)); + + if(pInfo == NULL) + { + return -ERR_MALLOC_MEMORY; + } + + memset(pInfo, 0, sizeof(MONITOR_INFO)); + + pInfo->nCstInfo.cVal.minValue = INT_MAX; + pInfo->logTime = logSaveTime; + pInfo->pMonName = strdup(pName); + + if(pInfo->logTime > 0) + { + pInfo->logTimer.data = pInfo; + uv_timer_init(g_MonLogLoop, &pInfo->logTimer); + uv_timer_start(&pInfo->logTimer, __logMonTimerProc, pInfo->logTime, pInfo->logTime); + } + else + { + pInfo->logTime = 0; + } + + uv_rwlock_init(&pInfo->rwLock); + + uv_rwlock_wrlock(&g_uvMonRwLock); + HASH_ADD_STR(g_MonTbl, pMonName, pInfo); + uv_rwlock_wrunlock(&g_uvMonRwLock); + + return 0; +} + +int MonIncreaseCount(const char* pName) +{ + PMONITOR_INFO pInfo; + + if(pName == NULL || strlen(pName) == 0) + { + return -ERR_INPUT_PARAMS; + } + + uv_rwlock_rdlock(&g_uvMonRwLock); + HASH_FIND_STR(g_MonTbl, pName, pInfo); + uv_rwlock_rdunlock(&g_uvMonRwLock); + + if(pInfo == NULL) + { + return -ERR_CFG_NOITEM; + } + + uv_rwlock_wrlock(&pInfo->rwLock); + pInfo->nCount++; + uv_rwlock_wrunlock(&pInfo->rwLock); + + return 0; +} + +int MonDiffStatistical(const char* pName, long long newVal) +{ + PMONITOR_INFO pInfo; + + if(pName == NULL || strlen(pName) == 0) + { + return -ERR_INPUT_PARAMS; + } + + uv_rwlock_rdlock(&g_uvMonRwLock); + HASH_FIND_STR(g_MonTbl, pName, pInfo); + uv_rwlock_rdunlock(&g_uvMonRwLock); + + if(pInfo == NULL) + { + return -ERR_CFG_NOITEM; + } + + uv_rwlock_wrlock(&pInfo->rwLock); + + if(pInfo->nCstInfo.curVaule != 0) + { + long long diffValue = newVal - pInfo->nCstInfo.curVaule; + + pInfo->nCstInfo.tolValue += diffValue; + pInfo->nCstInfo.tolCount++; + + if(pInfo->nCstInfo.tolCount > 10) + { + pInfo->nCstInfo.cVal.avgValue = pInfo->nCstInfo.tolValue / pInfo->nCstInfo.tolCount; + + if(pInfo->nCstInfo.cVal.maxValue < diffValue) + { + pInfo->nCstInfo.cVal.maxValue = diffValue; + } + + if(pInfo->nCstInfo.cVal.minValue > diffValue) + { + pInfo->nCstInfo.cVal.minValue = diffValue; + } + } + } + + pInfo->nCstInfo.curVaule = newVal; + uv_rwlock_wrunlock(&pInfo->rwLock); + + //fprintf(stdout, "%s value %lld diffValue %lld\n", pName, newVal, diffValue); + return 0; +} + +int MonUpgradeStatistical(const char* pName, long newVal) +{ + PMONITOR_INFO pInfo; + + if(pName == NULL || strlen(pName) == 0) + { + return -ERR_INPUT_PARAMS; + } + + uv_rwlock_rdlock(&g_uvMonRwLock); + HASH_FIND_STR(g_MonTbl, pName, pInfo); + uv_rwlock_rdunlock(&g_uvMonRwLock); + + if(pInfo == NULL) + { + return -ERR_CFG_NOITEM; + } + + uv_rwlock_wrlock(&pInfo->rwLock); + + pInfo->nCstInfo.curVaule = newVal; + pInfo->nCstInfo.tolValue += newVal; + pInfo->nCstInfo.tolCount++; + pInfo->nCstInfo.cVal.avgValue = pInfo->nCstInfo.tolValue / pInfo->nCstInfo.tolCount; + + if(pInfo->nCstInfo.cVal.maxValue < newVal) + { + pInfo->nCstInfo.cVal.maxValue = newVal; + } + + if(pInfo->nCstInfo.cVal.minValue > newVal) + { + pInfo->nCstInfo.cVal.minValue = newVal; + } + + uv_rwlock_wrunlock(&pInfo->rwLock); + + //fprintf(stdout, "%s value %ld\n", pName, newVal); + return 0; +} + +int MonItemLogout(const char* pName) +{ + PMONITOR_INFO pInfo; + + if(pName == NULL || strlen(pName) == 0) + { + return -ERR_INPUT_PARAMS; + } + + uv_rwlock_rdlock(&g_uvMonRwLock); + HASH_FIND_STR(g_MonTbl, pName, pInfo); + uv_rwlock_rdunlock(&g_uvMonRwLock); + + if(pInfo == NULL) + { + return -ERR_CFG_NOITEM; + } + + if(pInfo->nCount + pInfo->nCstInfo.tolCount == 0) + { + LOG_EX(LOG_Debug, "%s Statistical Unchanged\n", pInfo->pMonName); + return 0; + } + + uv_rwlock_rdlock(&pInfo->rwLock); + + LOG_EX(LOG_Debug, "%s Statistical Information:\n", pInfo->pMonName); + + if(pInfo->nCount) + { + LOG_EX(LOG_Debug, " Total Count = %u\n", pInfo->nCount); + } + + if(pInfo->nCstInfo.tolCount > 0) + { + LOG_EX(LOG_Debug, " Max Value = %lld\n", pInfo->nCstInfo.cVal.maxValue); + LOG_EX(LOG_Debug, " Min Value = %lld\n", pInfo->nCstInfo.cVal.minValue); + LOG_EX(LOG_Debug, " Avg Value = %lld\n", pInfo->nCstInfo.cVal.avgValue); + LOG_EX(LOG_Debug, " ---- Statistical by total %lld of %u times\n", + pInfo->nCstInfo.tolValue, pInfo->nCstInfo.tolCount); + } + + uv_rwlock_rdunlock(&pInfo->rwLock); + + return 0; +} +#endif diff --git a/Framework/Network/inet_api.c b/Framework/Network/inet_api.c new file mode 100644 index 0000000..0edd15e --- /dev/null +++ b/Framework/Network/inet_api.c @@ -0,0 +1,1396 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "log.h" +#include "inet_api.h" + +#define MAX_TIMEOUT_VALUE (10) +#define SSL_CA_FILE ("/etc/ssl/certs/ca-certificates.crt") + +typedef enum +{ + INET_HTTP_DOWNLOAD_FILE = 0, + INET_HTTP_WEBSERVICE_POST, +} INET_ACCESS_TYPE; + +typedef struct +{ + uv_poll_t uvPool; + curl_socket_t sock; +} CURL_CONTEXT_DATA, *PCURL_CONTEXT_DATA; + +typedef struct +{ + char* pReqUrl; + char sPath[MAX_PATH]; + char sDlPath[MAX_PATH]; + char* pTaskUuid; + INET_ACCESS_TYPE type; + unsigned int dlSize; + unsigned int lastTm; + unsigned int createTm; + uv_fs_t uvFsOpen; + uv_fs_t uvFsWrite; + uv_fs_t uvFsDataSync; + uv_fs_t uvFsClose; + uv_buf_t uvFsBuf; + OnProgressNotify onPrgCb; + OnHttpResponse onRspCb; + int isCancel; + CURL* pCurl; + void* pData; + int errCode; +} HTTP_REQ_PARAMS, *PHTTP_REQ_PARAMS; + +typedef struct +{ + char *pTaskUuid; + unsigned int uRetryTimes; + PHTTP_REQ_PARAMS pCurlItem; + + UT_hash_handle hh; ///< UT Hash handle +} CURL_HANDLE_TBL, *PCURL_HANDLE_TBL; + +static uv_timer_t g_uvCurlTm; +static uv_timer_t g_uvDlTm; +static CURLM* g_pCurl = NULL; +static uv_loop_t* g_pMainLoop = NULL; +static PCURL_HANDLE_TBL g_ReqHandleTbl = NULL; +static uv_rwlock_t g_uvHashRwLock; +static unsigned g_TotalDownloads = 0; + +static void __addReqIdToTable(const char* pTaskUuid, PHTTP_REQ_PARAMS pParams) +{ + PCURL_HANDLE_TBL pItem = NULL; + + HASH_FIND_STR(g_ReqHandleTbl, pTaskUuid, pItem); + + if(pItem == NULL) + { + pItem = (PCURL_HANDLE_TBL)malloc(sizeof(CURL_HANDLE_TBL)); + + memset(pItem, 0, sizeof(CURL_HANDLE_TBL)); + pItem->pTaskUuid = (char*)pTaskUuid; + + uv_rwlock_wrlock(&g_uvHashRwLock); + HASH_ADD_STR(g_ReqHandleTbl, pTaskUuid, pItem); + uv_rwlock_wrunlock(&g_uvHashRwLock); + } + + pItem->pCurlItem = pParams; + pItem->uRetryTimes++; +} + +static void __removeReqIdFromTable(const char* pTaskUuid) +{ + PCURL_HANDLE_TBL pItem = NULL; + + uv_rwlock_wrlock(&g_uvHashRwLock); + HASH_FIND_STR(g_ReqHandleTbl, pTaskUuid, pItem); + if(pItem != NULL) + { + HASH_DEL(g_ReqHandleTbl, pItem); + + if(pItem->pTaskUuid) + { + free(pItem->pTaskUuid); + } + + free(pItem); + } + uv_rwlock_wrunlock(&g_uvHashRwLock); +} + +static void __cancelDownloadTask(PHTTP_REQ_PARAMS pItem) +{ + if(pItem) + { + pItem->isCancel = TRUE; + } +} + +static void __uvFsCloseCb(uv_fs_t *puvFs) +{ + PHTTP_REQ_PARAMS pParams = (PHTTP_REQ_PARAMS)puvFs->data; + + if(puvFs->result < 0) + { + LOG_EX(LOG_Error, "[%s] Error: %d\n", __FUNCTION__, puvFs->result); + } + + uv_fs_req_cleanup(puvFs); + + if(pParams->type == INET_HTTP_DOWNLOAD_FILE) + { + if(strcmp(pParams->sDlPath, pParams->sPath) != 0) + { + CopyFile(pParams->sDlPath, pParams->sPath); + unlink(pParams->sDlPath); + } + + if(pParams->errCode == CURLE_ABORTED_BY_CALLBACK) + { + pParams->errCode = CURLE_OPERATION_TIMEDOUT; + } + + if(pParams->onRspCb && pParams->isCancel == FALSE) + { + pParams->onRspCb(NULL, pParams->dlSize, pParams->pReqUrl, pParams->sPath, + pParams->pTaskUuid, -pParams->errCode, pParams->pData); + } + } + + __removeReqIdFromTable(pParams->pTaskUuid); + + if(pParams->pReqUrl) + { + free(pParams->pReqUrl); + pParams->pReqUrl = NULL; + } + + free(pParams); + pParams = NULL; +} + +static void __uvFsDataSyncCb(uv_fs_t *puvFs) +{ + PHTTP_REQ_PARAMS pParams = (PHTTP_REQ_PARAMS)puvFs->data; + + if(puvFs->result < 0) + { + LOG_EX(LOG_Error, "[%s] Error: %d\n", __FUNCTION__, puvFs->result); + } + + uv_fs_req_cleanup(puvFs); + + uv_fs_close(g_pMainLoop, &pParams->uvFsClose, pParams->uvFsOpen.result, __uvFsCloseCb); +} + +static PCURL_CONTEXT_DATA __createCurlContext(curl_socket_t sock) +{ + PCURL_CONTEXT_DATA pContext = (PCURL_CONTEXT_DATA)malloc(sizeof(CURL_CONTEXT_DATA)); + + pContext->sock = sock; + + if(uv_poll_init_socket(g_pMainLoop, &pContext->uvPool, sock) != 0) + { + LOG_EX(LOG_Error, "uv_poll_init_socket Error\n"); + } + + pContext->uvPool.data = pContext; + + return (pContext); +} + +static void __uvCloseCb(uv_handle_t *puvPoll) +{ + PCURL_CONTEXT_DATA pContext = (PCURL_CONTEXT_DATA)puvPoll->data; + free(pContext); +} + +static void __destoryCurlContext(PCURL_CONTEXT_DATA pContext) +{ + uv_close((uv_handle_t *)&pContext->uvPool, __uvCloseCb); +} + +static void __checkMultiInfoTimeout(void) +{ + PHTTP_REQ_PARAMS pReq; + CURLMsg *pMsg = NULL; + int iPending; + + while((pMsg = curl_multi_info_read(g_pCurl, &iPending))) + { + switch(pMsg->msg) + { + case CURLMSG_DONE: + curl_easy_getinfo(pMsg->easy_handle, CURLINFO_PRIVATE, (void*)&pReq); + + LOG_EX(LOG_Debug, "Cleanup CURL: %p\n", pMsg->easy_handle); + + curl_multi_remove_handle(g_pCurl, pMsg->easy_handle); + curl_easy_cleanup(pMsg->easy_handle); + + if(pReq) + { + if(pReq->type == INET_HTTP_DOWNLOAD_FILE) + { + uv_fs_close(g_pMainLoop, &pReq->uvFsDataSync, pReq->uvFsOpen.result, NULL); + } + + if(pReq->onRspCb && pReq->isCancel == FALSE) + { + pReq->onRspCb(NULL, 0, pReq->pReqUrl, pReq->sPath, pReq->pTaskUuid, + -CURLE_OPERATION_TIMEDOUT, pReq->pData); + } + + if(pReq->pReqUrl) + { + free(pReq->pReqUrl); + pReq->pReqUrl = NULL; + } + + __removeReqIdFromTable(pReq->pTaskUuid); + + free(pReq); + pReq = NULL; + } + + break; + + default: + LOG_EX(LOG_Error, "pMsg->msg(%d) != CURLMSG_DONE\n", pMsg->msg); + return; + } + } +} + +static void __checkMultiInfo(void) +{ + PHTTP_REQ_PARAMS pReq; + CURLMsg *pMsg = NULL; + int iPending; + + while((pMsg = curl_multi_info_read(g_pCurl, &iPending))) + { + switch(pMsg->msg) + { + case CURLMSG_DONE: + curl_easy_getinfo(pMsg->easy_handle, CURLINFO_PRIVATE, (void*)&pReq); + + curl_multi_remove_handle(g_pCurl, pMsg->easy_handle); + LOG_EX(LOG_Debug, "Cleanup CURL: %p\n", pMsg->easy_handle); + curl_easy_cleanup(pMsg->easy_handle); + + if(pReq) + { + if(pReq->type == INET_HTTP_DOWNLOAD_FILE) + { + if(pMsg->data.result != CURLE_OK) + { + pReq->errCode = pMsg->data.result; + } + else + { + pReq->errCode = 0; + } + + uv_fs_fdatasync(g_pMainLoop, &pReq->uvFsDataSync, pReq->uvFsOpen.result, __uvFsDataSyncCb); + } + else if(pReq->type == INET_HTTP_WEBSERVICE_POST) + { + if(pMsg->data.result != CURLE_OK) + { + if(pReq->onRspCb && pReq->isCancel == FALSE) + { + pReq->onRspCb(pReq->uvFsBuf.base, pReq->dlSize, pReq->pReqUrl, pReq->sPath, + pReq->pTaskUuid, -pMsg->data.result, pReq->pData); + } + } + else + { + if(pReq->onRspCb && pReq->isCancel == FALSE) + { + pReq->onRspCb(pReq->uvFsBuf.base, pReq->dlSize, pReq->pReqUrl, pReq->sPath, + pReq->pTaskUuid, 0, pReq->pData); + } + } + + if(pReq->uvFsBuf.base) + { + free(pReq->uvFsBuf.base); + } + + if(pReq->pReqUrl) + { + free(pReq->pReqUrl); + pReq->pReqUrl = NULL; + } + + __removeReqIdFromTable(pReq->pTaskUuid); + + free(pReq); + pReq = NULL; + } + else + { + if(pMsg->data.result != CURLE_OK) + { + if(pReq->onRspCb && pReq->isCancel == FALSE){ + pReq->onRspCb(NULL, 0, pReq->pReqUrl, pReq->sPath, pReq->pTaskUuid, -pMsg->data.result, pReq->pData); + } + } + else + { + if(pReq->onRspCb && pReq->isCancel == FALSE) + { + pReq->onRspCb(NULL, 0, pReq->pReqUrl, pReq->sPath, pReq->pTaskUuid, 0, pReq->pData); + } + } + + if(pReq->pReqUrl) + { + free(pReq->pReqUrl); + pReq->pReqUrl = NULL; + } + + __removeReqIdFromTable(pReq->pTaskUuid); + + free(pReq); + pReq = NULL; + } + } + + break; + + default: + LOG_EX(LOG_Error, "pMsg->msg(%d) != CURLMSG_DONE\n", pMsg->msg); + return; + } + } +} + +static void __onDlTmoutCb(uv_timer_t *pufTimer) +{ + PCURL_HANDLE_TBL pItem = NULL, pTemp = NULL; + unsigned int curTm = (unsigned int)LIBUV_CURRENT_TIME_S(); + + HASH_ITER(hh, g_ReqHandleTbl, pItem, pTemp) + { + int dlTime; + + if(pItem->pCurlItem->isCancel) + { + continue; + } + + dlTime = curTm - pItem->pCurlItem->createTm; + + // 下载时间大于10s且平均下载速度小于10K/s超时 + if((dlTime * 10000 > pItem->pCurlItem->dlSize) && dlTime > 10) + { + LOG_EX(LOG_Error, "Download Speed less than 10k/s: %s (%uK/%ds)\n", + pItem->pTaskUuid, pItem->pCurlItem->dlSize / 1000, dlTime); + + __cancelDownloadTask(pItem->pCurlItem); + if(pItem->pCurlItem->onRspCb) + { + pItem->pCurlItem->onRspCb(NULL, + pItem->pCurlItem->dlSize, + pItem->pCurlItem->pReqUrl, + pItem->pCurlItem->sPath, + pItem->pCurlItem->pTaskUuid, + -CURLE_OPERATION_TIMEDOUT, + pItem->pCurlItem->pData); + } + break; + } + + // 10秒内没有下载任何数据超时 + if(pItem->pCurlItem->lastTm > 0) + { + if(curTm > pItem->pCurlItem->lastTm + MAX_TIMEOUT_VALUE) + { + LOG_EX(LOG_Error, "Download Timeout: %s\n", pItem->pTaskUuid); + __cancelDownloadTask(pItem->pCurlItem); + if(pItem->pCurlItem->onRspCb) + { + pItem->pCurlItem->onRspCb(NULL, + pItem->pCurlItem->dlSize, + pItem->pCurlItem->pReqUrl, + pItem->pCurlItem->sPath, + pItem->pCurlItem->pTaskUuid, + -CURLE_OPERATION_TIMEDOUT, + pItem->pCurlItem->pData); + } + break; + } + } + + // 下载最长时间设置为1800秒(30分钟) + if(dlTime > 1800) + { + LOG_EX(LOG_Error, "Download More than 1800 seconds: %s (%uK/%ds)\n", + pItem->pTaskUuid, pItem->pCurlItem->dlSize/1000, dlTime); + __cancelDownloadTask(pItem->pCurlItem); + if(pItem->pCurlItem->onRspCb) + { + pItem->pCurlItem->onRspCb(NULL, + pItem->pCurlItem->dlSize, + pItem->pCurlItem->pReqUrl, + pItem->pCurlItem->sPath, + pItem->pCurlItem->pTaskUuid, + -CURLE_OPERATION_TIMEDOUT, + pItem->pCurlItem->pData); + } + break; + } + } +} + +static void __onTimeoutCb(uv_timer_t *pufTimer) +{ + int iRun; + + curl_multi_socket_action(g_pCurl, CURL_SOCKET_TIMEOUT, 0, &iRun); + + __checkMultiInfoTimeout(); +} + +static int __curlTimerCb(CURLM *multi, /* multi handle */ + long timeout_ms, /* see above */ + void *userp) /* private callback pointer */ +{ + if(timeout_ms <= 0) + { + timeout_ms = 1; + } + + uv_timer_start(&g_uvCurlTm, __onTimeoutCb, timeout_ms, 0); + + return 0; +} + +static void __curlPollCb(uv_poll_t *pPoll, int status, int events) +{ + int iRun; + int flags; + PCURL_CONTEXT_DATA pContext = NULL; + + uv_timer_stop(&g_uvCurlTm); + + if(events & UV_READABLE) + { + flags = CURL_CSELECT_IN; + } + else if(events & UV_WRITABLE) + { + flags = CURL_CSELECT_OUT; + } + + pContext = (PCURL_CONTEXT_DATA)pPoll; + curl_multi_socket_action(g_pCurl, pContext->sock, flags, &iRun); + __checkMultiInfo(); +} + +static int __curlSockCb(CURL *easy, /* easy handle */ + curl_socket_t s, /* socket */ + int what, /* describes the socket */ + void *userp, /* private callback pointer */ + void *socketp) /* private socket pointer */ +{ + PCURL_CONTEXT_DATA pContext = NULL; + + if(what == CURL_POLL_IN || what == CURL_POLL_OUT) + { + if(socketp) + { + pContext = (PCURL_CONTEXT_DATA)socketp; + } + else + { + pContext = __createCurlContext(s); + } + + curl_multi_assign(g_pCurl, s, (void *)pContext); + } + + switch(what) + { + case CURL_POLL_IN: + uv_poll_start(&pContext->uvPool, UV_READABLE, __curlPollCb); + break; + + case CURL_POLL_OUT: + uv_poll_start(&pContext->uvPool, UV_WRITABLE, __curlPollCb); + break; + + case CURL_POLL_REMOVE: + if(socketp) + { + uv_poll_stop(&((PCURL_CONTEXT_DATA)socketp)->uvPool); + __destoryCurlContext((PCURL_CONTEXT_DATA)socketp); + curl_multi_assign(g_pCurl, s, NULL); + } + break; + + default: + return (0); + } + + return (0); +} + +static size_t __writeDataCb(void *pData, size_t size, size_t nmemb, void *pParams) +{ + PHTTP_REQ_PARAMS pReq = (PHTTP_REQ_PARAMS)pParams; + int iMemSize = size * nmemb; + + //print_hex_dump_bytes("OTA", DUMP_PREFIX_ADDRESS, pData, size * nmemb); + + if(pReq->isCancel) + { + return 0; + } + + pReq->lastTm = LIBUV_CURRENT_TIME_S(); + + if(pReq->type == INET_HTTP_DOWNLOAD_FILE) + { + int wr = 0; + + pReq->uvFsBuf = uv_buf_init(pData, iMemSize); + + wr = uv_fs_write(g_pMainLoop, &pReq->uvFsWrite, pReq->uvFsOpen.result, &pReq->uvFsBuf, 1, -1, NULL); + + if(wr > 0) + { + pReq->dlSize += wr; + } + } + else if(pReq->type == INET_HTTP_WEBSERVICE_POST) + { + int newSize = 0; + + if(pReq->uvFsBuf.base == NULL && pReq->uvFsBuf.len == 0) + { + newSize = iMemSize + 1; + //fprintf(stdout, "size = %d, newsize = %d, dlsize = %d\n", iMemSize, newSize, pReq->dlSize); + pReq->uvFsBuf.base = malloc(newSize); + memcpy(pReq->uvFsBuf.base, pData, iMemSize); + } + else + { + newSize = pReq->dlSize + iMemSize + 1; + //fprintf(stdout, "::size = %d, newsize = %d, dlsize = %d\n", iMemSize, newSize, pReq->dlSize); + pReq->uvFsBuf.base = realloc(pReq->uvFsBuf.base, newSize); + memcpy(pReq->uvFsBuf.base + pReq->dlSize, pData, iMemSize); + } + + pReq->uvFsBuf.base[pReq->dlSize] = 0; + pReq->dlSize += iMemSize; + } + + return (size * nmemb); +} + +static int __progressCb(void* pData, + double total, + double now, + double ultotal, + double ulnow) +{ + PHTTP_REQ_PARAMS pParams = (PHTTP_REQ_PARAMS)pData; + + if(pParams->onPrgCb) + { + if(pParams->type == INET_HTTP_DOWNLOAD_FILE) + { + pParams->onPrgCb(pParams->pReqUrl, pParams->pTaskUuid, (unsigned char)(now * 100.0 / total), pParams->pData); + } + } + + if(pParams->isCancel) + { + LOG_EX(LOG_Debug, "Cancel Download: %s\n", pParams->pTaskUuid); + return (-CURLE_OPERATION_TIMEDOUT); + } + + return (0); +} + +static size_t __getRemoteSizeCb(void *pData, size_t size, size_t nmemb, void *pParams) +{ + return (size * nmemb); +} + +static int __iNetGetRemoteSize(const char* pURL, unsigned int reqId) +{ + double size = 0.0; + CURL *pCurl = curl_easy_init(); + CURLcode res; + + curl_easy_setopt(pCurl, CURLOPT_URL, pURL); + curl_easy_setopt(pCurl, CURLOPT_NOBODY, 1L); + curl_easy_setopt(pCurl, CURLOPT_HEADERFUNCTION, __getRemoteSizeCb); + curl_easy_setopt(pCurl, CURLOPT_FOLLOWLOCATION, 1L); + + curl_easy_perform(pCurl); + + res = curl_easy_getinfo(pCurl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &size); + + if(res != CURLE_OK) + { + return (-1); + } + + curl_easy_cleanup(pCurl); + + return (int)(size); +} + +#if 0 +static const char* __restartDlFileAsync(PHTTP_REQ_PARAMS pParams) +{ + CURL *pCurl = curl_easy_init(); + + pParams->type = INET_HTTP_DOWNLOAD_FILE; + pParams->dlSize = 0; + pParams->pCurl = pCurl; + pParams->lastTm = 0; + + uv_fs_open(g_pMainLoop, + &pParams->uvFsOpen, + pParams->sDlPath, + O_RDWR | O_CREAT | O_TRUNC, + S_IRUSR | S_IWUSR, + NULL); + + curl_easy_setopt(pCurl, CURLOPT_WRITEFUNCTION, __writeDataCb); + curl_easy_setopt(pCurl, CURLOPT_WRITEDATA, pParams); + curl_easy_setopt(pCurl, CURLOPT_PRIVATE, pParams); + curl_easy_setopt(pCurl, CURLOPT_URL, pParams->pReqUrl); + + curl_easy_setopt(pCurl, CURLOPT_NOPROGRESS, 0L); + curl_easy_setopt(pCurl, CURLOPT_PROGRESSFUNCTION, __progressCb); + curl_easy_setopt(pCurl, CURLOPT_PROGRESSDATA, pParams); + + curl_easy_setopt(pCurl, CURLOPT_LOW_SPEED_LIMIT, 10000L); // 10K bytes + curl_easy_setopt(pCurl, CURLOPT_LOW_SPEED_TIME, 10L); // 30 seconds + + curl_easy_setopt(pCurl, CURLOPT_CONNECTTIMEOUT, 10L); + +#ifdef SKIP_PEER_VERIFICATION + /* + * If you want to connect to a site who isn't using a certificate that is + * signed by one of the certs in the CA bundle you have, you can skip the + * verification of the server's certificate. This makes the connection + * A LOT LESS SECURE. + * + * If you have a CA cert for the server stored someplace else than in the + * default bundle, then the CURLOPT_CAPATH option might come handy for + * you. + */ + curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYPEER, 0L); +#else + curl_easy_setopt(pCurl, CURLOPT_CAINFO, SSL_CA_FILE); + curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYPEER, 1L); +#endif + +#ifdef SKIP_HOSTNAME_VERIFICATION + /* + * If the site you're connecting to uses a different host name that what + * they have mentioned in their server certificate's commonName (or + * subjectAltName) fields, libcurl will refuse to connect. You can skip + * this check, but this will make the connection less secure. + */ + curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYHOST, 0L); +#endif + + //LOG_EX(LOG_Debug, "Total Size = %d\n", __iNetGetRemoteSize(pURL, 0)); + + curl_multi_add_handle(g_pCurl, pCurl); + + __addReqIdToTable(pParams->pTaskUuid, pCurl); + + return (pParams->pTaskUuid); +} +#endif + +const char* InetHttpDlFileAsync(const char *pURL, + const char *pPath, + OnHttpResponse onRespCb, + OnProgressNotify onProgressCb, + void* pData) +{ + CURLMcode ret; + uuid_t msgId; + char strMsgId[64]; + PHTTP_REQ_PARAMS pParams = NULL; + CURL *pCurl = NULL; + unsigned long long uMemFreeSize = GetPartitionFreeSize("/tmp/"); + + if(pURL == NULL || strlen(pURL) == 0 || onRespCb == NULL) + { + free(pParams); + return (NULL); + } + + LOG_EX(LOG_Debug, "Begin Download: %s --> %s\n", pURL, pPath); + + pParams = (PHTTP_REQ_PARAMS)malloc(sizeof(HTTP_REQ_PARAMS)); + + memset(pParams, 0, sizeof(HTTP_REQ_PARAMS)); + + pCurl = curl_easy_init(); + + pParams->onRspCb = onRespCb; + pParams->pReqUrl = (char *)malloc(strlen(pURL) + 1); + pParams->type = INET_HTTP_DOWNLOAD_FILE; + pParams->dlSize = 0; + pParams->onPrgCb = onProgressCb; + pParams->pData = pData; + pParams->pCurl = pCurl; + pParams->lastTm = 0; + pParams->isCancel = FALSE; + pParams->createTm = (unsigned int)LIBUV_CURRENT_TIME_S(); + + memset(pParams->pReqUrl, 0, strlen(pURL) + 1); + strcpy(pParams->pReqUrl, pURL); + + uuid_generate_random(msgId); + memset(strMsgId, 0, 64); + uuid_unparse_lower(msgId, strMsgId); + pParams->pTaskUuid = strdup(strMsgId); + + if(pPath == NULL) + { + sprintf(pParams->sPath, "./%s", basename_v2(pURL)); + } + else + { + strcpy(pParams->sPath, pPath); + } + + // Memory Free More Than 100M, Download Temp File To Memory + if(uMemFreeSize >= 100 * 1024 * 1024 && + strncmp(pParams->sPath, "/tmp/", 5) != 0) + { + int ret = system("mkdir /tmp/dl -p"); + sprintf(pParams->sDlPath, "/tmp/dl/%s_%s.dl", basename_v2(pParams->sPath), pParams->pTaskUuid); + } + else + { + strcpy(pParams->sDlPath, pParams->sPath); + } + + pParams->uvFsDataSync.data = pParams; + pParams->uvFsClose.data = pParams; + + uv_fs_open(g_pMainLoop, + &pParams->uvFsOpen, + pParams->sDlPath, + O_RDWR | O_CREAT | O_TRUNC, + S_IRUSR | S_IWUSR, + NULL); + + curl_easy_setopt(pCurl, CURLOPT_WRITEFUNCTION, __writeDataCb); + curl_easy_setopt(pCurl, CURLOPT_WRITEDATA, pParams); + curl_easy_setopt(pCurl, CURLOPT_PRIVATE, pParams); + curl_easy_setopt(pCurl, CURLOPT_URL, pURL); + + curl_easy_setopt(pCurl, CURLOPT_NOPROGRESS, 0L); + curl_easy_setopt(pCurl, CURLOPT_PROGRESSFUNCTION, __progressCb); + curl_easy_setopt(pCurl, CURLOPT_PROGRESSDATA, pParams); + + //curl_easy_setopt(pCurl, CURLOPT_TIMEOUT, 1800L); // Max download times (30 minutes)1800s + curl_easy_setopt(pCurl, CURLOPT_LOW_SPEED_LIMIT, 10000L); // 10K bytes + curl_easy_setopt(pCurl, CURLOPT_LOW_SPEED_TIME, 10L); // 30 seconds + + curl_easy_setopt(pCurl, CURLOPT_CONNECTTIMEOUT, 10L); + //curl_easy_setopt(pCurl, CURLOPT_CONNECTTIMEOUT_MS, 10L); + + + //curl_easy_setopt(pCurl, CURLOPT_VERBOSE, 1L); + +#ifdef SKIP_PEER_VERIFICATION + /* + * If you want to connect to a site who isn't using a certificate that is + * signed by one of the certs in the CA bundle you have, you can skip the + * verification of the server's certificate. This makes the connection + * A LOT LESS SECURE. + * + * If you have a CA cert for the server stored someplace else than in the + * default bundle, then the CURLOPT_CAPATH option might come handy for + * you. + */ + curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYPEER, 0L); +#else + curl_easy_setopt(pCurl, CURLOPT_CAINFO, SSL_CA_FILE); + curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYPEER, 1L); +#endif + +#ifdef SKIP_HOSTNAME_VERIFICATION + /* + * If the site you're connecting to uses a different host name that what + * they have mentioned in their server certificate's commonName (or + * subjectAltName) fields, libcurl will refuse to connect. You can skip + * this check, but this will make the connection less secure. + */ + curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYHOST, 0L); +#endif + + LOG_EX(LOG_Debug, "Download(%u): %s --> %p\n", g_TotalDownloads++, pParams->pTaskUuid, pCurl); + ret = curl_multi_add_handle(g_pCurl, pCurl); + if(ret == CURLE_OK) + { + __addReqIdToTable(pParams->pTaskUuid, pParams); + return (pParams->pTaskUuid); + } + else + { + free(pParams->pTaskUuid); + LOG_EX(LOG_Error, "Add Handle Error: %d\n", ret); + return NULL; + } +} + +int InetCancelDownload(const char *pTaskUuid) +{ + if(pTaskUuid && strlen(pTaskUuid) > 0) + { + PCURL_HANDLE_TBL pItem = NULL; + + HASH_FIND_STR(g_ReqHandleTbl, pTaskUuid, pItem); + + if(pItem != NULL && pItem->pCurlItem->isCancel != TRUE) + { + __cancelDownloadTask(pItem->pCurlItem); + if(pItem->pCurlItem->onRspCb) + { + pItem->pCurlItem->onRspCb(NULL, + pItem->pCurlItem->dlSize, + pItem->pCurlItem->pReqUrl, + pItem->pCurlItem->sPath, + pItem->pCurlItem->pTaskUuid, + -CURLE_OPERATION_TIMEDOUT, + pItem->pCurlItem->pData); + } + } + } + + return (0); +} + +static size_t __uploadCb(char *d, size_t n, size_t l, void *p) +{ + return n*l; +} + +#ifdef LIBCURL_DEBUG +struct data { + char trace_ascii; /* 1 or 0 */ +}; + +static +void dump(const char *text, + FILE *stream, unsigned char *ptr, size_t size, + char nohex) +{ + size_t i; + size_t c; + + unsigned int width = 0x10; + + if(nohex) + /* without the hex output, we can fit more on screen */ + width = 0x40; + + fprintf(stream, "%s, %10.10ld bytes (0x%8.8lx)\n", + text, (long)size, (long)size); + + for(i = 0; i= 0x20) && (ptr[i + c]<0x80)?ptr[i + c]:'.'); + /* check again for 0D0A, to avoid an extra \n if it's at width */ + if(nohex && (i + c + 2 < size) && ptr[i + c + 1] == 0x0D && + ptr[i + c + 2] == 0x0A) { + i += (c + 3 - width); + break; + } + } + fputc('\n', stream); /* newline */ + } + fflush(stream); +} + +static +int my_trace(CURL *handle, curl_infotype type, + char *data, size_t size, + void *userp) +{ + struct data *config = (struct data *)userp; + const char *text; + (void)handle; /* prevent compiler warning */ + + switch(type) { + case CURLINFO_TEXT: + fprintf(stderr, "== Info: %s", data); + /* FALLTHROUGH */ + default: /* in case a new one is introduced to shock us */ + return 0; + + case CURLINFO_HEADER_OUT: + text = "=> Send header"; + break; + case CURLINFO_DATA_OUT: + text = "=> Send data"; + break; + case CURLINFO_SSL_DATA_OUT: + text = "=> Send SSL data"; + break; + case CURLINFO_HEADER_IN: + text = "<= Recv header"; + break; + case CURLINFO_DATA_IN: + text = "<= Recv data"; + break; + case CURLINFO_SSL_DATA_IN: + text = "<= Recv SSL data"; + break; + } + + dump(text, stderr, (unsigned char *)data, size, config->trace_ascii); + return 0; +} +#endif + +int InetHttpUploadFileSync(const char *pURL, const char* pPath, void* pAttachInfo) +{ + CURL *pCurl = NULL; + int rc = 0; + CURLcode ret; + struct curl_httppost *pPost = NULL, *pLastPtr = NULL; + +#ifdef LIBCURL_DEBUG + struct data config; + config.trace_ascii = 1; /* enable ascii tracing */ +#endif + + if(pURL == NULL || strlen(pURL) == 0) + { + LOG_EX(LOG_Error, "Url: %s(%p)\n", SAFE_STRING_VALUE(pURL), pURL); + return -ERR_INPUT_PARAMS; + } + + if(pPath == NULL || strlen(pPath) == 0) + { + LOG_EX(LOG_Error, "Url: %s(%p)\n", SAFE_STRING_VALUE(pPath), pPath); + return -ERR_INPUT_PARAMS; + } + + curl_formadd(&pPost, &pLastPtr, + CURLFORM_COPYNAME, "file", + CURLFORM_FILE, pPath, + CURLFORM_END); + + if(pAttachInfo) + { + PHTTP_POST_ATTACH pDevInfoArray = (PHTTP_POST_ATTACH)pAttachInfo; + PHTTP_POST_ATTACH pItem = NULL, pTmp = NULL; + + LL_FOREACH_SAFE(pDevInfoArray, pItem, pTmp) + { + curl_formadd(&pPost, &pLastPtr, + CURLFORM_COPYNAME, pItem->keyName, + CURLFORM_COPYCONTENTS, pItem->keyValue, + CURLFORM_END); + } + } + + pCurl = curl_easy_init(); + + if(pCurl == NULL) + { + LOG_EX(LOG_Error, "curl_easy_init() Error\n"); + return -ERR_MALLOC_MEMORY; + } + + curl_easy_setopt(pCurl, CURLOPT_ACCEPT_ENCODING, "gzip, deflate"); + curl_easy_setopt(pCurl, CURLOPT_POST, 1L); + curl_easy_setopt(pCurl, CURLOPT_URL, pURL); + curl_easy_setopt(pCurl, CURLOPT_HTTPPOST, pPost); + curl_easy_setopt(pCurl, CURLOPT_WRITEFUNCTION, __uploadCb); + curl_easy_setopt(pCurl, CURLOPT_CONNECTTIMEOUT, 10L); +#ifdef LIBCURL_DEBUG + curl_easy_setopt(pCurl, CURLOPT_DEBUGFUNCTION, my_trace); + curl_easy_setopt(pCurl, CURLOPT_DEBUGDATA, &config); +#endif + +#ifdef SKIP_PEER_VERIFICATION + /* + * If you want to connect to a site who isn't using a certificate that is + * signed by one of the certs in the CA bundle you have, you can skip the + * verification of the server's certificate. This makes the connection + * A LOT LESS SECURE. + * + * If you have a CA cert for the server stored someplace else than in the + * default bundle, then the CURLOPT_CAPATH option might come handy for + * you. + */ + curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYPEER, 0L); +#else + curl_easy_setopt(pCurl, CURLOPT_CAINFO, SSL_CA_FILE); + curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYPEER, 1L); +#endif + +#ifdef SKIP_HOSTNAME_VERIFICATION + /* + * If the site you're connecting to uses a different host name that what + * they have mentioned in their server certificate's commonName (or + * subjectAltName) fields, libcurl will refuse to connect. You can skip + * this check, but this will make the connection less secure. + */ + curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYHOST, 0L); +#endif + + +#ifdef LIBCURL_DEBUG + curl_easy_setopt(pCurl, CURLOPT_VERBOSE, 1L); +#else + curl_easy_setopt(pCurl, CURLOPT_VERBOSE, 0L); +#endif + + ret = curl_easy_perform(pCurl); + + if(ret != CURLE_OK) + { + LOG_EX(LOG_Error, "Upload %s File %s Error %s\n", pURL, pPath, curl_easy_strerror(ret)); + rc = -ERR_NETWORK_SEND; + } + + curl_easy_cleanup(pCurl); + curl_formfree(pPost); + + return rc; +} + +const char* InetHttpWebServicePostAsync(const char *pURL, const char* pPost, OnHttpResponse onRespCb, void* pData) +{ + uuid_t msgId; + char strMsgId[64]; + PHTTP_REQ_PARAMS pParams = (PHTTP_REQ_PARAMS)malloc(sizeof(HTTP_REQ_PARAMS)); + CURL *pCurl = NULL; + + if(pURL == NULL || strlen(pURL) == 0 || onRespCb == NULL) + { + free(pParams); + return (NULL); + } + + memset(pParams, 0, sizeof(HTTP_REQ_PARAMS)); + + pCurl = curl_easy_init(); + + pParams->onRspCb = onRespCb; + pParams->pReqUrl = (char *)malloc(strlen(pURL) + 1); + pParams->type = INET_HTTP_WEBSERVICE_POST; + pParams->dlSize = 0; + pParams->pData = pData; + pParams->pCurl = pCurl; + pParams->lastTm = 0; + pParams->isCancel = FALSE; + + memset(pParams->pReqUrl, 0, strlen(pURL) + 1); + strcpy(pParams->pReqUrl, pURL); + + uuid_generate_random(msgId); + memset(strMsgId, 0, 64); + uuid_unparse_lower(msgId, strMsgId); + pParams->pTaskUuid = strdup(strMsgId); + + curl_easy_setopt(pCurl, CURLOPT_WRITEFUNCTION, __writeDataCb); + curl_easy_setopt(pCurl, CURLOPT_WRITEDATA, pParams); + curl_easy_setopt(pCurl, CURLOPT_PRIVATE, pParams); + curl_easy_setopt(pCurl, CURLOPT_URL, pURL); + curl_easy_setopt(pCurl, CURLOPT_NOPROGRESS, 1L); + curl_easy_setopt(pCurl, CURLOPT_USERAGENT, "libcurl-agent/1.0"); + + if(pPost != NULL && strlen(pPost) > 0) + { + curl_easy_setopt(pCurl, CURLOPT_POSTFIELDS, pPost); + curl_easy_setopt(pCurl, CURLOPT_POSTFIELDSIZE, (long)strlen(pPost)); + } + +#ifdef SKIP_PEER_VERIFICATION + /* + * If you want to connect to a site who isn't using a certificate that is + * signed by one of the certs in the CA bundle you have, you can skip the + * verification of the server's certificate. This makes the connection + * A LOT LESS SECURE. + * + * If you have a CA cert for the server stored someplace else than in the + * default bundle, then the CURLOPT_CAPATH option might come handy for + * you. + */ + curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYPEER, 0L); +#else + curl_easy_setopt(pCurl, CURLOPT_CAINFO, SSL_CA_FILE); + curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYPEER, 1L); +#endif + +#ifdef SKIP_HOSTNAME_VERIFICATION + /* + * If the site you're connecting to uses a different host name that what + * they have mentioned in their server certificate's commonName (or + * subjectAltName) fields, libcurl will refuse to connect. You can skip + * this check, but this will make the connection less secure. + */ + curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYHOST, 0L); +#endif + + curl_multi_add_handle(g_pCurl, pCurl); + + __addReqIdToTable(pParams->pTaskUuid, pParams); + + return (pParams->pTaskUuid); +} + +#if 0 +static void __curlTaskRuntimeCb(void *pParams) +{ + PCURL_HANDLE_TBL pItem = NULL, pTmpItem = NULL; + + while(TRUE) + { + uv_rwlock_rdlock(&g_uvHashRwLock); + + HASH_ITER(hh, g_ReqHandleTbl, pItem, pTmpItem) + { + if(pItem->pCurlItem->type == INET_HTTP_DOWNLOAD_FILE + && pItem->pCurlItem->lastTm > 0) + { + //unsigned int tmNow = LIBUV_CURRENT_TIME_S(); + + if(pItem->pCurlItem->lastTm > 0) + { + //curl_multi_cleanup(pItem->pCurlItem->pCurl); + curl_multi_remove_handle(g_pCurl, pItem->pCurlItem->pCurl); + + if(pItem->uRetryTimes >= 3) + { + if(pItem->pCurlItem->onRspCb) + { + if(strcmp(pItem->pCurlItem->sPath, pItem->pCurlItem->sDlPath) != 0) + { + unlink(pItem->pCurlItem->sDlPath); + } + + pItem->pCurlItem->onRspCb(NULL, + pItem->pCurlItem->dlSize, + pItem->pCurlItem->pReqUrl, + pItem->pCurlItem->sPath, + pItem->pCurlItem->pTaskUuid, + TRUE, + pItem->pCurlItem->pData); + } + + if(pItem->pCurlItem->pReqUrl) + { + free(pItem->pCurlItem->pReqUrl); + } + } + else + { + __restartDlFileAsync(pItem->pCurlItem); + } + } + } + } + uv_rwlock_rdunlock(&g_uvHashRwLock); + usleep(100000); + } + + pthread_detach(pthread_self()); +} +#endif + +static int __getUsernameFromMail(const char *pMailAddr, char **pUsername) +{ + char *pTail; + + if(pMailAddr == NULL || pUsername == NULL || strlen(pMailAddr) == 0) + { + LOG_EX(LOG_Error, "Input Params Error: pMailAddr = [%s], pUsername = %p\n", + pMailAddr ? pMailAddr : "NULL", pUsername); + return (-ERR_INPUT_PARAMS); + } + + *pUsername = (char *)malloc(strlen(pMailAddr) + 1); + + if(*pUsername == NULL) + { + LOG_EX(LOG_Error, "Error Malloc Memory\n"); + *pUsername = ""; + return (-ERR_MALLOC_MEMORY); + } + + memset(*pUsername, 0, strlen(pMailAddr) + 1); + + pTail = strchr(pMailAddr, '@'); + + if(pTail == NULL) + { + strcpy(*pUsername, pMailAddr); + } + else + { + memcpy(*pUsername, pMailAddr, pTail - pMailAddr); + } + + return (0); +} + +int InetSmtpSendEmail(const char* pFrom, + const char* pTo[], + const char* pCc[], + const char* pTitle, + const char* pMessage, + const char* pAttach[], + PSMTP_MAIL_CONFIG pConfig) +{ + const char *pErrMsg = NULL; + quickmail pMail; + + if(pConfig == NULL) + { + LOG_EX(LOG_Error, "Input Param pConfig = NULL\n"); + return (-ERR_INPUT_PARAMS); + } + + if(pConfig->pPassword == NULL || strlen(pConfig->pPassword) == 0) + { + LOG_EX(LOG_Error, "Input Param Error: pConfig->pPassword = [%s]\n", pConfig->pPassword ? pConfig->pPassword : "NULL"); + return (-ERR_INPUT_PARAMS); + } + + if(pConfig->pUserName == NULL || strlen(pConfig->pUserName) == 0) + { + LOG_EX(LOG_Error, "Input Param Error: pConfig->pUserName = [%s]\n", pConfig->pUserName ? pConfig->pUserName : "NULL"); + return (-ERR_INPUT_PARAMS); + } + + if(pConfig->pSmtpServer == NULL || strlen(pConfig->pSmtpServer) == 0) + { + LOG_EX(LOG_Error, "Input Param Error: pConfig->pUserName = [%s]\n", pConfig->pSmtpServer ? pConfig->pSmtpServer : "NULL"); + return (-ERR_INPUT_PARAMS); + } + + if(pFrom == NULL) + { + LOG_EX(LOG_Error, "Input Param pFrom = NULL\n"); + return (-ERR_INPUT_PARAMS); + } + + if(pTo == NULL && pCc == NULL) + { + LOG_EX(LOG_Error, "Input Param pTo = %p, pCc = %p\n", pTo, pCc); + return (-ERR_INPUT_PARAMS); + } + + if(pTitle == NULL) + { + pTitle = ""; + } + + if(pMessage == NULL) + { + pMessage = ""; + } + + quickmail_initialize(); + + pMail = quickmail_create(pFrom, pTitle); + + if(pMail == NULL) + { + LOG_EX(LOG_Error, "Create Quickmail Object Error\n"); + return (-ERR_MALLOC_MEMORY); + } + + for(const char **pValue = pTo; pTo && *pValue; pValue++) + { + quickmail_add_to(pMail, *pValue); + } + + for(const char **pValue = pCc; pCc && *pValue; pValue++) + { + quickmail_add_cc(pMail, *pValue); + } + + quickmail_add_header(pMail, "Importance: Low"); + quickmail_add_header(pMail, "X-Priority: 5"); + quickmail_add_header(pMail, "X-MSMail-Priority: Low"); + quickmail_add_body_memory(pMail, "text/html", (char*)pMessage, strlen(pMessage), 0); + + for(const char **pValue = pAttach; pAttach && *pValue; pValue++) + { + quickmail_add_attachment_file(pMail, *pValue, NULL); + } + + //quickmail_set_debug_log(pMail, stderr); + + pErrMsg = quickmail_send(pMail, pConfig->pSmtpServer, pConfig->smtpPort, pConfig->pUserName, pConfig->pPassword); + + if(pErrMsg != NULL) + { + LOG_EX(LOG_Error, "Send Mail Error: %s\n", pErrMsg); + return (-ERR_SEND_MAIL); + } + + return (0); +} + +int InetInit(void) +{ + int ret = 0; + + ret = curl_global_init(CURL_GLOBAL_ALL); + + if(ret != 0) + { + LOG_EX(LOG_Error, "curl init error: %d\n", ret); + return ret; + } + + g_pMainLoop = DBusLibuvGetRuntime()->pLoop; + + uv_timer_init(g_pMainLoop, &g_uvCurlTm); + uv_timer_init(g_pMainLoop, &g_uvDlTm); + + g_pCurl = curl_multi_init(); + + curl_multi_setopt(g_pCurl, CURLMOPT_SOCKETFUNCTION, __curlSockCb); + curl_multi_setopt(g_pCurl, CURLMOPT_TIMERFUNCTION, __curlTimerCb); + + uv_rwlock_init(&g_uvHashRwLock); + + uv_timer_start(&g_uvDlTm, __onDlTmoutCb, 1000, 1000); + + return (0); +} + +void InetUnInit(void) +{ + curl_multi_cleanup(g_pCurl); + curl_global_cleanup(); +} + diff --git a/Framework/Network/inet_api.c.bak b/Framework/Network/inet_api.c.bak new file mode 100644 index 0000000..7333176 --- /dev/null +++ b/Framework/Network/inet_api.c.bak @@ -0,0 +1,1327 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "log.h" +#include "inet_api.h" + +#define MAX_TIMEOUT_VALUE (10) +#define SSL_CA_FILE ("/etc/ssl/certs/ca-certificates.crt") + +typedef enum +{ + INET_HTTP_DOWNLOAD_FILE = 0, + INET_HTTP_WEBSERVICE_POST, +} INET_ACCESS_TYPE; + +typedef struct +{ + uv_poll_t uvPool; + curl_socket_t sock; +} CURL_CONTEXT_DATA, *PCURL_CONTEXT_DATA; + +typedef struct +{ + char* pReqUrl; + char sPath[MAX_PATH]; + char sDlPath[MAX_PATH]; + char* pTaskUuid; + INET_ACCESS_TYPE type; + unsigned int dlSize; + unsigned int lastTm; + unsigned int createTm; + uv_fs_t uvFsOpen; + uv_fs_t uvFsWrite; + uv_fs_t uvFsDataSync; + uv_fs_t uvFsClose; + uv_buf_t uvFsBuf; + OnProgressNotify onPrgCb; + OnHttpResponse onRspCb; + CURL* pCurl; + void* pData; + int errCode; +} HTTP_REQ_PARAMS, *PHTTP_REQ_PARAMS; + +typedef struct +{ + char *pTaskUuid; + unsigned int uRetryTimes; + int isCancel; + PHTTP_REQ_PARAMS pCurlItem; + + UT_hash_handle hh; ///< UT Hash handle +} CURL_HANDLE_TBL, *PCURL_HANDLE_TBL; + +static uv_timer_t g_uvCurlTm; +static uv_timer_t g_uvDlTm; +static CURLM* g_pCurl = NULL; +static uv_loop_t* g_pMainLoop = NULL; +static PCURL_HANDLE_TBL g_ReqHandleTbl = NULL; +static uv_rwlock_t g_uvHashRwLock; + +static void __addReqIdToTable(const char* pTaskUuid, PHTTP_REQ_PARAMS pParams) +{ + PCURL_HANDLE_TBL pItem = NULL; + + uv_rwlock_rdlock(&g_uvHashRwLock); + HASH_FIND_STR(g_ReqHandleTbl, pTaskUuid, pItem); + uv_rwlock_rdunlock(&g_uvHashRwLock); + + if(pItem == NULL) + { + pItem = (PCURL_HANDLE_TBL)malloc(sizeof(CURL_HANDLE_TBL)); + + memset(pItem, 0, sizeof(CURL_HANDLE_TBL)); + pItem->pTaskUuid = (char*)pTaskUuid; + + uv_rwlock_wrlock(&g_uvHashRwLock); + HASH_ADD_STR(g_ReqHandleTbl, pTaskUuid, pItem); + uv_rwlock_wrunlock(&g_uvHashRwLock); + } + + pItem->isCancel = FALSE; + pItem->pCurlItem = pParams; + pItem->uRetryTimes++; +} + +static void __removeReqIdFromTable(const char* pTaskUuid) +{ + PCURL_HANDLE_TBL pItem = NULL; + + uv_rwlock_rdlock(&g_uvHashRwLock); + HASH_FIND_STR(g_ReqHandleTbl, pTaskUuid, pItem); + uv_rwlock_rdunlock(&g_uvHashRwLock); + + if(pItem != NULL) + { + pItem->isCancel = TRUE; + } +} + +static void __cleanUpReqIdFromTable(PCURL_HANDLE_TBL pItem) +{ + if(pItem != NULL) + { + HASH_DEL(g_ReqHandleTbl, pItem); + + if(pItem->pTaskUuid) + { + free(pItem->pTaskUuid); + } + + free(pItem); + } +} + +static void __uvFsCloseCb(uv_fs_t *puvFs) +{ + PHTTP_REQ_PARAMS pParams = (PHTTP_REQ_PARAMS)puvFs->data; + + if(puvFs->result < 0) + { + LOG_EX(LOG_Error, "[%s] Error: %d\n", __FUNCTION__, puvFs->result); + } + + uv_fs_req_cleanup(puvFs); + + if(pParams->type == INET_HTTP_DOWNLOAD_FILE) + { + if(strcmp(pParams->sDlPath, pParams->sPath) != 0) + { + CopyFile(pParams->sDlPath, pParams->sPath); + unlink(pParams->sDlPath); + } + + pParams->onRspCb(NULL, pParams->dlSize, pParams->pReqUrl, pParams->sPath, + pParams->pTaskUuid, pParams->errCode, pParams->pData); + } + + __removeReqIdFromTable(pParams->pTaskUuid); + + if(pParams->pReqUrl) + { + free(pParams->pReqUrl); + pParams->pReqUrl = NULL; + } + + free(pParams); + pParams = NULL; +} + +static void __uvFsDataSyncCb(uv_fs_t *puvFs) +{ + PHTTP_REQ_PARAMS pParams = (PHTTP_REQ_PARAMS)puvFs->data; + + if(puvFs->result < 0) + { + LOG_EX(LOG_Error, "[%s] Error: %d\n", __FUNCTION__, puvFs->result); + } + + uv_fs_req_cleanup(puvFs); + + uv_fs_close(g_pMainLoop, &pParams->uvFsClose, pParams->uvFsOpen.result, __uvFsCloseCb); +} + +static PCURL_CONTEXT_DATA __createCurlContext(curl_socket_t sock) +{ + PCURL_CONTEXT_DATA pContext = (PCURL_CONTEXT_DATA)malloc(sizeof(CURL_CONTEXT_DATA)); + + pContext->sock = sock; + + if(uv_poll_init_socket(g_pMainLoop, &pContext->uvPool, sock) != 0) + { + LOG_EX(LOG_Error, "uv_poll_init_socket Error\n"); + } + + pContext->uvPool.data = pContext; + + return (pContext); +} + +static void __uvCloseCb(uv_handle_t *puvPoll) +{ + PCURL_CONTEXT_DATA pContext = (PCURL_CONTEXT_DATA)puvPoll->data; + free(pContext); +} + +static void __destoryCurlContext(PCURL_CONTEXT_DATA pContext) +{ + uv_close((uv_handle_t *)&pContext->uvPool, __uvCloseCb); +} + +static void __checkMultiInfoTimeout(void) +{ + PHTTP_REQ_PARAMS pReq; + CURLMsg *pMsg = NULL; + int iPending; + + while((pMsg = curl_multi_info_read(g_pCurl, &iPending))) + { + switch(pMsg->msg) + { + case CURLMSG_DONE: + curl_easy_getinfo(pMsg->easy_handle, CURLINFO_PRIVATE, (void*)&pReq); + + curl_multi_remove_handle(g_pCurl, pMsg->easy_handle); + curl_easy_cleanup(pMsg->easy_handle); + + if(pReq) + { + pReq->onRspCb(NULL, 0, pReq->pReqUrl, pReq->sPath, pReq->pTaskUuid, + -CURLE_OPERATION_TIMEDOUT, pReq->pData); + + if(pReq->pReqUrl) + { + free(pReq->pReqUrl); + pReq->pReqUrl = NULL; + } + + __removeReqIdFromTable(pReq->pTaskUuid); + + free(pReq); + pReq = NULL; + } + + break; + + default: + LOG_EX(LOG_Error, "pMsg->msg(%d) != CURLMSG_DONE\n", pMsg->msg); + return; + } + } +} + +static void __checkMultiInfo(void) +{ + PHTTP_REQ_PARAMS pReq; + CURLMsg *pMsg = NULL; + int iPending; + + while((pMsg = curl_multi_info_read(g_pCurl, &iPending))) + { + switch(pMsg->msg) + { + case CURLMSG_DONE: + curl_easy_getinfo(pMsg->easy_handle, CURLINFO_PRIVATE, (void*)&pReq); + + curl_multi_remove_handle(g_pCurl, pMsg->easy_handle); + curl_easy_cleanup(pMsg->easy_handle); + + if(pReq) + { + if(pReq->type == INET_HTTP_DOWNLOAD_FILE) + { + if(pMsg->data.result != CURLE_OK) + { + pReq->errCode = pMsg->data.result; + } + else + { + pReq->errCode = 0; + } + + uv_fs_fdatasync(g_pMainLoop, &pReq->uvFsDataSync, pReq->uvFsOpen.result, __uvFsDataSyncCb); + } + else if(pReq->type == INET_HTTP_WEBSERVICE_POST) + { + if(pMsg->data.result != CURLE_OK) + { + pReq->onRspCb(pReq->uvFsBuf.base, pReq->dlSize, pReq->pReqUrl, pReq->sPath, + pReq->pTaskUuid, -pMsg->data.result, pReq->pData); + } + else + { + pReq->onRspCb(pReq->uvFsBuf.base, pReq->dlSize, pReq->pReqUrl, pReq->sPath, + pReq->pTaskUuid, 0, pReq->pData); + } + + if(pReq->uvFsBuf.base) + { + free(pReq->uvFsBuf.base); + } + + if(pReq->pReqUrl) + { + free(pReq->pReqUrl); + pReq->pReqUrl = NULL; + } + + __removeReqIdFromTable(pReq->pTaskUuid); + + free(pReq); + pReq = NULL; + } + else + { + if(pMsg->data.result != CURLE_OK) + { + pReq->onRspCb(NULL, 0, pReq->pReqUrl, pReq->sPath, pReq->pTaskUuid, -pMsg->data.result, pReq->pData); + } + else + { + pReq->onRspCb(NULL, 0, pReq->pReqUrl, pReq->sPath, pReq->pTaskUuid, 0, pReq->pData); + } + + if(pReq->pReqUrl) + { + free(pReq->pReqUrl); + pReq->pReqUrl = NULL; + } + + __removeReqIdFromTable(pReq->pTaskUuid); + + free(pReq); + pReq = NULL; + } + } + + break; + + default: + LOG_EX(LOG_Error, "pMsg->msg(%d) != CURLMSG_DONE\n", pMsg->msg); + return; + } + } +} + +static void __onDlTmoutCb(uv_timer_t *pufTimer) +{ + PCURL_HANDLE_TBL pItem = NULL, pTemp = NULL; + unsigned int curTm = (unsigned int)LIBUV_CURRENT_TIME_S(); + + uv_rwlock_rdlock(&g_uvHashRwLock); + HASH_ITER(hh, g_ReqHandleTbl, pItem, pTemp) + { + int dlTime; + + if(pItem->isCancel) + { + continue; + } + + dlTime = curTm - pItem->pCurlItem->createTm; + + // 下载时间大于10s且平均下载速度小于10K/s超时 + if((dlTime * 10000 > pItem->pCurlItem->dlSize) && dlTime > 10) + { + LOG_EX(LOG_Error, "Download Speed less than 10k/s: %s (%uK/%ds)\n", + pItem->pTaskUuid, pItem->pCurlItem->dlSize / 1000, dlTime); + + InetCancelDownload(pItem->pTaskUuid); + break; + } + + // 10秒内没有下载任何数据超时 + if(pItem->pCurlItem->lastTm > 0) + { + if(curTm > pItem->pCurlItem->lastTm + MAX_TIMEOUT_VALUE) + { + LOG_EX(LOG_Error, "Download Timeout: %s\n", pItem->pTaskUuid); + InetCancelDownload(pItem->pTaskUuid); + break; + } + } + + // 下载最长时间设置为1800秒(30分钟) + if(dlTime > 1800) + { + LOG_EX(LOG_Error, "Download More than 1800 seconds: %s (%uK/%ds)\n", + pItem->pTaskUuid, pItem->pCurlItem->dlSize/1000, dlTime); + InetCancelDownload(pItem->pTaskUuid); + break; + } + } + uv_rwlock_rdunlock(&g_uvHashRwLock); + + uv_rwlock_wrlock(&g_uvHashRwLock); + HASH_ITER(hh, g_ReqHandleTbl, pItem, pTemp) + { + if(pItem->isCancel != FALSE) + { + __cleanUpReqIdFromTable(pItem); + } + } + uv_rwlock_wrunlock(&g_uvHashRwLock); +} + +static void __onTimeoutCb(uv_timer_t *pufTimer) +{ + int iRun; + + curl_multi_socket_action(g_pCurl, CURL_SOCKET_TIMEOUT, 0, &iRun); + + __checkMultiInfoTimeout(); +} + +static int __curlTimerCb(CURLM *multi, /* multi handle */ + long timeout_ms, /* see above */ + void *userp) /* private callback pointer */ +{ + if(timeout_ms <= 0) + { + timeout_ms = 1; + } + + uv_timer_start(&g_uvCurlTm, __onTimeoutCb, timeout_ms, 0); + + return 0; +} + +static void __curlPollCb(uv_poll_t *pPoll, int status, int events) +{ + int iRun; + int flags; + PCURL_CONTEXT_DATA pContext = NULL; + + uv_timer_stop(&g_uvCurlTm); + + if(events & UV_READABLE) + { + flags = CURL_CSELECT_IN; + } + else if(events & UV_WRITABLE) + { + flags = CURL_CSELECT_OUT; + } + + pContext = (PCURL_CONTEXT_DATA)pPoll; + curl_multi_socket_action(g_pCurl, pContext->sock, flags, &iRun); + __checkMultiInfo(); +} + +static int __curlSockCb(CURL *easy, /* easy handle */ + curl_socket_t s, /* socket */ + int what, /* describes the socket */ + void *userp, /* private callback pointer */ + void *socketp) /* private socket pointer */ +{ + PCURL_CONTEXT_DATA pContext = NULL; + + if(what == CURL_POLL_IN || what == CURL_POLL_OUT) + { + if(socketp) + { + pContext = (PCURL_CONTEXT_DATA)socketp; + } + else + { + pContext = __createCurlContext(s); + } + + curl_multi_assign(g_pCurl, s, (void *)pContext); + } + + switch(what) + { + case CURL_POLL_IN: + uv_poll_start(&pContext->uvPool, UV_READABLE, __curlPollCb); + break; + + case CURL_POLL_OUT: + uv_poll_start(&pContext->uvPool, UV_WRITABLE, __curlPollCb); + break; + + case CURL_POLL_REMOVE: + if(socketp) + { + uv_poll_stop(&((PCURL_CONTEXT_DATA)socketp)->uvPool); + __destoryCurlContext((PCURL_CONTEXT_DATA)socketp); + curl_multi_assign(g_pCurl, s, NULL); + } + break; + + default: + return (0); + } + + return (0); +} + +static size_t __writeDataCb(void *pData, size_t size, size_t nmemb, void *pParams) +{ + PHTTP_REQ_PARAMS pReq = (PHTTP_REQ_PARAMS)pParams; + int iMemSize = size * nmemb; + //print_hex_dump_bytes("OTA", DUMP_PREFIX_ADDRESS, pData, size * nmemb); + + pReq->lastTm = LIBUV_CURRENT_TIME_S(); + + if(pReq->type == INET_HTTP_DOWNLOAD_FILE) + { + int wr = 0; + + pReq->uvFsBuf = uv_buf_init(pData, iMemSize); + + wr = uv_fs_write(g_pMainLoop, &pReq->uvFsWrite, pReq->uvFsOpen.result, &pReq->uvFsBuf, 1, -1, NULL); + + if(wr > 0) + { + pReq->dlSize += wr; + } + } + else if(pReq->type == INET_HTTP_WEBSERVICE_POST) + { + int newSize = 0; + + if(pReq->uvFsBuf.base == NULL && pReq->uvFsBuf.len == 0) + { + newSize = iMemSize + 1; + //fprintf(stdout, "size = %d, newsize = %d, dlsize = %d\n", iMemSize, newSize, pReq->dlSize); + pReq->uvFsBuf.base = malloc(newSize); + memcpy(pReq->uvFsBuf.base, pData, iMemSize); + } + else + { + newSize = pReq->dlSize + iMemSize + 1; + //fprintf(stdout, "::size = %d, newsize = %d, dlsize = %d\n", iMemSize, newSize, pReq->dlSize); + pReq->uvFsBuf.base = realloc(pReq->uvFsBuf.base, newSize); + memcpy(pReq->uvFsBuf.base + pReq->dlSize, pData, iMemSize); + } + + pReq->uvFsBuf.base[pReq->dlSize] = 0; + pReq->dlSize += iMemSize; + } + + return (size * nmemb); +} + +static int __progressCb(void* pData, + double total, + double now, + double ultotal, + double ulnow) +{ + PHTTP_REQ_PARAMS pParams = (PHTTP_REQ_PARAMS)pData; + + if(pParams->onPrgCb) + { + if(pParams->type == INET_HTTP_DOWNLOAD_FILE) + { + pParams->onPrgCb(pParams->pReqUrl, pParams->pTaskUuid, (unsigned char)(now * 100.0 / total), pParams->pData); + } + } + + return (0); +} + +static size_t __getRemoteSizeCb(void *pData, size_t size, size_t nmemb, void *pParams) +{ + return (size * nmemb); +} + +static int __iNetGetRemoteSize(const char* pURL, unsigned int reqId) +{ + double size = 0.0; + CURL *pCurl = curl_easy_init(); + CURLcode res; + + curl_easy_setopt(pCurl, CURLOPT_URL, pURL); + curl_easy_setopt(pCurl, CURLOPT_NOBODY, 1L); + curl_easy_setopt(pCurl, CURLOPT_HEADERFUNCTION, __getRemoteSizeCb); + curl_easy_setopt(pCurl, CURLOPT_FOLLOWLOCATION, 1L); + + curl_easy_perform(pCurl); + + res = curl_easy_getinfo(pCurl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &size); + + if(res != CURLE_OK) + { + return (-1); + } + + curl_easy_cleanup(pCurl); + + return (int)(size); +} + +static const char* __restartDlFileAsync(PHTTP_REQ_PARAMS pParams) +{ + CURL *pCurl = curl_easy_init(); + + pParams->type = INET_HTTP_DOWNLOAD_FILE; + pParams->dlSize = 0; + pParams->pCurl = pCurl; + pParams->lastTm = 0; + + uv_fs_open(g_pMainLoop, + &pParams->uvFsOpen, + pParams->sDlPath, + O_RDWR | O_CREAT | O_TRUNC, + S_IRUSR | S_IWUSR, + NULL); + + curl_easy_setopt(pCurl, CURLOPT_WRITEFUNCTION, __writeDataCb); + curl_easy_setopt(pCurl, CURLOPT_WRITEDATA, pParams); + curl_easy_setopt(pCurl, CURLOPT_PRIVATE, pParams); + curl_easy_setopt(pCurl, CURLOPT_URL, pParams->pReqUrl); + + curl_easy_setopt(pCurl, CURLOPT_NOPROGRESS, 0L); + curl_easy_setopt(pCurl, CURLOPT_PROGRESSFUNCTION, __progressCb); + curl_easy_setopt(pCurl, CURLOPT_PROGRESSDATA, pParams); + +#ifdef SKIP_PEER_VERIFICATION + /* + * If you want to connect to a site who isn't using a certificate that is + * signed by one of the certs in the CA bundle you have, you can skip the + * verification of the server's certificate. This makes the connection + * A LOT LESS SECURE. + * + * If you have a CA cert for the server stored someplace else than in the + * default bundle, then the CURLOPT_CAPATH option might come handy for + * you. + */ + curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYPEER, 0L); +#else + curl_easy_setopt(pCurl, CURLOPT_CAINFO, SSL_CA_FILE); + curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYPEER, 1L); +#endif + +#ifdef SKIP_HOSTNAME_VERIFICATION + /* + * If the site you're connecting to uses a different host name that what + * they have mentioned in their server certificate's commonName (or + * subjectAltName) fields, libcurl will refuse to connect. You can skip + * this check, but this will make the connection less secure. + */ + curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYHOST, 0L); +#endif + + //LOG_EX(LOG_Debug, "Total Size = %d\n", __iNetGetRemoteSize(pURL, 0)); + + curl_multi_add_handle(g_pCurl, pCurl); + + __addReqIdToTable(pParams->pTaskUuid, pCurl); + + return (pParams->pTaskUuid); +} + +const char* InetHttpDlFileAsync(const char *pURL, + const char *pPath, + OnHttpResponse onRespCb, + OnProgressNotify onProgressCb, + void* pData) +{ + uuid_t msgId; + char strMsgId[64]; + PHTTP_REQ_PARAMS pParams = NULL; + CURL *pCurl = NULL; + unsigned long long uMemFreeSize = GetPartitionFreeSize("/tmp/"); + + if(pURL == NULL || strlen(pURL) == 0 || onRespCb == NULL) + { + free(pParams); + return (NULL); + } + + LOG_EX(LOG_Debug, "Begin Download: %s\n", pURL); + + pParams = (PHTTP_REQ_PARAMS)malloc(sizeof(HTTP_REQ_PARAMS)); + + memset(pParams, 0, sizeof(HTTP_REQ_PARAMS)); + + pCurl = curl_easy_init(); + + pParams->onRspCb = onRespCb; + pParams->pReqUrl = (char *)malloc(strlen(pURL) + 1); + pParams->type = INET_HTTP_DOWNLOAD_FILE; + pParams->dlSize = 0; + pParams->onPrgCb = onProgressCb; + pParams->pData = pData; + pParams->pCurl = pCurl; + pParams->lastTm = 0; + pParams->createTm = (unsigned int)LIBUV_CURRENT_TIME_S(); + + memset(pParams->pReqUrl, 0, strlen(pURL) + 1); + strcpy(pParams->pReqUrl, pURL); + + uuid_generate_random(msgId); + memset(strMsgId, 0, 64); + uuid_unparse_lower(msgId, strMsgId); + pParams->pTaskUuid = strdup(strMsgId); + + if(pPath == NULL) + { + sprintf(pParams->sPath, "./%s", basename_v2(pURL)); + } + else + { + strcpy(pParams->sPath, pPath); + } + + // Memory Free More Than 100M, Download Temp File To Memory + if(uMemFreeSize >= 100 * 1024 * 1024 && + strncmp(pParams->sPath, "/tmp/", 5) != 0) + { + int ret = system("mkdir /tmp/dl -p"); + sprintf(pParams->sDlPath, "/tmp/dl/%s_%s.dl", basename_v2(pParams->sPath), pParams->pTaskUuid); + } + else + { + strcpy(pParams->sDlPath, pParams->sPath); + } + + pParams->uvFsDataSync.data = pParams; + pParams->uvFsClose.data = pParams; + + uv_fs_open(g_pMainLoop, + &pParams->uvFsOpen, + pParams->sDlPath, + O_RDWR | O_CREAT | O_TRUNC, + S_IRUSR | S_IWUSR, + NULL); + + curl_easy_setopt(pCurl, CURLOPT_WRITEFUNCTION, __writeDataCb); + curl_easy_setopt(pCurl, CURLOPT_WRITEDATA, pParams); + curl_easy_setopt(pCurl, CURLOPT_PRIVATE, pParams); + curl_easy_setopt(pCurl, CURLOPT_URL, pURL); + + curl_easy_setopt(pCurl, CURLOPT_NOPROGRESS, 0L); + curl_easy_setopt(pCurl, CURLOPT_PROGRESSFUNCTION, __progressCb); + curl_easy_setopt(pCurl, CURLOPT_PROGRESSDATA, pParams); + + //curl_easy_setopt(pCurl, CURLOPT_TIMEOUT, 1800L); // Max download times (30 minutes)1800s + //curl_easy_setopt(pCurl, CURLOPT_LOW_SPEED_LIMIT, 10000L); // 10K bytes + //curl_easy_setopt(pCurl, CURLOPT_LOW_SPEED_TIME, 30L); // 30 seconds + + curl_easy_setopt(pCurl, CURLOPT_CONNECTTIMEOUT, 10L); + //curl_easy_setopt(pCurl, CURLOPT_CONNECTTIMEOUT_MS, 10L); + + + //curl_easy_setopt(pCurl, CURLOPT_VERBOSE, 1L); + +#ifdef SKIP_PEER_VERIFICATION + /* + * If you want to connect to a site who isn't using a certificate that is + * signed by one of the certs in the CA bundle you have, you can skip the + * verification of the server's certificate. This makes the connection + * A LOT LESS SECURE. + * + * If you have a CA cert for the server stored someplace else than in the + * default bundle, then the CURLOPT_CAPATH option might come handy for + * you. + */ + curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYPEER, 0L); +#else + curl_easy_setopt(pCurl, CURLOPT_CAINFO, SSL_CA_FILE); + curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYPEER, 1L); +#endif + +#ifdef SKIP_HOSTNAME_VERIFICATION + /* + * If the site you're connecting to uses a different host name that what + * they have mentioned in their server certificate's commonName (or + * subjectAltName) fields, libcurl will refuse to connect. You can skip + * this check, but this will make the connection less secure. + */ + curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYHOST, 0L); +#endif + + //LOG_EX(LOG_Debug, "Download: %s --> %s\n", pParams->pReqUrl, pParams->sDlPath); + + curl_multi_add_handle(g_pCurl, pCurl); + + __addReqIdToTable(pParams->pTaskUuid, pParams); + + return (pParams->pTaskUuid); +} + +int InetCancelDownload(const char *pTaskUuid) +{ + if(pTaskUuid && strlen(pTaskUuid) > 0) + { + PCURL_HANDLE_TBL pItem = NULL; + + uv_rwlock_rdlock(&g_uvHashRwLock); + HASH_FIND_STR(g_ReqHandleTbl, pTaskUuid, pItem); + uv_rwlock_rdunlock(&g_uvHashRwLock); + + if(pItem != NULL && pItem->isCancel != TRUE) + { + __removeReqIdFromTable(pTaskUuid); + curl_easy_pause(pItem->pCurlItem->pCurl, CURLPAUSE_ALL); + curl_easy_cleanup(pItem->pCurlItem->pCurl); + if(pItem->pCurlItem->onRspCb) + { + pItem->pCurlItem->onRspCb(NULL, + pItem->pCurlItem->dlSize, + pItem->pCurlItem->pReqUrl, + pItem->pCurlItem->sPath, + pItem->pCurlItem->pTaskUuid, + -CURLE_OPERATION_TIMEDOUT, + pItem->pCurlItem->pData); + } + } + } + + return (0); +} + +static size_t __uploadCb(char *d, size_t n, size_t l, void *p) +{ + return n*l; +} + +#ifdef LIBCURL_DEBUG +struct data { + char trace_ascii; /* 1 or 0 */ +}; + +static +void dump(const char *text, + FILE *stream, unsigned char *ptr, size_t size, + char nohex) +{ + size_t i; + size_t c; + + unsigned int width = 0x10; + + if(nohex) + /* without the hex output, we can fit more on screen */ + width = 0x40; + + fprintf(stream, "%s, %10.10ld bytes (0x%8.8lx)\n", + text, (long)size, (long)size); + + for(i = 0; i= 0x20) && (ptr[i + c]<0x80)?ptr[i + c]:'.'); + /* check again for 0D0A, to avoid an extra \n if it's at width */ + if(nohex && (i + c + 2 < size) && ptr[i + c + 1] == 0x0D && + ptr[i + c + 2] == 0x0A) { + i += (c + 3 - width); + break; + } + } + fputc('\n', stream); /* newline */ + } + fflush(stream); +} + +static +int my_trace(CURL *handle, curl_infotype type, + char *data, size_t size, + void *userp) +{ + struct data *config = (struct data *)userp; + const char *text; + (void)handle; /* prevent compiler warning */ + + switch(type) { + case CURLINFO_TEXT: + fprintf(stderr, "== Info: %s", data); + /* FALLTHROUGH */ + default: /* in case a new one is introduced to shock us */ + return 0; + + case CURLINFO_HEADER_OUT: + text = "=> Send header"; + break; + case CURLINFO_DATA_OUT: + text = "=> Send data"; + break; + case CURLINFO_SSL_DATA_OUT: + text = "=> Send SSL data"; + break; + case CURLINFO_HEADER_IN: + text = "<= Recv header"; + break; + case CURLINFO_DATA_IN: + text = "<= Recv data"; + break; + case CURLINFO_SSL_DATA_IN: + text = "<= Recv SSL data"; + break; + } + + dump(text, stderr, (unsigned char *)data, size, config->trace_ascii); + return 0; +} +#endif + +int InetHttpUploadFileSync(const char *pURL, const char* pPath, void* pAttachInfo) +{ + CURL *pCurl = NULL; + int rc = 0; + CURLcode ret; + struct curl_httppost *pPost = NULL, *pLastPtr = NULL; + +#ifdef LIBCURL_DEBUG + struct data config; + config.trace_ascii = 1; /* enable ascii tracing */ +#endif + + if(pURL == NULL || strlen(pURL) == 0) + { + LOG_EX(LOG_Error, "Url: %s(%p)\n", SAFE_STRING_VALUE(pURL), pURL); + return -ERR_INPUT_PARAMS; + } + + if(pPath == NULL || strlen(pPath) == 0) + { + LOG_EX(LOG_Error, "Url: %s(%p)\n", SAFE_STRING_VALUE(pPath), pPath); + return -ERR_INPUT_PARAMS; + } + + curl_formadd(&pPost, &pLastPtr, + CURLFORM_COPYNAME, "file", + CURLFORM_FILE, pPath, + CURLFORM_END); + + if(pAttachInfo) + { + PHTTP_POST_ATTACH pDevInfoArray = (PHTTP_POST_ATTACH)pAttachInfo; + PHTTP_POST_ATTACH pItem = NULL, pTmp = NULL; + + LL_FOREACH_SAFE(pDevInfoArray, pItem, pTmp) + { + curl_formadd(&pPost, &pLastPtr, + CURLFORM_COPYNAME, pItem->keyName, + CURLFORM_COPYCONTENTS, pItem->keyValue, + CURLFORM_END); + } + } + + pCurl = curl_easy_init(); + + if(pCurl == NULL) + { + LOG_EX(LOG_Error, "curl_easy_init() Error\n"); + return -ERR_MALLOC_MEMORY; + } + + curl_easy_setopt(pCurl, CURLOPT_ACCEPT_ENCODING, "gzip, deflate"); + curl_easy_setopt(pCurl, CURLOPT_POST, 1L); + curl_easy_setopt(pCurl, CURLOPT_URL, pURL); + curl_easy_setopt(pCurl, CURLOPT_HTTPPOST, pPost); + curl_easy_setopt(pCurl, CURLOPT_WRITEFUNCTION, __uploadCb); + curl_easy_setopt(pCurl, CURLOPT_CONNECTTIMEOUT, 10L); +#ifdef LIBCURL_DEBUG + curl_easy_setopt(pCurl, CURLOPT_DEBUGFUNCTION, my_trace); + curl_easy_setopt(pCurl, CURLOPT_DEBUGDATA, &config); +#endif + +#ifdef SKIP_PEER_VERIFICATION + /* + * If you want to connect to a site who isn't using a certificate that is + * signed by one of the certs in the CA bundle you have, you can skip the + * verification of the server's certificate. This makes the connection + * A LOT LESS SECURE. + * + * If you have a CA cert for the server stored someplace else than in the + * default bundle, then the CURLOPT_CAPATH option might come handy for + * you. + */ + curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYPEER, 0L); +#else + curl_easy_setopt(pCurl, CURLOPT_CAINFO, SSL_CA_FILE); + curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYPEER, 1L); +#endif + +#ifdef SKIP_HOSTNAME_VERIFICATION + /* + * If the site you're connecting to uses a different host name that what + * they have mentioned in their server certificate's commonName (or + * subjectAltName) fields, libcurl will refuse to connect. You can skip + * this check, but this will make the connection less secure. + */ + curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYHOST, 0L); +#endif + + +#ifdef LIBCURL_DEBUG + curl_easy_setopt(pCurl, CURLOPT_VERBOSE, 1L); +#else + curl_easy_setopt(pCurl, CURLOPT_VERBOSE, 0L); +#endif + + ret = curl_easy_perform(pCurl); + + if(ret != CURLE_OK) + { + LOG_EX(LOG_Error, "Upload %s File %s Error %s\n", pURL, pPath, curl_easy_strerror(ret)); + rc = -ERR_NETWORK_SEND; + } + + curl_easy_cleanup(pCurl); + curl_formfree(pPost); + + return rc; +} + +const char* InetHttpWebServicePostAsync(const char *pURL, const char* pPost, OnHttpResponse onRespCb, void* pData) +{ + uuid_t msgId; + char strMsgId[64]; + PHTTP_REQ_PARAMS pParams = (PHTTP_REQ_PARAMS)malloc(sizeof(HTTP_REQ_PARAMS)); + CURL *pCurl = NULL; + + if(pURL == NULL || strlen(pURL) == 0 || onRespCb == NULL) + { + free(pParams); + return (NULL); + } + + memset(pParams, 0, sizeof(HTTP_REQ_PARAMS)); + + pCurl = curl_easy_init(); + + pParams->onRspCb = onRespCb; + pParams->pReqUrl = (char *)malloc(strlen(pURL) + 1); + pParams->type = INET_HTTP_WEBSERVICE_POST; + pParams->dlSize = 0; + pParams->pData = pData; + pParams->pCurl = pCurl; + pParams->lastTm = 0; + + memset(pParams->pReqUrl, 0, strlen(pURL) + 1); + strcpy(pParams->pReqUrl, pURL); + + uuid_generate_random(msgId); + memset(strMsgId, 0, 64); + uuid_unparse_lower(msgId, strMsgId); + pParams->pTaskUuid = strdup(strMsgId); + + curl_easy_setopt(pCurl, CURLOPT_WRITEFUNCTION, __writeDataCb); + curl_easy_setopt(pCurl, CURLOPT_WRITEDATA, pParams); + curl_easy_setopt(pCurl, CURLOPT_PRIVATE, pParams); + curl_easy_setopt(pCurl, CURLOPT_URL, pURL); + curl_easy_setopt(pCurl, CURLOPT_NOPROGRESS, 1L); + curl_easy_setopt(pCurl, CURLOPT_USERAGENT, "libcurl-agent/1.0"); + + if(pPost != NULL && strlen(pPost) > 0) + { + curl_easy_setopt(pCurl, CURLOPT_POSTFIELDS, pPost); + curl_easy_setopt(pCurl, CURLOPT_POSTFIELDSIZE, (long)strlen(pPost)); + } + +#ifdef SKIP_PEER_VERIFICATION + /* + * If you want to connect to a site who isn't using a certificate that is + * signed by one of the certs in the CA bundle you have, you can skip the + * verification of the server's certificate. This makes the connection + * A LOT LESS SECURE. + * + * If you have a CA cert for the server stored someplace else than in the + * default bundle, then the CURLOPT_CAPATH option might come handy for + * you. + */ + curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYPEER, 0L); +#else + curl_easy_setopt(pCurl, CURLOPT_CAINFO, SSL_CA_FILE); + curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYPEER, 1L); +#endif + +#ifdef SKIP_HOSTNAME_VERIFICATION + /* + * If the site you're connecting to uses a different host name that what + * they have mentioned in their server certificate's commonName (or + * subjectAltName) fields, libcurl will refuse to connect. You can skip + * this check, but this will make the connection less secure. + */ + curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYHOST, 0L); +#endif + + curl_multi_add_handle(g_pCurl, pCurl); + + __addReqIdToTable(pParams->pTaskUuid, pParams); + + return (pParams->pTaskUuid); +} + +#if 0 +static void __curlTaskRuntimeCb(void *pParams) +{ + PCURL_HANDLE_TBL pItem = NULL, pTmpItem = NULL; + + while(TRUE) + { + uv_rwlock_rdlock(&g_uvHashRwLock); + + HASH_ITER(hh, g_ReqHandleTbl, pItem, pTmpItem) + { + if(pItem->pCurlItem->type == INET_HTTP_DOWNLOAD_FILE + && pItem->pCurlItem->lastTm > 0) + { + //unsigned int tmNow = LIBUV_CURRENT_TIME_S(); + + if(pItem->pCurlItem->lastTm > 0) + { + //curl_multi_cleanup(pItem->pCurlItem->pCurl); + curl_multi_remove_handle(g_pCurl, pItem->pCurlItem->pCurl); + + if(pItem->uRetryTimes >= 3) + { + if(pItem->pCurlItem->onRspCb) + { + if(strcmp(pItem->pCurlItem->sPath, pItem->pCurlItem->sDlPath) != 0) + { + unlink(pItem->pCurlItem->sDlPath); + } + + pItem->pCurlItem->onRspCb(NULL, + pItem->pCurlItem->dlSize, + pItem->pCurlItem->pReqUrl, + pItem->pCurlItem->sPath, + pItem->pCurlItem->pTaskUuid, + TRUE, + pItem->pCurlItem->pData); + } + + if(pItem->pCurlItem->pReqUrl) + { + free(pItem->pCurlItem->pReqUrl); + } + } + else + { + __restartDlFileAsync(pItem->pCurlItem); + } + } + } + } + uv_rwlock_rdunlock(&g_uvHashRwLock); + usleep(100000); + } +} +#endif + +static int __getUsernameFromMail(const char *pMailAddr, char **pUsername) +{ + char *pTail; + + if(pMailAddr == NULL || pUsername == NULL || strlen(pMailAddr) == 0) + { + LOG_EX(LOG_Error, "Input Params Error: pMailAddr = [%s], pUsername = %p\n", + pMailAddr ? pMailAddr : "NULL", pUsername); + return (-ERR_INPUT_PARAMS); + } + + *pUsername = (char *)malloc(strlen(pMailAddr) + 1); + + if(*pUsername == NULL) + { + LOG_EX(LOG_Error, "Error Malloc Memory\n"); + *pUsername = ""; + return (-ERR_MALLOC_MEMORY); + } + + memset(*pUsername, 0, strlen(pMailAddr) + 1); + + pTail = strchr(pMailAddr, '@'); + + if(pTail == NULL) + { + strcpy(*pUsername, pMailAddr); + } + else + { + memcpy(*pUsername, pMailAddr, pTail - pMailAddr); + } + + return (0); +} + +int InetSmtpSendEmail(const char* pFrom, + const char* pTo[], + const char* pCc[], + const char* pTitle, + const char* pMessage, + const char* pAttach[], + PSMTP_MAIL_CONFIG pConfig) +{ + const char *pErrMsg = NULL; + quickmail pMail; + + if(pConfig == NULL) + { + LOG_EX(LOG_Error, "Input Param pConfig = NULL\n"); + return (-ERR_INPUT_PARAMS); + } + + if(pConfig->pPassword == NULL || strlen(pConfig->pPassword) == 0) + { + LOG_EX(LOG_Error, "Input Param Error: pConfig->pPassword = [%s]\n", pConfig->pPassword ? pConfig->pPassword : "NULL"); + return (-ERR_INPUT_PARAMS); + } + + if(pConfig->pUserName == NULL || strlen(pConfig->pUserName) == 0) + { + LOG_EX(LOG_Error, "Input Param Error: pConfig->pUserName = [%s]\n", pConfig->pUserName ? pConfig->pUserName : "NULL"); + return (-ERR_INPUT_PARAMS); + } + + if(pConfig->pSmtpServer == NULL || strlen(pConfig->pSmtpServer) == 0) + { + LOG_EX(LOG_Error, "Input Param Error: pConfig->pUserName = [%s]\n", pConfig->pSmtpServer ? pConfig->pSmtpServer : "NULL"); + return (-ERR_INPUT_PARAMS); + } + + if(pFrom == NULL) + { + LOG_EX(LOG_Error, "Input Param pFrom = NULL\n"); + return (-ERR_INPUT_PARAMS); + } + + if(pTo == NULL && pCc == NULL) + { + LOG_EX(LOG_Error, "Input Param pTo = %p, pCc = %p\n", pTo, pCc); + return (-ERR_INPUT_PARAMS); + } + + if(pTitle == NULL) + { + pTitle = ""; + } + + if(pMessage == NULL) + { + pMessage = ""; + } + + quickmail_initialize(); + + pMail = quickmail_create(pFrom, pTitle); + + if(pMail == NULL) + { + LOG_EX(LOG_Error, "Create Quickmail Object Error\n"); + return (-ERR_MALLOC_MEMORY); + } + + for(const char **pValue = pTo; pTo && *pValue; pValue++) + { + quickmail_add_to(pMail, *pValue); + } + + for(const char **pValue = pCc; pCc && *pValue; pValue++) + { + quickmail_add_cc(pMail, *pValue); + } + + quickmail_add_header(pMail, "Importance: Low"); + quickmail_add_header(pMail, "X-Priority: 5"); + quickmail_add_header(pMail, "X-MSMail-Priority: Low"); + quickmail_add_body_memory(pMail, "text/html", (char*)pMessage, strlen(pMessage), 0); + + for(const char **pValue = pAttach; pAttach && *pValue; pValue++) + { + quickmail_add_attachment_file(pMail, *pValue, NULL); + } + + //quickmail_set_debug_log(pMail, stderr); + + pErrMsg = quickmail_send(pMail, pConfig->pSmtpServer, pConfig->smtpPort, pConfig->pUserName, pConfig->pPassword); + + if(pErrMsg != NULL) + { + LOG_EX(LOG_Error, "Send Mail Error: %s\n", pErrMsg); + return (-ERR_SEND_MAIL); + } + + return (0); +} + +int InetInit(void) +{ + int ret = 0; + //uv_thread_t uvThread; + + ret = curl_global_init(CURL_GLOBAL_ALL); + + if(ret != 0) + { + LOG_EX(LOG_Error, "curl init error: %d\n", ret); + return ret; + } + + g_pMainLoop = DBusLibuvGetRuntime()->pLoop; + + uv_timer_init(g_pMainLoop, &g_uvCurlTm); + uv_timer_init(g_pMainLoop, &g_uvDlTm); + + g_pCurl = curl_multi_init(); + + curl_multi_setopt(g_pCurl, CURLMOPT_SOCKETFUNCTION, __curlSockCb); + curl_multi_setopt(g_pCurl, CURLMOPT_TIMERFUNCTION, __curlTimerCb); + + uv_rwlock_init(&g_uvHashRwLock); + + uv_timer_start(&g_uvDlTm, __onDlTmoutCb, 1000, 1000); + + //uv_thread_create(&uvThread, __curlTaskRuntimeCb, NULL); + return (0); +} + +void InetUnInit(void) +{ + curl_multi_cleanup(g_pCurl); + curl_global_cleanup(); +} + diff --git a/Framework/Skins/skin_res_vtbl.c b/Framework/Skins/skin_res_vtbl.c new file mode 100644 index 0000000..ae30711 --- /dev/null +++ b/Framework/Skins/skin_res_vtbl.c @@ -0,0 +1,320 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "log.h" +#include "libuv_dbus.h" +#include "skins.h" +#include "log.h" + +typedef struct +{ + sqlite3_vtab vTable; + sqlite3 *pSqlDb; + char *pTblName; +} SKINRES_VTBL, *PSKINRES_VTBL; + +typedef struct +{ + sqlite3_vtab_cursor base; + int count; + int eof; +} SKINRES_CURSOR, *PSKINRES_CURSOR; + +static int __skin_res_destructor(sqlite3_vtab *pVtab) +{ + PSKINRES_VTBL p = (PSKINRES_VTBL)pVtab; + + if(p->pTblName != NULL) + { + free(p->pTblName); + p->pTblName = NULL; + } + sqlite3_free(p); + + return 0; +} + +static int __skin_res_create(sqlite3 *pDb, + void *pAux, + int argc, const char * const *argv, + sqlite3_vtab **pp_vt, + char **pzErr) +{ + UT_string *pSqlCmd; + int rc = SQLITE_OK; + PSKINRES_VTBL pVTbl; + + /* Allocate the sqlite3_vtab/example_vtab structure itself */ + pVTbl = (PSKINRES_VTBL)sqlite3_malloc(sizeof(SKINRES_VTBL)); + + if(pVTbl == NULL) + { + return SQLITE_NOMEM; + } + + pVTbl->pSqlDb = pDb; + pVTbl->pTblName = strdup(argv[2]); + + utstring_new(pSqlCmd); + if(strcmp(argv[0], RES_MODE_NAME) == 0) + { + utstring_printf(pSqlCmd, CREATE_RES_TBL_SQL, ""); + } + else + { + utstring_printf(pSqlCmd, CREATE_SKIN_TBL_SQL, ""); + } + + /* Declare the vtable's structure */ + rc = sqlite3_declare_vtab(pDb, utstring_body(pSqlCmd)); + utstring_free(pSqlCmd); + + if(rc != SQLITE_OK) + { + __skin_res_destructor((sqlite3_vtab*)pVTbl); + + return SQLITE_ERROR; + } + + /* Success. Set *pp_vt and return */ + *pp_vt = &pVTbl->vTable; + + return SQLITE_OK; +} + +static int __skin_res_connect( sqlite3 *db, void *p_aux, + int argc, const char * const *argv, + sqlite3_vtab **pp_vt, char **pzErr ) +{ + return __skin_res_create(db, p_aux, argc, argv, pp_vt, pzErr); +} + +static int __skin_res_disconnect(sqlite3_vtab *pVtab) +{ + return __skin_res_destructor(pVtab); +} + +static int __skin_res_destroy(sqlite3_vtab *pVtab) +{ + int rc = SQLITE_OK; + //PSKINRES_VTBL p = (PSKINRES_VTBL)pVtab; + + if(rc == SQLITE_OK) + { + rc = __skin_res_destructor(pVtab); + } + + return rc; +} + +static int __skin_res_open(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor) +{ + PSKINRES_CURSOR pCur = (PSKINRES_CURSOR)sqlite3_malloc(sizeof(SKINRES_CURSOR)); + *ppCursor = (sqlite3_vtab_cursor*)pCur; + + return (pCur ? SQLITE_OK : SQLITE_NOMEM); +} + +static int __skin_res_close(sqlite3_vtab_cursor *cur) +{ + PSKINRES_CURSOR pCur = (PSKINRES_CURSOR)cur; + sqlite3_free(pCur); + + return SQLITE_OK; +} + +static int __skin_res_eof(sqlite3_vtab_cursor *cur) +{ + return ((PSKINRES_CURSOR)cur)->eof; +} + +static int __skin_res_next(sqlite3_vtab_cursor *pInCur) +{ + PSKINRES_CURSOR pCur = (PSKINRES_CURSOR)pInCur; + //PSKINRES_VTBL pvTable = (PSKINRES_VTBL)pInCur->pVtab; + + /* Increment the current row count. */ + pCur->count += 1; + + /* Arbitrary contstraint: when we get to 10 rows, then stop. */ + if(pCur->count >= SkinsDefaultSize()) + { + pCur->eof = 1; + } + + return SQLITE_OK; +} + +static int __skin_res_column(sqlite3_vtab_cursor *pInCur, sqlite3_context *ctx, int iCol) +{ + PSKINRES_CURSOR pCur = (PSKINRES_CURSOR)pInCur; + PSKIN_RES_INFO pItem = SkinsItemById(pCur->count); + //PSKINRES_VTBL pvTable = (PSKINRES_VTBL)pInCur->pVtab; + + /* Just return the ordinal of the column requested. */ + switch(iCol) + { + case 0: + sqlite3_result_int(ctx, pCur->count); + break; + + case 1: + sqlite3_result_text(ctx, pItem->pResVer, strlen(pItem->pResVer), SQLITE_STATIC); + break; + + case 2: + sqlite3_result_text(ctx, pItem->pLocalPath, strlen(pItem->pLocalPath), SQLITE_STATIC); + break; + + case 3: + sqlite3_result_text(ctx, pItem->pLocalPath, strlen(pItem->pLocalPath), SQLITE_STATIC); + break; + + case 4: + sqlite3_result_text(ctx, pItem->pMD5Chksum, strlen(pItem->pMD5Chksum), SQLITE_STATIC); + break; + } + + return SQLITE_OK; +} + +static int __skin_cfg_column(sqlite3_vtab_cursor *pInCur, sqlite3_context *ctx, int iCol) +{ + PSKINRES_CURSOR pCur = (PSKINRES_CURSOR)pInCur; + PSKIN_RES_INFO pItem = SkinsItemById(pCur->count); + //PSKINRES_VTBL pvTable = (PSKINRES_VTBL)pInCur->pVtab; + + /* Just return the ordinal of the column requested. */ + switch(iCol) + { + case 0: + sqlite3_result_int(ctx, pCur->count); + break; + + case 1: + sqlite3_result_text(ctx, pItem->pKeyName, strlen(pItem->pKeyName), SQLITE_STATIC); + break; + + case 2: + sqlite3_result_int(ctx, pItem->resType); + break; + + case 3: + sqlite3_result_int(ctx, 0); + break; + + case 4: + sqlite3_result_int(ctx, pCur->count); + break; + + case 5: + sqlite3_result_text(ctx, "", 0, SQLITE_STATIC); + break; + } + + return SQLITE_OK; +} + +static int __skin_res_rowid(sqlite3_vtab_cursor *pInCur, sqlite_int64 *p_rowid) +{ + PSKINRES_CURSOR pCur = (PSKINRES_CURSOR)pInCur; + + /* Just use the current row count as the rowid. */ + *p_rowid = pCur->count; + + return SQLITE_OK; +} + +static int __skin_res_filter( sqlite3_vtab_cursor *pVtc, + int idxNum, const char *idxStr, + int argc, sqlite3_value **argv ) +{ + //int rc; + //int i; + + /* Initialize the cursor structure. */ + PSKINRES_CURSOR pCur = (PSKINRES_CURSOR)pVtc; + + /* Zero rows returned thus far. */ + pCur->count = 0; + + /* Have not reached end of set. */ + pCur->eof = 0; + + /* Move cursor to first row. */ + return __skin_res_next(pVtc); +} + +/* Pretty involved. We don't implement in this example. */ +static int __skin_res_best_index(sqlite3_vtab *pVTbl, sqlite3_index_info *pIdxInfo) +{ + return SQLITE_OK; +} + +static sqlite3_module g_ResModule = +{ + 0, /* iVersion */ + __skin_res_create, /* xCreate - create a vtable */ + __skin_res_connect, /* xConnect - associate a vtable with a connection */ + __skin_res_best_index, /* xBestIndex - best index */ + __skin_res_disconnect, /* xDisconnect - disassociate a vtable with a connection */ + __skin_res_destroy, /* xDestroy - destroy a vtable */ + __skin_res_open, /* xOpen - open a cursor */ + __skin_res_close, /* xClose - close a cursor */ + __skin_res_filter, /* xFilter - configure scan constraints */ + __skin_res_next, /* xNext - advance a cursor */ + __skin_res_eof, /* xEof - inidicate end of result set*/ + __skin_res_column, /* xColumn - read data */ + __skin_res_rowid, /* xRowid - read data */ + NULL, /* xUpdate - write data */ + NULL, /* xBegin - begin transaction */ + NULL, /* xSync - sync transaction */ + NULL, /* xCommit - commit transaction */ + NULL, /* xRollback - rollback transaction */ + NULL, /* xFindFunction - function overloading */ +}; + +static sqlite3_module g_SkinModule = +{ + 0, /* iVersion */ + __skin_res_create, /* xCreate - create a vtable */ + __skin_res_connect, /* xConnect - associate a vtable with a connection */ + __skin_res_best_index, /* xBestIndex - best index */ + __skin_res_disconnect, /* xDisconnect - disassociate a vtable with a connection */ + __skin_res_destroy, /* xDestroy - destroy a vtable */ + __skin_res_open, /* xOpen - open a cursor */ + __skin_res_close, /* xClose - close a cursor */ + __skin_res_filter, /* xFilter - configure scan constraints */ + __skin_res_next, /* xNext - advance a cursor */ + __skin_res_eof, /* xEof - inidicate end of result set*/ + __skin_cfg_column, /* xColumn - read data */ + __skin_res_rowid, /* xRowid - read data */ + NULL, /* xUpdate - write data */ + NULL, /* xBegin - begin transaction */ + NULL, /* xSync - sync transaction */ + NULL, /* xCommit - commit transaction */ + NULL, /* xRollback - rollback transaction */ + NULL, /* xFindFunction - function overloading */ +}; + +int InitSkinRomDatabase(sqlite3 *pDataBase) +{ + if((sqlite3_create_module(pDataBase, SKIN_MODE_NAME, &g_SkinModule, NULL) == SQLITE_OK) + && (sqlite3_create_module(pDataBase, RES_MODE_NAME, &g_ResModule, NULL) == SQLITE_OK)) + { + return 0; + } + else + { + return -ERR_SQL_REG_MODULE; + } +} + + diff --git a/Framework/Skins/skins.c b/Framework/Skins/skins.c new file mode 100644 index 0000000..2fc624b --- /dev/null +++ b/Framework/Skins/skins.c @@ -0,0 +1,1442 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "log.h" +#include "crypto.h" +#include "json_struct.h" +#include "config_engine.h" +#include "skins_res.h" +#include "inet_api.h" + +#define MAX_DOWNLOAD_ITEMS (10) + +#define DEBUG_SQL_CMD (0) + +typedef enum +{ + STATUS_CREATE_NEW = 0, + STATUS_DOWNLOADING, + STATUS_DOWNLOADED, +} RES_DOWNLOAD_STATUS; + +typedef enum +{ + UPG_STATUS_ADDNEW = (1 << 0), + UPG_STATUS_DL_NEW = (1 << 1), + UPG_STATUS_DOWNLOADED = (1 << 2), +} UPGRADE_RES_STATUS; + +typedef struct +{ + char* pKeyName; + char* pResPath; + + UT_hash_handle hh; ///< UT Hash handle +} SKINS_CACHE_ITEM, *PSKINS_CACHE_ITEM; +static uv_rwlock_t g_SkinCacheRwLock; + +#ifdef PLATFORM_CPU +#define DOWNLOAD_RES_ROOT_PATH (DEF_SKINS_ROOT_PATH) +#else +#define DOWNLOAD_RES_ROOT_PATH ("/mnt/UDISK/resources/") +#endif + +//select * FROM upgrade_skin WHERE resVersion == 4 ORDER BY resType DESC, RANDOM() LIMIT 1 +//#define SKIN_GET_SQL_CMD ("") + +#define ATTACH_DB_SQL_CMD ("ATTACH \'%s\' AS \'%s\'") +#define UPGRADE_TBL_SQL_CMD ("CREATE TABLE IF NOT EXISTS %supgrade (" \ + "ID INTEGER PRIMARY KEY AUTOINCREMENT," \ + "keyName TEXT NOT NULL," \ + "resType INTEGER NOT NULL," \ + "priority INTEGER NOT NULL DEFAULT (1)," \ + "resVersion TEXT NOT NULL," \ + "localPath TEXT NOT NULL," \ + "serverURL TEXT NOT NULL," \ + "md5Chksum TEXT NOT NULL," \ + "resReadme TEXT NOT NULL DEFAULT (\'\')," \ + "resStatus INTEGER NOT NULL DEFAULT (1)," \ + "dlId TEXT NOT NULL DEFAULT (\'\')," \ + "dlStatus INTEGER NOT NULL DEFAULT (0)," \ + "dlRetrys INTEGER NOT NULL DEFAULT (0)," \ + "dlTime TimeStamp NOT NULL DEFAULT (datetime('now','localtime')));") + +#define CREATE_TMP_TBL_SQL "CREATE TABLE IF NOT EXISTS %stmp (" \ + "ID INTEGER PRIMARY KEY AUTOINCREMENT," \ + "localPath TEXT NOT NULL);" + +static int g_isDlFinished = FALSE; +static unsigned int g_curDlItems = 0; +static sqlite3* g_pMemDb = NULL; +static uv_rwlock_t g_uvSkinRwLock; +static uv_rwlock_t g_uvDlRwLock; +static const unsigned int g_tolDefaultSkins = (sizeof(g_SkinDefaultResTable) / sizeof(g_SkinDefaultResTable[0])); +static PSKINS_CACHE_ITEM g_pSkinCackeTbl = NULL; + +char* TblGetSkinsResource(char *pKeyName, int *pResType, int *pVersion, char **pComeFrom); +static int __getUpgradeInfo(const char *pUpdFilePath); +static int __reTryDlSkinResCb(void *pData, int argc, char **argv, char **azColName); +extern int InitSkinRomDatabase(sqlite3 *pDataBase); +static int g_isVerifyRes = FALSE; +static int g_isUpgradeRunning = FALSE; + +static int __dumpSkinsInfo(PSKIN_RES_INFO pItem, int nItems) +{ + LOG_EX2(LOG_Debug, "Skins Items Information:\n"); + + LOG_EX2(LOG_Debug, "-------------------------------------------------------------" + "--------------------------------------------------------\n"); + + LOG_EX2(LOG_Debug, "| Key Name | Type | MD5 Checksum |" + " Contexts " + " |\n"); + + LOG_EX2(LOG_Debug, "-------------------------------------------------------------" + "--------------------------------------------------------\n"); + + for(int i = 0; i < nItems && pItem; i++, pItem++) + { + LOG_EX2(LOG_Debug, "| %-8s | %-8s | %-32s | %-80s |\n", + pItem->pKeyName, pItem->pResVer, pItem->pMD5Chksum, pItem->pLocalPath); + } + + LOG_EX2(LOG_Debug, "-------------------------------------------------------------" + "--------------------------------------------------------\n"); +} + +static int __verifyResMD5Chksum(const char* pPath, const char* pChksum, int resType) +{ + const char* pMD5Chksum; + + if(resType == TEXT_RES) + { + return (TRUE); + } + + if(pPath == NULL || pChksum == NULL) + { + return (FALSE); + } + + switch(resType) + { + case IMAGE_RES: + case VOICE_RES: + pMD5Chksum = EvpMD5HashFile(pPath); + + if(pMD5Chksum == NULL) + { + return (FALSE); + } + + if(strcmp(pMD5Chksum, pChksum) != 0) + { + LOG_EX(LOG_Error, "%s MD5 Verify Error: %s -> %s\n", pPath, pMD5Chksum, pChksum); + + free((char*)pMD5Chksum); + return (FALSE); + } + else + { + free((char*)pMD5Chksum); + } + + break; + + default: + return (FALSE); + } + + return (TRUE); +} + +static void __checkRes(sqlite3_context *pContext, int argc, sqlite3_value **argv) +{ + if(access(sqlite3_value_text(argv[0]), F_OK) != 0) + { + sqlite3_result_int(pContext, -1); + } + else if(__verifyResMD5Chksum(sqlite3_value_text(argv[0]), + sqlite3_value_text(argv[1]), + sqlite3_value_int(argv[2])) == FALSE) + { + sqlite3_result_int(pContext, -2); + } + else + { + sqlite3_result_int(pContext, 0); + } +} + +static int __cleanupSkinTbl(void) +{ + int rc; + char* pErrMsg = NULL; + UT_string* pSqlCmd = NULL; + + utstring_new(pSqlCmd); + utstring_printf(pSqlCmd, "DROP TABLE %s.%s", SKIN_USER_DB, SKIN_TBL_NAME); + + rc = sqlite3_exec(g_pMemDb, utstring_body(pSqlCmd), NULL, NULL, &pErrMsg); + + if(rc != SQLITE_OK) + { + LOG_EX(LOG_Error, "Delete Tbl %s Error: %s\n", utstring_body(pSqlCmd), pErrMsg); + sqlite3_free(pErrMsg); + utstring_free(pSqlCmd); + return -ERR_SQLITE3_CREATE_TABLE; + } + + utstring_renew(pSqlCmd); + utstring_printf(pSqlCmd, CREATE_SKIN_TBL_SQL, SKIN_USER_DB"."); + + rc = sqlite3_exec(g_pMemDb, utstring_body(pSqlCmd), NULL, NULL, &pErrMsg); + + if(rc != SQLITE_OK) + { + LOG_EX(LOG_Error, "Create Tbl %s Error: %s\n", utstring_body(pSqlCmd), pErrMsg); + sqlite3_free(pErrMsg); + utstring_free(pSqlCmd); + return -ERR_SQLITE3_CREATE_TABLE; + } + + utstring_free(pSqlCmd); + return 0; +} + +static int __cleanupResTbl(void) +{ + int rc; + char* pErrMsg = NULL; + UT_string* pSqlCmd = NULL; + + utstring_new(pSqlCmd); + utstring_printf(pSqlCmd, "DROP TABLE %s.%s", SKIN_USER_DB, RES_TBL_NAME); + + rc = sqlite3_exec(g_pMemDb, utstring_body(pSqlCmd), NULL, NULL, &pErrMsg); + + if(rc != SQLITE_OK) + { + LOG_EX(LOG_Error, "Delete Tbl %s Error: %s\n", utstring_body(pSqlCmd), pErrMsg); + sqlite3_free(pErrMsg); + utstring_free(pSqlCmd); + return -ERR_SQLITE3_CREATE_TABLE; + } + + utstring_renew(pSqlCmd); + utstring_printf(pSqlCmd, CREATE_RES_TBL_SQL, SKIN_USER_DB"."); + + rc = sqlite3_exec(g_pMemDb, utstring_body(pSqlCmd), NULL, NULL, &pErrMsg); + + if(rc != SQLITE_OK) + { + LOG_EX(LOG_Error, "Create Tbl %s Error: %s\n", utstring_body(pSqlCmd), pErrMsg); + sqlite3_free(pErrMsg); + utstring_free(pSqlCmd); + return -ERR_SQLITE3_CREATE_TABLE; + } + + utstring_free(pSqlCmd); + return 0; +} + +static int __cleanupUpgTbl(void) +{ + int rc; + char* pErrMsg = NULL; + UT_string* pSqlCmd = NULL; + + utstring_new(pSqlCmd); + utstring_printf(pSqlCmd, "DROP TABLE %s.upgrade", SKIN_USER_DB); + + rc = sqlite3_exec(g_pMemDb, utstring_body(pSqlCmd), NULL, NULL, &pErrMsg); + + if(rc != SQLITE_OK) + { + LOG_EX(LOG_Error, "Delete Tbl %s Error: %s\n", utstring_body(pSqlCmd), pErrMsg); + sqlite3_free(pErrMsg); + utstring_free(pSqlCmd); + return -ERR_SQLITE3_CREATE_TABLE; + } + + utstring_renew(pSqlCmd); + utstring_printf(pSqlCmd, UPGRADE_TBL_SQL_CMD, SKIN_USER_DB"."); + rc = sqlite3_exec(g_pMemDb, utstring_body(pSqlCmd), NULL, 0, &pErrMsg); + + if(rc != SQLITE_OK) + { + LOG_EX(LOG_Error, "Create Tbl %s Error: %s\n", utstring_body(pSqlCmd), pErrMsg); + sqlite3_free(pErrMsg); + utstring_free(pSqlCmd); + return -ERR_SQLITE3_CREATE_TABLE; + } + + utstring_free(pSqlCmd); + return 0; +} + +static int __cleanupTmpTbl(void) +{ + int rc; + char* pErrMsg = NULL; + UT_string* pSqlCmd = NULL; + + utstring_new(pSqlCmd); + utstring_printf(pSqlCmd, "DROP TABLE main.tmp"); + + rc = sqlite3_exec(g_pMemDb, utstring_body(pSqlCmd), NULL, NULL, &pErrMsg); + + if(rc != SQLITE_OK) + { + LOG_EX(LOG_Error, "Delete Tbl %s Error: %s\n", utstring_body(pSqlCmd), pErrMsg); + sqlite3_free(pErrMsg); + utstring_free(pSqlCmd); + return -ERR_SQLITE3_CREATE_TABLE; + } + + utstring_renew(pSqlCmd); + utstring_printf(pSqlCmd, CREATE_TMP_TBL_SQL, "main."); + rc = sqlite3_exec(g_pMemDb, utstring_body(pSqlCmd), NULL, 0, &pErrMsg); + + if(rc != SQLITE_OK) + { + LOG_EX(LOG_Error, "Create Tbl %s Error: %s\n", utstring_body(pSqlCmd), pErrMsg); + sqlite3_free(pErrMsg); + utstring_free(pSqlCmd); + return -ERR_SQLITE3_CREATE_TABLE; + } + + utstring_free(pSqlCmd); + return 0; +} + +static int __skinCreateCfgDB(void) +{ + int rc = 0; + char* pErrMsg = NULL; + UT_string *pSqlCmd = NULL; + + utstring_new(pSqlCmd); + utstring_printf(pSqlCmd, "CREATE VIRTUAL TABLE main.%s USING %s;" + "CREATE VIRTUAL TABLE main.%s USING %s;", + SKIN_TBL_NAME, SKIN_MODE_NAME, RES_TBL_NAME, RES_MODE_NAME); + + rc = sqlite3_exec(g_pMemDb, utstring_body(pSqlCmd), NULL, NULL, &pErrMsg); + + if(rc != SQLITE_OK) + { + LOG_EX(LOG_Error, "Create Tbl %s Error: %s\n", utstring_body(pSqlCmd), pErrMsg); + sqlite3_free(pErrMsg); + utstring_free(pSqlCmd); + return -ERR_SQLITE3_CREATE_TABLE; + } + + utstring_free(pSqlCmd); + + return (0); +} + +static int __skinCreateCfgFile(const char* pCfgFilePath) +{ + char* pErrMsg = NULL; + int rc = 0; + static sqlite3* pSqlFileDB = NULL; + UT_string *pSqlCmd = NULL; + + rc = sqlite3_open(":memory:", &g_pMemDb); + + if(rc != SQLITE_OK) + { + LOG_EX(LOG_Error, "sqlite3_open memory: %s\n", pCfgFilePath); + return -ERR_OPEN_SQLITE3_DB; + } + + utstring_new(pSqlCmd); + utstring_printf(pSqlCmd, CREATE_TMP_TBL_SQL, ""); + + rc = sqlite3_exec(g_pMemDb, utstring_body(pSqlCmd), NULL, 0, &pErrMsg); + + if(rc != SQLITE_OK) + { + LOG_EX(LOG_Error, "Create Tbl %s Error: %s\n", utstring_body(pSqlCmd), pErrMsg); + sqlite3_free(pErrMsg); + unlink(pCfgFilePath); + sqlite3_close(g_pMemDb); + utstring_free(pSqlCmd); + return -ERR_SQLITE3_CREATE_TABLE; + } + + rc = sqlite3_open_v2(pCfgFilePath, &pSqlFileDB, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL); + + if(rc != SQLITE_OK) + { + LOG_EX(LOG_Error, "sqlite3_open_v2 error: %s\n", pCfgFilePath); + sqlite3_close(g_pMemDb); + utstring_free(pSqlCmd); + return -ERR_OPEN_SQLITE3_DB; + } + + utstring_renew(pSqlCmd); + utstring_printf(pSqlCmd, CREATE_SKIN_TBL_SQL""CREATE_RES_TBL_SQL, "", ""); + + rc = sqlite3_exec(pSqlFileDB, utstring_body(pSqlCmd), NULL, 0, &pErrMsg); + + if(rc != SQLITE_OK) + { + LOG_EX(LOG_Error, "Create Tbl %s Error: %s\n", utstring_body(pSqlCmd), pErrMsg); + sqlite3_free(pErrMsg); + unlink(pCfgFilePath); + sqlite3_close(g_pMemDb); + utstring_free(pSqlCmd); + return -ERR_SQLITE3_CREATE_TABLE; + } + + utstring_renew(pSqlCmd); + utstring_printf(pSqlCmd, UPGRADE_TBL_SQL_CMD, ""); + rc = sqlite3_exec(pSqlFileDB, utstring_body(pSqlCmd), NULL, 0, &pErrMsg); + + if(rc != SQLITE_OK) + { + LOG_EX(LOG_Error, "Create Tbl %s Error: %s\n", UPGRADE_TBL_SQL_CMD, pErrMsg); + sqlite3_free(pErrMsg); + unlink(pCfgFilePath); + sqlite3_close(g_pMemDb); + utstring_free(pSqlCmd); + return -ERR_SQLITE3_CREATE_TABLE; + } + + sqlite3_close(pSqlFileDB); + + utstring_renew(pSqlCmd); + utstring_printf(pSqlCmd, ATTACH_DB_SQL_CMD, pCfgFilePath, SKIN_USER_DB); + + rc = sqlite3_exec(g_pMemDb, utstring_body(pSqlCmd), NULL, 0, &pErrMsg); + + if(rc != SQLITE_OK) + { + LOG_EX(LOG_Error, "Attach Database %s Error: %s\n", utstring_body(pSqlCmd), pErrMsg); + utstring_free(pSqlCmd); + sqlite3_free(pErrMsg); + unlink(pCfgFilePath); + sqlite3_close(g_pMemDb); + return -ERR_SQLITE3_CREATE_TABLE; + } + + utstring_free(pSqlCmd); + + rc = sqlite3_create_function(g_pMemDb, "ResCheck", 3, SQLITE_UTF8, NULL, __checkRes, NULL, NULL); + + if(rc != SQLITE_OK) + { + LOG_EX(LOG_Error, "Don't Support Resurces Verify Function\n"); + } + + if(InitSkinRomDatabase(g_pMemDb) != 0) + { + sqlite3_close(g_pMemDb); + return (-ERR_SQL_REG_MODULE); + } + + rc = __skinCreateCfgDB(); + + if(rc != 0) + { + sqlite3_close(g_pMemDb); + return rc; + } + + return (0); +} + +static void __onDlFileCb(void *pData, unsigned int size, + const char *pReqUrl, const char* pDlPath, + const char *pTaskUuid, int iFinished, void *pUserData) +{ + char* pId = (char*)pUserData; + UT_string *pSqlCmd = NULL; + int rc = 0; + char* pErrMsg = NULL; + + if(g_curDlItems > 0) + { + g_curDlItems--; + } + + if(iFinished == 0 && pId != NULL) + { + //LOG_EX(LOG_Debug, "Request(%s): [%s] --> [%s] Response: [%u] OK\n", pTaskUuid, pReqUrl, pDlPath, size); + + utstring_new(pSqlCmd); + utstring_printf(pSqlCmd, "UPDATE %s.upgrade SET dlStatus = %d, dlRetrys = %d, " + "dlTime = datetime(\'now\', \'localtime\') WHERE ID = %s AND " + "ResCheck(localPath, md5Chksum, resType) = 0", + SKIN_USER_DB, STATUS_DOWNLOADED, 0, pId); + + rc = sqlite3_exec(g_pMemDb, utstring_body(pSqlCmd), NULL, NULL, &pErrMsg); + + if(rc != SQLITE_OK) + { + LOG_EX(LOG_Error, "SQL Query Error: %s\n", pErrMsg); + sqlite3_free(pErrMsg); + } + + utstring_free(pSqlCmd); + } + else + { + if(iFinished == 1) + { + LOG_EX(LOG_Error, "Request(%s): [%s] --> [%s] Response: [%u] Error\n", pTaskUuid, pReqUrl, pDlPath, size); + } + else + { + LOG_EX(LOG_Error, "Download %s Error: %d\n", pReqUrl, iFinished); + } + + utstring_new(pSqlCmd); + utstring_printf(pSqlCmd, "SELECT * FROM %s.upgrade WHERE ID = %s AND dlRetrys < 5 ", SKIN_USER_DB, pId); + + //fprintf(stdout, "SQL:\n%s\n", utstring_body(pSqlCmd)); + rc = sqlite3_exec(g_pMemDb, utstring_body(pSqlCmd), __reTryDlSkinResCb, NULL, &pErrMsg); + if(rc != SQLITE_OK) + { + LOG_EX(LOG_Error, "SQL %s Query Error: %s\n", utstring_body(pSqlCmd), pErrMsg); + sqlite3_free(pErrMsg); + } + + utstring_free(pSqlCmd); + } + + if(pId) + { + free(pId); + } +} + +static int __reTryDlSkinResCb(void *pData, int argc, char **argv, char **azColName) +{ + UT_string *pSqlCmd = NULL; + char* pErrMsg = NULL; + + const char* pDlTaskId = InetHttpDlFileAsync(argv[6], + argv[5], + __onDlFileCb, + NULL, + strdup(argv[0])); + + if(pDlTaskId != NULL) + { + int rc = 0; + + utstring_new(pSqlCmd); + utstring_printf(pSqlCmd, "UPDATE %s.upgrade SET dlId = \'%s\', dlRetrys = dlRetrys + 1, " + "dlTime = datetime(\'now\', \'localtime\') WHERE ID = %s", + SKIN_USER_DB, pDlTaskId, argv[0]); + + rc = sqlite3_exec(g_pMemDb, utstring_body(pSqlCmd), NULL, NULL, &pErrMsg); + + if(rc != SQLITE_OK) + { + LOG_EX(LOG_Error, "SQL Query Error: %s\n", pErrMsg); + sqlite3_free(pErrMsg); + } + + utstring_free(pSqlCmd); + } + + return 0; +} + +static int __loadDownloadSkinsCb(void *pData, int argc, char **argv, char **azColName) +{ + const char *pDlTaskId; + char* pItemId = argv[0]; + char* pURL = argv[6]; + char* pDlPath = argv[5]; + char* pDlId = argv[10]; + int dlStatus = strtol(argv[3], NULL, 10); + int dlRetry = strtol(argv[4], NULL, 10) + 1; + + if(dlStatus == STATUS_DOWNLOADING) + { + if(strlen(pDlId) > 0) + { + InetCancelDownload(pDlId); + } + + dlRetry++; + } + + //LOG_EX(LOG_Debug, "Download: %s --> %s\n", pURL, pDlPath); + + pDlTaskId = InetHttpDlFileAsync(pURL, + pDlPath, + __onDlFileCb, + NULL, + strdup(pItemId)); + + if(pDlTaskId) + { + UT_string *pSqlCmd = NULL; + int rc = 0; + char* pErrMsg = NULL; + + g_curDlItems++; + + utstring_new(pSqlCmd); + utstring_printf(pSqlCmd, "UPDATE %s.upgrade SET dlStatus = %d, dlRetrys = %d, " + "dlId = \'%s\', dlTime = datetime(\'now\', \'localtime\') WHERE ID = %s", + SKIN_USER_DB, STATUS_DOWNLOADING, dlRetry, pDlTaskId, pItemId); +#if DEBUG_SQL_CMD + LOG_EX(LOG_Debug, "SQL CMD: [%s]\n", utstring_body(pSqlCmd)); +#endif + + rc = sqlite3_exec(g_pMemDb, utstring_body(pSqlCmd), NULL, NULL, &pErrMsg); + + if(rc != SQLITE_OK) + { + LOG_EX(LOG_Error, "SQL Query Error: %s\n", pErrMsg); + sqlite3_free(pErrMsg); + } + + utstring_free(pSqlCmd); + } + else + { + LOG_EX(LOG_Error, "Download %s error\n", pURL); + } + + return (0); +} + +static void __uvDownloadResThread(void *pParams) +{ + char* pErrMsg = NULL; + UT_string* pSqlCmd = NULL; + + LOG_EX(LOG_Debug, "Beging Download Skins\n"); + + while(!g_isDlFinished) + { + int rc = 0; + + utstring_new(pSqlCmd); + utstring_printf(pSqlCmd, "SELECT *, STRFTIME(\"%%s\", datetime(\'now\', \'localtime\')) " + "- STRFTIME(\"%%s\", upgrade.dlTime) AS diff FROM %s.upgrade " + "WHERE resStatus = %d AND (dlRetrys < 5 OR diff > 600) " + "AND (dlStatus = %d OR (dlStatus = %d AND diff > 600)) " + "LIMIT 10 - %d", + SKIN_USER_DB, UPG_STATUS_DL_NEW, STATUS_CREATE_NEW, STATUS_DOWNLOADING, g_curDlItems); +#if DEBUG_SQL_CMD + LOG_EX(LOG_Debug, "SQL CMD: [%s]\n", utstring_body(pSqlCmd)); +#endif + rc = sqlite3_exec(g_pMemDb, utstring_body(pSqlCmd), __loadDownloadSkinsCb, NULL, &pErrMsg); + + if(rc != SQLITE_OK) + { + LOG_EX(LOG_Error, "SQL Query Error: %s\n", pErrMsg); + sqlite3_free(pErrMsg); + } + + utstring_free(pSqlCmd); + + sleep(1); + } + + LOG_EX(LOG_Debug, "Download Skins Finished\n"); + + pthread_detach(pthread_self()); +} + +static int __sqlCbRemoveUnusedFile(void *pData, int argc, char **argv, char **azColName) +{ + LOG_EX(LOG_Debug, "Clean up resources: [%s]\n", argv[1]); + + if(access(argv[1], F_OK) == 0 + && strncmp(argv[1], DEF_SKINS_ROOT_PATH, strlen(DEF_SKINS_ROOT_PATH)) != 0) + { + unlink(argv[1]); + } +} + +static int __createResTblCb(void *pData, int argc, char **argv, char **azColName) +{ + int rc = 0; + char* pErrMsg = NULL; + UT_string* pSqlCmd = NULL; + + //DEBUG_SQL_CALLBACK_DATA(argc, argv, azColName); + + utstring_new(pSqlCmd); + utstring_printf(pSqlCmd, "INSERT INTO %s.%s " + "VALUES (NULL, \'%s\', \'%s\', \'%s\', \'%s\')", + SKIN_USER_DB, RES_TBL_NAME, argv[0], argv[1], argv[2], argv[3]); + + rc = sqlite3_exec(g_pMemDb, utstring_body(pSqlCmd), NULL, NULL, &pErrMsg); + + if(rc != SQLITE_OK) + { + LOG_EX(LOG_Error, "[%s] Query Error: %s\n", utstring_body(pSqlCmd), pErrMsg); + sqlite3_free(pErrMsg); + utstring_free(pSqlCmd); + return -1; + } + + utstring_free(pSqlCmd); + + return 0; +} + +static int __createSkinTblCb(void *pData, int argc, char **argv, char **azColName) +{ + int rc = 0; + char* pErrMsg = NULL; + UT_string* pSqlCmd = NULL; + + //DEBUG_SQL_CALLBACK_DATA(argc, argv, azColName); + + utstring_renew(pSqlCmd); + utstring_printf(pSqlCmd, "INSERT INTO %s.%s " + "VALUES (NULL, \'%s\', %s, %s, %s, \'%s\')", + SKIN_USER_DB, SKIN_TBL_NAME, + argv[1], argv[2], argv[3], argv[0], argv[4]); + + //fprintf(stdout, "AutoId: %lld: %s\n", sqlite3_last_insert_rowid(g_pMemDb), argv[3]); + rc = sqlite3_exec(g_pMemDb, utstring_body(pSqlCmd), NULL, NULL, &pErrMsg); + + if(rc != SQLITE_OK) + { + LOG_EX(LOG_Error, "[%s] Query Error: %s\n", utstring_body(pSqlCmd), pErrMsg); + sqlite3_free(pErrMsg); + return -1; + } + + utstring_free(pSqlCmd); + return 0; +} + +static void __uvSyncResThread(void *pParams) +{ + int tolCnt = 0; + PSKINS_CACHE_ITEM pItem = NULL, pTemp = NULL; + + LOG_EX(LOG_Debug, "Beging Sync Download Skins\n"); + + while(TRUE) + { + UT_string *pSqlCmd = NULL; + int rc = 0; + char* pErrMsg = NULL; + char **pResult = NULL; + int iRow = 0, iCol = 0; + int nItems = 0; + + utstring_new(pSqlCmd); + utstring_printf(pSqlCmd, "SELECT COUNT(*) FROM %s.upgrade " + "WHERE resStatus = %d AND dlStatus != %d", + SKIN_USER_DB, UPG_STATUS_DL_NEW, STATUS_DOWNLOADED); +#if DEBUG_SQL_CMD + LOG_EX(LOG_Debug, "SQL CMD: [%s]\n", utstring_body(pSqlCmd)); +#endif + rc = sqlite3_get_table(g_pMemDb, utstring_body(pSqlCmd), &pResult, &iRow, &iCol, &pErrMsg); + + if(rc != SQLITE_OK) + { + LOG_EX(LOG_Error, "Run SQL \n[%s]\n Error: %s\n", utstring_body(pSqlCmd), pErrMsg); + sqlite3_free(pErrMsg); + } + + utstring_free(pSqlCmd); + + nItems = strtol(pResult[1], NULL, 10); + sqlite3_free_table(pResult); + + if(tolCnt++ % 20 == 0) + { + LOG_EX(LOG_Debug, "Download: Remain %d\n", nItems); + } + + if(nItems == 0) + { + g_isDlFinished = TRUE; + utstring_new(pSqlCmd); + sqlite3_exec(g_pMemDb, "BEGIN TRANSACTION;", NULL, NULL, NULL); + + utstring_printf(pSqlCmd, "INSERT INTO main.tmp " + "SELECT %s.ID, %s.localPath FROM %s.%s " + "LEFT JOIN %s.upgrade on %s.md5Chksum = upgrade.md5Chksum " + "WHERE upgrade.md5Chksum IS NULL;", + RES_TBL_NAME, RES_TBL_NAME, SKIN_USER_DB, RES_TBL_NAME, + SKIN_USER_DB, RES_TBL_NAME); +#if DEBUG_SQL_CMD + LOG_EX(LOG_Debug, "SQL CMD: [%s]\n", utstring_body(pSqlCmd)); +#endif + rc = sqlite3_exec(g_pMemDb, utstring_body(pSqlCmd), NULL, NULL, &pErrMsg); + + if(rc != SQLITE_OK) + { + LOG_EX(LOG_Error, "Run SQL \n[%s]\n Error: %s\n", utstring_body(pSqlCmd), pErrMsg); + sqlite3_free(pErrMsg); + sqlite3_exec(g_pMemDb, "ROLLBACK;", NULL, NULL, NULL); + utstring_free(pSqlCmd); + break; + } + + __cleanupSkinTbl(); + __cleanupResTbl(); + + utstring_renew(pSqlCmd); + + utstring_printf(pSqlCmd, "SELECT resVersion, localPath, serverURL, md5Chksum, " + "keyName, resType, priority, resReadme, resStatus, dlStatus " + "FROM %s.upgrade WHERE resStatus = %d " + "OR (resStatus = %d AND dlStatus = %d) " + "GROUP BY md5Chksum", + SKIN_USER_DB, UPG_STATUS_DOWNLOADED, + UPG_STATUS_DL_NEW, STATUS_DOWNLOADED); +#if DEBUG_SQL_CMD + LOG_EX(LOG_Debug, "SQL CMD: [%s]\n", utstring_body(pSqlCmd)); +#endif + rc = sqlite3_exec(g_pMemDb, utstring_body(pSqlCmd), __createResTblCb, NULL, &pErrMsg); + + if(rc != SQLITE_OK) + { + LOG_EX(LOG_Error, "Run SQL \n[%s]\n Error: %s\n", utstring_body(pSqlCmd), pErrMsg); + sqlite3_free(pErrMsg); + sqlite3_exec(g_pMemDb, "ROLLBACK;", NULL, NULL, NULL); + utstring_free(pSqlCmd); + break; + } + else + { + utstring_renew(pSqlCmd); + utstring_printf(pSqlCmd, "SELECT %s.ID, keyName, resType, priority, " + "resReadme, resStatus, dlStatus, %s.md5Chksum " + "FROM %s.upgrade, %s.res WHERE %s.md5Chksum = upgrade.md5Chksum" + " AND (resStatus = %d OR (resStatus = %d AND dlStatus = %d)) " + "ORDER BY keyName", + RES_TBL_NAME, RES_TBL_NAME, SKIN_USER_DB, SKIN_USER_DB, RES_TBL_NAME, + UPG_STATUS_DOWNLOADED, UPG_STATUS_DL_NEW, STATUS_DOWNLOADED); +#if DEBUG_SQL_CMD + LOG_EX(LOG_Debug, "SQL CMD: [%s]\n", utstring_body(pSqlCmd)); +#endif + rc = sqlite3_exec(g_pMemDb, utstring_body(pSqlCmd), __createSkinTblCb, NULL, &pErrMsg); + + if(rc != SQLITE_OK) + { + LOG_EX(LOG_Error, "Run SQL \n[%s]\n Error: %s\n", utstring_body(pSqlCmd), pErrMsg); + sqlite3_free(pErrMsg); + sqlite3_exec(g_pMemDb, "ROLLBACK;", NULL, NULL, NULL); + utstring_free(pSqlCmd); + break; + } + else + { + sqlite3_exec(g_pMemDb, "SELECT * FROM main.tmp", __sqlCbRemoveUnusedFile, NULL, NULL); + utstring_free(pSqlCmd); + + if(__cleanupUpgTbl() != 0) + { + sqlite3_exec(g_pMemDb, "ROLLBACK;", NULL, NULL, NULL); + } + else + { + sqlite3_exec(g_pMemDb, "END TRANSACTION;", NULL, NULL, NULL); + break; + } + } + } + } + + sleep(1); + } + + LOG_EX(LOG_Debug, "Sync Download Skins Finished\n"); + + uv_rwlock_wrlock(&g_SkinCacheRwLock); + HASH_ITER(hh, g_pSkinCackeTbl, pItem, pTemp) + { + free(pItem->pKeyName); + free(pItem->pResPath); + free(pItem); + pItem = NULL; + } + + g_pSkinCackeTbl = NULL; + uv_rwlock_wrunlock(&g_SkinCacheRwLock); + + g_isUpgradeRunning = FALSE; + pthread_detach(pthread_self()); +} + +static int __upgStatusTblCb(void *pData, int argc, char **argv, char **azColName) +{ + int rc = 0; + char* pErrMsg = NULL; + UT_string* pSqlCmd = NULL; + + DEBUG_SQL_CALLBACK_DATA(argc, argv, azColName); + + utstring_new(pSqlCmd); + utstring_printf(pSqlCmd, "UPDATE %s.upgrade SET resStatus = %d WHERE ID = %s", + SKIN_USER_DB, UPG_STATUS_DL_NEW, argv[2]); + + rc = sqlite3_exec(g_pMemDb, utstring_body(pSqlCmd), NULL, NULL, &pErrMsg); + + if(rc != SQLITE_OK) + { + LOG_EX(LOG_Error, "[%s] Query Error: %s\n", utstring_body(pSqlCmd), pErrMsg); + sqlite3_free(pErrMsg); + utstring_free(pSqlCmd); + return -1; + } + + utstring_free(pSqlCmd); + + return 0; +} + +static int __saveUpgradeInfo(PSKIN_RES_INFO pInfo, int nItems) +{ + int isError = FALSE; + char* pErrMsg = NULL; + UT_string* pSqlCmd = NULL; + + if(pInfo == NULL || nItems <= 0) + { + return (-ERR_INPUT_PARAMS); + } + + utstring_new(pSqlCmd); + + sqlite3_exec(g_pMemDb, "BEGIN TRANSACTION;", NULL, NULL, NULL); + __cleanupUpgTbl(); + __cleanupTmpTbl(); + + for(int i = 0; i < nItems; i++) + { + UT_string* pPath = NULL; + PSKIN_RES_INFO pItem = &pInfo[i]; + + utstring_new(pPath); + utstring_renew(pSqlCmd); + +#if 0 + if(pItem->resType == VOICE_RES) + { + utstring_printf(pPath, "%svoice/%s", DOWNLOAD_RES_ROOT_PATH, basename_v2(pItem->pLocalPath)); + } + + else if(pItem->resType == IMAGE_RES) + { + utstring_printf(pPath, "%simage/%s", DOWNLOAD_RES_ROOT_PATH, basename_v2(pItem->pLocalPath)); + } + else if(pItem->resType == TEXT_RES) + { + utstring_printf(pPath, "%s", pItem->pLocalPath); + } + else + { + utstring_free(pPath); + continue; + } +#else + utstring_printf(pPath, "%svoice/%s", DOWNLOAD_RES_ROOT_PATH, basename_v2(pItem->pLocalPath)); +#endif + utstring_printf(pSqlCmd, "INSERT INTO %s.upgrade (keyName, resType, resVersion, localPath, serverURL, md5Chksum)" + " SELECT \'%s\', %d, \'%s\', \'%s\', \'%s\', \'%s\' ", + SKIN_USER_DB, pItem->pKeyName, pItem->resType, pItem->pResVer, utstring_body(pPath), + pItem->pLocalPath, pItem->pMD5Chksum); + +#if DEBUG_SQL_CMD + LOG_EX(LOG_Debug, "SQL CMD: [%s]\n", utstring_body(pSqlCmd)); +#endif + + if((sqlite3_exec(g_pMemDb, utstring_body(pSqlCmd), NULL, 0, &pErrMsg) != SQLITE_OK)) + { + LOG_EX(LOG_Error, "Add Skins[%d] %s To Database Error: %s\n", i, pItem->pKeyName, utstring_body(pSqlCmd)); + LOG_EX(LOG_Error, "SQL Error: %s\n", pErrMsg); + sqlite3_free(pErrMsg); + isError = TRUE; + utstring_free(pPath); + break; + } + + utstring_free(pPath); + } + + utstring_renew(pSqlCmd); + + utstring_printf(pSqlCmd, "UPDATE %s.upgrade SET resStatus = %d " + "WHERE EXISTS (SELECT %s.keyName, upgrade.md5Chksum FROM main.%s, user_db.upgrade " + "WHERE upgrade.keyName = %s.keyName)", + SKIN_USER_DB, UPG_STATUS_DL_NEW, + SKIN_TBL_NAME, SKIN_TBL_NAME, + SKIN_TBL_NAME); + +#if DEBUG_SQL_CMD + LOG_EX(LOG_Debug, "SQL CMD: [%s]\n", utstring_body(pSqlCmd)); +#endif + + if(sqlite3_exec(g_pMemDb, utstring_body(pSqlCmd), __upgStatusTblCb, 0, &pErrMsg) != SQLITE_OK) + { + LOG_EX(LOG_Error, "Upgrade Status: %s\n", utstring_body(pSqlCmd)); + LOG_EX(LOG_Error, "SQL Error: %s\n", pErrMsg); + sqlite3_free(pErrMsg); + isError = TRUE; + } + + utstring_renew(pSqlCmd); + + utstring_printf(pSqlCmd, "UPDATE %s.upgrade SET resStatus = %d " + "WHERE EXISTS (SELECT %s.md5Chksum FROM %s.%s " + "WHERE upgrade.md5Chksum = %s.md5Chksum);" + "UPDATE %s.upgrade SET resStatus = %d, localPath = " + "(SELECT %s.localPath FROM main.%s " + "WHERE upgrade.md5Chksum = %s.md5Chksum) " + "WHERE EXISTS (SELECT %s.md5Chksum FROM main.%s " + "WHERE upgrade.md5Chksum = %s.md5Chksum);", + SKIN_USER_DB, UPG_STATUS_DOWNLOADED, + RES_TBL_NAME, SKIN_USER_DB, RES_TBL_NAME, + RES_TBL_NAME, + SKIN_USER_DB, UPG_STATUS_DOWNLOADED, + RES_TBL_NAME, RES_TBL_NAME, RES_TBL_NAME, + RES_TBL_NAME, RES_TBL_NAME, RES_TBL_NAME); + +#if DEBUG_SQL_CMD + LOG_EX(LOG_Debug, "SQL CMD: [%s]\n", utstring_body(pSqlCmd)); +#endif + + if(sqlite3_exec(g_pMemDb, utstring_body(pSqlCmd), NULL, 0, &pErrMsg) != SQLITE_OK) + { + LOG_EX(LOG_Error, "Upgrade Status: %s\n", utstring_body(pSqlCmd)); + LOG_EX(LOG_Error, "SQL Error: %s\n", pErrMsg); + sqlite3_free(pErrMsg); + isError = TRUE; + } + + utstring_free(pSqlCmd); + + + if(isError == TRUE) + { + sqlite3_exec(g_pMemDb, "ROLLBACK;", NULL, NULL, NULL); + return (-ERR_SQL_QUERY); + } + else + { + uv_thread_t uvSyncThread, uvDlThread; + sqlite3_exec(g_pMemDb, "END TRANSACTION;", NULL, NULL, NULL); + g_curDlItems = 0; + g_isDlFinished = FALSE; + uv_thread_create(&uvDlThread, __uvDownloadResThread, NULL); + uv_thread_create(&uvSyncThread, __uvSyncResThread, NULL); + } + + return 0; +} + +static int __loadPreUpgradeInfo(void) +{ + UT_string *pSqlCmd = NULL; + int rc = 0; + char* pErrMsg = NULL; + char **pResult = NULL; + int iRow = 0, iCol = 0; + int nItems = 0; + + utstring_new(pSqlCmd); + utstring_printf(pSqlCmd, "SELECT COUNT(*) FROM %s.upgrade WHERE resStatus = %d AND dlStatus != %d", + SKIN_USER_DB, UPG_STATUS_DL_NEW, STATUS_DOWNLOADED); + + rc = sqlite3_get_table(g_pMemDb, utstring_body(pSqlCmd), &pResult, &iRow, &iCol, &pErrMsg); + + if(rc != SQLITE_OK) + { + LOG_EX(LOG_Error, "Run SQL \n[%s]\n Error: %s\n", utstring_body(pSqlCmd), pErrMsg); + sqlite3_free(pErrMsg); + } + + utstring_free(pSqlCmd); + + nItems = strtol(pResult[1], NULL, 10); + sqlite3_free_table(pResult); + + if(nItems > 0) + { + uv_thread_t uvSyncThread, uvDlThread; + g_curDlItems = 0; + g_isDlFinished = FALSE; + g_isUpgradeRunning = TRUE; + uv_thread_create(&uvDlThread, __uvDownloadResThread, NULL); + uv_thread_create(&uvSyncThread, __uvSyncResThread, NULL); + LOG_EX(LOG_Debug, "Load Pre Download Items: %d\n", nItems); + } +} + +static int __getEnumResInfo(void) +{ + __saveUpgradeInfo((PSKIN_RES_INFO)g_emuUpgradeInfo, sizeof(g_emuUpgradeInfo) / sizeof(g_emuUpgradeInfo[0])); +} + +int SkinUpgrade(char* pUpdData) +{ + int nItems = 0; + PSKIN_RES_INFO pUpgResInfo; + cJSON *pRoot, *pList; + +#if 1 + FILE *pFile = fopen("/mnt/UDISK/skinupgrade.txt", "w+"); + fwrite(pUpdData, 1, strlen(pUpdData), pFile); + fclose(pFile); +#endif + + if (pUpdData == NULL || strlen(pUpdData) == 0) + { + LOG_EX(LOG_Error, "Input Params Error\n"); + return (-ERR_INPUT_PARAMS); + } + + LOG_EX(LOG_Debug, "Upgrade Cmd: [%s]\n", pUpdData); + //fprintf(stdout, "%s\n", pUpdData); + + pRoot = cJSON_Parse(pUpdData); + + if(pRoot == NULL) + { + LOG_EX(LOG_Error, "Parse Json Error\n"); + return (-ERR_NO_ITEMS); + } + + nItems = cJSON_GetArraySize(pRoot); + + if(nItems <= 0) + { + LOG_EX(LOG_Error, "Upgrade Item: %d\n", nItems); + cJSON_Delete(pRoot); + return (-ERR_NO_ITEMS); + } + + pUpgResInfo = (PSKIN_RES_INFO)malloc(sizeof(SKIN_RES_INFO) * nItems); + + if(pUpgResInfo == NULL) + { + LOG_EX(LOG_Error, "Malloc %d Memory Error\n", nItems); + cJSON_Delete(pRoot); + return (-ERR_MALLOC_MEMORY); + } + + LOG_EX(LOG_Debug, "Array Size = %d\n", nItems); + + memset(pUpgResInfo, 0, sizeof(SKIN_RES_INFO) * nItems); + pList = pRoot->child; + + for(int i = 0; i < nItems; i++) + { + pUpgResInfo[i].resType = VOICE_RES;//cJSON_GetObjectItem(pList, "resourceType")->valueint; + pUpgResInfo[i].pResVer = strdup(cJSON_GetObjectItem(pList, "resourceVersion")->valuestring); + pUpgResInfo[i].pKeyName = strdup(cJSON_GetObjectItem(pList, "resourceName")->valuestring); + pUpgResInfo[i].pLocalPath = strdup(cJSON_GetObjectItem(pList, "url")->valuestring); + pUpgResInfo[i].pMD5Chksum = strdup(cJSON_GetObjectItem(pList, "md5")->valuestring); + + pList = pList->next; + } + + cJSON_Delete(pRoot); + + g_isUpgradeRunning = TRUE; + __dumpSkinsInfo(pUpgResInfo, nItems); + __saveUpgradeInfo(pUpgResInfo, nItems); + + free(pUpgResInfo); +} + +char* SQLiteGetSkinsResource(char *pKeyName, int *pResType, int *pVersion, char **pComeFrom) +{ + char *pSkinPath = strdup(""); + int rc = 0; + char* pErrMsg = NULL; + UT_string *pSqlCmd = NULL; + char **pResult = NULL; + int iRow = 0, iCol = 0; + int queCol = 13; + int colPath = 21; + + utstring_new(pSqlCmd); + + if(g_isVerifyRes) + { + utstring_printf(pSqlCmd, "SELECT *, RANDOM() AS rnd, ResCheck(localPath, md5Chksum, resType) as resOK " + "FROM %s.%s, %s.%s\n" + "WHERE %s.keyName = \'%s\' AND resOK = 0 AND %s.resId = %s.ID\n" + "UNION\n" + "SELECT *, RANDOM() AS rnd, ResCheck(localPath, md5Chksum, resType) as resOK " + "FROM main.%s, main.%s\n" + "WHERE %s.keyName = \'%s\' AND resOK = 0 AND %s.resId = %s.ID\n" + "ORDER BY priority DESC, rnd " + "LIMIT 1", + SKIN_USER_DB, SKIN_TBL_NAME, SKIN_USER_DB, RES_TBL_NAME, + SKIN_TBL_NAME, pKeyName, SKIN_TBL_NAME, RES_TBL_NAME, + SKIN_TBL_NAME, RES_TBL_NAME, + SKIN_TBL_NAME, pKeyName, SKIN_TBL_NAME, RES_TBL_NAME); + } + else + { + utstring_printf(pSqlCmd, "SELECT *, RANDOM() AS rnd " + "FROM %s.%s, %s.%s\n" + "WHERE %s.keyName = \'%s\' AND %s.resId = %s.ID\n" + "UNION\n" + "SELECT *, RANDOM() AS rnd " + "FROM main.%s, main.%s\n" + "WHERE %s.keyName = \'%s\' AND %s.resId = %s.ID\n" + "ORDER BY priority DESC, rnd " + "LIMIT 1", + SKIN_USER_DB, SKIN_TBL_NAME, SKIN_USER_DB, RES_TBL_NAME, + SKIN_TBL_NAME, pKeyName, SKIN_TBL_NAME, RES_TBL_NAME, + SKIN_TBL_NAME, RES_TBL_NAME, + SKIN_TBL_NAME, pKeyName, SKIN_TBL_NAME, RES_TBL_NAME); + queCol = 12; + colPath = 20; + } + + rc = sqlite3_get_table(g_pMemDb, utstring_body(pSqlCmd), &pResult, &iRow, &iCol, &pErrMsg); + + if(rc != SQLITE_OK) + { + LOG_EX(LOG_Error, "Run SQL \n[%s]\n Error: %s(%d)\n", utstring_body(pSqlCmd), pErrMsg, rc); + sqlite3_free(pErrMsg); + utstring_free(pSqlCmd); + return (pSkinPath); + } + + if(iRow == 1 && iCol == queCol) + { + + if(access(pResult[colPath], F_OK) != 0) + { + LOG_EX(LOG_Error, "Res %s --> %s not exists\n", pKeyName, pResult[colPath]); + } + else + { + free(pSkinPath); + pSkinPath = strdup(pResult[colPath]); + } +#if 0 + for(int i = 0; i <= 21; i++) + { + LOG_EX(LOG_Debug, "[%d]: {%s}\n", i, pResult[i]); + } +#endif + } + +#if 0 + int index = iCol; + for(int i = 0; i < iRow; i++) + { + fprintf(stdout, "----------%d[%d, %d]---------\n", i, iRow, iCol); + + for(int j = 0; j < iCol; j++) + { + int tblCol = i * iCol + j; + + fprintf(stdout, "%s(%d, %d) = [%s]\n", pResult[tblCol], j, index, pResult[index]); + index++; + } + } +#endif + + sqlite3_free_table(pResult); + utstring_free(pSqlCmd); + + if(strcmp(pSkinPath, "") == 0) + { + free(pSkinPath); + return TblGetSkinsResource(pKeyName, pResType, pVersion, pComeFrom); + } + else + { + return (pSkinPath); + } +} + +char* TblGetSkinsResource(char *pKeyName, int *pResType, int *pVersion, char **pComeFrom) +{ + + for(int i = 0; i < sizeof(g_SkinDefaultResTable) / sizeof(g_SkinDefaultResTable[0]); i++) + { + if(strcmp(g_SkinDefaultResTable[i].pKeyName, pKeyName) == 0) + { + return strdup(g_SkinDefaultResTable[i].pLocalPath); + } + } + + return strdup(""); +} + +char* GetSkinsResource(char *pKeyName, int *pResType, int *pVersion, char **pComeFrom) +{ + if(g_isUpgradeRunning) + { + return TblGetSkinsResource(pKeyName, pResType, pVersion, pComeFrom); + } + else + { + return SQLiteGetSkinsResource(pKeyName, pResType, pVersion, pComeFrom); + } +} + +unsigned int SkinsDefaultSize(void) +{ + return (g_tolDefaultSkins + 1); +} + +PSKIN_RES_INFO SkinsItemById(int iId) +{ + if(iId < 0 || iId > g_tolDefaultSkins) + { + return (NULL); + } + + return ((PSKIN_RES_INFO)&g_SkinDefaultResTable[iId - 1]); +} + +static int __verifyResValuableCb(void *pData, int argc, char **argv, char **azColName) +{ + char sqlCmd[256]; + char* pErrMsg = NULL; + + if(argc < 3) + { + return 0; + } + + sqlite3_exec(g_pMemDb, "BEGIN TRANSACTION;", NULL, NULL, NULL); + for(int i = 0; i < argc; i++) + { + if(strcmp(azColName[i], "ID") == 0) + { + LOG_EX(LOG_Error, "Cleanup Bad Resources: %s\n", argv[i + 1]); + + memset(sqlCmd, 0, 256); + sprintf(sqlCmd, "DELETE FROM %s.%s WHERE ID = %s", SKIN_USER_DB, RES_TBL_NAME, argv[i]); + + if(sqlite3_exec(g_pMemDb, sqlCmd, __verifyResValuableCb, 0, &pErrMsg) != SQLITE_OK) + { + LOG_EX(LOG_Error, "SQL: %s\nError: %s\n", sqlCmd, pErrMsg); + sqlite3_free(pErrMsg); + sqlite3_exec(g_pMemDb, "ROLLBACK;", NULL, NULL, NULL); + return -1; + } + + unlink(argv[i + 1]); + } + } + sqlite3_exec(g_pMemDb, "END TRANSACTION;", NULL, NULL, NULL); + + return (0); +} + +static void VerifySkinResInfo(void) +{ + UT_string *pSqlCmd = NULL; + char* pErrMsg = NULL; + + utstring_new(pSqlCmd); + utstring_printf(pSqlCmd, "SELECT ID, localPath, md5Chksum FROM %s.%s " + "WHERE ResCheck(localPath, md5Chksum, 1) != 0", SKIN_USER_DB, RES_TBL_NAME); + + if(sqlite3_exec(g_pMemDb, utstring_body(pSqlCmd), __verifyResValuableCb, 0, &pErrMsg) != SQLITE_OK) + { + LOG_EX(LOG_Error, "SQL Error: %s\n", pErrMsg); + sqlite3_free(pErrMsg); + utstring_free(pSqlCmd); + return; + } + + utstring_free(pSqlCmd); +} + +void SkinIsVerifyRes(int isVerify) +{ + g_isVerifyRes = isVerify; +} + +int SkinInit(void) +{ + int rc = 0; + UT_string* pPath = NULL; +#if 0 + int tmUsed = 0; + struct timeval tmStart, tmEnd; + + if(DBusLibuvGetRuntime() == NULL) + { + int ret = 0; + uv_thread_t uvThread; + LOG_EX(LOG_Warn, "+++++++++++++++++++++++System Uninit\n"); + + DBusConnection* pBus = DBusWithLibuvInit(GetDBusDefaultLoop(), + g_pModInfoTable[MODULE_SKINS].modAliase, + __dusOnMsg, + NULL, + NULL, //KeyEventCb, + &ret); + + if(pBus == NULL) + { + LOG_EX(LOG_Error, "DBusWithLibuvInit Error: %d\n", ret); + return -ERR_UNINIT_ITEM; + } + + uv_thread_create(&uvThread, uvLoopProc, NULL); + } +#endif + + uv_rwlock_init(&g_uvSkinRwLock); + uv_rwlock_init(&g_uvDlRwLock); + uv_rwlock_init(&g_SkinCacheRwLock); + + utstring_new(pPath); + + utstring_printf(pPath, "mkdir -p %s/image > /dev/zero", DOWNLOAD_RES_ROOT_PATH); + rc = system(utstring_body(pPath)); + + utstring_renew(pPath); + utstring_printf(pPath, "mkdir -p %s/voice > /dev/zero", DOWNLOAD_RES_ROOT_PATH); + rc = system(utstring_body(pPath)); + + utstring_free(pPath); + + rc = __skinCreateCfgFile(SKINS_DB_PATH); + + if(rc != SQLITE_OK) + { + return rc; + } + + // gettimeofday(&tmStart, NULL); + VerifySkinResInfo(); +// gettimeofday(&tmEnd, NULL); + +// tmUsed = (tmEnd.tv_sec * 1000000 + tmEnd.tv_usec) - (tmStart.tv_sec * 1000000 + tmStart.tv_usec); +// LOG_EX(LOG_Debug, "VerifySkinResInfo used time: %d(us)\n", tmUsed); + + __loadPreUpgradeInfo(); + //__getEnumResInfo(); + //__getUpgradeInfo("./hotfix.txt"); + //__loadDownloadItems(); + + //__dumpSkinsInfo(); +} diff --git a/Framework/SvrManager/svr_manager.c b/Framework/SvrManager/svr_manager.c new file mode 100644 index 0000000..df0db17 --- /dev/null +++ b/Framework/SvrManager/svr_manager.c @@ -0,0 +1,224 @@ +#include "server_addr.h" +#include "log.h" +#include "config_engine.h" +#include "libuv_dbus.h" + +const char* g_ServerModuleStr[] = +{ + "YUNXIN_MODULE", + "VOICE_MODULE", + "VOICE_AI_MODULE", + "SERVER_MODULE", + "LOG_MODULE", + "MARK_POINT_MODULE", + "TTS_MODULE", + "DC_MODULE", + "UNKNOWN_MODULE" +}; + +const char* g_ServerModeStr[] = +{ + "DEV_MODE", + "TEST_MODE", + "PUBLISH_MODE", + "UNKNOWN_MODE" +}; + +const char* g_KeyMapStr[] = +{ + "VOICE_APP_KEY", + "VOICE_APP_SECRET", + "UNKNOWN_KEYMAP" +}; + +const char* SvrModuleStr(SERVER_MODULE_TYPE module) +{ + return g_ServerModuleStr[module]; +} + +const char* SvrModeStr(SERVER_MODE_TYPE mode) +{ + return g_ServerModeStr[mode]; +} + +const char* g_VoiceKeyMap[VOICE_MAX][MAX_MODE] = { + { // VOICE_APP_KEY + "vbox-dev", + "vbox-dev", + "vbox-online", + }, + { // VOICE_APP_SECRET + "b1ec33c03df80ea3035bc9ccaa4af09c", + "b1ec33c03df80ea3035bc9ccaa4af09c", + "8714d6de1c83f21dda5fc9a905a59ac1", + }, +}; + +const char* g_ServerAddr[MAX_MODULE][MAX_MODE] = { + { // YUNXIN_MODULE + "2e37bc56a9b7ec3f6b8f41f60b81eb92", + "2e37bc56a9b7ec3f6b8f41f60b81eb92", + "dbb00213c23ea3709aae12ceb4c4e54e", + }, + { // VOICE_MODULE + "ws://vbox-test.netease.com/netty/websocket", + "ws://vbox-test.netease.com/netty3/websocket", + "wss://vbox-asr.3.163.com/websocket", + }, + { // VOICE_AI_MODULE + "http://api.multimedia.netease.com/imgtest/yqbot31_8686/", + "http://api.multimedia.netease.com/imgtest/yqbot29_8686/", + "https://vbox-smart.3.163.com/ ", + }, + { // SERVER_MODULE + "http://api.multimedia.netease.com/imgtest/yqbot27_7677/", + "http://api.multimedia.netease.com/imgtest/yqbot31_7676/", + "https://vbox-server.3.163.com/", + }, + { // LOG_MODULE + "http://vbox-log-test.netease.com/logCollectDev/vbox/logCollect/uploadLog", + "http://vbox-log-test.netease.com/logCollect/vbox/logCollect/uploadLog", + "https://vbox-log.3.163.com/vbox/logCollect/uploadLog", + }, + { // MARK_POINT_MODULE + "http://vbox-log-test.netease.com/buriedDev/vbox/log/add", + "http://vbox-log-test.netease.com/buriedTest/vbox/log/add", + "https://vbox-log.3.163.com/vbox/log/add", + }, + { // TTS_MODULE + "http://api.openai.netease.com/vbox-tts-dev/vbox/tts/transform", + "http://api.openai.netease.com/vbox-tts-test/vbox/tts/transform", + "https://vbox-tts.3.163.com/vbox/tts/transform", + }, + { // DC_MODULE + "http://api.multimedia.netease.com/imgtest/yqbot27_7677/vbox/uploadFile", + "http://api.multimedia.netease.com/imgtest/yqbot31_7676/vbox/uploadFile", + "https://vbox-server.3.163.com/vbox/uploadFile", + }, +}; + +static unsigned int g_SvrMode = PUBLISH_MODE; + +void DumpCurServerAddr(const char* pTags) +{ + if(pTags && strlen(pTags) > 0) + { + LOG_EX2(LOG_Info, "%s\t Current Server Mode: %s\n", pTags, SvrModeStr(g_SvrMode)); + } + else + { + LOG_EX2(LOG_Info, "Current Server Mode: %s\n", SvrModeStr(g_SvrMode)); + } + +#if 0 + LOG_EX2(LOG_Info, "Voice Key = [%s], Secret = [%s]\n", + GetCurVoiceKeyValue(VOICE_APP_KEY), GetCurVoiceKeyValue(VOICE_APP_SECRET)); + + LOG_EX2(LOG_Info, "--------------------------------------------------------" + "----------------------------------------------\n"); + + LOG_EX2(LOG_Info, "| Module | " + "Server URL |\n"); + + LOG_EX2(LOG_Info, "--------------------------------------------------------" + "----------------------------------------------\n"); + + for(int i = 0; i < MAX_MODULE; i++) + { + LOG_EX2(LOG_Info, "| %-17s | %-78s |\n", SvrModuleStr(i), GetCurServerAddr(i)); + } + + LOG_EX2(LOG_Info, "--------------------------------------------------------" + "----------------------------------------------\n"); +#endif + +} + +SERVER_MODE_TYPE GetCurrentServerMode(void) +{ + return g_SvrMode; +} + +void SetCurrentServerMode(SERVER_MODE_TYPE mode) +{ + if(mode >= 0 && mode < MAX_MODE) + { + if(g_SvrMode != mode) + { + LOG_EX(LOG_Debug, "Change server mode from %s(%d) to %s(%d)\n", + g_ServerModeStr[g_SvrMode], g_SvrMode, g_ServerModeStr[mode], mode); + + g_SvrMode = mode; + + CfgSetIntValue("ServerMode", mode); + } + else + { + LOG_EX(LOG_Warn, "Current mode is %s(%d) yet\n", g_ServerModeStr[mode], mode); + } + } + else + { + LOG_EX(LOG_Error, "Unknown Mode: %d, current mode: %s(%d)\n", + mode, g_ServerModeStr[g_SvrMode], g_SvrMode); + } +} + +char* GetCurServerAddr(SERVER_MODULE_TYPE module) +{ + if(module >= 0 && module < MAX_MODULE) + { + return (char*)g_ServerAddr[module][g_SvrMode]; + } + else + { + LOG_EX(LOG_Error, "Unknown Module: %s(%d)\n", g_ServerModuleStr[module], module); + return ""; + } +} + +char* GetCurVoiceKeyValue(VOICE_KEYMAP_TYPE keyMap) +{ + if(keyMap >= 0 && keyMap < VOICE_MAX) + { + return (char*)g_VoiceKeyMap[keyMap][g_SvrMode]; + } + else + { + LOG_EX(LOG_Error, "Unknown KeyMap Type: %s(%d)\n", g_KeyMapStr[keyMap], keyMap); + return ""; + } +} + +static PDBUS_MSG_PACK __dusOnMsg(uv_loop_t* pLoop, DBusConnection* pConn, PDBUS_MSG_PACK pMsg) +{ + return NULL; +} + +static void uvLoopProc(void *pParams) +{ + RunUVLoop(GetDBusDefaultLoop()); + pthread_detach(pthread_self()); +} + +void ServerManagerInit(void) +{ + int ret = 0; + uv_thread_t uvThread; + LOG_EX(LOG_Warn, "+++++++++++++++++++++++System Uninit\n"); + + DBusConnection* pBus = DBusWithLibuvInit(GetDBusDefaultLoop(), + g_pModInfoTable[MODULE_SKINS].modAliase, + __dusOnMsg, + NULL, + NULL, //KeyEventCb, + &ret); + + if(pBus == NULL) + { + LOG_EX(LOG_Error, "DBusWithLibuvInit Error: %d\n", ret); + return; + } + + uv_thread_create(&uvThread, uvLoopProc, NULL); +} diff --git a/Framework/Timer/timer.c b/Framework/Timer/timer.c new file mode 100644 index 0000000..eb019b0 --- /dev/null +++ b/Framework/Timer/timer.c @@ -0,0 +1,769 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "log.h" +#include "libuv_dbus.h" + +#define TIMER_TIMEOUT (200) + +#define IS_LEAP_YEAR(year) ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0)) + +static unsigned char g_DayOfMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; + +typedef struct +{ + void* pUserData; + OnAlarmTimer pOnAlarmCb; + unsigned int alarmId; + + struct tm setDateTime; + int setWeekDay; + unsigned int repeatMode; + + struct tm onDateTime; + time_t onTimestamp; + unsigned int timerPriority; + + UT_hash_handle hh; ///< UT Hash handle +} ALARM_ITEM_DATA, *PALARM_ITEM_DATA; + +static uv_timer_t g_uvTimer; +static unsigned int g_iAlarmId = 1; +static struct tm g_LocalTime; +static time_t g_TimeStamp; +static uv_loop_t* g_pMainLoop = NULL; +static uv_rwlock_t g_uvHashRwLock; +static PALARM_ITEM_DATA g_TimerTbl = NULL; + +const char* DumpTimerRepeatModeString(int mode) +{ + switch(mode & 0xFF) + { + case REPEAT_MODE_NONE: return "NONE"; + case REPEAT_MODE_EVERY_DAY: return "EVERY_DAY"; + case REPEAT_MODE_WORKDAY: return "WORKDAY"; + case REPEAT_MODE_HOLIDAY: return ("REPEAT_MODE_HOLIDAY"); + case REPEAT_MODE_WEEKEND: return "WEEKEND"; + case REPEAT_MODE_WEEKDAY: return "WEEKDAY"; + case REPEAT_MODE_EVERY_MONTH_DAY: return "EVERY_MONTH_DAY"; + case REPEAT_MODE_EVERY_YEAR_DAY: return "EVERY_YEAR_DAY"; + case REPEAT_MODE_EVERY_TIME: return ("EVERY_TIME"); + case REPEAT_MODE_MONTH_LAST_DAY: return "REPEAT_MODE_MONTH_LAST_DAY"; + default: return ("Unknown Mode"); + } +} + +static int __timestampSort(PALARM_ITEM_DATA p1, PALARM_ITEM_DATA p2) +{ + if(p1->onTimestamp == p2->onTimestamp) + { + return (p2->timerPriority - p1->timerPriority); + } + else + { + return (p1->onTimestamp - p2->onTimestamp); + } +} + +static int __getNextOnTimestamp(PALARM_ITEM_DATA pInfo) +{ + int ret; + struct tm setTime; + time_t timestamp; + + if(pInfo == NULL) + { + return (-ERR_INPUT_PARAMS); + } + + if(pInfo->repeatMode == REPEAT_MODE_NONE) + { + pInfo->onTimestamp = 0; + return (-ERR_INPUT_PARAMS); + } + + timestamp = pInfo->onTimestamp + 24 * 3600; + pInfo->onTimestamp = timestamp; + localtime_r(×tamp, &setTime); + + switch(pInfo->repeatMode) + { + case REPEAT_MODE_EVERY_DAY: + localtime_r(×tamp, &pInfo->onDateTime); + break; + + case REPEAT_MODE_WORKDAY: + do + { + ret = CurrentIsWorkDay(setTime.tm_year, setTime.tm_yday); + + if(ret == 0) + { + timestamp = mktime(&setTime) + 24 * 3600; + + localtime_r(×tamp, &setTime); + } + } while(ret == 0); + + if(ret < 0) + { + pInfo->onTimestamp = 0; + pInfo->onDateTime.tm_year = -1; + pInfo->onDateTime.tm_mon = -1; + pInfo->onDateTime.tm_mday = -1; + } + else + { + pInfo->onDateTime.tm_year = setTime.tm_year; + pInfo->onDateTime.tm_mon = setTime.tm_mon; + pInfo->onDateTime.tm_mday = setTime.tm_mday; + pInfo->onTimestamp = mktime(&pInfo->onDateTime); + } + break; + + case REPEAT_MODE_HOLIDAY: + do + { + ret = CurrentIsWorkDay(setTime.tm_year, setTime.tm_yday); + + if(ret == 0) + { + timestamp = mktime(&setTime) + 24 * 3600; + + localtime_r(×tamp, &setTime); + } + } while(ret == 1); + + if(ret < 0) + { + pInfo->onTimestamp = 0; + pInfo->onDateTime.tm_year = -1; + pInfo->onDateTime.tm_mon = -1; + pInfo->onDateTime.tm_mday = -1; + } + else + { + pInfo->onDateTime.tm_year = setTime.tm_year; + pInfo->onDateTime.tm_mon = setTime.tm_mon; + pInfo->onDateTime.tm_mday = setTime.tm_mday; + pInfo->onTimestamp = mktime(&pInfo->onDateTime); + } + break; + + case REPEAT_MODE_WEEKEND: + while(setTime.tm_wday != 0 && setTime.tm_wday != 6) + { + timestamp = mktime(&setTime) + 24 * 3600; + localtime_r(×tamp, &setTime); + } + + pInfo->onDateTime.tm_year = setTime.tm_year; + pInfo->onDateTime.tm_mon = setTime.tm_mon; + pInfo->onDateTime.tm_mday = setTime.tm_mday; + pInfo->onTimestamp = mktime(&pInfo->onDateTime); + break; + + case REPEAT_MODE_WEEKDAY: + if(pInfo->setDateTime.tm_wday == 0) + { + pInfo->setDateTime.tm_wday = 1 << 0; + } + else if(pInfo->setDateTime.tm_wday & (1 << 7)) + { + pInfo->setDateTime.tm_wday = 1 << 0; + } + + while(((1 << setTime.tm_wday) & pInfo->setDateTime.tm_wday) == 0) + { + timestamp = mktime(&setTime) + 24 * 3600; + localtime_r(×tamp, &setTime); + } + + pInfo->onDateTime.tm_year = setTime.tm_year; + pInfo->onDateTime.tm_mon = setTime.tm_mon; + pInfo->onDateTime.tm_mday = setTime.tm_mday; + pInfo->onTimestamp = mktime(&pInfo->onDateTime); + + break; + + case REPEAT_MODE_EVERY_TIME: + timestamp = mktime(&g_LocalTime); + + if(pInfo->setDateTime.tm_hour > 0) + { + timestamp += pInfo->setDateTime.tm_hour * 3600; + } + + if(pInfo->setDateTime.tm_min > 0) + { + timestamp += pInfo->setDateTime.tm_min * 60; + } + + if(pInfo->setDateTime.tm_sec > 0) + { + timestamp += pInfo->setDateTime.tm_sec; + } + + localtime_r(×tamp, &pInfo->onDateTime); + pInfo->onTimestamp = timestamp; + break; + + case REPEAT_MODE_MONTH_LAST_DAY: + if(pInfo->onDateTime.tm_mon < 11) + { + pInfo->onDateTime.tm_mon++; + } + else + { + pInfo->onDateTime.tm_mon = 0; + pInfo->onDateTime.tm_year++; + } + + pInfo->onDateTime.tm_mday = g_DayOfMonth[pInfo->onDateTime.tm_mon]; + if(IS_LEAP_YEAR(pInfo->onDateTime.tm_year) && (pInfo->onDateTime.tm_mon == 1)) + { + pInfo->onDateTime.tm_mday += 1; + } + + pInfo->onTimestamp = mktime(&pInfo->onDateTime); + break; + } + + return (0); +} + +static int __getOnTimestamp(PALARM_ITEM_DATA pInfo) +{ + int ret = 0; + struct tm setTime; + time_t timestamp; + + if(pInfo == NULL) + { + return (-ERR_INPUT_PARAMS); + } + + if(pInfo->setDateTime.tm_hour == -1) + { + pInfo->onDateTime.tm_hour = g_LocalTime.tm_hour; + } + else + { + pInfo->onDateTime.tm_hour = pInfo->setDateTime.tm_hour; + } + + if(pInfo->setDateTime.tm_min == -1) + { + pInfo->onDateTime.tm_min = g_LocalTime.tm_min; + } + else + { + pInfo->onDateTime.tm_min = pInfo->setDateTime.tm_min; + } + + if(pInfo->setDateTime.tm_sec == -1) + { + pInfo->onDateTime.tm_sec = g_LocalTime.tm_sec; + } + else + { + pInfo->onDateTime.tm_sec = pInfo->setDateTime.tm_sec; + } + + switch(pInfo->repeatMode) + { + case REPEAT_MODE_EVERY_MONTH_DAY: + case REPEAT_MODE_EVERY_YEAR_DAY: + case REPEAT_MODE_NONE: + if(pInfo->setDateTime.tm_year == -1) + { + pInfo->onDateTime.tm_year = g_LocalTime.tm_year; + } + else + { + pInfo->onDateTime.tm_year = pInfo->setDateTime.tm_year; + } + + if(pInfo->setDateTime.tm_mon == -1) + { + pInfo->onDateTime.tm_mon = g_LocalTime.tm_mon; + } + else + { + pInfo->onDateTime.tm_mon = pInfo->setDateTime.tm_mon; + } + + if(pInfo->setDateTime.tm_mday == -1) + { + pInfo->onDateTime.tm_mday = g_LocalTime.tm_mday; + } + else + { + pInfo->onDateTime.tm_mday = pInfo->setDateTime.tm_mday; + } + break; + + case REPEAT_MODE_EVERY_DAY: + case REPEAT_MODE_WORKDAY: + case REPEAT_MODE_WEEKEND: + case REPEAT_MODE_WEEKDAY: + case REPEAT_MODE_EVERY_TIME: + case REPEAT_MODE_HOLIDAY: + pInfo->onDateTime.tm_year = g_LocalTime.tm_year; + pInfo->onDateTime.tm_mon = g_LocalTime.tm_mon; + pInfo->onDateTime.tm_mday = g_LocalTime.tm_mday; + break; + case REPEAT_MODE_MONTH_LAST_DAY: + pInfo->onDateTime.tm_year = g_LocalTime.tm_year; + pInfo->onDateTime.tm_mon = g_LocalTime.tm_mon; + pInfo->onDateTime.tm_mday = g_DayOfMonth[g_LocalTime.tm_mon]; + if(IS_LEAP_YEAR(g_LocalTime.tm_year) && (g_LocalTime.tm_mon == 1)) + { + pInfo->onDateTime.tm_mday += 1; + } + break; + } + + pInfo->onDateTime.tm_wday = g_LocalTime.tm_wday; + pInfo->onDateTime.tm_yday = g_LocalTime.tm_yday; + pInfo->onTimestamp = mktime(&pInfo->onDateTime); + + if(pInfo->repeatMode == REPEAT_MODE_NONE) + { + return (0); + } + + memcpy(&setTime, &g_LocalTime, sizeof(struct tm)); + + if(mktime(&setTime) > (pInfo->onTimestamp + 1)) + { + if(pInfo->repeatMode == REPEAT_MODE_EVERY_MONTH_DAY) + { + if(pInfo->onDateTime.tm_mon < 11) + { + pInfo->onDateTime.tm_mon++; + } + else + { + pInfo->onDateTime.tm_mon = 0; + pInfo->onDateTime.tm_year++; + } + + pInfo->onTimestamp = mktime(&pInfo->onDateTime); + return (0); + } + else if(pInfo->repeatMode == REPEAT_MODE_EVERY_YEAR_DAY) + { + pInfo->onDateTime.tm_year++; + pInfo->onTimestamp = mktime(&pInfo->onDateTime); + return (0); + } + else if(pInfo->repeatMode == REPEAT_MODE_MONTH_LAST_DAY) + { + if(pInfo->onDateTime.tm_mon < 11) + { + pInfo->onDateTime.tm_mon++; + } + else + { + pInfo->onDateTime.tm_mon = 0; + pInfo->onDateTime.tm_year++; + } + + pInfo->onDateTime.tm_mday = g_DayOfMonth[pInfo->onDateTime.tm_mon]; + if(IS_LEAP_YEAR(pInfo->onDateTime.tm_year) && (pInfo->onDateTime.tm_mon == 1)) + { + pInfo->onDateTime.tm_mday += 1; + } + + pInfo->onTimestamp = mktime(&pInfo->onDateTime); + return (0); + } + else + { + timestamp = mktime(&setTime) + 24 * 3600; + localtime_r(×tamp, &setTime); + } + } + + switch(pInfo->repeatMode) + { + case REPEAT_MODE_EVERY_DAY: + pInfo->onDateTime.tm_year = setTime.tm_year; + pInfo->onDateTime.tm_mon = setTime.tm_mon; + pInfo->onDateTime.tm_mday = setTime.tm_mday; + pInfo->onTimestamp = mktime(&pInfo->onDateTime); + break; + + case REPEAT_MODE_WORKDAY: + do + { + ret = CurrentIsWorkDay(setTime.tm_year, setTime.tm_yday); + + if(ret == 0) + { + timestamp = mktime(&setTime) + 24 * 3600; + + localtime_r(×tamp, &setTime); + } + } while(ret == 0); + + if(ret < 0) + { + pInfo->onTimestamp = 0; + pInfo->onDateTime.tm_year = -1; + pInfo->onDateTime.tm_mon = -1; + pInfo->onDateTime.tm_mday = -1; + } + else + { + pInfo->onDateTime.tm_year = setTime.tm_year; + pInfo->onDateTime.tm_mon = setTime.tm_mon; + pInfo->onDateTime.tm_mday = setTime.tm_mday; + pInfo->onTimestamp = mktime(&pInfo->onDateTime); + } + break; + + case REPEAT_MODE_HOLIDAY: + do + { + ret = CurrentIsWorkDay(setTime.tm_year, setTime.tm_yday); + + if(ret == 0) + { + timestamp = mktime(&setTime) + 24 * 3600; + + localtime_r(×tamp, &setTime); + } + } while(ret == 1); + + if(ret < 0) + { + pInfo->onTimestamp = 0; + pInfo->onDateTime.tm_year = -1; + pInfo->onDateTime.tm_mon = -1; + pInfo->onDateTime.tm_mday = -1; + } + else + { + pInfo->onDateTime.tm_year = setTime.tm_year; + pInfo->onDateTime.tm_mon = setTime.tm_mon; + pInfo->onDateTime.tm_mday = setTime.tm_mday; + pInfo->onTimestamp = mktime(&pInfo->onDateTime); + } + break; + + case REPEAT_MODE_WEEKEND: + while(setTime.tm_wday != 0 && setTime.tm_wday != 6) + { + timestamp = mktime(&setTime) + 24 * 3600; + localtime_r(×tamp, &setTime); + } + + pInfo->onDateTime.tm_year = setTime.tm_year; + pInfo->onDateTime.tm_mon = setTime.tm_mon; + pInfo->onDateTime.tm_mday = setTime.tm_mday; + pInfo->onTimestamp = mktime(&pInfo->onDateTime); + break; + + case REPEAT_MODE_WEEKDAY: + if(pInfo->setDateTime.tm_wday == 0) + { + pInfo->setDateTime.tm_wday = 1 << 0; + } + else if(pInfo->setDateTime.tm_wday & (1 << 7)) + { + pInfo->setDateTime.tm_wday = 1 << 0; + } + + while(((1 << setTime.tm_wday) & pInfo->setDateTime.tm_wday) == 0) + { + timestamp = mktime(&setTime) + 24 * 3600; + localtime_r(×tamp, &setTime); + } + + pInfo->onDateTime.tm_year = setTime.tm_year; + pInfo->onDateTime.tm_mon = setTime.tm_mon; + pInfo->onDateTime.tm_mday = setTime.tm_mday; + pInfo->onTimestamp = mktime(&pInfo->onDateTime); + + break; + + case REPEAT_MODE_EVERY_TIME: + timestamp = mktime(&g_LocalTime); + + if(pInfo->setDateTime.tm_hour > 0) + { + timestamp += pInfo->setDateTime.tm_hour * 3600; + } + + if(pInfo->setDateTime.tm_min > 0) + { + timestamp += pInfo->setDateTime.tm_min * 60; + } + + if(pInfo->setDateTime.tm_sec > 0) + { + timestamp += pInfo->setDateTime.tm_sec; + } + + localtime_r(×tamp, &pInfo->onDateTime); + pInfo->onTimestamp = timestamp; + break; + } + + return (0); +} + +static void __timerout200msCb(uv_timer_t *pTimer) +{ + PALARM_ITEM_DATA pItem = NULL, pTemp = NULL; + + // upgrade current time and timestamp + g_TimeStamp = time((time_t*)NULL); + localtime_r(&g_TimeStamp, &g_LocalTime); + + uv_rwlock_wrlock(&g_uvHashRwLock); + HASH_ITER(hh, g_TimerTbl, pItem, pTemp) + { + // cleanup out of time more than 10s timer + if(g_TimeStamp - pItem->onTimestamp > 10) + { + LOG_EX(LOG_Warn, "Remove out of time timer: %u, %ld, %ld\n", pItem->alarmId, g_TimeStamp, pItem->onTimestamp); + HASH_DEL(g_TimerTbl, pItem); + free(pItem); + + continue; + } + + // timer not on time + if(pItem->onTimestamp != g_TimeStamp) + { + break; + } + + // timer on time, call callback + if(pItem->pOnAlarmCb) + { + pItem->pOnAlarmCb(pItem->alarmId, g_TimeStamp, pItem->pUserData); + } + + //LOG_EX(LOG_Debug, "Timer %d Alarming..................\n", pItem->alarmId); + + // cleanup not repeat timer + if(pItem->repeatMode == REPEAT_MODE_NONE) + { + HASH_DEL(g_TimerTbl, pItem); + free(pItem); + } + else + { + // calc next on time + int ret = __getNextOnTimestamp(pItem); + + if(ret != 0 || pItem->onTimestamp == 0) + { + // some error, remove it + LOG_EX(LOG_Error, "Timer %d repeat error: ret = %d, timestamp = %u\n", pItem->alarmId, ret, pItem->onTimestamp); + HASH_DEL(g_TimerTbl, pItem); + free(pItem); + } + else + { + // resort table by upgrade timestamp + HASH_SORT(g_TimerTbl, __timestampSort); + + // show log + LOG_EX(LOG_Debug, "Readd Timer: %u at [%04u-%02u-%02u %02u:%02u:%02u], repMode = %s, Timestamp = %u\n", + pItem->alarmId, + pItem->onDateTime.tm_year + 1900, + pItem->onDateTime.tm_mon + 1, + pItem->onDateTime.tm_mday, + pItem->onDateTime.tm_hour, + pItem->onDateTime.tm_min, + pItem->onDateTime.tm_sec, + DumpTimerRepeatModeString(pItem->repeatMode), + pItem->onTimestamp); + } + } + } + uv_rwlock_wrunlock(&g_uvHashRwLock); +} + +int AlarmTimerInit(uv_loop_t* pLoop) +{ + g_pMainLoop = pLoop; + uv_rwlock_init(&g_uvHashRwLock); + uv_timer_init(g_pMainLoop, &g_uvTimer); + + g_TimeStamp = time((time_t*)NULL); + localtime_r(&g_TimeStamp, &g_LocalTime); + + g_iAlarmId = 1; + + uv_timer_start(&g_uvTimer, __timerout200msCb, 0, TIMER_TIMEOUT); +} + +int AlarmTimerCleanup(void) +{ + uv_timer_stop(&g_uvTimer); + uv_rwlock_destroy(&g_uvHashRwLock); + + if(g_pMainLoop != NULL) + { + AlarmTimerInit(g_pMainLoop); + } +} + +int AlarmTimerRemove(unsigned int tmId) +{ + PALARM_ITEM_DATA pItem = NULL; + + uv_rwlock_rdlock(&g_uvHashRwLock); + HASH_FIND_INT(g_TimerTbl, &tmId, pItem); + uv_rwlock_rdunlock(&g_uvHashRwLock); + + if(pItem == NULL) + { + LOG_EX(LOG_Error, "Can't find item: %u\n", tmId); + return (-ERR_NO_ITEMS); + } + + uv_rwlock_wrlock(&g_uvHashRwLock); + HASH_DEL(g_TimerTbl, pItem); + uv_rwlock_wrunlock(&g_uvHashRwLock); + free(pItem); + + return (tmId); +} + +unsigned int AlarmTimerAdd(int year, + int month, + int day, + int hour, + int minute, + int second, + int weekDay, + int repMode, + OnAlarmTimer pOnTimerCb, + int priority, + void *pUserData, + int *pError) +{ + int et; + PALARM_ITEM_DATA pAlarmData = NULL; + + if(pOnTimerCb == NULL) + { + LOG_EX(LOG_Error, "Input Params Error: pOnTimerCb = %p\n", pOnTimerCb); + if(pError) + { + *pError = -ERR_INPUT_PARAMS; + } + + return (0xFFFFFFFF); + } + + g_TimeStamp = time((time_t*)NULL); + localtime_r(&g_TimeStamp, &g_LocalTime); + + pAlarmData = (PALARM_ITEM_DATA)malloc(sizeof(ALARM_ITEM_DATA)); + + if(pAlarmData == NULL) + { + LOG_EX(LOG_Error, "Malloc Memory Error\n"); + + if(pError) + { + *pError = -ERR_MALLOC_MEMORY; + } + + return (0xFFFFFFFF); + } + + memset(pAlarmData, 0, sizeof(ALARM_ITEM_DATA)); + + // save input params + pAlarmData->setDateTime.tm_year = year; + pAlarmData->setDateTime.tm_mon = month; + pAlarmData->setDateTime.tm_mday = day; + pAlarmData->setDateTime.tm_hour = hour; + pAlarmData->setDateTime.tm_min = minute; + pAlarmData->setDateTime.tm_sec = second; + pAlarmData->setDateTime.tm_wday = weekDay; + + pAlarmData->repeatMode = repMode; + pAlarmData->pOnAlarmCb = pOnTimerCb; + pAlarmData->pUserData = pUserData; + pAlarmData->timerPriority = priority; + + // get timer on time + __getOnTimestamp(pAlarmData); + + // check on time + et = pAlarmData->onTimestamp - mktime(&g_LocalTime); + + if(et < -1 || pAlarmData->onTimestamp == 0) + { + LOG_EX(LOG_Debug, "Add Timer Error: [%04u-%02u-%02u %02u:%02u:%02u], repMode = %s(%u), %d, %u/%u\n", + pAlarmData->setDateTime.tm_year + 1900, + pAlarmData->setDateTime.tm_mon + 1, + pAlarmData->setDateTime.tm_mday, + pAlarmData->setDateTime.tm_hour, + pAlarmData->setDateTime.tm_min, + pAlarmData->setDateTime.tm_sec, + DumpTimerRepeatModeString(repMode), repMode, + et, pAlarmData->onTimestamp, mktime(&g_LocalTime)); + + if(pError) + { + *pError = -ERR_INPUT_PARAMS; + } + + return (0xFFFFFFFF); + } + + if(pError) + { + *pError = 0; + } + + // upgrade time global id + pAlarmData->alarmId = __sync_fetch_and_add(&g_iAlarmId, 1); + + // save new timer to hash table, and sort it by timestamp + uv_rwlock_wrlock(&g_uvHashRwLock); + HASH_ADD_INT(g_TimerTbl, alarmId, pAlarmData); + HASH_SORT(g_TimerTbl, __timestampSort); + uv_rwlock_wrunlock(&g_uvHashRwLock); + + LOG_EX(LOG_Debug, "Add: %u [%04u-%02u-%02u %02u:%02u:%02u] at [%04u-%02u-%02u %02u:%02u:%02u], repMode = %s, priority = %d, Timestamp = %u\n", + pAlarmData->alarmId, + (pAlarmData->setDateTime.tm_year == -1) ? 1900 : pAlarmData->setDateTime.tm_year + 1900, + (pAlarmData->setDateTime.tm_mon == -1) ? 0 : pAlarmData->setDateTime.tm_mon + 1, + (pAlarmData->setDateTime.tm_mday == -1) ? 0 : pAlarmData->setDateTime.tm_mday, + (pAlarmData->setDateTime.tm_hour == -1) ? 0 : pAlarmData->setDateTime.tm_hour, + (pAlarmData->setDateTime.tm_min == -1) ? 0 : pAlarmData->setDateTime.tm_min, + (pAlarmData->setDateTime.tm_sec == -1) ? 0 : pAlarmData->setDateTime.tm_sec, + pAlarmData->onDateTime.tm_year + 1900, + pAlarmData->onDateTime.tm_mon + 1, + pAlarmData->onDateTime.tm_mday, + pAlarmData->onDateTime.tm_hour, + pAlarmData->onDateTime.tm_min, + pAlarmData->onDateTime.tm_sec, + DumpTimerRepeatModeString(repMode), + pAlarmData->timerPriority, + pAlarmData->onTimestamp); + + return (pAlarmData->alarmId); +} + + diff --git a/Framework/WireshartScript/log_pv1.lua b/Framework/WireshartScript/log_pv1.lua new file mode 100644 index 0000000..c5edfdd --- /dev/null +++ b/Framework/WireshartScript/log_pv1.lua @@ -0,0 +1,93 @@ +pv1_log_proto = Proto("PV1_Log", "PV1 ES2 Log Protocol") + +log_level_str = +{ + [ 1 ] = "[F]", + [ 2 ] = "[E]", + [ 4 ] = "[W]", + [ 8 ] = "[D]", + [ 16 ] = "[I]", + [ 32 ] = "[T]", + [ 64 ] = "[I]", + [ 128 ] = "[V]", + [ 256 ] = "[S]", + [ 512 ] = "[U]", + [ 0xFFFFFFFF ] = "[A]", +} + +local log_content = ProtoField.string("logContent", "Message:\t") +local log_Seq = ProtoField.uint16("logSeq", "Sequence: \t", base.DEC) +local log_pid = ProtoField.uint32("logPid", "PID: \t\t", base.DEC) +local log_datetime = ProtoField.string("logDateTime", "DateTime:\t\t") +local log_time = ProtoField.string("logTime", "Date:\t\t") +local log_level = ProtoField.uint32("logLevel", "Level: \t\t", base.DEC, log_level_str) + +pv1_log_proto.fields = { +log_Seq, log_content, log_pid, log_datetime, log_level +} + +function pv1_log_proto.dissector(buffer, pinfo, tree) + pinfo.cols.protocol:set("LOG") + local offset = 0 + local buf_len = buffer:len() + local logInfoTree = tree:add(pv1_log_proto, buffer(0, 18), "Log Message Information") + + logInfoTree:add(log_Seq, buffer(offset, 2)) + offset = offset + 2 + + local l_pid = buffer(offset, 4):uint() + logInfoTree:add(log_pid, buffer(offset, 4)) + offset = offset + 4 + + local l_second = buffer(offset, 4):uint() + offset = offset + 4 + + local l_nsecond = buffer(offset, 4):uint() + offset = offset + 4 + + logInfoTree:add(log_datetime, "[" .. os.date("%c", l_second) .. "." .. string.format("%03d", l_nsecond / 1000) .. "]") + + local l_level = buffer(offset, 4):uint() + local l_lvStr + + if l_level == 1 then + l_lvStr = "F" + elseif l_level == 2 then + l_lvStr = "E" + elseif l_level == 4 then + l_lvStr = "W" + elseif l_level == 8 then + l_lvStr = "D" + elseif l_level == 16 then + l_lvStr = "I" + elseif l_level == 32 then + l_lvStr = "T" + elseif l_level == 64 then + l_lvStr = "C" + elseif l_level == 128 then + l_lvStr = "V" + elseif l_level == 256 then + l_lvStr = "S" + elseif l_level == 0xFFFFFFFF then + l_lvStr = "A" + else + l_lvStr = "U" + end + + logInfoTree:add(log_level, buffer(offset, 4)) + offset = offset + 4 + + local logInfo = buffer(offset, buf_len - 19):string() + local logMsgTree = tree:add(pv1_log_proto, buffer(18, buf_len - 18), "Log Message Content") + logMsgTree:add(log_content, logInfo) + + if buffer(buf_len - 1, 1):string() == '\n' then + pinfo.cols.info:set("{" .. tostring(l_pid) .. "} [" .. os.date("%X", l_second) .. "." .. string.format("%03d", l_nsecond / 1000) .. "] [" .. tostring(l_lvStr) .. "] " .. buffer(18, buf_len - 19):string()) + else + pinfo.cols.info:set("{" .. tostring(l_pid) .. "} [" .. os.date("%X", l_second) .. "." .. string.format("%03d", l_nsecond / 1000) .. "] [" .. tostring(l_lvStr) .. "] " .. buffer(18, buf_len - 18):string()) + end +end + +local pv1_log_udp_port_table = DissectorTable.get("udp.port") +--local pv1_log_port = 10000 +pv1_log_udp_port_table:add("10000-10020", pv1_log_proto) diff --git a/Framework/libuvEngine/libuv_dbus.c b/Framework/libuvEngine/libuv_dbus.c new file mode 100644 index 0000000..f99ed88 --- /dev/null +++ b/Framework/libuvEngine/libuv_dbus.c @@ -0,0 +1,2308 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "log.h" +#include "libuv_dbus.h" +#include "json_struct.h" +#include "inet_api.h" +#include "crypto.h" +#include "server_addr.h" +#ifdef ENABLE_COUNT_DEBUG +#include "monitor.h" +#endif + +#ifdef ENABLE_COUNT_DEBUG +#define MON_MSG_PROC_STAT ("Message Process") +#define MON_MSG_BST_PROC_STAT ("Boardcast Message Process") +#define MON_USER_MSG_PROC_STAT ("User Message Process") +#define MON_USER_MSG_BST_PROC_STAT ("User Boardcast Message Process") +#endif + +typedef void (*OnDBusSendError)(int, void*); +static void uvOpenKeyEventCb(uv_fs_t* puvFs); + +typedef struct LOOP_TASK_ARRAY +{ + uv_loop_t* pLoop; + int isRunning; + + struct LOOP_TASK_ARRAY *next, *prev; +} *PLOOP_TASK_ARRAY; + +typedef struct +{ + key_t shmKey; +// uint32_t tarMask; +// uint32_t tmSend; + uint32_t msgSize; + + UT_hash_handle hh; ///< UT Hash handle +} UV_SHM_ITEM, *PUV_SHM_ITEM; + +typedef struct +{ + long int msgMask; + unsigned char pMsgContext[0]; +} DBUS_MSG_DATA, *PDBUS_MSG_DATA; + +typedef struct +{ + DBusConnection* pBus; + const char* pBusName; + uint32_t busCmd; + JSON_ENGINE_TYPE type; + void* pStruct; + int iSize; + OnDBusAsyncSendTo cbSendTo; + int enBase64; +} DBUS_ASYNC_PARAMS, *PDBUS_ASYNC_PARAMS; + +static LIBUV_DBUS_PARAMS g_LibuvDBusParam; + +static uv_idle_t g_uvIdleHandle; +static uv_timer_t g_uvTimerPing; +static uv_fs_t g_uvKeyEvent; +static WORKDAY_INFO g_workDayArray; +static WIFI_STATUS g_WifiConnStatus = WIFI_CONNECTED; +static PDBUS_MSG_PROC g_pMsgProcList = NULL; +static uv_rwlock_t g_uvLoopRwLock; +static PLOOP_TASK_ARRAY g_LoopArray = NULL; +static unsigned int g_EnHBLExit = TRUE; +static uv_rwlock_t g_uvMsgProcRwLock; + +#if USED_SHM_TO_DBUS +static uv_rwlock_t g_uvShmHashRwLock; +static PUV_SHM_ITEM g_pShmTbl = NULL; + +static void __addShmIdToTable(key_t shmKey, uint32_t tmSend, uint32_t tarMask, uint32_t msgSize) +{ + PUV_SHM_ITEM pItem = NULL; + + uv_rwlock_rdlock(&g_uvShmHashRwLock); + HASH_FIND_INT(g_pShmTbl, &shmKey, pItem); + uv_rwlock_rdunlock(&g_uvShmHashRwLock); + + if(pItem == NULL) + { + pItem = (PUV_SHM_ITEM)malloc(sizeof(UV_SHM_ITEM)); + + memset(pItem, 0, sizeof(UV_SHM_ITEM)); + pItem->shmKey = shmKey; + + uv_rwlock_wrlock(&g_uvShmHashRwLock); + HASH_ADD_INT(g_pShmTbl, shmKey, pItem); + uv_rwlock_wrunlock(&g_uvShmHashRwLock); + } + + pItem->tmSend = tmSend; + pItem->tarMask = tarMask; + pItem->msgSize = msgSize; +} + +static void __removeReqIdFromTable(key_t shmKey) +{ + PUV_SHM_ITEM pItem = NULL; + + uv_rwlock_rdlock(&g_uvShmHashRwLock); + HASH_FIND_INT(g_pShmTbl, &shmKey, pItem); + uv_rwlock_rdunlock(&g_uvShmHashRwLock); + + if(pItem != NULL) + { + uv_rwlock_wrlock(&g_uvShmHashRwLock); + HASH_DEL(g_pShmTbl, pItem); + uv_rwlock_wrunlock(&g_uvShmHashRwLock); + free(pItem); + } +} + +static void __uvShmTblTaskThreadCb(void *pParam) +{ + struct timeval tv; + PUV_SHM_ITEM pItem = NULL, pTmpItem = NULL; + + while(TRUE) + { + gettimeofday(&tv, NULL); + + HASH_ITER(hh, g_pShmTbl, pItem, pTmpItem) + { + int msgId; + + if(tv.tv_sec - pItem->tmSend <= 60) + { + continue; + } + + msgId = shmget((key_t)pItem->shmKey, pItem->msgSize, 0666 | IPC_CREAT); + + if(msgId == -1) + { + continue; + } + + // Not Boardcast Message + if((pItem->tarMask & 0xFFFF0000) != 0xFFFF0000) + { + PDBUS_MSG_DATA pData = (PDBUS_MSG_DATA)shmat(msgId, NULL, 0); + + if(pData == (void*)-1) + { + continue; + } + + // Nevery Recevied By Anyone + if(pData->msgMask == pItem->tarMask) + { + continue; + } + + shmdt(pData); + shmctl(msgId, IPC_RMID, 0); + __removeReqIdFromTable((key_t)pItem->shmKey); + } + } + + sleep(1); + } + + pthread_detach(pthread_self()); +} +#endif + +PLIBUV_DBUS_PARAMS DBusLibuvGetRuntime(void) +{ + if(g_LibuvDBusParam.pBus == NULL || g_LibuvDBusParam.pLoop == NULL) + { + return NULL; + } + + return &g_LibuvDBusParam; +} + +MODULE_NAME DBusLibGetModName(void) +{ + return g_LibuvDBusParam.modName; +} + +uv_loop_t* GetDBusDefaultLoop(void) +{ + if(g_LibuvDBusParam.pBus == NULL || g_LibuvDBusParam.pLoop == NULL) + { + return uv_default_loop(); + } + + return g_LibuvDBusParam.pLoop; +} + +static void uvAsyncCb(uv_async_t* pAsync) +{ + DBusConnection* pConn = (DBusConnection*)pAsync->data; + dbus_connection_read_write(pConn, 0); + + while(dbus_connection_dispatch(pConn) == DBUS_DISPATCH_DATA_REMAINS); +} + +static void uvTimeoutCb(uv_timer_t* pTimer) +{ + DBusTimeout* timeout = (DBusTimeout*)pTimer->data; + dbus_timeout_handle(timeout); +} + +static void uvPollCb(uv_poll_t* pPoll, int status, int events) +{ + DBusWatch* watch = (DBusWatch*)pPoll->data; + unsigned int uvFlags = 0; + + if(events & UV_READABLE) + { + uvFlags |= DBUS_WATCH_READABLE; + } + + if(events & UV_WRITABLE) + { + uvFlags |= DBUS_WATCH_WRITABLE; + } + + dbus_watch_handle(watch, uvFlags); +} + +static void uvIdleCb(uv_idle_t* phuvIdle) +{ + usleep(1000); +} + +static void uvFsAccessCb(uv_fs_t* puvFs) +{ + if(puvFs->result != 0) + { + IHW_EnableLogLevel((LOG_LEVEL)(LOG_Fatal | LOG_Error | LOG_Warn | LOG_Debug | LOG_Info), 1); + } + + uv_fs_req_cleanup(puvFs); + free(puvFs); +} + +static void uvReadKeyEventCb(uv_fs_t* puvFs) +{ + if(puvFs->result < 0) + { + uv_fs_req_cleanup(puvFs); + return; + } + else if(puvFs->result == 0) + { + uv_fs_t uvClose; + uv_fs_close(g_LibuvDBusParam.pLoop, &uvClose, g_uvKeyEvent.result, NULL); + } + else + { + uv_buf_t* puvIov = (uv_buf_t*)puvFs->data; + + if(puvIov->len == sizeof(struct input_event)) + { + struct input_event* pKeyEvt = (struct input_event*)puvIov->base; + + if(g_LibuvDBusParam.onKeyCb) + { +// LOG_EX(LOG_Info, "type = %u, code = %u, value = %u\n", pKeyEvt->type, pKeyEvt->code, pKeyEvt->value); + g_LibuvDBusParam.onKeyCb(pKeyEvt->type, pKeyEvt->code, pKeyEvt->value); + } + } + } + + uv_fs_req_cleanup(puvFs); + + usleep(1000); + uv_fs_open(g_LibuvDBusParam.pLoop, &g_uvKeyEvent, R16_TINA_KEY_EVENT_PATH, O_RDONLY, 0, uvOpenKeyEventCb); +} + +static void uvOpenKeyEventCb(uv_fs_t* puvFs) +{ + static uv_buf_t uvIoV; + static struct input_event keyEvent; + + if(puvFs->result < 0) + { + LOG_EX(LOG_Error, "Open Key Event File[%s] Error: %d\n", R16_TINA_KEY_EVENT_PATH, puvFs->result); + uv_fs_req_cleanup(puvFs); + return; + } + + uvIoV = uv_buf_init((void*)&keyEvent, sizeof(struct input_event)); + puvFs->data = (void*)&uvIoV; + + uv_fs_read(g_LibuvDBusParam.pLoop, &g_uvKeyEvent, puvFs->result, &uvIoV, 1, -1, uvReadKeyEventCb); + uv_fs_req_cleanup(puvFs); + + return; +} + +static void DBusAsyncFreeCb(void* pData) +{ + uv_async_t* pAsync = (uv_async_t*)pData; + + if(pAsync) + { + pAsync->data = NULL; + uv_close((uv_handle_t*)pAsync, (uv_close_cb)free); + } +} + +static void DBusPollFreeCb(void* pData) +{ + uv_poll_t* pPoll = (uv_poll_t*)pData; + + if(pPoll) + { + pPoll->data = NULL; + + uv_ref((uv_handle_t*)pPoll); + uv_poll_stop(pPoll); + uv_close((uv_handle_t*)pPoll, (uv_close_cb)free); + } +} + +static dbus_bool_t DBusAddWatchCb(DBusWatch* pWatch, void* pData) +{ + static int isCreate = 0; + int fdDBus, uvPollFlags = 0; + unsigned int dBusWatchFlags; + uv_poll_t* pPoll = NULL; + uv_loop_t* pLoop = (uv_loop_t*)pData; + + if(!dbus_watch_get_enabled(pWatch) + || dbus_watch_get_data(pWatch) != NULL + || isCreate != 0) + { + return TRUE; + } + + fdDBus = dbus_watch_get_unix_fd(pWatch); + dBusWatchFlags = dbus_watch_get_flags(pWatch); + + if(dBusWatchFlags & DBUS_WATCH_READABLE) + { + uvPollFlags |= UV_READABLE; + } + + if(dBusWatchFlags & DBUS_WATCH_WRITABLE) + { + uvPollFlags |= UV_WRITABLE; + } + + pPoll = (uv_poll_t*)malloc(sizeof(uv_poll_t)); + pPoll->data = (void*)pWatch; + + uv_poll_init(pLoop, pPoll, fdDBus); + uv_poll_start(pPoll, uvPollFlags, uvPollCb); + LOG_EX(LOG_Debug, "Create POOL by FD: %d\n", fdDBus); + + uv_unref((uv_handle_t*)pPoll); + + dbus_watch_set_data(pWatch, (void*)pPoll, DBusPollFreeCb); + + isCreate = 1; + return TRUE; +} + +static void DBusRemoveWatchCb(DBusWatch* pWatch, void* pData) +{ + uv_poll_t* pPoll = (uv_poll_t*)dbus_watch_get_data(pWatch); + + if(pPoll) + { + dbus_watch_set_data(pWatch, NULL, NULL); + } +} + +static void DBusNotifyWatchCb(DBusWatch* pWatch, void* pData) +{ + if(dbus_watch_get_enabled(pWatch)) + { + DBusAddWatchCb(pWatch, pData); + } + else + { + DBusRemoveWatchCb(pWatch, pData); + } +} + +static void DBusTimeoutFreeCb(void* pData) +{ + uv_timer_t* pTimer = (uv_timer_t*)pData; + + if(pTimer == NULL) + { + return; + } + + pTimer->data = NULL; + uv_timer_stop(pTimer); + uv_unref((uv_handle_t*)pTimer); + uv_close((uv_handle_t*)pTimer, (uv_close_cb)free); +} + +static dbus_bool_t DBusAddTimeoutCb(DBusTimeout* pTimeout, void* pData) +{ + uv_timer_t* pTimer = NULL; + uv_loop_t* pLoop = (uv_loop_t*)pData; + + if(!dbus_timeout_get_enabled(pTimeout) + || dbus_timeout_get_data(pTimeout) != NULL) + { + return TRUE; + } + + pTimer = (uv_timer_t*)malloc(sizeof(uv_timer_t)); + pTimer->data = pTimeout; + + uv_timer_init(pLoop, pTimer); + uv_timer_start(pTimer, uvTimeoutCb, dbus_timeout_get_interval(pTimeout), 0); + + dbus_timeout_set_data(pTimeout, (void*)pTimer, DBusTimeoutFreeCb); + return TRUE; +} + +static void DBusRemoveTimeoutCb(DBusTimeout* pTimeout, void* pData) +{ + uv_timer_t* pTimer = (uv_timer_t*)dbus_timeout_get_data(pTimeout); + + if(pTimer) + { + dbus_timeout_set_data(pTimeout, NULL, NULL); + } +} + +static void DBusNotifyTimeoutCb(DBusTimeout* pTimeout, void* pData) +{ + if(dbus_timeout_get_enabled(pTimeout)) + { + DBusAddTimeoutCb(pTimeout, pData); + } + else + { + DBusRemoveTimeoutCb(pTimeout, pData); + } +} + +static void DBusWakeupMainLoopCb(void* pData) +{ + uv_async_t* pAsync = (uv_async_t*)pData; + uv_async_send(pAsync); +} + +static void FreeDBusOnMsgCb(uv_work_t* pWork, int status) +{ + PDBUS_MSG_PACK pMsg = (PDBUS_MSG_PACK)pWork->data; + + if(pMsg) + { + free(pMsg); + } + free(pWork); +} + +#if 0 +static void DBusOnBoardcastMsgWorkCb(uv_work_t* pWork) +#else +static int DBusOnBoardcastMsgWorkCb(PDBUS_MSG_PACK pMsg) +#endif +{ + + pMsg->isBstMsg = TRUE; + // Message context on dbus message pad + if(pMsg->msgSize < DBUS_MSG_MAX_PAD_SIZE) + { + if(pMsg->busCmd == CMD_WIFI_STATE_NTF) + { + int err = 0; + PWIFI_STATUS_PRO pWifiInfo = (PWIFI_STATUS_PRO)Json2Struct((const char *)pMsg->pMsg, + JSON_WIFI_STATUS_NOTIFY, FALSE, &err); + + //LOG_EX(LOG_Debug, "pWifiInfo: %s\n", pMsg->pMsg); + if(pWifiInfo && err == 0) + { + if(pWifiInfo->wifi_evt == 0) + { + g_WifiConnStatus = WIFI_CONNECTED; + } + else + { + g_WifiConnStatus = WIFI_DISCONNECTED; + } + } + + if(pWifiInfo) + { + free(pWifiInfo); + } + } + else if(pMsg->busCmd == CMD_CFG_UPG_NOTIFY) + { + } + else if(pMsg->busCmd == CMD_LOG_CONFIG) + { + int err = 0; + PLOG_CFG_PROTOCOL pCfgInfo = (PLOG_CFG_PROTOCOL)Json2Struct((const char *)pMsg->pMsg, + JSON_ENGINE_LOG_CFG_CMD, FALSE, &err); + + //LOG_EX(LOG_Debug, "pCfgInfo: %s\n", pMsg->pMsg); + if(pCfgInfo && err == 0) + { + UpgradLogConfigure(pCfgInfo); + } + + if(pCfgInfo) + { + free(pCfgInfo); + } + } + else if(pMsg->busCmd != CMD_MISC_PING) + { + pMsg->msgDests = 0xFFFFFFFF; + if(g_LibuvDBusParam.onMsgCb) + { + g_LibuvDBusParam.onMsgCb(g_LibuvDBusParam.pLoop, g_LibuvDBusParam.pBus, pMsg); + } + + return 1; + } + } + + return 0; +} + +#if 0 +static void DBusOnMsgWorkAPICb(uv_work_t* pWork) +#else +static int DBusOnMsgWorkAPICb(PDBUS_MSG_PACK pMsg) +#endif +{ + int err = 0; + + pMsg->isBstMsg = FALSE; + + // Message context on dbus message pad + if(pMsg->msgSize < DBUS_MSG_MAX_PAD_SIZE) + { + if(pMsg->busCmd >= CMD_CFG_ADD_REQ && pMsg->busCmd < CMD_CFG_UPG_NOTIFY) + { + OnCfgMsgProcess(pMsg->msgSrc, pMsg->busCmd, pMsg->pMsg); + } + else if(pMsg->busCmd == CMD_LOG_CONFIG) + { + PLOG_CFG_PROTOCOL pCfgInfo = (PLOG_CFG_PROTOCOL)Json2Struct((const char *)pMsg->pMsg, + JSON_ENGINE_LOG_CFG_CMD, FALSE, &err); + + //LOG_EX(LOG_Debug, "pCfgInfo: %s\n", pMsg->pMsg); + if(pCfgInfo && err == 0) + { + UpgradLogConfigure(pCfgInfo); + } + + if(pCfgInfo) + { + free(pCfgInfo); + } + } + else if(pMsg->busCmd == CMD_WORKDAY_DB_RSP) + { + PWORKDAY_INFO pWorkDayInfo = (PWORKDAY_INFO)Json2Struct((const char *)pMsg->pMsg, + JSON_ENGINE_WORKDAY_REQ, FALSE, &err); + + //LOG_EX(LOG_Debug, "WorkDay: %s\n", pMsg->pMsg); + if(pWorkDayInfo && err == 0) + { + memcpy(&g_workDayArray, pWorkDayInfo, sizeof(WORKDAY_INFO)); + } + + //LOG_EX2(LOG_Debug, "Database: %s\n", pMsg->pMsg); + + if(pWorkDayInfo) + { + free(pWorkDayInfo); + } + } + else if(pMsg->busCmd != CMD_MISC_PING) + { + if(g_LibuvDBusParam.onMsgCb) + { + g_LibuvDBusParam.onMsgCb(g_LibuvDBusParam.pLoop, g_LibuvDBusParam.pBus, pMsg); + } + + return 1; + } + } + else // More than 4K size used Share Memory + { + LOG_EX(LOG_Error, "Receive Message Error Size: %d\n", pMsg->msgSize); +#if 0 + PDBUS_MSG_DATA pData = NULL; + int key = strtol(pMsg->pMsg, NULL, 10); + + int msgId = shmget((key_t)key, pMsg->msgSize, 0666 | IPC_CREAT); + + if(msgId == -1) + { + return; + } + + pData = (PDBUS_MSG_DATA)shmat(msgId, NULL, 0); + + if(pData == (void*)-1) + { + return; + } + + //print_hex_dump_bytes("send_", 2, pData, pMsg->msgSize); + + pMsg->pMsg = pData->pMsgContext; + pMsg->msgSize -= sizeof(long int); + + if(pMsg->busCmd != CMD_MISC_PING) + { + g_LibuvDBusParam.onMsgCb(g_LibuvDBusParam.pLoop, g_LibuvDBusParam.pBus, pMsg); + } + + pData->msgMask &= ~(1 << g_LibuvDBusParam.modName); + + // Cleanup Share Memory + if(pData->msgMask == 0) + { + shmctl(msgId, IPC_RMID, 0); +#if USED_SHM_TO_DBUS + __removeReqIdFromTable((key_t)key); +#endif + } + + shmdt(pData); +#endif + } + + return 0; +} + +static DBusHandlerResult DBusOnMsgCb(DBusConnection* pConn, DBusMessage* pMsg, void* user_data) +{ +#if 0 + struct timeval tmBegin, tmEnd; + long long diffTm; +#endif + DBusError error; + PDBUS_MSG_PROC pMsgProc = NULL; + + PDBUS_MSG_PACK pMsgPack = (PDBUS_MSG_PACK)malloc(sizeof(DBUS_MSG_PACK)); + + if(pMsgPack == NULL) + { + LOG_EX(LOG_Error, "Receive Message: No Memory\n"); + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } + + memset(pMsgPack, 0, sizeof(DBUS_MSG_PACK)); + + dbus_error_init(&error); + + if(dbus_message_is_signal(pMsg, DBUS_MESSAGE_INTERFACE_NAME, "Notify")) + { + if(dbus_message_get_args(pMsg, &error, + DBUS_TYPE_UINT32, &pMsgPack->msgSrc, // from + DBUS_TYPE_UINT32, &pMsgPack->msgDests, // to -1 means all except it's self +#if USED_SHM_TO_DBUS + DBUS_TYPE_UINT32, &pMsgPack->tmTickMSec, // timestamp for msecond +#endif + DBUS_TYPE_UINT32, &pMsgPack->busCmd, // command type + DBUS_TYPE_STRING, &pMsgPack->pMsg, // message context if had + DBUS_TYPE_INVALID)) + { + pMsgPack->msgSize = strlen((char*)pMsgPack->pMsg); + // reset timeout timer + if(g_LibuvDBusParam.onHblCb && pMsgPack->msgSrc != g_LibuvDBusParam.modName) + { + HeartDaemonUpgrade(pMsgPack->msgSrc); + } + + // Dispatch message except from it's self + if(pMsgPack->msgSrc != g_LibuvDBusParam.modName + && pMsgPack->msgDests & (1 << g_LibuvDBusParam.modName)) + { + if(g_LibuvDBusParam.onMsgCb == NULL) + { + pMsgProc = (PDBUS_MSG_PROC)malloc(sizeof(struct DBUS_MSG_PROC)); + + if(pMsgProc == NULL) + { + LOG_EX(LOG_Error, "Receive Message: No Memory\n"); + free(pMsgPack); + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } + + memset(pMsgProc, 0, sizeof(struct DBUS_MSG_PROC)); + memcpy(&pMsgProc->msgContent, pMsgPack, sizeof(DBUS_MSG_PACK)); + pMsgProc->msgContent.pMsg = strdup(pMsgPack->pMsg); + pMsgProc->msgFrom = 0; + + uv_rwlock_wrlock(&g_uvMsgProcRwLock); + DL_APPEND(g_pMsgProcList, pMsgProc); + uv_rwlock_wrunlock(&g_uvMsgProcRwLock); + } + else + { + DBusOnBoardcastMsgWorkCb(pMsgPack); + } + } + } + else + { + LOG_EX(LOG_Error, "Receive Notify Message Error: %s\n", error.message); + dbus_error_free(&error); + } + + free(pMsgPack); + return DBUS_HANDLER_RESULT_HANDLED; + } + else if(dbus_message_is_method_call(pMsg, DBUS_MESSAGE_INTERFACE_NAME, "API")) + { + if(dbus_message_get_args(pMsg, &error, + DBUS_TYPE_UINT32, &pMsgPack->msgSrc, // from + DBUS_TYPE_UINT32, &pMsgPack->msgDests, // to -1 means all except it's self +#if USED_SHM_TO_DBUS + DBUS_TYPE_UINT32, &pMsgPack->tmTickMSec, // timestamp for msecond +#endif + DBUS_TYPE_UINT32, &pMsgPack->busCmd, // command type + DBUS_TYPE_UINT32, &pMsgPack->msgSize, // message size(in bytes) + DBUS_TYPE_STRING, &pMsgPack->pMsg, // message context if had + DBUS_TYPE_INVALID)) + { + // reset timeout timer + if(g_LibuvDBusParam.onHblCb && pMsgPack->msgSrc != g_LibuvDBusParam.modName) + { + HeartDaemonUpgrade(pMsgPack->msgSrc); + } + + // Dispatch message except from it's self + if(pMsgPack->msgSrc != g_LibuvDBusParam.modName + && pMsgPack->msgDests == (1 << g_LibuvDBusParam.modName)) + { + if(g_LibuvDBusParam.onMsgCb == NULL) + { + pMsgProc = (PDBUS_MSG_PROC)malloc(sizeof(struct DBUS_MSG_PROC)); + + if(pMsgProc == NULL) + { + LOG_EX(LOG_Error, "Receive Message: No Memory\n"); + free(pMsgPack); + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } + + memset(pMsgProc, 0, sizeof(struct DBUS_MSG_PROC)); + memcpy(&pMsgProc->msgContent, pMsgPack, sizeof(DBUS_MSG_PACK)); + pMsgProc->msgContent.pMsg = strdup(pMsgPack->pMsg); + pMsgProc->msgFrom = 1; + + uv_rwlock_wrlock(&g_uvMsgProcRwLock); + DL_APPEND(g_pMsgProcList, pMsgProc); + uv_rwlock_wrunlock(&g_uvMsgProcRwLock); + } + else + { + DBusOnMsgWorkAPICb(pMsgPack); + } + } + } + else + { + LOG_EX(LOG_Error, "Receive API Message Error: %s\n", error.message); + dbus_error_free(&error); + } + + free(pMsgPack); + return DBUS_HANDLER_RESULT_HANDLED; + } + + free(pMsgPack); + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +} + +static void freeSHMResource(int shmId, void* pData) +{ + // Cleanup Share Memory + if(pData) + { + shmdt(pData); + } + + shmctl(shmId, IPC_RMID, 0); +} + +static void FreeDBusSendToAsyncCb(uv_work_t* pWork, int status) +{ + PDBUS_ASYNC_PARAMS pParam = (PDBUS_ASYNC_PARAMS)pWork->data; + free(pParam->pStruct); + free(pParam); + free(pWork); +} + +static void DBusSendToAsyncCb(uv_work_t* pWork) +{ + int err = 0; + PDBUS_ASYNC_PARAMS pParam = (PDBUS_ASYNC_PARAMS)pWork->data; + const char *pJsonStr = Struct2Json(pParam->pStruct, pParam->type, pParam->enBase64, &err); + + if(pJsonStr == NULL || err != 0) + { + pParam->cbSendTo(err); + return; + } + + err = DBusSendToCommand(pParam->pBus, pParam->pBusName, pParam->busCmd, pJsonStr); + + free((void*)pJsonStr); + + pParam->cbSendTo(err); +} + +int DBusJsonSendToCommandAsync(DBusConnection* pBus, + const char* pBusName, + uint32_t busCmd, + JSON_ENGINE_TYPE type, + void* pStruct, + int iSize, + OnDBusAsyncSendTo cbSendTo, + int enBase64) +{ + PDBUS_ASYNC_PARAMS pParam = NULL; + uv_work_t* puvWork = NULL; + + if(cbSendTo == NULL) + { + return 0; + } + + pParam = (PDBUS_ASYNC_PARAMS)malloc(sizeof(DBUS_ASYNC_PARAMS)); + puvWork = (uv_work_t*)malloc(sizeof(uv_work_t)); + + pParam->pBus = pBus; + pParam->pBusName = pBusName; + pParam->busCmd = busCmd; + pParam->type = type; + pParam->iSize = iSize; + pParam->pStruct = malloc(iSize); + pParam->cbSendTo = cbSendTo; + pParam->enBase64 = enBase64; + memcpy(pParam->pStruct, pStruct, iSize); + + puvWork->data = (void*)pParam; + uv_queue_work(g_LibuvDBusParam.pLoop, puvWork, DBusSendToAsyncCb, FreeDBusSendToAsyncCb); + + return 0; +} + +int DBusJsonSendToCommand(DBusConnection* pBus, + const char* pBusName, + uint32_t busCmd, + JSON_ENGINE_TYPE type, + void* pStruct, + int enBase64) +{ + int ret, err = 0; + const char* pJsonStr = Struct2Json(pStruct, type, enBase64, &err); + + if(pJsonStr == NULL || err != 0) + { + return err; + } + + ret = DBusSendToCommand(pBus, pBusName, busCmd, pJsonStr); + + free((void*)pJsonStr); + + return ret; +} + +int DBusJsonBoardcastCommand(DBusConnection* pBus, + uint32_t msgToMask, + uint32_t busCmd, + JSON_ENGINE_TYPE type, + void* pStruct, + int enBase64) +{ + int ret, err = 0; + const char* pJsonStr = Struct2Json(pStruct, type, enBase64, &err); + + if(pJsonStr == NULL || err != 0) + { + return err; + } + + ret = DBusBoardcastCommand(pBus, msgToMask, busCmd, pJsonStr); + + free((void*)pJsonStr); + return ret; +} + +static unsigned int __getShmReqId(void) +{ + static unsigned int g_shmReqId = 1; + unsigned int iReqId; + + if(g_shmReqId >= 0xFFFF - 1) + { + g_shmReqId = 1; + } + + iReqId = __sync_fetch_and_add(&g_shmReqId, 1); + + return (iReqId & 0xFFFF) | (g_LibuvDBusParam.modName << 16); +} + +int DBusSendToCommand(DBusConnection* pBus, + const char* pBusName, + uint32_t busCmd, + const char* pContext) +{ +#if USED_SHM_TO_DBUS + struct timeval tv; +#endif + int i; + int msgId; + //char msgContext[DBUS_MSG_MAX_PAD_SIZE]; + DBusMessage* pMsg = NULL; + uint32_t msgLen = 0; + uint32_t msgToMask = 0; + OnDBusSendError pErrorCb = NULL; + uint8_t* pMsgInfo = NULL; + PDBUS_MSG_DATA pShmData = NULL; + const char* pPath = NULL; + char* pMsgContent = NULL; + +#if 0 + if(pContext == NULL || (msgLen = strlen(pContext)) <= 0) + { + return (-ERR_INPUT_PARAMS); + } +#else + if(pContext == NULL) + { + pContext = ""; + msgLen = 0; + } + else + { + msgLen = strlen(pContext); + } +#endif + + pMsgContent = (char*)malloc(msgLen + 1); + + if(pMsgContent == NULL) + { + LOG_EX(LOG_Error, "Malloc memory %d error\n", msgLen + 1); + return -ERR_MALLOC_MEMORY; + } + + pMsgInfo = (uint8_t*)pMsgContent; + + memset(pMsgContent, 0, msgLen + 1); + + if(pBus == NULL) + { + pBus = g_LibuvDBusParam.pBus; + } + + for(i = 0; (i < sizeof(g_pModInfoTable) / sizeof(g_pModInfoTable[0])); i++) + { + // Skip match it'self + if(strcmp(g_pModInfoTable[i].modAliase, pBusName) == 0) + { + msgToMask = 1 << i; + pPath = g_pModInfoTable[i].modPath; + break; + } + } + + pMsg = dbus_message_new_method_call(pBusName, + pPath, + DBUS_MESSAGE_INTERFACE_NAME, + "API"); + + if(pMsg == NULL) + { + free(pMsgContent); + LOG_EX(LOG_Error, "DBus Create Message Error\n"); + return -ERR_DBUS_CREATE_MSG; + } + + dbus_message_set_no_reply(pMsg, TRUE); + +#if USED_SHM_TO_DBUS + gettimeofday(&tv, NULL); +#endif + + if(msgLen < DBUS_MSG_MAX_PAD_SIZE) + { + strcpy(pMsgContent, pContext); + } + else + { +#if 0 + int msgKey = __getShmReqId(); + msgLen += sizeof(long int); + + // Make message with Memory Share + msgId = shmget((key_t)msgKey, msgLen, 0666 | IPC_CREAT); + + if(msgId == -1) + { + perror("shmget_"); + return (-ERR_CREATE_SHM); + } + else + { + pShmData = (PDBUS_MSG_DATA)shmat(msgId, NULL, 0); + + if(pShmData == (void*)-1) + { + return -ERR_MAP_SHM; + } + + pShmData->msgMask = msgToMask; + + memcpy(pShmData->pMsgContext, pContext, msgLen); + sprintf(pMsgInfo, "%d", msgKey); + + shmdt(pShmData); + //print_hex_dump_bytes("send_", 2, pShmData, msgLen); + //strcpy(pMsgInfo, (void*)&msgKey, sizeof(key_t)); + +#if USED_SHM_TO_DBUS + __addShmIdToTable((key_t)msgKey, tv.tv_sec, msgToMask, msgLen); +#endif + pErrorCb = freeSHMResource; + } +//#else +#endif + free(pMsgContent); + LOG_EX(LOG_Error, "Send Message size %d more than DBUS_MSG_MAX_PAD_SIZE, busCmd = %u, pBusName = %s\n", + msgLen, busCmd, pBusName); + return -ERR_INPUT_PARAMS; + } + + dbus_message_append_args(pMsg, + DBUS_TYPE_UINT32, &g_LibuvDBusParam.modName, // from + DBUS_TYPE_UINT32, &msgToMask, // to -1 means all except it's self +#if USED_SHM_TO_DBUS + DBUS_TYPE_UINT32, &tv.tv_sec, // timestamp for msecond +#endif + DBUS_TYPE_UINT32, &busCmd, // command type + DBUS_TYPE_UINT32, &msgLen, // message size(in bytes) + DBUS_TYPE_STRING, &pMsgInfo, + // msgLen[0, 512): pad to message; msgLen[512, ~): memory map key, + //DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &pMsgInfo, (msgLen < DBUS_MSG_MAX_PAD_SIZE) ? msgLen : sizeof(key_t), + DBUS_TYPE_INVALID); + + free(pMsgContent); + + if(!dbus_connection_send(pBus, pMsg, NULL)) + { + LOG_EX(LOG_Error, "Send Message Error\n"); + if(pErrorCb) + { + pErrorCb(msgId, pShmData); + } + + return -ERR_BUS_SEND_MSG; + } + + //dbus_connection_flush(pBus); + dbus_message_unref(pMsg); + + usleep(100); + + return 0; +} + +int DBusBoardcastCommand(DBusConnection* pBus, + uint32_t msgToMask, + uint32_t busCmd, + const char* pContext) +{ +#if USED_SHM_TO_DBUS + struct timeval tv; +#endif + DBusMessage* pMsg = NULL; + + if(pContext == NULL) + { + pContext = ""; + } + + if(strlen(pContext) >= DBUS_MSG_MAX_PAD_SIZE) + { + LOG_EX(LOG_Error, "Msg size = %u more than DBUS_MSG_MAX_PAD_SIZE\n", strlen(pContext)); + return -ERR_DBUS_MSG_TO_LARGE; + } + + if(pBus == NULL) + { + pBus = g_LibuvDBusParam.pBus; + } + + pMsg = dbus_message_new_signal(g_LibuvDBusParam.pBusPath, DBUS_MESSAGE_INTERFACE_NAME, "Notify"); + + if(pMsg == NULL) + { + return -ERR_DBUS_CREATE_MSG; + } + + dbus_message_set_no_reply(pMsg, TRUE); + +#if USED_SHM_TO_DBUS + gettimeofday(&tv, NULL); +#endif + + dbus_message_append_args(pMsg, + DBUS_TYPE_UINT32, &g_LibuvDBusParam.modName, // from + DBUS_TYPE_UINT32, &msgToMask, // to -1 means all except it's self +#if USED_SHM_TO_DBUS + DBUS_TYPE_UINT32, &tv.tv_sec, // timestamp for msecond +#endif + DBUS_TYPE_UINT32, &busCmd, // command type + DBUS_TYPE_STRING, &pContext, + DBUS_TYPE_INVALID); + + if(!dbus_connection_send(pBus, pMsg, NULL)) + { + return -ERR_BUS_SEND_MSG; + } + + //dbus_connection_flush(pBus); + dbus_message_unref(pMsg); + + usleep(100); + return 0; +} + +static void __addNewLoopTask(uv_loop_t* pLoop) +{ + PLOOP_TASK_ARRAY pItem = NULL; + PLOOP_TASK_ARRAY pTask = NULL; + if(pLoop == NULL) + { + return; + } + + uv_rwlock_wrlock(&g_uvLoopRwLock); + LL_FOREACH(g_LoopArray, pItem) + { + if(pItem->pLoop == pLoop) + { + LOG_EX(LOG_Warn, "Loop %p is added\n", pLoop); + uv_rwlock_wrunlock(&g_uvLoopRwLock); + return; + } + } + + pTask = (PLOOP_TASK_ARRAY)malloc(sizeof(struct LOOP_TASK_ARRAY)); + if(pTask == NULL) + { + LOG_EX(LOG_Error, "Malloc Memory Error\n"); + return; + } + memset(pTask, 0, sizeof(struct LOOP_TASK_ARRAY)); + pTask->pLoop = pLoop; + pTask->isRunning = FALSE; + LL_APPEND(g_LoopArray, pTask); + uv_rwlock_wrunlock(&g_uvLoopRwLock); +} + +static void __uvLoopRuntime(void *pParam) +{ + uv_loop_t* pLoop = (uv_loop_t*)pParam; + + if(pLoop) + { + while(TRUE) + { + uv_run(pLoop, UV_RUN_DEFAULT); + usleep(1000); + } + } + + pthread_detach(pthread_self()); +} + +static void __runUVLoopTask(uv_loop_t* pLoop, void* pCallback) +{ + uv_thread_t uvThread; + if(pLoop == NULL) + { + return; + } + + uv_thread_create(&uvThread, __uvLoopRuntime, pLoop); +} + +void RunUVLoop(uv_loop_t *pLoop) +{ +#if 1 + int more; + + while(TRUE) + { + more = uv_run(g_LibuvDBusParam.pLoop, UV_RUN_ONCE); + + if(more == FALSE) + { + more = uv_loop_alive(g_LibuvDBusParam.pLoop); + + if(uv_run(g_LibuvDBusParam.pLoop, UV_RUN_NOWAIT) != 0) + { + more = TRUE; + } + } + } +#else + int more; + + do + { + if(pLoop && pLoop != g_LibuvDBusParam.pUserLoop) + { + more = uv_run(pLoop, UV_RUN_ONCE); + + if(more == FALSE) + { + more = uv_loop_alive(pLoop); + + if(uv_run(pLoop, UV_RUN_NOWAIT) != 0) + { + more = TRUE; + } + } + } + + if(g_LibuvDBusParam.pUserLoop) + { + more = uv_run(g_LibuvDBusParam.pUserLoop, UV_RUN_ONCE); + + if(more == FALSE) + { + more = uv_loop_alive(g_LibuvDBusParam.pUserLoop); + + if(uv_run(g_LibuvDBusParam.pUserLoop, UV_RUN_NOWAIT) != 0) + { + more = TRUE; + } + } + } + + if(g_LibuvDBusParam.pLoop) + { + more = uv_run(g_LibuvDBusParam.pLoop, UV_RUN_ONCE); + + if(more == FALSE) + { + more = uv_loop_alive(g_LibuvDBusParam.pLoop); + + if(uv_run(g_LibuvDBusParam.pLoop, UV_RUN_NOWAIT) != 0) + { + more = TRUE; + } + } + } + } + while(TRUE); +//#else + //__runUVLoopTask(pLoop, NULL); + //__addNewLoopTask(pLoop); +#endif +} + +static void __uvDBusRecvProc(void *pParams) +{ + while(TRUE) + { + DBusMessage* pMsg = NULL; + dbus_connection_read_write(g_LibuvDBusParam.pBus, 0); + + pMsg = dbus_connection_pop_message(g_LibuvDBusParam.pBus); + + if(pMsg != NULL) + { + DBusOnMsgCb(g_LibuvDBusParam.pBus, pMsg, NULL); + } + + usleep(100); + } +} + +void DBusMsgCleanup(PDBUS_MSG_PACK pMsg) +{ + if(pMsg) + { + if(pMsg->pMsg) + { + free(pMsg->pMsg); + } + + free(pMsg); + } +} + +PDBUS_MSG_PACK DBusGetMessage(void) +{ + int iCount, ret = 0; + PDBUS_MSG_PACK pMsg = NULL; + PDBUS_MSG_PROC pItem = NULL, pTmp = NULL; + + if(g_LibuvDBusParam.onMsgCb) + { + return NULL; + } + + DL_COUNT(g_pMsgProcList, pItem, iCount); + + if(iCount == 0) + { + return pMsg; + } + + pItem = NULL; + uv_rwlock_wrlock(&g_uvMsgProcRwLock); + DL_FOREACH_SAFE(g_pMsgProcList, pItem, pTmp) + { + if(pItem->msgFrom == 0) + { + ret = DBusOnBoardcastMsgWorkCb(&pItem->msgContent); + } + else + { + ret = DBusOnMsgWorkAPICb(&pItem->msgContent); + } + + if(ret != 0) + { + pMsg = (PDBUS_MSG_PACK)malloc(sizeof(DBUS_MSG_PACK)); + + if(pMsg) + { + memset(pMsg, 0, sizeof(DBUS_MSG_PACK)); + memcpy(pMsg, &pItem->msgContent, sizeof(DBUS_MSG_PACK)); + pMsg->pMsg = strdup(pItem->msgContent.pMsg); + } + } + + DL_DELETE(g_pMsgProcList, pItem); + free(pItem->msgContent.pMsg); + free(pItem); + + break; + } + uv_rwlock_wrunlock(&g_uvMsgProcRwLock); + + return pMsg; +} + +#if 0 +static void __uvMsgProc(void *pParams) +{ +#ifdef ENABLE_COUNT_DEBUG + struct timeval tmBegin, tmEnd; + long long diffTm; +#endif + + while(TRUE) + { + int iMaxProcMsg = 100; + PDBUS_MSG_PROC pItem = NULL, pTmp = NULL; + + uv_rwlock_wrlock(&g_uvMsgProcRwLock); + DL_FOREACH_SAFE(g_pMsgProcList, pItem, pTmp) + { + if(--iMaxProcMsg == 0) + { + break; + } + +#ifdef ENABLE_COUNT_DEBUG + gettimeofday(&tmBegin, NULL); +#endif + if(pItem->msgFrom == 0) + { + DBusOnBoardcastMsgWorkCb(&pItem->msgContent); +#ifdef ENABLE_COUNT_DEBUG + gettimeofday(&tmEnd, NULL); + diffTm = (tmEnd.tv_sec * 1000000 + tmEnd.tv_usec) - (tmBegin.tv_sec * 1000000 + tmBegin.tv_usec); + MonUpgradeStatistical(MON_MSG_BST_PROC_STAT, diffTm); +#endif + } + else + { + DBusOnMsgWorkAPICb(&pItem->msgContent); +#ifdef ENABLE_COUNT_DEBUG + gettimeofday(&tmEnd, NULL); + diffTm = (tmEnd.tv_sec * 1000000 + tmEnd.tv_usec) - (tmBegin.tv_sec * 1000000 + tmBegin.tv_usec); + MonUpgradeStatistical(MON_MSG_PROC_STAT, diffTm); +#endif + } + + if(pItem->msgContent.pMsg) + { + free(pItem->msgContent.pMsg); + } + + DL_DELETE(g_pMsgProcList, pItem); + free(pItem); + } + uv_rwlock_wrunlock(&g_uvMsgProcRwLock); + usleep(1000); + } + + pthread_detach(pthread_self()); +} +#endif + +void SetHBLAutoExit(int flag) +{ + g_EnHBLExit = flag ? TRUE : FALSE; +} + +static void __dBusDeameonCb(MODULE_NAME modName, int status) +{ + LOG_EX(status == 0 ? LOG_Info : LOG_Error, + "Daemon %s(%d) Msg: [%s]\n", ModuleNameToString(modName), modName, + status == 0 ? "Connect" : "Disconnect"); + + if(status != 0 && modName == MODULE_CONTROLLER && g_EnHBLExit) + { + sleep(1); + //exit(0); + } +} + +static void __waitUDISKMount(void) +{ +#ifdef PLATFORM_R16 + const char* pDoneStat = "done"; + const char* pBootStatFile = "/tmp/booting_state"; + char buf[5]; + FILE* pFile; + + // wait system create setup status file + LOG_EX(LOG_Debug, "Wait boot status file create ......\n"); + while(access(pBootStatFile, F_OK) != 0) + { + usleep(10000); + } + + pFile = fopen(pBootStatFile, "rb"); + + if(pFile == NULL) + { + LOG_EX(LOG_Error, "Open boot status file error\n"); + return; + } + + LOG_EX(LOG_Debug, "Wait boot status done ......\n"); + + // when UDISK mount, file /tmp/booting_state content is "done" + do + { + fseek(pFile, 0, SEEK_SET); + memset(buf, 0, 5); + fread(buf, 1, 4, pFile); // read 4 bytes status tags + + usleep(10000); + } + while(strncmp(buf, pDoneStat, strlen(pDoneStat)) != 0); + + fclose(pFile); + + LOG_EX(LOG_Debug, "Boot status done ......\n"); +#endif +} + +DBusConnection* DBusWithLibuvInit(uv_loop_t* pUserLoop, + const char* pBusName, + OnDBusMessage cbOnMsg, + OnDaemonMsg cbOnHbl, + OnKeyEvent cbOnKey, + int* pErrno) +{ + int i, ret = 0; + DBusError error; + SERVER_MODULE_TYPE svrMode; + uv_async_t* pAsync = NULL; + DBusConnection* pBus = NULL; + uv_fs_t* puvFsReq; + //uv_thread_t uvMsgProcThread; + //uv_thread_t uvMsgRecvThread; + + //uv_thread_t uvLoopThread; + char rule[DBUS_MAXIMUM_MATCH_RULE_LENGTH - 1]; +#if USED_SHM_TO_DBUS + uv_thread_t uvSyncThread; +#endif + //uv_loop_t *pLoop = uv_loop_new(); + uv_loop_t *pLoop = pUserLoop; + + memset(&g_LibuvDBusParam, 0, sizeof(LIBUV_DBUS_PARAMS)); + + for(i = 0; (i < sizeof(g_pModInfoTable) / sizeof(g_pModInfoTable[0])); i++) + { + // Skip match it'self + if(strcmp(g_pModInfoTable[i].modAliase, pBusName) == 0) + { + g_LibuvDBusParam.modName = g_pModInfoTable[i].modName; + g_LibuvDBusParam.pBusName = g_pModInfoTable[i].modAliase; + g_LibuvDBusParam.pBusPath = g_pModInfoTable[i].modPath; + break; + } + } + + memset(&g_workDayArray, 0, sizeof(WORKDAY_INFO)); + srand(time(NULL)); + + if(pLoop == NULL || pBusName == NULL || pErrno == NULL) + { + if(pErrno) + { + *pErrno = -ERR_INPUT_PARAMS; + } + + LOG_EX(LOG_Error, "Input params error: pLoop = %p, pBusName = %p, pErrno = %p\n", + pLoop, pBusName, pErrno); + return NULL; + } + + puvFsReq = (uv_fs_t*)malloc(sizeof(uv_fs_t)); + + CfgFileInit(); + + IHW_InitLOG(strrchr(pBusName, '.') + 1, NULL, TRUE); + IHW_EnableLogLevel(LOG_Fatal | LOG_Error | LOG_Warn | LOG_Debug | LOG_Info, 1); + + APP_BUILD_INFO(strrchr(pBusName, '.') + 1, GetCurrentVersion()); + + // wait UDISK mount, configure file save in UDISK partition + __waitUDISKMount(); + + svrMode = CfgGetIntValue("Global.ServerMode", PUBLISH_MODE); + + SetCurrentServerMode(svrMode); + DumpCurServerAddr("Default"); + + +#if USED_SHM_TO_DBUS + uv_rwlock_init(&g_uvShmHashRwLock); +#endif + + uv_rwlock_init(&g_uvMsgProcRwLock); + uv_rwlock_init(&g_uvLoopRwLock); + + uv_fs_access(pLoop, puvFsReq, "/mnt/UDISK/debug.dbg", F_OK, uvFsAccessCb); + + memset(rule, 0, DBUS_MAXIMUM_MATCH_RULE_LENGTH - 1); + srand(time(NULL)); + + //setenv("UV_THREADPOOL_SIZE", "128", 1); + + dbus_error_init(&error); + + pBus = dbus_bus_get(DBUS_BUS_SESSION, &error); + + if (dbus_error_is_set(&error)) + { + LOG_EX(LOG_Error, "dbus: Could not acquire the session bus\n"); + + dbus_error_free(&error); + *pErrno = -ERR_GET_BUS; + return NULL; + } + + ret = dbus_bus_request_name(pBus, pBusName, DBUS_NAME_FLAG_REPLACE_EXISTING, &error); + + if(dbus_error_is_set(&error)) + { + LOG_EX(LOG_Error, "dbus: Could not request dbus name\n"); + + dbus_error_free(&error); + *pErrno = -ERR_REQUEST_BUS_NAME; + return NULL; + } + + if(ret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) + { + LOG_EX(LOG_Error, "dbus: Could not request dbus name\n"); + + dbus_error_free(&error); + *pErrno = -ERR_REQUEST_BUS_NAME; + return NULL; + } +#if 1 + if(!dbus_connection_set_watch_functions(pBus, + DBusAddWatchCb, + DBusRemoveWatchCb, + DBusNotifyWatchCb, + (void*)pLoop, NULL)) + { + LOG_EX(LOG_Error, "dbus: Could not set watch function\n"); + + *pErrno = -ERR_SET_WATCH_FUNCTION; + return NULL; + } + + if(!dbus_connection_set_timeout_functions(pBus, + DBusAddTimeoutCb, + DBusRemoveTimeoutCb, + DBusNotifyTimeoutCb, + (void*)pLoop, NULL)) + { + LOG_EX(LOG_Error, "dbus: Could not set watch function\n"); + + *pErrno = -ERR_SET_TIMEOUT_FUNCTION; + return NULL; + } +#endif + + pAsync = malloc(sizeof(uv_async_t)); + pAsync->data = (void*)pBus; + + uv_async_init(pLoop, pAsync, uvAsyncCb); + uv_unref((uv_handle_t*)pAsync); + +#if 1 + dbus_connection_set_wakeup_main_function(pBus, + DBusWakeupMainLoopCb, + (void*)pAsync, DBusAsyncFreeCb); +#endif + + sprintf(rule, "type='signal', interface='%s'", DBUS_MESSAGE_INTERFACE_NAME); + dbus_bus_add_match(pBus, rule, &error); + + if(dbus_error_is_set(&error)) + { + LOG_EX(LOG_Error, "dbus_bus_add_match [%s] error: %s\n", DBUS_MESSAGE_INTERFACE_NAME, error.message); + dbus_error_free(&error); + *pErrno = -ERR_BUS_MATCH; + return NULL; + } +#if 1 + if(!dbus_connection_add_filter(pBus, DBusOnMsgCb, pLoop, NULL)) + { + LOG_EX(LOG_Error, "dbus_connection_add_filter error\n"); + *pErrno = -ERR_BUS_SET_MSG_CB; + return NULL; + } +#endif + + uv_idle_init(pLoop, &g_uvIdleHandle); + g_uvIdleHandle.data = pBus; + uv_idle_start(&g_uvIdleHandle, uvIdleCb); + + if(cbOnKey) + { + uv_fs_open(pLoop, &g_uvKeyEvent, R16_TINA_KEY_EVENT_PATH, O_RDONLY, 0, uvOpenKeyEventCb); + g_LibuvDBusParam.onKeyCb = cbOnKey; + } + + g_LibuvDBusParam.pLoop = pLoop; + g_LibuvDBusParam.pUserLoop = pUserLoop; + g_LibuvDBusParam.pBus = pBus; + g_LibuvDBusParam.onMsgCb = cbOnMsg; + +#if 0 + if(cbOnHbl) + { + g_LibuvDBusParam.onHblCb = cbOnHbl; + HeartDaemonInit(g_LibuvDBusParam.modName, HEART_LOST_DELAY, cbOnHbl); + } +#else + g_LibuvDBusParam.onHblCb = __dBusDeameonCb; + HeartDaemonInit(g_LibuvDBusParam.modName, HEART_LOST_DELAY, __dBusDeameonCb); +#endif + +#if USED_SHM_TO_DBUS + uv_thread_create(&uvSyncThread, __uvShmTblTaskThreadCb, NULL); +#endif + +#ifdef ENABLE_COUNT_DEBUG + MonitorInit(); + MonAddNewItem(MON_MSG_PROC_STAT, 100000); + MonAddNewItem(MON_MSG_BST_PROC_STAT, 100000); + MonAddNewItem(MON_USER_MSG_PROC_STAT, 100000); + MonAddNewItem(MON_USER_MSG_BST_PROC_STAT, 100000); +#endif + + InetInit(); + EvpSystemInit(); + +#if 0 + if(g_LibuvDBusParam.onMsgCb) + { + uv_thread_create(&uvMsgProcThread, __uvMsgProc, NULL); + } +#endif + + IHW_RunLogService(); + + return pBus; +} + +int DBusWithLibuvCfgInit(OnCfgMsg cbOnCfgMsg) +{ + CfgGlobalEnvInit(); + + if(cbOnCfgMsg == NULL) + { + return (-ERR_INPUT_PARAMS); + } + + g_LibuvDBusParam.onCfgCb = cbOnCfgMsg; + + return (0); +} + +int GetShellExecResult(const char *pCmd, char **pResult) +{ + FILE *pFile = NULL; + unsigned int uRdSize = 0; + char *pCmdOut; + + *pResult = NULL; + + if(pCmd == NULL || strlen(pCmd) == 0) + { + return (-ERR_INPUT_PARAMS); + } + + pFile = popen(pCmd, "r"); + + if(pFile == NULL) + { + return (-ERR_OPEN_FILE); + } + + *pResult = (char *)malloc(4096); + pCmdOut = *pResult; + + uRdSize = fread(pCmdOut, sizeof(char), 4096, pFile); + + pCmdOut[uRdSize] = 0; + + if(pCmdOut[strlen(pCmdOut) - 1] == '\n') + { + pCmdOut[strlen(pCmdOut) - 1] = 0; + } + + pclose(pFile); + //fprintf(stdout, "%s --> [%s](%u)\n", pCmd, pCmdOut, uRdSize); + return (0); +} + +void SystemSafeReboot(void) +{ + int ret, reTry = 0; +#if 0 + ret = system("sync"); + + ret = system("ubus call system watchdog \'{\"stop\" : true}\'"); + + reTry = 3; + do + { + sleep(1); + } while(reTry--); + + reTry = 0; + + LOG_EX(LOG_Debug, "Reboot System By Power Control Chips\n"); + sleep(1); + + ret = system("echo 3140 > /sys/bus/platform/devices/axp22_board/axp22_reg"); + + sleep(10); +#endif + while(TRUE) + { + LOG_EX(LOG_Debug, "Reboot System: %d times\n", reTry++); + sleep(1); + ret = system("reboot -f"); + sleep(3); + } +} + +char* GetCpuChipId(void) +{ + char* pRet = NULL; +#ifdef PLATFORM_R16 + char* pChipId = NULL; + + GetShellExecResult("cat /proc/cpuinfo | grep Chipid | awk '{print $3}'", &pChipId); + + if(pChipId == NULL) + { + return strdup(""); + } + + pRet = strdup(pChipId); + free(pChipId); + return pRet; +#else + return strdup("Unknown CPU Chip ID"); +#endif +} + +char* GetCpuSerial(void) +{ + char* pRet = NULL; +#ifdef PLATFORM_R16 + char* pSerial = NULL; + + GetShellExecResult("cat /proc/cpuinfo | grep Serial | awk '{print $3}'", &pSerial); + + if(pSerial == NULL) + { + return strdup(""); + } + + pRet = strdup(pSerial); + free(pSerial); + return pRet; +#else + return strdup("Unknown CPU Serial"); +#endif +} + +int CopyFile(const char *pSrc, const char *pDest) +{ + int fdSrc, fdDest; + struct stat st; + ssize_t sz; + + if(stat(pSrc, &st) != 0) + { + LOG_EX(LOG_Error, "Get File %s Size Error\n", pSrc); + return (-ERR_GET_FILE_SIZE); + } + + fdSrc = open(pSrc, O_RDONLY); + + if(fdSrc < 0) + { + LOG_EX(LOG_Error, "Open File %s Error\n", pSrc); + return (-ERR_OPEN_FILE); + } + + fdDest = open(pDest, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); + + if(fdDest < 0) + { + close(fdSrc); + LOG_EX(LOG_Error, "Open File %s Error\n", pDest); + return (-ERR_OPEN_FILE); + } + + sz = sendfile(fdDest, fdSrc, NULL, st.st_size); + + if(sz != st.st_size) + { + LOG_EX(LOG_Error, "Copy File Size Error: %d, %d\n", sz, st.st_size); + close(fdSrc); + close(fdDest); + return (-ERR_COPY_FILE); + } + + fsync(fdDest); + + close(fdSrc); + close(fdDest); + + return (0); +} + +int CopyFileWithSize(const char *pSrc, const char *pDest, int iSize) +{ + int fdSrc, fdDest; + struct stat st; + ssize_t sz; + size_t cpSize = iSize; + + if(iSize <= 0) + { + if(stat(pSrc, &st) != 0) + { + LOG_EX(LOG_Error, "Get File %s Size Error\n", pSrc); + return (-ERR_GET_FILE_SIZE); + } + + cpSize = st.st_size; + } + + fdSrc = open(pSrc, O_RDONLY); + + if(fdSrc < 0) + { + LOG_EX(LOG_Error, "Open File %s Error\n", pSrc); + return (-ERR_OPEN_FILE); + } + + fdDest = open(pDest, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH |S_IWOTH); + + if(fdDest < 0) + { + close(fdSrc); + LOG_EX(LOG_Error, "Open File %s Error\n", pDest); + return (-ERR_OPEN_FILE); + } + + sz = sendfile(fdDest, fdSrc, NULL, cpSize); + + if(sz != cpSize) + { + LOG_EX(LOG_Error, "Copy File Size Error: %d, %d\n", sz, cpSize); + close(fdSrc); + close(fdDest); + return (-ERR_COPY_FILE); + } + + close(fdSrc); + close(fdDest); + + return (0); +} + +int ReadFileToBuf(const char *pSrc, unsigned char *pBuf, int iSize) +{ + int fdSrc; + struct stat st; + ssize_t sz; + size_t cpSize = iSize; + + if(iSize < 0) + { + if(stat(pSrc, &st) != 0) + { + LOG_EX(LOG_Error, "Get File %s Size Error\n", pSrc); + return (-ERR_GET_FILE_SIZE); + } + + cpSize = st.st_size; + } + + fdSrc = open(pSrc, O_RDONLY); + + if(fdSrc < 0) + { + LOG_EX(LOG_Error, "Open File %s Error\n", pSrc); + return (-ERR_OPEN_FILE); + } + + sz = read(fdSrc, pBuf, cpSize); + + if(sz != cpSize) + { + LOG_EX(LOG_Error, "Copy File Size Error: %d, %d\n", sz, cpSize); + close(fdSrc); + return (-ERR_COPY_FILE); + } + + close(fdSrc); + + return (sz); +} + +static int __reqWorkDayInfo(int year) +{ + int ret = 0; + WORKDAY_INFO reqInfo; + + memset(&reqInfo, 0, sizeof(WORKDAY_INFO)); + + if(year <= 0) + { + struct tm localTime; + time_t tmStamp = time((time_t*)NULL); + + localtime_r(&tmStamp, &localTime); + + reqInfo.year = localTime.tm_year; + } + else + { + reqInfo.year = year; + } + + ret = DBusJsonSendToCommand(NULL, + g_pModInfoTable[MODULE_CONTROLLER].modAliase, + CMD_WORKDAY_DB_REQ, + JSON_ENGINE_WORKDAY_REQ, + &reqInfo, FALSE); + + return (ret); +} + +int CurrentIsWorkDay(int year, int day) +{ +// LOG_EX(LOG_Debug, "CurrentIsWorkDay: year = %d, day = %d\n", year, day); + + if(day > 365) + { + LOG_EX(LOG_Error, "Error Input Params: day = %d\n", day); + return (-ERR_INPUT_PARAMS); + } + + if(g_workDayArray.year <= 0) + { + __reqWorkDayInfo(year); + LOG_EX(LOG_Error, "Unsync Database: year = %d\n", year); + return (-ERR_UNINIT_ITEM); + } + + if(day < 0 || year <= 0) + { + struct tm localTime; + time_t tmStamp = time((time_t*)NULL); + localtime_r(&tmStamp, &localTime); + + if(day < 0) + { + day = localTime.tm_yday; + } + + if(year <= 0) + { + year = localTime.tm_year; + } + } + + if(year != g_workDayArray.year - 1900) + { + __reqWorkDayInfo(year); + LOG_EX(LOG_Error, "Have No Current Year Database: year = %d, g_workDayArray.year = %d\n", + year, g_workDayArray.year); + + return (-ERR_NO_ITEMS); + } + + // 0 work day, 1 holiday + return (g_workDayArray.days[day] == 0); +} + +unsigned long long GetPartitionFreeSize(const char *pPartPath) +{ + struct statfs myStatfs; + unsigned long long freeSize; + + if(statfs(pPartPath, &myStatfs) == -1) + { + return 0; + } + + freeSize = myStatfs.f_bsize * myStatfs.f_bfree; + + //fprintf(stdout, "%s free = %llu bytes\n", pPartPath, freeSize); + + return freeSize; +} + +#ifdef CURRENT_VERSION +char* GetCurrentVersion(void) +{ + return CURRENT_VERSION; +} +#else +char* GetCurrentVersion(void) +{ + return "0.0.1"; +} +#endif + +WIFI_STATUS GetCurrWIFIConnStatus(void) +{ + return g_WifiConnStatus; +} + +const char* ErrcodeToString(int errCode) +{ + switch(errCode) + { + case ERR_INPUT_PARAMS: return "ERR_INPUT_PARAMS"; + case ERR_NO_ITEMS: return "ERR_NO_ITEMS"; + case ERR_GET_BUS: return "ERR_GET_BUS"; + case ERR_DBUS_CONNECTION: return "ERR_DBUS_CONNECTION"; + case ERR_REQUEST_BUS_NAME: return "ERR_REQUEST_BUS_NAME"; + case ERR_SET_WATCH_FUNCTION: return "ERR_SET_WATCH_FUNCTION"; + case ERR_SET_TIMEOUT_FUNCTION: return "ERR_SET_TIMEOUT_FUNCTION"; + case ERR_BUS_MATCH: return "ERR_BUS_MATCH"; + case ERR_BUS_SET_MSG_CB: return "ERR_BUS_SET_MSG_CB"; + case ERR_DBUS_CREATE_MSG: return "ERR_DBUS_CREATE_MSG"; + case ERR_BUS_SEND_MSG: return "ERR_BUS_SEND_MSG"; + case ERR_DBUS_MSG_TO_LARGE: return "ERR_DBUS_MSG_TO_LARGE"; + case ERR_BUS_RCV_MSG: return "ERR_BUS_RCV_MSG"; + case ERR_ADD_TASK: return "ERR_ADD_TASK"; + case ERR_UNSUP_EVP_TYPE: return "ERR_UNSUP_EVP_TYPE"; + case ERR_CREATE_MQ: return "ERR_CREATE_MQ"; + case ERR_MQ_SENDMSG: return "ERR_MQ_SENDMSG"; + case ERR_CREATE_SHM: return "ERR_CREATE_SHM"; + case ERR_MAP_SHM: return "ERR_MAP_SHM"; + case ERR_MALLOC_MEMORY: return "ERR_MALLOC_MEMORY"; + case ERR_EVP_INIT_KEY: return "ERR_EVP_INIT_KEY"; + case ERR_EVP_UPDATE: return "ERR_EVP_UPDATE"; + case ERR_EVP_FINALE: return "ERR_EVP_FINALE"; + case ERR_EVP_KEY_SIZE: return "ERR_EVP_KEY_SIZE"; + case ERR_OPEN_FILE: return "ERR_OPEN_FILE"; + case ERR_READ_FILE: return "ERR_READ_FILE"; + case ERR_WRITE_FILE: return "ERR_WRITE_FILE"; + case ERR_COPY_FILE: return "ERR_COPY_FILE"; + case ERR_FILE_NOT_EXISTS: return "ERR_FILE_NOT_EXISTS"; + case ERR_GET_FILE_SIZE: return "ERR_GET_FILE_SIZE"; + case ERR_UNINIT_ITEM: return "ERR_UNINIT_ITEM"; + case ERR_FILE_EMPTY: return "ERR_FILE_EMPTY"; + case ERR_SEND_MAIL: return "ERR_SEND_MAIL"; + case ERR_NETWORK_SEND: return "ERR_NETWORK_SEND"; + case ERR_NETWORK_NOT_CONNECTED: return "ERR_NETWORK_NOT_CONNECTED"; + case ERR_UNSUPPORT: return "ERR_UNSUPPORT"; + case ERR_NO_INIT_IPL3: return "ERR_NO_INIT_IPL3"; + case ERR_BAD_IPL3: return "ERR_BAD_IPL3"; + case ERR_BAD_FILE_SIZE: return "ERR_BAD_FILE_SIZE"; + case ERR_MD5_FILE: return "ERR_MD5_FILE"; + case ERR_MD5_CHECK_SUM: return "ERR_MD5_CHECK_SUM"; + case ERR_OTA_WRITE_BOOT: return "ERR_OTA_WRITE_BOOT"; + case ERR_OTA_WRITE_ROOTFS: return "ERR_OTA_WRITE_ROOTFS"; + case ERR_OTA_WRITE_IPL3: return "ERR_OTA_WRITE_IPL3"; + case ERR_OTA_WRITE_PARAMS: return "ERR_OTA_WRITE_PARAMS"; + case ERR_OTA_DOWNLOAD_FILE: return "ERR_OTA_DOWNLOAD_FILE"; + case ERR_VERIFY_PARTITION_MD5: return "ERR_VERIFY_PARTITION_MD5"; + case ERR_OTA_PRE_STATR: return "ERR_OTA_PRE_STATR"; + case ERR_OTA_YET_CUR_VER: return "ERR_OTA_YET_CUR_VER"; + case ERR_OTA_NOT_READY: return "ERR_OTA_NOT_READY"; + case ERR_CREATE_CFG_FILE: return "ERR_CREATE_CFG_FILE"; + case ERR_CREATE_SQLITE3_DB: return "ERR_CREATE_SQLITE3_DB"; + case ERR_OPEN_SQLITE3_DB: return "ERR_OPEN_SQLITE3_DB"; + case ERR_SQLITE3_CREATE_TABLE: return "ERR_SQLITE3_CREATE_TABLE"; + case ERR_SYNC_DATABASE: return "ERR_SYNC_DATABASE"; + case ERR_SQL_QUERY: return "ERR_SQL_QUERY"; + case ERR_SQL_DELETE: return "ERR_SQL_DELETE"; + case ERR_UNKNOWN_TYPE: return "ERR_UNKNOWN_TYPE"; + case ERR_PERMISSION_DENIED: return "ERR_PERMISSION_DENIED"; + case ERR_CFG_NOITEM: return "ERR_CFG_NOITEM"; + case ERR_CFG_ITEM_EXIST: return "ERR_CFG_ITEM_EXIST"; + case ERR_CFG_WAIT_RSP: return "ERR_CFG_WAIT_RSP"; + case ERR_CFG_BUSY: return "ERR_CFG_BUSY"; + case ERR_STR_CONVERT: return "ERR_STR_CONVERT"; + case ERR_SQL_REG_MODULE: return "ERR_SQL_REG_MODULE"; + default: return "Unknown Error"; + } +} + +const char* DBusCmdToString(DBUS_CMD cmd) +{ + switch(cmd) + { + case CMD_MISC_PING: return "CMD_MISC_PING"; + case CMD_MISC_OTA: return "CMD_MISC_OTA"; + case CMD_MISC_WEATHER: return "CMD_MISC_WEATHER"; + case CMD_MISC_NOWTIME: return "CMD_MISC_NOWTIME"; + case CMD_MISC_UPGRADE: return "CMD_MISC_UPGRADE"; + case CMD_SYSTEM_STANDBY: return "CMD_SYSTEM_STANDBY"; + case CMD_MISC_QUERY_OTA_STATUS: return "CMD_MISC_QUERY_OTA_STATUS"; + case CMD_MISC_QUERY_DL_STATUS: return "CMD_MISC_QUERY_DL_STATUS"; + case CMD_CALL_DIAL: return "CMD_CALL_DIAL"; + case CMD_CALL_ACCEPI: return "CMD_CALL_ACCEPI"; + case CMD_CALL_HANGUP: return "CMD_CALL_HANGUP"; + case CMD_CALL_MESSAGE: return "CMD_CALL_MESSAGE"; + case CMD_PLAY_MODECHANGE: return "CMD_PLAY_MODECHANGE"; + case CMD_PLAY_PLAY: return "CMD_PLAY_PLAY"; + case CMD_PLAY_PAUSE: return "CMD_PLAY_PAUSE"; + case CMD_PLAY_STOP: return "CMD_PLAY_STOP"; + case CMD_PLAY_SEEKTO: return "CMD_PLAY_SEEKTO"; + case CMD_PLAY_SHOWMODE: return "CMD_PLAY_SHOWMODE"; + case CMD_PLAY_NEXT: return "CMD_PLAY_NEXT"; + case CMD_PLAY_PRE: return "CMD_PLAY_PRE"; + case CMD_PLAY_SHOWLIST: return "CMD_PLAY_SHOWLIST"; + case CMD_PLAY_UPDATELIST: return "CMD_PLAY_UPDATELIST"; + case CMD_PLAY_PREPARE_NEXT: return "CMD_PLAY_PREPARE_NEXT"; + case CMD_PLAY_ADDTOLIST: return "CMD_PLAY_ADDTOLIST"; + case CMD_PLAY_DELETEFROMLIST: return "CMD_PLAY_DELETEFROMLIST"; + case CMD_PLAY_RESETLIST: return "CMD_PLAY_RESETLIST"; + case CMD_PLAY_AUDIO_STOP: return "CMD_PLAY_AUDIO_STOP"; + case CMD_PLAY_AUDIO_PLAY: return "CMD_PLAY_AUDIO_PLAY"; + case CMD_SE_PLAY: return "CMD_SE_PLAY"; + case CMD_PLAY_RET_STATUS: return "CMD_PLAY_RET_STATUS"; + case CMD_CFG_ADD_REQ: return "CMD_CFG_ADD_REQ"; + case CMD_CFG_ADD_RSP: return "CMD_CFG_ADD_RSP"; + case CMD_CFG_CHANGE_REQ: return "CMD_CFG_CHANGE_REQ"; + case CMD_CFG_CHANGE_RSP: return "CMD_CFG_CHANGE_RSP"; + case CMD_CFG_GET_REQ: return "CMD_CFG_GET_REQ"; + case CMD_CFG_GET_RSP: return "CMD_CFG_GET_RSP"; + case CMD_CFG_UPG_NOTIFY: return "CMD_CFG_UPG_NOTIFY"; + case CMD_MSC_MSG_CONTROLLER_RECOG_SUCCESS: return "CMD_MSC_MSG_CONTROLLER_RECOG_SUCCESS"; + case CMD_MSC_MSG_CONTROLLER_RECOG_ERROR: return "CMD_MSC_MSG_CONTROLLER_RECOG_ERROR"; + case CMD_MSC_MSG_CONTROLLER_WAKEUP: return "CMD_MSC_MSG_CONTROLLER_WAKEUP"; + case CMD_MSC_MSG_CONTROLLER_RECOGING: return "CMD_MSC_MSG_CONTROLLER_RECOGING"; + case CMD_CONTROLLER_REQMSG_INITARGS: return "CMD_CONTROLLER_REQMSG_INITARGS"; + case CMD_CONTROLLER_RSPMSG_INITARGS: return "CMD_CONTROLLER_RSPMSG_INITARGS"; + case CMD_CONTROLLER_REQMSG_PLAYERSTATUS: return "CMD_CONTROLLER_REQMSG_PLAYERSTATUS"; + case CMD_CONTROLLER_RSPMSG_PLAYERSTATUS: return "CMD_CONTROLLER_RSPMSG_PLAYERSTATUS"; + case CMD_MSC_REQMSG_MIC_CONTROL: return "CMD_MSC_REQMSG_MIC_CONTROL"; + case CMD_MSC_RSPMSG_MIC_CONTROL: return "CMD_MSC_RSPMSG_MIC_CONTROL"; + case CMD_YUNXIN_RECVMSG: return "CMD_YUNXIN_RECVMSG"; + case CMD_YUNXIN_SENDMSG: return "CMD_YUNXIN_SENDMSG"; + case CMD_YUNXIN_SENDMSG_BYPASS: return "CMD_YUNXIN_SENDMSG_BYPASS"; + case CMD_YUNXIN_SENDMSGCB: return "CMD_YUNXIN_SENDMSGCB"; + case CMD_CONTROLLER_MSG_YUNXIN: return "CMD_CONTROLLER_MSG_YUNXIN"; + case CMD_YUNXIN_STATUS: return "CMD_YUNXIN_STATUS"; + case CMD_YUNXIN_SYSMSG: return "CMD_YUNXIN_SYSMSG"; + case CMD_WIFI_CONF: return "CMD_WIFI_CONF"; + case CMD_WIFI_CONF_RESP: return "CMD_WIFI_CONF_RESP"; + case CMD_WIFI_AUTO_CONN: return "CMD_WIFI_AUTO_CONN"; + case CMD_WIFI_AUTO_CONN_RESP: return "CMD_WIFI_AUTO_CONN_RESP"; + case CMD_WIFI_STATE_REQ: return "CMD_WIFI_STATE_REQ"; + case CMD_WIFI_STATE_RESP: return "CMD_WIFI_STATE_RESP"; + case CMD_WIFI_STATE_NTF: return "CMD_WIFI_STATE_NTF"; + case CMD_BT_NAME_GET_REQ: return "CMD_BT_NAME_GET_REQ"; + case CMD_BT_NAME_GET_RESP: return "CMD_BT_NAME_GET_RESP"; + case CMD_BT_EVT_NTF: return "CMD_BT_EVT_NTF"; + case CMD_KPLAYER_START: return "CMD_KPLAYER_START"; + case CMD_KPLAYER_STOP: return "CMD_KPLAYER_STOP"; + case CMD_KPLAYER_NOTIF_DUR: return "CMD_KPLAYER_NOTIF_DUR"; + case CMD_KPLAYER_HOST_ACTION: return "CMD_KPLAYER_HOST_ACTION"; + case CMD_KPLAYER_CTR_NTF_BASE: return "CMD_KPLAYER_CTR_NTF_BASE"; + case CMD_KPLAYER_CTR_CREATED: return "CMD_KPLAYER_CTR_CREATED"; + case CMD_KPLAYER_CTR_DELED: return "CMD_KPLAYER_CTR_DELED"; + case CMD_KPLAYER_CTR_PLAY: return "CMD_KPLAYER_CTR_PLAY"; + case CMD_KPLAYER_CTR_STOP: return "CMD_KPLAYER_CTR_STOP"; + case CMD_KPLAYER_CTR_PAUSE: return "CMD_KPLAYER_CTR_PAUSE"; + case CMD_KPLAYER_CTR_SEEK: return "CMD_KPLAYER_CTR_SEEK"; + case CMD_KPLAYER_CTR_SET_URL: return "CMD_KPLAYER_CTR_SET_URL"; + case CMD_KPLAYER_CTR_SET_VOLUME: return "CMD_KPLAYER_CTR_SET_VOLUME"; + case CMD_KPLAYER_CTR_SET_MUTE: return "CMD_KPLAYER_CTR_SET_MUTE"; + case CMD_KPLAYER_CTR_SET_NXT_URL: return "CMD_KPLAYER_CTR_SET_NXT_URL"; + case CMD_KPLAYER_CTR_SET_NEXT: return "CMD_KPLAYER_CTR_SET_NEXT"; + case CMD_KPLAYER_CTR_SET_PREV: return "CMD_KPLAYER_CTR_SET_PREV"; + case CMD_ALARM_SYNC_REQ: return "CMD_ALARM_SYNC_REQ"; + case CMD_ALARM_SYNC_RSP: return "CMD_ALARM_SYNC_RSP"; + case CMD_ALARM_ADD: return "CMD_ALARM_ADD"; + case CMD_ALARM_REMOVE: return "CMD_ALARM_REMOVE"; + case CMD_ALARM_REMOVEALL: return "CMD_ALARM_REMOVEALL"; + case CMD_REMAIND_SYNC_REQ: return "CMD_REMAIND_SYNC_REQ"; + case CMD_REMAIND_SYNC_RSP: return "CMD_REMAIND_SYNC_RSP"; + case CMD_REMAIND_ADD: return "CMD_REMAIND_ADD"; + case CMD_REMAIND_REMOVE: return "CMD_REMAIND_REMOVE"; + case CMD_REMAIND_REMOVEALL: return "CMD_REMAIND_REMOVEALL"; + case CMD_ASSISTANT_STATUS: return "CMD_ASSISTANT_STATUS"; + case CMD_ASSISTANT_RUNNING: return "CMD_ASSISTANT_RUNNING"; + case CMD_ASSISTANT_NOTIFY: return "CMD_ASSISTANT_NOTIFY"; + case CMD_SESSION_ALARM_SYNC: return "CMD_SESSION_ALARM_SYNC"; + case CMD_WORKDAY_DB_REQ: return "CMD_WORKDAY_DB_REQ"; + case CMD_WORKDAY_DB_RSP: return "CMD_WORKDAY_DB_RSP"; + case CMD_OTA_NOTIFY: return "CMD_OTA_NOTIFY"; + case CMD_OTA_STATUS: return "CMD_OTA_STATUS"; + case CMD_OTA_RUNNOW: return "CMD_OTA_RUNNOW"; + case CMD_LOG_CONFIG: return "CMD_LOG_CONFIG"; + default: return "Unknown CMD"; + } +} + +const char* ModuleNameToString(MODULE_NAME modName) +{ + switch(modName) + { + case MODULE_CONTROLLER: return "MODULE_CONTROLLER"; + case MODULE_ALARM: return "MODULE_ALARM"; + case MODULE_CALL: return "MODULE_CALL"; + case MODULE_VOICEENGINE: return "MODULE_VOICEENGINE"; + case MODULE_PLAYER: return "MODULE_PLAYER"; + case MODULE_CONFIGURE: return "MODULE_CONFIGURE"; + case MODULE_OTA: return "MODULE_OTA"; + case MODULE_WIFI: return "MODULE_WIFI"; + case MODULE_BT: return "MODULE_BT"; + case MODULE_KPLAYER: return "MODULE_KPLAYER"; + case MODULE_KPLAYER_TEST: return "MODULE_KPLAYER_TEST"; + case MODULE_SPLAYER: return "MODULE_SPLAYER"; + case MODULE_SPLAYER_TEST: return "MODULE_SPLAYER_TEST"; + case MODULE_LIGHT_MCU: return "MODULE_LIGHT_MCU"; + case MODULE_BLUEKC: return "MODULE_BLUEKC"; + case MODULE_BLUEKC_TEST: return "MODULE_BLUEKC_TEST"; + case MODULE_MANUFACTURE: return "MODULE_MANUFACTURE"; + case MODULE_BT_DEMO: return "MODULE_BT_DEMO"; + case MODULE_LOG_CTRL: return "MODULE_LOG_CTRL"; + } + + return "Unknown Module Name"; +} diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..0ee6e8f --- /dev/null +++ b/Makefile @@ -0,0 +1,90 @@ +SHELL := /bin/sh + +DIS_BUILD_WARRING ?= FALSE +EN_MAKE_MSG ?= TRUE + +ifeq ($(EN_MAKE_MSG), TRUE) +MAKE_FLAGS := +else +MAKE_FLAGS := -s +endif + +ifneq ($(OPT), clean) +ifneq ($(OPT), install) +MAKE_FLAGS += -j$(shell cat /proc/cpuinfo | grep processor | wc -l) +endif +endif + +ifeq ($(DIR), ) +DEMO_INS_PATH := ./release +else +DEMO_INS_PATH := $(DIR) +endif + +.PHONY : uvdbus example cfgserver alarm ota voice logctrl + +all: uvdbus example alarm ota logctrl + + +uvdbus: +ifeq ($(OPT), clean) + @make $(MAKE_FLAGS) -C build -f Makefile.lib.cross cleanall MAKE_TARGET=uvdbus +else ifeq ($(OPT), install) + @make $(MAKE_FLAGS) -C build -f Makefile.lib.cross install DIR=$(DIR) MAKE_TARGET=uvdbus +else + @make all $(MAKE_FLAGS) -C build -f Makefile.lib.cross DISABLE_WARRING=$(DIS_BUILD_WARRING) MAKE_TARGET=uvdbus +endif + +example: +ifeq ($(OPT), clean) + @make $(MAKE_FLAGS) -C build -f Makefile.app.cross cleanall MAKE_TARGET=example +else ifeq ($(OPT), install) + @make $(MAKE_FLAGS) -C build -f Makefile.app.cross install DIR=$(DIR) MAKE_TARGET=example +else + @make all $(MAKE_FLAGS) -C build -f Makefile.app.cross DISABLE_WARRING=$(DIS_BUILD_WARRING) MAKE_TARGET=example +endif + +cfgserver: +ifeq ($(OPT), clean) + @make $(MAKE_FLAGS) -C build -f Makefile.cfgsvr.cross cleanall MAKE_TARGET=cfgserver +else ifeq ($(OPT), install) + @make $(MAKE_FLAGS) -C build -f Makefile.cfgsvr.cross install DIR=$(DIR) MAKE_TARGET=cfgserver +else + @make all $(MAKE_FLAGS) -C build -f Makefile.cfgsvr.cross DISABLE_WARRING=$(DIS_BUILD_WARRING) MAKE_TARGET=cfgserver +endif + +alarm: +ifeq ($(OPT), clean) + @make $(MAKE_FLAGS) -C build -f Makefile.alarm.cross cleanall MAKE_TARGET=alarm +else ifeq ($(OPT), install) + @make $(MAKE_FLAGS) -C build -f Makefile.alarm.cross install DIR=$(DIR) MAKE_TARGET=alarm +else + @make all $(MAKE_FLAGS) -C build -f Makefile.alarm.cross DISABLE_WARRING=$(DIS_BUILD_WARRING) MAKE_TARGET=alarm +endif + +ota: +ifeq ($(OPT), clean) + @make $(MAKE_FLAGS) -C build -f Makefile.ota.cross cleanall MAKE_TARGET=ota +else ifeq ($(OPT), install) + @make $(MAKE_FLAGS) -C build -f Makefile.ota.cross install DIR=$(DIR) MAKE_TARGET=ota +else + @make all $(MAKE_FLAGS) -C build -f Makefile.ota.cross DISABLE_WARRING=$(DIS_BUILD_WARRING) MAKE_TARGET=ota +endif + +voice: +ifeq ($(OPT), clean) + @make $(MAKE_FLAGS) -C build -f Makefile.voice.cross cleanall MAKE_TARGET=voice +else ifeq ($(OPT), install) + @make $(MAKE_FLAGS) -C build -f Makefile.voice.cross install DIR=$(DIR) MAKE_TARGET=voice +else + @make all $(MAKE_FLAGS) -C build -f Makefile.voice.cross DISABLE_WARRING=$(DIS_BUILD_WARRING) MAKE_TARGET=voice +endif + +logctrl: +ifeq ($(OPT), clean) + @make $(MAKE_FLAGS) -C build -f Makefile.logctrl.cross cleanall MAKE_TARGET=logctrl +else ifeq ($(OPT), install) + @make $(MAKE_FLAGS) -C build -f Makefile.logctrl.cross install DIR=$(DIR) MAKE_TARGET=logctrl +else + @make all $(MAKE_FLAGS) -C build -f Makefile.logctrl.cross DISABLE_WARRING=$(DIS_BUILD_WARRING) MAKE_TARGET=logctrl +endif diff --git a/Modules/Alarm/assistant.c b/Modules/Alarm/assistant.c new file mode 100644 index 0000000..040083a --- /dev/null +++ b/Modules/Alarm/assistant.c @@ -0,0 +1,789 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(PLATFORM_R16) || defined (PLATFORM_CPU) +#include "log.h" +#include "libuv_dbus.h" +#include "crypto.h" +#include "json_struct.h" +#include "config_engine.h" +#include "assistant.h" +#else +#include +#include +#include +#include +#include +#include +#endif + +#define SYNC_TIME_DELAY (5) + +static PASSISTANT_ARRAY_INFO g_pAlarmArray = NULL, + g_pRemaindArray = NULL, + g_pSessionArray = NULL; + +static uv_rwlock_t g_uvListRwLock; +static unsigned char g_syncFlags; +static unsigned int g_sessionId = 0; + +static void __onAlarmCb(unsigned int tmId, unsigned int status, void *pUserData); + +static int __getTimerPriorty(ASSISTANT_TYPE itemType) +{ + switch(itemType) + { + case ASSISTANT_TYPE_CLOCK: + return (2); + + case ASSISTANT_TYPE_REMAIND: + return (3); + + case ASSISTANT_TYPE_SESSION: + return (1); + } + + return (0); +} + +static void __addTaskToTimer(PASSISTANT_ARRAY_INFO pItem) +{ + int ret = 0; + unsigned int alarmId; + + pItem->alarmItem.second = 0; + + alarmId = AlarmTimerAdd(pItem->alarmItem.year, + pItem->alarmItem.month, + pItem->alarmItem.day, + pItem->alarmItem.hour, + pItem->alarmItem.minute, + pItem->alarmItem.second, + pItem->alarmItem.weekDay, + pItem->alarmItem.repeatMode, + __onAlarmCb, + __getTimerPriorty(pItem->alarmItem.itemType), + &pItem->alarmItem, + &ret); + + if(alarmId != 0xFFFFFFFF && ret == 0) + { + pItem->alarmItem.timerId = alarmId; + } + else + { + pItem->alarmItem.timerId = 0xFFFFFFFF; + } +} + +static int __assistantRspStatus(int cmd, int val) +{ + int ret = 0; + ASSISTANT_RSP_STATUS oStatus; + + memset(&oStatus, 0, sizeof(ASSISTANT_RSP_STATUS)); + + oStatus.cmd = cmd; + oStatus.val = val; + + ret = DBusJsonSendToCommand(NULL, + g_pModInfoTable[MODULE_CONTROLLER].modAliase, + CMD_ASSISTANT_STATUS, + JSON_ENGINE_ASSISTANT_STATUS, + &oStatus, TRUE); + + return (ret); +} + +static int __assistantRunningEvent(PASSISTANT_ITEM_INFO pInfo) +{ + int ret = 0; + + ret = DBusJsonSendToCommand(NULL, + g_pModInfoTable[MODULE_CONTROLLER].modAliase, + CMD_ASSISTANT_RUNNING, + JSON_ENGINE_ASSISTANT_RUNNING, + pInfo, FALSE); + + return (ret); +} + +static int __assistantNotifyChange(int cmdNotify, int nItems, ASSISTANT_TYPE nType, PASSISTANT_ITEM_INFO pInfo) +{ + int ret = 0; + ASSISTANT_NOTIFY_INFO notifyInfo; + + memset(¬ifyInfo, 0, sizeof(ASSISTANT_NOTIFY_INFO)); + + notifyInfo.type = nType; + notifyInfo.cmd = cmdNotify; + + if(pInfo) + { + notifyInfo.nItems = nItems; + for(int i = 0; i < nItems; i++) + { + notifyInfo.ids[i] = pInfo[i].itemId; + } + } + + ret = DBusJsonSendToCommand(NULL, + g_pModInfoTable[MODULE_CONTROLLER].modAliase, + CMD_ASSISTANT_NOTIFY, + JSON_ENGINE_ASSISTANT_NOTIFY, + ¬ifyInfo, TRUE); + + return (ret); +} + +static int __assistantArrayNotifyChange(int cmdNotify, int nItems, ASSISTANT_TYPE nType, unsigned long long* pArray) +{ + int ret = 0; + ASSISTANT_NOTIFY_INFO notifyInfo; + + memset(¬ifyInfo, 0, sizeof(ASSISTANT_NOTIFY_INFO)); + + notifyInfo.type = nType; + notifyInfo.cmd = cmdNotify; + + if(pArray) + { + notifyInfo.nItems = nItems; + for(int i = 0; i < nItems; i++) + { + notifyInfo.ids[i] = pArray[i]; + } + } + + ret = DBusJsonSendToCommand(NULL, + g_pModInfoTable[MODULE_CONTROLLER].modAliase, + CMD_ASSISTANT_NOTIFY, + JSON_ENGINE_ASSISTANT_NOTIFY, + ¬ifyInfo, TRUE); + + return (ret); +} + +static void __cleanupAlarmArray(void) +{ + PASSISTANT_ARRAY_INFO pItem = NULL, pTmp = NULL; + + uv_rwlock_wrlock(&g_uvListRwLock); + DL_FOREACH_SAFE(g_pAlarmArray, pItem, pTmp) + { + AlarmTimerRemove(pItem->alarmItem.timerId); + DL_DELETE(g_pAlarmArray, pItem); + free(pItem); + } + uv_rwlock_wrunlock(&g_uvListRwLock); +} + +static void __cleanupRemaindArray(void) +{ + PASSISTANT_ARRAY_INFO pItem = NULL, pTmp = NULL; + + uv_rwlock_wrlock(&g_uvListRwLock); + DL_FOREACH_SAFE(g_pRemaindArray, pItem, pTmp) + { + AlarmTimerRemove(pItem->alarmItem.timerId); + DL_DELETE(g_pRemaindArray, pItem); + free(pItem); + } + uv_rwlock_wrunlock(&g_uvListRwLock); +} + +static void __cleanupSessionArray(void) +{ + PASSISTANT_ARRAY_INFO pItem = NULL, pTmp = NULL; + + uv_rwlock_wrlock(&g_uvListRwLock); + DL_FOREACH_SAFE(g_pSessionArray, pItem, pTmp) + { + AlarmTimerRemove(pItem->alarmItem.timerId); + DL_DELETE(g_pSessionArray, pItem); + free(pItem); + } + uv_rwlock_wrunlock(&g_uvListRwLock); +} + +static int __addNewItems(PASSISTANT_SYNC_INFO pInfo) +{ + struct tm localTime; + time_t loclStamp, tmStamp = time((time_t*)NULL); + + localtime_r(&tmStamp, &localTime); + loclStamp = mktime(&localTime); + + for(int i = 0; i < pInfo->nItems; i++) + { + PASSISTANT_ARRAY_INFO pItem = (PASSISTANT_ARRAY_INFO)malloc(sizeof(struct ASSISTANT_ARRAY_INFO)); + + if(pItem == NULL) + { + LOG_EX(LOG_Error, "Malloc Memory Error\n"); + return (-ERR_MALLOC_MEMORY); + } + + memset(pItem, 0, sizeof(struct ASSISTANT_ARRAY_INFO)); + + strcpy(pItem->alarmItem.strTips, pInfo->pAlarmInfo[i].strTips); + strcpy(pItem->alarmItem.resUrl, pInfo->pAlarmInfo[i].resUrl); + strcpy(pItem->alarmItem.voiceRes, pInfo->pAlarmInfo[i].voiceRes); + strcpy(pItem->alarmItem.voiceResType, pInfo->pAlarmInfo[i].voiceResType); + + pItem->alarmItem.itemType = pInfo->pAlarmInfo[i].itemType; + pItem->alarmItem.repeatMode = pInfo->pAlarmInfo[i].repeatMode; + pItem->alarmItem.voiceId = pInfo->pAlarmInfo[i].voiceId; + + pItem->alarmItem.year = pInfo->pAlarmInfo[i].year; + pItem->alarmItem.month = pInfo->pAlarmInfo[i].month; + pItem->alarmItem.day = pInfo->pAlarmInfo[i].day; + pItem->alarmItem.hour = pInfo->pAlarmInfo[i].hour; + pItem->alarmItem.minute = pInfo->pAlarmInfo[i].minute; + pItem->alarmItem.second = pInfo->pAlarmInfo[i].second; + pItem->alarmItem.weekDay = pInfo->pAlarmInfo[i].weekDay; + + if(ASSISTANT_TYPE_SESSION == pItem->alarmItem.itemType) + { + pItem->alarmItem.itemId = g_sessionId++; + } + else + { + pItem->alarmItem.itemId = pInfo->pAlarmInfo[i].itemId; + } + + if(pItem->alarmItem.repeatMode == REPEAT_MODE_NONE) + { + struct tm setTime; + time_t onTimeStamp; + int tmDiff; + + setTime.tm_year = pItem->alarmItem.year; + setTime.tm_mon = pItem->alarmItem.month; + setTime.tm_mday = pItem->alarmItem.day; + setTime.tm_hour = pItem->alarmItem.hour; + setTime.tm_min = pItem->alarmItem.minute; + setTime.tm_sec = pItem->alarmItem.second; + + onTimeStamp = mktime(&setTime); + tmDiff = (int)difftime(loclStamp, onTimeStamp); + + if(tmDiff >= 3) + { + LOG_EX(LOG_Warn, "%llu: Was Expired %d!!!!!!\n", pItem->alarmItem.itemId, tmDiff); + continue; + } + } + + uv_rwlock_wrlock(&g_uvListRwLock); + if(ASSISTANT_TYPE_CLOCK == pItem->alarmItem.itemType) + { + DL_APPEND(g_pAlarmArray, pItem); + } + else if(ASSISTANT_TYPE_REMAIND == pItem->alarmItem.itemType) + { + DL_APPEND(g_pRemaindArray, pItem); + } + else if(ASSISTANT_TYPE_SESSION == pItem->alarmItem.itemType) + { + DL_APPEND(g_pSessionArray, pItem); + } + else + { + LOG_EX(LOG_Error, "Unknown Type: %d\n", pItem->alarmItem.itemType); + } + uv_rwlock_wrunlock(&g_uvListRwLock); + + __addTaskToTimer(pItem); + } + + return (0); +} + +static void __removeAlarmItem(PASSISTANT_NOTIFY_INFO pRemove) +{ + PASSISTANT_ARRAY_INFO pItem = NULL, pTmp = NULL; + + for(int i = 0; i < pRemove->nItems; i++) + { + uv_rwlock_wrlock(&g_uvListRwLock); + DL_FOREACH_SAFE(g_pAlarmArray, pItem, pTmp) + { + if(pItem->alarmItem.itemId == pRemove->ids[i] + && pItem->alarmItem.itemType == pRemove->type) + { + AlarmTimerRemove(pItem->alarmItem.timerId); + DL_DELETE(g_pAlarmArray, pItem); + free(pItem); + } + } + uv_rwlock_wrunlock(&g_uvListRwLock); + } +} + +static void __removeRemaindItem(PASSISTANT_NOTIFY_INFO pRemove) +{ + PASSISTANT_ARRAY_INFO pItem = NULL, pTmp = NULL; + + for(int i = 0; i < pRemove->nItems; i++) + { + uv_rwlock_wrlock(&g_uvListRwLock); + DL_FOREACH_SAFE(g_pRemaindArray, pItem, pTmp) + { + if(pItem->alarmItem.itemId == pRemove->ids[i] + && pItem->alarmItem.itemType == pRemove->type) + { + AlarmTimerRemove(pItem->alarmItem.timerId); + DL_DELETE(g_pRemaindArray, pItem); + free(pItem); + } + } + uv_rwlock_wrunlock(&g_uvListRwLock); + } +} + +static int __alarmItemCmp(PASSISTANT_ARRAY_INFO pSrc, PASSISTANT_ARRAY_INFO pDst) +{ +#if 0 + fprintf(stdout, "id: %llu --> %llu, type: %u --> %u\n", + pSrc->alarmItem.itemId, pDst->alarmItem.itemId, + pSrc->alarmItem.itemType, pDst->alarmItem.itemType); +#endif + if(pSrc->alarmItem.itemId == pDst->alarmItem.itemId + && pSrc->alarmItem.itemType == pDst->alarmItem.itemType) + { + return (0); + } + else + { + return (1); + } +} + +static void __onAlarmCb(unsigned int tmId, unsigned int status, void *pUserData) +{ + PASSISTANT_ITEM_INFO pAlarm = (PASSISTANT_ITEM_INFO)pUserData; + PASSISTANT_ARRAY_INFO pItem = NULL; + struct ASSISTANT_ARRAY_INFO tmpItem; + + struct tm localTime; + time_t tmStamp = time((time_t*)NULL); + + localtime_r(&tmStamp, &localTime); + + LOG_EX(LOG_Debug, "Timer[%lld] %u On at [%04u-%02u-%02u %02u:%02u:%02u], status = %u\n", pAlarm->itemId, tmId, + localTime.tm_year + 1900, localTime.tm_mon + 1, localTime.tm_mday, + localTime.tm_hour, localTime.tm_min, localTime.tm_sec, + status); + + memset(&tmpItem, 0, sizeof(struct ASSISTANT_ARRAY_INFO)); + + tmpItem.alarmItem.itemId = pAlarm->itemId; + tmpItem.alarmItem.itemType = pAlarm->itemType; + + uv_rwlock_rdlock(&g_uvListRwLock); + if(pAlarm->itemType == ASSISTANT_TYPE_CLOCK) + { + DL_SEARCH(g_pAlarmArray, pItem, &tmpItem, __alarmItemCmp); + } + else if(pAlarm->itemType == ASSISTANT_TYPE_REMAIND) + { + DL_SEARCH(g_pRemaindArray, pItem, &tmpItem, __alarmItemCmp); + } + else if(pAlarm->itemType == ASSISTANT_TYPE_SESSION) + { + DL_SEARCH(g_pSessionArray, pItem, &tmpItem, __alarmItemCmp); + } + else + { + LOG_EX(LOG_Error, "Unknown type: %d\n", pAlarm->itemType); + } + uv_rwlock_rdunlock(&g_uvListRwLock); + + if(pItem) + { + pItem->alarmItem.year += 1900; + pItem->alarmItem.month += 1; + + __assistantRunningEvent(&pItem->alarmItem); + + if((pItem->alarmItem.repeatMode & 0xFF) == REPEAT_MODE_NONE) + { + uv_rwlock_wrlock(&g_uvListRwLock); + if(pAlarm->itemType == ASSISTANT_TYPE_CLOCK) + { + DL_DELETE(g_pAlarmArray, pItem); + } + else if(pAlarm->itemType == ASSISTANT_TYPE_REMAIND) + { + DL_DELETE(g_pRemaindArray, pItem); + } + else if(pAlarm->itemType == ASSISTANT_TYPE_SESSION) + { + DL_DELETE(g_pSessionArray, pItem); + } + else + { + LOG_EX(LOG_Error, "Unknown type: %d\n", pAlarm->itemType); + } + uv_rwlock_wrunlock(&g_uvListRwLock); + + free(pItem); + } + } +} + +static PDBUS_MSG_PACK __dBusOnMessage(uv_loop_t *pLoop, DBusConnection *pConn, PDBUS_MSG_PACK pMsg) +{ + PASSISTANT_SYNC_INFO pInfo = NULL; + PASSISTANT_NOTIFY_INFO pNotifyInfo = NULL; + int err = 0; + + if(!pMsg || !pLoop || !pConn) + { + return (NULL); + } + + if(pMsg->msgDests == 0xFFFFFFFF) + { + return (NULL); + } + + LOG_EX(LOG_Debug, "JSON(%08X) %s: %s\n", pMsg->busCmd, DBusCmdToString(pMsg->busCmd), (const char *)pMsg->pMsg); + + switch(pMsg->busCmd) + { + case CMD_SESSION_ALARM_SYNC: + pInfo = (PASSISTANT_SYNC_INFO)Json2Struct((const char *)pMsg->pMsg, JSON_ENGINE_ASSISTANT_SYNC_RSP, FALSE, &err); + + if(pInfo) + { + __printAssistantSyncInfo(DBusCmdToString(pMsg->busCmd), pInfo); + + __cleanupSessionArray(); + + if(pInfo->pAlarmInfo && pInfo->nItems > 0) + { + err = __addNewItems(pInfo); + } + + __assistantRspStatus(pMsg->busCmd, err); + + free(pInfo->pAlarmInfo); + free(pInfo); + } + else + { + __assistantRspStatus(pMsg->busCmd, -ERR_INPUT_PARAMS); + } + break; + + case CMD_ALARM_SYNC_RSP: + pInfo = (PASSISTANT_SYNC_INFO)Json2Struct((const char *)pMsg->pMsg, JSON_ENGINE_ASSISTANT_SYNC_RSP, FALSE, &err); + + if(pInfo) + { + g_syncFlags |= 1 << ASSISTANT_TYPE_CLOCK; + + __printAssistantSyncInfo(DBusCmdToString(pMsg->busCmd), pInfo); + + __cleanupAlarmArray(); + + if(pInfo->pAlarmInfo && pInfo->nItems > 0) + { + err = __addNewItems(pInfo); + } + + __assistantRspStatus(pMsg->busCmd, err); + + free(pInfo->pAlarmInfo); + free(pInfo); + } + else + { + __assistantRspStatus(pMsg->busCmd, -ERR_INPUT_PARAMS); + } + + break; + + case CMD_ALARM_ADD: + pInfo = (PASSISTANT_SYNC_INFO)Json2Struct((const char *)pMsg->pMsg, JSON_ENGINE_ASSISTANT_SYNC_RSP, TRUE, &err); + + if(pInfo) + { + __printAssistantSyncInfo(DBusCmdToString(pMsg->busCmd), pInfo); + + if(pInfo->pAlarmInfo && pInfo->nItems > 0) + { + err = __addNewItems(pInfo); + __assistantRspStatus(pMsg->busCmd, err); + + if(err == 0) + { + __assistantNotifyChange(pMsg->busCmd, pInfo->nItems, ASSISTANT_TYPE_CLOCK, pInfo->pAlarmInfo); + } + } + else + { + __assistantRspStatus(pMsg->busCmd, -ERR_INPUT_PARAMS); + } + + free(pInfo->pAlarmInfo); + free(pInfo); + } + else + { + __assistantRspStatus(pMsg->busCmd, -ERR_INPUT_PARAMS); + } + break; + + case CMD_ALARM_REMOVE: + pNotifyInfo = (PASSISTANT_NOTIFY_INFO)Json2Struct((const char *)pMsg->pMsg, + JSON_ENGINE_ASSISTANT_NOTIFY, FALSE, &err); + + if(pNotifyInfo) + { + __printAssistantNofifyInfo(DBusCmdToString(pMsg->busCmd), pNotifyInfo); + + if(pNotifyInfo->nItems > 0) + { + __removeAlarmItem(pNotifyInfo); + __assistantRspStatus(pMsg->busCmd, 0); + __assistantArrayNotifyChange(pMsg->busCmd, pNotifyInfo->nItems, ASSISTANT_TYPE_CLOCK, pNotifyInfo->ids); + } + else + { + __assistantRspStatus(pMsg->busCmd, -ERR_INPUT_PARAMS); + } + + free(pNotifyInfo); + } + else + { + __assistantRspStatus(pMsg->busCmd, -ERR_INPUT_PARAMS); + } + + break; + + case CMD_ALARM_REMOVEALL: + __cleanupAlarmArray(); + __assistantRspStatus(pMsg->busCmd, 0); + __assistantNotifyChange(pMsg->busCmd, 0, ASSISTANT_TYPE_CLOCK, NULL); + break; + + case CMD_REMAIND_SYNC_RSP: + pInfo = (PASSISTANT_SYNC_INFO)Json2Struct((const char *)pMsg->pMsg, JSON_ENGINE_ASSISTANT_SYNC_RSP, FALSE, &err); + + if(pInfo) + { + g_syncFlags |= 1 << ASSISTANT_TYPE_REMAIND; + + __printAssistantSyncInfo(DBusCmdToString(pMsg->busCmd), pInfo); + + __cleanupRemaindArray(); + + if(pInfo->pAlarmInfo && pInfo->nItems > 0) + { + err = __addNewItems(pInfo); + } + + __assistantRspStatus(pMsg->busCmd, err); + + free(pInfo->pAlarmInfo); + free(pInfo); + } + else + { + __assistantRspStatus(pMsg->busCmd, -ERR_INPUT_PARAMS); + } + break; + + case CMD_REMAIND_ADD: + pInfo = (PASSISTANT_SYNC_INFO)Json2Struct((const char *)pMsg->pMsg, JSON_ENGINE_ASSISTANT_SYNC_RSP, TRUE, &err); + + if(pInfo) + { + __printAssistantSyncInfo(DBusCmdToString(pMsg->busCmd), pInfo); + + if(pInfo->pAlarmInfo && pInfo->nItems > 0) + { + err = __addNewItems(pInfo); + __assistantRspStatus(pMsg->busCmd, err); + + if(err == 0) + { + __assistantNotifyChange(pMsg->busCmd, pInfo->nItems, ASSISTANT_TYPE_REMAIND, pInfo->pAlarmInfo); + } + } + else + { + __assistantRspStatus(pMsg->busCmd, -ERR_INPUT_PARAMS); + } + + free(pInfo->pAlarmInfo); + free(pInfo); + } + else + { + __assistantRspStatus(pMsg->busCmd, -ERR_INPUT_PARAMS); + } + break; + + case CMD_REMAIND_REMOVE: + pNotifyInfo = (PASSISTANT_NOTIFY_INFO)Json2Struct((const char *)pMsg->pMsg, + JSON_ENGINE_ASSISTANT_NOTIFY, FALSE, &err); + + if(pNotifyInfo) + { + __printAssistantNofifyInfo(DBusCmdToString(pMsg->busCmd), pNotifyInfo); + + if(pNotifyInfo->nItems > 0) + { + __removeRemaindItem(pNotifyInfo); + __assistantRspStatus(pMsg->busCmd, 0); + __assistantArrayNotifyChange(pMsg->busCmd, pNotifyInfo->nItems, ASSISTANT_TYPE_REMAIND, pNotifyInfo->ids); + } + else + { + __assistantRspStatus(pMsg->busCmd, -ERR_INPUT_PARAMS); + } + + free(pNotifyInfo); + } + else + { + __assistantRspStatus(pMsg->busCmd, -ERR_INPUT_PARAMS); + } + break; + + case CMD_REMAIND_REMOVEALL: + __cleanupRemaindArray(); + __assistantRspStatus(pMsg->busCmd, 0); + __assistantNotifyChange(pMsg->busCmd, 0, ASSISTANT_TYPE_REMAIND, NULL); + break; + } + + return (NULL); +} + +static void __dBusDeameonCb(MODULE_NAME modName, int status) +{ + if(status) + { + LOG_EX(LOG_Error, "Daemon(%d) Msg: [%s]\n", modName, status == 0 ? "Connect" : "Disconnect"); + } + else + { + LOG_EX(LOG_Info, "Daemon(%d) Msg: [%s]\n", modName, status == 0 ? "Connect" : "Disconnect"); + } + +#if 0 + if(modName == MODULE_CONTROLLER && status == 0) + { + int ret = DBusSendToCommand(NULL, + g_pModInfoTable[MODULE_CONTROLLER].modAliase, + CMD_ALARM_SYNC_REQ, ""); + + LOG_EX(LOG_Debug, "Send CMD_ALARM_SYNC_REQ Command: %d\n", ret); + + ret = DBusSendToCommand(NULL, + g_pModInfoTable[MODULE_CONTROLLER].modAliase, + CMD_REMAIND_SYNC_REQ, ""); + + LOG_EX(LOG_Debug, "Send CMD_REMAIND_SYNC_REQ Command: %d\n", ret); + } +#endif +} + +static void __assistantSyncThread(void *pParam) +{ + int ret, isSynced = -1; + + LOG_EX(LOG_Debug, "Beging Sync holiday Database\n"); + + do + { + if((g_syncFlags & (1 << ASSISTANT_TYPE_CLOCK)) == 0) + { + ret = DBusSendToCommand(NULL, + g_pModInfoTable[MODULE_CONTROLLER].modAliase, + CMD_ALARM_SYNC_REQ, ""); + + LOG_EX(LOG_Debug, "Send CMD_ALARM_SYNC_REQ Command: %d\n", ret); + } + + if((g_syncFlags & (1 << ASSISTANT_TYPE_REMAIND)) == 0) + { + ret = DBusSendToCommand(NULL, + g_pModInfoTable[MODULE_CONTROLLER].modAliase, + CMD_REMAIND_SYNC_REQ, ""); + +// LOG_EX(LOG_Debug, "Send CMD_REMAIND_SYNC_REQ Command: %d\n", ret); + } + + if(isSynced < 0) + { + isSynced = CurrentIsWorkDay(0, 0); + } + + sleep(SYNC_TIME_DELAY); + } while(g_syncFlags != ((1 << ASSISTANT_TYPE_CLOCK) | (1 << ASSISTANT_TYPE_REMAIND))); + + LOG_EX(LOG_Debug, "Sync holiday Database Finished\n"); + + ret = DBusSendToCommand(NULL, + g_pModInfoTable[MODULE_CONTROLLER].modAliase, + CMD_ALARM_SYNC_REQ, ""); + + LOG_EX(LOG_Debug, "Send CMD_ALARM_SYNC_REQ Command: %d\n", ret); + + ret = DBusSendToCommand(NULL, + g_pModInfoTable[MODULE_CONTROLLER].modAliase, + CMD_REMAIND_SYNC_REQ, ""); + + LOG_EX(LOG_Debug, "Send CMD_REMAIND_SYNC_REQ Command: %d\n", ret); + + pthread_detach(pthread_self()); +} + +int main(int argc, char **argv) +{ + int ret = 0; + DBusConnection* pBus; + uv_loop_t* pLoop = GetDBusDefaultLoop(); + uv_thread_t uvSyncThread; + + pBus = DBusWithLibuvInit(pLoop, g_pModInfoTable[MODULE_ALARM].modAliase, + __dBusOnMessage, + __dBusDeameonCb, + NULL, &ret); + + if(pBus == NULL) + { + fprintf(stderr, "DBusWithLibuvInit Error: %d\n", ret); + return 0; + } + + uv_rwlock_init(&g_uvListRwLock); + + AlarmTimerInit(pLoop); + + g_syncFlags = 0; + uv_thread_create(&uvSyncThread, __assistantSyncThread, NULL); + RunUVLoop(pLoop); + + while(TRUE) + { + usleep(1000); + } + + return 0; +} diff --git a/Modules/ConfigServer/config_server.c b/Modules/ConfigServer/config_server.c new file mode 100644 index 0000000..e7b2ed0 --- /dev/null +++ b/Modules/ConfigServer/config_server.c @@ -0,0 +1,210 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef PLATFORM_R16 +#include "log.h" +#include "libuv_dbus.h" +#include "crypto.h" +#include "json_struct.h" +#include "config_engine.h" +#else +#include +#include +#include +#include +#include +#endif + +static PDBUS_MSG_PACK __dBusOnMessage(uv_loop_t* pLoop, DBusConnection* pConn, PDBUS_MSG_PACK pMsg) +{ +#if 0 + int err; + int iValue; + double dValue; + PCFG_API_REQ pReq = NULL; + const char *pJsonStr = NULL; + CFG_API_RSP cfgRsp; + char *pEndPtr = NULL; + int overWrite = FALSE; + + if(pMsg == NULL || pMsg->pMsg == NULL) + { + return (NULL); + } + + pJsonStr = (const char *)pMsg->pMsg; + pReq = (PCFG_API_REQ)Json2Struct(pJsonStr, JSON_ENGINE_CFG_REQ, TRUE, &err); + + memset(&cfgRsp, 0, sizeof(CFG_API_RSP)); + strncpy(cfgRsp.keyName, pReq->keyName, MAX_CFG_KEY_NAME); + strncpy(cfgRsp.keyValue, pReq->keyValue, MAX_CFG_KEY_VALUE); + cfgRsp.keyType = pReq->keyType; + + if(pReq == NULL || err != 0) + { + LOG_EX(LOG_Error, "Decode Json Error: %p, %d\n", pReq, err); + if(pReq) + { + free(pReq); + } + return (NULL); + } + + switch(pMsg->busCmd) + { + case CMD_CFG_ADD: + case CMD_CFG_CHANGE: + + if(pMsg->busCmd == CMD_CFG_CHANGE) + { + CFG_ITEM item; + PCFG_ITEM pItem = &item; + + if(CfgGetKeyValue(pReq->keyName, &pItem) == -ERR_CFG_NOITEM) + { + cfgRsp.errNo = -ERR_CFG_NOITEM; + DBusJsonSendToCommand(NULL, g_pModInfoTable[pMsg->msgSrc].modAliase, CMD_CFG_UPG_NOTIFY, JSON_ENGINE_CFG_RSP, &cfgRsp, TRUE); + return (NULL); + } + + overWrite = TRUE; + } + + switch(pReq->keyType) + { + case CFG_TYPE_STRING: + cfgRsp.errNo = CfgAddGlobalStringItem(pReq->keyName, pReq->keyValue, overWrite); + break; + + case CFG_TYPE_INT: + iValue = strtol(pReq->keyValue, NULL, 10); + + if(errno != ERANGE && errno != EINVAL) + { + cfgRsp.errNo = CfgAddGlobalIntItem(pReq->keyName, iValue, overWrite); + + if(cfgRsp.errNo != 0) + { + LOG_EX(LOG_Error, "Add Configure [%s](%d) --> [%s] Error: %d\n", + pReq->keyName, pReq->keyType, pReq->keyValue, err); + } + } + else + { + cfgRsp.errNo = -ERR_INPUT_PARAMS; + + LOG_EX(LOG_Error, "Input Params Error: [%s](%d) --> [%s]\n", + pReq->keyName, pReq->keyType, pReq->keyValue); + } + + break; + + case CFG_TYPE_DOUBLE: + dValue = strtod(pReq->keyValue, &pEndPtr); + + if((errno == ERANGE) || (dValue == 0 && (strcmp(pReq->keyName, pEndPtr) == 0))) + { + cfgRsp.errNo = -ERR_INPUT_PARAMS; + LOG_EX(LOG_Error, "Input Params Error: [%s](%d) --> [%s]\n", + pReq->keyName, pReq->keyType, pReq->keyValue); + } + else + { + cfgRsp.errNo = CfgAddGlobalIntItem(pReq->keyName, dValue, overWrite); + + if(cfgRsp.errNo != 0) + { + LOG_EX(LOG_Error, "Add Configure [%s](%d) --> [%s] Error: %d\n", + pReq->keyName, pReq->keyType, pReq->keyValue, err); + } + } + break; + + default: + cfgRsp.errNo = -ERR_UNKNOWN_TYPE; + break; + } + + if(cfgRsp.errNo == 0) + { + DBusJsonBoardcastCommand(NULL, 0xFFFFFFFF, CMD_CFG_UPG_NOTIFY, JSON_ENGINE_CFG_RSP, &cfgRsp, TRUE); + } + else + { + DBusJsonSendToCommand(NULL, g_pModInfoTable[pMsg->msgSrc].modAliase, CMD_CFG_UPG_NOTIFY, JSON_ENGINE_CFG_RSP, &cfgRsp, TRUE); + } + break; + + case CMD_CFG_GET: + { + PCFG_ITEM pItem = NULL; + + if(CfgGetKeyValue(pReq->keyName, &pItem) == -ERR_CFG_NOITEM) + { + cfgRsp.errNo = -ERR_CFG_NOITEM; + DBusJsonSendToCommand(NULL, g_pModInfoTable[pMsg->msgSrc].modAliase, CMD_CFG_UPG_NOTIFY, JSON_ENGINE_CFG_RSP, &cfgRsp, TRUE); + return (NULL); + } + else + { + memset(cfgRsp.keyValue, 0, MAX_CFG_KEY_VALUE); + cfgRsp.keyType = pItem->keyType; + + if(pItem->keyType == CFG_TYPE_STRING) + { + strncpy(cfgRsp.keyValue, pItem->pStrValue, MAX_CFG_KEY_VALUE); + } + else if(pItem->keyType == CFG_TYPE_INT) + { + sprintf(cfgRsp.keyValue, "%d", pItem->intValue); + } + else if(pItem->keyType == CFG_TYPE_DOUBLE) + { + sprintf(cfgRsp.keyValue, "%f", pItem->doubleValue); + } + + DBusJsonSendToCommand(NULL, g_pModInfoTable[pMsg->msgSrc].modAliase, CMD_CFG_GET, JSON_ENGINE_CFG_RSP, &cfgRsp, TRUE); + } + } + break; + + default: + //cfgRsp.errNo = -ERR_UNKNOWN_TYPE; + //DBusJsonSendToCommand(NULL, g_pModInfoTable[pMsg->msgSrc].modAliase, CMD_CFG_UPG_NOTIFY, JSON_ENGINE_CFG_RSP, &cfgRsp, TRUE); + break; + } +#endif + return NULL; +} + +static void __dBusHeartLost(MODULE_NAME loster) +{ + LOG_EX(LOG_Error, "Found %d Heart Lost\n", loster); +} + +int main(int argc, char** argv) +{ + int ret = 0; + uv_loop_t* pLoop = GetDBusDefaultLoop(); + DBusConnection* pBus = DBusWithLibuvInit(pLoop, g_pModInfoTable[MODULE_CONFIGURE].modAliase, + __dBusOnMessage, + NULL, + NULL, &ret); + + if(pBus == NULL) + { + fprintf(stderr, "DBusWithLibuvInit Error: %d\n", ret); + return 0; + } + + //DBusWithLibuvCfgInit(__onCfgMsgCb); + //DBusWithLibuvCfgInit(); + return uv_run(pLoop, UV_RUN_DEFAULT); +} + diff --git a/Modules/LogCtrl/log_ctrl.c b/Modules/LogCtrl/log_ctrl.c new file mode 100644 index 0000000..ce94a86 --- /dev/null +++ b/Modules/LogCtrl/log_ctrl.c @@ -0,0 +1,323 @@ + #include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(PLATFORM_R16) || defined (PLATFORM_CPU) +#include "log.h" +#include "libuv_dbus.h" +#include "json_struct.h" + +#else +#include +#include +#include +#endif + +static MOD_INFO_TABLE g_ModInfo; + + +static PDBUS_MSG_PACK DBusOnMessage(uv_loop_t* pLoop, DBusConnection* pConn, PDBUS_MSG_PACK pMsg) +{ + //int i, ret, err; + //uint32_t tm = LIBUV_CURRENT_TIME_US(); + + if(!pMsg || !pLoop || !pConn) + { + return NULL; + } + + //LOG_EX(LOG_Info, "Process Message(%u --> 0x%08X) at [%lu.%06lu]: cmd = %u, size = %u, key = %d, msg(%d) = [%s]\n", + // pMsg->msgSrc, pMsg->msgDests, tm / 1000000, tm % 1000000, pMsg->busCmd, pMsg->msgSize, pMsg->msgKey, pMsg->msgSize, pMsg->pMsg); + + return NULL; +} + +static void __logCtrlProc(void *pParams) +{ + int i = 0; + //int ret; + + LOG_LEVEL logLevelInfo[] = { + LOG_Fatal, LOG_Error, LOG_Warn, LOG_Debug, LOG_Info, + LOG_Test, LOG_Call, LOG_Devp, LOG_Step, LOG_Unknown, LOG_All, LOG_Close + }; + + const char* g_Menu[] = { + "Usage: enable/disable [params1] [params2]\n" + " help\n", + " quit\n", + }; + + const char* pOptMenu[] = { + "\n operation:\n" + " |--------------------------------------------------------------------------|\n", + " | command | operation | params1 | params2 |\n", + " |--------------------------------------------------------------------------|\n", + " | enable | | | |\n", + " |----------| 0: Set log level | Log level | Unused |\n", + " | disable | | | |\n", + " |----------|---------------------|-----------------------|-----------------|\n", + " | enable | | | |\n", + " |----------| 1: Print to file | Unused | Unused |\n", + " | disable | | | |\n", + " |----------|---------------------|-----------------------|-----------------|\n", + " | enable | | | |\n", + " |----------| 2: Backup to email | Unused | Unused |\n", + " | disable | | | |\n", + " |----------|---------------------|-----------------------|-----------------|\n", + " | enable | | Log server ip address | Log server port |\n", + " |----------| 3: Send to network |-----------------------|-----------------|\n", + " | disable | | Unused | Unused |\n", + " |--------------------------------------------------------------------------|\n", + " | enable | | | |\n", + " |----------| 4: Backup to Server | Unused | Unused |\n", + " | disable | | | |\n", + " |----------|---------------------|-----------------------|-----------------|\n", + }; + + while(TRUE) + { + char *pInput = NULL; + char *pCmd = NULL; + + for(i = 0; i < sizeof(g_Menu) / sizeof(g_Menu[0]); i++) + { + LOG_EX2(LOG_Info, "%s", g_Menu[i]); + } + + pInput = readline("Enter Command:"); + + if(pInput == NULL) + { + continue; + } + + pCmd = strtok(pInput, " "); + i = 0; + + while(pCmd != NULL) + { + if(strcmp(pCmd, "help") == 0) + { + for(i = 0; i < sizeof(g_pModInfoTable) / sizeof(g_pModInfoTable[0]); i++) + { + if(i == 0) + { + LOG_EX2(LOG_Info, " modName : %-2d --> %s\n", + i, ModuleNameToString(g_pModInfoTable[i].modName)); + } + else + { + LOG_EX2(LOG_Info, "%15s%-2d --> %s\n", "", + i, ModuleNameToString(g_pModInfoTable[i].modName)); + } + } + + for(i = 0; i < sizeof(logLevelInfo) / sizeof(logLevelInfo[0]); i++) + { + if(i == 0) + { + LOG_EX2(LOG_Info, "\n Log Level: %-2d --> %s\n", i, LogLeveToString(logLevelInfo[i])); + } + else + { + LOG_EX2(LOG_Info, "%15s%-2d --> %s\n", "", i, LogLeveToString(logLevelInfo[i])); + } + } + + for(i = 0; i < sizeof(pOptMenu) / sizeof(pOptMenu[0]); i++) + { + LOG_EX2(LOG_Info, "%s", pOptMenu[i]); + } + } + else if(strcmp(pCmd, "enable") == 0 + || strcmp(pCmd, "disable") == 0) + { + LOG_CFG_PROTOCOL logItem; + int iCmd, iMod; + char *pParams1 = NULL, *pParams2 = NULL; + char* pMod = strtok(NULL, " "); + char* pOperat = strtok(NULL, " "); + + if(pMod == NULL || strlen(pMod) == 0) + { + LOG_EX(LOG_Error, "Input error, see help\n"); + break; + } + + if(pOperat == NULL || strlen(pOperat) == 0) + { + LOG_EX(LOG_Error, "Input error, see help\n"); + break; + } + + iMod = strtol(pMod, NULL, 10); + + if(iMod < 0 || iMod >= MODULE_MAX) + { + LOG_EX(LOG_Error, "Input error: %s(%d)\n", pMod, iMod); + break; + } + + iCmd = strtol(pOperat, NULL, 10); + + memset(&logItem, 0, sizeof(LOG_CFG_PROTOCOL)); + + switch(iCmd) + { + case 0: + pParams1 = strtok(NULL, " "); + if(pParams1 && strlen(pParams1) > 0) + { + int logLevel = strtol(pParams1, NULL, 10); + + if(logLevel >= 0 && logLevel < sizeof(logLevelInfo) / sizeof(logLevelInfo[0])) + { + LOG_EX2(LOG_Info, "%s %d 0x%08X\n", pCmd, iCmd, logLevelInfo[logLevel]); + + logItem.cfgCmd = CMD_LOG_LEVEL; + logItem.iParams2 = (strcmp(pCmd, "disable") == 0) ? FALSE : TRUE; + logItem.iParams1 = logLevelInfo[logLevel]; + + DBusJsonSendToCommand(NULL, + g_pModInfoTable[iMod].modAliase, + CMD_LOG_CONFIG, + JSON_ENGINE_LOG_CFG_CMD, + &logItem, TRUE); + } + else + { + LOG_EX(LOG_Error, "Input error, see help\n"); + } + } + else + { + LOG_EX(LOG_Error, "Input error, see help\n"); + } + break; + + case 1: + logItem.cfgCmd = CMD_LOG_FILE; + logItem.iParams1 = (strcmp(pCmd, "disable") == 0) ? FALSE : TRUE; + DBusJsonSendToCommand(NULL, + g_pModInfoTable[iMod].modAliase, + CMD_LOG_CONFIG, + JSON_ENGINE_LOG_CFG_CMD, + &logItem, TRUE); + break; + + case 2: + logItem.cfgCmd = CMD_LOG_MAIL; + logItem.iParams1 = (strcmp(pCmd, "disable") == 0) ? FALSE : TRUE; + DBusJsonSendToCommand(NULL, + g_pModInfoTable[iMod].modAliase, + CMD_LOG_CONFIG, + JSON_ENGINE_LOG_CFG_CMD, + &logItem, TRUE); + break; + + case 3: + pParams1 = strtok(NULL, " "); + + logItem.cfgCmd = CMD_LOG_NETWORK; + if(pParams1 == NULL || strlen(pParams1) == 0) + { + + logItem.iParams1 = 0; + DBusJsonSendToCommand(NULL, + g_pModInfoTable[iMod].modAliase, + CMD_LOG_CONFIG, + JSON_ENGINE_LOG_CFG_CMD, + &logItem, TRUE); + } + else + { + pParams2 = strtok(NULL, " "); + + if(pParams2 != NULL && strlen(pParams2) > 0) + { + logItem.iParams1 = inet_addr(pParams1); + logItem.iParams2 = strtol(pParams2, NULL, 10); + DBusJsonSendToCommand(NULL, + g_pModInfoTable[iMod].modAliase, + CMD_LOG_CONFIG, + JSON_ENGINE_LOG_CFG_CMD, + &logItem, TRUE); + } + else + { + LOG_EX(LOG_Error, "Input error, pParams2 = %s\n", + SAFE_STRING_VALUE(pParams2)); + } + } + + break; + + case 4: + logItem.cfgCmd = CMD_LOG_SERVER; + logItem.iParams1 = (strcmp(pCmd, "disable") == 0) ? FALSE : TRUE; + DBusJsonSendToCommand(NULL, + g_pModInfoTable[iMod].modAliase, + CMD_LOG_CONFIG, + JSON_ENGINE_LOG_CFG_CMD, + &logItem, TRUE); + break; + + default: + LOG_EX(LOG_Error, "Unknown operation(0-3) %s, see help\n", pOperat); + break; + } + } + else if(strcmp(pCmd, "quit") == 0) + { + return; + } + + pCmd = strtok(NULL, " "); + } + + usleep(1000); + } + + pthread_detach(pthread_self()); +} + +int main(int argc, char **argv) +{ + int ret = 0; + DBusConnection* pBus = NULL; + uv_thread_t uvThread; + uv_loop_t* pLoop = GetDBusDefaultLoop(); + + memcpy(&g_ModInfo, &g_pModInfoTable[MODULE_LOG_CTRL], sizeof(MOD_INFO_TABLE)); + + pBus = DBusWithLibuvInit(pLoop, g_ModInfo.modAliase, + DBusOnMessage, + NULL, + NULL, + &ret); + + if(pBus == NULL) + { + fprintf(stderr, "DBusWithLibuvInit Error: %d\n", ret); + return 0; + } + + uv_thread_create(&uvThread, __logCtrlProc, NULL); + + RunUVLoop(pLoop); + + while(TRUE) + { + usleep(1000); + } + + return (0); +} + diff --git a/Modules/OTA/ota.c b/Modules/OTA/ota.c new file mode 100644 index 0000000..953bb07 --- /dev/null +++ b/Modules/OTA/ota.c @@ -0,0 +1,1389 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(PLATFORM_R16) || defined (PLATFORM_CPU) +#include "log.h" +#include "libuv_dbus.h" +#include "crypto.h" +#include "json_struct.h" +#include "config_engine.h" +#include "inet_api.h" +#include "ota.h" +#else +#include +#include +#include +#include +#include +#include +#include +#endif + + +#define MAX_IPL_ITEM (4) +#define IPL_PARAMS_PARTITION ("/dev/by-name/IPL3") +#define IPL3_MAGIC_NAME ("R16IPL3\0") +#define BOOT_IMG_FILE_NAME ("boot.img") +#define ROOTFS_IMG_FILE_NAME ("rootfs.img") +#define EXT_FS_UUID_FILE ("/etc/.extroot-uuid") +#define OTA_TEMP_DIR ("/tmp/ota") +#define OTA_FILE_DOWNLOAD_DIR ("/mnt/UDISK/ota") +#define OTA_MEMORY_DOWNLOAD_DIR ("/tmp/UDISK/ota") + +typedef enum +{ + OTA_PARTITION_BOOT = 0, + OTA_PARTITION_ROOTFS, + OTA_PARTITION_IPL_BOOT, + OTA_PARTITION_IPL_ROOTFS, + OTA_PARTITION_IPL_PARAMS, + OTA_PARTITION_MAX +} OTA_PARTITION_NAME; + +typedef struct +{ + OTA_PARTITION_NAME partName; + const char *pPartPath; + unsigned int partSize; +} OTA_PARTITION_INFO, *POTA_PARTITION_INFO; + +typedef struct { + unsigned int fileSize; + unsigned char md5sum[MD5_CHKSUM_LEN]; + int reserved[4]; +}IPL_DATA_ITEM, *PIPL_DATA_ITEM; + +typedef struct { + char pMagicTag[8]; + unsigned int setupStatus; + SETUP_MODE setupMode; + int curVersion; +// int kernelVer; +// char rfsVersion[1024]; + IPL_DATA_ITEM iplItem[OTA_PARTITION_MAX - 1]; + unsigned char md5sum[MD5_CHKSUM_LEN]; +}IPL_DATA_INFO, *PIPL_DATA_INFO; + +typedef struct +{ + OTA_FILE_INFO fileInfo; + + char pPath[MAX_PATH]; + int dlStatus; + int retCode; + uv_barrier_t* puvBarrier; +} DOWNLOAD_TASK_INFO, *PDOWNLOAD_TASK_INFO; + +static IPL_DATA_INFO g_iplInfo; +static char g_otaDownloadPath[MAX_PATH]; +static SETUP_MODE g_sSetupStatus = NORMAL_SETUP; + +static OTA_PARTITION_INFO g_otaPartInfo[] = { + {OTA_PARTITION_BOOT, "/dev/by-name/boot", 0}, + {OTA_PARTITION_ROOTFS, "/dev/by-name/rootfs", 0}, + {OTA_PARTITION_IPL_BOOT, "/dev/by-name/IPL1", 0}, + {OTA_PARTITION_IPL_ROOTFS, "/dev/by-name/IPL2", 0}, + {OTA_PARTITION_IPL_PARAMS, "/dev/by-name/IPL3", 0}, +}; + +static unsigned int g_IsOTAMode = 0; +static uv_barrier_t g_otaBarrier; +static uv_loop_t* g_pMainLoop = NULL; +static int g_isDownloading = FALSE; +static int g_isBackupMode = FALSE; + +static const char *g_umountPart[] = { "/usr", "/overlay", "/boot", "/rom", "/" }; + +static void __printfOTANotifyCmd(const char *pTags, POTA_DATA_INFO pInfo) +{ + if(pTags && strlen(pTags) > 0) + { + LOG_EX2(LOG_Debug, "%s:\n", pTags); + LOG_EX2(LOG_Debug, "**************************************************************\n"); + } + + LOG_EX2(LOG_Debug, "Version : %d\n", pInfo->version); + LOG_EX2(LOG_Debug, "OTA Command : %d(0x%08X)\n", pInfo->otaCmd, pInfo->otaCmd); + LOG_EX2(LOG_Debug, "OTA Type : %d(0x%08X)\n", pInfo->otaMode, pInfo->otaMode); + + LOG_EX2(LOG_Debug, "---------------------------------------------------------\n"); + LOG_EX2(LOG_Debug, "\tURL : %s\n", pInfo->otaFileInfo.url); + LOG_EX2(LOG_Debug, "\tMD5 : %s\n", pInfo->otaFileInfo.md5); + LOG_EX2(LOG_Debug, "\tsize : %u\n", pInfo->otaFileInfo.size); +} + +static int __otaRspStatus(OTA_STATUS_TYPE type, int val) +{ + int ret = 0; + OTA_RSP_STATUS oStatus; + + if(OTA_ERR_CODE == type && val != 0) + { + g_IsOTAMode = FALSE; + } + + memset(&oStatus, 0, sizeof(OTA_RSP_STATUS)); + + oStatus.status = type; + oStatus.val = val; + + LOG_EX(LOG_Debug, "Rsponse: %d --> %d\n", type, val); + + if(type == OTA_UPGRADE_START || type == OTA_REBOOT_SYSTEM || type == OTA_RECOVERY_START) + { + ret = DBusJsonBoardcastCommand(NULL, 0xFFFFFFFF, CMD_OTA_STATUS, JSON_ENGINE_OTA_RSP, &oStatus, FALSE); + } + else + { + ret = DBusJsonSendToCommand(NULL, + g_pModInfoTable[MODULE_CONTROLLER].modAliase, + CMD_OTA_STATUS, + JSON_ENGINE_OTA_RSP, + &oStatus, FALSE); + } + + return (ret); +} + +#if 0 +static void __dlThreadRuntimeCb(void *pParams) +{ + PDOWNLOAD_TASK_INFO pDlInfo = (PDOWNLOAD_TASK_INFO)pParams; + + LOG_EX(LOG_Debug, "Cleanup barrier\n"); + uv_barrier_wait(pDlInfo->puvBarrier); + pthread_detach(pthread_self()); +} +#endif + +void __onHttpResponseCb(void *pData, unsigned int size, const char *pReqUrl, const char* pDlPath, const char *pTaskUuid, int iFinished, void *pUserData) +{ + PDOWNLOAD_TASK_INFO pDlInfo = (PDOWNLOAD_TASK_INFO)pUserData; + + if(iFinished == 0) + { + LOG_EX(LOG_Debug, "Request(%s): [%s] --> [%s] Response: [%u] OK\n", pTaskUuid, pReqUrl, pDlPath, size); + } + else if(iFinished == 1) + { + LOG_EX(LOG_Error, "Request(%s): [%s] --> [%s] Response: [%u] Error\n", pTaskUuid, pReqUrl, pDlPath, size); + } + else + { + LOG_EX(LOG_Error, "Download Error Code: %d\n", iFinished); + } + + if(pDlInfo) + { +// int err; + uv_thread_t uvThread; + pDlInfo->retCode = iFinished; +// LOG_EX(LOG_Debug, "Cleanup barrier task start: %u\n", g_ThreadCnt); + LOG_EX(LOG_Debug, "Cleanup barrier\n"); + uv_barrier_wait(pDlInfo->puvBarrier); +#if 0 + g_ThreadCnt++; + err = uv_thread_create(&uvThread, __dlThreadRuntimeCb, pDlInfo); + + if(err != 0) + { + LOG_EX(LOG_Error, "1:Create Thread Error: %d\n", err); + } +#endif + } + else + { + LOG_EX(LOG_Debug, "pDlInfo == NULL\n"); + } +} + +void __onProgressNotifyCb(const char *pReqUrl, const char *pTaskUuid, unsigned char uPercent, void* pUserData) +{ + static unsigned char preCnt = 0; + + if(preCnt != uPercent && uPercent != 0) + { + preCnt = uPercent; + __otaRspStatus(OTA_DOWNLOAD_PROGRESS, uPercent); + LOG_EX(LOG_Debug, "[%s]: %u%%\n", pReqUrl, uPercent); + } +} + +static void __printIPLParams(PIPL_DATA_INFO pIPLInfo, const char* pTags) +{ + int i; + char md5[MD5_CHKSUM_STR_LEN]; + + if(pTags != NULL && strlen(pTags) > 0) + { + LOG_EX2(LOG_Debug, "%s\n", pTags); + LOG_EX2(LOG_Debug, "------------------------------------------------\n"); + } + LOG_EX2(LOG_Debug, "Magic Tag : %s\n", pIPLInfo->pMagicTag); + LOG_EX2(LOG_Debug, "Setup Status : %u\n", pIPLInfo->setupStatus); + LOG_EX2(LOG_Debug, "Setup Module : %d(0x%08X)\n", pIPLInfo->setupMode, pIPLInfo->setupMode); + LOG_EX2(LOG_Debug, "Version : %d\n", pIPLInfo->curVersion); + + memset(md5, 0, MD5_CHKSUM_STR_LEN); + + IHW_bin2hex(md5, pIPLInfo->md5sum, MD5_CHKSUM_LEN); + LOG_EX2(LOG_Debug, "MD5 Checksum : %s\n", md5); + + LOG_EX2(LOG_Debug, "-------------------------------------------------------------------\n"); + LOG_EX2(LOG_Debug, "| Partition | size | MD5 Checksum |\n"); + LOG_EX2(LOG_Debug, "-------------------------------------------------------------------\n"); + + for(i = 0; i < sizeof(pIPLInfo->iplItem) / sizeof(pIPLInfo->iplItem[0]); i++) + { + char *pPartName = strdup(g_otaPartInfo[i].pPartPath); + + memset(md5, 0, MD5_CHKSUM_STR_LEN); + IHW_bin2hex(md5, pIPLInfo->iplItem[i].md5sum, MD5_CHKSUM_LEN); + LOG_EX2(LOG_Debug, "| %9s | %16u | %32s |\n", basename_v2(pPartName), pIPLInfo->iplItem[i].fileSize, md5); + free(pPartName); + } + + LOG_EX2(LOG_Debug, "-------------------------------------------------------------------\n"); +} + +static int __ReadIPLParams(PIPL_DATA_INFO pIPLInfo) +{ + uv_fs_t uvOpen, uvRead, uvClose; + int ret, rdSize = 0; + unsigned char md5Buf[MD5_CHKSUM_LEN]; + + uv_loop_t* pLoop = g_pMainLoop; + uv_buf_t uvBuf = uv_buf_init((char*)pIPLInfo, sizeof(IPL_DATA_INFO)); + + if(pIPLInfo == NULL) + { + return (-ERR_INPUT_PARAMS); + } + + memset(pIPLInfo, 0, sizeof(IPL_DATA_INFO)); + + ret = system("sync"); + + if(uv_fs_open(pLoop, &uvOpen, IPL_PARAMS_PARTITION, O_RDWR, 0, NULL) == -1) + { + LOG_EX(LOG_Error, "Open Partition %s Error\n", IPL_PARAMS_PARTITION); + return (-ERR_OPEN_FILE); + } + + if((rdSize = uv_fs_read(pLoop, &uvRead, uvOpen.result, &uvBuf, 1, -1, NULL)) != sizeof(IPL_DATA_INFO)) + { + LOG_EX(LOG_Error, "Read Partition Error: Read %d Bytes, Need Read %d Bytes %d\n", rdSize, sizeof(IPL_DATA_INFO)); + return (-ERR_READ_FILE); + } + + uv_fs_close(pLoop, &uvClose, uvOpen.result, NULL); + + if(memcmp(pIPLInfo->pMagicTag, IPL3_MAGIC_NAME, 8) != 0) + { + LOG_EX(LOG_Error, "Check Magic Head Error: [%s], need [%s]\n", pIPLInfo->pMagicTag, IPL3_MAGIC_NAME); + return (-ERR_NO_INIT_IPL3); + } + + EvpMD5HashBuf((const unsigned char *)pIPLInfo, sizeof(IPL_DATA_INFO) - MD5_CHKSUM_LEN, md5Buf, &rdSize); + + if(memcmp(pIPLInfo->md5sum, md5Buf, MD5_CHKSUM_LEN) != 0) + { + //print_hex_dump_bytes("CACL_", DUMP_PREFIX_ADDRESS, md5Buf, MD5_CHKSUM_LEN); + //print_hex_dump_bytes("SAVE_", DUMP_PREFIX_ADDRESS, pIPLInfo->md5sum, MD5_CHKSUM_LEN); + + LOG_EX(LOG_Error, "Verify MD5 Error\n"); + return (-ERR_BAD_IPL3); + } + + //print_hex_dump_bytes("IPL3", DUMP_PREFIX_ADDRESS, pIPLInfo, sizeof(IPL_DATA_INFO)); + + return (0); +} + +static int __Write2NandPartition(OTA_PARTITION_NAME partName, const char *pFilePath) +{ + int fileSize = 0; + char bufCmd[MAX_PATH]; + + if(partName < 0 || partName >= OTA_PARTITION_MAX || pFilePath == NULL || strlen(pFilePath) == 0) + { + LOG_EX(LOG_Error, "Input params error\n"); + return (-ERR_INPUT_PARAMS); + } + + if(access(pFilePath, F_OK) == -1) + { + LOG_EX(LOG_Error, "File %s not exist\n", pFilePath); + return (-ERR_FILE_NOT_EXISTS); + } + + GET_FILE_SIZE(pFilePath, fileSize); + + if(fileSize > g_otaPartInfo[partName].partSize || fileSize == -1) + { + LOG_EX(LOG_Error, "File %s size %d more than partition size %u\n", + pFilePath, fileSize, g_otaPartInfo[partName].partSize); + return (-ERR_BAD_FILE_SIZE); + } + + memset(bufCmd, 0, MAX_PATH); + + if(partName == OTA_PARTITION_IPL_ROOTFS || partName == OTA_PARTITION_ROOTFS) + { + sprintf(bufCmd, "dd if=%s of=%s bs=128k conv=sync", pFilePath, g_otaPartInfo[partName].pPartPath); + } + else + { + sprintf(bufCmd, "dd if=%s of=%s bs=4k conv=sync", pFilePath, g_otaPartInfo[partName].pPartPath); + } + + LOG_EX(LOG_Debug, "Run OTA: [%s]\n", bufCmd); + + fileSize = system(bufCmd); + fileSize = system("sync"); + + return (0); +} + +static int __SaveIPLParams(PIPL_DATA_INFO pIPLInfo) +{ + int ret, wrSize = 0; + uv_fs_t uvOpen, uvWrite, uvSync, uvClose; + unsigned char md5Buf[MD5_CHKSUM_LEN]; + unsigned char buf[MAX_PATH]; + + uv_loop_t* pLoop = g_pMainLoop; + uv_buf_t uvBuf = uv_buf_init((char*)pIPLInfo, sizeof(IPL_DATA_INFO)); + + if(pIPLInfo == NULL) + { + return (-ERR_INPUT_PARAMS); + } + + if(memcmp(pIPLInfo->pMagicTag, IPL3_MAGIC_NAME, 8) != 0) + { + memcpy(pIPLInfo->pMagicTag, IPL3_MAGIC_NAME, 8); + LOG_EX(LOG_Error, "Check Magic Head Error: [%s], need [%s]\n", pIPLInfo->pMagicTag, IPL3_MAGIC_NAME); + return (-ERR_NO_INIT_IPL3); + } + + EvpMD5HashBuf((const unsigned char *)pIPLInfo, sizeof(IPL_DATA_INFO) - MD5_CHKSUM_LEN, md5Buf, &wrSize); + + if(wrSize != MD5_CHKSUM_LEN) + { + LOG_EX(LOG_Error, "Error MD5: size = %d, need %d\n", wrSize, MD5_CHKSUM_LEN); + return (-ERR_BAD_IPL3); + } + + memcpy(pIPLInfo->md5sum, md5Buf, MD5_CHKSUM_LEN); + + memset(buf, 0, MAX_PATH); + ret = system("mkdir -p /tmp/ota_param/"); + sprintf(buf, "/tmp/ota_param/ota_%d.params", pIPLInfo->curVersion); + + //print_hex_dump_bytes("IPL3", DUMP_PREFIX_ADDRESS, pIPLInfo, sizeof(IPL_DATA_INFO)); + + if(uv_fs_open(pLoop, &uvOpen, buf, O_RDWR | O_CREAT | O_TRUNC, + S_IRUSR | S_IWUSR, NULL) == -1) + { + LOG_EX(LOG_Error, "Open Partition %s Error\n", IPL_PARAMS_PARTITION); + return (-ERR_OPEN_FILE); + } + + if((wrSize = uv_fs_write(pLoop, &uvWrite, uvOpen.result, &uvBuf, 1, -1, NULL)) != sizeof(IPL_DATA_INFO)) + { + LOG_EX(LOG_Error, "Write Partition Error: Read %d Bytes, Need Read %d Bytes %d\n", wrSize, sizeof(IPL_DATA_INFO)); + return (-ERR_READ_FILE); + } + + uv_fs_fdatasync(pLoop, &uvSync, uvOpen.result, NULL); + uv_fs_close(pLoop, &uvClose, uvOpen.result, NULL); + + ret = __Write2NandPartition(OTA_PARTITION_IPL_PARAMS, (const char*)buf); + + if(ret != 0) + { + LOG_EX(LOG_Error, "Write OTA Params Error: %d\n", ret); + return (-ERR_OTA_WRITE_IPL3); + } + + return (0); +} + +static int __otaBackupWifi(int iBackup) +{ + int ret = 0; + if(iBackup == TRUE) + { + const char *pBackCmd = "mkdir -p /mnt/UDISK/ota/wifi_bak/ && rm -rf /mnt/UDISK/ota/wifi_bak/* \ +&& cp -rf /etc/wifi/* /mnt/UDISK/ota/wifi_bak/"; + + ret = system(pBackCmd); + } + else + { + const char *pBackCmd = "rm -rf /etc/wifi/*.* && cp -rf /mnt/UDISK/ota/wifi_bak/*.* /etc/wifi/"; + ret = system(pBackCmd); + } + + return ret; +} + +static int __otaRunning(char* pCheckSumFile, int ver) +{ + ssize_t rdRet; + size_t rdSize; + unsigned char strMD5[MD5_CHKSUM_STR_LEN]; + char dirPath[MAX_PATH]; + char basePath[MAX_PATH]; + const char *pChkMD5 = NULL; + char *pRdLine = NULL; + char *pChkSumFile = pCheckSumFile; + FILE *pFile = fopen(pChkSumFile, "r"); + int ret, i = 0; + int step = 0; + + if(pFile == NULL) + { + LOG_EX(LOG_Error, "Open File %s Error\n", pChkSumFile); + return (-ERR_OPEN_FILE); + } + + memset(dirPath, 0, MAX_PATH); + dirname_v2(pChkSumFile, dirPath); + + LOG_EX(LOG_Debug, "Step %d: Check OTA image .......\n", step++); + // check download ota file + while((rdRet = getline(&pRdLine, &rdSize, pFile)) != -1) + { + char* pToken = NULL; + char *pItem[2]; + char pMD5Val[MD5_CHKSUM_LEN]; + char pMD5Str[MD5_CHKSUM_STR_LEN]; + int fileSize = 0; + + if(rdSize == 0 || pRdLine == NULL) + { + continue; + } + + if(pRdLine[strlen(pRdLine) - 1] == '\n') + { + pRdLine[strlen(pRdLine) - 1] = 0; + } + + i = 0; + + for(pToken = strtok(pRdLine, " "); pToken != NULL && i <= 1; pToken = strtok(NULL, " "), i++) + { + pItem[i] = pToken; + } + + //fprintf(stdout, "md5 = %s, file = \'%s\'\n", pItem[0], pItem[1]); + + if(pItem[0] == NULL || pItem[1] == NULL || strlen(pItem[0]) != 32 || strlen(pItem[1]) == 0) + { + free(pRdLine); + fclose(pFile); + return (-ERR_MD5_CHECK_SUM); + } + + memset(basePath, 0, MAX_PATH); + sprintf(basePath, "%s/%s", dirPath, pItem[1]); + + LOG_EX(LOG_Debug, "OTA File: %s --> %s\n", basePath, pItem[0]); + + if((ret = EvpMD5HashFileV2(basePath, pMD5Val)) != 0) + { + free(pRdLine); + fclose(pFile); + LOG_EX(LOG_Error, "%s Check MD5 error: %d\n", ret); + return (-ERR_MD5_FILE); + } + + memset(pMD5Str, 0, MD5_CHKSUM_STR_LEN); + IHW_bin2hex(pMD5Str, pMD5Val, MD5_CHKSUM_LEN); + + //LOG_EX(LOG_Debug, "%s Check MD5 Info: [%s] need [%s]\n", basePath, pMD5Str, pItem[0]); + + if(strcmp(pMD5Str, pItem[0]) != 0) + { + + free(pRdLine); + fclose(pFile); + LOG_EX(LOG_Error, "%s Check MD5 error: [%s] need [%s]\n", basePath, pMD5Str, pItem[0]); + return (-ERR_MD5_FILE); + } + + if(strcmp(pItem[1], BOOT_IMG_FILE_NAME) == 0) + { + memcpy(g_iplInfo.iplItem[OTA_PARTITION_BOOT].md5sum, pMD5Val, MD5_CHKSUM_LEN); + } + else if(strcmp(pItem[1], ROOTFS_IMG_FILE_NAME) == 0) + { + GET_FILE_SIZE(basePath, fileSize); + //fprintf(stdout, "fileSize = %lu\n", fileSize); + memcpy(g_iplInfo.iplItem[OTA_PARTITION_ROOTFS].md5sum, pMD5Val, MD5_CHKSUM_LEN); + g_iplInfo.iplItem[OTA_PARTITION_ROOTFS].fileSize = fileSize; + } + } + + if(pRdLine) + { + free(pRdLine); + } + fclose(pFile); + + LOG_EX(LOG_Debug, "Step %d: Remove EXT4 UUID File %s .......\n", step++, EXT_FS_UUID_FILE); + remove(EXT_FS_UUID_FILE); + + __otaRspStatus(OTA_VERIFY_FILE, NO_OTA_STATUS_VAL_TAG); + +#if 0 + for(i = 0; i < sizeof(g_umountPart) / sizeof(g_umountPart[0]); i++) + { + char *pRet = NULL; + + memset(cmdBuf, 0, MAX_PATH); + sprintf(cmdBuf, "cat /proc/mounts | awk '{printf $2\"\\n\"}' | grep -Fx \"%s\" | wc -L", g_umountPart[i]); + + if(GetShellExecResult(cmdBuf, &pRet) == 0) + { + unsigned int tarLen = strtoul(pRet, NULL, 10); + free(pRet); + + if(strlen(g_umountPart[i]) != tarLen) + { + continue; + } + } + + LOG_EX(LOG_Debug, "Step %d: Umount %s Partition .......\n", step++, g_umountPart[i]); + + memset(cmdBuf, 0, MAX_PATH); + sprintf(cmdBuf, "umount %s", g_umountPart[i]); + ret = system(cmdBuf); + } +#else + ret = system("umount /rom"); +#endif + + __otaRspStatus(OTA_UPGRADE_PARTITION, OTA_PARTITION_BOOT); + + // write to partition + LOG_EX(LOG_Debug, "Step %d: OTA %s Partition .......\n", step++, g_otaPartInfo[OTA_PARTITION_BOOT].pPartPath); + memset(basePath, 0, MAX_PATH); + sprintf(basePath, "%s/%s", dirPath, BOOT_IMG_FILE_NAME); + ret = __Write2NandPartition(OTA_PARTITION_BOOT, basePath); + + if(ret != 0) + { + LOG_EX(LOG_Error, "OTA OTA_PARTITION_BOOT Error: %d\n", ret); + return (-ERR_OTA_WRITE_BOOT); + } + + __otaRspStatus(OTA_UPGRADE_PARTITION, OTA_PARTITION_ROOTFS); + LOG_EX(LOG_Debug, "Step %d: OTA %s Partition .......\n", step++, g_otaPartInfo[OTA_PARTITION_ROOTFS].pPartPath); + memset(basePath, 0, MAX_PATH); + sprintf(basePath, "%s/%s", dirPath, ROOTFS_IMG_FILE_NAME); + ret = __Write2NandPartition(OTA_PARTITION_ROOTFS, basePath); + + if(ret != 0) + { + LOG_EX(LOG_Error, "OTA ROOTFS_IMG_FILE_NAME Error: %d\n", ret); + return (-ERR_OTA_WRITE_ROOTFS); + } + + LOG_EX(LOG_Debug, "Step %d: Verify Partition %d .......\n", step++, OTA_PARTITION_BOOT); + + __otaRspStatus(OTA_VERIFY_PARTITION, OTA_PARTITION_BOOT); + pChkMD5 = EvpMD5HashFile(g_otaPartInfo[OTA_PARTITION_BOOT].pPartPath); + IHW_bin2hex(strMD5, g_iplInfo.iplItem[OTA_PARTITION_BOOT].md5sum, MD5_CHKSUM_LEN); + if(strcmp(pChkMD5, strMD5) != 0) + { + LOG_EX(LOG_Error, "Verify %s Partition MD5 Error: %s --> %s\n", g_otaPartInfo[OTA_PARTITION_BOOT].pPartPath, pChkMD5, strMD5); + return (-ERR_VERIFY_PARTITION_MD5); + } + + __otaRspStatus(OTA_VERIFY_PARTITION, OTA_PARTITION_ROOTFS); + LOG_EX(LOG_Debug, "Step %d: Verify Partition %d .......\n", step++, OTA_PARTITION_ROOTFS); + CopyFileWithSize(g_otaPartInfo[OTA_PARTITION_ROOTFS].pPartPath, "/tmp/dump_rootfs.img", g_iplInfo.iplItem[OTA_PARTITION_ROOTFS].fileSize); + pChkMD5 = EvpMD5HashFile("/tmp/dump_rootfs.img"); + IHW_bin2hex(strMD5, g_iplInfo.iplItem[OTA_PARTITION_ROOTFS].md5sum, MD5_CHKSUM_LEN); + if(strcmp(pChkMD5, strMD5) != 0) + { + LOG_EX(LOG_Error, "Verify %s Partition MD5 Error: %s --> %s\n", g_otaPartInfo[OTA_PARTITION_ROOTFS].pPartPath, pChkMD5, strMD5); + return (-ERR_VERIFY_PARTITION_MD5); + } + +#if 0 + LOG_EX(LOG_Debug, "Step %d: Upgrade Partition %d MD5 Checksum .......\n", step++, OTA_PARTITION_ROOTFS); + EvpMD5HashFileV2(g_otaPartInfo[OTA_PARTITION_ROOTFS].pPartPath, g_iplInfo.iplItem[OTA_PARTITION_ROOTFS].md5sum); + g_iplInfo.iplItem[OTA_PARTITION_ROOTFS].fileSize = g_otaPartInfo[OTA_PARTITION_ROOTFS].partSize; +#endif + + LOG_EX(LOG_Debug, "Step %d: Save OTA Information .......\n", step++); + + g_iplInfo.curVersion = ver; + g_iplInfo.setupStatus = 0; + + if(g_iplInfo.setupMode != RECOVERY_SETUP) + { + g_iplInfo.setupMode = SYSTEM_OTA; + } + + ret = __SaveIPLParams(&g_iplInfo); + + if(ret != 0) + { + LOG_EX(LOG_Error, "Save IPL3 Error: %d\n", ret); + return (-ERR_OTA_WRITE_PARAMS); + } + + //print_hex_dump_bytes("IPL3", DUMP_PREFIX_ADDRESS, &g_iplInfo, sizeof(IPL_DATA_INFO)); + + __printIPLParams(&g_iplInfo, "OTA Succesed_____:"); + + LOG_EX(LOG_Debug, "Step %d: Waitting for reboot ......\n", step++); + + return (0); +} + +static void __otaFromLocalImage(void *pParams) +{ + int ret, reTry; + int step = 0; + char buf[MAX_PATH]; + char *pFileName = NULL, *pMD5Val = NULL; + const char *pMD5Chk = NULL; + int version = (int)(intptr_t)pParams; + + LOG_EX(LOG_Debug, "Step %d: Get OTA information .......\n", step++); + memset(buf, 0, MAX_PATH); + sprintf(buf, "%s/ota.md5", g_otaDownloadPath); + + if(access(buf, F_OK) != 0) + { + __otaRspStatus(OTA_ERR_CODE, -ERR_FILE_NOT_EXISTS); + g_IsOTAMode = FALSE; + return; + } + + memset(buf, 0, MAX_PATH); + sprintf(buf, "cat %s/ota.md5 | awk '{print $2}'", g_otaDownloadPath); + + if(GetShellExecResult(buf, &pFileName) != 0) + { + LOG_EX(LOG_Error, "Get File Name Error: %s\n", buf); + __otaRspStatus(OTA_ERR_CODE, -ERR_READ_FILE); + g_IsOTAMode = FALSE; + return; + } + + memset(buf, 0, MAX_PATH); + sprintf(buf, "cat %s/ota.md5 | awk '{print $1}'", g_otaDownloadPath); + + if(GetShellExecResult(buf, &pMD5Val) != 0) + { + LOG_EX(LOG_Error, "Get MD5 Value Error: %s\n", buf); + free(pFileName); + __otaRspStatus(OTA_ERR_CODE, -ERR_READ_FILE); + g_IsOTAMode = FALSE; + return; + } + + LOG_EX(LOG_Debug, "Step %d: Verify OTA image .......\n", step++); + + memset(buf, 0, MAX_PATH); + sprintf(buf, "%s/%s", g_otaDownloadPath, pFileName); + + pMD5Chk = EvpMD5HashFile(buf); + + if(strcmp(pMD5Chk, pMD5Val) != 0) + { + LOG_EX(LOG_Error, "Check %s MD5 Error: %s --> %s\n", buf, pMD5Chk, pMD5Val); + __otaRspStatus(OTA_ERR_CODE, -ERR_MD5_CHECK_SUM); + g_IsOTAMode = FALSE; + return; + } + + free(pMD5Val); + free(pFileName); + free((void *)pMD5Chk); + + LOG_EX(LOG_Debug, "Step %d: Decompress OTA file .......\n", step++); + + pFileName = strdup(buf); + + __otaRspStatus(OTA_DECOMPRESS_FILE, NO_OTA_STATUS_VAL_TAG); + + memset(buf, 0, MAX_PATH); + sprintf(buf, "mkdir -p %s/%d/ && tar -C %s/%d -xvzf %s > /dev/null", + OTA_TEMP_DIR, version, + OTA_TEMP_DIR, version, + pFileName); + + ret = system(buf); + + memset(buf, 0, MAX_PATH); + sprintf(buf, "%s/%d/ota.md5", OTA_TEMP_DIR, version); + + SetHBLAutoExit(FALSE); + __otaRspStatus(OTA_UPGRADE_START, NO_OTA_STATUS_VAL_TAG); + + LOG_EX(LOG_Debug, "Step %d: OTA write to partition .......\n", step++); + + //__otaBackupWifi(TRUE); + + //LOG_EX(LOG_Debug, "Step %d: OTA Backup WIFI .......\n", step++); + + LOG_EX(LOG_Debug, "System into mini ramfs mode\n"); + ret = system("/sbin/ramfs.sh"); + LOG_EX(LOG_Debug, "Ramfs ready......\n"); + + reTry = 3; + while(reTry--) + { + if((ret = __otaRunning(buf, version)) == 0) + { + break; + } + } + + if(ret == ERR_OPEN_FILE + || ret == ERR_MD5_FILE + || ret == ERR_MD5_CHECK_SUM + || ret == ERR_OTA_WRITE_BOOT + || ret == ERR_OTA_WRITE_ROOTFS + || ret == ERR_OTA_WRITE_PARAMS) + { + __otaRspStatus(OTA_ERR_CODE, -12345); + } + + __otaRspStatus(OTA_REBOOT_SYSTEM, NO_OTA_STATUS_VAL_TAG); + +#if 0 + LOG_EX(LOG_Debug, "Step %d: Clean resource and evn ......\n", step++); + + for(i = 0; i < sizeof(g_processName) / sizeof(g_processName[0]); i++) + { + memset(buf, 0, MAX_PATH); + sprintf(buf, "killall -9 %s > /dev/null", g_processName[i]); + ret = system(buf); + } +#endif +#if 0 + SysPointMarkUpload(); + LogUploadCurLogFile(); + + ret = system("sync && ubus call system watchdog \'{\"stop\" : true}\'"); + + reTry = 3; + do + { + sleep(1); + } while(reTry--); + + reTry = 0; + + LOG_EX(LOG_Debug, "Reboot System By Power Control Chips\n"); + sleep(1); + + ret = system("sync && echo 3140 > /sys/bus/platform/devices/axp22_board/axp22_reg"); + + sleep(10); + + while(TRUE) + { + LOG_EX(LOG_Debug, "Reboot System: %d times\n", reTry++); + ret = system("reboot -f"); + sleep(3); + } +#endif + + reTry = 300; + + while(reTry--) + { + LOG_EX(LOG_Debug, "System force reboot before %d seconds\n", reTry); + sleep(1); + } + + while(TRUE) + { + ret = system("reboot -f"); + sleep(5); + } + + return; +} + +static int __isPreDownloader(POTA_DATA_INFO pInfo) +{ + UT_string* pDlPath = NULL, *pChkPath = NULL; + + char *pFileName = NULL, *pMD5Val = NULL; + const char *pMD5Chk = NULL; + + if(pInfo == NULL) + { + return (-ERR_FILE_NOT_EXISTS); + } + + utstring_new(pDlPath); + utstring_new(pChkPath); + utstring_printf(pDlPath, "%s/tina_r16_ota_%d.tar.gz", g_otaDownloadPath, pInfo->version); + utstring_printf(pChkPath, "%s/ota.md5", g_otaDownloadPath); + + if(access(utstring_body(pDlPath), F_OK) != 0 + || access(utstring_body(pChkPath), F_OK) != 0) + { + utstring_free(pDlPath); + utstring_free(pChkPath); + return (-ERR_FILE_NOT_EXISTS); + } + + utstring_renew(pChkPath); + utstring_printf(pChkPath, "cat %s/ota.md5 | awk '{print $2}'", g_otaDownloadPath); + + if(GetShellExecResult(utstring_body(pChkPath), &pFileName) != 0) + { + LOG_EX(LOG_Error, "Get File Name Error: %s\n", utstring_body(pChkPath)); + utstring_free(pDlPath); + utstring_free(pChkPath); + return -ERR_FILE_NOT_EXISTS; + } + + utstring_renew(pChkPath); + utstring_printf(pChkPath, "cat %s/ota.md5 | awk '{print $1}'", g_otaDownloadPath); + + if(GetShellExecResult(utstring_body(pChkPath), &pMD5Val) != 0) + { + LOG_EX(LOG_Error, "Get MD5 Value Error: %s\n", utstring_body(pChkPath)); + free(pFileName); + utstring_free(pDlPath); + utstring_free(pChkPath); + return -ERR_MD5_CHECK_SUM; + } + + if(strcmp(pMD5Val, pInfo->otaFileInfo.md5) != 0) + { + LOG_EX(LOG_Debug, "Download File Chksum Diff: %s -> %s\n", pMD5Val, pInfo->otaFileInfo.md5); + free(pFileName); + free(pMD5Val); + utstring_free(pDlPath); + utstring_free(pChkPath); + return -ERR_FILE_NOT_EXISTS; + } + + utstring_renew(pChkPath); + utstring_printf(pChkPath, "%s/%s", g_otaDownloadPath, pFileName); + + pMD5Chk = EvpMD5HashFile(utstring_body(pChkPath)); + + if(pMD5Chk == NULL || strcmp(pMD5Chk, pMD5Val) != 0) + { + LOG_EX(LOG_Error, "Check %s MD5 Error: %s --> %s\n", utstring_body(pChkPath), pMD5Chk, pMD5Val); + free(pFileName); + free(pMD5Val); + utstring_free(pDlPath); + utstring_free(pChkPath); + if(pMD5Chk) + { + free((void *)pMD5Chk); + } + return -ERR_MD5_CHECK_SUM; + } + + free(pMD5Val); + free(pFileName); + free((void *)pMD5Chk); + utstring_free(pDlPath); + utstring_free(pChkPath); + + return (0); +} + +static void __otaDownloadImageCb(void *pParams) +{ + POTA_DATA_INFO pInfo = (POTA_DATA_INFO)pParams; + DOWNLOAD_TASK_INFO dlInfo; + char buf[SIZE_1K]; + int ret, reTry = 3; + + g_isDownloading = TRUE; + + // Notify CC Beging Download + __otaRspStatus(OTA_DOWNLOAD_FILE, 2); + + if(__isPreDownloader(pInfo) == 0) + { + g_isDownloading = FALSE; + g_IsOTAMode = FALSE; + __otaRspStatus(OTA_DOWNLOAD_PROGRESS, 100); + __otaRspStatus(OTA_DOWNLOAD_FILE, 0); + + if(pInfo->otaMode == OTA_MODE_FORCE_NOW) + { + g_IsOTAMode = TRUE; + __otaFromLocalImage((void*)(intptr_t)pInfo->version); + g_IsOTAMode = FALSE; + } + + free(pInfo); + pthread_detach(pthread_self()); + return; + } + + while(reTry--) + { + uv_barrier_t uvBarrier; + uv_barrier_init(&uvBarrier, 2); + + memset(buf, 0, SIZE_1K); + sprintf(buf, "rm -rf %s/*", g_otaDownloadPath); + ret = system(buf); + + memset(&dlInfo, 0, sizeof(DOWNLOAD_TASK_INFO)); + sprintf(dlInfo.pPath, "%s/tina_r16_ota_%d.tar.gz", g_otaDownloadPath, pInfo->version); + + memcpy(&dlInfo.fileInfo, &pInfo->otaFileInfo, sizeof(OTA_FILE_INFO)); + + dlInfo.dlStatus = 0; + + dlInfo.puvBarrier = &uvBarrier; + + InetHttpDlFileAsync(dlInfo.fileInfo.url, + dlInfo.pPath, + __onHttpResponseCb, + __onProgressNotifyCb, + &dlInfo); + + LOG_EX(LOG_Debug, ">>>>>>>>>>>>>>>>>>>Wait Download Finished.............\n"); + uv_barrier_wait(&uvBarrier); + uv_barrier_destroy(&uvBarrier); + LOG_EX(LOG_Debug, "<<<<<<<<<<<<<<<<<<otaFileInfo.md5) != 0) + { + LOG_EX(LOG_Error, "Download File MD5 Error: %s --> %s\n", pChkVal, pInfo->otaFileInfo.md5); + dlInfo.retCode = -ERR_MD5_CHECK_SUM; + } + else + { + break; + } + } + } + + if(dlInfo.retCode != 0) + { + ret = system(buf); + g_IsOTAMode = FALSE; + g_isDownloading = FALSE; + + if(dlInfo.retCode > 0) + { + dlInfo.retCode = -dlInfo.retCode; + } + + __otaRspStatus(OTA_DOWNLOAD_FILE, dlInfo.retCode); + pthread_detach(pthread_self()); + return; + } + + LOG_EX(LOG_Debug, "Step 1: Download File result: %d\n", dlInfo.retCode); + + memset(buf, 0, SIZE_1K); + sprintf(buf, "echo \"%s %s\" > %s/ota.md5", + dlInfo.fileInfo.md5, basename_v2(dlInfo.pPath), g_otaDownloadPath); + + ret = system(buf); + + LOG_EX(LOG_Debug, "Step 2: Save MD5 File; %d\n", ret); + + g_IsOTAMode = FALSE; + __otaRspStatus(OTA_DOWNLOAD_FILE, 0); + + if(pInfo->otaMode == OTA_MODE_FORCE_NOW) + { + g_IsOTAMode = TRUE; + __otaFromLocalImage((void*)(intptr_t)pInfo->version); + g_IsOTAMode = FALSE; + } + + free(pInfo); + + g_isDownloading = FALSE; + + pthread_detach(pthread_self()); +} + +static void __dBusDeameonCb(MODULE_NAME modName, int status) +{ + if(status) + { + LOG_EX(LOG_Error, "Daemon(%d) Msg: [%s]\n", modName, status == 0 ? "Connect" : "Disconnect"); + } + else + { + LOG_EX(LOG_Info, "Daemon(%d) Msg: [%s]\n", modName, status == 0 ? "Connect" : "Disconnect"); + } + + if(modName == MODULE_CONTROLLER && status == 0) + { + __otaRspStatus(OTA_CURRENT_VERSION, g_iplInfo.curVersion); + __otaRspStatus(OTA_CURRENT_SETUP_MODE, g_iplInfo.setupMode); + __otaRspStatus(OTA_CURRENT_REBOOT_TIME, g_iplInfo.setupStatus); + } +} + +static PDBUS_MSG_PACK __dBusOnMessage(uv_loop_t* pLoop, DBusConnection* pConn, PDBUS_MSG_PACK pMsg) +{ + int err; + uv_thread_t uvThread; + POTA_DATA_INFO pInfo = NULL; + + if(!pMsg || !pLoop || !pConn) + { + return NULL; + } + + //fprintf(stdout, "Recv: cmd = %u, Json = [%s]\n", pMsg->busCmd, (const char *)pMsg->pMsg); + + switch(pMsg->busCmd) + { + case CMD_OTA_RUNNOW: + if(g_IsOTAMode == 1) + { + LOG_EX(LOG_Info, "Trigger OTA Now.......\n"); + uv_barrier_wait(&g_otaBarrier); + } + else + { + __otaRspStatus(OTA_ERR_CODE, -ERR_OTA_NOT_READY); + LOG_EX(LOG_Error, "Current Not In OTA Mode\n"); + } + break; + + case CMD_MISC_QUERY_DL_STATUS: + if(g_isDownloading) + { + __otaRspStatus(OTA_DOWNLOAD_FILE, 1); + } + else + { + __otaRspStatus(OTA_DOWNLOAD_FILE, 0); + } + break; + + case CMD_MISC_QUERY_OTA_STATUS: + if(g_sSetupStatus == SYSTEM_OTA_OK) + { + __otaRspStatus(OTA_SUCCESED, 0); + } + else if(g_sSetupStatus == RECOVERY_SETUP) + { + __otaRspStatus(OTA_SUCCESED, -1); + } + else if(g_sSetupStatus == NORMAL_SETUP) + { + __otaRspStatus(OTA_SUCCESED, 1); + } + break; + + case CMD_SYSTEM_STANDBY: + LOG_EX(LOG_Debug, "System Ready ....\n"); + break; + + case CMD_OTA_NOTIFY: + + if(g_IsOTAMode == 0) + { + if(g_iplInfo.setupMode == SYSTEM_OTA) + { + LOG_EX(LOG_Debug, "Current System Mode: SYSTEM_OTA\n"); + } + else if(g_iplInfo.setupMode == RECOVERY_SETUP) + { + LOG_EX(LOG_Debug, "Current System Mode: RECOVERY_SETUP\n"); + } + else if(g_iplInfo.setupMode == SYSTEM_OTA_OK) + { + LOG_EX(LOG_Debug, "Current System Mode: SYSTEM_OTA_OK\n"); + } + else + { + LOG_EX(LOG_Debug, "Current System Mode: NORMAL_SETUP\n"); + } + + if(g_isDownloading) + { + __otaRspStatus(OTA_DOWNLOAD_FILE, 1); + break; + } + + pInfo = (POTA_DATA_INFO)Json2Struct((const char *)pMsg->pMsg, JSON_ENGINE_OTA_REQ, TRUE, &err); + + if(pInfo == NULL) + { + __otaRspStatus(OTA_ERR_CODE, -ERR_INPUT_PARAMS); + free(pInfo); + } + else + { + //unsigned long long uDiskFreeSize = GetPartitionFreeSize("/mnt/UDISK/"); + unsigned long long uMemFreeSize = GetPartitionFreeSize("/tmp/"); + unsigned long long uUsedSize = 0; + + g_IsOTAMode = TRUE; +#if TEST_OTA_SERVER + memset(&pInfo->otaFileInfo, 0, sizeof(OTA_FILE_INFO)); + strcpy(pInfo->otaFileInfo.md5, "78bcf3236f54543301ee1a2f74282917"); + strcpy(pInfo->otaFileInfo.url, "http://10.240.84.163/tina_r16_ota_2.tar.gz"); + pInfo->otaFileInfo.size = 57106052; +#endif + __printfOTANotifyCmd("On OTA Notify Command++", pInfo); + + uUsedSize = pInfo->otaFileInfo.size + (1024 * 1024 * 10); + + if(g_isBackupMode) + { + LOG_EX(LOG_Debug, "OTA on recovery mode\n"); + pInfo->otaMode == OTA_MODE_FORCE_NOW; + } + else + { + LOG_EX(LOG_Debug, "OTA on normal mode\n"); + } + +#if 0 + if(uUsedSize > uDiskFreeSize) + { + LOG_EX(LOG_Error, "Error: File Size = %u bytes, Need %llu bytes, UDISK Free %llu bytes\n", + pInfo->otaFileInfo.size, uUsedSize, uDiskFreeSize); + + if(uUsedSize > uMemFreeSize) + { + LOG_EX(LOG_Error, "Error: Not Enought Space, Memory Free %llu bytes\n", uMemFreeSize); + __otaRspStatus(OTA_DISK_FULL, pInfo->otaCmd); + break; + } + else + { + memset(g_otaDownloadPath, 0, MAX_PATH); + strcpy(g_otaDownloadPath, OTA_MEMORY_DOWNLOAD_DIR); + LOG_EX(LOG_Warn, "Warnning: Storage OTA File To Memory: %s\n", g_otaDownloadPath); + } + } +#else + if(uUsedSize > uMemFreeSize) + { + g_IsOTAMode = FALSE; + LOG_EX(LOG_Error, "Error: Not Enought Space, Memory Free %llu bytes\n", uMemFreeSize); + __otaRspStatus(OTA_DISK_FULL, pInfo->otaCmd); + break; + } + else + { + memset(g_otaDownloadPath, 0, MAX_PATH); + strcpy(g_otaDownloadPath, OTA_MEMORY_DOWNLOAD_DIR); + LOG_EX(LOG_Warn, "Warnning: Storage OTA File To Memory: %s\n", g_otaDownloadPath); + } +#endif + + switch(pInfo->otaCmd) + { + case OTA_CMD_DOWNLOAD: + if(strlen(pInfo->otaFileInfo.md5) == 0 + || strlen(pInfo->otaFileInfo.url) == 0) + { + g_IsOTAMode = FALSE; + LOG_EX(LOG_Error, "OTA Information Error\n"); + } + else + { + err = uv_thread_create(&uvThread, __otaDownloadImageCb, pInfo); + if(err != 0) + { + LOG_EX(LOG_Error, "Create Thread Error: %d\n", err); + } + } + break; + + case OTA_CMD_USED_LOCAL_IMAGE: + case OTA_CMD_EXEC: + err = uv_thread_create(&uvThread, __otaFromLocalImage, (void*)(intptr_t)pInfo->version); + if(err != 0) + { + LOG_EX(LOG_Error, "Create Thread Error: %d\n", err); + } + free(pInfo); + break; + + default: + __otaRspStatus(OTA_UNKNOWN_CMD, pInfo->otaCmd); + free(pInfo); + break; + } + } + } + else + { + __otaRspStatus(OTA_ERR_CODE, -ERR_OTA_PRE_STATR); + } + + break; + + default: + break; + } + + return NULL; +} + +int main(int argc, char **argv) +{ + int i, ret = 0; + char buf[256]; + DBusConnection* pBus; + + //struct tm *pTm = NULL; + g_pMainLoop = GetDBusDefaultLoop(); + + pBus = DBusWithLibuvInit(g_pMainLoop, + g_pModInfoTable[MODULE_OTA].modAliase, + __dBusOnMessage, + __dBusDeameonCb, + NULL, + &ret); + + if(pBus == NULL) + { + fprintf(stderr, "DBusWithLibuvInit Error: %d\n", ret); + return (-1); + } + + g_IsOTAMode = 0; + strcpy(g_otaDownloadPath, OTA_FILE_DOWNLOAD_DIR); + + memset(buf, 0, 256); + sprintf(buf, "mkdir -p %s", OTA_FILE_DOWNLOAD_DIR); + ret = system(buf); + + memset(buf, 0, 256); + sprintf(buf, "mkdir -p %s", OTA_MEMORY_DOWNLOAD_DIR); + ret = system(buf); + + for(i = 0; i < OTA_PARTITION_MAX; i++) + { + char *pCmdRet = NULL; + + memset(buf, 0, 256); + + sprintf(buf, "cat /proc/partitions | grep `readlink %s | xargs basename` | awk '{print $3}'", + g_otaPartInfo[i].pPartPath); + + if((ret = GetShellExecResult((const char *)buf, &pCmdRet)) == 0) + { + g_otaPartInfo[i].partSize = strtoul(pCmdRet, NULL, 10); + + if(errno == ERANGE || errno == EINVAL) + { + g_otaPartInfo[i].partSize = 0; + } + + g_otaPartInfo[i].partSize *= 1024; + + //fprintf(stdout, "%d: %s --> %s\n", i, g_otaPartInfo[i].pPartPath, pCmdRet); + + free(pCmdRet); + } + } + + LOG_EX(LOG_Debug, "__ReadIPLParams: %d\n", __ReadIPLParams(&g_iplInfo)); + + if(ret == 0) + { + __printIPLParams(&g_iplInfo, "Current OTA Information:"); + } + + g_sSetupStatus = g_iplInfo.setupMode; + + if(g_iplInfo.setupMode == SYSTEM_OTA) + { + LOG_EX(LOG_Debug, "System setup on OTA mode\n"); + if(g_iplInfo.setupStatus > 3 && g_iplInfo.setupStatus != 0xFFFFFFFF) + { + LOG_EX(LOG_Error, "Check OTA error more than 3 times, Ask server todo next step.....\n"); + __otaRspStatus(OTA_SUCCESED, -1); + } + else if(g_iplInfo.setupStatus <= 3) + { + LOG_EX(LOG_Error, "Check OTA error less than 3 times, Redo OTA used last image.....\n"); + g_IsOTAMode = 1; + __otaFromLocalImage(&g_iplInfo.curVersion); + g_IsOTAMode = 0; + } + } + else if(g_iplInfo.setupMode == RECOVERY_SETUP) + { + g_isBackupMode = TRUE; + LOG_EX(LOG_Error, "System on recovery mode\n"); + __otaRspStatus(OTA_CURRENT_SETUP_MODE, RECOVERY_SETUP); + } + else if(g_iplInfo.setupMode == SYSTEM_OTA_OK) + { + LOG_EX(LOG_Info, "System OTA OK\n"); + __otaRspStatus(OTA_CURRENT_SETUP_MODE, SYSTEM_OTA_OK); + } + else + { + LOG_EX(LOG_Debug, "System setup on normal mode\n"); + } + + if(g_iplInfo.setupStatus != 0) + { + if(g_iplInfo.setupMode == SYSTEM_OTA_OK) + { + g_iplInfo.setupMode = NORMAL_SETUP; + } + + g_iplInfo.setupStatus = 0; + __SaveIPLParams(&g_iplInfo); + } + + // Make sure continue last download task + __otaRspStatus(OTA_DOWNLOAD_FILE, -28); + + RunUVLoop(g_pMainLoop); + + while(TRUE) + { + usleep(1000); + } + + return (0); +} + diff --git a/Modules/voice/SrcApi.h b/Modules/voice/SrcApi.h new file mode 100644 index 0000000..d2a8f4a --- /dev/null +++ b/Modules/voice/SrcApi.h @@ -0,0 +1,75 @@ +#ifndef _SRCAPI_H_ +#define _SRCAPI_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct _SRCParam +{ + const char* URL; + const char* appKey; + const char* appSecret; + const char* cuid; + const char* severVadThresh1; + const char* severVadThresh2; + +} SRCParam; + +enum SRC_ERROR +{ + SRC_SUCCESS = 0, + SRC_HTTP_ERROR = 1, + SRC_SERVER_ERROR = 2, + SRC_SESSION_BEGIN_ERROR = 3, +}; + +enum VAD_STATUS +{ + SRC_VAD_LOOKING_FOR_SPEECH = 0, + SRC_VAD_IN_SPEECH = 1, + SRC_VAD_END_SPEECH = 2, +}; + +enum REC_STATUS +{ + SRC_REC_SENT_AUDIO_SUCCESS = 1000, + SRC_REC_SENT_AUDIO_FAILED = 1001, + SRC_REC_SENT_AUDIO_END_DETECTED = 1002, + SRC_REC_RESULT_COMPLETE = 2000, + SRC_REC_TIMEOUT_SERVICE_CLOSING = 2001, + SRC_REC_TIMEOUT_SERVICE_CLOSED = 2002, + SRC_REC_RESULT_NOT_COMPLETE = 2003, + SRC_REC_NLU_SUCCESS = 3100, + SRC_REC_NLU_FAILED = 3101, + SRC_REC_RESULT_PARAM_NULL = 4001, + SRC_REC_MISS_AUTHEN_PARAM = 4002, + SRC_REC_AUTHEN_FAILURE = 4003, + SRC_REC_MISS_IDX_OR_ILLEGAL = 4004, + SRC_REC_MISS_CUID = 4005, + SRC_REC_MISS_CHANNEL = 4006, + SRC_REC_MISS_PTC_OR_ILLEGAL = 4007, + SRC_REC_MISS_RATE_OR_ILLEGAL = 4008, + SRC_REC_MISS_SESSIONID = 4009, +}; + +void SRCSetUPParam(const char* strKey, const char* strValue); + +void SRCSetSPParam(const char* strKey, const char* strValue); + +const char* SRCSessionBegin(SRCParam srcParam, int *error); + +int SRCAudioWrite(const char* session_id, const short *audioData, unsigned int audioLen, int *vadStat, int *recStat); + +const char* SRCGetResult(const char* session_id , int *server_ret); + +int SRCSessionEnd(const char* session_id); + +const char* SRCGetVersion(); + + +#ifdef __cplusplus +}; +#endif + +#endif // _SRCAPI_H_ diff --git a/Modules/voice/data.pcm b/Modules/voice/data.pcm new file mode 100644 index 0000000000000000000000000000000000000000..5da058a43dfba709642dfde9e6e844771f4bce69 GIT binary patch literal 159990 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�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 +#include +#include +#include +#include "SrcApi.h" + +#define DEBUG_CODE_LINE() (printf("%s(%d)\n", __FUNCTION__, __LINE__)) + +#define POSTURL "api-test.vop.netease.com/echo_api?rate=16000&lan=zh" +int main() +{ +#if 1 + const int kSamples = 1024; //40ms + int rcv_code = 0; + int error_code = 0; + + short data[kSamples]; + + SRCParam srcParam; + srcParam.URL = POSTURL; + srcParam.appKey = "onlinedemo"; + srcParam.appSecret = "4ea70c117a5b858cd9e6e384009bbad7"; + srcParam.severVadThresh1 = "2.0"; + srcParam.severVadThresh2 = "2.0"; + srcParam.cuid = "1215468784532"; + SRCSetUPParam("uuid","0-A024067C55B0163C"); + SRCSetUPParam("aes", "0"); + //SRCSetUPParam("state", "{\"filed\":1}"); + //SRCSetSPParam("name1", "xxxxxx"); + //SRCSetSPParam("name2", "xxxxxx"); + const char* session_id; + + DEBUG_CODE_LINE(); + int status = 0; + FILE *asrFile = fopen("data.pcm", "rb"); + session_id = SRCSessionBegin(srcParam, &status); + if (status != SRC_SUCCESS) + { + printf("SRCStartNewSession error:%d\n", status); + } + + printf("ssid = %s\n", session_id); + int getResCnt = 0; + rcv_code = 0; + const char *asr_out = NULL; + + DEBUG_CODE_LINE(); + while (1) + { + if (fread(data, 2, kSamples, asrFile) == 0) + { + fseek(asrFile, 0, 0); + } + int vadFlag = 0; + int recFlag = 0; + DEBUG_CODE_LINE(); + status = SRCAudioWrite(session_id, data, kSamples, &vadFlag, &recFlag); + DEBUG_CODE_LINE(); + if (status != SRC_SUCCESS) + { + printf("SRCAudioWrite error:%d\n", status); + } + + printf("vadFlag = %d, recFlag = %d\n", vadFlag, recFlag); + if (vadFlag == SRC_VAD_END_SPEECH || recFlag == 1002) + break; + usleep(40 * 1000); + } + + DEBUG_CODE_LINE(); + while (rcv_code != 3100) + { + usleep(100 * 1000); + asr_out = SRCGetResult(session_id, &rcv_code); + getResCnt++; + if (error_code != 0) + { + break; + } + if (getResCnt > 10) + { + break; + } + printf("rcv_code = %d, retry = %d\n", rcv_code, getResCnt); + } + printf("=============%s=============\n", (asr_out)); + fclose(asrFile); + + SRCSessionEnd(session_id); +#endif + printf("Demo++++++++++++++++++++++\n"); + return 0; +} diff --git a/Modules/voice/libSRC.so b/Modules/voice/libSRC.so new file mode 100644 index 0000000000000000000000000000000000000000..07977bdf5c41a780b6a47171c038c49b421aef4b GIT binary patch literal 3495452 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

^oRgWbm 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

nXmjB5yee&$IX1U<{_%1)C|B(4q4~1z{^zV!4 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

2W9Q=|WqYdnxiKNI!-*XheFN=;UPD_zG>kihgKp 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%0AE=y^bI~mue&dyEaRA?+U?Q$1$S8O`T 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

v^bZo$ARg|;x~*?+HdF@!mH^hGA7 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�(KWmd*Y)MPhW>P2U!`m4e@WNZ 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̿B@X&!J}7HH`aiFQy>Ttouw%^31;6UBE~|@Yl=Z7_@;h^ZW!A0BDj%}n z?P?&!Kh1~m#2RQ7EAuQAgPQ$gTu=Wh)PZ$%s)M?3WiG1BSO@5H9sDfR!7qwBuy4e7 zbH)JjpZ6%tyRHM%l`*KZw<&kFLv^rur+a*?-Pm-eeJ=TA!?IrpAC>G_WKhT~tn zPy0RJ!-0-Gl2&c|=$KFxnXjCWoZ zNPk^kXvbFO|I_mvxIi|=HDmMxdi&9eKKjt^T)?*VOJ-Rwv|%rHy(8PzFT2t>@Oaa6 z1JK%sI@)ND{Vn$!);GG?bI^{zbulRSJ+`CV_iU+r)Y(w(xoktZ?}ERqMdzX1``Lza z?}v=CCVAJB_n5q=1wYHWfsghwKLfee{Qi2=)s52wA(z$rpTdwU-_N281xUyboBQ9mV{7&sp36!i*!S+CYr+5l~-|MzN(xd3)QWRCP+iTR_|x*8t$$KQpqj{aN66W3Rt z?yw&EJ$cLXuJyQPQ+^lTW2d!h^Sy+)w`wOd#Ujli=p(k&7=Aex)N&jzWBj(F?}~mw z9>W;#%bJh=53Q}6?Tu@rh87ws-wl?L6i>bdqFP$FqTjkufOU|Kp&RfOE z^s&|-?$9r*Smv?bIy&XM?mmCadpnsaH>t0q&v|$KvY-Bam4k)v{ru5+_g+S{%ZBF? z9N*|a`Kq(GDPOij^8VN%|8?<Uiy!@&m>*V>-Mel+*8Fa=h-@(=a`eNHTGfKSEc`=LO(cc+d#PEYH+q~>u~>b z>lWh@HT`0a)z+G8y!Wzx+m>>g>gB~8H^%y5;lE}($^TY!13d0GyM~zU+<}J}lzR`$ zD)%0=<9o6-&CRy8Tn}1Cxh5QxjFgAO5A5;b;4lxaT&(G%PI&C=5rOA0`5NbvlBdpB z%PM`P9bZdZ(ObsLK9n;4BpJ~LVEg)FuzRqL-SF7gKap3}1oU-%09x1PV5a?3ppCvP zHvwBzn;L6~8Q1pNHJRvBO)jUg$hKb)Y`?IL?eN(4n*+~BI`G(s<-+;Ra>e;gjO$;z zlP}BhTv+zSy6b%TOUMKJJFh1%YGW5X_T`owTl}cY1GM(xFVN=k>o1~@YnSN5U$YN? z3F{K;tn&f?(6O|}sCd8Mx|b^Ua(~S}#~P^Q7yQsIS;LF((O&Ccs^GW&rE6qhZ4sH;V2?ZdWVzS_2!ucG|Fcc=ceZP*)GXPpoD zhmNuqth=m*zvuil=_EfzEx=#aBE0w>>%n?T{kE%4KlYX~O8w|6^}npPXg9EHk+q8R z$G98k>Zl7I=kKqfuKwPFC$97E?Xb>$In&J}-qvdWJbxA2JRe$Dr&_4HcOGk@oy=GZ=yNUnJ=FML ziyF6Y)WCL(H~RH@*)>tdyNpAf%}x2UEvkj>I-GH}iffd&-Na<4eJt&(e9_qDaiQ8L zXpCk|Xw?t46TNGpnrlS=vgkdgr`R_Cr~Rf5V?hy-OMpT+^`o%?pNGEc1kUw5d1DyF#xtfyTK9Qi-UOZiE20lJ+3 zm+Aki=f8z|wlC!U)tqzAxoJLJ4BhEdk5-6`kxsV?WQN*_7j zSZkPLi!%doz&`Y$c?gTuC| z!W~tEvu*zhw*9NHE$K?Ny#2%!tA8n{KI^c4+m?Jub+WzsruzzK9UdokE_6iy;cVnoj z9+Lad;caLu{mNn73tC2b514j*tFx{2%`!^g{v#RDUSRvSy?pap=HIe8&Uqz|ef&@M z5&F7#Am6q4?@arjKpTB|y*t(5_F7N)Y{Ndg1`~a%!PkTB7iQUfXSvP}Xl?UHMQcBA zY2zn6w*7VF=ktKq#ZyVsrMdo}U;#XXl1o1n+Ci@YvZQxnSv zK5A)9!AC8PF8I*5Lf}ImvP*r~z&E&J?XDR3(1+~EhdykGe7({)Ht;#d%>AwnkG;+d zHm=km){86F%PZE%eteTt>Ra$CtJuGCt0i1#Ls@T z%Qf|}YVf69oS<2NL82qTq^GL}a zo9*llF~a9--(a36N>+D`oye-rNLu|5yhW}pZ&7l+gmkZv{a8Kt;TToxA?2EVMH!<> zAx7~IJT2DNwQY2iKBgKm2c{Hjo?dNz8xoM*9>vO?s>4O(1=gYG3N)Ym(#l$(!Kx5AwI3_Y?qt0q%k7)(-w%s`>vL+HcdoPH3;o^V*WVPL|!Xh_uL^5@>z)K>NC({V3Tn zHQTXXXs@$lUD>f-j@SAfXx9_%y4mKbf!28)ruPT>d|>B1Psg!tgOFSE?5eTRJUi9! zY#4ZW9$|xGeZ{i~8`i9^HVXE^2Tfd;!H2B4E+dZ90-tSMCC@{L$-d~%#=$nz9+JoU z!wcH!ftF_tHZJVpIfLmn_G}XD!H<#;KT5t{`7tB#)#ZI7<#Lmp%S}7b&JgXiOuJbJ z+G(Plk?U#m4z#v`xNi|?9m~4?F0@;QSeo{huy+2aVqeZ7TLqrFcx)-Vx5_?l9c*bw zi!Iv(THA7Au7Ndm-W2O)+hBuf>-Oo$-7e79*|4qb-7ed^eXyY&Epm4VwA`oPx~N0$ z({Eo>hdTy7o=@1J;N#hZZ3@0#>Dwvrp%2-yAEFN%Vn2j$=fH|g-7|wN?P!s^cc3M&yBGN(uQQAM^onnvz{kD)JqkYV>+fCgp>N;7 z$36X0ANTZ2eek_0@KHylKI*8{hn=$mUtKJE6t_(kH+1aRfp$mH?vrWv545arZhM34 zu>B-!|D3OK9XoX2tmYZ%7HfFR!;dJh&gY$_`%T%81A-rQw3~@`YNkCf(Bg9|JKL?r z4v@S9v%F|$s~EPEb)aM&P!q#CKb&W3;-KJ19j)U7?ZJT-8=rlHc|J%s9$aH1vQGFf zWi3jM_mSQmv))634|V=d742r3_Rv7v%Eop%IYhD!m8{anRrlx$q$YNCK1>nq z=2`Dy!G}89T|_%8(;gmZv9YS@R{u|E(f1CMyu)kkv^?7|d(9OFhEF@M_MFZ#%D9;~ zp4aarefwtnj|leH(QYBy^)u~}fwr{m%r>?iAsI(z8D*bs6|Z)AJyPT-- z_VJ5Ii@p;At^eOZ`&&Z$ak68BY{!YAz0Que$c__pym~v(o+#S4WSdV4v|av|h#I?ZH0oJC}Uib1wOa z=~HXa=Ibo{rz+|#`y*l3<30uTH3lINX)2fyA?|(Y#Qg~IKvvw3 z5RX#>UtJx%UAa9a=k~M?w5N*p-tl9}#`* zOLGEkoh|Q?-E*?t?+v!Jqs8vC0xkEW`-=MFe)M~b`hxH5z{frJvkE@$xu03^^@{I( zfe(Gij`fT_Y$)sboWO@ZWJf;qVMFA@&bfilF@9&r%PBQ^IXA@GJYUOs;of=7%Xxve zF4pHNFX!dF%nP=(qs8v?1Fda1J=o2?^Rho&5Nt8eR|C)2YJ9yg@YLCKf$YC9+ka88 zsU0o$UmR%3^SmNoZXiv(tR|Q)9t+TP+n(a!-x+=?xHnxggJ6Tsr)|EA}tMkG6 zr4~LAe5j*!Y@oe5&|>2YZ!jkxkd0T@*odr?|4UhmlHW_D_w20qn&3m7zbA?I^h|qg zplxMiyPRAjS=UNdX=AI{wUc$NWL;AeyE-3E5bYUR?+1eqb+mIuds(LaP@u)e%ids4 zJ}6lqs<9DS>|N74LzF7b-|B1+S#J*&9v7C+IDuf%guF? zcYT&u_T#!3wv%3p_yrs(|4-SF_fji1pKt{JG)IalXYi%nZ={#?l#IcfaBNbKv{|CxV&`}MoKx^8`@>(QADM%;1pv)!+6 z^vsl1ySlpe*x(N%?znux$Vc~CFtTgZz~oB)mDT@ICiq&>fe{;z8rXiut^K1Fr=M>! zs{g3%ckUmf>k+bv*zr5BF~+2`qOOg{%l>)uyTtpMVO`I^qFCeWSkb?hugAeFx^jGi zw&E52gcdZ&FwG>lGzGy(_F|aIEZIA=``om81_mZTJHoTKluI?NP2?QB841OHPio zEoy%)v>%&wLvupD9--@#biJzdtdjMtCOzYV9pj}3JZ;zk9$MQmLHLz~AFnpzI8pG* zf+tk;eS_Trk6)_?JoJ+U6W6NdinyMieK9V^_2TTqNcnJCz8vg5SC+lBN z`lkf@)|YtA;nx;^eYFw44FsS@$6N~_E4TaKHxv?Z;toKwEjv207)WVdNI z6D{Aox7`~G?k?=!T=s0F_SLh@EwbHPRB*4xpJexzYUet&_YGEKuj5vXMO%t)^DNJ? zb>DIQn#Q)RE}o4F+qRNU+e}Qi&bDoxZR0(q@Nc8`t#v&n>%@QS_4kn+ldVLzO$*yh zvyEuBs%%O5uA9?cN3W`IAwQppeef6;BdG^u2FVS`9 zD?{__OwF^ChH0)|e$>De&9hUb|DtV{=|6tEovXQaVAG}hPt0@elG`rTzq+oOKNs6< zvHqt;!~8ix*L$d)d2;@YrTX8aYv#i^HxGS(DAnf_^)KemDbhD{v99MQ31*C+EWXM4 zdWx>6=6*P7jiI?>YG|Jv+NY@#D7D@ zpLy2tXKn?b=H7&d*70Yqtzw(U>1fx3wkzYJJr8FaSTjD7uURubs%y`Q*fT@+FxT21 z=05Og{!Mu1THC`M$eiPMTr&qTuch&y=OEMCfH{%)GxxAo@Epm!z#2QP6*pJDh|A`K zo^$Yz@qabZte0_&=g=%&{q_ywCp0`qwQAMYGsyE(Tk1O5x%nXHyX!XKH2<)6PkMR= zm#X-*1`u7fHhSBMgTvouyG|VZ)SP!$YkuaZy4rRgm~WWV@D-b&^?X^*R^TwBX-AF z55+dw?bu`YuG#Js%b{3fw_}anWnJ%PyBjszJQnXN8+I$=?scT&y_;xu4L;Vb5nWG{ zv?lTz(Yc+hHs-HsS|hS%ifhC#{`-GhBc66h^BVDmKQ7Vr%HN09h=*v6I7@591D78) zaH!UZM@s+SW_0y$s&(FIjqP!rN8gX{Avshwv;H|$Jo{*!H;ZvpbHW($9hk3KPadgj z#|#>;nOI*&96ZLc-b6n04eL#=nQvG_GES#65Y?yhyQE_8`DSV56FhCqN8q9Le8ZUx z_u{me({bNmuPt)WRYe%kU=z4EmuONMC z|I#zKqU`q>3;klO>;X?3{(*)54YxP_7At|dW!V3-o(CjrJu3c@n*dV-s3fRXl);7H45 zhM(Y}wI8e_ZAYrvv~P%Uek#}$X=0pzoo!;@Fh5_jZ+KSMTS$LeSN05UDgD)am-msZ zGr`k_ec++BeVj*dcEenQKdkdu$ENd%wC*yVxU-%z9+>qFXS-?L&i_(o>TJUMsI-=- z{Lk~N{bqd<=X%4~01fLy)@VLMV{O5DoBbm+%=fGpn4^J-6+BUwX zU-9f;@g&Xn%8~1Y&)#~i#h{jEqCNL!}`xsJ8QWor!CXJaXuToXWNnelhw{z z?d+|G_3xtVNxJ4<-empyUfvX4$93fJP4fLJ#entRE3#qB;a$)FnXyM>@l?^jl&`1h z`ZZlM&%|6n>$T#H7Bt8(%@(40MKJ4`ZSpninH_Y^IFf3(XOM4Gai;G1b$Qhw_;k*m z@X&hPUqN{6E60>*A8WcgnrPpwY!mbUf%%&GpS2q2eJfV=)-$-W>>C^G^LZd`%uC>* zwSAlqvR-5#Mc+#6-d?>=W2V+_OyQM8)Uu4`ARzP>(xEY@zwaty3KOw zGpyU7OY=;x?rkPI)^82pH7>`voE76DT#U!u90S&C=jUtIYpmVYknA+h_6)8mf4v^V zj;f1&o$RmT1P~?uFZB0)m);9_OYg;o>)iRl&@Jw+^Xvy=}+f}J%dxE z-|I2#ZwSBDTs(9sjKH7DAwrgI-MSJeZHf$jq?#$QQ==v^QGe-X}=Y{Kv zpLrJhxhJ=t;IxiQ_vE;DnbvLTUL5O7-*01GM_nX*ukw@Xg7uu`#QNhrkaba7hxO?k zZwT&{e$E3o5}q@Q$j7-LdXnB=t=p3x)@|Hh^16(58uxuT13@0^G}ptQ!#eh*9BXRe zrO^ILjxFQVYx$b>E%$a<4{*LkKioli$c-pWBJhZll^^W5b=hIk^oLkh)Z-!ZW zaAxLtnzaY(T-F%Sv*w^)624dYN%g{-!*XJM9jJEZ{R1=qK>?iM3|rJ4Eg1 zNqT$r|L>&dP_-YT>qE1=!vr5H_>hXfZ}4!z`wLF@Y=_3}Bh=0qoW|q6!6OB;cG@J% zIZ814j;i2Z;gi0j)y{Ql?;9kKtcRVyy1Dge(I1iJnzq$EXIf$bEoc6$^I|NHkq!2V z92_f{dqtzOj^ncJ$7b7)6ApQAR{OEKJ}%QyU#;wM?Y&v_$5i^0J#~JX_88H=Im<>a z`;2s6+BbN-baU^3d*#@Cg5Z&Y531mFpWrZEyPv;Bc+M@oPvkjm_JGEpDEwQ5KQYVe z6?~%Lw+N20Iw|WxHucZBK000hZ_Rp;4IVw{H2!VEzg2SIrnV^e?V%liP8RIgc>FtF ze7%+2=Gb{0JX!b?0-kzH^u3A~*L{QU2y*Mjk9Uaf?UijoM=|!920O_MdQPtN_9_oa z&pWNBm=jMD{++=_`xtF;{@*FulY%YIKYpAd`RrjhuL3?*F!?>WlAYpyxUQYw(}W)( ze0r{+NB4l@{g}SN(}h1x_|q%?zQHpDpDy^cO8!tkpPls}+xbPO^ZTx>hcj{T=s~CL zc(?HHlH7M!_#wG{p&ftD6ijTYejV0lr-=8AigzeKrg7ZP6wRrDhWsR+Ud1it=RKBR zT<;CNphMrbW-0mEKuk}@3AR=~7d10SG_!+E zb^AK^kw0tx^1jaf;-x&l?Vx=fdzu;5bCDmYp22)gYY3jVWWN>nd-uP#@cI7ve^{dH zjXrbPw_o$V@BAm1=$ic3p?%*)+V_oFY}CNm6?A^Prk?AVK5F2(?zHb4x8;)kE9ZUR zXIw@ znrA72+3y)oo;j~yQ+UtkJX=}Wn8$)>Kl{3fi*~cmBX2!9ujI}5BhkY?4?JzI8)%(( z_IZxYm^FuF*f>pZ_piS zqTk;Z&5F{K_JipeVD^IU59|-Y(}o>9BMhzWn4aw@$Bt;nBiW9UCff0+Xn3Y~ldNYI z>6sDiV1EgoHtYZot?gi+xvuc+OQ{p@GdIXE`^?RSPxEVf?u7lS_qFURd8Ts1N`87C zgneaNkEMO3<&z(tyI^07d|=N1IWPCK6P*8BKK5|_Z~4INALH3R`$g)cijn5+7(e!l z5f|geev$s}eIfll?h84$2k(6$__#0R+}-t==IZ0C{{Te&6SDrHu_4h!JGc+dxVd{3 zk2Egsp=;L>=j-5UBY%vW&^mvdx7&_Xs|(w~ezT4y+QB|_Rq2_T^-PeSy@MU>L&4LA z9pIt09qdD^Sl5gn+hqMduZenh5RQFC+JE*8j+b2ai1wfTDtOw^3m#hQW&g_lo&7KM z!M>G!AbVusy8SBmLcBj_zq-HRw7>2fWS@GlVD_Iq;%9$q`M~T?EgzWu>0zQz>(jnL z_NA7Oe)gr756r$a?myX&9wh#B4x{IND!sjf>=E6L9`=Zfi_UvOpC7STv^?aqM|A%H zX5Yp-Jnie!`uKS1aD3Uvfv1i5vVMlv@ns+9+DUcZJYHf)vMH@!*{gcL$sW(Vb+tLP z-%Grvt?N&wB^Ioc*{gaV%-+$wNl&wly`p8GMm(y0ZJw_^-xzP%?BRE+=!f#bKGf~d zvF{`wZ>{1sbk4?p)8`}TW1s2q6PSG_@qT;7m*Rc0uAL9|i{NQFbc$%%D?%IN6mw@i>=jQ5de~>O$L@ebvK{iWN{$$pZ2r2S;C);HrTKiF4#KEf~dlkVTZ-apQ+ z^rd{fOV^G!`$zIYoAUv!^Tj?AUEaqs{u4X)wr5m4X>VD@qZk|6H^#jmH050H`NXvN ziu^OgoA%0mgX}FEykQPxzsSB9Kb=pH!Io{)6__*AE{xaMOyT25wzz)WB_=vK*kb@8s}XFRe*7j5jp*n@M;UYdP1*X*U) zS98r?ntk;WiuuSYFTJ|wm-YsR*;}($hm@xtSB7&dc$J{qua3e(}vkUBa40ck=d_RvMlz-tPu@+FKn2- zFS-n~*BvLA{VjH~x8+$g&U*14F9A+4?lZV%LC8e)cU}) zH^mq3)m)YH#l4zqvtMccN@u;kCx{&OsKm(k6gdlq*5gNy@SJrxW>W;S_q5;aMW+Z} zH~Ycf(=hVa&-|vJn)xk{z2#K#d+)+t(lCB)BzXCtf12PiK|g!KX@b4iVh?B-{hMTd z>z|SNt)IOd&rWTc^TOWEF#6fMU9Y&(KjtfzH|6VRb$y$zJ@!N6bBE^&96ZLoARK4F zTUGjc2G>x$;~D-o(g)sW@8F?zKG^GRA$&RmPJ6vA1#g?<&tA`X>}RjX{J~n7c(B*Q z?%{bnh<1~O9Z^>bgbjwaf{ z{%>{Z*)8kg9=!K%*ulL;@ZS4@ht_tm_uEDIwD(KTRv9Kytr+bt83FiJ0{Ot7%_X=jOXL?}v zdWVXhdr!dL>-kUe_6QuP_v}10tBho}W&KJ!j=}G&!p23OI!ye0au(t%C_FV}Nt?gj1$sXy= zm7VDxA^Wtnx8$9OLwMrJ{?K?}-vjK;{Oq|-6hAO{_FVWmoON6Hj&bz!)7j6GCi;21 zXeLW;+OPBst}Q>k$0FYB(ZG9;1|C}b$sP?mriS-`L>unPHbi{Xf3NWD3E69rPoD8* zFXcG1e*&NOR|yZT^|SYJ9AZsH8y*gEh&0iTM?}Nf+UePj>9T`8i|t^q1fDkR1P`t4 zVDDr*VogOmo(gtEnrO$bMZ@|e-J?tYRp<+LoGCrvX~Pcw%K)wIVE@Ct*tCc18)Uz7 zreN-!}SJZ;32briIY=cQTSj287hE$fZ=n9mu)ZzTDbW%=t%{^ddc6_O90HuQss z*7~mu{-)Ypc>dTS_#SDZ9lMBT73sMu>sdj1J`n7bn0c7TW0c3da?`-Q){!uJhcFZe@(ugLI+1z#`t z!-A=o8w6h}_?nErQSfzwugvgGf^QUjQ>MQ;(8K=`!Ilqvi{Oul{+7&tYk z{+M9v1OB++kBR@|S>J5|?h*bIf_D&p?~MPX;KK!oPQlr@O@V8Gu6%+68b(T__KmPm*Lw5e@^gcE55$L&kG(Q_|^)a&M9uw zHTi)53&IZLe^Kxk1cU!l=C^$QD{J}Sznt;N zq#nSd%lf|}{Ff!~D_P#10mi-UJ!HA14UyJzza+Vz5B6>+ zc(1JIYl`zBg5Q$iuM7T~;IC);y8_&+*nC6q3Bn(o>F*ZI^LG1W_#VM`3%)1w-z)eY z!FOl;eS&Wgd~?QsQ!r;!K2!RZ;BN~4R)rtxH{VwKx77a4O3qOG{c68i?Kfok4+MF{ z<~xEP5dJ#_--DsON6%8be?Fvk>Su5=&b^XT(!^X_-Zw=1V2#d5Yq|G{_Wl~$;Whoka!VT`t>xY?x%UNoJubrg zUB&kZ;on-}hvNP{wSQOb-^+Xt2e?;!-xuuhH0J9EYTsUbGqWE*6#N6hKg@C-5&T2J zKgjqW31-~;XoXMX(kFE7ap}jxGj7hyc{7));-{7Nye#v_w)5j?uA{|VtAm%Jykye9+PBmSQX_IfGhw7EVX7Vo2(*Y(Lb7HOTQ zM@0M68d|TKb-beI1X8KEerg5m#-V6SuFe_HSy;aS%M|5otRf`6Og`GS8d`0335j9{;OpkE-^>wMsT z!3#v+pXr|sF!%w%)%aGNM?EE;`I*PL_F0?b_-oM&1RC=omt4a)Aevu`hBo*tt2+Ox z8CQNG`e%d8sVYr9Ey@PlUW7w+;KO6W)p9?%~_vZT-FWkOF*O9*;x_`0n z)B7wKt#>-kA2Dj+*|B;iaPp{u7iNqanALU5Kv&n5^Z)B-19PoBHzS>^J|~&KS*q*# zQ@^rA7j1qnkZV5|$hDsfv%C61+^#^$LQqg?kx17dTS5 z6)RkC^b8Km*Me((Pemo;8g{W z&2~=|%$f8m+3s$^@m|L2f>#!Pe8x`-^u3D18UYWyX5a^2OR)73x5<7qtSkQYvVZFb82wWPFBkM}Ab5;m^K*}41Hl_+ z{oJE~-uP*m-ugEd?0XW}H$CtJbC1G!^v@7XU2rewN#&Aj?&UnCYxHbd=}l+Io9Wtf z_2%N+DBw9;iuf&rC$6+H*YjKM*eMt zr_PM$xvPlZR(R|;9{VGHyDZ=OkstMMpXD2m{D|K{`1y(@;{)%7eKucn-{S>cSL@tr zoKJH*w7ze{{f{~tWSEBM-zLibopXFAN&hY(Kf6jlc-n|RcxWB}-GoO+xo(JdaQ~x@ zCfdRCZ^Uu;tcN&qzr%I1r}TiQ4LiU?YdiLec7%Olv}0Zm3>0vF5o~@*Z z^9b9qkMw}2&3I^S$G*a|m)o_%r~hH?DVV(-{bZK#ZxTF9F!j4%fWhxCcqiex{{#L2 z!R7}(P;h*%=pexdivEBs|6sw^5B(v6_Y!{JEbmakti2A+@L>T)|KWii_z1zfiJtpn zz()#Z@4b{)KIgG|`T4i)O0y_#Va-={Ysnahmji zrwu#6Lu)%u7ycc>pH|`1|AXEsINhsA&v6+~{N5#cY4>4(1VPZO8kBe~<8ISNL=`-&LL(K_F*>Y<>C ze(*fg8qzy2+qt^zJU`pnBRv;L4|v+}13a|$KiL ztOIE_m9|3m#hQeZTM*2%qki@I9KD`rgiXop(decV>oQ;&pkT2fjjZujtPa zJuvq+E){%6hOZKQrQoZwyblOIN$}i^zgqBRf@f#=8o^f!z9!RO8|bm;gMl9SLxMjj z`VVFL>jc{#@Yf5rJ-{Cp9QW8a2!5;h&&~Wd3cg(MyE1%};JBy0Ineh?-bVsG@GXKr zBK})4|E+@GCODm?r+W!k2!40Qe@ys~3jSDzxtCyi%Aa>3I^-LU?I)^+pQte2XMV`Qw`+e6(( znrO!zqS-=vK9}`uCq1_ZJ3cQx;Az7S@X*?hF9`n`;XhyD)4hq$3g%t}e%v9vVdD3t zKo9(7!Bza^$Nb4d_Z}Z{?9~2jXn$1gtgFA0?P1-^8NTE8RmlTS8}@>S*7kla>x=g; zV$6P>^+tS**L>mEm;A41`8+FeSJ3|r$p=px`oTkM{dWt`J&JEs_`bn=1aqd(89ed2 zH{glSeE|>rO~H;=%IU)M_-i3{ktX`lr8AIm()+D!C-1lWcD55c?w20$wBZMMXzj-X z*^a%#J=_?_(UOmy5g+xB5q?w2|4x>_ndCnh^gkr|;AulYcxbKvyTacu{6iJKZ;&(U z2LyjN!<;@05?f!ArTg@fm94+eKChIS0q8&SkrdxW_S$BG$-lM^e$D{{5ZP>Av?10vGJTCl? zgy&2byE)tbvEauu%-ObK;`P%&5BxL1UljfKL=XIP!A}UjC&Qf0{#@`=S>7)M-y!(n zjQ^$JCk5Y|;a>?Z&t^@JeZL9xz)uV2%#pKKV9sW34=`u5wg>nb!ShAW871%n!Q6ZM zeug=l{i$Hz8{urWU+}XTKM?49#s9lN5Bz(T~|0bAwEq|@}(!G$s>Du-4QpVFpeQ~b@TJY%oyYTd{p&D);r?4a0 zl+J?xB=|3ttiHjQ18uFvGn--g({fl`2lzIOV^zdC5%m0UH zUaFBF$I_D4@;QgUw&ESi$t%+1cIf^on4J7mbUb%(w65{xRkdHK>#MTve+hOU0{@y| za`LZ=FU9;dT{|cL&Uo6K6KI{2{|Mh4tCSOuEB}=2qbuGNt5*cSn&Hp{<}f?vtJ!?xD9jABm1y6NAd8@4|9$E!XR>0)lIC(&O0;=hAk z3nU}mkJdZH^_|sWTkpKUeFu4N8NrsKL0AdNzVrw{&mfHpwi=K!7CdlB^!6@PJC5dEBg{(vM=++ zbwmfgWZMJPy~FFO+^1UHiM&aES&y`1FZUXuPyDG?jVtSsc5-x-c#@roo^Nh@9xU6@ zeZA=YoL5)w5Ac-rRJDn|tS8#BHQH#}IvI8R*d1-Nk6m-FX}nj7K5qM#pP2GPo<~!Q z>MQWzPrF*G#)+IO%fMFjcg?BEaZ$&S-+c6gLj7i^ zZu-oQ>3YMRD!Y@;=CRH7Sn0}jzq97@fy3=owdB6H!mB-8hb|ps~o~7;>?% z%q4cl`YriAmf0@zC;e&u2Uo=kzrwh?TQTlBzKz&~I*DJ`tN6Sbyr23sHT~%JY^KXN;X8o$VtIkm;omZ`| z9edU#Gs76)Q|)QWT3tAnGqX<1ajho%9(eIN#rW1xt21RAu`lbDcKkDa(x1j#WKQ> zC)>sRF*A&_GmCN7akb9se1A-;*L|qBy3x~ate!pby@zMj#AAx6-RBo{e}d-yLIyT$s~ zQakTFIAYp}{#|v=y9D36-SGa6bUjtqcj()eTj_e5uHU}J()}-scZRM%w&~*i$Etk` zUC-ZivHnAKy^XH_y7glHOX+$CU0)^o_lbTNT`#}sa{Ya3=bZ+AE|O;g{m#T$y5^mU z2kO`FOgvQABb2j|`Pa{a+_gEmnK%C~#bm>=dROA5OLWo3b5FeIfNP$MjT@_0{jzs(yw1V6FJgE?hF8n@iGraw+%0&#;EB~3nZB#Tx%`CO&v`!3 zFyqAI|9T|67OYJk@kjBexC5xiP}c{UJPJQsOu_G?O(wQi<0 zyq;im8Roe_bQ$KkK%TGY$$o7hcx}NvM~K}U3SL+6v1Q7*^BTiyk|!FS(Tpicd`#WTUtAKw~DglQ{FntvJd*_M44FXK63uo zedO4&O^2hLt9x$zuV=u|3qIPZ;~6pM?x58(Kl+`2hiG5V>{~bS?^xT#PrLKKDB7`K z`mx{j?-cEv%Mt$uiGSy4-`v`{pWfxaINI^A`0=l|?-K1#G5wrJbp5+l`LYlB-o9J3 zled!3of$5F_u4Lg+MWL;RloSr@BDj2JNU&9e&>H_v|kmu$oP6_oGrSh{{QOu|GM~p z>iIxf2SKYdquf)_qCtjejtd(6`|_H<;OCu%@_X;lPkVWfQN9lVt@8U7(cbBpe3m!e z4(=&v(YPIF2hHjd3n%~PZQM+;`z#I2jj{?p@(+ru#^ zxxvY}8I9Y)xxp8OoW?&f{BTs1R|~qMD&L;*KjZAt#t+>wm9Csmn!5M@ z*r-=L;hPs_*-QDjC_gl0&gEikM`|C z{_Cpz?L+>#rvJQO`$*US^s3+6UH`MA{W&53{3?H|kk9*U?ed{LC&7-h~&QhrmE&xrDQwftt|N8ekF zpYp{~eoN3_9Q2gmYW$Sn7G=q&{PrlnE$H7~=`V@$sZqY9mfsQO)1u5fGw3gkGX4C* zu3Y*t=K+NOvf54^`03}+3jgKNE`2_Zy))_=pNigzI7eH?rz@iVo$;rT$c z%ioUYgHaEj;~<)n8-voHt~>`ti=5@g=NBuZjPK{}UmPcIv=S zJG8?8$*ON^j-Eb$a^_IuioZMYe#N;%*4>|~dRX^fYj%7(^w3TncF+#3?D&ju*Z0)k zr+-uR>wTf?{av(i4&bv@?n^`Nb*A@oA(wXQ&`UeC();P5<>FpLXidPdl{Ie?!&p?;spI=M>TJ?XI75id%;KFID+lhx{*_{u@I+ z?bM;4c4(#lrfC06wBHbQ2LGPx)I>{$|jBtI~fv%Abhxw`=*gM<#e8{`Kwo?aw#xrPz|2xqxecu1?hiHPYZGH>wZJyWsHk#)Ezv$$Y=K#Nq|K*2YgA zP3ZY!)x&q<{$zIiIrPv@9d^(Tt?c-V?3na*W1f*6iN@`?D`@rzJ%6owb`3p$Gduns zdT6H(J7|YicKjpSmqhztqK^FjXO#aDWzL3D{#TU$9%asYQvP?8?~U@GYxzIMKOXJ> zHGaxEAISR#&b0kEc=MS+wegNbvf}9pl{yvhL|CjB#ffKM4i{}un^(@uW8SMm2z(9$ki_?*_?J$1f# z!qhtzVb}W*#xQ6&FSU9nb7I6#$YNY8cqS%k@hvzf%&*A6PB3=ooA}#vEiGtE(5d)4?#Z)X zGw2Zy@%xX(@81?b&I}a{U+U&5+7xGa6lds&fn;|5pgTKzd&H!~6dK~uiffLk&MJ|Y zl8HaIsXpi2n0zi;|rDPY|%lqSzGg)D~&gX5@lf%rd-MT)`D0kz1eV;pdwrQOU7SCE|!PMG5 z=(@4i=*a(Bl@4Es_feC5uDq+J9$KE)(ifEnocGBXplk7y3oU-nqi(&B<_E{7^F^|` zMei7Oo=Nmzl#ERhM$z(2+%a-a#xaVn#Sg|7e+y$dw`b3JYFyBV9N8?4PVX2e&+%9s zC1aO_QM4~e7&)`z7)96O$F>%K#`u!F=c@S7mGL>PW7C-&`GWX~fA@qjBHhc29pT&n3qV z&m@ikJ05S{C}gvHHc>6giDO{N34P zdwe>&@ZBVBl?}bi&OEZ6{SI`ub>qivBYh0nvYVVN@-B#b7s{Sq`)uftm-9sYIZsxL zoXYl~r^S!l7Jtq&WJ1gP+@rd^)YNkT+JpnVw^pof!>-le;3P-hkz{o3As;`l7JHEH zjAo1g&5e@d`Of-YG23m7 zoDch>kLbLqY!c5zH@;urJ$IaXuQ7ccEm>eDE~O8!KP3h?OumQl-_Q77qmRG%v&@UT z5ufV+U87HEti-pi@wHpaPp%ysHcMW_aJ9zS{>i<7o#h>|xraa7OpM7H&%5H6GJk_h zarNBGG|0*QL%g|v>>e_U9iuv0{K#$b=l+FEXpf1$^Rm=8XcLA!p12*WM}CrXTH|mI znz5wNlsKFXcYy?XSE@_W3geug~k&izb!azCS9SkT|Sy@2x1Ysxgz`SK^fR}4QeN1+yV+bY*Rdh>Q|I5k`cHCXv*!$L#Q2EF z&7&vtspLLwisv2{&yy0}OY0h4vdAN7WGB9PY4y#Kq377lUu__7UmAKeR~|npqu7HC z*(18+(|q*cD1X0`U+$4w6#wfv(4N6xuornelbqA>^BeWD_UG9d{@{C6zV?Tg{BeHj zpvCSz>sn*aN&ETT$<(uJe8Bp1<)lw*p_Ll?z$$$Y3chz&Tq_3cM-A7*qTh)QJ(M-x zV^7z2B8MK!i@fby2f?FQ^y!%B`eyO`2Em)gd8x67C-5?y$?(=;W;ATxAFMH4_@crYYf}AUHEdtCOTmoujA7S zq2s;PHoo<8wb`~;$j-T?{mpX8Hr9p9Cfnc#ThUegO`YPim(BTm4dmzEV>9C^_{+X+ zuiEdWYYKCT=iXrhxN=OXSH5AJo*`pf-`))#$3vfk-p5tNhCCql^l9>doX{AsT=YTr zlXBnz$8=Y|H`72f_wz#zvjuv!C^|{Zc=Z@4&If+?nwddkUWY z>KGth!mN0%QRku@Q|gs(L$(QfXPeDA9Z&Q%u=p4tELzWX=hy1*=Jp6%yM7QjHRs9R z!dLcdoa64!w^hD1Z2id^1iPDje!irx8(%tB{Hgwx*I<)-Exq@uzt7v-Y}L9a>y%IO z-bB95dy@mgcKJuVU}^EUcs&>4mk;wk06mH=>&6nF(fu|w%FUP8dHsNaygabx*`(|_ zG4J-QiT#|M?>i@T2JZnqygJ|Kd1(Vx$uIG> z@_wRXV7@&t@<-2%*GOwt*+)OiG4j2V^rO>bEI)Vsw4Mv?_-a3$ATP~c9~%m98B;tb zU9a@9PoJ=y9Ix?3ujhvArcY=-l|Nd(V(paUsx?@SD{{b4^q07bwk4y*Ppk{}!mqI} z=f#@L4G}+b0=u23YYREF?_0-*HM?gN)Av=-YP?yKcYyG8G7GKbb~!M)U$%Z)W4Wf~ zp8Ozx78xa$eon6ItH$r~zz^aduls;5k0#F!*t0d0p?u0VxD0aH?|)fZJA{Myt z&vDhdF2@!>gQ?gt6>(2zc~3#T zupAP7TYK0;A}>omjLrw_r+!v_#eV7s=BvX)mfJ+k@iTkyl6zCn3(?7b+@BS|KN6R~ zL!J7;;dM?syl312|Kz*Rq>~&$Hu23mu|;MK4?rpR_-s`R2y<0C_i!@Aj4w`Uh(QXVKj zavmHJHhS)n2gDwXqr4eAqW899hQ%VUvv3m~dpZj~ETf zAF)aDt8Ma=atE2<$hkwkuq+?Xjx;7LU!RE;`*`P7-gz@eFfVA1V7`#AjtW_#BaWH} z^8BEABhL@;dt8t~o%+#Hbxb%a<*Mt{Jdo!H%^P`sK>kSn1wQ5k@R2vn6~Z?+<^tD6 zSz`h=X-t^g^Bw{EnXrskKX=$|OpvY|SL(4p$Mu++55mX(sn|9Be#T>}-^n+8tQ?q| z_KLEt+b8f|E}dCs{n7a&bRA}EwZd1|YL(B|SCjgK?~oq8+3@Ax#?)s>=4qvwY9H z#fdJ5%DV5^;8BhqR>voD;aHou+(zh?qsP|%CcZotkOzL|*Y{YRUDc=Zg?w7?rGe(Y9nj zn`O)k8O4UekDt($^8`BO0qZ^d=zO#*?sH?EtLH`Y(pc-Z!h=nW8}n=)WZY=2Cr9^+ z<@tj5!+GXs`9|?Bwob*{bH>M#Nt+_a=h;|L_{$jNIqUj~b2o-ZEaeaBFSx7zlq)0p z$MAFEFZs%vdUP+QwPB7iYn&Y4u^8Xo=g?$6$!qZv^MbwP2lIW-4Rk2>>_5vIW;8#b zQLK-&Ibv*JA9Q^6#aQfD)PJ-Nkzb2##jk!JMK=!A@qJQv#B{9ZJk`|x-JTg${z*Fm z1OCWsu5LbSyqoCLTjEi2X``OsNA&3|c+1$VwO5WO_1Kx?d3>!e`lsRvZA(ULyg&xA zE_M_dr-^Q7Ob$V{N?&EEo zlRu+>h z_(6-F7k4&3DDD#c{6@Abxmnb4#~61| z@;`Stat9^+Y&l(9|iYeboSyvl1< zS=7%?slvfY_f^B@sTCtbJHujRpe`;+n z_Lg>NX@`HqXy>eke6vxM8J~r3<0x+w<&CR-PqQ-on^b<$Z(8{!Z?h=-U67kw8T+<~ z@P4e$^YkSdO+M$(yxx-TO(Z`*Yl8^l_i1PDIKEIVj zmg4uq+AjIDyL|4bTr>C|QSIeU%DGW~c$AU9eU!H|`P`x9@^`51l25zK-_hhF??omb zJUd1CMJAs+ZCw7&wO#UQclj@lcJfbS#x7AN|J3hyjq)y0-nHV}&C1xbd*v7XODezQ z?Gfdd1pgk@A1}2s_U{?x-J%_vcoxH*KyLrbqMhG<%Kkl*{V%WlYKPzP?N#|DAAXm= zceIoLvX?s_$zS2wC(7KVw@<~tua&{i-Hq^ze*elZc?U#!|7bs;;y=*J;Gc-{zR@oG z4ovpFGTQfxcHx^y_ztT4YKPzPA6)q*AAZMwNVFdp^9}PO_b#4T|Gy^wKRy1}IS^=c zujaL>4IZ`eJ!ZbeUG7>OU$R%|dsSdpe|mN3qn$e9O*^#euSY~XdbJjGy*F3AYID8c zh&ILv-kBknaf09QNbk`hm-h0zp3)Aj^d94S?fH}I|DNkN8n=UQIX^!199!*pLfA3S z>^Ls;&`uq8(hjZcI6m4BjrLb}?emt*kMhw`KCYHeh%)c}PN?M*txP_h6y?LBUGFDP zHh$V)6Xlbm{WZZ)`IIQXCdwyQd8bBM`e{Ec%Ev_e@s)l-luwKDf?7V^%Hu(QhS5_# zGs>K)Kdj0>E6Qg^`K($#JIZH8`OGTsoG5pB7taBYTW{*lwe{leFV&xD_1tmD+JZa( z@F(xDbVnij&kcFBQ>S)l3>h*SyH+LL9E#z|tA@Vm5{pVNt=zl}V zr=2>rLo5AnG`#+-!)e)8zxX|plDD==y9d^(Tt?YP{+2MOB zx8o&dhts$nFAEyhLvOBnSP#9$?6^4e&`uq8&h7%gVIBJIb=3@_V8z{gmGu<@W?XXO=0y&&uObet(pe=L_sNI39=hc^r(! zvG?+3onA+2J&9$B%-Bb<8KL9@ZhBGCQsfJ+xDY9kfF$J3bxl zABy&Cy7qZXJ`?3@qg>u+mTyCUCd!|!?bk)S%H-MSqWs}#|3q#7e3U;O<#LXG-jXjw z`SVf!LbOBwMJtmp*GF0UX}`hvDSs)-Hw6EeD*u*S6vd1(0c>+wH+#jbCJT-vF_@3ccJ zzu)3|ZO(W7o4S6ZaXa`<^LC-Y2Ln}LOon}XQ*5!6Qf0`YI z#_iZHX!Z_0w^cna4?VY=9p4E(v{Q#2v_mU9?l3z%*WHenm>o{zcDyWT)(<`3t$MiQ zac@$Xl2Luqx~Dv{++IU-jW|g`Fm0Rb}j!f%0Gzm4{P~HQT}0+e-LHz z>BmvNCCYcy_Mb%g`%%8NmVX-MpG5hmmHsX(lQ(x8Kk^nvS@uv~6y=4%zo_#6EXsVB zaAB3dILfjY`kzNx`YHb+%0CbKUsU>ETAB7=MVXxEc{uN9-T&{a{#Tp(oqHD9@7>eM z9bd9q`1RNEKYkq#xxWdyv{Q%QX@^#RzqjgrWzTx)+N#^zT|aj$J~8Aksq&u^@_%dk ze;4v;rw;wJLo5BiH{2z+ruT!J4ZqX49o)0{)X?*Xs%OK{^GCDePoal)>ac@$Xl2Kr z&5qe!pPz2W_skBbaXWq#G(3O!OVz{kg}<5|e+xadQ->Y2Ln}M}9__!0_CIy)<-5>- zi}LSk`Jd7Lk0}4Mmj7jC^61}DzBk(cT-*N><-bSy_qF`rDE}wQ|BW*A`A$W(kvp@} zH<2Y5K5yf_glx=hdJnPG_bJx*63YzUTZsPhUSiAoUP3-|{j_15@aHz!w&hs7BUy^O z{gY2GdA%blCX*PpoES3j7_vH z8Q7L(aJQjjn|e37U-#V$#|Lf3m+2iN^ckaMyfR@F?ZF8n^%lZv8UM1 zy@tfA&-M}7wZC-u2K=9Sgu(C3d+@+nhZj`;^F3OKCZp6;`4EP_T(A9vL^CA4}I?Q zlEHIs@AIPNnYH(M>cL!WEV(7xmJD(z%h)z#$S2G-{<}2C2VEZ1oYt{Ho3V+1=Y&nP zFHYE~&)7uUl7Vem26v$Gp+k>`@pRnlFj&GljJw(wn#ps4t(P_9#fZjWlxJAtd7ag`*=Pe7rSIDn4H!z z?GUu01Cx07O_-qLy^ZHMbr}3-Nz_^NKH7<9H8-}c%QJi@Rn_c>Gy%f^{}=P5Roac-v?k7fBSNZnIlr^ln%RpPOe z#RFTqbB}ZS@2rGgI38lZgQD-dO^%&A5@n0{r~Fy&K%pM259s!lQ}@Q_`xVI@@s8Jf z?sg8|%txK_3_Im-?Ci^Bc!aIb7mjOZ!zEtXrr%po-@-M-D_s1B!ErH`OwFCs*Vp>Z zgT|B=y^lZ8cX?rVO-sgu(ikM#mC`swJ^0)&qHW0_CRqk|`c2fa8Jqn#pgy)v-u-9u zh0{7VXfrnPKR00$?eh{g>N7Ucwq$@U%h)yiBW#S5l$DpO(SKs>D0erG{^m}!%EuSm zysWz+^V$vH9ojS3q8BWl8&2!K+bw8CCp+L>C;1J!$0VOo2R_dS>N2nFY4L+uJ_FMe zdoUq4V{%%@w0qDxCh_i;FhR!|5uaHSl8)^J~r<~QjUhGJKlYq_6B zeV_Y9d98|3K#dfWL(sN>%S8%3_On^ zF8}JrlF_>ip;KNx%=!j*271gL>&wT`8}|m;GX&|A-Nm0JuXOheeWQCW9)Ed8q4{A% zcJ)2q2|K$!!=F{3%j-@)R!<6dg$cep*!;2X5HV%y?h#bWLL{(?sbvP+^7A{h8?>51>bQ`%k@1pveob5;7$$C zg%aDco?mY5k_+5(rTmvJ*;=sGXEF8eoo?M!@4g_9x^W|N3Y^#=-lA)i*XPa2oR|~$ z^{u^S@J;{S=#YGD!xrTjciWNMk}Er)Loam9`S~snUk9px;D>^Rv03}f8=Cwbra1Rc ze7Zb|zxZ8!r1-&f>z!$RR?(*uyJyAy(~~v_pX=)4j84;4cxrrOZ{}l+?7&BUXJV^g zXIkY}cfVroyWBVEx#ha|87r~qVp8V}=~P^bjxx@0-;Mf##ysf$Rp0$7#?aAs&yGI8 zw+7u#+GOWGHV1NlVxOJ+Ry+5x{wiBqcJ6C-<}t=?flgzL_v=g}d%OFUs$aP`sn6d1 zs=fKHLwwh=cR#Z?k9BSfbh6jSm`o#km-@cIxg`&}I|^$aNSEv#@AACl0k|}tK!?65 zy0V|weTF`#(nn@b{${c~`}J{(Jd|AVOK!nf$0FwFaOL|2Az_ zzpnbYe~tLlPnFYC^2)lkg|{0Ustoek@uFKYgctcOo3)n1X8hl>d4ZiZ^6^vsUc6-t z934NW;xzp^Lmz+fbNNjpHVYg5%yUGx9}x8|yQjSmtmF0pj2AJM`kiG(XBoG#*)jV# zth>>;J28*>_!wL0pC`qbbypg*Xd^a!JN2BjW}*#j=S16&6W@W+CV8?GUDTtid~5Q8 zd;i_wQ$O$Codsszo8eE{J|ZuCt+fHNNAsxkN9uE)bhZres$Wb5ug3{K>NFSV?#j=F z5At2!&i*F>!nRjy&hKPBGyb@#WRmZWlDd0S!6zjvl&J zOvIo4Nj+HHr?O}H6j#YuA;tCJkm0scZsBnq(DdQSbjZrKh`(h^#v^-jj!8!L$sq|3 zW#P$v#&JU@Ox|ZQO$(2BGal-5pAl{L3H8X%GPq~VeM(t)y0N*gjSd_btKbnf?iJKI zhJjC5^t?^j* zz8y4%f6Ckfujbhzx9%B|ZQYzz_Z*Wt=d|z9$-Z&k!>Vq{knV}PU%{@!YMj9|6u-h# z##wk2zm^|Fi*23X^Le!zyUs^-{Un)vvGY0IV>cwD__)Ll`HCI)-6`j||I+7F*^Y0x zhs|Th@B3T#P70^nI1&fx4*tU%_XCK3+V2x;4jevK>=1@l91jm2>WAF%OFX#)*0B|T zlo&$qF_b?hl0U>F8w-Nr9HI|ay7t7h&SJylk;`JCJ*JCJ*t^UUy6vS?#`cCUN z`L4*d{-?FQd@fxPvvRNB=>2&ue|XGaRrShd>7B5?_o~n_Q_Ko|i5c{Y89AKsix%7b zY_<27&M!4ilGhujd}g`EYe+`%Yw2^ySG*>y&vCDe=cVi>Ub??f@uJW9UC)Kq;$}9E z_+Pq%e|dXmRqQML?jz@2zCLf0{W*3&i?z%zyY+fmSL@D{ycVNg@!}3W*5{`;)>+WW zPnoXR`=xvNHu_@Ic|_pL`lwSrasME3JvDeF1OGxJo1i(hVUNB$pVtIiR-fiI0Wz__ z#HQq`zBim@yr4(Mkx}n#-DPIputNAzCd z=8k6c4kvUYYq`m`a^LAuQNL_j-%SsLQ85UUH)rjj{)=H5B zJ6HPmReOsqWzUW+onI0b?xxFkXHo~2mMyaz{P$13(0zCA3*}y3Un}?W`WhM7>ozFI za_%W7bN(I^nB4}-%01m*M(!Qcb59=h%DrRixGX-+O;jr!%1zp2ad5`WG=XmjpS2TsRAov`G7qo$;!Di54#hVt}fX^ zUFMa{7Ju$X@C%FIe|lu}DaLNaviQG@b7ON0uC8w}Mg>OMrg^o{m*o@F ztaYy$b2{gKe2uv@{6%;1FL#(t=Cz%Nniu%`o@2w~xvlr;%pEPBmYv<)TGtNT|EA|u zl0B23GQXaS2#@$nE|s+hZA%l&!c$_Yd)kPlbPyNtXC0F`^WLVeA1C!kJdd|Ef6-Ug zAKf{w`^fL{Jf40LwlVJKI~P4)M=(}A@Nl27;(1Jpr+9>O+TNtbll#jQPwa7D6x9d4)G^sn{>36&p zKUq9`p11e$7u}_Q&JTQwC-~kmHtWF(!{dxlvtiHHWf?hAeL^Ubb#~Fo>)%mj#!@1(>MJLnUAx5yd@?j zjwggoieqLSUwu(djQs;u0d%&u>M?Bzj8$AXmSgvD>`={7h`lS0O^UJ@& zl4H0y)*HX-_7-Ii1Re3rdy+@gHK*FosOyx1qxkC)HZPqJcv-&|x~X$C+H>i-IXvK+ zrq9OxM@*itx!~SY(mv>vgXf8J-L9slgCQm=y26_2y$An@93jVIm$Vt8$0|{{uT}VExt1As^nH zbJXWJiT3^t8OY8uP74|CFUrE={U_51i}#;QgPfc%$cH!Q3-w@W$;f*+$;kV-1tDYH z-kVYumPgd{=!`Xt!PuI#wV@APV3=euJYf*`SZvHHdkQ>a&zvCu34r(dmfTe z>@I5#X^!yIZe* z*L8@`i|Ebx-7pQOBLy+?jq#{O@DT+?u=f%yF7b+ zY+P{H+0p*nS+nk;%zdrgrOyA{XU<*f{Lg*n+@;R{+-J^R>a4w&?e<8qevkF`a`8X+ z2N8?q<9;97sq5DF(GIQd7g{0OPpSI2bN%%CKX<908~-n0JPI43(H*edt?q5`sExbU zSp%2?~&{i2{@9r%!{hqd2B&5qSV5AD=p2kp?x zj@6_60nuLWnV+|WyWqJ;ezlH%-jat`J99i97Bt*Ntv;?YvG3v<=kXsLG^@po=?RSFZGPL$-Va|Cs4gZp;n(v4(uNMe!R8+PM`!x>kt%TPDVm6(Xh@Yh+h< zH~#u>@A6Z+P7gZz81t{t|BsC?@4mzE zxh?|NK|{Pd@(6#*baB{!doVw;8}u`d=BR=tCOE=%2Kg zepT9`Rez?xN}uN(wrQ-~-*h_-HjCz!K|?>I-!X1HFvbn~s_dZO(O&v*X@^#J&<{I1 z>Y01jf3)=1HrIPxw5<|yOTQRjvTEq1KS}Q+LN4vpVHfStO7A*Vuf{9aOMk&8wYgsU z597!qtK2yumv1*n@46wE_VPW4@g=lFE4`17_J>D1_o0(7kBRc5qpY#!u~A+(%4^m3 z@hCH9KBAV_Gk)^xamG)X?@v4~=pP^Sl==RI_$faz%92m{Nl|`c&_Ait^Zg0#BYko$ zcexs4&J&`p%nkFFbU7P!JQLt9cl^t9fXBxF@&n(kpq)CkLn}Y5Z+g2k#~s~7_dN^d z%c6fGzE`qV=O?~n!JThU?dZyPE1nwV4Wc{|I5vv*Rvv8_G*78CjGaR{zfsVxU*$Wk z`lDpwH?=EAls}SzP0-+j^*WiwN8|Coe6(@(5q0trwDJ+(+E6UrM|^VwA3dStn^?m4 z0?@Z<)Nd01Z`#$*Te4Y{H;wWpQKo(KC=0*FlFg!h*l27CkEdXKtIl(aMXqiT|0~p7x9t7v21ftrs!39k$Vf7M&dR%x(If5o=(5&uIPl zU*A01DE`;CkT#9~^=%{8ulnW@YgT>d=sEGf&%s?RbuKQ}0LyG17-L_}8eIQhvf)Em zpWJmx;NEAeS@&%8?PX_q8*}yZL$22`XEPsq9dkGHqSrBp?~>~Hz7X@F)A9YHmqi_8 zaT&KJx-}}}$-}zbn^?kHlX96OCzi0*gucwF6C-QJ@%a{tc`CeWT1hYm&cTEldCY zQD!Z)Nu@s^$_GSQ?FZJf_$Q*w`c3VxjPkh2KPbwtjPgO%e!kfQz4#BQ^x{7>%7;Yz zp;iB3QC=^~YCk;6k1_sNMfvb3zpBcAb(EhR<&A3jh$tUn{72TZ^dA*v?qYvhr9V2# zM@L!h$JDa)9~))tQTx0oV~^U8i}JiEA6M-^KFYF(_{@*;e4{_1mL>1RD9aw`Pm1zM zrtjohmcG|SnKi!nPl+$1yMe|`s0jBFZpLy zddWX4%4Y`sSyleoQC9wtf9FK`9MkvOT9&-mMH%}g@7yS3zuM1>^0`qyuiEqaC@Y_l ze}0tDH~Kf!vgExn%KJt8k(K{~D8DhvCsunejI#WLyo;hN{P_P(QQkl3kE--MzK9N0eU^^slS* zmqz)RC?8nmT^42KKlGPJS^Woj?=*VauZXhzLHWuk3m^3Fin8pZ{O%~re(2v5W#Om% z-YCnT(7!LrvX}Dvqr6OA$FX)>C*~}^@#1xljyk^Sa$4Z}K!u<2;;VMz z>+PSb^3{%fZ~uI>gHQUw=k|S}>Q_7Zz5R>P4t}+R-`lT`cH*yg;_vM@L_7IM9r;WC zL96`!Qna%UQ2WNI{maq*UTc3}YQHhsueA1erS_Ym{rG5?eXovox9=;_&bm+StEcvx ztA4ek-}%29?bxq&?DzJsRsF(;erSdN>s7zn(eLfwi1x!wK6kmh{9B?O{L&A8Z~tbr zGjFT?F{%Aq(ayR^`j1HZza8zYo7Mi1)P8Gimweh?|83FEx<~Efsr~kMveH-EXQP@X2b@U(Fp{1R9=Er6~cIn%WExV3O zc4b<(>%^dCUieAX`|i;DQ?u)?&`UdY*hM?Evg_`aUG}c6W#8E?`x-oM=efc2p|E3N zwc`_E2jAzB|9%#B&`uq8(hjZcTpaD+i}oLN?d6+2cSZSUwfu`{|9O;uQOm!yGXDQn zl)oSCKaO_F_e5Fzlz$!Nd!qft`43V4anOIi%Ku}O{}AOr*7BdC{KqKs-5d1%Im(Jfm)G^#qv|}b`Sy+K zTeKb*zJbHM^OsKV_!8!wzsCQH%ilsT?bHz$+M!ik{@$`n&&ce#nA`WumVFH#xAQl_ z^OmsVAJvWv!;XKNo&O3uXr~T4X@^#J{yW@pV}0`89rvr~6W`4jamMeWvbaq5U&qzu%Ke9nTuc9iA<7UW7XMp#w8K zk_B$jaBc?7@J-8$K8$8-cXp`W3%oS^j&;j8iz2MD2YJsmyQznc?_xS;>M~~PGB18W zW{cmkOHX&UCeBa!caFAh#E#5-KJeURzmEetE2X+_jI84ad|l2p#*fVB;|6?P-0l8! z$zq?SF^~QxTJ~H%eozlykF#i7GO#ntcwWempM|emzs3Ap#`$svQf-bM-XZKQe)j?V z*$0xjUGjlwpPzg{efEK9TQaaW%i#Cj@&W#)3>|%oZx!k6?9e@G@F<^k$5-Dyy81mi z@>{fSi@piOH<`LV9`*_IR1VXxt{<8Ey4-85IXr&+#$zacvm5*#zwWn6;U}N}B$H<; zp2MQ$xr*m7^*Mf`ZOOpiEQ8;#$Y;t^a`@YJ7G3p@AHF{PEndgo{bnX%m%Ps>?4tc_ z!cKk0F4~q1Y|S#ZHSFXrW$4H)zS*SQePNv=TIZ?ZQSR~$A9(qGPaiEd&m>>*z^3jS zK_Rmxdm3Gp?cdD87GJxJ+nkDQ*$$89Zg~3UZhfl<4DiTD@c7wf*Rwr-tv=;%>w87Q ziht&$9Dsk76#q_U&}JXNze6yNRx6!r!MnKW{cmk<9qm(yZ${U?s4fG z+jbr+xy$#Mw8udXvX#5V#zMgYkYkptPbJLIeKKLDE@P%H^Garm-!bEJ_?5eS3r4>y=UYO3xx4EacJN!= zsoX_QU+(T&V?`bg=};ab8y@8@Jj!?M>dSX{gk>jNALZ{Nm3~#8L+yrbVb{)eZRFov znnqXqQb${#2|(ZHCu9o)Ji-7^ABN7J(395~l9lID>cO0CMQ=+6`IBYr9x~kblr`22 zVa+^CgVpVnp1kIuzOz5&KlK@_Xj?MCkk>AJOUUikw}r@op`6J)jul?dn@p>m{9nF- zq;-wHzofaL=osA>>b$PTG9Rn=s4>;pBO1o)%;)13d|(wHeN(cYlEy62@_y3CYU*>` zMB9=<+_H?9h79?2n(g+xR<${Hc#$a#qM5|r;CCOupM4;iZ%aN9?WM^F)Mp=vwj~35 zvy45>2gHFgbmSl3rqW(Vcdq3%s(6&UFRf!9_Yh>-?4zwjK^E#T|(af{!5%y*2$ zD?5?LdwpLEK*#%i&oAom!?^7osmr{wvBi&1TKRSJ3~K@O^x1DoLm0Rzd zA-CY`!{6d{?C@snlK1t5U9?|m*qyP9wj~2wvkbl)B<$n~W$4H;zPF??i*GLVJ)hCH zhv3n7llXp79^om1kZRE5EjuqSeTa22M^BNtD2b%rZfbV&ydtlEy zUFaum@1Y;D$7~;pv-3<;416O?bGP!gg<--l=vy9OD0i_>zkeHgVd$eDw>2B|@;`Bv zkJjk!Nt!Od`<71lmieLM3tRT-$sd=^HxSDA3U7<^H0AxczNeGlFH48`J=CE3SF**uS;K@9+!j1O5fmHU)sNF-k1Lh_VR4=;A*e%DDDSa-*8_+ue<_Bi{A4J zdf7j;PjVfHR1EZQ^^Lr)bqt3X27SwbzHvwo2Iz&Mk6svj?ZIB%@61)3ubYt#-oABn zi{IyAz6~Q@@=fw?O>;1Gx25@)I_65*4nK97S2A1t_(ic0zR|sU|1)WH4PkG+mvQWe zh3_1@*mK34i4-!M|{A_v*( ze}#Vfo~-QC`~7=($N{5#l;hLlcmKlQ*a>a@5w~Vd3fKGQIAhXFju)P8Q7a; zyejBhId<&~>s$Ex@V9s!JG>dY02d?zlYoU z_EmLk)qLgt_V1Xys?KkGrzF$n{3v_&{`}H+Px|t!#qT~oBK#v>VZ&dX@Auq-j&uH= zSJdGz$4Oo0m5nWa@4t@y;u-P^J=iJRXX16tM+UF>z${spCCt#hJz=IUW2P?iN@k1S zF{2-Tu#ivOC$GK0&^Hr~8pDpDw|7d&>H150js)FN(T3eK>F_*<2YKSr9-{9)ZI8kC zW{4lM`{LK)_4x6<5|5u`eIvyWx|>t{sLS!AF7rxei{Intm|rpjX7u!7Zt*&1zA@sM zC5zt~c|V1Y-y3;9r7mNpF7rxei{CMmPw*>e=h{4b%)mT*>=<@zyU@Q4ft!K!lRtUF6MTPx0y#+4zuxG-;olJk8|@XmLsG8b?a&KNnSI6d7fe64tuS^ z=k=_2p%)J382TXgIEE2>f?gQ9`|^VxJuTbE=9W0{JsGWc(AVW=9XpDD%6>!N2*C!{ zRPrfnD!0dd3Xj{bXFz$5%sj#{W;r#Mo{2baeQ#vwn<$Ruc#FeOtlchngr()%Oe+k> z+gN`5fUo9{m3S=8cRGT#Y?4PPtQu+!J??sIsAZO9*vZRqtXMKIz zaX~L!d=pE3i20ZCLw!5*DF3?qtZSU7zT@!5m>YPGGxhs}lg3K^b>Eq&=K`gBDrV(e zHTidv#b{`cHKM~})LQ>$T4DJA@$CkmvuAS$*t(bBeZTel*VrdlyqbTPhTrFI_=%(V z@u6gXAkE*R{a~8IsmCYd7B|thWRPcB#%n@`{G2hgo^kjy5_pj*3`@iBK7c>_Kr(ku zJ`n9olMkrRJ`in72KHtdd|N?2AP)N00&|<+-JI`8cfZ4xRcQtz*A#hIKJ| z`f#^+9rJ0y>zF0$;|Vi#S0&8UWz5uNUde3nJ7#c9zU4Kb?Irl4LSL^wa=hT9bGuUruICBbrXNNt1l1%Q{@VpZ3Imyq|!Ko>k}BM|JNa z%NjP*Drbk}D<0T%4t|b)(2_lkuJ#@Ou2bK)dL&!6pJDR=_V>*L*dq+*7|%K3Bj49K z?$?f${&!CFKjgaZ-2Z5MEtrL+ewT{(ZVP&zLqIPakFq^EV~68#f59UhuQeR6O*owA zbrr{J4Tp3KN5Ng5NxW_;aJZkK7Y^c~eI@be^DR8W@jAotx&a*P&MonHo#Bw~7LIkT zUkt53-B<7k3u_EvAs-z}<`I^4EspCZ{LXV;jmf(9dok&5VL8uYLVoBOSNXQg^!MJ- z3kPu!{W+G49>ep@r{a|z+Oty+&b;>?;?|2cmkPam*$=|AV2U!;2q z+tjm&2iW<@)?Uo*fmRrX*5;W<7#bV3H4*E1 z-KBlex({AFyMCwXjWu4awUF~%oOr-09>#vjd2m_>P!BElg!!J3da#e%GY8SOWRO!? z#swim{`56aw|8m$j==XW@FG(fmWJQgLhxrFNaiKU2co?^`GETD1JSl*U~iUjq4|I~ zP*(qYWAqC>*SnyOnXNTBJj&e*>bP=Y&}Z80qw>sPLGN!8kqf>)AGi43$B&7*NW8*^ zJnnz&Ao`y00e8 z)Md=nWnRf_@jGUG4nJ6!YaU~B`9e@?wQdY#?!U z%VU=0D~E^VyG?J!&pon5=ehT@8RFK-3wv96+v4@O!JFeId3U6^iS}D5Zq(+epnzL_j%(IfOoE?&{c)&AGKZ=}f$(}}6`_6^fQQzY+ruXe7kS*IEYx4m1 z_ss+F2*bGXjHi9!xUB)-F@|3Qi|q@gJFjn{dxyng2#e!~$FXRS3zoh;EX(JBtu^4>9Q2|Hpv(T&ORzc4Fz z3;pQxvW;el+j}djpW;S+j+U=y`M_Ao+4shHtDF_)p`6`ihPZv8Vr=DXi`U}@Z;qSf@x2Xy z9w*vYr?^p{<0jgc4C0Yxd@y9lSDv%qnE^X|eL36Wb?oqF?2>n9!Y?1I_~8*2c(mVur*FRjkFZ>Adae%q&f`A&SjBR6%zxVF z%H9^1k0mU9c8%yTEW|}T#HH6R!}2l1^0CC@KKppZ@-f>xVQ<$r)4LGj_wi^`|G+M- zL$J%&&LcXiJo2*3m-zdEpl^-olArG*q#m1ANn-%@#IL2VB?H^Dj3>oB;=ZRWjO39p zl1Gj)^C zKifxrD~{A>jFOT4BpKOHpG+7j3**q(<{04-#-VT|ynZA(U%t0}LaZ2ivHTvN|w z_UnCj4=*xX>#jb2Uw^=lZ^Tb5B$MwS`hG#Qt2OM;IV;+h4D8J^J{^8k9NY)z&an1^ zuMdBV*RjK!u}j`t6L!(QDPgBRV;5~p2DWAypE2zCpE7ieolmysGM`R!i|05z%JEOv zarZMe?q*u`(-y7bfGwXL!mpD+~Cb|lf0u- z+(dgoiW~JgZlZ0;ARbx9Q=;$4S8o4@X21?#U(U989Xq@kyX0Myu#5J?2|M)}yJ%Z7 zur;xNSE> z+&X#Ti&oCIcs*|L=D11T*(q+KJtM`9`W!dWwqy{GEaM9yqlNt&Ghm0WFK1i4jvd~N zUGhGiu#5Kkgq`|~U9>G3*qUX`PQUx3tepM4bH_7{4ikoOZlHx{vj+U^i!<(^7-m?;R(QcZsQ=hSmwj~2wvy3kpcJhO=a`t-5*&7CO79Qp7 z4K-)K)HBXPtDJ4oDh}AP!CY*KoVDlQ!kpIz9ethm$nVc!M}00s|LJ?ivO%5i;Q5mA zFi#Be2*U=G{XFJ^#6JtYF!|&O)NQ%b&(`nHwz*Lw32p;87gl(X$M&__K`6 zBP=%>{u>jIW4WnfxzYAi(%p*7O@@WI$S&gIc8%y*N-UX2SZ*>bHzh2N|0@;CO@;+~ zyS~|YF7uUyMf*dr^gXkHM{!|oL9SgNHtD&{h&@$)-p@-$e%?Smm|HUP{!lXV9`mV@ zhwewp8Ux59VI+_GFv25@U7rYypYOpa`5B{RWQ^2kOZV&l4W z%JyPUvHhE7JKq}Ya&peL3wP@|w+FrKUp45F`KR>FU1((YH_h&ECcE7)->PNWXaC~b3$4YCL{{1b(AzNEGR^r`TjA_h`oDo+4 z=3Q6coCA+yz;Btw!#Zq;M_5*}cWNsQyi>ci#$+XXrzU$_SZ=kL3}Gp8EcptLu(bM4 zrWJ-;EgrWH#N)P#;Z}=>>}+AU%`go4*6o5v7+QTg(+b0FhT*n^!Fg`47;dvZEuF$J z-i?!`Z`^Je4nRlb)&U{EZ(R?)?4K9(TBptnp1yp7M>uXb9JdeP*m!Q~8@C${>2BfJ z*yaVsZsj@suVt6--xq8cXD`=@-+XSqZP&lLGnaD~+{N6xv5o8GGdQHb_`UdXhz@_d z>{;_mK4Y_dxiRxi_?~gEWiPfc-gP!rKH1^&**_y+`nvn46F%Q#PudXU_&2+8yxiMf zu$6BZK%@8#`L^(k>Yk16#@#mA$6y8<^H0mij;E735U)O2_=#^)qvww5%gOmC@Ne9m zS0BYcq_^|q`jICQw{DDyzjs9Zv}Y;$md+n8>yFwF8LK2qzU^$cKHJUpq4)NIykR_( zPZ$f_zdA2|N7R#xeh%KTFNkli_nuF#eWmkhjicl#M~nTV?QrCf!`wCxfJ=(@~z9e zbFAb8el6Izb7wRkIvh10@}5XI$b0BC-}J5DGkura;hQ^c-o7*XOW&U2X>*IccUn$J zuX4iU_q3Q>w5ILus0m#>iz23qMWHXb481UL|4SG9@b!&7dl1RbdsfNGdsgbf?0yh! zO9r-Q8Q%{-yUmn^ao6yp)+WTj*IBL;9^qu~^ryPV%`}S7_boo(Pw{bEelS+z^ZkgA zo+-#a#i!^f{p$y2JL^NO_xL`N$H?u1N4B#r1S9=n%zh6xVw2^Hc&BVBzwe?Rta&W| z!2qx3fgc8M=A%wA;rD#XqpK~C924}y)cvM0@|3e|eLj%bB22GxnCqBKP!=p z{H$b?$X&OYvM{pmRo=0__x|fT;StWh*p2A0^|5#rJNcjbR_r#h=lrr&yc)ZI+=v}@ z!qpc$#{|7F^~EmJBR~6HaKgQ{m*Pi|@JD1n;qsv-(ZQ{D^Ldh()jjmZb3>EKC>^g5A(>bUcmQOwQi^fWB3STSsi$b4bzjej?tH!=&N9%{H*R|tRe9C?RS>#1t*HbV5 zE+Sv*xsyeq&)2-l8~W2`bBpbrpKD%7zVvzw53V@!x@V%+=XK9!fdSmElkYlUXO?k% zwZA0;yv2^vH;^l=n=yV?teeGn*oSrTSi!oPt=o}<>=xENYVPeAb~%mK=Zh=m90%&5 zr@s>GKR4nGjqG1+v09vB<(PjyR_tFKc4_}A8)Sd+bLnr2RbGcHR(T!%^NPoHDkeEr zieZiwGQeK!D6yhWSbuIgL{j$Pv6|0CAgoV7mhx9 zw@0{F?(*~YI72YLgfT&SS4wA4s0VXP=Yx_A`Deu><5z**ZIG^PgKWz-z>iN{hIC~c z7KFDFS)}-GDJHiW9t3OJrx7v1NX!z-+onN+*<#9 zEMya#PX+Ik%#zp01J5+OqFy=5-d}p|N&U{_`RlQwhr6hRMe?P$_`ZxWw5^n4PaS$! zPO<-W)aTeiOI?l~v^j3n<+#D0b4U7f?!ce(SNc~>7&_Wy{}z$|o_CbhKbddkU*;fu z*NP)N>Z8979?e^u_we|-=Gqz7c3arICOwK-iE(-tG4$<@y0#mV>3M)Y?De(Sq#bj%U3l*d>$;XdUDmy0#CO|;lG$3
Rl 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%0Arwc5P)}b%JyjR80fI$yIi^@b-LRA^ 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

Un%&t@RNIme@N&)ULO{G5&UHN^ZL5G-Td8x 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

>F1=@aYe9Q?eez~rm$y9v`QJim(Hi!74wBY9 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

HCOG(BoBcP8#zpXvtJVZOA~Fu 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 literal 0 HcmV?d00001 diff --git a/build/Makefile.alarm.cross b/build/Makefile.alarm.cross new file mode 100644 index 0000000..208bc76 --- /dev/null +++ b/build/Makefile.alarm.cross @@ -0,0 +1,76 @@ +include Makefile.def.cross +# target name, the target name must have the same name of c source file +TARGET_NAME=alarm + +# target +# for linux module driver: KO +# for application: EXE +# for dynamic library: DLL +TARGET_TYPE = EXE + +# target object +# for application: APP +# for device driver: DRV +TARGET_OBJ = APP + +TARGET_BOX = + +#debug mode or release mode +DEBUG = TRUE + +PLAT_R16 ?= TRUE +PLAT_LINUX ?= TRUE +PLAT_WIN32 ?= FALSE +PLAT_WIN64 ?= FALSE + +VPATH = ../Modules/Alarm/ + +# source code + +# set the source file, don't used .o because of ... +# MRS Board Source Files +PLAT_R16_SRCS = assistant.c + +PLAT_LINUX_SRCS := $(PLAT_R16_SRCS) +# gcc CFLAGS + +PLAT_R16_CFLAGS := -I./ -I../include +PLAT_LINUX_CFLAGS := $(PLAT_R16_CFLAGS) -I/usr/include/dbus-1.0/ -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include/ +PLAT_LINUX_CFLAGS += -I../linux32/inc/ -I../linux32/inc/cjson/ -I../linux32/inc/uthash/ + +#R16_LIBS := -lgobject-2.0 -lffi -lglib-2.0 -ldbus-1 -ldbus-glib-1 -luv +R16_LIBS := $(COMMON_R16_LIBS) +R16_LIBS += ./libuvdbus-r16.so + +LINUX_LIBS := $(COMMON_LINUX_LIBS) +LINUX_LIBS += ./libuvdbus-linux.so + + +ifeq ($(PLAT_R16), TRUE) +DEPEND_LIB += ./debug/libuvdbus-r16.so +USER_CLEAN_ITEMS += ./libuvdbus-r16.so +endif + +ifeq ($(PLAT_LINUX), TRUE) +DEPEND_LIB += ./debug/libuvdbus-linux.so +USER_CLEAN_ITEMS += ./libuvdbus-linux.so +endif + +# this line must be at below of thus, because of... +include /opt/common/Makefile.cross + +ifneq ($(MAKECMDGOALS), clean) +ifneq ($(MAKECMDGOALS), cleanall) +ifneq ($(notdir $(DEPEND_LIB)), $(wildcard $(DEPEND_LIB))) +$(shell $(CP) $(DEPEND_LIB) ./) +endif +endif +endif + +ifeq ($(MAKECMDGOALS), ) +$(shell find ./ -name $(TARGET)-*.exe -delete) +else +ifeq ($(MAKECMDGOALS), all) +$(shell find ./ -name "$(TARGET)-*.exe" -delete) +endif +endif diff --git a/build/Makefile.app.cross b/build/Makefile.app.cross new file mode 100644 index 0000000..0c5e42d --- /dev/null +++ b/build/Makefile.app.cross @@ -0,0 +1,75 @@ +include Makefile.def.cross +# target name, the target name must have the same name of c source file +TARGET_NAME=dbus + +# target +# for linux module driver: KO +# for application: EXE +# for dynamic library: DLL +TARGET_TYPE = EXE + +# target object +# for application: APP +# for device driver: DRV +TARGET_OBJ = APP + +TARGET_BOX = + +#debug mode or release mode +DEBUG = TRUE + +PLAT_R16 ?= TRUE +PLAT_LINUX ?= TRUE +PLAT_WIN32 ?= FALSE +PLAT_WIN64 ?= FALSE + +VPATH = ../Example + +# source code + +# set the source file, don't used .o because of ... +# MRS Board Source Files +PLAT_R16_SRCS = main.c + +PLAT_LINUX_SRCS := $(PLAT_R16_SRCS) +# gcc CFLAGS + +PLAT_R16_CFLAGS := -I./ -I../include +PLAT_LINUX_CFLAGS := $(PLAT_R16_CFLAGS) -I/usr/include/dbus-1.0/ -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include/ +PLAT_LINUX_CFLAGS += -I../linux32/inc/ -I../linux32/inc/cjson/ -I../linux32/inc/uthash/ + +#R16_LIBS := -lgobject-2.0 -lffi -lglib-2.0 -ldbus-1 -ldbus-glib-1 -luv -lnghttp2 +R16_LIBS := $(COMMON_R16_LIBS) -lreadline -lcurses +R16_LIBS += ./libuvdbus-r16.so + +LINUX_LIBS := $(COMMON_LINUX_LIBS) -lreadline -lnghttp2 +LINUX_LIBS += ./libuvdbus-linux.so + +ifeq ($(PLAT_R16), TRUE) +DEPEND_LIB := ./debug/libuvdbus-r16.so +USER_CLEAN_ITEMS += ./libuvdbus-r16.so +endif + +ifeq ($(PLAT_LINUX), TRUE) +DEPEND_LIB += ./debug/libuvdbus-linux.so +USER_CLEAN_ITEMS += ./libuvdbus-linux.so +endif + +# this line must be at below of thus, because of... +include /opt/common/Makefile.cross + +ifneq ($(MAKECMDGOALS), clean) +ifneq ($(MAKECMDGOALS), cleanall) +ifneq ($(notdir $(DEPEND_LIB)), $(wildcard $(DEPEND_LIB))) +$(shell $(CP) $(DEPEND_LIB) ./) +endif +endif +endif + +ifeq ($(MAKECMDGOALS), ) +$(shell find ./ -name $(TARGET)-*.exe -delete) +else +ifeq ($(MAKECMDGOALS), all) +$(shell find ./ -name "$(TARGET)-*.exe" -delete) +endif +endif diff --git a/build/Makefile.cfgsvr.cross b/build/Makefile.cfgsvr.cross new file mode 100644 index 0000000..20a5e7d --- /dev/null +++ b/build/Makefile.cfgsvr.cross @@ -0,0 +1,68 @@ +include Makefile.def.cross + +# target name, the target name must have the same name of c source file +TARGET_NAME=config_server + +# target +# for linux module driver: KO +# for application: EXE +# for dynamic library: DLL +TARGET_TYPE = EXE + +# target object +# for application: APP +# for device driver: DRV +TARGET_OBJ = APP + +TARGET_BOX = + +#debug mode or release mode +DEBUG = TRUE + +PLAT_R16 ?= TRUE +PLAT_LINUX ?= FALSE +PLAT_WIN32 ?= FALSE +PLAT_WIN64 ?= FALSE + +VPATH = ../Modules/ConfigServer/ + +# source code + +# set the source file, don't used .o because of ... +# MRS Board Source Files +PLAT_R16_SRCS = config_server.c + +PLAT_LINUX_SRCS := $(PLAT_R16_SRCS) +# gcc CFLAGS + +PLAT_R16_CFLAGS := -I./ -I../include +PLAT_LINUX_CFLAGS := $(PLAT_R16_CFLAGS) -I/usr/include/dbus-1.0/ -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include/ + +#R16_LIBS := -lgobject-2.0 -lffi -lglib-2.0 -ldbus-1 -ldbus-glib-1 -luv +R16_LIBS := $(COMMON_R16_LIBS) +#LINUX_LIBS := -ldbus-1 -luv -lcrypto -lcjson +R16_LIBS += ./libuvdbus-r16.so + +ifeq ($(PLAT_R16), TRUE) +DEPEND_LIB := ./debug/libuvdbus-r16.so +USER_CLEAN_ITEMS += ./libuvdbus-r16.so +endif + +# this line must be at below of thus, because of... +include /opt/common/Makefile.cross + +ifneq ($(MAKECMDGOALS), clean) +ifneq ($(MAKECMDGOALS), cleanall) +ifneq ($(notdir $(DEPEND_LIB)), $(wildcard $(DEPEND_LIB))) +$(shell $(CP) $(DEPEND_LIB) ./) +endif +endif +endif + +ifeq ($(MAKECMDGOALS), ) +$(shell find ./ -name $(TARGET)-*.exe -delete) +else +ifeq ($(MAKECMDGOALS), all) +$(shell find ./ -name "$(TARGET)-*.exe" -delete) +endif +endif diff --git a/build/Makefile.def.cross b/build/Makefile.def.cross new file mode 100644 index 0000000..f99a8ac --- /dev/null +++ b/build/Makefile.def.cross @@ -0,0 +1,2 @@ +COMMON_R16_LIBS := -ldbus-1 -luv -lcrypto -lcjson -ls2json -lsqlite3 -lnghttp2 -lquickmail -lz -luuid -lconfig -lcurl -lssl -lpthread +COMMON_LINUX_LIBS := -ldbus-1 -luv -lcrypto -lcurl -lm -lnghttp2 -lsqlite3 -lquickmail -lz -luuid -lconfig -lssl -lpthread diff --git a/build/Makefile.lib.cross b/build/Makefile.lib.cross new file mode 100644 index 0000000..5e2747e --- /dev/null +++ b/build/Makefile.lib.cross @@ -0,0 +1,79 @@ +include Makefile.def.cross + +# target name, the target name must have the same name of c source file +TARGET_NAME=libuvdbus + +# target +# for linux module driver: KO +# for application: EXE +# for dynamic library: DLL +TARGET_TYPE = DLL + +# target object +# for application: APP +# for device driver: DRV +TARGET_OBJ = APP + +TARGET_BOX = + +#debug mode or release mode +DEBUG = TRUE + +PLAT_R16 ?= TRUE +PLAT_LINUX ?= TRUE +PLAT_WIN32 ?= FALSE +PLAT_WIN64 ?= FALSE + +VPATH = ../Framework ../log ../Modules ../linux32 + +# source code + +# set the source file, don't used .o because of ... +# MRS Board Source Files +PLAT_R16_SRCS = \ + libuvEngine/libuv_dbus.c \ + HeartDaemon/heart_daemon.c \ + JsonUtils/json_struct.c \ + Configure/config_engine.c \ + Configure/ini_prase.c \ + Crypto/aes.c \ + Crypto/base64.c \ + Crypto/md5.c \ + Crypto/crypto.c \ + Compress/zlib.c \ + Network/inet_api.c \ + Timer/timer.c \ + Fifo/fifo.c \ + Skins/skins.c \ + Skins/skin_res_vtbl.c \ + Monitor/monitor.c \ + log.c \ + SvrManager/svr_manager.c \ + hexdump.c + +PLAT_LINUX_SRCS := $(PLAT_R16_SRCS) \ + src/cJSON.c \ + src/s2j.c + +# gcc CFLAGS + +PLAT_R16_CFLAGS := -I../include -fPIC +PLAT_LINUX_CFLAGS := $(PLAT_R16_CFLAGS) -I/usr/include/dbus-1.0/ -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include/ -I../linux32/inc/ -I../linux32/inc/cjson/ +PLAT_LINUX_CFLAGS += -I../linux32/inc/uthash/ + +PLAT_R16_LDFLAGS := -shared -fPIC +PLAT_LINUX_LDFLAGS := $(PLAT_R16_LDFLAGS) + +R16_LIBS := $(COMMON_R16_LIBS) +LINUX_LIBS := $(COMMON_LINUX_LIBS) + +# this line must be at below of thus, because of... +include /opt/common/Makefile.cross + +ifeq ($(MAKECMDGOALS), ) +$(shell find ./ -name $(TARGET)-*.exe -delete) +else +ifeq ($(MAKECMDGOALS), all) +$(shell find ./ -name "$(TARGET)-*.exe" -delete) +endif +endif diff --git a/build/Makefile.logctrl.cross b/build/Makefile.logctrl.cross new file mode 100644 index 0000000..d4973af --- /dev/null +++ b/build/Makefile.logctrl.cross @@ -0,0 +1,76 @@ +include Makefile.def.cross + +# target name, the target name must have the same name of c source file +TARGET_NAME=logCtrl + +# target +# for linux module driver: KO +# for application: EXE +# for dynamic library: DLL +TARGET_TYPE = EXE + +# target object +# for application: APP +# for device driver: DRV +TARGET_OBJ = APP + +TARGET_BOX = + +#debug mode or release mode +DEBUG = TRUE + +PLAT_R16 ?= TRUE +PLAT_LINUX ?= TRUE +PLAT_WIN32 ?= FALSE +PLAT_WIN64 ?= FALSE + +VPATH = ../Modules/LogCtrl/ + +# source code + +# set the source file, don't used .o because of ... +# MRS Board Source Files +PLAT_R16_SRCS = log_ctrl.c + +PLAT_LINUX_SRCS := $(PLAT_R16_SRCS) +# gcc CFLAGS + +PLAT_R16_CFLAGS := -I./ -I../include +PLAT_LINUX_CFLAGS := $(PLAT_R16_CFLAGS) -I/usr/include/dbus-1.0/ -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include/ +PLAT_LINUX_CFLAGS += -I../linux32/inc/ -I../linux32/inc/cjson/ -I../linux32/inc/uthash/ + +R16_LIBS := $(COMMON_R16_LIBS) -lreadline -lcurses +R16_LIBS += ./libuvdbus-r16.so + +LINUX_LIBS := $(COMMON_LINUX_LIBS) -lreadline +LINUX_LIBS += ./libuvdbus-linux.so + + +ifeq ($(PLAT_R16), TRUE) +DEPEND_LIB += ./debug/libuvdbus-r16.so +USER_CLEAN_ITEMS += ./libuvdbus-r16.so +endif + +ifeq ($(PLAT_LINUX), TRUE) +DEPEND_LIB += ./debug/libuvdbus-linux.so +USER_CLEAN_ITEMS += ./libuvdbus-linux.so +endif + +# this line must be at below of thus, because of... +include /opt/common/Makefile.cross + +ifneq ($(MAKECMDGOALS), clean) +ifneq ($(MAKECMDGOALS), cleanall) +ifneq ($(notdir $(DEPEND_LIB)), $(wildcard $(DEPEND_LIB))) +$(shell $(CP) $(DEPEND_LIB) ./) +endif +endif +endif + +ifeq ($(MAKECMDGOALS), ) +$(shell find ./ -name $(TARGET)-*.exe -delete) +else +ifeq ($(MAKECMDGOALS), all) +$(shell find ./ -name "$(TARGET)-*.exe" -delete) +endif +endif diff --git a/build/Makefile.ota.cross b/build/Makefile.ota.cross new file mode 100644 index 0000000..b78bc4b --- /dev/null +++ b/build/Makefile.ota.cross @@ -0,0 +1,76 @@ +include Makefile.def.cross +# target name, the target name must have the same name of c source file +TARGET_NAME=ota + +# target +# for linux module driver: KO +# for application: EXE +# for dynamic library: DLL +TARGET_TYPE = EXE + +# target object +# for application: APP +# for device driver: DRV +TARGET_OBJ = APP + +TARGET_BOX = + +#debug mode or release mode +DEBUG = TRUE + +PLAT_R16 ?= TRUE +PLAT_LINUX ?= TRUE +PLAT_WIN32 ?= FALSE +PLAT_WIN64 ?= FALSE + +VPATH = ../Modules/OTA/ + +# source code + +# set the source file, don't used .o because of ... +# MRS Board Source Files +PLAT_R16_SRCS = ota.c + +PLAT_LINUX_SRCS := $(PLAT_R16_SRCS) +# gcc CFLAGS + +PLAT_R16_CFLAGS := -I./ -I../include +PLAT_LINUX_CFLAGS := $(PLAT_R16_CFLAGS) -I/usr/include/dbus-1.0/ -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include/ +PLAT_LINUX_CFLAGS += -I../linux32/inc/ -I../linux32/inc/cjson/ -I../linux32/inc/uthash/ + +#R16_LIBS := -lgobject-2.0 -lffi -lglib-2.0 -ldbus-1 -ldbus-glib-1 -luv +R16_LIBS := $(COMMON_R16_LIBS) +R16_LIBS += ./libuvdbus-r16.so + +LINUX_LIBS := $(COMMON_LINUX_LIBS) +LINUX_LIBS += ./libuvdbus-linux.so + + +ifeq ($(PLAT_R16), TRUE) +DEPEND_LIB += ./debug/libuvdbus-r16.so +USER_CLEAN_ITEMS += ./libuvdbus-r16.so +endif + +ifeq ($(PLAT_LINUX), TRUE) +DEPEND_LIB += ./debug/libuvdbus-linux.so +USER_CLEAN_ITEMS += ./libuvdbus-linux.so +endif + +# this line must be at below of thus, because of... +include /opt/common/Makefile.cross + +ifneq ($(MAKECMDGOALS), clean) +ifneq ($(MAKECMDGOALS), cleanall) +ifneq ($(notdir $(DEPEND_LIB)), $(wildcard $(DEPEND_LIB))) +$(shell $(CP) $(DEPEND_LIB) ./) +endif +endif +endif + +ifeq ($(MAKECMDGOALS), ) +$(shell find ./ -name $(TARGET)-*.exe -delete) +else +ifeq ($(MAKECMDGOALS), all) +$(shell find ./ -name "$(TARGET)-*.exe" -delete) +endif +endif diff --git a/build/Makefile.voice.cross b/build/Makefile.voice.cross new file mode 100644 index 0000000..8a005ad --- /dev/null +++ b/build/Makefile.voice.cross @@ -0,0 +1,72 @@ +include Makefile.def.cross + +# target name, the target name must have the same name of c source file +TARGET_NAME=voice + +# target +# for linux module driver: KO +# for application: EXE +# for dynamic library: DLL +TARGET_TYPE = EXE + +# target object +# for application: APP +# for device driver: DRV +TARGET_OBJ = APP + +TARGET_BOX = + +#debug mode or release mode +DEBUG = TRUE + +PLAT_R16 ?= TRUE +PLAT_LINUX ?= FALSE +PLAT_WIN32 ?= FALSE +PLAT_WIN64 ?= FALSE + +VPATH = ../Modules/voice/ + +# source code + +# set the source file, don't used .o because of ... +# MRS Board Source Files +PLAT_R16_SRCS = demo.c + +PLAT_LINUX_SRCS := $(PLAT_R16_SRCS) +# gcc CFLAGS + +PLAT_R16_CFLAGS := -I./ -I../include +PLAT_LINUX_CFLAGS := $(PLAT_R16_CFLAGS) -I/usr/include/dbus-1.0/ -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include/ +PLAT_LINUX_CFLAGS += -I../linux32/inc/ -I../linux32/inc/cjson/ -I../linux32/inc/uthash/ + +#R16_LIBS := -lgobject-2.0 -lffi -lglib-2.0 -ldbus-1 -ldbus-glib-1 -luv +R16_LIBS := $(COMMON_R16_LIBS) +R16_LIBS += ./libuvdbus-r16.so ./libSRC.so + +LINUX_LIBS := $(COMMON_LINUX_LIBS) +LINUX_LIBS += ./libuvdbus-linux.so + + +ifeq ($(PLAT_R16), TRUE) +DEPEND_LIB += ../Modules/voice/libSRC.so +USER_CLEAN_ITEMS += ./libSRC.so +endif + +# this line must be at below of thus, because of... +include /opt/common/Makefile.cross + +ifneq ($(MAKECMDGOALS), clean) +ifneq ($(MAKECMDGOALS), cleanall) +ifneq ($(notdir $(DEPEND_LIB)), $(wildcard $(DEPEND_LIB))) +$(shell $(CP) $(DEPEND_LIB) ./) +endif +endif +endif + +ifeq ($(MAKECMDGOALS), ) +$(shell find ./ -name $(TARGET)-*.exe -delete) +else +ifeq ($(MAKECMDGOALS), all) +$(shell find ./ -name "$(TARGET)-*.exe" -delete) +endif +endif diff --git a/compile.sh b/compile.sh new file mode 100755 index 0000000..f1f9a05 --- /dev/null +++ b/compile.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +source /etc/profile +make OPT=clean && make && make OPT=install +#make && make OPT=install diff --git a/include/assistant.h b/include/assistant.h new file mode 100644 index 0000000..56b28f7 --- /dev/null +++ b/include/assistant.h @@ -0,0 +1,168 @@ +#ifndef ASSISTANT_H +#define ASSISTANT_H +#ifdef __cplusplus +extern "C" { +#endif + +#define MAX_TIP_LEN (60 * 4 + 1) +#define MAX_ALARM_ITEMS (1024) + +typedef enum +{ + ASSISTANT_TYPE_CLOCK = 0, + ASSISTANT_TYPE_REMAIND, + ASSISTANT_TYPE_SESSION, +} ASSISTANT_TYPE; + +typedef enum +{ + STATUS_IDLE = 0, + STATUS_PREPARE_STANDBY, + STATUS_RUNNING, + STATUS_NOT_IN_USE, + STATUS_REMOVE_ITEM, + STATUS_ADD_ITEM, +} ASSISTANT_STATUS; + +typedef struct +{ + unsigned long long itemId; ///< 提醒、闹钟ID + ASSISTANT_TYPE itemType; ///< 类型: 0 闹钟, 1 提醒 + int priority; ///< 优先级: 暂未使用 + REPEAT_MODE repeatMode; ///< 重复模式 + + int year; ///< 年 + int month; ///< 月 + int day; ///< 日 + int hour; ///< 小时 + int minute; ///< 分钟 + int second; ///< 秒钟 + int weekDay; ///< 星期 + + unsigned int timerId; ///< 关联的定时器ID + unsigned long long voiceId; ///< 闹钟资源ID + char strTips[MAX_TIP_LEN]; ///< 提醒 TTS 文本 + char resUrl[2048]; ///< 资源URL + char voiceRes[32]; ///< 资源声音文件ID + char voiceResType[64]; ///< 资源类型 +} ASSISTANT_ITEM_INFO, *PASSISTANT_ITEM_INFO; + +typedef struct +{ + int nItems; ///< 协议包含的数据个数 + PASSISTANT_ITEM_INFO pAlarmInfo; ///< 提醒、闹钟数据详细信息 +} ASSISTANT_SYNC_INFO, *PASSISTANT_SYNC_INFO; + +typedef struct ASSISTANT_ARRAY_INFO +{ + ASSISTANT_ITEM_INFO alarmItem; + struct ASSISTANT_ARRAY_INFO *next, *prev; +} *PASSISTANT_ARRAY_INFO; + +typedef struct +{ + int cmd; + int nItems; + ASSISTANT_TYPE type; + unsigned long long ids[MAX_ALARM_ITEMS]; +} ASSISTANT_NOTIFY_INFO, *PASSISTANT_NOTIFY_INFO; + +typedef struct +{ + int cmd; + int val; +} ASSISTANT_RSP_STATUS, *PASSISTANT_RSP_STATUS; + +typedef struct +{ + int cmd; + int val; + int errCode; +} ASSISTANT_NOFIFY_EVENT, *PASSISTANT_NOFIFY_EVENT; + +static void __printAssistantNofifyInfo(const char *pTags, PASSISTANT_NOTIFY_INFO pInfo) +{ + int i; + if(pTags && strlen(pTags) > 0) + { + LOG_EX2(LOG_Debug, "%s:\n", pTags); + LOG_EX2(LOG_Debug, "**************************************************************\n"); + } + + LOG_EX2(LOG_Debug, "Sync Items : %d\n", pInfo->nItems); + LOG_EX2(LOG_Debug, "-------------------------\n"); + LOG_EX2(LOG_Debug, "| Alarm Id | Type |\n"); + LOG_EX2(LOG_Debug, "-------------------------\n"); + + for(i = 0; i < pInfo->nItems; i++) + { + LOG_EX2(LOG_Debug, "| %8llu | %11s |\n", + pInfo->ids[i], + (pInfo->type == ASSISTANT_TYPE_REMAIND) ? "Remaind" : "Alarm Clock"); + } + + LOG_EX2(LOG_Debug, "-------------------------\n"); +} + +static void __printAssistantSyncInfo(const char* pTags, PASSISTANT_SYNC_INFO pInfo) +{ + int i; + char buf[MAX_PATH]; + struct tm localTime; + time_t tmStamp; + + if(pTags && strlen(pTags) > 0) + { + LOG_EX2(LOG_Debug, "%s:\n", pTags); + LOG_EX2(LOG_Debug, "**************************************************************\n"); + } + + //fprintf(stdout, "Command : %d(%08X)\n", pInfo->cmd, pInfo->cmd); + LOG_EX2(LOG_Debug, "Sync Items : %d\n", pInfo->nItems); + + LOG_EX2(LOG_Debug, "---------------------------------------------------------------------" + "-----------------------------------------------------------\n"); + + LOG_EX2(LOG_Debug, "| Alarm Id | Type | Priority | Repeat Mode | Week Day |" + " DateTime | Tips | Resource |\n"); + + LOG_EX2(LOG_Debug, "---------------------------------------------------------------------" + "-----------------------------------------------------------\n"); + + for(i = 0; i < pInfo->nItems; i++) + { + memset(buf, 0, MAX_PATH); + + sprintf(buf, "%04u-%02u-%02u %02u:%02u:%02u", + (pInfo->pAlarmInfo[i].year == -1) ? 1900 : pInfo->pAlarmInfo[i].year + 1900, + (pInfo->pAlarmInfo[i].month == -1) ? 0 : pInfo->pAlarmInfo[i].month + 1, + (pInfo->pAlarmInfo[i].day == -1) ? 0 : pInfo->pAlarmInfo[i].day, + (pInfo->pAlarmInfo[i].hour == -1) ? 0 : pInfo->pAlarmInfo[i].hour, + (pInfo->pAlarmInfo[i].minute == -1) ? 0 : pInfo->pAlarmInfo[i].minute, + (pInfo->pAlarmInfo[i].second == -1) ? 0 : pInfo->pAlarmInfo[i].second); + + LOG_EX2(LOG_Debug, "| %8llu | %11s | %8d | %15s | %d%d%d%d %d%d%d%d | %20s | %20s | %8llu |\n", + pInfo->pAlarmInfo[i].itemId, + (pInfo->pAlarmInfo[i].itemType == ASSISTANT_TYPE_REMAIND) ? "Remaind" : "Alarm Clock", + pInfo->pAlarmInfo[i].priority, + DumpTimerRepeatModeString(pInfo->pAlarmInfo[i].repeatMode), + (pInfo->pAlarmInfo[i].weekDay & (1 << 7))? 1 : 0, + (pInfo->pAlarmInfo[i].weekDay & (1 << 6))? 1 : 0, + (pInfo->pAlarmInfo[i].weekDay & (1 << 5))? 1 : 0, + (pInfo->pAlarmInfo[i].weekDay & (1 << 4))? 1 : 0, + (pInfo->pAlarmInfo[i].weekDay & (1 << 3))? 1 : 0, + (pInfo->pAlarmInfo[i].weekDay & (1 << 2))? 1 : 0, + (pInfo->pAlarmInfo[i].weekDay & (1 << 1))? 1 : 0, + (pInfo->pAlarmInfo[i].weekDay & (1 << 0))? 1 : 0, + buf, + pInfo->pAlarmInfo[i].strTips, + pInfo->pAlarmInfo[i].voiceId); + } + + LOG_EX2(LOG_Debug, "---------------------------------------------------------------------" + "-----------------------------------------------------------\n"); +} +#ifdef __cplusplus +} +#endif +#endif diff --git a/include/config_engine.h b/include/config_engine.h new file mode 100644 index 0000000..80dfc49 --- /dev/null +++ b/include/config_engine.h @@ -0,0 +1,58 @@ +#ifndef CONFIG_ENGINE_H +#define CONFIG_ENGINE_H +#include +#include + +#include "smart_sound.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define GLOBAL_CFG_FILE_PATH ("/mnt/UDISK/global.db") + + +typedef enum +{ + CFG_TYPE_STRING = 0, + CFG_TYPE_INT = 1, + CFG_TYPE_DOUBLE = 2, +} CFG_DATA_TYPE; + +typedef struct +{ + char* pKeyName; + int keyType; + int keyModule; + + union + { + char* pStrValue; + int intValue; + double doubleValue; + }; + + UT_hash_handle hh; ///< UT Hash handle +} CFG_ITEM, *PCFG_ITEM; + +typedef void (*OnCfgMsg)(DBUS_CMD cmd, PCFG_ITEM pMsg, int err); + +int CfgGlobalEnvInit(void); + +void CfgItemPrint(const char* pPrefix, PCFG_ITEM pCfgItem); + +int CfgGetKeyValue(const char* pKeyName, PCFG_ITEM* pItem); +int CfgChangeKeyValue(const char *pKeyName, PCFG_ITEM pItem, int saveToDB); +int CfgAddKeyValue(const char *pKeyName, PCFG_ITEM pItem, int saveToDB); + +void CfgSetIntValue(const char* pTags, int iValue); + +void OnCfgMsgProcess(MODULE_NAME dest, DBUS_CMD busCmd, const char *pJsonStr); + +int Sqlite3SyncDB(sqlite3* pSqlMemory, const char* pMemDbName, const char* pDBFilePath, const char* pFileDbName, int isSave); + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/include/crypto.h b/include/crypto.h new file mode 100644 index 0000000..57961f8 --- /dev/null +++ b/include/crypto.h @@ -0,0 +1,81 @@ +#ifndef CRYPTO_H +#define CRYPTO_H +#include +#include +#ifdef __cplusplus +extern "C" { +#endif +#define ALIGN_AES_BLOCK(size) (((size + AES_BLOCK_SIZE - 1) / AES_BLOCK_SIZE) * AES_BLOCK_SIZE) + +#define MD5_VALUE_LEN (16) +#define MD5_STR_VALUE_LEN (MD5_VALUE_LEN * 2) + +typedef enum +{ + CRYPTO_AES_ENCRYPT = 0, + CRYPTO_AES_DECRYPT, + CRYPTO_BASE64_ENCODE, + CRYPTO_BASE64_DECODE, + CRYPTO_MD5_FILE, +} CRYPTO_TYPE; + +void EvpSystemInit(void); + +//***************************************************** +// AES +//***************************************************** +typedef void (*OnEVPCrypto)(CRYPTO_TYPE type, + const unsigned char* pData, + int iSize, + const unsigned char* pSrcData, + int iError); + + + +int EvpAESEncrypto(unsigned char* pInBuf, + int iSize, + unsigned char* pOutBuf, + int* pOutSize, + unsigned char* pKey); + +int EvpAESDecrypto(unsigned char* pInBuf, + int iSize, + unsigned char* pOutBuf, + int* pOutSize, + unsigned char* pKey); + +//***************************************************** +// BASE64 +//***************************************************** +const char* EvpBase64Encode(const char* pSrc); +const char* EvpBase64Decode(const char* pBase64); +const char* EvpBase64EncodeNoAlign(const char *pSrc); +const char* EvpBase64DecodeNoAlign(const char *pBase64); +const char* EvpBase64EncodeNoAlignV2(unsigned char *pSrc, int sLen); +unsigned char* EvpBase64DecodeNoAlignV2(const char *pBase64, int *pOutSize); +//***************************************************** +// MD5 +//***************************************************** +const char* EvpMD5HashFile(const char* pFileName); +int EvpMD5HashFileV2(const char *pFileName, unsigned char md5[16]);; +int EvpMD5HashBuf(const unsigned char *pBuf, int iBufLen, unsigned char *pOutBuf, int *pOutSize); +const char* EvpMD5HashBufV2(const unsigned char *pBuf, int iBufLen); +//***************************************************** +// Async Engine +//***************************************************** +int EvpAddCryptoTask(CRYPTO_TYPE type, + unsigned char* pInBuf, + int iSize, + unsigned char* pOutBuf, + char* pKey, + OnEVPCrypto onEvpCryptCb); + +//***************************************************** +// Compress +//***************************************************** +int GZipFileCompress(const char *pInput, const char *pOutput); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/include/fifo.h b/include/fifo.h new file mode 100644 index 0000000..4ea395b --- /dev/null +++ b/include/fifo.h @@ -0,0 +1,724 @@ +/* + * A generic kernel FIFO implementation + * + * Copyright (C) 2009/2010 Stefani Seibold + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#ifndef FIFO_H +#define FIFO_H + +#include + +#define ARRAY_SIZE(x) (sizeof(x) / sizeof(*(x))) +#define __must_check __attribute__((warn_unused_result)) +/* + * How to porting drivers to the new generic FIFO API: + * + * - Modify the declaration of the "struct kfifo *" object into a + * in-place "struct kfifo" object + * - Init the in-place object with kfifo_alloc() or kfifo_init() + * Note: The address of the in-place "struct kfifo" object must be + * passed as the first argument to this functions + * - Replace the use of __kfifo_put into kfifo_in and __kfifo_get + * into kfifo_out + * - Replace the use of kfifo_put into kfifo_in_spinlocked and kfifo_get + * into kfifo_out_spinlocked + * Note: the spinlock pointer formerly passed to kfifo_init/kfifo_alloc + * must be passed now to the kfifo_in_spinlocked and kfifo_out_spinlocked + * as the last parameter + * - The formerly __kfifo_* functions are renamed into kfifo_* + */ + +/* + * Note about locking : There is no locking required until only * one reader + * and one writer is using the fifo and no kfifo_reset() will be * called + * kfifo_reset_out() can be safely used, until it will be only called + * in the reader thread. + * For multiple writer and one reader there is only a need to lock the writer. + * And vice versa for only one writer and multiple reader there is only a need + * to lock the reader. + */ + + +struct __kfifo { + unsigned int in; + unsigned int out; + unsigned int mask; + unsigned int esize; + void *data; + uv_mutex_t lock; +}; + +#define __STRUCT_KFIFO_COMMON(datatype, recsize, ptrtype) \ + union { \ + struct __kfifo kfifo; \ + datatype *type; \ + char (*rectype)[recsize]; \ + ptrtype *ptr; \ + const ptrtype *ptr_const; \ + } + +#define __STRUCT_KFIFO(type, size, recsize, ptrtype) \ +{ \ + __STRUCT_KFIFO_COMMON(type, recsize, ptrtype); \ + type buf[((size < 2) || (size & (size - 1))) ? -1 : size]; \ +} + +#define STRUCT_KFIFO(type, size) \ + struct __STRUCT_KFIFO(type, size, 0, type) + +#define __STRUCT_KFIFO_PTR(type, recsize, ptrtype) \ +{ \ + __STRUCT_KFIFO_COMMON(type, recsize, ptrtype); \ + type buf[0]; \ +} + +#define STRUCT_KFIFO_PTR(type) \ + struct __STRUCT_KFIFO_PTR(type, 0, type) + +/* + * define compatibility "struct kfifo" for dynamic allocated fifos + */ +struct kfifo __STRUCT_KFIFO_PTR(unsigned char, 0, void); + +#define STRUCT_KFIFO_REC_1(size) \ + struct __STRUCT_KFIFO(unsigned char, size, 1, void) + +#define STRUCT_KFIFO_REC_2(size) \ + struct __STRUCT_KFIFO(unsigned char, size, 2, void) + +/* + * define kfifo_rec types + */ +struct kfifo_rec_ptr_1 __STRUCT_KFIFO_PTR(unsigned char, 1, void); +struct kfifo_rec_ptr_2 __STRUCT_KFIFO_PTR(unsigned char, 2, void); + +/* + * helper macro to distinguish between real in place fifo where the fifo + * array is a part of the structure and the fifo type where the array is + * outside of the fifo structure. + */ +#define __is_kfifo_ptr(fifo) (sizeof(*fifo) == sizeof(struct __kfifo)) + +/** + * DECLARE_KFIFO_PTR - macro to declare a fifo pointer object + * @fifo: name of the declared fifo + * @type: type of the fifo elements + */ +#define DECLARE_KFIFO_PTR(fifo, type) STRUCT_KFIFO_PTR(type) fifo + +/** + * DECLARE_KFIFO - macro to declare a fifo object + * @fifo: name of the declared fifo + * @type: type of the fifo elements + * @size: the number of elements in the fifo, this must be a power of 2 + */ +#define DECLARE_KFIFO(fifo, type, size) STRUCT_KFIFO(type, size) fifo + +/** + * INIT_KFIFO - Initialize a fifo declared by DECLARE_KFIFO + * @fifo: name of the declared fifo datatype + */ +#define INIT_KFIFO(fifo) \ +(void)({ \ + typeof(&(fifo)) __tmp = &(fifo); \ + struct __kfifo *__kfifo = &__tmp->kfifo; \ + __kfifo->in = 0; \ + __kfifo->out = 0; \ + __kfifo->mask = __is_kfifo_ptr(__tmp) ? 0 : ARRAY_SIZE(__tmp->buf) - 1;\ + __kfifo->esize = sizeof(*__tmp->buf); \ + __kfifo->data = __is_kfifo_ptr(__tmp) ? NULL : __tmp->buf; \ +}) + +/** + * DEFINE_KFIFO - macro to define and initialize a fifo + * @fifo: name of the declared fifo datatype + * @type: type of the fifo elements + * @size: the number of elements in the fifo, this must be a power of 2 + * + * Note: the macro can be used for global and local fifo data type variables. + */ +#define DEFINE_KFIFO(fifo, type, size) \ + DECLARE_KFIFO(fifo, type, size) = \ + (typeof(fifo)) { \ + { \ + { \ + .in = 0, \ + .out = 0, \ + .mask = __is_kfifo_ptr(&(fifo)) ? \ + 0 : \ + ARRAY_SIZE((fifo).buf) - 1, \ + .esize = sizeof(*(fifo).buf), \ + .data = __is_kfifo_ptr(&(fifo)) ? \ + NULL : \ + (fifo).buf, \ + } \ + } \ + } + + +static inline unsigned int __must_check +__kfifo_uint_must_check_helper(unsigned int val) +{ + return val; +} + +static inline int __must_check +__kfifo_int_must_check_helper(int val) +{ + return val; +} + +/** + * kfifo_initialized - Check if the fifo is initialized + * @fifo: address of the fifo to check + * + * Return %true if fifo is initialized, otherwise %false. + * Assumes the fifo was 0 before. + */ +#define kfifo_initialized(fifo) ((fifo)->kfifo.mask) + +/** + * kfifo_esize - returns the size of the element managed by the fifo + * @fifo: address of the fifo to be used + */ +#define kfifo_esize(fifo) ((fifo)->kfifo.esize) + +/** + * kfifo_recsize - returns the size of the record length field + * @fifo: address of the fifo to be used + */ +#define kfifo_recsize(fifo) (sizeof(*(fifo)->rectype)) + +/** + * kfifo_size - returns the size of the fifo in elements + * @fifo: address of the fifo to be used + */ +#define kfifo_size(fifo) ((fifo)->kfifo.mask + 1) + +/** + * kfifo_reset - removes the entire fifo content + * @fifo: address of the fifo to be used + * + * Note: usage of kfifo_reset() is dangerous. It should be only called when the + * fifo is exclusived locked or when it is secured that no other thread is + * accessing the fifo. + */ +#define kfifo_reset(fifo) \ +(void)({ \ + typeof((fifo) + 1) __tmp = (fifo); \ + __tmp->kfifo.in = __tmp->kfifo.out = 0; \ +}) + +/** + * kfifo_reset_out - skip fifo content + * @fifo: address of the fifo to be used + * + * Note: The usage of kfifo_reset_out() is safe until it will be only called + * from the reader thread and there is only one concurrent reader. Otherwise + * it is dangerous and must be handled in the same way as kfifo_reset(). + */ +#define kfifo_reset_out(fifo) \ +(void)({ \ + typeof((fifo) + 1) __tmp = (fifo); \ + __tmp->kfifo.out = __tmp->kfifo.in; \ +}) + +/** + * kfifo_len - returns the number of used elements in the fifo + * @fifo: address of the fifo to be used + */ +#define kfifo_len(fifo) \ +({ \ + typeof((fifo) + 1) __tmpl = (fifo); \ + __tmpl->kfifo.in - __tmpl->kfifo.out; \ +}) + +/** + * kfifo_is_empty - returns true if the fifo is empty + * @fifo: address of the fifo to be used + */ +#define kfifo_is_empty(fifo) \ +({ \ + typeof((fifo) + 1) __tmpq = (fifo); \ + __tmpq->kfifo.in == __tmpq->kfifo.out; \ +}) + +/** + * kfifo_is_full - returns true if the fifo is full + * @fifo: address of the fifo to be used + */ +#define kfifo_is_full(fifo) \ +({ \ + typeof((fifo) + 1) __tmpq = (fifo); \ + kfifo_len(__tmpq) > __tmpq->kfifo.mask; \ +}) + +/** + * kfifo_avail - returns the number of unused elements in the fifo + * @fifo: address of the fifo to be used + */ +#define kfifo_avail(fifo) \ +__kfifo_uint_must_check_helper( \ +({ \ + typeof((fifo) + 1) __tmpq = (fifo); \ + const unsigned int __recsize = sizeof(*__tmpq->rectype); \ + unsigned int __avail = kfifo_size(__tmpq) - kfifo_len(__tmpq); \ + (__recsize) ? ((__avail <= __recsize) ? 0 : \ + __kfifo_max_r(__avail - __recsize, __recsize)) : \ + __avail; \ +}) \ +) + +/** + * kfifo_skip - skip output data + * @fifo: address of the fifo to be used + */ +#define kfifo_skip(fifo) \ +(void)({ \ + typeof((fifo) + 1) __tmp = (fifo); \ + const unsigned int __recsize = sizeof(*__tmp->rectype); \ + struct __kfifo *__kfifo = &__tmp->kfifo; \ + if (__recsize) \ + __kfifo_skip_r(__kfifo, __recsize); \ + else \ + __kfifo->out++; \ +}) + +/** + * kfifo_peek_len - gets the size of the next fifo record + * @fifo: address of the fifo to be used + * + * This function returns the size of the next fifo record in number of bytes. + */ +#define kfifo_peek_len(fifo) \ +__kfifo_uint_must_check_helper( \ +({ \ + typeof((fifo) + 1) __tmp = (fifo); \ + const unsigned int __recsize = sizeof(*__tmp->rectype); \ + struct __kfifo *__kfifo = &__tmp->kfifo; \ + (!__recsize) ? kfifo_len(__tmp) * sizeof(*__tmp->type) : \ + __kfifo_len_r(__kfifo, __recsize); \ +}) \ +) + +/** + * kfifo_alloc - dynamically allocates a new fifo buffer + * @fifo: pointer to the fifo + * @size: the number of elements in the fifo, this must be a power of 2 + * @gfp_mask: get_free_pages mask, passed to kmalloc() + * + * This macro dynamically allocates a new fifo buffer. + * + * The numer of elements will be rounded-up to a power of 2. + * The fifo will be release with kfifo_free(). + * Return 0 if no error, otherwise an error code. + */ +#define kfifo_alloc(fifo, size) \ +__kfifo_int_must_check_helper( \ +({ \ + typeof((fifo) + 1) __tmp = (fifo); \ + struct __kfifo *__kfifo = &__tmp->kfifo; \ + __is_kfifo_ptr(__tmp) ? \ + __kfifo_alloc(__kfifo, size, sizeof(*__tmp->type)) : \ + -EINVAL; \ +}) \ +) + +/** + * kfifo_free - frees the fifo + * @fifo: the fifo to be freed + */ +#define kfifo_free(fifo) \ +({ \ + typeof((fifo) + 1) __tmp = (fifo); \ + struct __kfifo *__kfifo = &__tmp->kfifo; \ + if (__is_kfifo_ptr(__tmp)) \ + __kfifo_free(__kfifo); \ +}) + +/** + * kfifo_init - initialize a fifo using a preallocated buffer + * @fifo: the fifo to assign the buffer + * @buffer: the preallocated buffer to be used + * @size: the size of the internal buffer, this have to be a power of 2 + * + * This macro initialize a fifo using a preallocated buffer. + * + * The numer of elements will be rounded-up to a power of 2. + * Return 0 if no error, otherwise an error code. + */ +#define kfifo_init(fifo, buffer, size) \ +({ \ + typeof((fifo) + 1) __tmp = (fifo); \ + struct __kfifo *__kfifo = &__tmp->kfifo; \ + __is_kfifo_ptr(__tmp) ? \ + __kfifo_init(__kfifo, buffer, size, sizeof(*__tmp->type)) : \ + -EINVAL; \ +}) + +/** + * kfifo_put - put data into the fifo + * @fifo: address of the fifo to be used + * @val: the data to be added + * + * This macro copies the given value into the fifo. + * It returns 0 if the fifo was full. Otherwise it returns the number + * processed elements. + * + * Note that with only one concurrent reader and one concurrent + * writer, you don't need extra locking to use these macro. + */ +#define kfifo_put(fifo, val) \ +({ \ + typeof((fifo) + 1) __tmp = (fifo); \ + typeof((val) + 1) __val = (val); \ + unsigned int __ret; \ + const unsigned int __recsize = sizeof(*__tmp->rectype); \ + struct __kfifo *__kfifo = &__tmp->kfifo; \ + if (0) { \ + typeof(__tmp->ptr_const) __dummy __attribute__ ((unused)); \ + __dummy = (typeof(__val))NULL; \ + } \ + if (__recsize) \ + __ret = __kfifo_in_r(__kfifo, __val, sizeof(*__val), \ + __recsize); \ + else { \ + __ret = !kfifo_is_full(__tmp); \ + if (__ret) { \ + (__is_kfifo_ptr(__tmp) ? \ + ((typeof(__tmp->type))__kfifo->data) : \ + (__tmp->buf) \ + )[__kfifo->in & __tmp->kfifo.mask] = \ + *(typeof(__tmp->type))__val; \ + __kfifo->in++; \ + } \ + } \ + __ret; \ +}) + +/** + * kfifo_get - get data from the fifo + * @fifo: address of the fifo to be used + * @val: the var where to store the data to be added + * + * This macro reads the data from the fifo. + * It returns 0 if the fifo was empty. Otherwise it returns the number + * processed elements. + * + * Note that with only one concurrent reader and one concurrent + * writer, you don't need extra locking to use these macro. + */ +#define kfifo_get(fifo, val) \ +__kfifo_uint_must_check_helper( \ +({ \ + typeof((fifo) + 1) __tmp = (fifo); \ + typeof((val) + 1) __val = (val); \ + unsigned int __ret; \ + const unsigned int __recsize = sizeof(*__tmp->rectype); \ + struct __kfifo *__kfifo = &__tmp->kfifo; \ + if (0) \ + __val = (typeof(__tmp->ptr))0; \ + if (__recsize) \ + __ret = __kfifo_out_r(__kfifo, __val, sizeof(*__val), \ + __recsize); \ + else { \ + __ret = !kfifo_is_empty(__tmp); \ + if (__ret) { \ + *(typeof(__tmp->type))__val = \ + (__is_kfifo_ptr(__tmp) ? \ + ((typeof(__tmp->type))__kfifo->data) : \ + (__tmp->buf) \ + )[__kfifo->out & __tmp->kfifo.mask]; \ + __kfifo->out++; \ + } \ + } \ + __ret; \ +}) \ +) + +/** + * kfifo_peek - get data from the fifo without removing + * @fifo: address of the fifo to be used + * @val: the var where to store the data to be added + * + * This reads the data from the fifo without removing it from the fifo. + * It returns 0 if the fifo was empty. Otherwise it returns the number + * processed elements. + * + * Note that with only one concurrent reader and one concurrent + * writer, you don't need extra locking to use these macro. + */ +#define kfifo_peek(fifo, val) \ +__kfifo_uint_must_check_helper( \ +({ \ + typeof((fifo) + 1) __tmp = (fifo); \ + typeof((val) + 1) __val = (val); \ + unsigned int __ret; \ + const unsigned int __recsize = sizeof(*__tmp->rectype); \ + struct __kfifo *__kfifo = &__tmp->kfifo; \ + if (0) \ + __val = (typeof(__tmp->ptr))NULL; \ + if (__recsize) \ + __ret = __kfifo_out_peek_r(__kfifo, __val, sizeof(*__val), \ + __recsize); \ + else { \ + __ret = !kfifo_is_empty(__tmp); \ + if (__ret) { \ + *(typeof(__tmp->type))__val = \ + (__is_kfifo_ptr(__tmp) ? \ + ((typeof(__tmp->type))__kfifo->data) : \ + (__tmp->buf) \ + )[__kfifo->out & __tmp->kfifo.mask]; \ + } \ + } \ + __ret; \ +}) \ +) + +/** + * kfifo_in - put data into the fifo + * @fifo: address of the fifo to be used + * @buf: the data to be added + * @n: number of elements to be added + * + * This macro copies the given buffer into the fifo and returns the + * number of copied elements. + * + * Note that with only one concurrent reader and one concurrent + * writer, you don't need extra locking to use these macro. + */ +#define kfifo_in(fifo, buf, n) \ +({ \ + typeof((fifo) + 1) __tmp = (fifo); \ + typeof((buf) + 1) __buf = (buf); \ + unsigned long __n = (n); \ + const unsigned int __recsize = sizeof(*__tmp->rectype); \ + struct __kfifo *__kfifo = &__tmp->kfifo; \ + if (0) { \ + typeof(__tmp->ptr_const) __dummy __attribute__ ((unused)); \ + __dummy = (typeof(__buf))NULL; \ + } \ + (__recsize) ?\ + __kfifo_in_r(__kfifo, __buf, __n, __recsize) : \ + __kfifo_in(__kfifo, __buf, __n); \ +}) + +/** + * kfifo_in_spinlocked - put data into the fifo using a spinlock for locking + * @fifo: address of the fifo to be used + * @buf: the data to be added + * @n: number of elements to be added + * @lock: pointer to the spinlock to use for locking + * + * This macro copies the given values buffer into the fifo and returns the + * number of copied elements. + */ +#define kfifo_in_locked(fifo, buf, n) \ +({ \ + unsigned int __ret; \ + uv_mutex_t __lock = ((struct __kfifo*)fifo)->lock; \ + uv_mutex_lock(&__lock); \ + __ret = kfifo_in(fifo, buf, n); \ + uv_mutex_unlock(&__lock); \ + __ret; \ +}) + + +/** + * kfifo_out - get data from the fifo + * @fifo: address of the fifo to be used + * @buf: pointer to the storage buffer + * @n: max. number of elements to get + * + * This macro get some data from the fifo and return the numbers of elements + * copied. + * + * Note that with only one concurrent reader and one concurrent + * writer, you don't need extra locking to use these macro. + */ +#define kfifo_out(fifo, buf, n) \ +__kfifo_uint_must_check_helper( \ +({ \ + typeof((fifo) + 1) __tmp = (fifo); \ + typeof((buf) + 1) __buf = (buf); \ + unsigned long __n = (n); \ + const unsigned int __recsize = sizeof(*__tmp->rectype); \ + struct __kfifo *__kfifo = &__tmp->kfifo; \ + if (0) { \ + typeof(__tmp->ptr) __dummy = NULL; \ + __buf = __dummy; \ + } \ + (__recsize) ?\ + __kfifo_out_r(__kfifo, __buf, __n, __recsize) : \ + __kfifo_out(__kfifo, __buf, __n); \ +}) \ +) + +/** + * kfifo_out_spinlocked - get data from the fifo using a spinlock for locking + * @fifo: address of the fifo to be used + * @buf: pointer to the storage buffer + * @n: max. number of elements to get + * @lock: pointer to the spinlock to use for locking + * + * This macro get the data from the fifo and return the numbers of elements + * copied. + */ +#define kfifo_out_locked(fifo, buf, n) \ +__kfifo_uint_must_check_helper( \ +({ \ + unsigned int __ret; \ + uv_mutex_t __lock = ((struct __kfifo*)fifo)->lock; \ + uv_mutex_lock(&__lock); \ + __ret = kfifo_out(fifo, buf, n); \ + uv_mutex_unlock(&__lock); \ + __ret; \ +}) \ +) + +/** + * kfifo_from_user - puts some data from user space into the fifo + * @fifo: address of the fifo to be used + * @from: pointer to the data to be added + * @len: the length of the data to be added + * @copied: pointer to output variable to store the number of copied bytes + * + * This macro copies at most @len bytes from the @from into the + * fifo, depending of the available space and returns -EFAULT/0. + * + * Note that with only one concurrent reader and one concurrent + * writer, you don't need extra locking to use these macro. + */ +#define kfifo_from_user(fifo, from, len, copied) \ +__kfifo_uint_must_check_helper( \ +({ \ + typeof((fifo) + 1) __tmp = (fifo); \ + const void __user *__from = (from); \ + unsigned int __len = (len); \ + unsigned int *__copied = (copied); \ + const unsigned int __recsize = sizeof(*__tmp->rectype); \ + struct __kfifo *__kfifo = &__tmp->kfifo; \ + (__recsize) ? \ + __kfifo_from_user_r(__kfifo, __from, __len, __copied, __recsize) : \ + __kfifo_from_user(__kfifo, __from, __len, __copied); \ +}) \ +) + +/** + * kfifo_to_user - copies data from the fifo into user space + * @fifo: address of the fifo to be used + * @to: where the data must be copied + * @len: the size of the destination buffer + * @copied: pointer to output variable to store the number of copied bytes + * + * This macro copies at most @len bytes from the fifo into the + * @to buffer and returns -EFAULT/0. + * + * Note that with only one concurrent reader and one concurrent + * writer, you don't need extra locking to use these macro. + */ +#define kfifo_to_user(fifo, to, len, copied) \ +__kfifo_uint_must_check_helper( \ +({ \ + typeof((fifo) + 1) __tmp = (fifo); \ + void __user *__to = (to); \ + unsigned int __len = (len); \ + unsigned int *__copied = (copied); \ + const unsigned int __recsize = sizeof(*__tmp->rectype); \ + struct __kfifo *__kfifo = &__tmp->kfifo; \ + (__recsize) ? \ + __kfifo_to_user_r(__kfifo, __to, __len, __copied, __recsize) : \ + __kfifo_to_user(__kfifo, __to, __len, __copied); \ +}) \ +) + +/** + * kfifo_out_peek - gets some data from the fifo + * @fifo: address of the fifo to be used + * @buf: pointer to the storage buffer + * @n: max. number of elements to get + * + * This macro get the data from the fifo and return the numbers of elements + * copied. The data is not removed from the fifo. + * + * Note that with only one concurrent reader and one concurrent + * writer, you don't need extra locking to use these macro. + */ +#define kfifo_out_peek(fifo, buf, n) \ +__kfifo_uint_must_check_helper( \ +({ \ + typeof((fifo) + 1) __tmp = (fifo); \ + typeof((buf) + 1) __buf = (buf); \ + unsigned long __n = (n); \ + const unsigned int __recsize = sizeof(*__tmp->rectype); \ + struct __kfifo *__kfifo = &__tmp->kfifo; \ + if (0) { \ + typeof(__tmp->ptr) __dummy __attribute__ ((unused)) = NULL; \ + __buf = __dummy; \ + } \ + (__recsize) ? \ + __kfifo_out_peek_r(__kfifo, __buf, __n, __recsize) : \ + __kfifo_out_peek(__kfifo, __buf, __n); \ +}) \ +) + +#define kfifo_peek_locked(fifo, buf, n) \ +__kfifo_uint_must_check_helper( \ +({ \ + unsigned int __ret; \ + uv_mutex_t __lock = ((struct __kfifo*)fifo)->lock; \ + uv_mutex_lock(&__lock); \ + __ret = kfifo_out_peek(fifo, buf, n); \ + uv_mutex_unlock(&__lock); \ + __ret; \ +}) \ +) + +extern int __kfifo_alloc(struct __kfifo *fifo, unsigned int size, unsigned int esize); + +extern void __kfifo_free(struct __kfifo *fifo); + +extern int __kfifo_init(struct __kfifo *fifo, void *buffer, + unsigned int size, unsigned int esize); + +extern unsigned int __kfifo_in(struct __kfifo *fifo, + const void *buf, unsigned int len); + +extern unsigned int __kfifo_out(struct __kfifo *fifo, + void *buf, unsigned int len); + +extern unsigned int __kfifo_out_peek(struct __kfifo *fifo, + void *buf, unsigned int len); + +extern unsigned int __kfifo_in_r(struct __kfifo *fifo, + const void *buf, unsigned int len, unsigned int recsize); + +extern unsigned int __kfifo_out_r(struct __kfifo *fifo, + void *buf, unsigned int len, unsigned int recsize); + +extern unsigned int __kfifo_len_r(struct __kfifo *fifo, unsigned int recsize); + +extern void __kfifo_skip_r(struct __kfifo *fifo, unsigned int recsize); + +extern unsigned int __kfifo_out_peek_r(struct __kfifo *fifo, + void *buf, unsigned int len, unsigned int recsize); + +extern unsigned int __kfifo_max_r(unsigned int len, unsigned int recsize); + +#endif diff --git a/include/inet_api.h b/include/inet_api.h new file mode 100644 index 0000000..c49936d --- /dev/null +++ b/include/inet_api.h @@ -0,0 +1,51 @@ +#ifndef INET_API_H +#define INET_API_H + + +#ifdef __cplusplus +extern "C" { +#endif + +#define MAX_HTTP_POST_SIZE (1024) + +typedef struct HTTP_POST_ATTACH +{ + char keyName[64]; + char keyValue[MAX_HTTP_POST_SIZE]; + + struct HTTP_POST_ATTACH *next, *prev; +} *PHTTP_POST_ATTACH; + +typedef struct +{ + char *pUserName; + char *pPassword; + char *pSmtpServer; + short smtpPort; +} SMTP_MAIL_CONFIG, *PSMTP_MAIL_CONFIG; + +int InetSmtpSendEmail(const char *pFrom, + const char *pTo[], + const char *pCc[], + const char *pTitle, + const char *pMessage, + const char *pAttach[], + PSMTP_MAIL_CONFIG pConfig); +#define InetHttpsDownloadFile(pURL, pPath, onRespCb, onPrgCb) InetHttpDlFileAsync(pURL, pPath, onRespCb, onPrgCb) +#define InetHttpsWebServicePost(pURL, pPost, onRespCb) InetHttpWebServicePostAsync(pURL, pPost, onRespCb) +int InetCancelDownload(const char *pTaskUuid); + +typedef void (*OnHttpResponse)(void* pData, unsigned int size, const char* pReqUrl, const char* pDlPath, const char* pTaskUuid, int iFinished, void* pUserData); +typedef void (*OnProgressNotify)(const char* pReqUrl, const char* pTaskUuid, unsigned char uPercent, void* pUserData); + +int InetInit(void); +void InetUnInit(void); + +const char* InetHttpDlFileAsync(const char*, const char*, OnHttpResponse, OnProgressNotify, void*); +const char* InetHttpWebServicePostAsync(const char *pURL, const char *pPost, OnHttpResponse onRespCb, void *pData); +int InetHttpUploadFileSync(const char *pURL, const char* pPath, void* pAttachInfo); +//int InetSmtpSendEmail(void); +#ifdef __cplusplus +} +#endif +#endif diff --git a/include/json_struct.h b/include/json_struct.h new file mode 100644 index 0000000..5664316 --- /dev/null +++ b/include/json_struct.h @@ -0,0 +1,150 @@ +#ifndef JSON_STRUCT_H +#define JSON_STRUCT_H +#include + +#include "smart_sound.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define MAX_MUSIC_UUID (256) +#define MAX_MUSIC_URL (2048) + +typedef enum +{ +//****************************************** +// Player <--> Controller +//****************************************** + JSON_ENGINE_P2C = 0, + JSON_ENGINE_C2P, + +//****************************************** +// Configure Req & Rsp +//****************************************** + JSON_ENGINE_CFG_REQ, + JSON_ENGINE_CFG_RSP, + +//****************************************** +// Alarm Req & Rsp +//****************************************** + JSON_ENGINE_ASSISTANT_SYNC_RSP, + JSON_ENGINE_ASSISTANT_NOTIFY, + JSON_ENGINE_ASSISTANT_STATUS, + JSON_ENGINE_ASSISTANT_RUNNING, + +//****************************************** +// Work Day API Req & Rsp +//****************************************** + JSON_ENGINE_WORKDAY_REQ, + +//****************************************** +// PING Cmd +//****************************************** + JSON_ENGINE_PING, + +//****************************************** +// OTA Cmd +//****************************************** + JSON_ENGINE_OTA_REQ, + JSON_ENGINE_OTA_RSP, + +//****************************************** +// LOG System Configure Cmd +//****************************************** + JSON_ENGINE_LOG_CFG_CMD, + +//****************************************** +// WIFI Status Changed Nofify Cmd +//****************************************** + JSON_WIFI_STATUS_NOTIFY, + +//****************************************** +// mcu test Cmd +//****************************************** + JSON_MCU_GUIDE_TEST_CMD, + JSON_MCU_MATRIX_TEST_CMD, + JSON_MCU_TEST_GET_VER_CMD, + + JSON_ENGINE_MAX, +} JSON_ENGINE_TYPE; + +typedef struct +{ + uint32_t playerId; + char musicUuid[MAX_MUSIC_UUID]; + int plySt; + uint32_t curPos; + uint32_t duration; +} PLAYER_TO_CTRL, *PPLAYER_TO_CTRL; + +typedef struct +{ + uint32_t playerId; + char src[MAX_MUSIC_URL]; + char srcUuid[MAX_MUSIC_URL]; + char ttsText[MAX_MUSIC_UUID * 2]; + int skTime; + int plyMode; + int plyListType; + char adSrcType; + int duration; + int volRestoreTime; + char volBegin; + float gain; + char fifo[MAX_MUSIC_UUID]; + char channel; + char bytes; + int sampleRate; + char backGroundUrl[MAX_MUSIC_URL]; +} CTRL_TO_PLAYER, *PCTRL_TO_PLAYER; + +typedef struct +{ + char keyName[MAX_CFG_KEY_NAME]; + char keyValue[MAX_CFG_KEY_VALUE]; + int keyType; +} CFG_API_REQ, *PCFG_API_REQ; + +typedef struct +{ + int red; + int green; + int blue; +} MCU_TEST_GUIDE_CMD, *PMCU_TEST_GUIDE_CMD; + +typedef struct +{ + int level; +} MCU_TEST_MATRIX_CMD, *PMCU_TEST_MATRIX_CMD; + +typedef struct +{ + char McuVer[16]; +} MCU_TEST_VER_CMD, *PMCU_TEST_VER_CMD; + + +typedef struct +{ + char keyName[MAX_CFG_KEY_NAME]; + char keyValue[MAX_CFG_KEY_VALUE]; + int keyType; + int errNo; +} CFG_API_RSP, *PCFG_API_RSP; + +typedef struct +{ + double PING; + int tmSec; + int tmMSec; +} PING_MSG, *PPING_MSG; + +void* Json2Struct(const char* pJsonStr, JSON_ENGINE_TYPE type, int enBase64, int* pErr); +const char* Struct2Json(void* pStruct, JSON_ENGINE_TYPE type, int enBase64, int* pErr); + + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/include/libuv_dbus.h b/include/libuv_dbus.h new file mode 100644 index 0000000..1b8f350 --- /dev/null +++ b/include/libuv_dbus.h @@ -0,0 +1,225 @@ +#ifndef LIBUV_DEBUS_H +#define LIBUV_DEBUS_H +#include "smart_sound.h" + +#include +#include +#include "json_struct.h" +#include "config_engine.h" + +#ifdef __cplusplus +extern "C" { +#endif +#define SAFE_STRING_VALUE(s) (s ? s : "") +#define R16_TINA_KEY_EVENT_PATH ("/dev/input/event2") +#define DBUS_MESSAGE_INTERFACE_NAME "netease.ihw.SmartAudio" + +#define DBUS_PATH_HEAD "/netease/ihw/" +#define DBUS_INTERFACE_HEAD "netease.ihw." + +#define DBUS_MSG_MAX_PAD_SIZE (1024 * 1024 * 2) +#define LIBUV_CURRENT_TIME_S() (uv_hrtime() / 1000000000) +#define LIBUV_CURRENT_TIME_MS() (uv_hrtime() / 1000000) +#define LIBUV_CURRENT_TIME_US() (uv_hrtime() / 1000) +#define MODULE_ALIAS_NAME(i) (strrchr(g_pModInfoTable[i].modAliase, '.') + 1) + +#define HEART_SEND_DELAY (5000) +#define HEART_LOST_DELAY (20000) + +typedef enum +{ + WIFI_CONNECTED = 0, + WIFI_DISCONNECTED = 1, +} WIFI_STATUS; + +typedef struct +{ + int wifi_evt; +} WIFI_STATUS_PRO, *PWIFI_STATUS_PRO; + +typedef struct +{ + int year; + unsigned char days[366]; +} WORKDAY_INFO, *PWORKDAY_INFO; + +typedef struct +{ + int32_t msgSrc; ///< message who send + uint32_t msgDests; ///< who need receive message(not only one) +#if USED_SHM_TO_DBUS + uint32_t tmTickMSec; ///< timestamp of second +#endif + uint32_t busCmd; ///< command of message + uint32_t msgSize; ///< how many bytes of this message + uint32_t msgKey; ///< share key for copy large message + char* pMsg; ///< message context if has + int isBstMsg; +} DBUS_MSG_PACK, *PDBUS_MSG_PACK; + +typedef struct DBUS_MSG_PROC +{ + int msgFrom; ///< 0: Boardcast Msg, 1: P2P Message + DBUS_MSG_PACK msgContent; + + struct DBUS_MSG_PROC *next, *prev; +} *PDBUS_MSG_PROC; + +typedef void (*OnDBusAsyncSendTo)(int err); +typedef PDBUS_MSG_PACK (*OnDBusMessage)(uv_loop_t* pLoop, DBusConnection* pConn, PDBUS_MSG_PACK pMsg); +typedef void (*OnDaemonMsg)(MODULE_NAME modName, int status); +typedef void (*OnKeyEvent)(uint16_t uType, uint16_t uKey, int32_t iValue); + +typedef struct +{ + MODULE_NAME modName; ///< Module Name + const char* modPath; ///< Attach to dbus path + const char* modAliase; ///< Attach to dbus bus name +} MOD_INFO_TABLE, *PMOD_INFO_TABLE; + + +typedef struct +{ + uv_loop_t* pLoop; ///< libuv default main loop + uv_loop_t* pUserLoop; ///< libuv user main loop + DBusConnection* pBus; ///< D-Bus object + MODULE_NAME modName; ///< Process name + const char* pBusName; ///< D-Bus object's interface name + const char* pBusPath; ///< D-Bus object's path name + OnDBusMessage onMsgCb; ///< D-Bus receive message callback + OnKeyEvent onKeyCb; ///< Keyboard event callback + OnDaemonMsg onHblCb; ///< Process HBL event callback + OnCfgMsg onCfgCb; ///< Configure message callback +// unsigned int uDaemon[MODULE_MAX]; ///< Daemon Service +} LIBUV_DBUS_PARAMS, *PLIBUV_DBUS_PARAMS; + +static MOD_INFO_TABLE g_pModInfoTable[] = +{ + {MODULE_CONTROLLER, DBUS_PATH_HEAD"controller", DBUS_INTERFACE_HEAD"controller"}, + {MODULE_ALARM, DBUS_PATH_HEAD"alarm", DBUS_INTERFACE_HEAD"alarm"}, + {MODULE_CALL, DBUS_PATH_HEAD"call", DBUS_INTERFACE_HEAD"call"}, + {MODULE_VOICEENGINE, DBUS_PATH_HEAD"voice_engine", DBUS_INTERFACE_HEAD"voice_engine"}, + {MODULE_PLAYER, DBUS_PATH_HEAD"player", DBUS_INTERFACE_HEAD"player"}, + {MODULE_CONFIGURE, DBUS_PATH_HEAD"config", DBUS_INTERFACE_HEAD"config"}, + {MODULE_OTA, DBUS_PATH_HEAD"ota", DBUS_INTERFACE_HEAD"ota"}, + {MODULE_WIFI, DBUS_PATH_HEAD"wifi", DBUS_INTERFACE_HEAD"wifi"}, + {MODULE_BT, DBUS_PATH_HEAD"bt", DBUS_INTERFACE_HEAD"bt"}, + {MODULE_KPLAYER, DBUS_PATH_HEAD"kplayer", DBUS_INTERFACE_HEAD"kplayer"}, + {MODULE_KPLAYER_TEST, DBUS_PATH_HEAD"kplayerTest", DBUS_INTERFACE_HEAD"kplayerTest"}, + {MODULE_SPLAYER, DBUS_PATH_HEAD"splayer", DBUS_INTERFACE_HEAD"splayer"}, + {MODULE_SPLAYER_TEST, DBUS_PATH_HEAD"splayerTest", DBUS_INTERFACE_HEAD"splayerTest"}, + {MODULE_LIGHT_MCU, DBUS_PATH_HEAD"light_mcu", DBUS_INTERFACE_HEAD"light_mcu"}, + {MODULE_BLUEKC, DBUS_PATH_HEAD"blukc", DBUS_INTERFACE_HEAD"blukc"}, + {MODULE_BLUEKC_TEST, DBUS_PATH_HEAD"bluekcTest", DBUS_INTERFACE_HEAD"bluekcTest"}, + {MODULE_MANUFACTURE, DBUS_PATH_HEAD"manufacture", DBUS_INTERFACE_HEAD"manufacture"}, + {MODULE_BT_DEMO, DBUS_PATH_HEAD"btdemo", DBUS_INTERFACE_HEAD"btdemo"}, + {MODULE_SKINS, DBUS_PATH_HEAD"skins", DBUS_INTERFACE_HEAD"skins"}, + {MODULE_LOG_CTRL, DBUS_PATH_HEAD"logCtrl", DBUS_INTERFACE_HEAD"logCtrl"}, + {MODULE_WIRELESSTEST, DBUS_PATH_HEAD"wirelessTest", DBUS_INTERFACE_HEAD"wirelessTest"}, + {MODULE_WIRELESSTEST_DEMO, DBUS_PATH_HEAD"wirelessTestDemo", DBUS_INTERFACE_HEAD"wirelessTestDemo"}, + {MODULE_MANUFACTURE_CONTROLLER, DBUS_PATH_HEAD"manufacture_controller", DBUS_INTERFACE_HEAD"manufacture_controller"}, + {MODULE_WIFI_DEMO, DBUS_PATH_HEAD"wifiDemo", DBUS_INTERFACE_HEAD"wifiDemo"}, +}; + +PLIBUV_DBUS_PARAMS DBusLibuvGetRuntime(void); +MODULE_NAME DBusLibGetModName(void); +uv_loop_t* GetDBusDefaultLoop(void); + +void RunUVLoop(uv_loop_t *pLoop); + +PDBUS_MSG_PACK DBusGetMessage(void); +void DBusMsgCleanup(PDBUS_MSG_PACK pMsg); + +DBusConnection* DBusWithLibuvInit(uv_loop_t* pUserLoop, + const char* pBusName, + OnDBusMessage cbOnMsg, + OnDaemonMsg cbOnHbl, + OnKeyEvent cbOnKey, + int* pErrno); + +int DBusJsonSendToCommandAsync(DBusConnection* pBus, + const char* pBusName, + uint32_t busCmd, + JSON_ENGINE_TYPE type, + void* pStruct, + int iSize, + OnDBusAsyncSendTo cbSendTo, + int enBase64); + +int DBusJsonSendToCommand(DBusConnection* pBus, + const char* pBusName, + uint32_t busCmd, + JSON_ENGINE_TYPE type, + void* pStruct, + int enBase64); + +int DBusJsonBoardcastCommand(DBusConnection* pBus, + uint32_t msgToMask, + uint32_t busCmd, + JSON_ENGINE_TYPE type, + void* pStruct, + int enBase64); + +int DBusBoardcastCommand(DBusConnection *pBus, + uint32_t msgToMask, + uint32_t busCmd, + const char *pContext); + +int DBusSendToCommand(DBusConnection *pBus, + const char *pBusName, + uint32_t busCmd, + const char *pContext); + +void HeartDaemonUpgrade(int iWatcher); +void HeartDaemonInit(MODULE_NAME mod, int msHblTout, OnDaemonMsg cb); +void HeartDaemonHblCheck(void); + +int DBusWithLibuvCfgInit(OnCfgMsg cbOnCfgMsg); +int GetShellExecResult(const char *pCmd, char **pResult); +int CopyFile(const char *pSrc, const char *pDest); +int CopyFileWithSize(const char *pSrc, const char *pDest, int iSize); +int ReadFileToBuf(const char *pSrc, unsigned char *pBuf, int iSize); +void SystemSafeReboot(void); + +typedef void (*OnAlarmTimer)(unsigned int tmId, unsigned int status, void* pUserData); +int AlarmTimerInit(uv_loop_t *pLoop); +int AlarmTimerCleanup(void); +int AlarmTimerRemove(unsigned int tmId); +#if 0 +unsigned int AlarmTimerAdd(struct tm *pOnTime, unsigned int repMode, OnAlarmTimer pOnTimerCb, void *pUserData, int *pError); +#endif +unsigned int AlarmTimerAdd(int year, + int month, + int day, + int hour, + int minute, + int second, + int weekDay, + int repMode, + OnAlarmTimer pOnTimerCb, + int priority, + void *pUserData, + int *pError); + +int CurrentIsWorkDay(int year, int day); +const char* DumpTimerRepeatModeString(int mode); +unsigned long long GetPartitionFreeSize(const char *pPartPath); +WIFI_STATUS GetCurrWIFIConnStatus(void); +const char* ErrcodeToString(int errCode); +const char* DBusCmdToString(DBUS_CMD cmd); +const char* ModuleNameToString(MODULE_NAME modName); + +char* GetCpuSerial(void); +char* GetCpuChipId(void); +char* GetCurrentVersion(void); + +void CfgFileInit(void); +int CfgGetIntValue(const char* pTags, int defValue); +char* CfgGetStringValue(const char* pTags, char* pDefValue); +double CfgGetFloatValue(const char* pTags, double defValue); +int CfgGetBoolValue(const char* pTags, int defValue); +void SetHBLAutoExit(int flag); +#ifdef __cplusplus +} +#endif +#endif diff --git a/include/log.h b/include/log.h new file mode 100644 index 0000000..118d79c --- /dev/null +++ b/include/log.h @@ -0,0 +1,233 @@ +/** @file log.h + @brief + @details + @version 1.0.0 +*/ +#ifndef LOG_H_ +#define LOG_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef __KERNEL__ +#include +#include +#else +#include +#endif + +#ifndef TRUE +#define TRUE (1) +#endif + +#ifndef FALSE +#define FALSE (0) +#endif + +#ifndef MAX +/** @def MAX + @brief 取最大值 +*/ +#define MAX(a, b) (((a) > (b)) ? (a) : (b)) +#endif + +#ifndef MIN +/** @def MIN + @brief 取最小值 +*/ +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) +#endif + +#define TIMEZONE_EAST_8H (8 * 3600) + +#ifndef __KERNEL__ +#define DUMP_PREFIX_ADDRESS (1) +#define DUMP_PREFIX_OFFSET (2) +#endif + +#define DEBUG_SQL_CALLBACK_DATA(argc, argv, azColName) do { \ + for(int i = 0; i < argc; i++) { \ + fprintf(stdout, "%s = [%s], ", azColName[i], argv[i]); \ + } \ + fprintf(stdout, "\n"); \ +} while(0); + +#define print(format, ...) fprintf(stdout, format, __VA_ARGS__) + +typedef struct +{ + int cfgCmd; + int iParams1; + int iParams2; +} LOG_CFG_PROTOCOL, *PLOG_CFG_PROTOCOL; + +typedef enum +{ + CMD_LOG_ENABLE = 0, + CMD_LOG_FILE = 1, + CMD_LOG_MAIL = 2, + CMD_LOG_LEVEL = 3, + CMD_LOG_NETWORK = 4, + CMD_LOG_SERVER = 5 +} LOG_CFG_CMD; + +/** @enum _LOG_LEVEL_ + * LOG等级枚举变量 + */ +typedef enum +{ + LOG_Fatal = (1 << 0), + LOG_Error = (1 << 1), + LOG_Warn = (1 << 2), + LOG_Debug = (1 << 3), + LOG_Info = (1 << 4), + LOG_Test = (1 << 5), + LOG_Call = (1 << 6), + LOG_Devp = (1 << 7), + LOG_Step = (1 << 8), + LOG_Unknown = (1 << 9), + LOG_All = (0xFFFFFFFF), + LOG_Close = 0x0, +} LOG_LEVEL; +/** @var typedef _LOG_LEVEL_ LOG_LEVEL + * @brief 错误值枚举类型 + */ + +#ifdef DISABLE_LOG +#define LOG_BUF(level, buf, len) +#define LOG_EX(level, format, args...) +#define LOG_EX2(level, format, args...) +#define LOG_TAG_EX(tag, level, format, args...) +#define DEBUG_CODE_LINE() +#define DEBUG_FUNCTION_BEGIN() +#define DEBUG_FUNCTION_END() +#else +#define LOG_BUF(level, buf, len) do { \ + const char* pFmtBuf = format_hex_buf("", DUMP_PREFIX_ADDRESS, 16, 1, buf, len, 1); \ + IHW_LOG(level, "[%s] - %s(%d): %s[0-%d]:\n%s", basename_v2(__FILE__), __FUNCTION__, __LINE__, \ + #buf, len, pFmtBuf); \ + free((void*)pFmtBuf); \ +} while(0); +/*! \def LOG_EX + \brief 系统日志调试宏标识 +*/ +#define LOG_EX(level, format, args...) (IHW_LOG(level, "[%s] - %s(%d):" format , basename_v2(__FILE__), __FUNCTION__, __LINE__, ##args)) + +/*! \def LOG_TAG_EX + \brief 系统日志调试宏标识 +*/ +#define LOG_TAG_EX(tag, level, format, args...) (IHW_LOG(level, "{%s} [%s] %s(%d):" format , tag, basename_v2(__FILE__), __FUNCTION__, __LINE__, ##args)) + +#define LOG_EX2(level, format, args...) (IHW_LOG_UNTAG(level, format , ##args)) + +/*! @def APP_BUILD_INFO + @brief 应用程序编译信息 +*/ +#define APP_BUILD_INFO(appname, appver) (IHW_LOG(LOG_Info, "%s Ver:%s (Build: %s %s GCC Ver:%s) With %d(bits) OS\n", \ + appname, appver, __DATE__, __TIME__, __VERSION__, sizeof(int*) * 8)) + + +/*! @def DEBUG_CODE_LINE + @brief 输出当前函数名,行号 +*/ +#define DEBUG_CODE_LINE() (LOG_EX(LOG_Info, "\n")) + +/*! @def DEBUG_FUNCTION_BEGIN + @brief 函数入口标志 +*/ +#define DEBUG_FUNCTION_BEGIN() (LOG_EX(LOG_Call, "+++++\n")) + +/*! @def DEBUG_FUNCTION_END + @brief 函数出口标志 +*/ +#define DEBUG_FUNCTION_END() (LOG_EX(LOG_Call, "-----\n")) + +/** + * @brief 输出调试信息 + * @param level 调试信息开关 + * @param pMsg 调试信息内容 + */ +void IHW_LOG(LOG_LEVEL level, const char* pMsg, ...); +void IHW_LOG_UNTAG(LOG_LEVEL level, const char* pMsg, ...); + +void IHW_LogStrWithoutPrint(int level, char* pMsg); +void IHW_LogRawString(int level, char* pMsg); + +/** + * @brief 设置调试等级 + * @param level 调试等级 + * @param iEnable 1 打开调试等级, 0 关闭调试等级 + */ +void IHW_EnableLogLevel(LOG_LEVEL level, int iEnable); + +/** + * @brief 初始化系统日志功能 + * @param pLogTag 系统日志标志 + * @param pPath 系统日志保存路径 + * @param bEnable 打开/关闭调试信息 + */ +void IHW_InitLOG(const char* pLogTag, const char* pPath, int bEnable); + +void IHW_RunLogService(void); + +/** + * @brief 判断文件、路径是否存在 + * @param pPath - 文件路径 + * @return int 存在返回 1, 否则返回 0; + */ +int IHW_IsFileExist(const char* pPath); + +void IHW_EnableLogOut(void); +void IHW_DisableLogOut(void); + +char* IHW_bin2hex(char *p, const unsigned char *cp, int count); + +void UpgradLogConfigure(PLOG_CFG_PROTOCOL pCfg); +//void LogUploadCurLogFile(void); + +/* Return the last part of a pathname */ +static inline const char* basename_v2(const char* path) +{ + const char* tail = strrchr(path, '/'); + return tail ? tail + 1 : path; +} + +static inline int dirname_v2(const char* path, char* dir) +{ + const char* tail = strrchr(path, '/'); + + if(tail) + { + memcpy(dir, path, tail - path); + dir[tail - path] = 0; + } + else + { + strcpy(dir, "./"); + } + + return 0; +} +#endif + +const char* LogLeveToString(LOG_LEVEL lv); + +const char* format_hex_buf(const char* prefix_str, int prefix_type, + int rowsize, int groupsize, + const void* buf, int len, int ascii); +#ifndef __KERNEL__ +void print_hex_dump_bytes(const char* prefix_str, int prefix_type, + const void* buf, int len); +#endif + +int HttpPostLogFile(char* pSession); +//void UploadLogFile(char* pFilePath); +int SysPointMarkUpload(void); +int SysPointMark(char* pMarkInfo); +int SysPointMarkInit(char* pDevId, int iMaxSize, int iPostTime); +#ifdef __cplusplus +} +#endif +#endif //LOG_H_ + diff --git a/include/log_info.h b/include/log_info.h new file mode 100644 index 0000000..cd24c61 --- /dev/null +++ b/include/log_info.h @@ -0,0 +1,13 @@ +#ifndef LOG_INFO_H +#define LOG_INFO_H + +#ifdef __cplusplus +extern "C" { +#endif + + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/include/monitor.h b/include/monitor.h new file mode 100644 index 0000000..e5f8513 --- /dev/null +++ b/include/monitor.h @@ -0,0 +1,21 @@ +#ifndef _MONITOR_H +#define _MONITOR_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef ENABLE_COUNT_DEBUG +int MonAddNewItem(const char* pName, int logSaveTime); +int MonIncreaseCount(const char* pName); +int MonUpgradeStatistical(const char* pName, long newVal); +int MonDiffStatistical(const char* pName, long long newVal); +int MonItemLogout(const char* pName); +int MonitorInit(void); +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/ota.h b/include/ota.h new file mode 100644 index 0000000..7d4be75 --- /dev/null +++ b/include/ota.h @@ -0,0 +1,156 @@ +#ifndef OTA_H +#define OTA_H +#ifdef __cplusplus +extern "C" { +#endif + +#define SIZE_1K (1024) ///< 1K 字节大小 +#define MD5_CHKSUM_LEN (16) ///< MD5校验和长度 +#define MD5_CHKSUM_STR_LEN (MD5_CHKSUM_LEN * 2 + 1) ///< MD5校验和字符串格式长度 +#define NO_OTA_STATUS_VAL_TAG (0) ///< 状态默认值 + + +/** + * 系统启动模式定义 + */ +typedef enum +{ + NORMAL_SETUP = 0x1234, ///< 普通启动模式 + RECOVERY_SETUP, ///< 恢复模式 + SYSTEM_OTA, ///< OTA升级模式 + SYSTEM_OTA_OK, +} SETUP_MODE; + +/** + * OTA状态命令定义 + */ +typedef enum +{ + OTA_CURRENT_VERSION = 0, ///< 当前系统版本号 + OTA_CURRENT_SETUP_MODE, ///< 当前系统启动模式 + OTA_CURRENT_REBOOT_TIME, ///< 当前系统未正常启动次数 + OTA_DOWNLOAD_FILE, ///< OTA升级包下载状态 + OTA_DOWNLOAD_PROGRESS, ///< OTA升级包下载进度 + OTA_VERIFY_FILE, ///< 文件校验结果 + OTA_VERIFY_PARTITION, ///< OTA分区校验结果 + OTA_DECOMPRESS_FILE, ///< OTA当前进度:解压文件 + OTA_UPGRADE_READY, ///< OTA更新准备完成 + OTA_UPGRADE_START, ///< OTA更新开始 + OTA_UPGRADE_PARTITION, ///< OTA写入分区数据 + OTA_RECOVERY_START, ///< OTA恢复模式启动 + OTA_REREQ_OTA_NOW, ///< OTA请求立即执行OTA更新系统 + OTA_REBOOT_SYSTEM, ///< OTA准备重启系统 + OTA_SUCCESED, ///< OTA执行成功 + OTA_UNKNOWN_CMD, ///< 位置OTA状态命令 + OTA_ERR_CODE, ///< OTA过程异常 + OTA_DISK_FULL, ///< 存储空间不足 +} OTA_STATUS_TYPE; + + +/** + * OTA模式 + */ +typedef enum +{ + OTA_MODE_NORMAL = 9029, ///< 普通OTA更新模式 + OTA_MODE_FORCE_NOW, ///< 强制OTA更新模式 + OTA_MODE_RECOVERY, ///< OTA恢复模式 +} OTA_MODE; + + +/** + * OTA操作命令 + */ +typedef enum +{ + OTA_CMD_DOWNLOAD = 1234, ///< 下载OTA升级包 + OTA_CMD_USED_LOCAL_IMAGE, ///< 从上次备份的OTA升级包升级 + OTA_CMD_EXEC, ///< 开始OTA更新系统 +} OTA_CMD; + + + +/** + * OTA级包信息 + * + */ +typedef struct +{ + char url[SIZE_1K]; ///< URL, Base64编码 + char md5[MD5_CHKSUM_STR_LEN]; ///< OTA升级包MD5校验和 + unsigned int size; ///< OTA升级包文件大小 +} OTA_FILE_INFO, *POTA_FILE_INFO; + +/** + * 控制中心控制命令协议 + * + * @see OTA_CMD + * @see OTA_MODE + * @see OTA_FILE_INFO + */ +typedef struct +{ + int version; ///< OTA版本号 + OTA_CMD otaCmd; ///< OTA命令 + OTA_MODE otaMode; ///< OTA模式 + OTA_FILE_INFO otaFileInfo; ///< OTA升级包信息 +} OTA_DATA_INFO, *POTA_DATA_INFO; + +/** + * OTA状态信息协议 + * + * @see OTA_STATUS_TYPE + */ +typedef struct +{ + OTA_STATUS_TYPE status; ///< 状态命令 + int val; ///< 状态值 +} OTA_RSP_STATUS, *POTA_RSP_STATUS; + +static inline const char* otaStatusName(OTA_STATUS_TYPE type) +{ + switch(type) + { + case OTA_CURRENT_VERSION: + return ("OTA_CURRENT_VERSION"); + case OTA_CURRENT_SETUP_MODE: + return ("OTA_CURRENT_SETUP_MODE"); + case OTA_CURRENT_REBOOT_TIME: + return ("OTA_CURRENT_REBOOT_TIME"); + case OTA_DOWNLOAD_FILE: + return ("OTA_DOWNLOAD_FILE"); + case OTA_DOWNLOAD_PROGRESS: + return ("OTA_DOWNLOAD_PROGRESS"); + case OTA_VERIFY_FILE: + return ("OTA_VERIFY_FILE"); + case OTA_VERIFY_PARTITION: + return ("OTA_VERIFY_PARTITION"); + case OTA_DECOMPRESS_FILE: + return ("OTA_DECOMPRESS_FILE"); + case OTA_UPGRADE_READY: + return ("OTA_UPGRADE_READY"); + case OTA_UPGRADE_START: + return ("OTA_UPGRADE_START"); + case OTA_UPGRADE_PARTITION: + return ("OTA_UPGRADE_PARTITION"); + case OTA_RECOVERY_START: + return ("OTA_RECOVERY_START"); + case OTA_REREQ_OTA_NOW: + return ("OTA_REREQ_OTA_NOW"); + case OTA_REBOOT_SYSTEM: + return ("OTA_REBOOT_SYSTEM"); + case OTA_SUCCESED: + return ("OTA_SUCCESED"); + case OTA_UNKNOWN_CMD: + return ("OTA_UNKNOWN_CMD"); + case OTA_ERR_CODE: + return ("OTA_ERR_CODE"); + default: + return ("Unknown Type"); + } +} +#ifdef __cplusplus +} +#endif +#endif + diff --git a/include/server_addr.h b/include/server_addr.h new file mode 100644 index 0000000..1a11667 --- /dev/null +++ b/include/server_addr.h @@ -0,0 +1,48 @@ +#ifndef SERVER_ADDR_H +#define SERVER_ADDR_H +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum +{ + YUNXIN_MODULE = 0, + VOICE_MODULE = 1, + VOICE_AI_MODULE = 2, + SERVER_MODULE = 3, + LOG_MODULE = 4, + MARK_POINT_MODULE = 5, + TTS_MODULE = 6, + DC_MODULE = 7, + MAX_MODULE +} SERVER_MODULE_TYPE; + +typedef enum +{ + DEV_MODE = 0, + TEST_MODE = 1, + PUBLISH_MODE = 2, + MAX_MODE +} SERVER_MODE_TYPE; + +typedef enum +{ + VOICE_APP_KEY = 0, + VOICE_APP_SECRET = 1, + VOICE_MAX +} VOICE_KEYMAP_TYPE; + +const char* SvrModeStr(SERVER_MODE_TYPE mode); +const char* SvrModuleStr(SERVER_MODULE_TYPE module); +void DumpCurServerAddr(const char* pTags); + +void ServerManagerInit(void); +SERVER_MODE_TYPE GetCurrentServerMode(void); +void SetCurrentServerMode(SERVER_MODE_TYPE mode); + +char* GetCurServerAddr(SERVER_MODULE_TYPE module); +char* GetCurVoiceKeyValue(VOICE_KEYMAP_TYPE keyMap); +#ifdef __cplusplus +} +#endif +#endif diff --git a/include/skins.h b/include/skins.h new file mode 100644 index 0000000..1403813 --- /dev/null +++ b/include/skins.h @@ -0,0 +1,58 @@ +#ifndef SKINS_H +#define SKINS_H +#ifdef __cplusplus +extern "C" { +#endif + +#define MD5_STR_LEN (36) ///< +#define MAX_KEY_NAME (64) +#define MAX_KEY_PATH (256) + +#define SKIN_MODE_NAME ("ModuleSkin") +#define RES_MODE_NAME ("ModuleRes") +#define RES_TBL_NAME "res" +#define SKIN_TBL_NAME "skin" +#define SKIN_USER_DB "user_db" + +#define CREATE_SKIN_TBL_SQL "CREATE TABLE IF NOT EXISTS %s"SKIN_TBL_NAME" (" \ + "ID INTEGER PRIMARY KEY AUTOINCREMENT," \ + "keyName TEXT NOT NULL," \ + "resType INTEGER NOT NULL," \ + "priority INTEGER NOT NULL," \ + "resID INTEGER NOT NULL," \ + "resReadme TEXT NOT NULL DEFAULT \'\');" + +#define CREATE_RES_TBL_SQL "CREATE TABLE IF NOT EXISTS %s"RES_TBL_NAME" (" \ + "ID INTEGER PRIMARY KEY AUTOINCREMENT," \ + "resVersion TEXT NOT NULL," \ + "localPath TEXT NOT NULL," \ + "serverURL TEXT NOT NULL," \ + "md5Chksum TEXT NOT NULL);" + +typedef enum +{ + VOICE_RES = 1, + IMAGE_RES, + TEXT_RES, +} SKINS_RES_TYPE; + +typedef struct +{ + SKINS_RES_TYPE resType; + const char *pResVer; + const char *pKeyName; + const char *pLocalPath; + const char *pMD5Chksum; +} SKIN_RES_INFO, *PSKIN_RES_INFO; + +int SkinInit(void); +char* GetSkinsResource(char *pKeyName, int *pResType, int *pVersion, char **pComeFrom); +int SkinUpgrade(char *pUpdFilePath); +void SkinIsVerifyRes(int isVerify); +unsigned int SkinsDefaultSize(void); +PSKIN_RES_INFO SkinsItemById(int iId); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/include/skins_res.h b/include/skins_res.h new file mode 100644 index 0000000..8e3fb8f --- /dev/null +++ b/include/skins_res.h @@ -0,0 +1,294 @@ +#ifndef SKINS_RES_H +#define SKINS_RES_H + +#include "skins.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef PLATFORM_CPU +#define SKINS_DB_PATH ("./skins.db") +#define DEF_SKINS_ROOT_PATH "/home/hx/MyProjects/release/drivers/skins/" +#else +#define SKINS_DB_PATH ("/mnt/UDISK/skins.db") +#define DEF_SKINS_ROOT_PATH "/usr/share/resource/" +#endif + +#define EMU_HTTP_URL_ROOT "http://10.240.84.163/resource/" + +#if 0 +#define TEXT_WIFIPARING_APPARINGANDCONNECTING ("接收到WIFI配置参数,开始连接,可能时间比较长,请耐心等待") +#define TEXT_BT_WIFIPARING ("进入蓝牙网络配对模式") +#define TEXT_AP_WIFIPARING ("进入AP网络配对模式") +#define TEXT_WIFICONNECTED ("联网成功") +#define TEXT_SYSTEMBOOT ("很高兴遇见你,我是如意") +#define TEXT_NOTRECVINGWIFICONFIG ("没有收到网络配置信息") +#define TEXT_BLE_SUUCCESS_WAIT_CONFIG ("低功耗蓝牙已连接,等待配网") +#define TEXT_AP_WAIT_CONFIG ("当前在AP配网模式,等待配网") +#define TEXT_WIFINOTCONNECT ("网络未连接") +#define TEXT_REQSERVER_ERROR ("服务器请求失败,请重新配网") +#define TEXT_BLE_CONNECT ("ble已连接") +#define TEXT_BLE_DISCONNECT ("ble已断开") +#define TEXT_WIFIPARINGSUCCESS ("网络配对成功") +#define TEXT_BT_ON ("开启传统蓝牙") +#define TEXT_BT_OFF ("关闭传统蓝牙") +#define TEXT_ALARM_REMOVE_ALL ("删除全部闹钟成功") +#define TEXT_ALARM_REMOVE ("删除闹钟成功") +#define TEXT_ALARM_ADD ("闹钟设置成功") +#define TEXT_AP_APP_CONNECTED ("APP已通过wifi连接音箱") +#define TEXT_WIFICONNECT_ERR_REPARING ("wifi联网失败,请重新配网") +#define TEXT_WIFICONNECT_ERR_PASS ("ssid或密码错误,请重新配网") +#define TEXT_WIFIPARING_ERR_SERVERCONNECT ("服务器连接失败,请重新配网") +#define TEXT_NOT_UNSUPPORT ("不支持当前操作") +#define TEXT_BOOT_DONE ("你好,欢迎使用如意音箱") +#define TEXT_WIFIPARING_FIRST_NOTICE ("请使用网易云音乐APP ,进入账号页面 为音箱配网,请下载如意音响APP,为音箱配网") +#endif + +const SKIN_RES_INFO g_SkinDefaultResTable[] = { + /////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /// voice resources + /////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#ifndef RES_FACTORY_MODE + {VOICE_RES, "0", "v102", DEF_SKINS_ROOT_PATH"voice/Alianwang002.mp3", "2ecc61d16a3ee0f02c4e580f00396d1f"}, +#endif + {VOICE_RES, "0", "v103", DEF_SKINS_ROOT_PATH"voice/Alianwang003.mp3", "33c00781480680a9ea5ef6be1f7ac258"}, + {VOICE_RES, "0", "v104", DEF_SKINS_ROOT_PATH"voice/Alianwang004.mp3", "d8ee9527dd6635f7251b455fcf177723"}, + {VOICE_RES, "0", "v105", DEF_SKINS_ROOT_PATH"voice/Alianwang005.mp3", "87849f3c844a42d765e85631ccfca2eb"}, + {VOICE_RES, "0", "v106", DEF_SKINS_ROOT_PATH"voice/Alianwang006.mp3", "46a63182f73e242fff7f202fc621ef17"}, + {VOICE_RES, "0", "v107", DEF_SKINS_ROOT_PATH"voice/Alianwang007.mp3", "fc02f25d84abfe066fd4ae8c140fe5f7"}, + {VOICE_RES, "0", "v108", DEF_SKINS_ROOT_PATH"voice/Alianwang008.mp3", "da772f7fcec24ebcd85bc3d9fe323f88"}, + {VOICE_RES, "0", "v109", DEF_SKINS_ROOT_PATH"voice/Alianwang009.mp3", "22b8163a5956bb877db55d38f1223cb2"}, + {VOICE_RES, "0", "v110", DEF_SKINS_ROOT_PATH"voice/Alianwang010.mp3", "5d83539bcb59558dd53352b898512227"}, + {VOICE_RES, "0", "v111", DEF_SKINS_ROOT_PATH"voice/Alianwang011.mp3", "58de437b7778885481678cc48bc4b592"}, + {VOICE_RES, "0", "v112", DEF_SKINS_ROOT_PATH"voice/Alianwang012.mp3", "0e1d0afc6663a73c5aa5d9de0072b8df"}, + {VOICE_RES, "0", "v113", DEF_SKINS_ROOT_PATH"voice/Alianwang013.mp3", "f495927bf6b5c67991685e751f2fca40"}, + {VOICE_RES, "0", "v114", DEF_SKINS_ROOT_PATH"voice/Alianwang014.mp3", "06b0f3de13c21c60ab73253ee16f36b3"}, + {VOICE_RES, "0", "v202", DEF_SKINS_ROOT_PATH"voice/Ashiyong002.mp3", "e825e5c5b6989afb88d4084ffe1eff01"}, + {VOICE_RES, "0", "v203", DEF_SKINS_ROOT_PATH"voice/Ashiyong003.mp3", "d7245a20b4a3597894e6af8a83770044"}, + {VOICE_RES, "0", "v204", DEF_SKINS_ROOT_PATH"voice/Ashiyong004.mp3", "d546fe1b69f8ba62c14acd299ae5bc7e"}, + {VOICE_RES, "0", "v205", DEF_SKINS_ROOT_PATH"voice/Ashiyong005.mp3", "79df29d63ac4ea40546f0274b7dd3c84"}, + {VOICE_RES, "0", "v206", DEF_SKINS_ROOT_PATH"voice/Ashiyong006.mp3", "7f47f1796e125078778556d62bd573e2"}, + {VOICE_RES, "0", "v301", DEF_SKINS_ROOT_PATH"voice/S001.mp3", "eee1506b7ed801e5aa6a6ccc18c0c1f1"}, + {VOICE_RES, "0", "v302", DEF_SKINS_ROOT_PATH"voice/S002.mp3", "c90dbc04cda7bdb778a9cb196eb208a2"}, + {VOICE_RES, "0", "v303", DEF_SKINS_ROOT_PATH"voice/S003.mp3", "89340aa9f735d082d9404bae014d7bae"}, + {VOICE_RES, "0", "v304", DEF_SKINS_ROOT_PATH"voice/S004-1.mp3", "2a03648026864291cf0aad7bf6569734"}, + {VOICE_RES, "0", "v3041", DEF_SKINS_ROOT_PATH"voice/S004-2.mp3", "33cafc99de51b53afc97156866e82473"}, + {VOICE_RES, "0", "v3042", DEF_SKINS_ROOT_PATH"voice/S004-3.mp3", "0a1057342a661597730b521427d6097c"}, + {VOICE_RES, "0", "v3043", DEF_SKINS_ROOT_PATH"voice/S004-4.mp3", "c8061b90c50558c155ddc9ffef114e61"}, + {VOICE_RES, "0", "v3044", DEF_SKINS_ROOT_PATH"voice/S004-5.mp3", "97f94d1350bc09c9e974525172ad8fc0"}, + {VOICE_RES, "0", "v305", DEF_SKINS_ROOT_PATH"voice/S005.mp3", "2e7a489501b76c73e5aa4be4f7e7aa5f"}, + {VOICE_RES, "0", "v306", DEF_SKINS_ROOT_PATH"voice/S006.mp3", "437ddb3e99f77696d60c2f28c1b268cb"}, + {VOICE_RES, "0", "v307", DEF_SKINS_ROOT_PATH"voice/S007.mp3", "a6c6be6f702b5b47ddebad61d28eb1ad"}, + {VOICE_RES, "0", "v308", DEF_SKINS_ROOT_PATH"voice/S008.mp3", "5918f635de28b45f2d32e3eb4b05b9ad"}, + {VOICE_RES, "0", "v309", DEF_SKINS_ROOT_PATH"voice/S009.mp3", "f9039012752b3ed2a00f173aa305acf1"}, + {VOICE_RES, "0", "v310", DEF_SKINS_ROOT_PATH"voice/S010.mp3", "446ec757495bdf7aee31a41a9efe8bab"}, + {VOICE_RES, "0", "v311", DEF_SKINS_ROOT_PATH"voice/S011.mp3", "e9fa92d8929dcb2e134f42c1cedf4827"}, + {VOICE_RES, "0", "v401", DEF_SKINS_ROOT_PATH"voice/b-h-01.mp3", "68ecfbab58563071b6663a348a39a51b"}, + {VOICE_RES, "0", "v402", DEF_SKINS_ROOT_PATH"voice/b-h-50.mp3", "017b53f7610f6dd99e21b546e6b35605"}, + {VOICE_RES, "0", "v403", DEF_SKINS_ROOT_PATH"voice/b-h-51.mp3", "422b4550253780343b7a9805ca7b629a"}, + {VOICE_RES, "0", "v5011", DEF_SKINS_ROOT_PATH"voice/a-a-01.mp3", "5d9d186ef50b603ab84a9abbfd348630"}, + {VOICE_RES, "0", "v5012", DEF_SKINS_ROOT_PATH"voice/a-a-02.mp3", "837a2222c961824e98c0d3751a234ae6"}, + {VOICE_RES, "0", "v5013", DEF_SKINS_ROOT_PATH"voice/a-a-03.mp3", "0ec34a1f19ee7cea6b139d214e59026d"}, + {VOICE_RES, "0", "v502", DEF_SKINS_ROOT_PATH"voice/a-n-01.mp3", "b1eb13ed8c9afaa2989763c3d379b39a"}, + + /////////////////////////////////////////////////////////////////////////////////////////////////////////// + /// picture resources + /////////////////////////////////////////////////////////////////////////////////////////////////////////// + {IMAGE_RES, "0", "p001", DEF_SKINS_ROOT_PATH"image/IconChaozuo001.jpg", "0d4aa6351cc71daf2c699e42c1b74cde"}, + {IMAGE_RES, "0", "p005", DEF_SKINS_ROOT_PATH"image/IconChaozuo005.jpg", "1ceca68b9e7d49c537376a08c07a2b88"}, + {IMAGE_RES, "0", "p101", DEF_SKINS_ROOT_PATH"image/IconLianjie001.jpg", "236dbc343bd1d0c5e651f33900a13c07"}, + {IMAGE_RES, "0", "p102", DEF_SKINS_ROOT_PATH"image/IconLianjie002.jpg", "c627364aec00131589fc942c902c65bc"}, + {IMAGE_RES, "0", "p103", DEF_SKINS_ROOT_PATH"image/IconLianjie003.jpg", "edb04af03cf7c7e4d29aee43c332235b"}, + {IMAGE_RES, "0", "p201", DEF_SKINS_ROOT_PATH"image/IconNaozhong001.jpg", "bd5e7a00b4902ca971684d6ee021fb06"}, + {IMAGE_RES, "0", "p302", DEF_SKINS_ROOT_PATH"image/Iconstart002.gif", "90f2b52b1399348debcec2f447dbd383"}, + {IMAGE_RES, "0", "p401", DEF_SKINS_ROOT_PATH"image/IconTixing001.jpg", "feff2fbedffc955b491e0349385ef6c3"}, + {IMAGE_RES, "0", "p500", DEF_SKINS_ROOT_PATH"image/Iconyinliang000.jpg", "a0c29ad20d51cf86e808c83ee90b6510"}, + {IMAGE_RES, "0", "p501", DEF_SKINS_ROOT_PATH"image/Iconyinliang001.jpg", "196ba4082358d3238d0dcb0035764465"}, + {IMAGE_RES, "0", "p502", DEF_SKINS_ROOT_PATH"image/Iconyinliang002.jpg", "196ba4082358d3238d0dcb0035764465"}, + {IMAGE_RES, "0", "p503", DEF_SKINS_ROOT_PATH"image/Iconyinliang003.jpg", "196ba4082358d3238d0dcb0035764465"}, + {IMAGE_RES, "0", "p504", DEF_SKINS_ROOT_PATH"image/Iconyinliang004.jpg", "d3157ec3c194e4cc6dbcbe683fd40d3f"}, + {IMAGE_RES, "0", "p505", DEF_SKINS_ROOT_PATH"image/Iconyinliang005.jpg", "3f857b11062aeddaa6061e7cabfde044"}, + {IMAGE_RES, "0", "p506", DEF_SKINS_ROOT_PATH"image/Iconyinliang006.jpg", "3f857b11062aeddaa6061e7cabfde044"}, + {IMAGE_RES, "0", "p507", DEF_SKINS_ROOT_PATH"image/Iconyinliang007.jpg", "64a461ee34bea341879aa5a08c717705"}, + {IMAGE_RES, "0", "p508", DEF_SKINS_ROOT_PATH"image/Iconyinliang008.jpg", "b932b0b1c7766c6a995ce3e63b2b7422"}, + {IMAGE_RES, "0", "p509", DEF_SKINS_ROOT_PATH"image/Iconyinliang009.jpg", "dce1278710e1831f02d8dd4fd5d0aac6"}, + {IMAGE_RES, "0", "p510", DEF_SKINS_ROOT_PATH"image/Iconyinliang010.jpg", "b9ac1d7469b34d2aabe04d849c4f1112"}, + {IMAGE_RES, "0", "p511", DEF_SKINS_ROOT_PATH"image/Iconyinliang011.jpg", "45e001edc7d973b15434334ad7f77771"}, + {IMAGE_RES, "0", "p512", DEF_SKINS_ROOT_PATH"image/Iconyinliang012.jpg", "c9c22063c381e5cb775c82b105dce0f1"}, + {IMAGE_RES, "0", "p513", DEF_SKINS_ROOT_PATH"image/Iconyinliang013.jpg", "6e06e51e83498185d148070c0643852c"}, + {IMAGE_RES, "0", "p514", DEF_SKINS_ROOT_PATH"image/Iconyinliang014.jpg", "6e06e51e83498185d148070c0643852c"}, + {IMAGE_RES, "0", "p515", DEF_SKINS_ROOT_PATH"image/Iconyinliang015.jpg", "694a1698c16539805ed4ee238f36586c"}, + {IMAGE_RES, "0", "p516", DEF_SKINS_ROOT_PATH"image/Iconyinliang016.jpg", "0e7e847191e429618c6684ae89d30ac6"}, + {IMAGE_RES, "0", "p517", DEF_SKINS_ROOT_PATH"image/Iconyinliang017.jpg", "a18f5107ada535d664b2483b02080e70"}, + {IMAGE_RES, "0", "p518", DEF_SKINS_ROOT_PATH"image/Iconyinliang018.jpg", "d64992577a379c0faed0078dde767fcc"}, + {IMAGE_RES, "0", "p519", DEF_SKINS_ROOT_PATH"image/Iconyinliang019.jpg", "58268a96482df75c97a177371d295bd3"}, + {IMAGE_RES, "0", "p520", DEF_SKINS_ROOT_PATH"image/Iconyinliang020.jpg", "81ffbdc7857790696e3a7e353bd86908"}, + {IMAGE_RES, "0", "p601", DEF_SKINS_ROOT_PATH"image/Iconlianwang001.gif", "9e18565313b6b1769b7c5979a248dbd6"}, + {IMAGE_RES, "0", "p605", DEF_SKINS_ROOT_PATH"image/Iconlianwang005.gif", "ee81f49fe49864d4cbc4f7f9a1ec52c0"}, + {IMAGE_RES, "0", "p703", DEF_SKINS_ROOT_PATH"image/IconZhuangtai003.gif","e2bdf79f8c2825c23ffbb0233328df97"}, + + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /// tts resources + /////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#if 0 + {{TEXT_RES, 0, "wifiparing_apparingandconnecting", ""}, "", TEXT_WIFIPARING_APPARINGANDCONNECTING, ""}, + {{TEXT_RES, 0, "bt_wifiparing", ""}, "", TEXT_BT_WIFIPARING, ""}, + {{TEXT_RES, 0, "ap_wifiparing", ""}, "", TEXT_AP_WIFIPARING, ""}, + {{TEXT_RES, 0, "wificonnected", ""}, "", TEXT_WIFICONNECTED, ""}, + {{TEXT_RES, 0, "systemboot", ""}, "", TEXT_SYSTEMBOOT, ""}, + {{TEXT_RES, 0, "notrecvingwificonfig", ""}, "", TEXT_NOTRECVINGWIFICONFIG, ""}, + {{TEXT_RES, 0, "ble_suuccess_wait_config", ""}, "", TEXT_BLE_SUUCCESS_WAIT_CONFIG, ""}, + {{TEXT_RES, 0, "ap_wait_config", ""}, "", TEXT_AP_WAIT_CONFIG, ""}, + {{TEXT_RES, 0, "wifinotconnect", ""}, "", TEXT_WIFINOTCONNECT, ""}, + {{TEXT_RES, 0, "reqserver_error", ""}, "", TEXT_REQSERVER_ERROR, ""}, + {{TEXT_RES, 0, "ble_connect", ""}, "", TEXT_BLE_CONNECT, ""}, + {{TEXT_RES, 0, "ble_disconnect", ""}, "", TEXT_BLE_DISCONNECT, ""}, + {{TEXT_RES, 0, "wifiparingsuccess", ""}, "", TEXT_WIFIPARINGSUCCESS, ""}, + {{TEXT_RES, 0, "bt_on", ""}, "", TEXT_BT_ON, ""}, + {{TEXT_RES, 0, "bt_off", ""}, "", TEXT_BT_OFF, ""}, + {{TEXT_RES, 0, "alarm_remove_all", ""}, "", TEXT_ALARM_REMOVE_ALL, ""}, + {{TEXT_RES, 0, "alarm_remove", ""}, "", TEXT_ALARM_REMOVE, ""}, + {{TEXT_RES, 0, "alarm_add", ""}, "", TEXT_ALARM_ADD, ""}, + {{TEXT_RES, 0, "ap_app_connected", ""}, "", TEXT_AP_APP_CONNECTED, ""}, + {{TEXT_RES, 0, "wificonnect_err_reparing", ""}, "", TEXT_WIFICONNECT_ERR_REPARING, ""}, + {{TEXT_RES, 0, "wificonnect_err_pass", ""}, "", TEXT_WIFICONNECT_ERR_PASS, ""}, + {{TEXT_RES, 0, "wifiparing_err_serverconnect", ""}, "", TEXT_WIFIPARING_ERR_SERVERCONNECT, ""}, + {{TEXT_RES, 0, "not_unsupport", ""}, "", TEXT_NOT_UNSUPPORT, ""}, + {{TEXT_RES, 0, "boot_done", ""}, "", TEXT_BOOT_DONE, ""}, + {{TEXT_RES, 0, "wifiparing_first_notice", ""}, "", TEXT_WIFIPARING_FIRST_NOTICE, ""}, +#endif +}; + +static const SKIN_RES_INFO g_emuUpgradeInfo[] = { + {VOICE_RES, "1", "v001", EMU_HTTP_URL_ROOT"android.txt", "8dc557037b69c69efd5615cdfc06934a"}, + {VOICE_RES, "1", "v001", EMU_HTTP_URL_ROOT"applying-patches.txt", "8d65812b01d64c9df1529509083e189d"}, + {VOICE_RES, "1", "v001", EMU_HTTP_URL_ROOT"atomic_ops.txt", "0d6a66d951ed4747aeee1aa7ab99d8d3"}, + {VOICE_RES, "1", "v001", EMU_HTTP_URL_ROOT"bad_memory.txt", "e81b536c2095eb53f9209e26b914f426"}, + {VOICE_RES, "1", "v001", EMU_HTTP_URL_ROOT"basic_profiling.txt", "1c70596bd41eb49077af5e91e16d2967"}, + {VOICE_RES, "1", "v001", EMU_HTTP_URL_ROOT"binfmt_misc.txt", "8936b928d685bdf98f83f1b3e86562a4"}, + {VOICE_RES, "1", "v001", EMU_HTTP_URL_ROOT"braille-console.txt", "4263bbce1595bdb3923bcb7885f866f5"}, + {VOICE_RES, "1", "v001", EMU_HTTP_URL_ROOT"bt8xxgpio.txt", "3a61d033e71cff3c75c778dad89ac565"}, + {VOICE_RES, "1", "v105", EMU_HTTP_URL_ROOT"btmrvl.txt", "f5ce90fb4a0ef97d23914fef37fba39d"}, + {VOICE_RES, "1", "v105", EMU_HTTP_URL_ROOT"bus-virt-phys-mapping.txt", "23fedac31d1b6ee5dae644ed86cc2c37"}, + {VOICE_RES, "1", "v105", EMU_HTTP_URL_ROOT"cachetlb.txt", "5db6b816869d89822759bca684024430"}, + {VOICE_RES, "1", "v105", EMU_HTTP_URL_ROOT"circular-buffers.txt", "3be2b7f00c13b160d5dba390b2ee8a54"}, + {VOICE_RES, "1", "v105", EMU_HTTP_URL_ROOT"clk.txt", "e60704c45037f922a73f49fc827b5225"}, + {VOICE_RES, "1", "v206", EMU_HTTP_URL_ROOT"coccinelle.txt", "379a83726bbf8f2ffbb12ba454788909"}, + {VOICE_RES, "1", "v206", EMU_HTTP_URL_ROOT"cpu-hotplug.txt", "e3676063c62c556a94ebf3b9296db82f"}, + {VOICE_RES, "1", "v206", EMU_HTTP_URL_ROOT"cpu-load.txt", "d9d096434110f5c017ab27ea397cee1d"}, + {VOICE_RES, "1", "v206", EMU_HTTP_URL_ROOT"cputopology.txt", "4ead2141d532dfaf1057cd2964ced3f4"}, + {VOICE_RES, "1", "v206", EMU_HTTP_URL_ROOT"crc32.txt", "644ff3d58c8ab6ca0c5c721dc78e7343"}, + {VOICE_RES, "1", "v206", EMU_HTTP_URL_ROOT"dcdbas.txt", "ad88b9a2d9b547a81ec3f28006a897bc"}, + {VOICE_RES, "1", "v309", EMU_HTTP_URL_ROOT"debugging-modules.txt", "c3b0d7040e83f85b5593dac628b3ffa5"}, + {VOICE_RES, "1", "v309", EMU_HTTP_URL_ROOT"debugging-via-ohci1394.txt", "a58d95e96be1ca24c5946c6636c4e041"}, + {VOICE_RES, "1", "v309", EMU_HTTP_URL_ROOT"dell_rbu.txt", "d5324f7ddcfbf19eb00e4c81bbb5cb7f"}, + {VOICE_RES, "1", "v309", EMU_HTTP_URL_ROOT"devices.txt", "8aa73c9268a9012eecbbb78fc4e4cc68"}, + {VOICE_RES, "1", "v309", EMU_HTTP_URL_ROOT"digsig.txt", "44b680ee0b743d63f9d0d2849e39d982"}, + {VOICE_RES, "1", "v309", EMU_HTTP_URL_ROOT"DMA-API-HOWTO.txt", "3225970a70a6a79c5112ff29b8f99ec6"}, + {VOICE_RES, "1", "v310", EMU_HTTP_URL_ROOT"DMA-API.txt", "3110d6930bd1c4c692c741f960310810"}, + {VOICE_RES, "1", "v310", EMU_HTTP_URL_ROOT"DMA-attributes.txt", "1ccc7f613bde5312a6a7452e8381d518"}, + {VOICE_RES, "1", "v311", EMU_HTTP_URL_ROOT"dma-buf-sharing.txt", "303f87732efc9effee0d6ed16e89ee37"}, + {VOICE_RES, "1", "v303", EMU_HTTP_URL_ROOT"dmaengine.txt", "80881dc6b0c7c9761be617a8f2e5eee3"}, + {VOICE_RES, "1", "v303", EMU_HTTP_URL_ROOT"DMA-ISA-LPC.txt", "a0b20e82cadca3595c95a9b7909a2120"}, + {VOICE_RES, "1", "v303", EMU_HTTP_URL_ROOT"dynamic-debug-howto.txt", "d15ef07d9fae98de0e096897da1e06ab"}, + {VOICE_RES, "1", "v303", EMU_HTTP_URL_ROOT"edac.txt", "a83b6d68f9e4c2d03ac619f912c13eb9"}, + {VOICE_RES, "1", "v202", EMU_HTTP_URL_ROOT"eisa.txt", "cae33ca2a108401d9465a0589503b845"}, + {VOICE_RES, "1", "v202", EMU_HTTP_URL_ROOT"email-clients.txt", "a1e6b9470ea752cf97a99ebcb9594aa0"}, + {VOICE_RES, "1", "v202", EMU_HTTP_URL_ROOT"feature-removal-schedule.txt", "e45405d2fac3a3bf87b26b3faeaad5de"}, + {VOICE_RES, "1", "v202", EMU_HTTP_URL_ROOT"flexible-arrays.txt", "03bfe3a8cb65aecdc96f710a140b8c27"}, + {VOICE_RES, "1", "v202", EMU_HTTP_URL_ROOT"futex-requeue-pi.txt", "684984d4f7026c76533ad7f247136ef4"}, + {VOICE_RES, "1", "v202", EMU_HTTP_URL_ROOT"gcov.txt", "fb711ca5323092e285f2e0b59a574009"}, + {VOICE_RES, "1", "v202", EMU_HTTP_URL_ROOT"gpio.txt", "13417a2589abd22672e8c109e5c57e8e"}, + {VOICE_RES, "1", "v202", EMU_HTTP_URL_ROOT"highuid.txt", "1c3e14d700b302d76b1bca29325a4a8e"}, + {VOICE_RES, "1", "v202", EMU_HTTP_URL_ROOT"hw_random.txt", "6c78af2ee2fab6ae30aca725c3970da1"}, + {VOICE_RES, "1", "v202", EMU_HTTP_URL_ROOT"hwspinlock.txt", "2ac1e75e3ee30099527e344287340b0a"}, + {VOICE_RES, "1", "v111", EMU_HTTP_URL_ROOT"initrd.txt", "c889974503df36fc073c891e6d9b8b0a"}, + {VOICE_RES, "1", "v111", EMU_HTTP_URL_ROOT"init.txt", "bdbcc42bf6ae739157092a7fa64aaaac"}, + {VOICE_RES, "1", "v111", EMU_HTTP_URL_ROOT"Intel-IOMMU.txt", "e693ef88d3d7d42c7a65a23f3975aa97"}, + {VOICE_RES, "1", "v111", EMU_HTTP_URL_ROOT"intel_txt.txt", "9dd22fd4de8b9e718fefc96c15b994c8"}, + {VOICE_RES, "1", "v111", EMU_HTTP_URL_ROOT"io-mapping.txt", "a7785b478117c65839749521fc020dc3"}, + {VOICE_RES, "1", "v111", EMU_HTTP_URL_ROOT"io_ordering.txt", "f7a404c9794d133f9167ff1a7e2953bb"}, + {VOICE_RES, "1", "v111", EMU_HTTP_URL_ROOT"iostats.txt", "4248f808a42956c73b79032686ae77bb"}, + {VOICE_RES, "1", "v111", EMU_HTTP_URL_ROOT"IPMI.txt", "8b8bc6bf4528e8d82017113c17d58a37"}, + {VOICE_RES, "1", "v111", EMU_HTTP_URL_ROOT"IRQ-affinity.txt", "d89c8d406a2618cc19db636ba81ce4ca"}, + {VOICE_RES, "1", "v110", EMU_HTTP_URL_ROOT"IRQ-domain.txt", "ec9bde5aa997211d7ded9658cfde4fff"}, + {VOICE_RES, "1", "v110", EMU_HTTP_URL_ROOT"irqflags-tracing.txt", "b8ca946951177d2cb8099feb9c4587e2"}, + {VOICE_RES, "1", "v110", EMU_HTTP_URL_ROOT"IRQ.txt", "0ef9f8f98b9eac9336c0ffb95cfc1d65"}, + {VOICE_RES, "1", "v110", EMU_HTTP_URL_ROOT"isapnp.txt", "ab111f0d42d1e748d9745c09e7ff935b"}, + {VOICE_RES, "1", "v110", EMU_HTTP_URL_ROOT"java.txt", "fbe28a3d11651fd214ad1d897700fd4f"}, + {VOICE_RES, "1", "v110", EMU_HTTP_URL_ROOT"kernel-doc-nano-HOWTO.txt", "28579d296e40e460678d0587991e9d48"}, + {VOICE_RES, "1", "v110", EMU_HTTP_URL_ROOT"kernel-docs.txt", "afc6fd5cdcc8b49ba794bcf5382ff2c3"}, + {VOICE_RES, "1", "v110", EMU_HTTP_URL_ROOT"kernel-parameters.txt", "2dc9abd6790fd24c3e841f15d0d24a38"}, + {VOICE_RES, "1", "v110", EMU_HTTP_URL_ROOT"kmemcheck.txt", "b301c758aed537468e98183bd04dc15d"}, + {VOICE_RES, "1", "v110", EMU_HTTP_URL_ROOT"kmemleak.txt", "b5108533723c0a616e8723e009244d55"}, + {VOICE_RES, "1", "v110", EMU_HTTP_URL_ROOT"kobject.txt", "d47cf170cd9ce2aaca082fa322b3c271"}, + {VOICE_RES, "1", "v110", EMU_HTTP_URL_ROOT"kprobes.txt", "7a4c60ba6c646746ca64a311b24a7919"}, + {VOICE_RES, "1", "v110", EMU_HTTP_URL_ROOT"kref.txt", "e6ee109e7185aafc4efe67cad2576352"}, + {VOICE_RES, "1", "v201", EMU_HTTP_URL_ROOT"ldm.txt", "3492835c4e3f2340ef0a0d5af464b962"}, + {VOICE_RES, "1", "v201", EMU_HTTP_URL_ROOT"local_ops.txt", "809dba9261b3704813557cccaeb3d83d"}, + {VOICE_RES, "1", "v201", EMU_HTTP_URL_ROOT"lockdep-design.txt", "b5379d04c39758d7f979d8c6c459285b"}, + {VOICE_RES, "1", "v201", EMU_HTTP_URL_ROOT"lockstat.txt", "c672433097ed3823b84bea98cafbb921"}, + {VOICE_RES, "1", "v201", EMU_HTTP_URL_ROOT"lockup-watchdogs.txt", "36c72be9bf511bd0e76975f7987f97a2"}, + {VOICE_RES, "1", "v201", EMU_HTTP_URL_ROOT"logo.txt", "c12e6a02a126220ed420586143f96d7e"}, + {VOICE_RES, "1", "v201", EMU_HTTP_URL_ROOT"magic-number.txt", "2baed34f647a4dab43357718050ded53"}, + {VOICE_RES, "1", "v201", EMU_HTTP_URL_ROOT"mca.txt", "1ea3eab396d5433f30952ad1b30ab133"}, + {VOICE_RES, "1", "v304", EMU_HTTP_URL_ROOT"md.txt", "6cdd602644e47836f0cb357e910a4db7"}, + {VOICE_RES, "1", "v304", EMU_HTTP_URL_ROOT"media-framework.txt", "1f3f9ba9afc6c1323df2c03160b4db4d"}, + {VOICE_RES, "1", "v304", EMU_HTTP_URL_ROOT"memory-barriers.txt", "1b2369bd78d18c2f80c23ca3ab2fb8d8"}, + {VOICE_RES, "1", "v304", EMU_HTTP_URL_ROOT"memory-hotplug.txt", "e9bc23bc43814ef7fbe2bcd89692c55b"}, + {VOICE_RES, "1", "v304", EMU_HTTP_URL_ROOT"memory.txt", "c17ccb89201a46532f3b95fee4adc372"}, + {VOICE_RES, "1", "v304", EMU_HTTP_URL_ROOT"mono.txt", "da6d7823007522089fc4bfefc1752b16"}, + {VOICE_RES, "1", "v108", EMU_HTTP_URL_ROOT"mutex-design.txt", "278a8bef9b14c136939715738cc0f0e8"}, + {VOICE_RES, "1", "v108", EMU_HTTP_URL_ROOT"nommu-mmap.txt", "9f4e01823e63aec8b42bf523389664fc"}, + {VOICE_RES, "1", "v108", EMU_HTTP_URL_ROOT"numastat.txt", "bebd74fc4713e1500702be1a90113f74"}, + {VOICE_RES, "1", "v108", EMU_HTTP_URL_ROOT"oops-tracing.txt", "87f1184ede24989279c9a1dfa1ccfae1"}, + {VOICE_RES, "1", "v108", EMU_HTTP_URL_ROOT"padata.txt", "bd3486df46e488dd75d1e67b2bb52da9"}, + {VOICE_RES, "1", "v108", EMU_HTTP_URL_ROOT"parport-lowlevel.txt", "a7d58201239229037269d4fd7ba720ac"}, + {VOICE_RES, "1", "v108", EMU_HTTP_URL_ROOT"parport.txt", "fa8d7291a3e7d5c2afe5a2060a0abb50"}, + {VOICE_RES, "1", "v108", EMU_HTTP_URL_ROOT"pi-futex.txt", "492ac92f69716bfaa0c40a909c992ade"}, + {VOICE_RES, "1", "v107", EMU_HTTP_URL_ROOT"pinctrl.txt", "9b7c710bba0b9aaae7e4f3794a548511"}, + {VOICE_RES, "1", "v107", EMU_HTTP_URL_ROOT"pnp.txt", "a7338b790fd6b30b4071fcacbfcedc4e"}, + {VOICE_RES, "1", "v107", EMU_HTTP_URL_ROOT"preempt-locking.txt", "5b7ed3fd44bb218e897492667b316a56"}, + {VOICE_RES, "1", "v107", EMU_HTTP_URL_ROOT"printk-formats.txt", "8eaefbea3500e15cc155045b3d3ef39c"}, + {VOICE_RES, "1", "v107", EMU_HTTP_URL_ROOT"prio_tree.txt", "1b079f5eac72227ecee86a7693ae8f69"}, + {VOICE_RES, "1", "v107", EMU_HTTP_URL_ROOT"ramoops.txt", "b50016891d7184720439346f362083e3"}, + {VOICE_RES, "1", "v107", EMU_HTTP_URL_ROOT"rbtree.txt", "a35e53c01ecfe9fbc534425504b8f408"}, + {VOICE_RES, "1", "v107", EMU_HTTP_URL_ROOT"remoteproc.txt", "d9599a6eda47e17ade41491b1106db22"}, + {VOICE_RES, "1", "v107", EMU_HTTP_URL_ROOT"rfkill.txt", "d86dc1dc7f27a25692b40cb739a88a09"}, + {VOICE_RES, "1", "v107", EMU_HTTP_URL_ROOT"robust-futex-ABI.txt", "32be0a8a71053b3258c8dc13c8e3f981"}, + {VOICE_RES, "1", "v333", EMU_HTTP_URL_ROOT"robust-futexes.txt", "1ac8f369bc00680aa40e8dfd3bc766c3"}, + {VOICE_RES, "1", "v333", EMU_HTTP_URL_ROOT"rpmsg.txt", "67b8fcf7e064b15d910e6ef41b944984"}, + {VOICE_RES, "1", "v333", EMU_HTTP_URL_ROOT"rtc.txt", "51577c35a6c713e85bc4325dde78f1f9"}, + {VOICE_RES, "1", "v333", EMU_HTTP_URL_ROOT"rt-mutex-design.txt", "25703f95e001b8ab0a92ec7e22f85527"}, + {VOICE_RES, "1", "v333", EMU_HTTP_URL_ROOT"rt-mutex.txt", "b449bdf78dad3a5ff62eb7a0853c0c99"}, + {VOICE_RES, "1", "v333", EMU_HTTP_URL_ROOT"SAK.txt", "bb81ce113927582c1513704f360129fd"}, + {VOICE_RES, "1", "v333", EMU_HTTP_URL_ROOT"serial-console.txt", "814e90de90e893f56eb12cc536dc7d42"}, + {VOICE_RES, "1", "v333", EMU_HTTP_URL_ROOT"sgi-ioc4.txt", "f4e0584fa5b55907435c3374c6ae6601"}, + {VOICE_RES, "1", "v333", EMU_HTTP_URL_ROOT"sgi-visws.txt", "0bb26ebbfc96a898f54126d5762cd3de"}, + {VOICE_RES, "1", "v203", EMU_HTTP_URL_ROOT"SM501.txt", "58ce960675582f8414019f33a27e1260"}, + {VOICE_RES, "1", "v203", EMU_HTTP_URL_ROOT"sparse.txt", "8bc3d0ada8ca01475d69431cd9cd4ec0"}, + {VOICE_RES, "1", "v203", EMU_HTTP_URL_ROOT"spinlocks.txt", "d903caeac016182fd7bb349af658bb1a"}, + {VOICE_RES, "1", "v203", EMU_HTTP_URL_ROOT"stable_api_nonsense.txt", "ca2acd6fd94048b5b03b213922d962b5"}, + {VOICE_RES, "1", "v203", EMU_HTTP_URL_ROOT"stable_kernel_rules.txt", "3948439142160832a55510a93746b738"}, + {VOICE_RES, "1", "v203", EMU_HTTP_URL_ROOT"static-keys.txt", "6d801dd48021a20394a7eaa82f0b758d"}, + {VOICE_RES, "1", "v203", EMU_HTTP_URL_ROOT"svga.txt", "ffc4306708801c3489dc575998ecca43"}, + {VOICE_RES, "1", "v203", EMU_HTTP_URL_ROOT"sync.txt", "381c9f8905dfc34f66eef3e3e486f0d1"}, + {VOICE_RES, "1", "v203", EMU_HTTP_URL_ROOT"sysfs-rules.txt", "84cfa60b3ba436be5acd54034bc15c84"}, + {VOICE_RES, "1", "v204", EMU_HTTP_URL_ROOT"sysrq.txt", "f24e71d4fed0257178078b820927791b"}, + {VOICE_RES, "1", "v204", EMU_HTTP_URL_ROOT"unaligned-memory-access.txt", "a5a387aeec918a0f528f85bcb76bc8c5"}, + {VOICE_RES, "1", "v204", EMU_HTTP_URL_ROOT"unicode.txt", "fd815b4b43d0cf5a85ca44d0db76dde7"}, + {VOICE_RES, "1", "v204", EMU_HTTP_URL_ROOT"unshare.txt", "a3ca54a1d655c512654510e56b4c8e53"}, + {VOICE_RES, "1", "v204", EMU_HTTP_URL_ROOT"vgaarbiter.txt", "802d04a400dfb5959711fe8088c62f01"}, + {VOICE_RES, "1", "v204", EMU_HTTP_URL_ROOT"VGA-softcursor.txt", "88c93a1b83277f3fc3fb07de148fd726"}, + {VOICE_RES, "1", "v204", EMU_HTTP_URL_ROOT"video-output.txt", "60ab68e5be73008948e8f1426db0941b"}, + {VOICE_RES, "1", "v204", EMU_HTTP_URL_ROOT"volatile-considered-harmful.txt", "8983aa37ffb5d56400e7f54ca9aa88d6"}, + {VOICE_RES, "1", "v204", EMU_HTTP_URL_ROOT"workqueue.txt", "6fadee709d10fbbdc4ed587020dbb9b7"}, + {VOICE_RES, "1", "v204", EMU_HTTP_URL_ROOT"xz.txt", "4c3cdd3cc9795936719f90c5998e444d"}, + {VOICE_RES, "1", "v904", EMU_HTTP_URL_ROOT"zorro.txt", "5afccd5699a870edbaeeb4842171e637"} +}; +#ifdef __cplusplus +} +#endif +#endif diff --git a/include/smart_sound.h b/include/smart_sound.h new file mode 100644 index 0000000..5647275 --- /dev/null +++ b/include/smart_sound.h @@ -0,0 +1,507 @@ +#ifndef SMART_SOUND_H +#define SMART_SOUND_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define CMD_BT_AVK_OPEN CMD_BT_BREDR_ENABLE +#define CMD_BT_AVK_CLOSE CMD_BT_BREDR_DISABLE + +//***************************************************************** +//* Global Configure +//***************************************************************** +#define USED_SHM_TO_DBUS (0) // used shm for dbus transfer data +#ifndef MAX_PATH +#define MAX_PATH (256) +#endif + +//************************************************************* + +typedef enum { + MODULE_CONTROLLER = 0, + MODULE_ALARM, + MODULE_CALL, + MODULE_VOICEENGINE, + MODULE_PLAYER, + MODULE_CONFIGURE, + MODULE_OTA, + MODULE_WIFI, + MODULE_BT, + MODULE_KPLAYER, + MODULE_KPLAYER_TEST, + MODULE_SPLAYER, + MODULE_SPLAYER_TEST, + MODULE_LIGHT_MCU, + MODULE_BLUEKC, + MODULE_BLUEKC_TEST, + MODULE_MANUFACTURE, + MODULE_BT_DEMO, + MODULE_SKINS, + MODULE_LOG_CTRL, + MODULE_WIRELESSTEST, + MODULE_WIRELESSTEST_DEMO, + MODULE_MANUFACTURE_CONTROLLER, + MODULE_WIFI_DEMO, + MODULE_MAX, +} MODULE_NAME; + +typedef enum { + CMD_MISC_PING = 0x0000, + CMD_MISC_OTA, + CMD_MISC_WEATHER, + CMD_MISC_NOWTIME, + CMD_MISC_UPGRADE, + CMD_SYSTEM_STANDBY, + CMD_MISC_QUERY_OTA_STATUS, + CMD_MISC_QUERY_DL_STATUS, + CMD_MISC_CHANGE2TEST, + CMD_MISC_CHANGE2ONLINE, + + CMD_SEARCH_PLAYER_REQ, + CMD_SEARCH_PLAYER_RESP, + + CMD_PROCESS_START, + + CMD_CALL_DIAL = 0x0300, + CMD_CALL_ACCEPI, + CMD_CALL_HANGUP, + CMD_CALL_MESSAGE, + + CMD_PLAY_MODECHANGE = 0x0600, + CMD_PLAY_PLAY, + CMD_PLAY_PAUSE, + CMD_PLAY_STOP, + CMD_PLAY_SEEKTO, + CMD_PLAY_SHOWMODE, + CMD_PLAY_NEXT, + CMD_PLAY_PRE, + CMD_PLAY_SEEKTO_PLAY, + CMD_PLAY_SHOWLIST, + CMD_PLAY_UPDATELIST, + CMD_PLAY_PREPARE_NEXT, + CMD_PLAY_ADDTOLIST, + CMD_PLAY_DELETEFROMLIST, + CMD_PLAY_RESETLIST, + CMD_PLAY_VOL_SET, + CMD_PLAY_VOL_RESTORE, + CMD_PLAY_MAX, + + CMD_PLAY_AUDIO_STOP = 0x0700, + CMD_PLAY_AUDIO_PLAY, + CMD_PLAY_AUDIO_MAX, + + CMD_SE_PLAY = 0x0780, + CMD_SE_PLAYER_STATE_NTF, + + CMD_MUSIC_PCM_PLAY = 0X0790, + CMD_MUSIC_PCM_PAUSE = 0X0791, + CMD_MUSIC_PCM_STOP = 0X0792, + CMD_MUSIC_PCM_MAX, + + CMD_PLAYER_MAX = 0X07FF, + + CMD_PLAY_RET_STATUS = 0x0800, + + CMD_CFG_ADD_REQ = 0x0900, + CMD_CFG_ADD_RSP, + CMD_CFG_CHANGE_REQ, + CMD_CFG_CHANGE_RSP, + CMD_CFG_GET_REQ, + CMD_CFG_GET_RSP, + CMD_CFG_UPG_NOTIFY, + + CMD_MSC_MSG_CONTROLLER_RECOG_SUCCESS = 0x0a00, + CMD_MSC_MSG_CONTROLLER_RECOG_ERROR, + CMD_MSC_MSG_CONTROLLER_WAKEUP, + CMD_MSC_MSG_CONTROLLER_SESSION_BEGIN, + CMD_MSC_MSG_CONTROLLER_RECOGING, + CMD_CC_MSC_BEGIN_SESSION, + CMD_CC_MSC_END_SESSION, + CMD_CONTROLLER_REQMSG_INITARGS, + CMD_CONTROLLER_RSPMSG_INITARGS, + CMD_CONTROLLER_REQMSG_PLAYERSTATUS, + CMD_CONTROLLER_RSPMSG_PLAYERSTATUS, + CMD_MSC_REQMSG_MIC_CONTROL, + CMD_MSC_RSPMSG_MIC_CONTROL, + CMD_NDUILITE_FESPA_SET_ARG, + CMD_YUNXIN_RECVMSG, + CMD_YUNXIN_SENDMSG, + CMD_YUNXIN_SENDMSG_BYPASS, + CMD_YUNXIN_SENDMSGCB, + CMD_CONTROLLER_MSG_YUNXIN, + CMD_YUNXIN_STATUS, + CMD_YUNXIN_SYSMSG, + + CMD_WIFI_CONF = 0x0b00, + CMD_WIFI_CONF_RESP, + CMD_WIFI_AUTO_CONN, + CMD_WIFI_AUTO_CONN_RESP, + CMD_WIFI_AUTO_CONN_OUT, + CMD_WIFI_STATE_REQ, + CMD_WIFI_STATE_RESP, + CMD_WIFI_STATE_NTF, + CMD_WIFI_CHANGE_VALID_AP, + CMD_WIFI_CHANGE_VALID_AP_OUT, + CMD_WIFI_CHANGE_VALID_AP_RESP, + + CMD_BT_NAME_GET_REQ, + CMD_BT_NAME_GET_RESP, + CMD_BT_EVT_NTF, + CMD_BT_CREATED, + + CMD_BT_RESET, + CMD_BT_BREDR_ENABLE, // 0xb10 + CMD_BT_BREDR_DISABLE, // 0xb11 + + CMD_BT_AVK_SOUND_OPEN, + CMD_BT_AVK_SOUND_CLOSE, + + CMD_BT_AVK_CON_EVT, + CMD_BT_AVK_DISC_EVT, + + CMD_BT_AVK_CON_DEV, + CMD_BT_AVK_DISC_DEV, + CMD_BT_AVK_PLAY, + CMD_BT_AVK_PAUSE, + CMD_BT_AVK_STOP, + CMD_BT_AVK_PRE, + CMD_BT_AVK_NEXT, + CMD_BT_AVK_VOL_UP, + CMD_BT_AVK_VOL_DOWN, + + CMD_BT_AVK_SOUND_START_EVT, // 0xb1f + CMD_BT_AVK_SOUND_STOP_EVT, // 0xb20 + + CMD_BT_LE_ENABLE, // 0xb21 + CMD_BT_LE_DISABLE, + CMD_BT_LE_NEVSPS_DISC, + + CMD_BT_AVK_CRTED, + CMD_BT_AVK_DELETED, + + CMD_BT_AVK_RC_PLAY, + CMD_BT_AVK_RC_PAUSE, + + CMD_WIFI_UNBIND_ACCOUNT, + CMD_BT_VOL_CHANGE, + + CMD_BT_BREDR_REBOOT_CLOSE, + + CMD_KPLAYER_START = 0x1b00, + CMD_KPLAYER_STOP, + CMD_KPLAYER_NOTIF_DUR, + CMD_KPLAYER_HOST_ACTION, + CMD_KPLAYER_CTR_NTF_BASE = 0x1c00, + CMD_KPLAYER_CTR_CREATED, + CMD_KPLAYER_CTR_DELED, + CMD_KPLAYER_CTR_PLAY, + CMD_KPLAYER_CTR_STOP, + CMD_KPLAYER_CTR_PAUSE, + CMD_KPLAYER_CTR_SEEK, + CMD_KPLAYER_CTR_SET_URL, + CMD_KPLAYER_CTR_SET_VOLUME, + CMD_KPLAYER_CTR_SET_MUTE, + CMD_KPLAYER_CTR_SET_NXT_URL, + CMD_KPLAYER_CTR_SET_NEXT, + CMD_KPLAYER_CTR_SET_PREV, + + CMD_SPLAYER_SFIFO_TEST = 0x1d00, + CMD_SPLAYER_START, + CMD_SPLAYER_STOP, + CMD_SPLAYER_HOST_ACTION, + + CMD_SPLAYER_CTR_NTF_BASE = 0x1e00, + CMD_SPLAYER_MSG_TYPE_CREATE, + CMD_SPLAYER_MSG_TYPE_DEL, + CMD_SPALYER_MSG_TYPE_START, + CMD_SPLAYER_MSG_TYPE_STOP, + CMD_SPLAYER_MSG_TYPE_SET_VOLUME, + CMD_SPLAYER_MSG_TYPE_STREAMING, + CMD_SPLAYER_MSG_TYPE_DESTRY, + CMD_SPLAYER_MSG_TYPE_DURATION, + CMD_SPLAYER_MSG_TYPE_STREAM_NTF, + CMD_SPLAYER_MSG_TYPE_STREAM_PLAYPAUSE, + + CMD_BLUEKC_POOL_TEST = 0x1f00, + CMD_BLUEKC_LOG_DEBUG, + CMD_BLUEKC_LOG_RESTORE, + + // 厂测 + CMD_TEST_GET_VER_REQ = 0X2000, + CMD_TEST_GET_VER_RESP, + CMD_TEST_GET_MCU_VER_REQ, + CMD_TEST_GET_MCU_VER_RESP, + CMD_TEST_KNOB_REQ, + CMD_TEST_KNOB_RESP, + CMD_TEST_BUTTON_REQ, + CMD_TEST_BUTTON_RESP, + CMD_TEST_GET_VOLUME_REQ, + CMD_TEST_GET_VOLUME_RESP, + CMD_TEST_SET_VOLUME_REQ, + CMD_TEST_SET_VOLUME_RESP, + CMD_TEST_BT_ADDR_REQ, + CMD_TEST_BT_ADDR_RESP, + CMD_TEST_BT_PARRING_REQ, + CMD_TEST_BT_PARRING_RESP, + CMD_TEST_GET_CPLD_REQ, + + // RF cmd---> + + CMD_TEST_RF_BASE = 0x2100, + CMD_TEST_RF_BT_ENTER, + CMD_TEST_RF_BT_ENTER_RESP, + CMD_TEST_RF_EXIT_TO_NORNAL, + CMD_TEST_RF_EXIT_TO_NORNAL_RESP, + + CMD_TEST_RF_BT_TX = 0x2200, + CMD_TEST_RF_BT_TX_RESP, + CMD_TEST_RF_BT_TX_2402_1DH1, + CMD_TEST_RF_BT_TX_2402_1DH1_RESP, + CMD_TEST_RF_BT_TX_2440_1DH1, + CMD_TEST_RF_BT_TX_2440_1DH1_RESP, + CMD_TEST_RF_BT_TX_2480_1DH1, + CMD_TEST_RF_BT_TX_2480_1DH1_RESP, + CMD_TEST_RF_BT_TX_2402_2DH3, + CMD_TEST_RF_BT_TX_2402_2DH3_RESP, + CMD_TEST_RF_BT_TX_2440_2DH3, + CMD_TEST_RF_BT_TX_2440_2DH3_RESP, + CMD_TEST_RF_BT_TX_2480_2DH3, + CMD_TEST_RF_BT_TX_2480_2DH3_RESP, + CMD_TEST_RF_BT_TX_2402_3DH5, + CMD_TEST_RF_BT_TX_2402_3DH5_RESP, + CMD_TEST_RF_BT_TX_2440_3DH5, + + CMD_TEST_RF_BT_TX_2440_3DH5_RESP, + CMD_TEST_RF_BT_TX_2480_3DH5, + CMD_TEST_RF_BT_TX_2480_3DH5_RESP, + + // varible extend---> + CMD_TEST_RF_BT_TX_VARIABLE = 0x22f0, + CMD_TEST_RF_BT_TX_VARIABLE_RESP, + //<----varible extend + + CMD_TEST_RF_BT_RX = 0x2300, + CMD_TEST_RF_BT_RX_RESP, + CMD_TEST_RF_BT_RX_2402_1DH1, + CMD_TEST_RF_BT_RX_2402_1DH1_RESP, + CMD_TEST_RF_BT_RX_2440_1DH1, + CMD_TEST_RF_BT_RX_2440_1DH1_RESP, + CMD_TEST_RF_BT_RX_2480_1DH1, + CMD_TEST_RF_BT_RX_2480_1DH1_RESP, + CMD_TEST_RF_BT_RX_2402_2DH3, + CMD_TEST_RF_BT_RX_2402_2DH3_RESP, + CMD_TEST_RF_BT_RX_2440_2DH3, + CMD_TEST_RF_BT_RX_2440_2DH3_RESP, + CMD_TEST_RF_BT_RX_2480_2DH3, + CMD_TEST_RF_BT_RX_2480_2DH3_RESP, + CMD_TEST_RF_BT_RX_2402_3DH5, + CMD_TEST_RF_BT_RX_2402_3DH5_RESP, + CMD_TEST_RF_BT_RX_2440_3DH5, + + CMD_TEST_RF_BT_RX_2440_3DH5_RESP, + CMD_TEST_RF_BT_RX_2480_3DH5, + CMD_TEST_RF_BT_RX_2480_3DH5_RESP, + + // varible extend---> + CMD_TEST_RF_BT_RX_VARIABLE = 0x23f0, + CMD_TEST_RF_BT_RX_VARIABLE_RESP, + //<----varible extend + + CMD_TEST_RF_BT_EXIT = 0x2400, + CMD_TEST_RF_BT_EXIT_RESP, + + CMD_TEST_RF_WIFI_ENTER = 0x2500, + CMD_TEST_RF_WIFI_ENTER_RESP, + + CMD_TEST_RF_WIFI_TX = 0x2600, + CMD_TEST_RF_WIFI_TX_RESP, + + CMD_TEST_RF_WIFI_TX_CHANNEL1, + CMD_TEST_RF_WIFI_TX_CHANNEL1_RESP, + CMD_TEST_RF_WIFI_TX_CHANNEL7, + CMD_TEST_RF_WIFI_TX_CHANNEL7_RESP, + CMD_TEST_RF_WIFI_TX_CHANNEL13, + CMD_TEST_RF_WIFI_TX_CHANNEL13_RESP, + + // varible extend---> + CMD_TEST_RF_WIFI_TX_VARIABLE = 0x26f0, + CMD_TEST_RF_WIFI_TX_VARIABLE_RESP, + //<----varible extend + + CMD_TEST_RF_WIFI_RX = 0x2700, + CMD_TEST_RF_WIFI_RX_RESP, + + CMD_TEST_RF_WIFI_RX_CHANNEL1, + CMD_TEST_RF_WIFI_RX_CHANNEL1_RESP, + CMD_TEST_RF_WIFI_RX_CHANNEL1_RET, + CMD_TEST_RF_WIFI_RX_CHANNEL1_RET_RESP, + CMD_TEST_RF_WIFI_RX_CHANNEL7, + CMD_TEST_RF_WIFI_RX_CHANNEL7_RESP, + CMD_TEST_RF_WIFI_RX_CHANNEL7_RET, + CMD_TEST_RF_WIFI_RX_CHANNEL7_RET_RESP, + CMD_TEST_RF_WIFI_RX_CHANNEL13, + CMD_TEST_RF_WIFI_RX_CHANNEL13_RESP, + CMD_TEST_RF_WIFI_RX_CHANNEL13_RET, + CMD_TEST_RF_WIFI_RX_CHANNEL13_RET_RESP, + + // varible extend---> + CMD_TEST_RF_WIFI_RX_VARIABLE = 0x27f0, + CMD_TEST_RF_WIFI_RX_VARIABLE_RESP, + //<----varible extend + + CMD_TEST_RF_WIFI_EXIT = 0x2800, + CMD_TEST_RF_WIFI_EXIT_RESP, + + CMD_TEST_MCU_LED_GUIDE = 0X2900, + CMD_TEST_MCU_LED_GUIDE_RSP, + CMD_TEST_MCU_LED_MATRIX, + CMD_TEST_MCU_LED_MATRIX_RSP, + //<-----RF cmd + + CMD_TEST_RELEASE_SYSTEM, + + CMD_ALARM_SYNC_REQ = 0xF000, + CMD_ALARM_SYNC_RSP, + CMD_ALARM_ADD, + CMD_ALARM_REMOVE, + CMD_ALARM_REMOVEALL, + + CMD_REMAIND_SYNC_REQ, + CMD_REMAIND_SYNC_RSP, + CMD_REMAIND_ADD, + CMD_REMAIND_REMOVE, + CMD_REMAIND_REMOVEALL, + + CMD_ASSISTANT_STATUS, + CMD_ASSISTANT_RUNNING, + CMD_ASSISTANT_NOTIFY, + + CMD_SESSION_ALARM_SYNC, + + CMD_WORKDAY_DB_REQ = 0xF100, + CMD_WORKDAY_DB_RSP, + + CMD_OTA_NOTIFY = 0xF200, + CMD_OTA_STATUS, + CMD_OTA_RUNNOW, + + CMD_LOG_CONFIG = 0xF300, + + CMD_DEMO_PERFORM_TEST = 0xff00, + +} DBUS_CMD; + +typedef enum { + ERR_INPUT_PARAMS = 1, + ERR_NO_ITEMS, + ERR_GET_BUS, + ERR_DBUS_CONNECTION, + ERR_REQUEST_BUS_NAME, + ERR_SET_WATCH_FUNCTION, + ERR_SET_TIMEOUT_FUNCTION, + ERR_BUS_MATCH, + ERR_BUS_SET_MSG_CB, + ERR_DBUS_CREATE_MSG, + ERR_BUS_SEND_MSG, + ERR_DBUS_MSG_TO_LARGE, + ERR_BUS_RCV_MSG, + ERR_ADD_TASK, + ERR_UNSUP_EVP_TYPE, + + ERR_CREATE_MQ, + ERR_MQ_SENDMSG, + ERR_CREATE_SHM, + ERR_MAP_SHM, + ERR_MALLOC_MEMORY, + + ERR_EVP_INIT_KEY, + ERR_EVP_UPDATE, + ERR_EVP_FINALE, + ERR_EVP_KEY_SIZE, + + ERR_OPEN_FILE, + ERR_READ_FILE, + ERR_WRITE_FILE, + ERR_COPY_FILE, + ERR_FILE_NOT_EXISTS, + ERR_GET_FILE_SIZE, + ERR_UNINIT_ITEM, + ERR_FILE_EMPTY, + + ERR_SEND_MAIL, + ERR_NETWORK_SEND, + ERR_NETWORK_NOT_CONNECTED, + + ERR_UNSUPPORT, +} DBUS_WITH_LIBUV_ERROR; + +/** + * 错误码 + */ +typedef enum { + ERR_NO_INIT_IPL3 = 2000, ///< (0xF101) 未初始化OTA参数 + ERR_BAD_IPL3, ///< OTA参数异常 + ERR_BAD_FILE_SIZE, ///< 文件大小不正确 + ERR_MD5_FILE, ///< 计算文件MD5校验和异常 + ERR_MD5_CHECK_SUM, ///< MD5校验和不正确 + ERR_OTA_WRITE_BOOT, ///< 写入BOOT分区异常 + ERR_OTA_WRITE_ROOTFS, ///< 写入ROOTFS分区异常 + ERR_OTA_WRITE_IPL3, ///< 写入IPL3分区异常 + ERR_OTA_WRITE_PARAMS, ///< 写入OTA参数异常 + ERR_OTA_DOWNLOAD_FILE, ///< 下载文件失败 + ERR_VERIFY_PARTITION_MD5, ///< 校验分区MD5异常 + ERR_OTA_PRE_STATR, ///< 先前已经启动了一个未完成的OTA任务 + ERR_OTA_YET_CUR_VER, ///< 当前版本已经更新 + ERR_OTA_NOT_READY, ///< OTA未准备好,暂时不能进行OTA升级 +} OTA_ERROR; + +typedef enum { + ERR_CREATE_CFG_FILE = 1000, + ERR_CREATE_SQLITE3_DB, + ERR_OPEN_SQLITE3_DB, + ERR_SQLITE3_CREATE_TABLE, + ERR_SYNC_DATABASE, + ERR_SQL_QUERY, + ERR_SQL_DELETE, + ERR_UNKNOWN_TYPE, + ERR_PERMISSION_DENIED, + ERR_CFG_NOITEM, + ERR_CFG_ITEM_EXIST, + ERR_CFG_WAIT_RSP, + ERR_CFG_BUSY, + ERR_STR_CONVERT, + ERR_SQL_REG_MODULE, +} CONFIG_MODE_ERRCODE; + +typedef enum { + REPEAT_MODE_NONE = 1, + REPEAT_MODE_EVERY_DAY = 2, + REPEAT_MODE_WORKDAY = 3, + REPEAT_MODE_WEEKEND = 4, + REPEAT_MODE_WEEKDAY = 5, + REPEAT_MODE_EVERY_MONTH_DAY = 6, + REPEAT_MODE_EVERY_YEAR_DAY = 7, + REPEAT_MODE_EVERY_TIME = 8, + REPEAT_MODE_MONTH_LAST_DAY = 9, + REPEAT_MODE_HOLIDAY = 10, +} REPEAT_MODE; + +#define MAX_CFG_KEY_NAME (256) +#define MAX_CFG_KEY_VALUE (1024) +#define DATA_TIME_STR_LEN (20) + +#define GET_FILE_SIZE(path, size) \ + do { \ + struct stat st; \ + memset(&st, 0, sizeof(struct stat)); \ + if (stat(path, &st) != 0) { \ + size = -1; \ + } else { \ + size = st.st_size; \ + } \ + } while (0) +#ifdef __cplusplus +} +#endif +#endif diff --git a/linux32/inc/cjson/cJSON.h b/linux32/inc/cjson/cJSON.h new file mode 100644 index 0000000..bd10099 --- /dev/null +++ b/linux32/inc/cjson/cJSON.h @@ -0,0 +1,154 @@ +/* + Copyright (c) 2009 Dave Gamble + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +#ifndef cJSON__h +#define cJSON__h + +#include + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* cJSON Types: */ +#define cJSON_False 0 +#define cJSON_True 1 +#define cJSON_NULL 2 +#define cJSON_Number 3 +#define cJSON_String 4 +#define cJSON_Array 5 +#define cJSON_Object 6 + +#define cJSON_IsReference 256 +#define cJSON_StringIsConst 512 + +/* The cJSON structure: */ +typedef struct cJSON { + struct cJSON *next,*prev; /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */ + struct cJSON *child; /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */ + + int type; /* The type of the item, as above. */ + + char *valuestring; /* The item's string, if type==cJSON_String */ + int valueint; /* The item's number, if type==cJSON_Number */ + double valuedouble; /* The item's number, if type==cJSON_Number */ + + char *string; /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */ +} cJSON; + +typedef struct cJSON_Hooks { + void *(*malloc_fn)(size_t sz); + void (*free_fn)(void *ptr); +} cJSON_Hooks; + +/* Supply malloc, realloc and free functions to cJSON */ +extern void cJSON_InitHooks(cJSON_Hooks* hooks); + + +/* Supply a block of JSON, and this returns a cJSON object you can interrogate. Call cJSON_Delete when finished. */ +extern cJSON *cJSON_Parse(const char *value); +/* Render a cJSON entity to text for transfer/storage. Free the char* when finished. */ +extern char *cJSON_Print(cJSON *item); +/* Render a cJSON entity to text for transfer/storage without any formatting. Free the char* when finished. */ +extern char *cJSON_PrintUnformatted(cJSON *item); +/* Render a cJSON entity to text using a buffered strategy. prebuffer is a guess at the final size. guessing well reduces reallocation. fmt=0 gives unformatted, =1 gives formatted */ +extern char *cJSON_PrintBuffered(cJSON *item,int prebuffer,int fmt); +/* Delete a cJSON entity and all subentities. */ +extern void cJSON_Delete(cJSON *c); + +/* Returns the number of items in an array (or object). */ +extern int cJSON_GetArraySize(cJSON *array); +/* Retrieve item number "item" from array "array". Returns NULL if unsuccessful. */ +extern cJSON *cJSON_GetArrayItem(cJSON *array,int item); +/* Get item "string" from object. Case insensitive. */ +extern cJSON *cJSON_GetObjectItem(cJSON *object,const char *string); +extern int cJSON_HasObjectItem(cJSON *object,const char *string); +/* For analysing failed parses. This returns a pointer to the parse error. You'll probably need to look a few chars back to make sense of it. Defined when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */ +extern const char *cJSON_GetErrorPtr(void); + +/* These calls create a cJSON item of the appropriate type. */ +extern cJSON *cJSON_CreateNull(void); +extern cJSON *cJSON_CreateTrue(void); +extern cJSON *cJSON_CreateFalse(void); +extern cJSON *cJSON_CreateBool(int b); +extern cJSON *cJSON_CreateNumber(double num); +extern cJSON *cJSON_CreateString(const char *string); +extern cJSON *cJSON_CreateArray(void); +extern cJSON *cJSON_CreateObject(void); + +/* These utilities create an Array of count items. */ +extern cJSON *cJSON_CreateIntArray(const int *numbers,int count); +extern cJSON *cJSON_CreateFloatArray(const float *numbers,int count); +extern cJSON *cJSON_CreateDoubleArray(const double *numbers,int count); +extern cJSON *cJSON_CreateStringArray(const char **strings,int count); + +/* Append item to the specified array/object. */ +extern void cJSON_AddItemToArray(cJSON *array, cJSON *item); +extern void cJSON_AddItemToObject(cJSON *object,const char *string,cJSON *item); +extern void cJSON_AddItemToObjectCS(cJSON *object,const char *string,cJSON *item); /* Use this when string is definitely const (i.e. a literal, or as good as), and will definitely survive the cJSON object */ +/* Append reference to item to the specified array/object. Use this when you want to add an existing cJSON to a new cJSON, but don't want to corrupt your existing cJSON. */ +extern void cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item); +extern void cJSON_AddItemReferenceToObject(cJSON *object,const char *string,cJSON *item); + +/* Remove/Detatch items from Arrays/Objects. */ +extern cJSON *cJSON_DetachItemFromArray(cJSON *array,int which); +extern void cJSON_DeleteItemFromArray(cJSON *array,int which); +extern cJSON *cJSON_DetachItemFromObject(cJSON *object,const char *string); +extern void cJSON_DeleteItemFromObject(cJSON *object,const char *string); + +/* Update array items. */ +extern void cJSON_InsertItemInArray(cJSON *array,int which,cJSON *newitem); /* Shifts pre-existing items to the right. */ +extern void cJSON_ReplaceItemInArray(cJSON *array,int which,cJSON *newitem); +extern void cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem); + +/* Duplicate a cJSON item */ +extern cJSON *cJSON_Duplicate(cJSON *item,int recurse); +/* Duplicate will create a new, identical cJSON item to the one you pass, in new memory that will +need to be released. With recurse!=0, it will duplicate any children connected to the item. +The item->next and ->prev pointers are always zero on return from Duplicate. */ + +/* ParseWithOpts allows you to require (and check) that the JSON is null terminated, and to retrieve the pointer to the final byte parsed. */ +extern cJSON *cJSON_ParseWithOpts(const char *value,const char **return_parse_end,int require_null_terminated); + +extern void cJSON_Minify(char *json); + +/* Macros for creating things quickly. */ +#define cJSON_AddNullToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateNull()) +#define cJSON_AddTrueToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateTrue()) +#define cJSON_AddFalseToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateFalse()) +#define cJSON_AddBoolToObject(object,name,b) cJSON_AddItemToObject(object, name, cJSON_CreateBool(b)) +#define cJSON_AddNumberToObject(object,name,n) cJSON_AddItemToObject(object, name, cJSON_CreateNumber(n)) +#define cJSON_AddStringToObject(object,name,s) cJSON_AddItemToObject(object, name, cJSON_CreateString(s)) + +/* When assigning an integer value, it needs to be propagated to valuedouble too. */ +#define cJSON_SetIntValue(object,val) ((object)?(object)->valueint=(object)->valuedouble=(val):(val)) +#define cJSON_SetNumberValue(object,val) ((object)?(object)->valueint=(object)->valuedouble=(val):(val)) + +/* Macro for iterating over an array */ +#define cJSON_ArrayForEach(pos, head) for(pos = (head)->child; pos != NULL; pos = pos->next) + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/linux32/inc/cjson/s2j.h b/linux32/inc/cjson/s2j.h new file mode 100644 index 0000000..8d89d8f --- /dev/null +++ b/linux32/inc/cjson/s2j.h @@ -0,0 +1,91 @@ +/* + * This file is part of the struct2json Library. + * + * Copyright (c) 2015, Armink, + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * 'Software'), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Function: It is an head file for this library. You can see all be called functions. + * Created on: 2015-10-14 + */ + +#ifndef __S2J_H__ +#define __S2J_H__ + +#include +#include +#include "s2jdef.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* struct2json software version number */ +#define S2J_SW_VERSION "1.0.3" + +/* Create JSON object */ +#define s2j_create_json_obj(json_obj) \ + S2J_CREATE_JSON_OBJECT(json_obj) + +/* Delete JSON object */ +#define s2j_delete_json_obj(json_obj) \ + S2J_DELETE_JSON_OBJECT(json_obj) + +/* Set basic type element for JSON object */ +#define s2j_json_set_basic_element(to_json, from_struct, type, element) \ + S2J_JSON_SET_BASIC_ELEMENT(to_json, from_struct, type, element) + +/* Set array type element for JSON object */ +#define s2j_json_set_array_element(to_json, from_struct, type, element, size) \ + S2J_JSON_SET_ARRAY_ELEMENT(to_json, from_struct, type, element, size) + +/* Set child structure type element for JSON object */ +#define s2j_json_set_struct_element(child_json, to_json, child_struct, from_struct, type, element) \ + S2J_JSON_SET_STRUCT_ELEMENT(child_json, to_json, child_struct, from_struct, type, element) + +/* Create structure object */ +#define s2j_create_struct_obj(struct_obj, type) \ + S2J_CREATE_STRUCT_OBJECT(struct_obj, type) + +/* Delete structure object */ +#define s2j_delete_struct_obj(struct_obj) \ + S2J_DELETE_STRUCT_OBJECT(struct_obj) + +/* Get basic type element for structure object */ +#define s2j_struct_get_basic_element(to_struct, from_json, type, element) \ + S2J_STRUCT_GET_BASIC_ELEMENT(to_struct, from_json, type, element) + +/* Get array type element for structure object */ +#define s2j_struct_get_array_element(to_struct, from_json, type, element) \ + S2J_STRUCT_GET_ARRAY_ELEMENT(to_struct, from_json, type, element) + +/* Get child structure type element for structure object */ +#define s2j_struct_get_struct_element(child_struct, to_struct, child_json, from_json, type, element) \ + S2J_STRUCT_GET_STRUCT_ELEMENT(child_struct, to_struct, child_json, from_json, type, element) + +/* s2j.c */ +extern S2jHook s2jHook; +void s2j_init(S2jHook *hook); + +#ifdef __cplusplus +} +#endif + +#endif /* __S2J_H__ */ diff --git a/linux32/inc/cjson/s2jdef.h b/linux32/inc/cjson/s2jdef.h new file mode 100644 index 0000000..ec7dcfc --- /dev/null +++ b/linux32/inc/cjson/s2jdef.h @@ -0,0 +1,150 @@ +/* + * This file is part of the struct2json Library. + * + * Copyright (c) 2015, Armink, + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * 'Software'), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Function: It is an head file for this library. + * Created on: 2015-10-14 + */ + +#ifndef __S2JDEF_H__ +#define __S2JDEF_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + void *(*malloc_fn)(size_t sz); + void (*free_fn)(void *ptr); +} S2jHook, *S2jHook_t; + +#define S2J_STRUCT_GET_int_ELEMENT(to_struct, from_json, _element) \ + json_temp = cJSON_GetObjectItem(from_json, #_element); \ + if (json_temp) (to_struct)->_element = json_temp->valueint; + +#define S2J_STRUCT_GET_string_ELEMENT(to_struct, from_json, _element) \ + json_temp = cJSON_GetObjectItem(from_json, #_element); \ + if (json_temp) strcpy((to_struct)->_element, json_temp->valuestring); + +#define S2J_STRUCT_GET_double_ELEMENT(to_struct, from_json, _element) \ + json_temp = cJSON_GetObjectItem(from_json, #_element); \ + if (json_temp) (to_struct)->_element = json_temp->valuedouble; + +#define S2J_STRUCT_ARRAY_GET_int_ELEMENT(to_struct, from_json, _element, index) \ + (to_struct)->_element[index] = from_json->valueint; + +#define S2J_STRUCT_ARRAY_GET_string_ELEMENT(to_struct, from_json, _element, index) \ + strcpy((to_struct)->_element[index], from_json->valuestring); + +#define S2J_STRUCT_ARRAY_GET_double_ELEMENT(to_struct, from_json, _element, index) \ + (to_struct)->_element[index] = from_json->valuedouble; + +#define S2J_STRUCT_ARRAY_GET_ELEMENT(to_struct, from_json, type, _element, index) \ + S2J_STRUCT_ARRAY_GET_##type##_ELEMENT(to_struct, from_json, _element, index) + +#define S2J_JSON_SET_int_ELEMENT(to_json, from_struct, _element) \ + cJSON_AddNumberToObject(to_json, #_element, (from_struct)->_element); + +#define S2J_JSON_SET_double_ELEMENT(to_json, from_struct, _element) \ + cJSON_AddNumberToObject(to_json, #_element, (from_struct)->_element); + +#define S2J_JSON_SET_string_ELEMENT(to_json, from_struct, _element) \ + cJSON_AddStringToObject(to_json, #_element, (from_struct)->_element); + +#define S2J_JSON_ARRAY_SET_int_ELEMENT(to_json, from_struct, _element, index) \ + cJSON_AddItemToArray(to_json, cJSON_CreateNumber((from_struct)->_element[index])); + +#define S2J_JSON_ARRAY_SET_double_ELEMENT(to_json, from_struct, _element, index) \ + cJSON_AddItemToArray(to_json, cJSON_CreateNumber((from_struct)->_element[index])); + +#define S2J_JSON_ARRAY_SET_string_ELEMENT(to_json, from_struct, _element, index) \ + cJSON_AddItemToArray(to_json, cJSON_CreateString((from_struct)->_element[index])); + +#define S2J_JSON_ARRAY_SET_ELEMENT(to_json, from_struct, type, _element, index) \ + S2J_JSON_ARRAY_SET_##type##_ELEMENT(to_json, from_struct, _element, index) + + +#define S2J_CREATE_JSON_OBJECT(json_obj) \ + cJSON *json_obj = cJSON_CreateObject(); + +#define S2J_DELETE_JSON_OBJECT(json_obj) \ + cJSON_Delete(json_obj); + +#define S2J_JSON_SET_BASIC_ELEMENT(to_json, from_struct, type, _element) \ + S2J_JSON_SET_##type##_ELEMENT(to_json, from_struct, _element) + +#define S2J_JSON_SET_ARRAY_ELEMENT(to_json, from_struct, type, _element, size) \ + { \ + cJSON *array; \ + size_t index = 0; \ + array = cJSON_CreateArray(); \ + if (array) { \ + while (index < size) { \ + S2J_JSON_ARRAY_SET_ELEMENT(array, from_struct, type, _element, index++); \ + } \ + cJSON_AddItemToObject(to_json, #_element, array); \ + } \ + } + +#define S2J_JSON_SET_STRUCT_ELEMENT(child_json, to_json, child_struct, from_struct, type, _element) \ + type *child_struct = &((from_struct)->_element); \ + cJSON *child_json = cJSON_CreateObject(); \ + if (child_json) cJSON_AddItemToObject(to_json, #_element, child_json); + +#define S2J_CREATE_STRUCT_OBJECT(struct_obj, type) \ + cJSON *json_temp; \ + type *struct_obj = s2jHook.malloc_fn(sizeof(type)); \ + if (struct_obj) memset(struct_obj, 0, sizeof(type)); + +#define S2J_DELETE_STRUCT_OBJECT(struct_obj) \ + s2jHook.free_fn(struct_obj); + +#define S2J_STRUCT_GET_BASIC_ELEMENT(to_struct, from_json, type, _element) \ + S2J_STRUCT_GET_##type##_ELEMENT(to_struct, from_json, _element) + +#define S2J_STRUCT_GET_ARRAY_ELEMENT(to_struct, from_json, type, _element) \ + { \ + cJSON *array, *array_element; \ + size_t index = 0, size = 0; \ + array = cJSON_GetObjectItem(from_json, #_element); \ + if (array) { \ + size = cJSON_GetArraySize(array); \ + while (index < size) { \ + array_element = cJSON_GetArrayItem(array, index); \ + if (array_element) S2J_STRUCT_ARRAY_GET_ELEMENT(to_struct, array_element, type, _element, index++); \ + } \ + } \ + } + +#define S2J_STRUCT_GET_STRUCT_ELEMENT(child_struct, to_struct, child_json, from_json, type, _element) \ + type *child_struct = &((to_struct)->_element); \ + cJSON *child_json = cJSON_GetObjectItem(from_json, #_element); + +#ifdef __cplusplus +} +#endif + +#endif /* __S2JDEF_H__ */ diff --git a/linux32/inc/uthash/utarray.h b/linux32/inc/uthash/utarray.h new file mode 100644 index 0000000..80e2f9d --- /dev/null +++ b/linux32/inc/uthash/utarray.h @@ -0,0 +1,238 @@ +/* +Copyright (c) 2008-2017, Troy D. Hanson http://troydhanson.github.com/uthash/ +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER +OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* a dynamic array implementation using macros + */ +#ifndef UTARRAY_H +#define UTARRAY_H + +#define UTARRAY_VERSION 2.0.2 + +#include /* size_t */ +#include /* memset, etc */ +#include /* exit */ + +#ifdef __GNUC__ +#define UTARRAY_UNUSED __attribute__((__unused__)) +#else +#define UTARRAY_UNUSED +#endif + +#ifndef oom +#define oom() exit(-1) +#endif + +typedef void (ctor_f)(void *dst, const void *src); +typedef void (dtor_f)(void *elt); +typedef void (init_f)(void *elt); +typedef struct { + size_t sz; + init_f *init; + ctor_f *copy; + dtor_f *dtor; +} UT_icd; + +typedef struct { + unsigned i,n;/* i: index of next available slot, n: num slots */ + UT_icd icd; /* initializer, copy and destructor functions */ + char *d; /* n slots of size icd->sz*/ +} UT_array; + +#define utarray_init(a,_icd) do { \ + memset(a,0,sizeof(UT_array)); \ + (a)->icd = *(_icd); \ +} while(0) + +#define utarray_done(a) do { \ + if ((a)->n) { \ + if ((a)->icd.dtor) { \ + unsigned _ut_i; \ + for(_ut_i=0; _ut_i < (a)->i; _ut_i++) { \ + (a)->icd.dtor(utarray_eltptr(a,_ut_i)); \ + } \ + } \ + free((a)->d); \ + } \ + (a)->n=0; \ +} while(0) + +#define utarray_new(a,_icd) do { \ + (a) = (UT_array*)malloc(sizeof(UT_array)); \ + if ((a) == NULL) oom(); \ + utarray_init(a,_icd); \ +} while(0) + +#define utarray_free(a) do { \ + utarray_done(a); \ + free(a); \ +} while(0) + +#define utarray_reserve(a,by) do { \ + if (((a)->i+(by)) > (a)->n) { \ + char *utarray_tmp; \ + while (((a)->i+(by)) > (a)->n) { (a)->n = ((a)->n ? (2*(a)->n) : 8); } \ + utarray_tmp=(char*)realloc((a)->d, (a)->n*(a)->icd.sz); \ + if (utarray_tmp == NULL) oom(); \ + (a)->d=utarray_tmp; \ + } \ +} while(0) + +#define utarray_push_back(a,p) do { \ + utarray_reserve(a,1); \ + if ((a)->icd.copy) { (a)->icd.copy( _utarray_eltptr(a,(a)->i++), p); } \ + else { memcpy(_utarray_eltptr(a,(a)->i++), p, (a)->icd.sz); }; \ +} while(0) + +#define utarray_pop_back(a) do { \ + if ((a)->icd.dtor) { (a)->icd.dtor( _utarray_eltptr(a,--((a)->i))); } \ + else { (a)->i--; } \ +} while(0) + +#define utarray_extend_back(a) do { \ + utarray_reserve(a,1); \ + if ((a)->icd.init) { (a)->icd.init(_utarray_eltptr(a,(a)->i)); } \ + else { memset(_utarray_eltptr(a,(a)->i),0,(a)->icd.sz); } \ + (a)->i++; \ +} while(0) + +#define utarray_len(a) ((a)->i) + +#define utarray_eltptr(a,j) (((j) < (a)->i) ? _utarray_eltptr(a,j) : NULL) +#define _utarray_eltptr(a,j) ((a)->d + ((a)->icd.sz * (j))) + +#define utarray_insert(a,p,j) do { \ + if ((j) > (a)->i) utarray_resize(a,j); \ + utarray_reserve(a,1); \ + if ((j) < (a)->i) { \ + memmove( _utarray_eltptr(a,(j)+1), _utarray_eltptr(a,j), \ + ((a)->i - (j))*((a)->icd.sz)); \ + } \ + if ((a)->icd.copy) { (a)->icd.copy( _utarray_eltptr(a,j), p); } \ + else { memcpy(_utarray_eltptr(a,j), p, (a)->icd.sz); }; \ + (a)->i++; \ +} while(0) + +#define utarray_inserta(a,w,j) do { \ + if (utarray_len(w) == 0) break; \ + if ((j) > (a)->i) utarray_resize(a,j); \ + utarray_reserve(a,utarray_len(w)); \ + if ((j) < (a)->i) { \ + memmove(_utarray_eltptr(a,(j)+utarray_len(w)), \ + _utarray_eltptr(a,j), \ + ((a)->i - (j))*((a)->icd.sz)); \ + } \ + if ((a)->icd.copy) { \ + unsigned _ut_i; \ + for(_ut_i=0;_ut_i<(w)->i;_ut_i++) { \ + (a)->icd.copy(_utarray_eltptr(a, (j) + _ut_i), _utarray_eltptr(w, _ut_i)); \ + } \ + } else { \ + memcpy(_utarray_eltptr(a,j), _utarray_eltptr(w,0), \ + utarray_len(w)*((a)->icd.sz)); \ + } \ + (a)->i += utarray_len(w); \ +} while(0) + +#define utarray_resize(dst,num) do { \ + unsigned _ut_i; \ + if ((dst)->i > (unsigned)(num)) { \ + if ((dst)->icd.dtor) { \ + for (_ut_i = (num); _ut_i < (dst)->i; ++_ut_i) { \ + (dst)->icd.dtor(_utarray_eltptr(dst, _ut_i)); \ + } \ + } \ + } else if ((dst)->i < (unsigned)(num)) { \ + utarray_reserve(dst, (num) - (dst)->i); \ + if ((dst)->icd.init) { \ + for (_ut_i = (dst)->i; _ut_i < (unsigned)(num); ++_ut_i) { \ + (dst)->icd.init(_utarray_eltptr(dst, _ut_i)); \ + } \ + } else { \ + memset(_utarray_eltptr(dst, (dst)->i), 0, (dst)->icd.sz*((num) - (dst)->i)); \ + } \ + } \ + (dst)->i = (num); \ +} while(0) + +#define utarray_concat(dst,src) do { \ + utarray_inserta(dst, src, utarray_len(dst)); \ +} while(0) + +#define utarray_erase(a,pos,len) do { \ + if ((a)->icd.dtor) { \ + unsigned _ut_i; \ + for (_ut_i = 0; _ut_i < (len); _ut_i++) { \ + (a)->icd.dtor(utarray_eltptr(a, (pos) + _ut_i)); \ + } \ + } \ + if ((a)->i > ((pos) + (len))) { \ + memmove(_utarray_eltptr(a, pos), _utarray_eltptr(a, (pos) + (len)), \ + ((a)->i - ((pos) + (len))) * (a)->icd.sz); \ + } \ + (a)->i -= (len); \ +} while(0) + +#define utarray_renew(a,u) do { \ + if (a) utarray_clear(a); \ + else utarray_new(a, u); \ +} while(0) + +#define utarray_clear(a) do { \ + if ((a)->i > 0) { \ + if ((a)->icd.dtor) { \ + unsigned _ut_i; \ + for(_ut_i=0; _ut_i < (a)->i; _ut_i++) { \ + (a)->icd.dtor(_utarray_eltptr(a, _ut_i)); \ + } \ + } \ + (a)->i = 0; \ + } \ +} while(0) + +#define utarray_sort(a,cmp) do { \ + qsort((a)->d, (a)->i, (a)->icd.sz, cmp); \ +} while(0) + +#define utarray_find(a,v,cmp) bsearch((v),(a)->d,(a)->i,(a)->icd.sz,cmp) + +#define utarray_front(a) (((a)->i) ? (_utarray_eltptr(a,0)) : NULL) +#define utarray_next(a,e) (((e)==NULL) ? utarray_front(a) : ((((a)->i) > (utarray_eltidx(a,e)+1)) ? _utarray_eltptr(a,utarray_eltidx(a,e)+1) : NULL)) +#define utarray_prev(a,e) (((e)==NULL) ? utarray_back(a) : ((utarray_eltidx(a,e) > 0) ? _utarray_eltptr(a,utarray_eltidx(a,e)-1) : NULL)) +#define utarray_back(a) (((a)->i) ? (_utarray_eltptr(a,(a)->i-1)) : NULL) +#define utarray_eltidx(a,e) (((char*)(e) >= (a)->d) ? (((char*)(e) - (a)->d)/(a)->icd.sz) : -1) + +/* last we pre-define a few icd for common utarrays of ints and strings */ +static void utarray_str_cpy(void *dst, const void *src) { + char **_src = (char**)src, **_dst = (char**)dst; + *_dst = (*_src == NULL) ? NULL : strdup(*_src); +} +static void utarray_str_dtor(void *elt) { + char **eltc = (char**)elt; + if (*eltc != NULL) free(*eltc); +} +static const UT_icd ut_str_icd UTARRAY_UNUSED = {sizeof(char*),NULL,utarray_str_cpy,utarray_str_dtor}; +static const UT_icd ut_int_icd UTARRAY_UNUSED = {sizeof(int),NULL,NULL,NULL}; +static const UT_icd ut_ptr_icd UTARRAY_UNUSED = {sizeof(void*),NULL,NULL,NULL}; + + +#endif /* UTARRAY_H */ diff --git a/linux32/inc/uthash/uthash.h b/linux32/inc/uthash/uthash.h new file mode 100644 index 0000000..b1faf46 --- /dev/null +++ b/linux32/inc/uthash/uthash.h @@ -0,0 +1,1107 @@ +/* +Copyright (c) 2003-2017, Troy D. Hanson http://troydhanson.github.com/uthash/ +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER +OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef UTHASH_H +#define UTHASH_H + +#define UTHASH_VERSION 2.0.2 + +#include /* memcmp, memset, strlen */ +#include /* ptrdiff_t */ +#include /* exit */ + +/* These macros use decltype or the earlier __typeof GNU extension. + As decltype is only available in newer compilers (VS2010 or gcc 4.3+ + when compiling c++ source) this code uses whatever method is needed + or, for VS2008 where neither is available, uses casting workarounds. */ +#if !defined(DECLTYPE) && !defined(NO_DECLTYPE) +#if defined(_MSC_VER) /* MS compiler */ +#if _MSC_VER >= 1600 && defined(__cplusplus) /* VS2010 or newer in C++ mode */ +#define DECLTYPE(x) (decltype(x)) +#else /* VS2008 or older (or VS2010 in C mode) */ +#define NO_DECLTYPE +#endif +#elif defined(__BORLANDC__) || defined(__ICCARM__) || defined(__LCC__) || defined(__WATCOMC__) +#define NO_DECLTYPE +#else /* GNU, Sun and other compilers */ +#define DECLTYPE(x) (__typeof(x)) +#endif +#endif + +#ifdef NO_DECLTYPE +#define DECLTYPE(x) +#define DECLTYPE_ASSIGN(dst,src) \ +do { \ + char **_da_dst = (char**)(&(dst)); \ + *_da_dst = (char*)(src); \ +} while (0) +#else +#define DECLTYPE_ASSIGN(dst,src) \ +do { \ + (dst) = DECLTYPE(dst)(src); \ +} while (0) +#endif + +/* a number of the hash function use uint32_t which isn't defined on Pre VS2010 */ +#if defined(_WIN32) +#if defined(_MSC_VER) && _MSC_VER >= 1600 +#include +#elif defined(__WATCOMC__) || defined(__MINGW32__) || defined(__CYGWIN__) +#include +#else +typedef unsigned int uint32_t; +typedef unsigned char uint8_t; +#endif +#elif defined(__GNUC__) && !defined(__VXWORKS__) +#include +#else +typedef unsigned int uint32_t; +typedef unsigned char uint8_t; +#endif + +#ifndef uthash_fatal +#define uthash_fatal(msg) exit(-1) /* fatal error (out of memory,etc) */ +#endif +#ifndef uthash_malloc +#define uthash_malloc(sz) malloc(sz) /* malloc fcn */ +#endif +#ifndef uthash_free +#define uthash_free(ptr,sz) free(ptr) /* free fcn */ +#endif +#ifndef uthash_bzero +#define uthash_bzero(a,n) memset(a,'\0',n) +#endif +#ifndef uthash_memcmp +#define uthash_memcmp(a,b,n) memcmp(a,b,n) +#endif +#ifndef uthash_strlen +#define uthash_strlen(s) strlen(s) +#endif + +#ifndef uthash_noexpand_fyi +#define uthash_noexpand_fyi(tbl) /* can be defined to log noexpand */ +#endif +#ifndef uthash_expand_fyi +#define uthash_expand_fyi(tbl) /* can be defined to log expands */ +#endif + +/* initial number of buckets */ +#define HASH_INITIAL_NUM_BUCKETS 32U /* initial number of buckets */ +#define HASH_INITIAL_NUM_BUCKETS_LOG2 5U /* lg2 of initial number of buckets */ +#define HASH_BKT_CAPACITY_THRESH 10U /* expand when bucket count reaches */ + +/* calculate the element whose hash handle address is hhp */ +#define ELMT_FROM_HH(tbl,hhp) ((void*)(((char*)(hhp)) - ((tbl)->hho))) +/* calculate the hash handle from element address elp */ +#define HH_FROM_ELMT(tbl,elp) ((UT_hash_handle *)(((char*)(elp)) + ((tbl)->hho))) + +#define HASH_VALUE(keyptr,keylen,hashv) \ +do { \ + HASH_FCN(keyptr, keylen, hashv); \ +} while (0) + +#define HASH_FIND_BYHASHVALUE(hh,head,keyptr,keylen,hashval,out) \ +do { \ + (out) = NULL; \ + if (head) { \ + unsigned _hf_bkt; \ + HASH_TO_BKT(hashval, (head)->hh.tbl->num_buckets, _hf_bkt); \ + if (HASH_BLOOM_TEST((head)->hh.tbl, hashval) != 0) { \ + HASH_FIND_IN_BKT((head)->hh.tbl, hh, (head)->hh.tbl->buckets[ _hf_bkt ], keyptr, keylen, hashval, out); \ + } \ + } \ +} while (0) + +#define HASH_FIND(hh,head,keyptr,keylen,out) \ +do { \ + unsigned _hf_hashv; \ + HASH_VALUE(keyptr, keylen, _hf_hashv); \ + HASH_FIND_BYHASHVALUE(hh, head, keyptr, keylen, _hf_hashv, out); \ +} while (0) + +#ifdef HASH_BLOOM +#define HASH_BLOOM_BITLEN (1UL << HASH_BLOOM) +#define HASH_BLOOM_BYTELEN (HASH_BLOOM_BITLEN/8UL) + (((HASH_BLOOM_BITLEN%8UL)!=0UL) ? 1UL : 0UL) +#define HASH_BLOOM_MAKE(tbl) \ +do { \ + (tbl)->bloom_nbits = HASH_BLOOM; \ + (tbl)->bloom_bv = (uint8_t*)uthash_malloc(HASH_BLOOM_BYTELEN); \ + if (!(tbl)->bloom_bv) { \ + uthash_fatal("out of memory"); \ + } \ + uthash_bzero((tbl)->bloom_bv, HASH_BLOOM_BYTELEN); \ + (tbl)->bloom_sig = HASH_BLOOM_SIGNATURE; \ +} while (0) + +#define HASH_BLOOM_FREE(tbl) \ +do { \ + uthash_free((tbl)->bloom_bv, HASH_BLOOM_BYTELEN); \ +} while (0) + +#define HASH_BLOOM_BITSET(bv,idx) (bv[(idx)/8U] |= (1U << ((idx)%8U))) +#define HASH_BLOOM_BITTEST(bv,idx) (bv[(idx)/8U] & (1U << ((idx)%8U))) + +#define HASH_BLOOM_ADD(tbl,hashv) \ + HASH_BLOOM_BITSET((tbl)->bloom_bv, (hashv & (uint32_t)((1UL << (tbl)->bloom_nbits) - 1U))) + +#define HASH_BLOOM_TEST(tbl,hashv) \ + HASH_BLOOM_BITTEST((tbl)->bloom_bv, (hashv & (uint32_t)((1UL << (tbl)->bloom_nbits) - 1U))) + +#else +#define HASH_BLOOM_MAKE(tbl) +#define HASH_BLOOM_FREE(tbl) +#define HASH_BLOOM_ADD(tbl,hashv) +#define HASH_BLOOM_TEST(tbl,hashv) (1) +#define HASH_BLOOM_BYTELEN 0U +#endif + +#define HASH_MAKE_TABLE(hh,head) \ +do { \ + (head)->hh.tbl = (UT_hash_table*)uthash_malloc(sizeof(UT_hash_table)); \ + if (!(head)->hh.tbl) { \ + uthash_fatal("out of memory"); \ + } \ + uthash_bzero((head)->hh.tbl, sizeof(UT_hash_table)); \ + (head)->hh.tbl->tail = &((head)->hh); \ + (head)->hh.tbl->num_buckets = HASH_INITIAL_NUM_BUCKETS; \ + (head)->hh.tbl->log2_num_buckets = HASH_INITIAL_NUM_BUCKETS_LOG2; \ + (head)->hh.tbl->hho = (char*)(&(head)->hh) - (char*)(head); \ + (head)->hh.tbl->buckets = (UT_hash_bucket*)uthash_malloc( \ + HASH_INITIAL_NUM_BUCKETS * sizeof(struct UT_hash_bucket)); \ + if (!(head)->hh.tbl->buckets) { \ + uthash_fatal("out of memory"); \ + } \ + uthash_bzero((head)->hh.tbl->buckets, \ + HASH_INITIAL_NUM_BUCKETS * sizeof(struct UT_hash_bucket)); \ + HASH_BLOOM_MAKE((head)->hh.tbl); \ + (head)->hh.tbl->signature = HASH_SIGNATURE; \ +} while (0) + +#define HASH_REPLACE_BYHASHVALUE_INORDER(hh,head,fieldname,keylen_in,hashval,add,replaced,cmpfcn) \ +do { \ + (replaced) = NULL; \ + HASH_FIND_BYHASHVALUE(hh, head, &((add)->fieldname), keylen_in, hashval, replaced); \ + if (replaced) { \ + HASH_DELETE(hh, head, replaced); \ + } \ + HASH_ADD_KEYPTR_BYHASHVALUE_INORDER(hh, head, &((add)->fieldname), keylen_in, hashval, add, cmpfcn); \ +} while (0) + +#define HASH_REPLACE_BYHASHVALUE(hh,head,fieldname,keylen_in,hashval,add,replaced) \ +do { \ + (replaced) = NULL; \ + HASH_FIND_BYHASHVALUE(hh, head, &((add)->fieldname), keylen_in, hashval, replaced); \ + if (replaced) { \ + HASH_DELETE(hh, head, replaced); \ + } \ + HASH_ADD_KEYPTR_BYHASHVALUE(hh, head, &((add)->fieldname), keylen_in, hashval, add); \ +} while (0) + +#define HASH_REPLACE(hh,head,fieldname,keylen_in,add,replaced) \ +do { \ + unsigned _hr_hashv; \ + HASH_VALUE(&((add)->fieldname), keylen_in, _hr_hashv); \ + HASH_REPLACE_BYHASHVALUE(hh, head, fieldname, keylen_in, _hr_hashv, add, replaced); \ +} while (0) + +#define HASH_REPLACE_INORDER(hh,head,fieldname,keylen_in,add,replaced,cmpfcn) \ +do { \ + unsigned _hr_hashv; \ + HASH_VALUE(&((add)->fieldname), keylen_in, _hr_hashv); \ + HASH_REPLACE_BYHASHVALUE_INORDER(hh, head, fieldname, keylen_in, _hr_hashv, add, replaced, cmpfcn); \ +} while (0) + +#define HASH_APPEND_LIST(hh, head, add) \ +do { \ + (add)->hh.next = NULL; \ + (add)->hh.prev = ELMT_FROM_HH((head)->hh.tbl, (head)->hh.tbl->tail); \ + (head)->hh.tbl->tail->next = (add); \ + (head)->hh.tbl->tail = &((add)->hh); \ +} while (0) + +#define HASH_AKBI_INNER_LOOP(hh,head,add,cmpfcn) \ +do { \ + do { \ + if (cmpfcn(DECLTYPE(head)(_hs_iter), add) > 0) { \ + break; \ + } \ + } while ((_hs_iter = HH_FROM_ELMT((head)->hh.tbl, _hs_iter)->next)); \ +} while (0) + +#ifdef NO_DECLTYPE +#undef HASH_AKBI_INNER_LOOP +#define HASH_AKBI_INNER_LOOP(hh,head,add,cmpfcn) \ +do { \ + char *_hs_saved_head = (char*)(head); \ + do { \ + DECLTYPE_ASSIGN(head, _hs_iter); \ + if (cmpfcn(head, add) > 0) { \ + DECLTYPE_ASSIGN(head, _hs_saved_head); \ + break; \ + } \ + DECLTYPE_ASSIGN(head, _hs_saved_head); \ + } while ((_hs_iter = HH_FROM_ELMT((head)->hh.tbl, _hs_iter)->next)); \ +} while (0) +#endif + +#define HASH_ADD_KEYPTR_BYHASHVALUE_INORDER(hh,head,keyptr,keylen_in,hashval,add,cmpfcn) \ +do { \ + unsigned _ha_bkt; \ + (add)->hh.hashv = (hashval); \ + (add)->hh.key = (char*) (keyptr); \ + (add)->hh.keylen = (unsigned) (keylen_in); \ + if (!(head)) { \ + (add)->hh.next = NULL; \ + (add)->hh.prev = NULL; \ + (head) = (add); \ + HASH_MAKE_TABLE(hh, head); \ + } else { \ + void *_hs_iter = (head); \ + (add)->hh.tbl = (head)->hh.tbl; \ + HASH_AKBI_INNER_LOOP(hh, head, add, cmpfcn); \ + if (_hs_iter) { \ + (add)->hh.next = _hs_iter; \ + if (((add)->hh.prev = HH_FROM_ELMT((head)->hh.tbl, _hs_iter)->prev)) { \ + HH_FROM_ELMT((head)->hh.tbl, (add)->hh.prev)->next = (add); \ + } else { \ + (head) = (add); \ + } \ + HH_FROM_ELMT((head)->hh.tbl, _hs_iter)->prev = (add); \ + } else { \ + HASH_APPEND_LIST(hh, head, add); \ + } \ + } \ + (head)->hh.tbl->num_items++; \ + HASH_TO_BKT(hashval, (head)->hh.tbl->num_buckets, _ha_bkt); \ + HASH_ADD_TO_BKT((head)->hh.tbl->buckets[_ha_bkt], &(add)->hh); \ + HASH_BLOOM_ADD((head)->hh.tbl, hashval); \ + HASH_EMIT_KEY(hh, head, keyptr, keylen_in); \ + HASH_FSCK(hh, head, "HASH_ADD_KEYPTR_BYHASHVALUE_INORDER"); \ +} while (0) + +#define HASH_ADD_KEYPTR_INORDER(hh,head,keyptr,keylen_in,add,cmpfcn) \ +do { \ + unsigned _hs_hashv; \ + HASH_VALUE(keyptr, keylen_in, _hs_hashv); \ + HASH_ADD_KEYPTR_BYHASHVALUE_INORDER(hh, head, keyptr, keylen_in, _hs_hashv, add, cmpfcn); \ +} while (0) + +#define HASH_ADD_BYHASHVALUE_INORDER(hh,head,fieldname,keylen_in,hashval,add,cmpfcn) \ + HASH_ADD_KEYPTR_BYHASHVALUE_INORDER(hh, head, &((add)->fieldname), keylen_in, hashval, add, cmpfcn) + +#define HASH_ADD_INORDER(hh,head,fieldname,keylen_in,add,cmpfcn) \ + HASH_ADD_KEYPTR_INORDER(hh, head, &((add)->fieldname), keylen_in, add, cmpfcn) + +#define HASH_ADD_KEYPTR_BYHASHVALUE(hh,head,keyptr,keylen_in,hashval,add) \ +do { \ + unsigned _ha_bkt; \ + (add)->hh.hashv = (hashval); \ + (add)->hh.key = (char*) (keyptr); \ + (add)->hh.keylen = (unsigned) (keylen_in); \ + if (!(head)) { \ + (add)->hh.next = NULL; \ + (add)->hh.prev = NULL; \ + (head) = (add); \ + HASH_MAKE_TABLE(hh, head); \ + } else { \ + (add)->hh.tbl = (head)->hh.tbl; \ + HASH_APPEND_LIST(hh, head, add); \ + } \ + (head)->hh.tbl->num_items++; \ + HASH_TO_BKT(hashval, (head)->hh.tbl->num_buckets, _ha_bkt); \ + HASH_ADD_TO_BKT((head)->hh.tbl->buckets[_ha_bkt], &(add)->hh); \ + HASH_BLOOM_ADD((head)->hh.tbl, hashval); \ + HASH_EMIT_KEY(hh, head, keyptr, keylen_in); \ + HASH_FSCK(hh, head, "HASH_ADD_KEYPTR_BYHASHVALUE"); \ +} while (0) + +#define HASH_ADD_KEYPTR(hh,head,keyptr,keylen_in,add) \ +do { \ + unsigned _ha_hashv; \ + HASH_VALUE(keyptr, keylen_in, _ha_hashv); \ + HASH_ADD_KEYPTR_BYHASHVALUE(hh, head, keyptr, keylen_in, _ha_hashv, add); \ +} while (0) + +#define HASH_ADD_BYHASHVALUE(hh,head,fieldname,keylen_in,hashval,add) \ + HASH_ADD_KEYPTR_BYHASHVALUE(hh, head, &((add)->fieldname), keylen_in, hashval, add) + +#define HASH_ADD(hh,head,fieldname,keylen_in,add) \ + HASH_ADD_KEYPTR(hh, head, &((add)->fieldname), keylen_in, add) + +#define HASH_TO_BKT(hashv,num_bkts,bkt) \ +do { \ + bkt = ((hashv) & ((num_bkts) - 1U)); \ +} while (0) + +/* delete "delptr" from the hash table. + * "the usual" patch-up process for the app-order doubly-linked-list. + * The use of _hd_hh_del below deserves special explanation. + * These used to be expressed using (delptr) but that led to a bug + * if someone used the same symbol for the head and deletee, like + * HASH_DELETE(hh,users,users); + * We want that to work, but by changing the head (users) below + * we were forfeiting our ability to further refer to the deletee (users) + * in the patch-up process. Solution: use scratch space to + * copy the deletee pointer, then the latter references are via that + * scratch pointer rather than through the repointed (users) symbol. + */ +#define HASH_DELETE(hh,head,delptr) \ + HASH_DELETE_HH(hh, head, &(delptr)->hh) + +#define HASH_DELETE_HH(hh,head,delptrhh) \ +do { \ + struct UT_hash_handle *_hd_hh_del = (delptrhh); \ + if ((_hd_hh_del->prev == NULL) && (_hd_hh_del->next == NULL)) { \ + HASH_BLOOM_FREE((head)->hh.tbl); \ + uthash_free((head)->hh.tbl->buckets, \ + (head)->hh.tbl->num_buckets * sizeof(struct UT_hash_bucket)); \ + uthash_free((head)->hh.tbl, sizeof(UT_hash_table)); \ + (head) = NULL; \ + } else { \ + unsigned _hd_bkt; \ + if (_hd_hh_del == (head)->hh.tbl->tail) { \ + (head)->hh.tbl->tail = HH_FROM_ELMT((head)->hh.tbl, _hd_hh_del->prev); \ + } \ + if (_hd_hh_del->prev != NULL) { \ + HH_FROM_ELMT((head)->hh.tbl, _hd_hh_del->prev)->next = _hd_hh_del->next; \ + } else { \ + DECLTYPE_ASSIGN(head, _hd_hh_del->next); \ + } \ + if (_hd_hh_del->next != NULL) { \ + HH_FROM_ELMT((head)->hh.tbl, _hd_hh_del->next)->prev = _hd_hh_del->prev; \ + } \ + HASH_TO_BKT(_hd_hh_del->hashv, (head)->hh.tbl->num_buckets, _hd_bkt); \ + HASH_DEL_IN_BKT((head)->hh.tbl->buckets[_hd_bkt], _hd_hh_del); \ + (head)->hh.tbl->num_items--; \ + } \ + HASH_FSCK(hh, head, "HASH_DELETE"); \ +} while (0) + + +/* convenience forms of HASH_FIND/HASH_ADD/HASH_DEL */ +#define HASH_FIND_STR(head,findstr,out) \ + HASH_FIND(hh,head,findstr,(unsigned)uthash_strlen(findstr),out) +#define HASH_ADD_STR(head,strfield,add) \ + HASH_ADD(hh,head,strfield[0],(unsigned)uthash_strlen(add->strfield),add) +#define HASH_REPLACE_STR(head,strfield,add,replaced) \ + HASH_REPLACE(hh,head,strfield[0],(unsigned)uthash_strlen(add->strfield),add,replaced) +#define HASH_FIND_INT(head,findint,out) \ + HASH_FIND(hh,head,findint,sizeof(int),out) +#define HASH_ADD_INT(head,intfield,add) \ + HASH_ADD(hh,head,intfield,sizeof(int),add) +#define HASH_REPLACE_INT(head,intfield,add,replaced) \ + HASH_REPLACE(hh,head,intfield,sizeof(int),add,replaced) +#define HASH_FIND_PTR(head,findptr,out) \ + HASH_FIND(hh,head,findptr,sizeof(void *),out) +#define HASH_ADD_PTR(head,ptrfield,add) \ + HASH_ADD(hh,head,ptrfield,sizeof(void *),add) +#define HASH_REPLACE_PTR(head,ptrfield,add,replaced) \ + HASH_REPLACE(hh,head,ptrfield,sizeof(void *),add,replaced) +#define HASH_DEL(head,delptr) \ + HASH_DELETE(hh,head,delptr) + +/* HASH_FSCK checks hash integrity on every add/delete when HASH_DEBUG is defined. + * This is for uthash developer only; it compiles away if HASH_DEBUG isn't defined. + */ +#ifdef HASH_DEBUG +#define HASH_OOPS(...) do { fprintf(stderr,__VA_ARGS__); exit(-1); } while (0) +#define HASH_FSCK(hh,head,where) \ +do { \ + struct UT_hash_handle *_thh; \ + if (head) { \ + unsigned _bkt_i; \ + unsigned _count = 0; \ + char *_prev; \ + for (_bkt_i = 0; _bkt_i < (head)->hh.tbl->num_buckets; ++_bkt_i) { \ + unsigned _bkt_count = 0; \ + _thh = (head)->hh.tbl->buckets[_bkt_i].hh_head; \ + _prev = NULL; \ + while (_thh) { \ + if (_prev != (char*)(_thh->hh_prev)) { \ + HASH_OOPS("%s: invalid hh_prev %p, actual %p\n", \ + (where), (void*)_thh->hh_prev, (void*)_prev); \ + } \ + _bkt_count++; \ + _prev = (char*)(_thh); \ + _thh = _thh->hh_next; \ + } \ + _count += _bkt_count; \ + if ((head)->hh.tbl->buckets[_bkt_i].count != _bkt_count) { \ + HASH_OOPS("%s: invalid bucket count %u, actual %u\n", \ + (where), (head)->hh.tbl->buckets[_bkt_i].count, _bkt_count); \ + } \ + } \ + if (_count != (head)->hh.tbl->num_items) { \ + HASH_OOPS("%s: invalid hh item count %u, actual %u\n", \ + (where), (head)->hh.tbl->num_items, _count); \ + } \ + _count = 0; \ + _prev = NULL; \ + _thh = &(head)->hh; \ + while (_thh) { \ + _count++; \ + if (_prev != (char*)_thh->prev) { \ + HASH_OOPS("%s: invalid prev %p, actual %p\n", \ + (where), (void*)_thh->prev, (void*)_prev); \ + } \ + _prev = (char*)ELMT_FROM_HH((head)->hh.tbl, _thh); \ + _thh = (_thh->next ? HH_FROM_ELMT((head)->hh.tbl, _thh->next) : NULL); \ + } \ + if (_count != (head)->hh.tbl->num_items) { \ + HASH_OOPS("%s: invalid app item count %u, actual %u\n", \ + (where), (head)->hh.tbl->num_items, _count); \ + } \ + } \ +} while (0) +#else +#define HASH_FSCK(hh,head,where) +#endif + +/* When compiled with -DHASH_EMIT_KEYS, length-prefixed keys are emitted to + * the descriptor to which this macro is defined for tuning the hash function. + * The app can #include to get the prototype for write(2). */ +#ifdef HASH_EMIT_KEYS +#define HASH_EMIT_KEY(hh,head,keyptr,fieldlen) \ +do { \ + unsigned _klen = fieldlen; \ + write(HASH_EMIT_KEYS, &_klen, sizeof(_klen)); \ + write(HASH_EMIT_KEYS, keyptr, (unsigned long)fieldlen); \ +} while (0) +#else +#define HASH_EMIT_KEY(hh,head,keyptr,fieldlen) +#endif + +/* default to Jenkin's hash unless overridden e.g. DHASH_FUNCTION=HASH_SAX */ +#ifdef HASH_FUNCTION +#define HASH_FCN HASH_FUNCTION +#else +#define HASH_FCN HASH_JEN +#endif + +/* The Bernstein hash function, used in Perl prior to v5.6. Note (x<<5+x)=x*33. */ +#define HASH_BER(key,keylen,hashv) \ +do { \ + unsigned _hb_keylen = (unsigned)keylen; \ + const unsigned char *_hb_key = (const unsigned char*)(key); \ + (hashv) = 0; \ + while (_hb_keylen-- != 0U) { \ + (hashv) = (((hashv) << 5) + (hashv)) + *_hb_key++; \ + } \ +} while (0) + + +/* SAX/FNV/OAT/JEN hash functions are macro variants of those listed at + * http://eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx */ +#define HASH_SAX(key,keylen,hashv) \ +do { \ + unsigned _sx_i; \ + const unsigned char *_hs_key = (const unsigned char*)(key); \ + hashv = 0; \ + for (_sx_i=0; _sx_i < keylen; _sx_i++) { \ + hashv ^= (hashv << 5) + (hashv >> 2) + _hs_key[_sx_i]; \ + } \ +} while (0) +/* FNV-1a variation */ +#define HASH_FNV(key,keylen,hashv) \ +do { \ + unsigned _fn_i; \ + const unsigned char *_hf_key = (const unsigned char*)(key); \ + (hashv) = 2166136261U; \ + for (_fn_i=0; _fn_i < keylen; _fn_i++) { \ + hashv = hashv ^ _hf_key[_fn_i]; \ + hashv = hashv * 16777619U; \ + } \ +} while (0) + +#define HASH_OAT(key,keylen,hashv) \ +do { \ + unsigned _ho_i; \ + const unsigned char *_ho_key=(const unsigned char*)(key); \ + hashv = 0; \ + for(_ho_i=0; _ho_i < keylen; _ho_i++) { \ + hashv += _ho_key[_ho_i]; \ + hashv += (hashv << 10); \ + hashv ^= (hashv >> 6); \ + } \ + hashv += (hashv << 3); \ + hashv ^= (hashv >> 11); \ + hashv += (hashv << 15); \ +} while (0) + +#define HASH_JEN_MIX(a,b,c) \ +do { \ + a -= b; a -= c; a ^= ( c >> 13 ); \ + b -= c; b -= a; b ^= ( a << 8 ); \ + c -= a; c -= b; c ^= ( b >> 13 ); \ + a -= b; a -= c; a ^= ( c >> 12 ); \ + b -= c; b -= a; b ^= ( a << 16 ); \ + c -= a; c -= b; c ^= ( b >> 5 ); \ + a -= b; a -= c; a ^= ( c >> 3 ); \ + b -= c; b -= a; b ^= ( a << 10 ); \ + c -= a; c -= b; c ^= ( b >> 15 ); \ +} while (0) + +#define HASH_JEN(key,keylen,hashv) \ +do { \ + unsigned _hj_i,_hj_j,_hj_k; \ + unsigned const char *_hj_key=(unsigned const char*)(key); \ + hashv = 0xfeedbeefu; \ + _hj_i = _hj_j = 0x9e3779b9u; \ + _hj_k = (unsigned)(keylen); \ + while (_hj_k >= 12U) { \ + _hj_i += (_hj_key[0] + ( (unsigned)_hj_key[1] << 8 ) \ + + ( (unsigned)_hj_key[2] << 16 ) \ + + ( (unsigned)_hj_key[3] << 24 ) ); \ + _hj_j += (_hj_key[4] + ( (unsigned)_hj_key[5] << 8 ) \ + + ( (unsigned)_hj_key[6] << 16 ) \ + + ( (unsigned)_hj_key[7] << 24 ) ); \ + hashv += (_hj_key[8] + ( (unsigned)_hj_key[9] << 8 ) \ + + ( (unsigned)_hj_key[10] << 16 ) \ + + ( (unsigned)_hj_key[11] << 24 ) ); \ + \ + HASH_JEN_MIX(_hj_i, _hj_j, hashv); \ + \ + _hj_key += 12; \ + _hj_k -= 12U; \ + } \ + hashv += (unsigned)(keylen); \ + switch ( _hj_k ) { \ + case 11: hashv += ( (unsigned)_hj_key[10] << 24 ); /* FALLTHROUGH */ \ + case 10: hashv += ( (unsigned)_hj_key[9] << 16 ); /* FALLTHROUGH */ \ + case 9: hashv += ( (unsigned)_hj_key[8] << 8 ); /* FALLTHROUGH */ \ + case 8: _hj_j += ( (unsigned)_hj_key[7] << 24 ); /* FALLTHROUGH */ \ + case 7: _hj_j += ( (unsigned)_hj_key[6] << 16 ); /* FALLTHROUGH */ \ + case 6: _hj_j += ( (unsigned)_hj_key[5] << 8 ); /* FALLTHROUGH */ \ + case 5: _hj_j += _hj_key[4]; /* FALLTHROUGH */ \ + case 4: _hj_i += ( (unsigned)_hj_key[3] << 24 ); /* FALLTHROUGH */ \ + case 3: _hj_i += ( (unsigned)_hj_key[2] << 16 ); /* FALLTHROUGH */ \ + case 2: _hj_i += ( (unsigned)_hj_key[1] << 8 ); /* FALLTHROUGH */ \ + case 1: _hj_i += _hj_key[0]; \ + } \ + HASH_JEN_MIX(_hj_i, _hj_j, hashv); \ +} while (0) + +/* The Paul Hsieh hash function */ +#undef get16bits +#if (defined(__GNUC__) && defined(__i386__)) || defined(__WATCOMC__) \ + || defined(_MSC_VER) || defined (__BORLANDC__) || defined (__TURBOC__) +#define get16bits(d) (*((const uint16_t *) (d))) +#endif + +#if !defined (get16bits) +#define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8) \ + +(uint32_t)(((const uint8_t *)(d))[0]) ) +#endif +#define HASH_SFH(key,keylen,hashv) \ +do { \ + unsigned const char *_sfh_key=(unsigned const char*)(key); \ + uint32_t _sfh_tmp, _sfh_len = (uint32_t)keylen; \ + \ + unsigned _sfh_rem = _sfh_len & 3U; \ + _sfh_len >>= 2; \ + hashv = 0xcafebabeu; \ + \ + /* Main loop */ \ + for (;_sfh_len > 0U; _sfh_len--) { \ + hashv += get16bits (_sfh_key); \ + _sfh_tmp = ((uint32_t)(get16bits (_sfh_key+2)) << 11) ^ hashv; \ + hashv = (hashv << 16) ^ _sfh_tmp; \ + _sfh_key += 2U*sizeof (uint16_t); \ + hashv += hashv >> 11; \ + } \ + \ + /* Handle end cases */ \ + switch (_sfh_rem) { \ + case 3: hashv += get16bits (_sfh_key); \ + hashv ^= hashv << 16; \ + hashv ^= (uint32_t)(_sfh_key[sizeof (uint16_t)]) << 18; \ + hashv += hashv >> 11; \ + break; \ + case 2: hashv += get16bits (_sfh_key); \ + hashv ^= hashv << 11; \ + hashv += hashv >> 17; \ + break; \ + case 1: hashv += *_sfh_key; \ + hashv ^= hashv << 10; \ + hashv += hashv >> 1; \ + } \ + \ + /* Force "avalanching" of final 127 bits */ \ + hashv ^= hashv << 3; \ + hashv += hashv >> 5; \ + hashv ^= hashv << 4; \ + hashv += hashv >> 17; \ + hashv ^= hashv << 25; \ + hashv += hashv >> 6; \ +} while (0) + +#ifdef HASH_USING_NO_STRICT_ALIASING +/* The MurmurHash exploits some CPU's (x86,x86_64) tolerance for unaligned reads. + * For other types of CPU's (e.g. Sparc) an unaligned read causes a bus error. + * MurmurHash uses the faster approach only on CPU's where we know it's safe. + * + * Note the preprocessor built-in defines can be emitted using: + * + * gcc -m64 -dM -E - < /dev/null (on gcc) + * cc -## a.c (where a.c is a simple test file) (Sun Studio) + */ +#if (defined(__i386__) || defined(__x86_64__) || defined(_M_IX86)) +#define MUR_GETBLOCK(p,i) p[i] +#else /* non intel */ +#define MUR_PLUS0_ALIGNED(p) (((unsigned long)p & 3UL) == 0UL) +#define MUR_PLUS1_ALIGNED(p) (((unsigned long)p & 3UL) == 1UL) +#define MUR_PLUS2_ALIGNED(p) (((unsigned long)p & 3UL) == 2UL) +#define MUR_PLUS3_ALIGNED(p) (((unsigned long)p & 3UL) == 3UL) +#define WP(p) ((uint32_t*)((unsigned long)(p) & ~3UL)) +#if (defined(__BIG_ENDIAN__) || defined(SPARC) || defined(__ppc__) || defined(__ppc64__)) +#define MUR_THREE_ONE(p) ((((*WP(p))&0x00ffffff) << 8) | (((*(WP(p)+1))&0xff000000) >> 24)) +#define MUR_TWO_TWO(p) ((((*WP(p))&0x0000ffff) <<16) | (((*(WP(p)+1))&0xffff0000) >> 16)) +#define MUR_ONE_THREE(p) ((((*WP(p))&0x000000ff) <<24) | (((*(WP(p)+1))&0xffffff00) >> 8)) +#else /* assume little endian non-intel */ +#define MUR_THREE_ONE(p) ((((*WP(p))&0xffffff00) >> 8) | (((*(WP(p)+1))&0x000000ff) << 24)) +#define MUR_TWO_TWO(p) ((((*WP(p))&0xffff0000) >>16) | (((*(WP(p)+1))&0x0000ffff) << 16)) +#define MUR_ONE_THREE(p) ((((*WP(p))&0xff000000) >>24) | (((*(WP(p)+1))&0x00ffffff) << 8)) +#endif +#define MUR_GETBLOCK(p,i) (MUR_PLUS0_ALIGNED(p) ? ((p)[i]) : \ + (MUR_PLUS1_ALIGNED(p) ? MUR_THREE_ONE(p) : \ + (MUR_PLUS2_ALIGNED(p) ? MUR_TWO_TWO(p) : \ + MUR_ONE_THREE(p)))) +#endif +#define MUR_ROTL32(x,r) (((x) << (r)) | ((x) >> (32 - (r)))) +#define MUR_FMIX(_h) \ +do { \ + _h ^= _h >> 16; \ + _h *= 0x85ebca6bu; \ + _h ^= _h >> 13; \ + _h *= 0xc2b2ae35u; \ + _h ^= _h >> 16; \ +} while (0) + +#define HASH_MUR(key,keylen,hashv) \ +do { \ + const uint8_t *_mur_data = (const uint8_t*)(key); \ + const int _mur_nblocks = (int)(keylen) / 4; \ + uint32_t _mur_h1 = 0xf88D5353u; \ + uint32_t _mur_c1 = 0xcc9e2d51u; \ + uint32_t _mur_c2 = 0x1b873593u; \ + uint32_t _mur_k1 = 0; \ + const uint8_t *_mur_tail; \ + const uint32_t *_mur_blocks = (const uint32_t*)(_mur_data+(_mur_nblocks*4)); \ + int _mur_i; \ + for (_mur_i = -_mur_nblocks; _mur_i != 0; _mur_i++) { \ + _mur_k1 = MUR_GETBLOCK(_mur_blocks,_mur_i); \ + _mur_k1 *= _mur_c1; \ + _mur_k1 = MUR_ROTL32(_mur_k1,15); \ + _mur_k1 *= _mur_c2; \ + \ + _mur_h1 ^= _mur_k1; \ + _mur_h1 = MUR_ROTL32(_mur_h1,13); \ + _mur_h1 = (_mur_h1*5U) + 0xe6546b64u; \ + } \ + _mur_tail = (const uint8_t*)(_mur_data + (_mur_nblocks*4)); \ + _mur_k1=0; \ + switch ((keylen) & 3U) { \ + case 0: break; \ + case 3: _mur_k1 ^= (uint32_t)_mur_tail[2] << 16; /* FALLTHROUGH */ \ + case 2: _mur_k1 ^= (uint32_t)_mur_tail[1] << 8; /* FALLTHROUGH */ \ + case 1: _mur_k1 ^= (uint32_t)_mur_tail[0]; \ + _mur_k1 *= _mur_c1; \ + _mur_k1 = MUR_ROTL32(_mur_k1,15); \ + _mur_k1 *= _mur_c2; \ + _mur_h1 ^= _mur_k1; \ + } \ + _mur_h1 ^= (uint32_t)(keylen); \ + MUR_FMIX(_mur_h1); \ + hashv = _mur_h1; \ +} while (0) +#endif /* HASH_USING_NO_STRICT_ALIASING */ + +/* iterate over items in a known bucket to find desired item */ +#define HASH_FIND_IN_BKT(tbl,hh,head,keyptr,keylen_in,hashval,out) \ +do { \ + if ((head).hh_head != NULL) { \ + DECLTYPE_ASSIGN(out, ELMT_FROM_HH(tbl, (head).hh_head)); \ + } else { \ + (out) = NULL; \ + } \ + while ((out) != NULL) { \ + if ((out)->hh.hashv == (hashval) && (out)->hh.keylen == (keylen_in)) { \ + if (uthash_memcmp((out)->hh.key, keyptr, keylen_in) == 0) { \ + break; \ + } \ + } \ + if ((out)->hh.hh_next != NULL) { \ + DECLTYPE_ASSIGN(out, ELMT_FROM_HH(tbl, (out)->hh.hh_next)); \ + } else { \ + (out) = NULL; \ + } \ + } \ +} while (0) + +/* add an item to a bucket */ +#define HASH_ADD_TO_BKT(head,addhh) \ +do { \ + UT_hash_bucket *_ha_head = &(head); \ + _ha_head->count++; \ + (addhh)->hh_next = _ha_head->hh_head; \ + (addhh)->hh_prev = NULL; \ + if (_ha_head->hh_head != NULL) { \ + _ha_head->hh_head->hh_prev = (addhh); \ + } \ + _ha_head->hh_head = (addhh); \ + if ((_ha_head->count >= ((_ha_head->expand_mult + 1U) * HASH_BKT_CAPACITY_THRESH)) \ + && !(addhh)->tbl->noexpand) { \ + HASH_EXPAND_BUCKETS((addhh)->tbl); \ + } \ +} while (0) + +/* remove an item from a given bucket */ +#define HASH_DEL_IN_BKT(head,delhh) \ +do { \ + UT_hash_bucket *_hd_head = &(head); \ + _hd_head->count--; \ + if (_hd_head->hh_head == (delhh)) { \ + _hd_head->hh_head = (delhh)->hh_next; \ + } \ + if ((delhh)->hh_prev) { \ + (delhh)->hh_prev->hh_next = (delhh)->hh_next; \ + } \ + if ((delhh)->hh_next) { \ + (delhh)->hh_next->hh_prev = (delhh)->hh_prev; \ + } \ +} while (0) + +/* Bucket expansion has the effect of doubling the number of buckets + * and redistributing the items into the new buckets. Ideally the + * items will distribute more or less evenly into the new buckets + * (the extent to which this is true is a measure of the quality of + * the hash function as it applies to the key domain). + * + * With the items distributed into more buckets, the chain length + * (item count) in each bucket is reduced. Thus by expanding buckets + * the hash keeps a bound on the chain length. This bounded chain + * length is the essence of how a hash provides constant time lookup. + * + * The calculation of tbl->ideal_chain_maxlen below deserves some + * explanation. First, keep in mind that we're calculating the ideal + * maximum chain length based on the *new* (doubled) bucket count. + * In fractions this is just n/b (n=number of items,b=new num buckets). + * Since the ideal chain length is an integer, we want to calculate + * ceil(n/b). We don't depend on floating point arithmetic in this + * hash, so to calculate ceil(n/b) with integers we could write + * + * ceil(n/b) = (n/b) + ((n%b)?1:0) + * + * and in fact a previous version of this hash did just that. + * But now we have improved things a bit by recognizing that b is + * always a power of two. We keep its base 2 log handy (call it lb), + * so now we can write this with a bit shift and logical AND: + * + * ceil(n/b) = (n>>lb) + ( (n & (b-1)) ? 1:0) + * + */ +#define HASH_EXPAND_BUCKETS(tbl) \ +do { \ + unsigned _he_bkt; \ + unsigned _he_bkt_i; \ + struct UT_hash_handle *_he_thh, *_he_hh_nxt; \ + UT_hash_bucket *_he_new_buckets, *_he_newbkt; \ + _he_new_buckets = (UT_hash_bucket*)uthash_malloc( \ + 2UL * (tbl)->num_buckets * sizeof(struct UT_hash_bucket)); \ + if (!_he_new_buckets) { \ + uthash_fatal("out of memory"); \ + } \ + uthash_bzero(_he_new_buckets, \ + 2UL * (tbl)->num_buckets * sizeof(struct UT_hash_bucket)); \ + (tbl)->ideal_chain_maxlen = \ + ((tbl)->num_items >> ((tbl)->log2_num_buckets+1U)) + \ + ((((tbl)->num_items & (((tbl)->num_buckets*2U)-1U)) != 0U) ? 1U : 0U); \ + (tbl)->nonideal_items = 0; \ + for (_he_bkt_i = 0; _he_bkt_i < (tbl)->num_buckets; _he_bkt_i++) { \ + _he_thh = (tbl)->buckets[ _he_bkt_i ].hh_head; \ + while (_he_thh != NULL) { \ + _he_hh_nxt = _he_thh->hh_next; \ + HASH_TO_BKT(_he_thh->hashv, (tbl)->num_buckets * 2U, _he_bkt); \ + _he_newbkt = &(_he_new_buckets[_he_bkt]); \ + if (++(_he_newbkt->count) > (tbl)->ideal_chain_maxlen) { \ + (tbl)->nonideal_items++; \ + _he_newbkt->expand_mult = _he_newbkt->count / (tbl)->ideal_chain_maxlen; \ + } \ + _he_thh->hh_prev = NULL; \ + _he_thh->hh_next = _he_newbkt->hh_head; \ + if (_he_newbkt->hh_head != NULL) { \ + _he_newbkt->hh_head->hh_prev = _he_thh; \ + } \ + _he_newbkt->hh_head = _he_thh; \ + _he_thh = _he_hh_nxt; \ + } \ + } \ + uthash_free((tbl)->buckets, (tbl)->num_buckets * sizeof(struct UT_hash_bucket)); \ + (tbl)->num_buckets *= 2U; \ + (tbl)->log2_num_buckets++; \ + (tbl)->buckets = _he_new_buckets; \ + (tbl)->ineff_expands = ((tbl)->nonideal_items > ((tbl)->num_items >> 1)) ? \ + ((tbl)->ineff_expands+1U) : 0U; \ + if ((tbl)->ineff_expands > 1U) { \ + (tbl)->noexpand = 1; \ + uthash_noexpand_fyi(tbl); \ + } \ + uthash_expand_fyi(tbl); \ +} while (0) + + +/* This is an adaptation of Simon Tatham's O(n log(n)) mergesort */ +/* Note that HASH_SORT assumes the hash handle name to be hh. + * HASH_SRT was added to allow the hash handle name to be passed in. */ +#define HASH_SORT(head,cmpfcn) HASH_SRT(hh,head,cmpfcn) +#define HASH_SRT(hh,head,cmpfcn) \ +do { \ + unsigned _hs_i; \ + unsigned _hs_looping,_hs_nmerges,_hs_insize,_hs_psize,_hs_qsize; \ + struct UT_hash_handle *_hs_p, *_hs_q, *_hs_e, *_hs_list, *_hs_tail; \ + if (head != NULL) { \ + _hs_insize = 1; \ + _hs_looping = 1; \ + _hs_list = &((head)->hh); \ + while (_hs_looping != 0U) { \ + _hs_p = _hs_list; \ + _hs_list = NULL; \ + _hs_tail = NULL; \ + _hs_nmerges = 0; \ + while (_hs_p != NULL) { \ + _hs_nmerges++; \ + _hs_q = _hs_p; \ + _hs_psize = 0; \ + for (_hs_i = 0; _hs_i < _hs_insize; ++_hs_i) { \ + _hs_psize++; \ + _hs_q = ((_hs_q->next != NULL) ? \ + HH_FROM_ELMT((head)->hh.tbl, _hs_q->next) : NULL); \ + if (_hs_q == NULL) { \ + break; \ + } \ + } \ + _hs_qsize = _hs_insize; \ + while ((_hs_psize != 0U) || ((_hs_qsize != 0U) && (_hs_q != NULL))) { \ + if (_hs_psize == 0U) { \ + _hs_e = _hs_q; \ + _hs_q = ((_hs_q->next != NULL) ? \ + HH_FROM_ELMT((head)->hh.tbl, _hs_q->next) : NULL); \ + _hs_qsize--; \ + } else if ((_hs_qsize == 0U) || (_hs_q == NULL)) { \ + _hs_e = _hs_p; \ + if (_hs_p != NULL) { \ + _hs_p = ((_hs_p->next != NULL) ? \ + HH_FROM_ELMT((head)->hh.tbl, _hs_p->next) : NULL); \ + } \ + _hs_psize--; \ + } else if ((cmpfcn( \ + DECLTYPE(head)(ELMT_FROM_HH((head)->hh.tbl, _hs_p)), \ + DECLTYPE(head)(ELMT_FROM_HH((head)->hh.tbl, _hs_q)) \ + )) <= 0) { \ + _hs_e = _hs_p; \ + if (_hs_p != NULL) { \ + _hs_p = ((_hs_p->next != NULL) ? \ + HH_FROM_ELMT((head)->hh.tbl, _hs_p->next) : NULL); \ + } \ + _hs_psize--; \ + } else { \ + _hs_e = _hs_q; \ + _hs_q = ((_hs_q->next != NULL) ? \ + HH_FROM_ELMT((head)->hh.tbl, _hs_q->next) : NULL); \ + _hs_qsize--; \ + } \ + if ( _hs_tail != NULL ) { \ + _hs_tail->next = ((_hs_e != NULL) ? \ + ELMT_FROM_HH((head)->hh.tbl, _hs_e) : NULL); \ + } else { \ + _hs_list = _hs_e; \ + } \ + if (_hs_e != NULL) { \ + _hs_e->prev = ((_hs_tail != NULL) ? \ + ELMT_FROM_HH((head)->hh.tbl, _hs_tail) : NULL); \ + } \ + _hs_tail = _hs_e; \ + } \ + _hs_p = _hs_q; \ + } \ + if (_hs_tail != NULL) { \ + _hs_tail->next = NULL; \ + } \ + if (_hs_nmerges <= 1U) { \ + _hs_looping = 0; \ + (head)->hh.tbl->tail = _hs_tail; \ + DECLTYPE_ASSIGN(head, ELMT_FROM_HH((head)->hh.tbl, _hs_list)); \ + } \ + _hs_insize *= 2U; \ + } \ + HASH_FSCK(hh, head, "HASH_SRT"); \ + } \ +} while (0) + +/* This function selects items from one hash into another hash. + * The end result is that the selected items have dual presence + * in both hashes. There is no copy of the items made; rather + * they are added into the new hash through a secondary hash + * hash handle that must be present in the structure. */ +#define HASH_SELECT(hh_dst, dst, hh_src, src, cond) \ +do { \ + unsigned _src_bkt, _dst_bkt; \ + void *_last_elt = NULL, *_elt; \ + UT_hash_handle *_src_hh, *_dst_hh, *_last_elt_hh=NULL; \ + ptrdiff_t _dst_hho = ((char*)(&(dst)->hh_dst) - (char*)(dst)); \ + if ((src) != NULL) { \ + for (_src_bkt=0; _src_bkt < (src)->hh_src.tbl->num_buckets; _src_bkt++) { \ + for (_src_hh = (src)->hh_src.tbl->buckets[_src_bkt].hh_head; \ + _src_hh != NULL; \ + _src_hh = _src_hh->hh_next) { \ + _elt = ELMT_FROM_HH((src)->hh_src.tbl, _src_hh); \ + if (cond(_elt)) { \ + _dst_hh = (UT_hash_handle*)(((char*)_elt) + _dst_hho); \ + _dst_hh->key = _src_hh->key; \ + _dst_hh->keylen = _src_hh->keylen; \ + _dst_hh->hashv = _src_hh->hashv; \ + _dst_hh->prev = _last_elt; \ + _dst_hh->next = NULL; \ + if (_last_elt_hh != NULL) { \ + _last_elt_hh->next = _elt; \ + } \ + if ((dst) == NULL) { \ + DECLTYPE_ASSIGN(dst, _elt); \ + HASH_MAKE_TABLE(hh_dst, dst); \ + } else { \ + _dst_hh->tbl = (dst)->hh_dst.tbl; \ + } \ + HASH_TO_BKT(_dst_hh->hashv, _dst_hh->tbl->num_buckets, _dst_bkt); \ + HASH_ADD_TO_BKT(_dst_hh->tbl->buckets[_dst_bkt], _dst_hh); \ + HASH_BLOOM_ADD(_dst_hh->tbl, _dst_hh->hashv); \ + (dst)->hh_dst.tbl->num_items++; \ + _last_elt = _elt; \ + _last_elt_hh = _dst_hh; \ + } \ + } \ + } \ + } \ + HASH_FSCK(hh_dst, dst, "HASH_SELECT"); \ +} while (0) + +#define HASH_CLEAR(hh,head) \ +do { \ + if ((head) != NULL) { \ + HASH_BLOOM_FREE((head)->hh.tbl); \ + uthash_free((head)->hh.tbl->buckets, \ + (head)->hh.tbl->num_buckets*sizeof(struct UT_hash_bucket)); \ + uthash_free((head)->hh.tbl, sizeof(UT_hash_table)); \ + (head) = NULL; \ + } \ +} while (0) + +#define HASH_OVERHEAD(hh,head) \ + (((head) != NULL) ? ( \ + (size_t)(((head)->hh.tbl->num_items * sizeof(UT_hash_handle)) + \ + ((head)->hh.tbl->num_buckets * sizeof(UT_hash_bucket)) + \ + sizeof(UT_hash_table) + \ + (HASH_BLOOM_BYTELEN))) : 0U) + +#ifdef NO_DECLTYPE +#define HASH_ITER(hh,head,el,tmp) \ +for(((el)=(head)), ((*(char**)(&(tmp)))=(char*)((head!=NULL)?(head)->hh.next:NULL)); \ + (el) != NULL; ((el)=(tmp)), ((*(char**)(&(tmp)))=(char*)((tmp!=NULL)?(tmp)->hh.next:NULL))) +#else +#define HASH_ITER(hh,head,el,tmp) \ +for(((el)=(head)), ((tmp)=DECLTYPE(el)((head!=NULL)?(head)->hh.next:NULL)); \ + (el) != NULL; ((el)=(tmp)), ((tmp)=DECLTYPE(el)((tmp!=NULL)?(tmp)->hh.next:NULL))) +#endif + +/* obtain a count of items in the hash */ +#define HASH_COUNT(head) HASH_CNT(hh,head) +#define HASH_CNT(hh,head) ((head != NULL)?((head)->hh.tbl->num_items):0U) + +typedef struct UT_hash_bucket { + struct UT_hash_handle *hh_head; + unsigned count; + + /* expand_mult is normally set to 0. In this situation, the max chain length + * threshold is enforced at its default value, HASH_BKT_CAPACITY_THRESH. (If + * the bucket's chain exceeds this length, bucket expansion is triggered). + * However, setting expand_mult to a non-zero value delays bucket expansion + * (that would be triggered by additions to this particular bucket) + * until its chain length reaches a *multiple* of HASH_BKT_CAPACITY_THRESH. + * (The multiplier is simply expand_mult+1). The whole idea of this + * multiplier is to reduce bucket expansions, since they are expensive, in + * situations where we know that a particular bucket tends to be overused. + * It is better to let its chain length grow to a longer yet-still-bounded + * value, than to do an O(n) bucket expansion too often. + */ + unsigned expand_mult; + +} UT_hash_bucket; + +/* random signature used only to find hash tables in external analysis */ +#define HASH_SIGNATURE 0xa0111fe1u +#define HASH_BLOOM_SIGNATURE 0xb12220f2u + +typedef struct UT_hash_table { + UT_hash_bucket *buckets; + unsigned num_buckets, log2_num_buckets; + unsigned num_items; + struct UT_hash_handle *tail; /* tail hh in app order, for fast append */ + ptrdiff_t hho; /* hash handle offset (byte pos of hash handle in element */ + + /* in an ideal situation (all buckets used equally), no bucket would have + * more than ceil(#items/#buckets) items. that's the ideal chain length. */ + unsigned ideal_chain_maxlen; + + /* nonideal_items is the number of items in the hash whose chain position + * exceeds the ideal chain maxlen. these items pay the penalty for an uneven + * hash distribution; reaching them in a chain traversal takes >ideal steps */ + unsigned nonideal_items; + + /* ineffective expands occur when a bucket doubling was performed, but + * afterward, more than half the items in the hash had nonideal chain + * positions. If this happens on two consecutive expansions we inhibit any + * further expansion, as it's not helping; this happens when the hash + * function isn't a good fit for the key domain. When expansion is inhibited + * the hash will still work, albeit no longer in constant time. */ + unsigned ineff_expands, noexpand; + + uint32_t signature; /* used only to find hash tables in external analysis */ +#ifdef HASH_BLOOM + uint32_t bloom_sig; /* used only to test bloom exists in external analysis */ + uint8_t *bloom_bv; + uint8_t bloom_nbits; +#endif + +} UT_hash_table; + +typedef struct UT_hash_handle { + struct UT_hash_table *tbl; + void *prev; /* prev element in app order */ + void *next; /* next element in app order */ + struct UT_hash_handle *hh_prev; /* previous hh in bucket order */ + struct UT_hash_handle *hh_next; /* next hh in bucket order */ + void *key; /* ptr to enclosing struct's key */ + unsigned keylen; /* enclosing struct's key len */ + unsigned hashv; /* result of hash-fcn(key) */ +} UT_hash_handle; + +#endif /* UTHASH_H */ diff --git a/linux32/inc/uthash/utlist.h b/linux32/inc/uthash/utlist.h new file mode 100644 index 0000000..0e5e287 --- /dev/null +++ b/linux32/inc/uthash/utlist.h @@ -0,0 +1,1073 @@ +/* +Copyright (c) 2007-2017, Troy D. Hanson http://troydhanson.github.com/uthash/ +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER +OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef UTLIST_H +#define UTLIST_H + +#define UTLIST_VERSION 2.0.2 + +#include + +/* + * This file contains macros to manipulate singly and doubly-linked lists. + * + * 1. LL_ macros: singly-linked lists. + * 2. DL_ macros: doubly-linked lists. + * 3. CDL_ macros: circular doubly-linked lists. + * + * To use singly-linked lists, your structure must have a "next" pointer. + * To use doubly-linked lists, your structure must "prev" and "next" pointers. + * Either way, the pointer to the head of the list must be initialized to NULL. + * + * ----------------.EXAMPLE ------------------------- + * struct item { + * int id; + * struct item *prev, *next; + * } + * + * struct item *list = NULL: + * + * int main() { + * struct item *item; + * ... allocate and populate item ... + * DL_APPEND(list, item); + * } + * -------------------------------------------------- + * + * For doubly-linked lists, the append and delete macros are O(1) + * For singly-linked lists, append and delete are O(n) but prepend is O(1) + * The sort macro is O(n log(n)) for all types of single/double/circular lists. + */ + +/* These macros use decltype or the earlier __typeof GNU extension. + As decltype is only available in newer compilers (VS2010 or gcc 4.3+ + when compiling c++ source) this code uses whatever method is needed + or, for VS2008 where neither is available, uses casting workarounds. */ +#if !defined(LDECLTYPE) && !defined(NO_DECLTYPE) +#if defined(_MSC_VER) /* MS compiler */ +#if _MSC_VER >= 1600 && defined(__cplusplus) /* VS2010 or newer in C++ mode */ +#define LDECLTYPE(x) decltype(x) +#else /* VS2008 or older (or VS2010 in C mode) */ +#define NO_DECLTYPE +#endif +#elif defined(__BORLANDC__) || defined(__ICCARM__) || defined(__LCC__) || defined(__WATCOMC__) +#define NO_DECLTYPE +#else /* GNU, Sun and other compilers */ +#define LDECLTYPE(x) __typeof(x) +#endif +#endif + +/* for VS2008 we use some workarounds to get around the lack of decltype, + * namely, we always reassign our tmp variable to the list head if we need + * to dereference its prev/next pointers, and save/restore the real head.*/ +#ifdef NO_DECLTYPE +#define IF_NO_DECLTYPE(x) x +#define LDECLTYPE(x) char* +#define UTLIST_SV(elt,list) _tmp = (char*)(list); {char **_alias = (char**)&(list); *_alias = (elt); } +#define UTLIST_NEXT(elt,list,next) ((char*)((list)->next)) +#define UTLIST_NEXTASGN(elt,list,to,next) { char **_alias = (char**)&((list)->next); *_alias=(char*)(to); } +/* #define UTLIST_PREV(elt,list,prev) ((char*)((list)->prev)) */ +#define UTLIST_PREVASGN(elt,list,to,prev) { char **_alias = (char**)&((list)->prev); *_alias=(char*)(to); } +#define UTLIST_RS(list) { char **_alias = (char**)&(list); *_alias=_tmp; } +#define UTLIST_CASTASGN(a,b) { char **_alias = (char**)&(a); *_alias=(char*)(b); } +#else +#define IF_NO_DECLTYPE(x) +#define UTLIST_SV(elt,list) +#define UTLIST_NEXT(elt,list,next) ((elt)->next) +#define UTLIST_NEXTASGN(elt,list,to,next) ((elt)->next)=(to) +/* #define UTLIST_PREV(elt,list,prev) ((elt)->prev) */ +#define UTLIST_PREVASGN(elt,list,to,prev) ((elt)->prev)=(to) +#define UTLIST_RS(list) +#define UTLIST_CASTASGN(a,b) (a)=(b) +#endif + +/****************************************************************************** + * The sort macro is an adaptation of Simon Tatham's O(n log(n)) mergesort * + * Unwieldy variable names used here to avoid shadowing passed-in variables. * + *****************************************************************************/ +#define LL_SORT(list, cmp) \ + LL_SORT2(list, cmp, next) + +#define LL_SORT2(list, cmp, next) \ +do { \ + LDECLTYPE(list) _ls_p; \ + LDECLTYPE(list) _ls_q; \ + LDECLTYPE(list) _ls_e; \ + LDECLTYPE(list) _ls_tail; \ + IF_NO_DECLTYPE(LDECLTYPE(list) _tmp;) \ + int _ls_insize, _ls_nmerges, _ls_psize, _ls_qsize, _ls_i, _ls_looping; \ + if (list) { \ + _ls_insize = 1; \ + _ls_looping = 1; \ + while (_ls_looping) { \ + UTLIST_CASTASGN(_ls_p,list); \ + (list) = NULL; \ + _ls_tail = NULL; \ + _ls_nmerges = 0; \ + while (_ls_p) { \ + _ls_nmerges++; \ + _ls_q = _ls_p; \ + _ls_psize = 0; \ + for (_ls_i = 0; _ls_i < _ls_insize; _ls_i++) { \ + _ls_psize++; \ + UTLIST_SV(_ls_q,list); _ls_q = UTLIST_NEXT(_ls_q,list,next); UTLIST_RS(list); \ + if (!_ls_q) break; \ + } \ + _ls_qsize = _ls_insize; \ + while (_ls_psize > 0 || (_ls_qsize > 0 && _ls_q)) { \ + if (_ls_psize == 0) { \ + _ls_e = _ls_q; UTLIST_SV(_ls_q,list); _ls_q = \ + UTLIST_NEXT(_ls_q,list,next); UTLIST_RS(list); _ls_qsize--; \ + } else if (_ls_qsize == 0 || !_ls_q) { \ + _ls_e = _ls_p; UTLIST_SV(_ls_p,list); _ls_p = \ + UTLIST_NEXT(_ls_p,list,next); UTLIST_RS(list); _ls_psize--; \ + } else if (cmp(_ls_p,_ls_q) <= 0) { \ + _ls_e = _ls_p; UTLIST_SV(_ls_p,list); _ls_p = \ + UTLIST_NEXT(_ls_p,list,next); UTLIST_RS(list); _ls_psize--; \ + } else { \ + _ls_e = _ls_q; UTLIST_SV(_ls_q,list); _ls_q = \ + UTLIST_NEXT(_ls_q,list,next); UTLIST_RS(list); _ls_qsize--; \ + } \ + if (_ls_tail) { \ + UTLIST_SV(_ls_tail,list); UTLIST_NEXTASGN(_ls_tail,list,_ls_e,next); UTLIST_RS(list); \ + } else { \ + UTLIST_CASTASGN(list,_ls_e); \ + } \ + _ls_tail = _ls_e; \ + } \ + _ls_p = _ls_q; \ + } \ + if (_ls_tail) { \ + UTLIST_SV(_ls_tail,list); UTLIST_NEXTASGN(_ls_tail,list,NULL,next); UTLIST_RS(list); \ + } \ + if (_ls_nmerges <= 1) { \ + _ls_looping=0; \ + } \ + _ls_insize *= 2; \ + } \ + } \ +} while (0) + + +#define DL_SORT(list, cmp) \ + DL_SORT2(list, cmp, prev, next) + +#define DL_SORT2(list, cmp, prev, next) \ +do { \ + LDECLTYPE(list) _ls_p; \ + LDECLTYPE(list) _ls_q; \ + LDECLTYPE(list) _ls_e; \ + LDECLTYPE(list) _ls_tail; \ + IF_NO_DECLTYPE(LDECLTYPE(list) _tmp;) \ + int _ls_insize, _ls_nmerges, _ls_psize, _ls_qsize, _ls_i, _ls_looping; \ + if (list) { \ + _ls_insize = 1; \ + _ls_looping = 1; \ + while (_ls_looping) { \ + UTLIST_CASTASGN(_ls_p,list); \ + (list) = NULL; \ + _ls_tail = NULL; \ + _ls_nmerges = 0; \ + while (_ls_p) { \ + _ls_nmerges++; \ + _ls_q = _ls_p; \ + _ls_psize = 0; \ + for (_ls_i = 0; _ls_i < _ls_insize; _ls_i++) { \ + _ls_psize++; \ + UTLIST_SV(_ls_q,list); _ls_q = UTLIST_NEXT(_ls_q,list,next); UTLIST_RS(list); \ + if (!_ls_q) break; \ + } \ + _ls_qsize = _ls_insize; \ + while ((_ls_psize > 0) || ((_ls_qsize > 0) && _ls_q)) { \ + if (_ls_psize == 0) { \ + _ls_e = _ls_q; UTLIST_SV(_ls_q,list); _ls_q = \ + UTLIST_NEXT(_ls_q,list,next); UTLIST_RS(list); _ls_qsize--; \ + } else if ((_ls_qsize == 0) || (!_ls_q)) { \ + _ls_e = _ls_p; UTLIST_SV(_ls_p,list); _ls_p = \ + UTLIST_NEXT(_ls_p,list,next); UTLIST_RS(list); _ls_psize--; \ + } else if (cmp(_ls_p,_ls_q) <= 0) { \ + _ls_e = _ls_p; UTLIST_SV(_ls_p,list); _ls_p = \ + UTLIST_NEXT(_ls_p,list,next); UTLIST_RS(list); _ls_psize--; \ + } else { \ + _ls_e = _ls_q; UTLIST_SV(_ls_q,list); _ls_q = \ + UTLIST_NEXT(_ls_q,list,next); UTLIST_RS(list); _ls_qsize--; \ + } \ + if (_ls_tail) { \ + UTLIST_SV(_ls_tail,list); UTLIST_NEXTASGN(_ls_tail,list,_ls_e,next); UTLIST_RS(list); \ + } else { \ + UTLIST_CASTASGN(list,_ls_e); \ + } \ + UTLIST_SV(_ls_e,list); UTLIST_PREVASGN(_ls_e,list,_ls_tail,prev); UTLIST_RS(list); \ + _ls_tail = _ls_e; \ + } \ + _ls_p = _ls_q; \ + } \ + UTLIST_CASTASGN((list)->prev, _ls_tail); \ + UTLIST_SV(_ls_tail,list); UTLIST_NEXTASGN(_ls_tail,list,NULL,next); UTLIST_RS(list); \ + if (_ls_nmerges <= 1) { \ + _ls_looping=0; \ + } \ + _ls_insize *= 2; \ + } \ + } \ +} while (0) + +#define CDL_SORT(list, cmp) \ + CDL_SORT2(list, cmp, prev, next) + +#define CDL_SORT2(list, cmp, prev, next) \ +do { \ + LDECLTYPE(list) _ls_p; \ + LDECLTYPE(list) _ls_q; \ + LDECLTYPE(list) _ls_e; \ + LDECLTYPE(list) _ls_tail; \ + LDECLTYPE(list) _ls_oldhead; \ + LDECLTYPE(list) _tmp; \ + int _ls_insize, _ls_nmerges, _ls_psize, _ls_qsize, _ls_i, _ls_looping; \ + if (list) { \ + _ls_insize = 1; \ + _ls_looping = 1; \ + while (_ls_looping) { \ + UTLIST_CASTASGN(_ls_p,list); \ + UTLIST_CASTASGN(_ls_oldhead,list); \ + (list) = NULL; \ + _ls_tail = NULL; \ + _ls_nmerges = 0; \ + while (_ls_p) { \ + _ls_nmerges++; \ + _ls_q = _ls_p; \ + _ls_psize = 0; \ + for (_ls_i = 0; _ls_i < _ls_insize; _ls_i++) { \ + _ls_psize++; \ + UTLIST_SV(_ls_q,list); \ + if (UTLIST_NEXT(_ls_q,list,next) == _ls_oldhead) { \ + _ls_q = NULL; \ + } else { \ + _ls_q = UTLIST_NEXT(_ls_q,list,next); \ + } \ + UTLIST_RS(list); \ + if (!_ls_q) break; \ + } \ + _ls_qsize = _ls_insize; \ + while (_ls_psize > 0 || (_ls_qsize > 0 && _ls_q)) { \ + if (_ls_psize == 0) { \ + _ls_e = _ls_q; UTLIST_SV(_ls_q,list); _ls_q = \ + UTLIST_NEXT(_ls_q,list,next); UTLIST_RS(list); _ls_qsize--; \ + if (_ls_q == _ls_oldhead) { _ls_q = NULL; } \ + } else if (_ls_qsize == 0 || !_ls_q) { \ + _ls_e = _ls_p; UTLIST_SV(_ls_p,list); _ls_p = \ + UTLIST_NEXT(_ls_p,list,next); UTLIST_RS(list); _ls_psize--; \ + if (_ls_p == _ls_oldhead) { _ls_p = NULL; } \ + } else if (cmp(_ls_p,_ls_q) <= 0) { \ + _ls_e = _ls_p; UTLIST_SV(_ls_p,list); _ls_p = \ + UTLIST_NEXT(_ls_p,list,next); UTLIST_RS(list); _ls_psize--; \ + if (_ls_p == _ls_oldhead) { _ls_p = NULL; } \ + } else { \ + _ls_e = _ls_q; UTLIST_SV(_ls_q,list); _ls_q = \ + UTLIST_NEXT(_ls_q,list,next); UTLIST_RS(list); _ls_qsize--; \ + if (_ls_q == _ls_oldhead) { _ls_q = NULL; } \ + } \ + if (_ls_tail) { \ + UTLIST_SV(_ls_tail,list); UTLIST_NEXTASGN(_ls_tail,list,_ls_e,next); UTLIST_RS(list); \ + } else { \ + UTLIST_CASTASGN(list,_ls_e); \ + } \ + UTLIST_SV(_ls_e,list); UTLIST_PREVASGN(_ls_e,list,_ls_tail,prev); UTLIST_RS(list); \ + _ls_tail = _ls_e; \ + } \ + _ls_p = _ls_q; \ + } \ + UTLIST_CASTASGN((list)->prev,_ls_tail); \ + UTLIST_CASTASGN(_tmp,list); \ + UTLIST_SV(_ls_tail,list); UTLIST_NEXTASGN(_ls_tail,list,_tmp,next); UTLIST_RS(list); \ + if (_ls_nmerges <= 1) { \ + _ls_looping=0; \ + } \ + _ls_insize *= 2; \ + } \ + } \ +} while (0) + +/****************************************************************************** + * singly linked list macros (non-circular) * + *****************************************************************************/ +#define LL_PREPEND(head,add) \ + LL_PREPEND2(head,add,next) + +#define LL_PREPEND2(head,add,next) \ +do { \ + (add)->next = (head); \ + (head) = (add); \ +} while (0) + +#define LL_CONCAT(head1,head2) \ + LL_CONCAT2(head1,head2,next) + +#define LL_CONCAT2(head1,head2,next) \ +do { \ + LDECLTYPE(head1) _tmp; \ + if (head1) { \ + _tmp = (head1); \ + while (_tmp->next) { _tmp = _tmp->next; } \ + _tmp->next=(head2); \ + } else { \ + (head1)=(head2); \ + } \ +} while (0) + +#define LL_APPEND(head,add) \ + LL_APPEND2(head,add,next) + +#define LL_APPEND2(head,add,next) \ +do { \ + LDECLTYPE(head) _tmp; \ + (add)->next=NULL; \ + if (head) { \ + _tmp = (head); \ + while (_tmp->next) { _tmp = _tmp->next; } \ + _tmp->next=(add); \ + } else { \ + (head)=(add); \ + } \ +} while (0) + +#define LL_INSERT_INORDER(head,add,cmp) \ + LL_INSERT_INORDER2(head,add,cmp,next) + +#define LL_INSERT_INORDER2(head,add,cmp,next) \ +do { \ + LDECLTYPE(head) _tmp; \ + if (head) { \ + LL_LOWER_BOUND(head, _tmp, add, cmp); \ + LL_APPEND_ELEM(head, _tmp, add); \ + } else { \ + (head) = (add); \ + (head)->next = NULL; \ + } \ +} while (0) + +#define LL_LOWER_BOUND(head,elt,like,cmp) \ + LL_LOWER_BOUND2(head,elt,like,cmp,next) + +#define LL_LOWER_BOUND2(head,elt,like,cmp,next) \ + do { \ + if ((head) == NULL || (cmp(head, like)) >= 0) { \ + (elt) = NULL; \ + } else { \ + for ((elt) = (head); (elt)->next != NULL; (elt) = (elt)->next) { \ + if (cmp((elt)->next, like) >= 0) { \ + break; \ + } \ + } \ + } \ + } while (0) + +#define LL_DELETE(head,del) \ + LL_DELETE2(head,del,next) + +#define LL_DELETE2(head,del,next) \ +do { \ + LDECLTYPE(head) _tmp; \ + if ((head) == (del)) { \ + (head)=(head)->next; \ + } else { \ + _tmp = (head); \ + while (_tmp->next && (_tmp->next != (del))) { \ + _tmp = _tmp->next; \ + } \ + if (_tmp->next) { \ + _tmp->next = (del)->next; \ + } \ + } \ +} while (0) + +#define LL_COUNT(head,el,counter) \ + LL_COUNT2(head,el,counter,next) \ + +#define LL_COUNT2(head,el,counter,next) \ +do { \ + (counter) = 0; \ + LL_FOREACH2(head,el,next) { ++(counter); } \ +} while (0) + +#define LL_FOREACH(head,el) \ + LL_FOREACH2(head,el,next) + +#define LL_FOREACH2(head,el,next) \ + for ((el) = (head); el; (el) = (el)->next) + +#define LL_FOREACH_SAFE(head,el,tmp) \ + LL_FOREACH_SAFE2(head,el,tmp,next) + +#define LL_FOREACH_SAFE2(head,el,tmp,next) \ + for ((el) = (head); (el) && ((tmp) = (el)->next, 1); (el) = (tmp)) + +#define LL_SEARCH_SCALAR(head,out,field,val) \ + LL_SEARCH_SCALAR2(head,out,field,val,next) + +#define LL_SEARCH_SCALAR2(head,out,field,val,next) \ +do { \ + LL_FOREACH2(head,out,next) { \ + if ((out)->field == (val)) break; \ + } \ +} while (0) + +#define LL_SEARCH(head,out,elt,cmp) \ + LL_SEARCH2(head,out,elt,cmp,next) + +#define LL_SEARCH2(head,out,elt,cmp,next) \ +do { \ + LL_FOREACH2(head,out,next) { \ + if ((cmp(out,elt))==0) break; \ + } \ +} while (0) + +#define LL_REPLACE_ELEM2(head, el, add, next) \ +do { \ + LDECLTYPE(head) _tmp; \ + assert((head) != NULL); \ + assert((el) != NULL); \ + assert((add) != NULL); \ + (add)->next = (el)->next; \ + if ((head) == (el)) { \ + (head) = (add); \ + } else { \ + _tmp = (head); \ + while (_tmp->next && (_tmp->next != (el))) { \ + _tmp = _tmp->next; \ + } \ + if (_tmp->next) { \ + _tmp->next = (add); \ + } \ + } \ +} while (0) + +#define LL_REPLACE_ELEM(head, el, add) \ + LL_REPLACE_ELEM2(head, el, add, next) + +#define LL_PREPEND_ELEM2(head, el, add, next) \ +do { \ + if (el) { \ + LDECLTYPE(head) _tmp; \ + assert((head) != NULL); \ + assert((add) != NULL); \ + (add)->next = (el); \ + if ((head) == (el)) { \ + (head) = (add); \ + } else { \ + _tmp = (head); \ + while (_tmp->next && (_tmp->next != (el))) { \ + _tmp = _tmp->next; \ + } \ + if (_tmp->next) { \ + _tmp->next = (add); \ + } \ + } \ + } else { \ + LL_APPEND2(head, add, next); \ + } \ +} while (0) \ + +#define LL_PREPEND_ELEM(head, el, add) \ + LL_PREPEND_ELEM2(head, el, add, next) + +#define LL_APPEND_ELEM2(head, el, add, next) \ +do { \ + if (el) { \ + assert((head) != NULL); \ + assert((add) != NULL); \ + (add)->next = (el)->next; \ + (el)->next = (add); \ + } else { \ + LL_PREPEND2(head, add, next); \ + } \ +} while (0) \ + +#define LL_APPEND_ELEM(head, el, add) \ + LL_APPEND_ELEM2(head, el, add, next) + +#ifdef NO_DECLTYPE +/* Here are VS2008 / NO_DECLTYPE replacements for a few functions */ + +#undef LL_CONCAT2 +#define LL_CONCAT2(head1,head2,next) \ +do { \ + char *_tmp; \ + if (head1) { \ + _tmp = (char*)(head1); \ + while ((head1)->next) { (head1) = (head1)->next; } \ + (head1)->next = (head2); \ + UTLIST_RS(head1); \ + } else { \ + (head1)=(head2); \ + } \ +} while (0) + +#undef LL_APPEND2 +#define LL_APPEND2(head,add,next) \ +do { \ + if (head) { \ + (add)->next = head; /* use add->next as a temp variable */ \ + while ((add)->next->next) { (add)->next = (add)->next->next; } \ + (add)->next->next=(add); \ + } else { \ + (head)=(add); \ + } \ + (add)->next=NULL; \ +} while (0) + +#undef LL_INSERT_INORDER2 +#define LL_INSERT_INORDER2(head,add,cmp,next) \ +do { \ + if ((head) == NULL || (cmp(head, add)) >= 0) { \ + (add)->next = (head); \ + (head) = (add); \ + } else { \ + char *_tmp = (char*)(head); \ + while ((head)->next != NULL && (cmp((head)->next, add)) < 0) { \ + (head) = (head)->next; \ + } \ + (add)->next = (head)->next; \ + (head)->next = (add); \ + UTLIST_RS(head); \ + } \ +} while (0) + +#undef LL_DELETE2 +#define LL_DELETE2(head,del,next) \ +do { \ + if ((head) == (del)) { \ + (head)=(head)->next; \ + } else { \ + char *_tmp = (char*)(head); \ + while ((head)->next && ((head)->next != (del))) { \ + (head) = (head)->next; \ + } \ + if ((head)->next) { \ + (head)->next = ((del)->next); \ + } \ + UTLIST_RS(head); \ + } \ +} while (0) + +#undef LL_REPLACE_ELEM2 +#define LL_REPLACE_ELEM2(head, el, add, next) \ +do { \ + assert((head) != NULL); \ + assert((el) != NULL); \ + assert((add) != NULL); \ + if ((head) == (el)) { \ + (head) = (add); \ + } else { \ + (add)->next = head; \ + while ((add)->next->next && ((add)->next->next != (el))) { \ + (add)->next = (add)->next->next; \ + } \ + if ((add)->next->next) { \ + (add)->next->next = (add); \ + } \ + } \ + (add)->next = (el)->next; \ +} while (0) + +#undef LL_PREPEND_ELEM2 +#define LL_PREPEND_ELEM2(head, el, add, next) \ +do { \ + if (el) { \ + assert((head) != NULL); \ + assert((add) != NULL); \ + if ((head) == (el)) { \ + (head) = (add); \ + } else { \ + (add)->next = (head); \ + while ((add)->next->next && ((add)->next->next != (el))) { \ + (add)->next = (add)->next->next; \ + } \ + if ((add)->next->next) { \ + (add)->next->next = (add); \ + } \ + } \ + (add)->next = (el); \ + } else { \ + LL_APPEND2(head, add, next); \ + } \ +} while (0) \ + +#endif /* NO_DECLTYPE */ + +/****************************************************************************** + * doubly linked list macros (non-circular) * + *****************************************************************************/ +#define DL_PREPEND(head,add) \ + DL_PREPEND2(head,add,prev,next) + +#define DL_PREPEND2(head,add,prev,next) \ +do { \ + (add)->next = (head); \ + if (head) { \ + (add)->prev = (head)->prev; \ + (head)->prev = (add); \ + } else { \ + (add)->prev = (add); \ + } \ + (head) = (add); \ +} while (0) + +#define DL_APPEND(head,add) \ + DL_APPEND2(head,add,prev,next) + +#define DL_APPEND2(head,add,prev,next) \ +do { \ + if (head) { \ + (add)->prev = (head)->prev; \ + (head)->prev->next = (add); \ + (head)->prev = (add); \ + (add)->next = NULL; \ + } else { \ + (head)=(add); \ + (head)->prev = (head); \ + (head)->next = NULL; \ + } \ +} while (0) + +#define DL_INSERT_INORDER(head,add,cmp) \ + DL_INSERT_INORDER2(head,add,cmp,next) + +#define DL_INSERT_INORDER2(head,add,cmp,next) \ +do { \ + LDECLTYPE(head) _tmp; \ + if (head) { \ + DL_LOWER_BOUND(head, _tmp, add, cmp); \ + DL_APPEND_ELEM(head, _tmp, add); \ + } else { \ + (head) = (add); \ + (head)->prev = (head); \ + (head)->next = NULL; \ + } \ +} while (0) + +#define DL_LOWER_BOUND(head,elt,like,cmp) \ + DL_LOWER_BOUND2(head,elt,like,cmp,next) + +#define DL_LOWER_BOUND2(head,elt,like,cmp,next) \ +do { \ + if ((head) == NULL || (cmp(head, like)) >= 0) { \ + (elt) = NULL; \ + } else { \ + for ((elt) = (head); (elt)->next != NULL; (elt) = (elt)->next) { \ + if ((cmp((elt)->next, like)) >= 0) { \ + break; \ + } \ + } \ + } \ +} while (0) + +#define DL_CONCAT(head1,head2) \ + DL_CONCAT2(head1,head2,prev,next) + +#define DL_CONCAT2(head1,head2,prev,next) \ +do { \ + LDECLTYPE(head1) _tmp; \ + if (head2) { \ + if (head1) { \ + UTLIST_CASTASGN(_tmp, (head2)->prev); \ + (head2)->prev = (head1)->prev; \ + (head1)->prev->next = (head2); \ + UTLIST_CASTASGN((head1)->prev, _tmp); \ + } else { \ + (head1)=(head2); \ + } \ + } \ +} while (0) + +#define DL_DELETE(head,del) \ + DL_DELETE2(head,del,prev,next) + +#define DL_DELETE2(head,del,prev,next) \ +do { \ + assert((head) != NULL); \ + assert((del)->prev != NULL); \ + if ((del)->prev == (del)) { \ + (head)=NULL; \ + } else if ((del)==(head)) { \ + (del)->next->prev = (del)->prev; \ + (head) = (del)->next; \ + } else { \ + (del)->prev->next = (del)->next; \ + if ((del)->next) { \ + (del)->next->prev = (del)->prev; \ + } else { \ + (head)->prev = (del)->prev; \ + } \ + } \ +} while (0) + +#define DL_COUNT(head,el,counter) \ + DL_COUNT2(head,el,counter,next) \ + +#define DL_COUNT2(head,el,counter,next) \ +do { \ + (counter) = 0; \ + DL_FOREACH2(head,el,next) { ++(counter); } \ +} while (0) + +#define DL_FOREACH(head,el) \ + DL_FOREACH2(head,el,next) + +#define DL_FOREACH2(head,el,next) \ + for ((el) = (head); el; (el) = (el)->next) + +/* this version is safe for deleting the elements during iteration */ +#define DL_FOREACH_SAFE(head,el,tmp) \ + DL_FOREACH_SAFE2(head,el,tmp,next) + +#define DL_FOREACH_SAFE2(head,el,tmp,next) \ + for ((el) = (head); (el) && ((tmp) = (el)->next, 1); (el) = (tmp)) + +/* these are identical to their singly-linked list counterparts */ +#define DL_SEARCH_SCALAR LL_SEARCH_SCALAR +#define DL_SEARCH LL_SEARCH +#define DL_SEARCH_SCALAR2 LL_SEARCH_SCALAR2 +#define DL_SEARCH2 LL_SEARCH2 + +#define DL_REPLACE_ELEM2(head, el, add, prev, next) \ +do { \ + assert((head) != NULL); \ + assert((el) != NULL); \ + assert((add) != NULL); \ + if ((head) == (el)) { \ + (head) = (add); \ + (add)->next = (el)->next; \ + if ((el)->next == NULL) { \ + (add)->prev = (add); \ + } else { \ + (add)->prev = (el)->prev; \ + (add)->next->prev = (add); \ + } \ + } else { \ + (add)->next = (el)->next; \ + (add)->prev = (el)->prev; \ + (add)->prev->next = (add); \ + if ((el)->next == NULL) { \ + (head)->prev = (add); \ + } else { \ + (add)->next->prev = (add); \ + } \ + } \ +} while (0) + +#define DL_REPLACE_ELEM(head, el, add) \ + DL_REPLACE_ELEM2(head, el, add, prev, next) + +#define DL_PREPEND_ELEM2(head, el, add, prev, next) \ +do { \ + if (el) { \ + assert((head) != NULL); \ + assert((add) != NULL); \ + (add)->next = (el); \ + (add)->prev = (el)->prev; \ + (el)->prev = (add); \ + if ((head) == (el)) { \ + (head) = (add); \ + } else { \ + (add)->prev->next = (add); \ + } \ + } else { \ + DL_APPEND2(head, add, prev, next); \ + } \ +} while (0) \ + +#define DL_PREPEND_ELEM(head, el, add) \ + DL_PREPEND_ELEM2(head, el, add, prev, next) + +#define DL_APPEND_ELEM2(head, el, add, prev, next) \ +do { \ + if (el) { \ + assert((head) != NULL); \ + assert((add) != NULL); \ + (add)->next = (el)->next; \ + (add)->prev = (el); \ + (el)->next = (add); \ + if ((add)->next) { \ + (add)->next->prev = (add); \ + } else { \ + (head)->prev = (add); \ + } \ + } else { \ + DL_PREPEND2(head, add, prev, next); \ + } \ +} while (0) \ + +#define DL_APPEND_ELEM(head, el, add) \ + DL_APPEND_ELEM2(head, el, add, prev, next) + +#ifdef NO_DECLTYPE +/* Here are VS2008 / NO_DECLTYPE replacements for a few functions */ + +#undef DL_INSERT_INORDER2 +#define DL_INSERT_INORDER2(head,add,cmp,next) \ +do { \ + if ((head) == NULL) { \ + (add)->prev = (add); \ + (add)->next = NULL; \ + (head) = (add); \ + } else if ((cmp(head, add)) >= 0) { \ + (add)->prev = (head)->prev; \ + (add)->next = (head); \ + (head)->prev = (add); \ + (head) = (add); \ + } else { \ + char *_tmp = (char*)(head); \ + while ((char*)(head)->next != _tmp && (cmp((head)->next, add)) < 0) { \ + (head) = (head)->next; \ + } \ + (add)->prev = (head); \ + (add)->next = (head)->next; \ + (head)->next = (add); \ + UTLIST_RS(head); \ + if ((add)->next) { \ + (add)->next->prev = (add); \ + } else { \ + (head)->prev = (add); \ + } \ + } \ +} while (0) +#endif /* NO_DECLTYPE */ + +/****************************************************************************** + * circular doubly linked list macros * + *****************************************************************************/ +#define CDL_APPEND(head,add) \ + CDL_APPEND2(head,add,prev,next) + +#define CDL_APPEND2(head,add,prev,next) \ +do { \ + if (head) { \ + (add)->prev = (head)->prev; \ + (add)->next = (head); \ + (head)->prev = (add); \ + (add)->prev->next = (add); \ + } else { \ + (add)->prev = (add); \ + (add)->next = (add); \ + (head) = (add); \ + } \ +} while (0) + +#define CDL_PREPEND(head,add) \ + CDL_PREPEND2(head,add,prev,next) + +#define CDL_PREPEND2(head,add,prev,next) \ +do { \ + if (head) { \ + (add)->prev = (head)->prev; \ + (add)->next = (head); \ + (head)->prev = (add); \ + (add)->prev->next = (add); \ + } else { \ + (add)->prev = (add); \ + (add)->next = (add); \ + } \ + (head) = (add); \ +} while (0) + +#define CDL_INSERT_INORDER(head,add,cmp) \ + CDL_INSERT_INORDER2(head,add,cmp,next) + +#define CDL_INSERT_INORDER2(head,add,cmp,next) \ +do { \ + LDECLTYPE(head) _tmp; \ + if (head) { \ + CDL_LOWER_BOUND(head, _tmp, add, cmp); \ + CDL_APPEND_ELEM(head, _tmp, add); \ + } else { \ + (head) = (add); \ + (head)->next = (head); \ + (head)->prev = (head); \ + } \ +} while (0) + +#define CDL_LOWER_BOUND(head,elt,like,cmp) \ + CDL_LOWER_BOUND2(head,elt,like,cmp,next) + +#define CDL_LOWER_BOUND2(head,elt,like,cmp,next) \ +do { \ + if ((head) == NULL || (cmp(head, like)) >= 0) { \ + (elt) = NULL; \ + } else { \ + for ((elt) = (head); (elt)->next != (head); (elt) = (elt)->next) { \ + if ((cmp((elt)->next, like)) >= 0) { \ + break; \ + } \ + } \ + } \ +} while (0) + +#define CDL_DELETE(head,del) \ + CDL_DELETE2(head,del,prev,next) + +#define CDL_DELETE2(head,del,prev,next) \ +do { \ + if (((head)==(del)) && ((head)->next == (head))) { \ + (head) = NULL; \ + } else { \ + (del)->next->prev = (del)->prev; \ + (del)->prev->next = (del)->next; \ + if ((del) == (head)) (head)=(del)->next; \ + } \ +} while (0) + +#define CDL_COUNT(head,el,counter) \ + CDL_COUNT2(head,el,counter,next) \ + +#define CDL_COUNT2(head, el, counter,next) \ +do { \ + (counter) = 0; \ + CDL_FOREACH2(head,el,next) { ++(counter); } \ +} while (0) + +#define CDL_FOREACH(head,el) \ + CDL_FOREACH2(head,el,next) + +#define CDL_FOREACH2(head,el,next) \ + for ((el)=(head);el;(el)=(((el)->next==(head)) ? NULL : (el)->next)) + +#define CDL_FOREACH_SAFE(head,el,tmp1,tmp2) \ + CDL_FOREACH_SAFE2(head,el,tmp1,tmp2,prev,next) + +#define CDL_FOREACH_SAFE2(head,el,tmp1,tmp2,prev,next) \ + for ((el) = (head), (tmp1) = (head) ? (head)->prev : NULL; \ + (el) && ((tmp2) = (el)->next, 1); \ + (el) = ((el) == (tmp1) ? NULL : (tmp2))) + +#define CDL_SEARCH_SCALAR(head,out,field,val) \ + CDL_SEARCH_SCALAR2(head,out,field,val,next) + +#define CDL_SEARCH_SCALAR2(head,out,field,val,next) \ +do { \ + CDL_FOREACH2(head,out,next) { \ + if ((out)->field == (val)) break; \ + } \ +} while (0) + +#define CDL_SEARCH(head,out,elt,cmp) \ + CDL_SEARCH2(head,out,elt,cmp,next) + +#define CDL_SEARCH2(head,out,elt,cmp,next) \ +do { \ + CDL_FOREACH2(head,out,next) { \ + if ((cmp(out,elt))==0) break; \ + } \ +} while (0) + +#define CDL_REPLACE_ELEM2(head, el, add, prev, next) \ +do { \ + assert((head) != NULL); \ + assert((el) != NULL); \ + assert((add) != NULL); \ + if ((el)->next == (el)) { \ + (add)->next = (add); \ + (add)->prev = (add); \ + (head) = (add); \ + } else { \ + (add)->next = (el)->next; \ + (add)->prev = (el)->prev; \ + (add)->next->prev = (add); \ + (add)->prev->next = (add); \ + if ((head) == (el)) { \ + (head) = (add); \ + } \ + } \ +} while (0) + +#define CDL_REPLACE_ELEM(head, el, add) \ + CDL_REPLACE_ELEM2(head, el, add, prev, next) + +#define CDL_PREPEND_ELEM2(head, el, add, prev, next) \ +do { \ + if (el) { \ + assert((head) != NULL); \ + assert((add) != NULL); \ + (add)->next = (el); \ + (add)->prev = (el)->prev; \ + (el)->prev = (add); \ + (add)->prev->next = (add); \ + if ((head) == (el)) { \ + (head) = (add); \ + } \ + } else { \ + CDL_APPEND2(head, add, prev, next); \ + } \ +} while (0) + +#define CDL_PREPEND_ELEM(head, el, add) \ + CDL_PREPEND_ELEM2(head, el, add, prev, next) + +#define CDL_APPEND_ELEM2(head, el, add, prev, next) \ +do { \ + if (el) { \ + assert((head) != NULL); \ + assert((add) != NULL); \ + (add)->next = (el)->next; \ + (add)->prev = (el); \ + (el)->next = (add); \ + (add)->next->prev = (add); \ + } else { \ + CDL_PREPEND2(head, add, prev, next); \ + } \ +} while (0) + +#define CDL_APPEND_ELEM(head, el, add) \ + CDL_APPEND_ELEM2(head, el, add, prev, next) + +#ifdef NO_DECLTYPE +/* Here are VS2008 / NO_DECLTYPE replacements for a few functions */ + +#undef CDL_INSERT_INORDER2 +#define CDL_INSERT_INORDER2(head,add,cmp,next) \ +do { \ + if ((head) == NULL) { \ + (add)->prev = (add); \ + (add)->next = (add); \ + (head) = (add); \ + } else if ((cmp(head, add)) >= 0) { \ + (add)->prev = (head)->prev; \ + (add)->next = (head); \ + (add)->prev->next = (add); \ + (head)->prev = (add); \ + (head) = (add); \ + } else { \ + char *_tmp = (char*)(head); \ + while ((char*)(head)->next != _tmp && (cmp((head)->next, add)) < 0) { \ + (head) = (head)->next; \ + } \ + (add)->prev = (head); \ + (add)->next = (head)->next; \ + (add)->next->prev = (add); \ + (head)->next = (add); \ + UTLIST_RS(head); \ + } \ +} while (0) +#endif /* NO_DECLTYPE */ + +#endif /* UTLIST_H */ diff --git a/linux32/inc/uthash/utringbuffer.h b/linux32/inc/uthash/utringbuffer.h new file mode 100644 index 0000000..b3b5938 --- /dev/null +++ b/linux32/inc/uthash/utringbuffer.h @@ -0,0 +1,108 @@ +/* +Copyright (c) 2008-2017, Troy D. Hanson http://troydhanson.github.com/uthash/ +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER +OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* a ring-buffer implementation using macros + */ +#ifndef UTRINGBUFFER_H +#define UTRINGBUFFER_H + +#define UTRINGBUFFER_VERSION 2.0.2 + +#include +#include +#include "utarray.h" // for "UT_icd" + +typedef struct { + unsigned i; /* index of next available slot; wraps at n */ + unsigned n; /* capacity */ + unsigned char f; /* full */ + UT_icd icd; /* initializer, copy and destructor functions */ + char *d; /* n slots of size icd->sz */ +} UT_ringbuffer; + +#define utringbuffer_init(a, _n, _icd) do { \ + memset(a, 0, sizeof(UT_ringbuffer)); \ + (a)->icd = *(_icd); \ + (a)->n = (_n); \ + if ((a)->n) { (a)->d = (char*)malloc((a)->n * (_icd)->sz); } \ +} while(0) + +#define utringbuffer_clear(a) do { \ + if ((a)->icd.dtor) { \ + if ((a)->f) { \ + unsigned _ut_i; \ + for (_ut_i = 0; _ut_i < (a)->n; ++_ut_i) { \ + (a)->icd.dtor(utringbuffer_eltptr(a, _ut_i)); \ + } \ + } else { \ + unsigned _ut_i; \ + for (_ut_i = 0; _ut_i < (a)->i; ++_ut_i) { \ + (a)->icd.dtor(utringbuffer_eltptr(a, _ut_i)); \ + } \ + } \ + } \ + (a)->i = 0; \ + (a)->f = 0; \ +} while(0) + +#define utringbuffer_done(a) do { \ + utringbuffer_clear(a); \ + free((a)->d); (a)->d = NULL; \ + (a)->n = 0; \ +} while(0) + +#define utringbuffer_new(a,n,_icd) do { \ + a = (UT_ringbuffer*)malloc(sizeof(UT_ringbuffer)); \ + utringbuffer_init(a, n, _icd); \ +} while(0) + +#define utringbuffer_free(a) do { \ + utringbuffer_done(a); \ + free(a); \ +} while(0) + +#define utringbuffer_push_back(a,p) do { \ + if ((a)->icd.dtor && (a)->f) { (a)->icd.dtor(_utringbuffer_internalptr(a,(a)->i)); } \ + if ((a)->icd.copy) { (a)->icd.copy( _utringbuffer_internalptr(a,(a)->i), p); } \ + else { memcpy(_utringbuffer_internalptr(a,(a)->i), p, (a)->icd.sz); }; \ + if (++(a)->i == (a)->n) { (a)->i = 0; (a)->f = 1; } \ +} while(0) + +#define utringbuffer_len(a) ((a)->f ? (a)->n : (a)->i) +#define utringbuffer_empty(a) ((a)->i == 0 && !(a)->f) +#define utringbuffer_full(a) ((a)->f != 0) + +#define _utringbuffer_real_idx(a,j) ((a)->f ? ((j) + (a)->i) % (a)->n : (j)) +#define _utringbuffer_internalptr(a,j) ((void*)((a)->d + ((a)->icd.sz * (j)))) +#define utringbuffer_eltptr(a,j) ((0 <= (j) && (j) < utringbuffer_len(a)) ? _utringbuffer_internalptr(a,_utringbuffer_real_idx(a,j)) : NULL) + +#define _utringbuffer_fake_idx(a,j) ((a)->f ? ((j) + (a)->n - (a)->i) % (a)->n : (j)) +#define _utringbuffer_internalidx(a,e) (((char*)(e) >= (a)->d) ? (((char*)(e) - (a)->d)/(a)->icd.sz) : -1) +#define utringbuffer_eltidx(a,e) _utringbuffer_fake_idx(a, _utringbuffer_internalidx(a,e)) + +#define utringbuffer_front(a) utringbuffer_eltptr(a,0) +#define utringbuffer_next(a,e) ((e)==NULL ? utringbuffer_front(a) : utringbuffer_eltptr(a, utringbuffer_eltidx(a,e)+1)) +#define utringbuffer_prev(a,e) ((e)==NULL ? utringbuffer_back(a) : utringbuffer_eltptr(a, utringbuffer_eltidx(a,e)-1)) +#define utringbuffer_back(a) (utringbuffer_empty(a) ? NULL : utringbuffer_eltptr(a, utringbuffer_len(a) - 1)) + +#endif /* UTRINGBUFFER_H */ diff --git a/linux32/inc/uthash/utstring.h b/linux32/inc/uthash/utstring.h new file mode 100644 index 0000000..4e90ebb --- /dev/null +++ b/linux32/inc/uthash/utstring.h @@ -0,0 +1,398 @@ +/* +Copyright (c) 2008-2017, Troy D. Hanson http://troydhanson.github.com/uthash/ +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER +OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* a dynamic string implementation using macros + */ +#ifndef UTSTRING_H +#define UTSTRING_H + +#define UTSTRING_VERSION 2.0.2 + +#include +#include +#include +#include + +#ifdef __GNUC__ +#define UTSTRING_UNUSED __attribute__((__unused__)) +#else +#define UTSTRING_UNUSED +#endif + +#ifndef oom +#define oom() exit(-1) +#endif + +typedef struct { + char *d; + size_t n; /* allocd size */ + size_t i; /* index of first unused byte */ +} UT_string; + +#define utstring_reserve(s,amt) \ +do { \ + if (((s)->n - (s)->i) < (size_t)(amt)) { \ + char *utstring_tmp = (char*)realloc( \ + (s)->d, (s)->n + (amt)); \ + if (utstring_tmp == NULL) oom(); \ + (s)->d = utstring_tmp; \ + (s)->n += (amt); \ + } \ +} while(0) + +#define utstring_init(s) \ +do { \ + (s)->n = 0; (s)->i = 0; (s)->d = NULL; \ + utstring_reserve(s,100); \ + (s)->d[0] = '\0'; \ +} while(0) + +#define utstring_done(s) \ +do { \ + if ((s)->d != NULL) free((s)->d); \ + (s)->n = 0; \ +} while(0) + +#define utstring_free(s) \ +do { \ + utstring_done(s); \ + free(s); \ +} while(0) + +#define utstring_new(s) \ +do { \ + s = (UT_string*)calloc(sizeof(UT_string),1); \ + if (!s) oom(); \ + utstring_init(s); \ +} while(0) + +#define utstring_renew(s) \ +do { \ + if (s) { \ + utstring_clear(s); \ + } else { \ + utstring_new(s); \ + } \ +} while(0) + +#define utstring_clear(s) \ +do { \ + (s)->i = 0; \ + (s)->d[0] = '\0'; \ +} while(0) + +#define utstring_bincpy(s,b,l) \ +do { \ + utstring_reserve((s),(l)+1); \ + if (l) memcpy(&(s)->d[(s)->i], b, l); \ + (s)->i += (l); \ + (s)->d[(s)->i]='\0'; \ +} while(0) + +#define utstring_concat(dst,src) \ +do { \ + utstring_reserve((dst),((src)->i)+1); \ + if ((src)->i) memcpy(&(dst)->d[(dst)->i], (src)->d, (src)->i); \ + (dst)->i += (src)->i; \ + (dst)->d[(dst)->i]='\0'; \ +} while(0) + +#define utstring_len(s) ((s)->i) + +#define utstring_body(s) ((s)->d) + +UTSTRING_UNUSED static void utstring_printf_va(UT_string *s, const char *fmt, va_list ap) { + int n; + va_list cp; + for (;;) { +#ifdef _WIN32 + cp = ap; +#else + va_copy(cp, ap); +#endif + n = vsnprintf (&s->d[s->i], s->n-s->i, fmt, cp); + va_end(cp); + + if ((n > -1) && ((size_t) n < (s->n-s->i))) { + s->i += n; + return; + } + + /* Else try again with more space. */ + if (n > -1) utstring_reserve(s,n+1); /* exact */ + else utstring_reserve(s,(s->n)*2); /* 2x */ + } +} +#ifdef __GNUC__ +/* support printf format checking (2=the format string, 3=start of varargs) */ +static void utstring_printf(UT_string *s, const char *fmt, ...) + __attribute__ (( format( printf, 2, 3) )); +#endif +UTSTRING_UNUSED static void utstring_printf(UT_string *s, const char *fmt, ...) { + va_list ap; + va_start(ap,fmt); + utstring_printf_va(s,fmt,ap); + va_end(ap); +} + +/******************************************************************************* + * begin substring search functions * + ******************************************************************************/ +/* Build KMP table from left to right. */ +UTSTRING_UNUSED static void _utstring_BuildTable( + const char *P_Needle, + size_t P_NeedleLen, + long *P_KMP_Table) +{ + long i, j; + + i = 0; + j = i - 1; + P_KMP_Table[i] = j; + while (i < (long) P_NeedleLen) + { + while ( (j > -1) && (P_Needle[i] != P_Needle[j]) ) + { + j = P_KMP_Table[j]; + } + i++; + j++; + if (i < (long) P_NeedleLen) + { + if (P_Needle[i] == P_Needle[j]) + { + P_KMP_Table[i] = P_KMP_Table[j]; + } + else + { + P_KMP_Table[i] = j; + } + } + else + { + P_KMP_Table[i] = j; + } + } + + return; +} + + +/* Build KMP table from right to left. */ +UTSTRING_UNUSED static void _utstring_BuildTableR( + const char *P_Needle, + size_t P_NeedleLen, + long *P_KMP_Table) +{ + long i, j; + + i = P_NeedleLen - 1; + j = i + 1; + P_KMP_Table[i + 1] = j; + while (i >= 0) + { + while ( (j < (long) P_NeedleLen) && (P_Needle[i] != P_Needle[j]) ) + { + j = P_KMP_Table[j + 1]; + } + i--; + j--; + if (i >= 0) + { + if (P_Needle[i] == P_Needle[j]) + { + P_KMP_Table[i + 1] = P_KMP_Table[j + 1]; + } + else + { + P_KMP_Table[i + 1] = j; + } + } + else + { + P_KMP_Table[i + 1] = j; + } + } + + return; +} + + +/* Search data from left to right. ( Multiple search mode. ) */ +UTSTRING_UNUSED static long _utstring_find( + const char *P_Haystack, + size_t P_HaystackLen, + const char *P_Needle, + size_t P_NeedleLen, + long *P_KMP_Table) +{ + long i, j; + long V_FindPosition = -1; + + /* Search from left to right. */ + i = j = 0; + while ( (j < (int)P_HaystackLen) && (((P_HaystackLen - j) + i) >= P_NeedleLen) ) + { + while ( (i > -1) && (P_Needle[i] != P_Haystack[j]) ) + { + i = P_KMP_Table[i]; + } + i++; + j++; + if (i >= (int)P_NeedleLen) + { + /* Found. */ + V_FindPosition = j - i; + break; + } + } + + return V_FindPosition; +} + + +/* Search data from right to left. ( Multiple search mode. ) */ +UTSTRING_UNUSED static long _utstring_findR( + const char *P_Haystack, + size_t P_HaystackLen, + const char *P_Needle, + size_t P_NeedleLen, + long *P_KMP_Table) +{ + long i, j; + long V_FindPosition = -1; + + /* Search from right to left. */ + j = (P_HaystackLen - 1); + i = (P_NeedleLen - 1); + while ( (j >= 0) && (j >= i) ) + { + while ( (i < (int)P_NeedleLen) && (P_Needle[i] != P_Haystack[j]) ) + { + i = P_KMP_Table[i + 1]; + } + i--; + j--; + if (i < 0) + { + /* Found. */ + V_FindPosition = j + 1; + break; + } + } + + return V_FindPosition; +} + + +/* Search data from left to right. ( One time search mode. ) */ +UTSTRING_UNUSED static long utstring_find( + UT_string *s, + long P_StartPosition, /* Start from 0. -1 means last position. */ + const char *P_Needle, + size_t P_NeedleLen) +{ + long V_StartPosition; + long V_HaystackLen; + long *V_KMP_Table; + long V_FindPosition = -1; + + if (P_StartPosition < 0) + { + V_StartPosition = s->i + P_StartPosition; + } + else + { + V_StartPosition = P_StartPosition; + } + V_HaystackLen = s->i - V_StartPosition; + if ( (V_HaystackLen >= (long) P_NeedleLen) && (P_NeedleLen > 0) ) + { + V_KMP_Table = (long *)malloc(sizeof(long) * (P_NeedleLen + 1)); + if (V_KMP_Table != NULL) + { + _utstring_BuildTable(P_Needle, P_NeedleLen, V_KMP_Table); + + V_FindPosition = _utstring_find(s->d + V_StartPosition, + V_HaystackLen, + P_Needle, + P_NeedleLen, + V_KMP_Table); + if (V_FindPosition >= 0) + { + V_FindPosition += V_StartPosition; + } + + free(V_KMP_Table); + } + } + + return V_FindPosition; +} + + +/* Search data from right to left. ( One time search mode. ) */ +UTSTRING_UNUSED static long utstring_findR( + UT_string *s, + long P_StartPosition, /* Start from 0. -1 means last position. */ + const char *P_Needle, + size_t P_NeedleLen) +{ + long V_StartPosition; + long V_HaystackLen; + long *V_KMP_Table; + long V_FindPosition = -1; + + if (P_StartPosition < 0) + { + V_StartPosition = s->i + P_StartPosition; + } + else + { + V_StartPosition = P_StartPosition; + } + V_HaystackLen = V_StartPosition + 1; + if ( (V_HaystackLen >= (long) P_NeedleLen) && (P_NeedleLen > 0) ) + { + V_KMP_Table = (long *)malloc(sizeof(long) * (P_NeedleLen + 1)); + if (V_KMP_Table != NULL) + { + _utstring_BuildTableR(P_Needle, P_NeedleLen, V_KMP_Table); + + V_FindPosition = _utstring_findR(s->d, + V_HaystackLen, + P_Needle, + P_NeedleLen, + V_KMP_Table); + + free(V_KMP_Table); + } + } + + return V_FindPosition; +} +/******************************************************************************* + * end substring search functions * + ******************************************************************************/ + +#endif /* UTSTRING_H */ diff --git a/linux32/src/cJSON.c b/linux32/src/cJSON.c new file mode 100644 index 0000000..5a9008f --- /dev/null +++ b/linux32/src/cJSON.c @@ -0,0 +1,762 @@ +/* + Copyright (c) 2009 Dave Gamble + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +/* cJSON */ +/* JSON parser in C. */ + +#include +#include +#include +#include +#include +#include +#include +#include "cJSON.h" + +static const char *ep; + +const char *cJSON_GetErrorPtr(void) {return ep;} + +static int cJSON_strcasecmp(const char *s1,const char *s2) +{ + if (!s1) return (s1==s2)?0:1;if (!s2) return 1; + for(; tolower(*s1) == tolower(*s2); ++s1, ++s2) if(*s1 == 0) return 0; + return tolower(*(const unsigned char *)s1) - tolower(*(const unsigned char *)s2); +} + +static void *(*cJSON_malloc)(size_t sz) = malloc; +static void (*cJSON_free)(void *ptr) = free; + +static char* cJSON_strdup(const char* str) +{ + size_t len; + char* copy; + + len = strlen(str) + 1; + if (!(copy = (char*)cJSON_malloc(len))) return 0; + memcpy(copy,str,len); + return copy; +} + +void cJSON_InitHooks(cJSON_Hooks* hooks) +{ + if (!hooks) { /* Reset hooks */ + cJSON_malloc = malloc; + cJSON_free = free; + return; + } + + cJSON_malloc = (hooks->malloc_fn)?hooks->malloc_fn:malloc; + cJSON_free = (hooks->free_fn)?hooks->free_fn:free; +} + +/* Internal constructor. */ +static cJSON *cJSON_New_Item(void) +{ + cJSON* node = (cJSON*)cJSON_malloc(sizeof(cJSON)); + if (node) memset(node,0,sizeof(cJSON)); + return node; +} + +/* Delete a cJSON structure. */ +void cJSON_Delete(cJSON *c) +{ + cJSON *next; + while (c) + { + next=c->next; + if (!(c->type&cJSON_IsReference) && c->child) cJSON_Delete(c->child); + if (!(c->type&cJSON_IsReference) && c->valuestring) cJSON_free(c->valuestring); + if (!(c->type&cJSON_StringIsConst) && c->string) cJSON_free(c->string); + cJSON_free(c); + c=next; + } +} + +/* Parse the input text to generate a number, and populate the result into item. */ +static const char *parse_number(cJSON *item,const char *num) +{ + double n=0,sign=1,scale=0;int subscale=0,signsubscale=1; + + if (*num=='-') sign=-1,num++; /* Has sign? */ + if (*num=='0') num++; /* is zero */ + if (*num>='1' && *num<='9') do n=(n*10.0)+(*num++ -'0'); while (*num>='0' && *num<='9'); /* Number? */ + if (*num=='.' && num[1]>='0' && num[1]<='9') {num++; do n=(n*10.0)+(*num++ -'0'),scale--; while (*num>='0' && *num<='9');} /* Fractional part? */ + if (*num=='e' || *num=='E') /* Exponent? */ + { num++;if (*num=='+') num++; else if (*num=='-') signsubscale=-1,num++; /* With sign? */ + while (*num>='0' && *num<='9') subscale=(subscale*10)+(*num++ - '0'); /* Number? */ + } + + n=sign*n*pow(10.0,(scale+subscale*signsubscale)); /* number = +/- number.fraction * 10^+/- exponent */ + + item->valuedouble=n; + item->valueint=(int)n; + item->type=cJSON_Number; + return num; +} + +static int pow2gt (int x) { --x; x|=x>>1; x|=x>>2; x|=x>>4; x|=x>>8; x|=x>>16; return x+1; } + +typedef struct {char *buffer; int length; int offset; } printbuffer; + +static char* ensure(printbuffer *p,int needed) +{ + char *newbuffer;int newsize; + if (!p || !p->buffer) return 0; + needed+=p->offset; + if (needed<=p->length) return p->buffer+p->offset; + + newsize=pow2gt(needed); + newbuffer=(char*)cJSON_malloc(newsize); + if (!newbuffer) {cJSON_free(p->buffer);p->length=0,p->buffer=0;return 0;} + if (newbuffer) memcpy(newbuffer,p->buffer,p->length); + cJSON_free(p->buffer); + p->length=newsize; + p->buffer=newbuffer; + return newbuffer+p->offset; +} + +static int update(printbuffer *p) +{ + char *str; + if (!p || !p->buffer) return 0; + str=p->buffer+p->offset; + return p->offset+strlen(str); +} + +/* Render the number nicely from the given item into a string. */ +static char *print_number(cJSON *item,printbuffer *p) +{ + char *str=0; + double d=item->valuedouble; + if (d==0) + { + if (p) str=ensure(p,2); + else str=(char*)cJSON_malloc(2); /* special case for 0. */ + if (str) strcpy(str,"0"); + } + else if (fabs(((double)item->valueint)-d)<=DBL_EPSILON && d<=INT_MAX && d>=INT_MIN) + { + if (p) str=ensure(p,21); + else str=(char*)cJSON_malloc(21); /* 2^64+1 can be represented in 21 chars. */ + if (str) sprintf(str,"%d",item->valueint); + } + else + { + if (p) str=ensure(p,64); + else str=(char*)cJSON_malloc(64); /* This is a nice tradeoff. */ + if (str) + { + if (fpclassify(d) != FP_ZERO && !isnormal(d)) sprintf(str,"null"); + else if (fabs(floor(d)-d)<=DBL_EPSILON && fabs(d)<1.0e60) sprintf(str,"%.0f",d); + else if (fabs(d)<1.0e-6 || fabs(d)>1.0e9) sprintf(str,"%e",d); + else sprintf(str,"%f",d); + } + } + return str; +} + +static unsigned parse_hex4(const char *str) +{ + unsigned h=0; + if (*str>='0' && *str<='9') h+=(*str)-'0'; else if (*str>='A' && *str<='F') h+=10+(*str)-'A'; else if (*str>='a' && *str<='f') h+=10+(*str)-'a'; else return 0; + h=h<<4;str++; + if (*str>='0' && *str<='9') h+=(*str)-'0'; else if (*str>='A' && *str<='F') h+=10+(*str)-'A'; else if (*str>='a' && *str<='f') h+=10+(*str)-'a'; else return 0; + h=h<<4;str++; + if (*str>='0' && *str<='9') h+=(*str)-'0'; else if (*str>='A' && *str<='F') h+=10+(*str)-'A'; else if (*str>='a' && *str<='f') h+=10+(*str)-'a'; else return 0; + h=h<<4;str++; + if (*str>='0' && *str<='9') h+=(*str)-'0'; else if (*str>='A' && *str<='F') h+=10+(*str)-'A'; else if (*str>='a' && *str<='f') h+=10+(*str)-'a'; else return 0; + return h; +} + +/* Parse the input text into an unescaped cstring, and populate item. */ +static const unsigned char firstByteMark[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; +static const char *parse_string(cJSON *item,const char *str) +{ + const char *ptr=str+1;char *ptr2;char *out;int len=0;unsigned uc,uc2; + if (*str!='\"') {ep=str;return 0;} /* not a string! */ + + while (*ptr!='\"' && *ptr && ++len) if (*ptr++ == '\\') ptr++; /* Skip escaped quotes. */ + + out=(char*)cJSON_malloc(len+1); /* This is how long we need for the string, roughly. */ + if (!out) return 0; + + ptr=str+1;ptr2=out; + while (*ptr!='\"' && *ptr) + { + if (*ptr!='\\') *ptr2++=*ptr++; + else + { + ptr++; + switch (*ptr) + { + case 'b': *ptr2++='\b'; break; + case 'f': *ptr2++='\f'; break; + case 'n': *ptr2++='\n'; break; + case 'r': *ptr2++='\r'; break; + case 't': *ptr2++='\t'; break; + case 'u': /* transcode utf16 to utf8. */ + uc=parse_hex4(ptr+1);ptr+=4; /* get the unicode char. */ + + if ((uc>=0xDC00 && uc<=0xDFFF) || uc==0) break; /* check for invalid. */ + + if (uc>=0xD800 && uc<=0xDBFF) /* UTF16 surrogate pairs. */ + { + if (ptr[1]!='\\' || ptr[2]!='u') break; /* missing second-half of surrogate. */ + uc2=parse_hex4(ptr+3);ptr+=6; + if (uc2<0xDC00 || uc2>0xDFFF) break; /* invalid second-half of surrogate. */ + uc=0x10000 + (((uc&0x3FF)<<10) | (uc2&0x3FF)); + } + + len=4;if (uc<0x80) len=1;else if (uc<0x800) len=2;else if (uc<0x10000) len=3; ptr2+=len; + + switch (len) { + case 4: *--ptr2 =((uc | 0x80) & 0xBF); uc >>= 6; + case 3: *--ptr2 =((uc | 0x80) & 0xBF); uc >>= 6; + case 2: *--ptr2 =((uc | 0x80) & 0xBF); uc >>= 6; + case 1: *--ptr2 =(uc | firstByteMark[len]); + } + ptr2+=len; + break; + default: *ptr2++=*ptr; break; + } + ptr++; + } + } + *ptr2=0; + if (*ptr=='\"') ptr++; + item->valuestring=out; + item->type=cJSON_String; + return ptr; +} + +/* Render the cstring provided to an escaped version that can be printed. */ +static char *print_string_ptr(const char *str,printbuffer *p) +{ + const char *ptr;char *ptr2,*out;int len=0,flag=0;unsigned char token; + + for (ptr=str;*ptr;ptr++) flag|=((*ptr>0 && *ptr<32)||(*ptr=='\"')||(*ptr=='\\'))?1:0; + if (!flag) + { + len=ptr-str; + if (p) out=ensure(p,len+3); + else out=(char*)cJSON_malloc(len+3); + if (!out) return 0; + ptr2=out;*ptr2++='\"'; + strcpy(ptr2,str); + ptr2[len]='\"'; + ptr2[len+1]=0; + return out; + } + + if (!str) + { + if (p) out=ensure(p,3); + else out=(char*)cJSON_malloc(3); + if (!out) return 0; + strcpy(out,"\"\""); + return out; + } + ptr=str;while ((token=*ptr) && ++len) {if (strchr("\"\\\b\f\n\r\t",token)) len++; else if (token<32) len+=5;ptr++;} + + if (p) out=ensure(p,len+3); + else out=(char*)cJSON_malloc(len+3); + if (!out) return 0; + + ptr2=out;ptr=str; + *ptr2++='\"'; + while (*ptr) + { + if ((unsigned char)*ptr>31 && *ptr!='\"' && *ptr!='\\') *ptr2++=*ptr++; + else + { + *ptr2++='\\'; + switch (token=*ptr++) + { + case '\\': *ptr2++='\\'; break; + case '\"': *ptr2++='\"'; break; + case '\b': *ptr2++='b'; break; + case '\f': *ptr2++='f'; break; + case '\n': *ptr2++='n'; break; + case '\r': *ptr2++='r'; break; + case '\t': *ptr2++='t'; break; + default: sprintf(ptr2,"u%04x",token);ptr2+=5; break; /* escape and print */ + } + } + } + *ptr2++='\"';*ptr2++=0; + return out; +} +/* Invote print_string_ptr (which is useful) on an item. */ +static char *print_string(cJSON *item,printbuffer *p) {return print_string_ptr(item->valuestring,p);} + +/* Predeclare these prototypes. */ +static const char *parse_value(cJSON *item,const char *value); +static char *print_value(cJSON *item,int depth,int fmt,printbuffer *p); +static const char *parse_array(cJSON *item,const char *value); +static char *print_array(cJSON *item,int depth,int fmt,printbuffer *p); +static const char *parse_object(cJSON *item,const char *value); +static char *print_object(cJSON *item,int depth,int fmt,printbuffer *p); + +/* Utility to jump whitespace and cr/lf */ +static const char *skip(const char *in) {while (in && *in && (unsigned char)*in<=32) in++; return in;} + +/* Parse an object - create a new root, and populate. */ +cJSON *cJSON_ParseWithOpts(const char *value,const char **return_parse_end,int require_null_terminated) +{ + const char *end=0; + cJSON *c=cJSON_New_Item(); + ep=0; + if (!c) return 0; /* memory fail */ + + end=parse_value(c,skip(value)); + if (!end) {cJSON_Delete(c);return 0;} /* parse failure. ep is set. */ + + /* if we require null-terminated JSON without appended garbage, skip and then check for a null terminator */ + if (require_null_terminated) {end=skip(end);if (*end) {cJSON_Delete(c);ep=end;return 0;}} + if (return_parse_end) *return_parse_end=end; + return c; +} +/* Default options for cJSON_Parse */ +cJSON *cJSON_Parse(const char *value) {return cJSON_ParseWithOpts(value,0,0);} + +/* Render a cJSON item/entity/structure to text. */ +char *cJSON_Print(cJSON *item) {return print_value(item,0,1,0);} +char *cJSON_PrintUnformatted(cJSON *item) {return print_value(item,0,0,0);} + +char *cJSON_PrintBuffered(cJSON *item,int prebuffer,int fmt) +{ + printbuffer p; + p.buffer=(char*)cJSON_malloc(prebuffer); + p.length=prebuffer; + p.offset=0; + return print_value(item,0,fmt,&p); + return p.buffer; +} + + +/* Parser core - when encountering text, process appropriately. */ +static const char *parse_value(cJSON *item,const char *value) +{ + if (!value) return 0; /* Fail on null. */ + if (!strncmp(value,"null",4)) { item->type=cJSON_NULL; return value+4; } + if (!strncmp(value,"false",5)) { item->type=cJSON_False; return value+5; } + if (!strncmp(value,"true",4)) { item->type=cJSON_True; item->valueint=1; return value+4; } + if (*value=='\"') { return parse_string(item,value); } + if (*value=='-' || (*value>='0' && *value<='9')) { return parse_number(item,value); } + if (*value=='[') { return parse_array(item,value); } + if (*value=='{') { return parse_object(item,value); } + + ep=value;return 0; /* failure. */ +} + +/* Render a value to text. */ +static char *print_value(cJSON *item,int depth,int fmt,printbuffer *p) +{ + char *out=0; + if (!item) return 0; + if (p) + { + switch ((item->type)&255) + { + case cJSON_NULL: {out=ensure(p,5); if (out) strcpy(out,"null"); break;} + case cJSON_False: {out=ensure(p,6); if (out) strcpy(out,"false"); break;} + case cJSON_True: {out=ensure(p,5); if (out) strcpy(out,"true"); break;} + case cJSON_Number: out=print_number(item,p);break; + case cJSON_String: out=print_string(item,p);break; + case cJSON_Array: out=print_array(item,depth,fmt,p);break; + case cJSON_Object: out=print_object(item,depth,fmt,p);break; + } + } + else + { + switch ((item->type)&255) + { + case cJSON_NULL: out=cJSON_strdup("null"); break; + case cJSON_False: out=cJSON_strdup("false");break; + case cJSON_True: out=cJSON_strdup("true"); break; + case cJSON_Number: out=print_number(item,0);break; + case cJSON_String: out=print_string(item,0);break; + case cJSON_Array: out=print_array(item,depth,fmt,0);break; + case cJSON_Object: out=print_object(item,depth,fmt,0);break; + } + } + return out; +} + +/* Build an array from input text. */ +static const char *parse_array(cJSON *item,const char *value) +{ + cJSON *child; + if (*value!='[') {ep=value;return 0;} /* not an array! */ + + item->type=cJSON_Array; + value=skip(value+1); + if (*value==']') return value+1; /* empty array. */ + + item->child=child=cJSON_New_Item(); + if (!item->child) return 0; /* memory fail */ + value=skip(parse_value(child,skip(value))); /* skip any spacing, get the value. */ + if (!value) return 0; + + while (*value==',') + { + cJSON *new_item; + if (!(new_item=cJSON_New_Item())) return 0; /* memory fail */ + child->next=new_item;new_item->prev=child;child=new_item; + value=skip(parse_value(child,skip(value+1))); + if (!value) return 0; /* memory fail */ + } + + if (*value==']') return value+1; /* end of array */ + ep=value;return 0; /* malformed. */ +} + +/* Render an array to text */ +static char *print_array(cJSON *item,int depth,int fmt,printbuffer *p) +{ + char **entries; + char *out=0,*ptr,*ret;int len=5; + cJSON *child=item->child; + int numentries=0,i=0,fail=0; + size_t tmplen=0; + + /* How many entries in the array? */ + while (child) numentries++,child=child->next; + /* Explicitly handle numentries==0 */ + if (!numentries) + { + if (p) out=ensure(p,3); + else out=(char*)cJSON_malloc(3); + if (out) strcpy(out,"[]"); + return out; + } + + if (p) + { + /* Compose the output array. */ + i=p->offset; + ptr=ensure(p,1);if (!ptr) return 0; *ptr='['; p->offset++; + child=item->child; + while (child && !fail) + { + print_value(child,depth+1,fmt,p); + p->offset=update(p); + if (child->next) {len=fmt?2:1;ptr=ensure(p,len+1);if (!ptr) return 0;*ptr++=',';if(fmt)*ptr++=' ';*ptr=0;p->offset+=len;} + child=child->next; + } + ptr=ensure(p,2);if (!ptr) return 0; *ptr++=']';*ptr=0; + out=(p->buffer)+i; + } + else + { + /* Allocate an array to hold the values for each */ + entries=(char**)cJSON_malloc(numentries*sizeof(char*)); + if (!entries) return 0; + memset(entries,0,numentries*sizeof(char*)); + /* Retrieve all the results: */ + child=item->child; + while (child && !fail) + { + ret=print_value(child,depth+1,fmt,0); + entries[i++]=ret; + if (ret) len+=strlen(ret)+2+(fmt?1:0); else fail=1; + child=child->next; + } + + /* If we didn't fail, try to malloc the output string */ + if (!fail) out=(char*)cJSON_malloc(len); + /* If that fails, we fail. */ + if (!out) fail=1; + + /* Handle failure. */ + if (fail) + { + for (i=0;itype=cJSON_Object; + value=skip(value+1); + if (*value=='}') return value+1; /* empty array. */ + + item->child=child=cJSON_New_Item(); + if (!item->child) return 0; + value=skip(parse_string(child,skip(value))); + if (!value) return 0; + child->string=child->valuestring;child->valuestring=0; + if (*value!=':') {ep=value;return 0;} /* fail! */ + value=skip(parse_value(child,skip(value+1))); /* skip any spacing, get the value. */ + if (!value) return 0; + + while (*value==',') + { + cJSON *new_item; + if (!(new_item=cJSON_New_Item())) return 0; /* memory fail */ + child->next=new_item;new_item->prev=child;child=new_item; + value=skip(parse_string(child,skip(value+1))); + if (!value) return 0; + child->string=child->valuestring;child->valuestring=0; + if (*value!=':') {ep=value;return 0;} /* fail! */ + value=skip(parse_value(child,skip(value+1))); /* skip any spacing, get the value. */ + if (!value) return 0; + } + + if (*value=='}') return value+1; /* end of array */ + ep=value;return 0; /* malformed. */ +} + +/* Render an object to text. */ +static char *print_object(cJSON *item,int depth,int fmt,printbuffer *p) +{ + char **entries=0,**names=0; + char *out=0,*ptr,*ret,*str;int len=7,i=0,j; + cJSON *child=item->child; + int numentries=0,fail=0; + size_t tmplen=0; + /* Count the number of entries. */ + while (child) numentries++,child=child->next; + /* Explicitly handle empty object case */ + if (!numentries) + { + if (p) out=ensure(p,fmt?depth+4:3); + else out=(char*)cJSON_malloc(fmt?depth+4:3); + if (!out) return 0; + ptr=out;*ptr++='{'; + if (fmt) {*ptr++='\n';for (i=0;ioffset; + len=fmt?2:1; ptr=ensure(p,len+1); if (!ptr) return 0; + *ptr++='{'; if (fmt) *ptr++='\n'; *ptr=0; p->offset+=len; + child=item->child;depth++; + while (child) + { + if (fmt) + { + ptr=ensure(p,depth); if (!ptr) return 0; + for (j=0;joffset+=depth; + } + print_string_ptr(child->string,p); + p->offset=update(p); + + len=fmt?2:1; + ptr=ensure(p,len); if (!ptr) return 0; + *ptr++=':';if (fmt) *ptr++='\t'; + p->offset+=len; + + print_value(child,depth,fmt,p); + p->offset=update(p); + + len=(fmt?1:0)+(child->next?1:0); + ptr=ensure(p,len+1); if (!ptr) return 0; + if (child->next) *ptr++=','; + if (fmt) *ptr++='\n';*ptr=0; + p->offset+=len; + child=child->next; + } + ptr=ensure(p,fmt?(depth+1):2); if (!ptr) return 0; + if (fmt) for (i=0;ibuffer)+i; + } + else + { + /* Allocate space for the names and the objects */ + entries=(char**)cJSON_malloc(numentries*sizeof(char*)); + if (!entries) return 0; + names=(char**)cJSON_malloc(numentries*sizeof(char*)); + if (!names) {cJSON_free(entries);return 0;} + memset(entries,0,sizeof(char*)*numentries); + memset(names,0,sizeof(char*)*numentries); + + /* Collect all the results into our arrays: */ + child=item->child;depth++;if (fmt) len+=depth; + while (child && !fail) + { + names[i]=str=print_string_ptr(child->string,0); + entries[i++]=ret=print_value(child,depth,fmt,0); + if (str && ret) len+=strlen(ret)+strlen(str)+2+(fmt?2+depth:0); else fail=1; + child=child->next; + } + + /* Try to allocate the output string */ + if (!fail) out=(char*)cJSON_malloc(len); + if (!out) fail=1; + + /* Handle failure */ + if (fail) + { + for (i=0;ichild;int i=0;while(c)i++,c=c->next;return i;} +cJSON *cJSON_GetArrayItem(cJSON *array,int item) {cJSON *c=array->child; while (c && item>0) item--,c=c->next; return c;} +cJSON *cJSON_GetObjectItem(cJSON *object,const char *string) {cJSON *c=object->child; while (c && cJSON_strcasecmp(c->string,string)) c=c->next; return c;} +int cJSON_HasObjectItem(cJSON *object,const char *string) { + cJSON *c=object->child; + while (c ) + { + if(cJSON_strcasecmp(c->string,string)==0){ + return 1; + } + c=c->next; + } + return 0; +} + +/* Utility for array list handling. */ +static void suffix_object(cJSON *prev,cJSON *item) {prev->next=item;item->prev=prev;} +/* Utility for handling references. */ +static cJSON *create_reference(cJSON *item) {cJSON *ref=cJSON_New_Item();if (!ref) return 0;memcpy(ref,item,sizeof(cJSON));ref->string=0;ref->type|=cJSON_IsReference;ref->next=ref->prev=0;return ref;} + +/* Add item to array/object. */ +void cJSON_AddItemToArray(cJSON *array, cJSON *item) {cJSON *c=array->child;if (!item) return; if (!c) {array->child=item;} else {while (c && c->next) c=c->next; suffix_object(c,item);}} +void cJSON_AddItemToObject(cJSON *object,const char *string,cJSON *item) {if (!item) return; if (item->string) cJSON_free(item->string);item->string=cJSON_strdup(string);cJSON_AddItemToArray(object,item);} +void cJSON_AddItemToObjectCS(cJSON *object,const char *string,cJSON *item) {if (!item) return; if (!(item->type&cJSON_StringIsConst) && item->string) cJSON_free(item->string);item->string=(char*)string;item->type|=cJSON_StringIsConst;cJSON_AddItemToArray(object,item);} +void cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item) {cJSON_AddItemToArray(array,create_reference(item));} +void cJSON_AddItemReferenceToObject(cJSON *object,const char *string,cJSON *item) {cJSON_AddItemToObject(object,string,create_reference(item));} + +cJSON *cJSON_DetachItemFromArray(cJSON *array,int which) {cJSON *c=array->child;while (c && which>0) c=c->next,which--;if (!c) return 0; + if (c->prev) c->prev->next=c->next;if (c->next) c->next->prev=c->prev;if (c==array->child) array->child=c->next;c->prev=c->next=0;return c;} +void cJSON_DeleteItemFromArray(cJSON *array,int which) {cJSON_Delete(cJSON_DetachItemFromArray(array,which));} +cJSON *cJSON_DetachItemFromObject(cJSON *object,const char *string) {int i=0;cJSON *c=object->child;while (c && cJSON_strcasecmp(c->string,string)) i++,c=c->next;if (c) return cJSON_DetachItemFromArray(object,i);return 0;} +void cJSON_DeleteItemFromObject(cJSON *object,const char *string) {cJSON_Delete(cJSON_DetachItemFromObject(object,string));} + +/* Replace array/object items with new ones. */ +void cJSON_InsertItemInArray(cJSON *array,int which,cJSON *newitem) {cJSON *c=array->child;while (c && which>0) c=c->next,which--;if (!c) {cJSON_AddItemToArray(array,newitem);return;} + newitem->next=c;newitem->prev=c->prev;c->prev=newitem;if (c==array->child) array->child=newitem; else newitem->prev->next=newitem;} +void cJSON_ReplaceItemInArray(cJSON *array,int which,cJSON *newitem) {cJSON *c=array->child;while (c && which>0) c=c->next,which--;if (!c) return; + newitem->next=c->next;newitem->prev=c->prev;if (newitem->next) newitem->next->prev=newitem; + if (c==array->child) array->child=newitem; else newitem->prev->next=newitem;c->next=c->prev=0;cJSON_Delete(c);} +void cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem){int i=0;cJSON *c=object->child;while(c && cJSON_strcasecmp(c->string,string))i++,c=c->next;if(c){newitem->string=cJSON_strdup(string);cJSON_ReplaceItemInArray(object,i,newitem);}} + +/* Create basic types: */ +cJSON *cJSON_CreateNull(void) {cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_NULL;return item;} +cJSON *cJSON_CreateTrue(void) {cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_True;return item;} +cJSON *cJSON_CreateFalse(void) {cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_False;return item;} +cJSON *cJSON_CreateBool(int b) {cJSON *item=cJSON_New_Item();if(item)item->type=b?cJSON_True:cJSON_False;return item;} +cJSON *cJSON_CreateNumber(double num) {cJSON *item=cJSON_New_Item();if(item){item->type=cJSON_Number;item->valuedouble=num;item->valueint=(int)num;}return item;} +cJSON *cJSON_CreateString(const char *string) {cJSON *item=cJSON_New_Item();if(item){item->type=cJSON_String;item->valuestring=cJSON_strdup(string);}return item;} +cJSON *cJSON_CreateArray(void) {cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_Array;return item;} +cJSON *cJSON_CreateObject(void) {cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_Object;return item;} + +/* Create Arrays: */ +cJSON *cJSON_CreateIntArray(const int *numbers,int count) {int i;cJSON *n=0,*p=0,*a=cJSON_CreateArray();for(i=0;a && ichild=n;else suffix_object(p,n);p=n;}return a;} +cJSON *cJSON_CreateFloatArray(const float *numbers,int count) {int i;cJSON *n=0,*p=0,*a=cJSON_CreateArray();for(i=0;a && ichild=n;else suffix_object(p,n);p=n;}return a;} +cJSON *cJSON_CreateDoubleArray(const double *numbers,int count) {int i;cJSON *n=0,*p=0,*a=cJSON_CreateArray();for(i=0;a && ichild=n;else suffix_object(p,n);p=n;}return a;} +cJSON *cJSON_CreateStringArray(const char **strings,int count) {int i;cJSON *n=0,*p=0,*a=cJSON_CreateArray();for(i=0;a && ichild=n;else suffix_object(p,n);p=n;}return a;} + +/* Duplication */ +cJSON *cJSON_Duplicate(cJSON *item,int recurse) +{ + cJSON *newitem,*cptr,*nptr=0,*newchild; + /* Bail on bad ptr */ + if (!item) return 0; + /* Create new item */ + newitem=cJSON_New_Item(); + if (!newitem) return 0; + /* Copy over all vars */ + newitem->type=item->type&(~cJSON_IsReference),newitem->valueint=item->valueint,newitem->valuedouble=item->valuedouble; + if (item->valuestring) {newitem->valuestring=cJSON_strdup(item->valuestring); if (!newitem->valuestring) {cJSON_Delete(newitem);return 0;}} + if (item->string) {newitem->string=cJSON_strdup(item->string); if (!newitem->string) {cJSON_Delete(newitem);return 0;}} + /* If non-recursive, then we're done! */ + if (!recurse) return newitem; + /* Walk the ->next chain for the child. */ + cptr=item->child; + while (cptr) + { + newchild=cJSON_Duplicate(cptr,1); /* Duplicate (with recurse) each item in the ->next chain */ + if (!newchild) {cJSON_Delete(newitem);return 0;} + if (nptr) {nptr->next=newchild,newchild->prev=nptr;nptr=newchild;} /* If newitem->child already set, then crosswire ->prev and ->next and move on */ + else {newitem->child=newchild;nptr=newchild;} /* Set newitem->child and move to it */ + cptr=cptr->next; + } + return newitem; +} + +void cJSON_Minify(char *json) +{ + char *into=json; + while (*json) + { + if (*json==' ') json++; + else if (*json=='\t') json++; /* Whitespace characters. */ + else if (*json=='\r') json++; + else if (*json=='\n') json++; + else if (*json=='/' && json[1]=='/') while (*json && *json!='\n') json++; /* double-slash comments, to end of line. */ + else if (*json=='/' && json[1]=='*') {while (*json && !(*json=='*' && json[1]=='/')) json++;json+=2;} /* multiline comments. */ + else if (*json=='\"'){*into++=*json++;while (*json && *json!='\"'){if (*json=='\\') *into++=*json++;*into++=*json++;}*into++=*json++;} /* string literals, which are \" sensitive. */ + else *into++=*json++; /* All other characters. */ + } + *into=0; /* and null-terminate. */ +} diff --git a/linux32/src/s2j.c b/linux32/src/s2j.c new file mode 100644 index 0000000..0ae716d --- /dev/null +++ b/linux32/src/s2j.c @@ -0,0 +1,52 @@ +/* + * This file is part of the struct2json Library. + * + * Copyright (c) 2015, Armink, + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * 'Software'), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Function: Initialize interface for this library. + * Created on: 2015-10-14 + */ + +#include +#include + +S2jHook s2jHook = { + .malloc_fn = malloc, + .free_fn = free, +}; + +/** + * struct2json library initialize + * @note It will initialize cJSON library hooks. + */ +void s2j_init(S2jHook *hook) { + /* initialize cJSON library */ + cJSON_InitHooks((cJSON_Hooks *)hook); + /* initialize hooks */ + if (hook) { + s2jHook.malloc_fn = (hook->malloc_fn) ? hook->malloc_fn : malloc; + s2jHook.free_fn = (hook->free_fn) ? hook->free_fn : free; + } else { + s2jHook.malloc_fn = malloc; + s2jHook.free_fn = free; + } +} diff --git a/log/hexdump.c b/log/hexdump.c new file mode 100644 index 0000000..0217b34 --- /dev/null +++ b/log/hexdump.c @@ -0,0 +1,326 @@ +#ifndef __KERNEL__ +#include +#include +#include +#include +#include + +#include "log.h" + +static const char hex_asc[] = "0123456789abcdef"; + +#define hex_asc_lo(x) hex_asc[((x) & 0x0f)] +#define hex_asc_hi(x) hex_asc[((x) & 0xf0) >> 4] + +char* IHW_bin2hex(char *p, const unsigned char *cp, int count) +{ + while (count) { + unsigned char c = *cp++; + /* put lowercase hex digits */ + *p++ = 0x20 | hex_asc[c >> 4]; + *p++ = 0x20 | hex_asc[c & 0xf]; + count--; + } + + return p; +} + +/** + * hex_to_bin - convert a hex digit to its real value + * @ch: ascii character represents hex digit + * + * hex_to_bin() converts one hex digit to its actual value or -1 in case of bad + * input. + */ +int hex_to_bin(char ch) +{ + if((ch >= '0') && (ch <= '9')) + { + return ch - '0'; + } + + ch = tolower(ch); + + if((ch >= 'a') && (ch <= 'f')) + { + return ch - 'a' + 10; + } + + return -1; +} + +/** + * hex_dump_to_buffer - convert a blob of data to "hex ASCII" in memory + * @buf: data blob to dump + * @len: number of bytes in the @buf + * @rowsize: number of bytes to print per line; must be 16 or 32 + * @groupsize: number of bytes to print at a time (1, 2, 4, 8; default = 1) + * @linebuf: where to put the converted data + * @linebuflen: total size of @linebuf, including space for terminating NUL + * @ascii: include ASCII after the hex output + * + * hex_dump_to_buffer() works on one "line" of output at a time, i.e., + * 16 or 32 bytes of input data converted to hex + ASCII output. + * + * Given a buffer of u8 data, hex_dump_to_buffer() converts the input data + * to a hex + ASCII dump at the supplied memory location. + * The converted output is always NUL-terminated. + * + * E.g.: + * hex_dump_to_buffer(frame->data, frame->len, 16, 1, + * linebuf, sizeof(linebuf), true); + * + * example output buffer: + * 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f @ABCDEFGHIJKLMNO + */ +void hex_dump_to_buffer(const void* buf, int len, int rowsize, + int groupsize, char* linebuf, size_t linebuflen, + int ascii) +{ + const unsigned char* ptr = (const unsigned char *)buf; + unsigned char ch; + int j, lx = 0; + int ascii_column; + + if(rowsize != 16 && rowsize != 32) + { + rowsize = 16; + } + + if(!len) + { + goto nil; + } + + if(len > rowsize) /* limit to one line at a time */ + { + len = rowsize; + } + + if((len % groupsize) != 0) /* no mixed size output */ + { + groupsize = 1; + } + + switch(groupsize) + { + case 8: + { + const unsigned long long* ptr8 = (const unsigned long long *)buf; + int ngroups = len / groupsize; + + for(j = 0; j < ngroups; j++) + lx += snprintf(linebuf + lx, linebuflen - lx, + "%s%16.16llx", j ? " " : "", + (unsigned long long) * (ptr8 + j)); + + ascii_column = 17 * ngroups + 2; + break; + } + + case 4: + { + const unsigned int* ptr4 = (const unsigned int *)buf; + int ngroups = len / groupsize; + + for(j = 0; j < ngroups; j++) + lx += snprintf(linebuf + lx, linebuflen - lx, + "%s%8.8x", j ? " " : "", *(ptr4 + j)); + + ascii_column = 9 * ngroups + 2; + break; + } + + case 2: + { + const unsigned short* ptr2 = (const unsigned short *)buf; + int ngroups = len / groupsize; + + for(j = 0; j < ngroups; j++) + lx += snprintf(linebuf + lx, linebuflen - lx, + "%s%4.4x", j ? " " : "", *(ptr2 + j)); + + ascii_column = 5 * ngroups + 2; + break; + } + + default: + for(j = 0; (j < len) && (lx + 3) <= linebuflen; j++) + { + ch = ptr[j]; + linebuf[lx++] = hex_asc_hi(ch); + linebuf[lx++] = hex_asc_lo(ch); + linebuf[lx++] = ' '; + } + + if(j) + { + lx--; + } + + ascii_column = 3 * rowsize + 2; + break; + } + + if(!ascii) + { + goto nil; + } + + while(lx < (linebuflen - 1) && lx < (ascii_column - 1)) + { + linebuf[lx++] = ' '; + } + + for(j = 0; (j < len) && (lx + 2) < linebuflen; j++) + { + ch = ptr[j]; + linebuf[lx++] = (isascii(ch) && isprint(ch)) ? ch : '.'; + } + +nil: + linebuf[lx++] = '\0'; +} + +/** + * print_hex_dump - print a text hex dump to syslog for a binary blob of data + * @level: kernel log level (e.g. KERN_DEBUG) + * @prefix_str: string to prefix each line with; + * caller supplies trailing spaces for alignment if desired + * @prefix_type: controls whether prefix of an offset, address, or none + * is printed (%DUMP_PREFIX_OFFSET, %DUMP_PREFIX_ADDRESS, %DUMP_PREFIX_NONE) + * @rowsize: number of bytes to print per line; must be 16 or 32 + * @groupsize: number of bytes to print at a time (1, 2, 4, 8; default = 1) + * @buf: data blob to dump + * @len: number of bytes in the @buf + * @ascii: include ASCII after the hex output + * + * Given a buffer of u8 data, print_hex_dump() prints a hex + ASCII dump + * to the kernel log at the specified kernel log level, with an optional + * leading prefix. + * + * print_hex_dump() works on one "line" of output at a time, i.e., + * 16 or 32 bytes of input data converted to hex + ASCII output. + * print_hex_dump() iterates over the entire input @buf, breaking it into + * "line size" chunks to format and print. + * + * E.g.: + * print_hex_dump(KERN_DEBUG, "raw data: ", DUMP_PREFIX_ADDRESS, + * 16, 1, frame->data, frame->len, true); + * + * Example output using %DUMP_PREFIX_OFFSET and 1-byte mode: + * 0009ab42: 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f @ABCDEFGHIJKLMNO + * Example output using %DUMP_PREFIX_ADDRESS and 4-byte mode: + * ffffffff88089af0: 73727170 77767574 7b7a7978 7f7e7d7c pqrstuvwxyz{|}~. + */ +void print_hex_dump(const char* prefix_str, int prefix_type, + int rowsize, int groupsize, + const void* buf, int len, int ascii) +{ + const unsigned char* ptr = (const unsigned char *)buf; + int i, remaining = len; + unsigned char linebuf[32 * 3 + 2 + 32 + 1]; + + if(rowsize != 16 && rowsize != 32) + { + rowsize = 16; + } + + for(i = 0; i < len; i += rowsize) + { + int linelen = MIN(remaining, rowsize); + remaining -= rowsize; + + hex_dump_to_buffer(ptr + i, linelen, rowsize, groupsize, + (char *)linebuf, sizeof(linebuf), ascii); + + switch(prefix_type) + { + case DUMP_PREFIX_ADDRESS: + print("%s%p: %s\n", + prefix_str, ptr + i, linebuf); + break; + + case DUMP_PREFIX_OFFSET: + print("%s%.8x: %s\n", prefix_str, i, linebuf); + break; + + default: + print("%s%.8x: %s\n", prefix_str, i, linebuf); + break; + } + } + + print("%s", "\n"); +} + +/** + * print_hex_dump_bytes - shorthand form of print_hex_dump() with default params + * @prefix_str: string to prefix each line with; + * caller supplies trailing spaces for alignment if desired + * @prefix_type: controls whether prefix of an offset, address, or none + * is printed (%DUMP_PREFIX_OFFSET, %DUMP_PREFIX_ADDRESS, %DUMP_PREFIX_NONE) + * @buf: data blob to dump + * @len: number of bytes in the @buf + * + * Calls print_hex_dump(), with log level of KERN_DEBUG, + * rowsize of 16, groupsize of 1, and ASCII output included. + */ +void print_hex_dump_bytes(const char* prefix_str, int prefix_type, + const void* buf, int len) +{ + print_hex_dump(prefix_str, prefix_type, 16, 1, + buf, len, 1); +} + +const char* format_hex_buf(const char* prefix_str, int prefix_type, + int rowsize, int groupsize, + const void* buf, int len, int ascii) +{ + UT_string* pLogStr = NULL; + const char* pFormatStr; + const unsigned char* ptr = (const unsigned char *)buf; + int i, remaining = len; + unsigned char linebuf[32 * 3 + 2 + 32 + 1]; + + if(rowsize != 16 && rowsize != 32) + { + rowsize = 16; + } + + utstring_new(pLogStr); + + for(i = 0; i < len; i += rowsize) + { + int linelen = MIN(remaining, rowsize); + remaining -= rowsize; + + hex_dump_to_buffer(ptr + i, linelen, rowsize, groupsize, + (char *)linebuf, sizeof(linebuf), ascii); + + switch(prefix_type) + { + case DUMP_PREFIX_ADDRESS: + utstring_printf(pLogStr, "%s%p: %s\n", + prefix_str, ptr + i, linebuf); + break; + + case DUMP_PREFIX_OFFSET: + utstring_printf(pLogStr, "%s%.8x: %s\n", + prefix_str, i, linebuf); + break; + + default: + utstring_printf(pLogStr, "%s%.8x: %s\n", + prefix_str, i, linebuf); + break; + } + } + + pFormatStr = strdup(utstring_body(pLogStr)); + utstring_free(pLogStr); + + return pFormatStr; +} + +#endif diff --git a/log/log.c b/log/log.c new file mode 100644 index 0000000..bd4db80 --- /dev/null +++ b/log/log.c @@ -0,0 +1,1314 @@ +/** @file log.c + @brief 系统日志接口文件 + @version 1.0.0 +*/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef PLATFORM_R16 +#include +#endif + +#include "log.h" +#include "smart_sound.h" +#include "inet_api.h" +#include "crypto.h" +#include "libuv_dbus.h" +#include "server_addr.h" + +#define SHOW_CONSOLE_RED ("\033[31;48m\033[1m%s\033[0m%c") +#define SHOW_CONSOLE_YELLOW ("\033[33;48m\033[1m%s\033[0m%c") +#define SHOW_CONSOLE_GREEN ("\033[32;48m\033[1m%s\033[0m%c") +#define SHOW_CONSOLE_BLUE ("\033[34;48m\033[1m%s\033[0m%c") + +#ifdef PLATFORM_CPU +#define LOG_FILE_BASEDIR (".") +#else +#define LOG_FILE_BASEDIR ("/tmp") +#endif + +#ifdef PLATFORM_R16 +#define NIC_NAME ("wlan0") +#else +#define NIC_NAME ("enp3s0") +#endif + +#define MAX_LOG_ITEM (1000) +#define MAX_LOG_FILE_SIZE (1024 * 1024) +#define LOG_PRE_SIZE (512) + +#if 0 +#define LOG_MAIL_USERNAME ("pv1_es2@hotmail.com") +#define LOG_MAIL_PASSWORD ("netEase163") +#define LOG_MAIL_SERVER ("smtp://smtp-mail.outlook.com") +#define LOG_MAIL_PORT (587) +#else +#define LOG_MAIL_USERNAME ("pv1_es2@163.com") +#define LOG_MAIL_LOGPASSWD ("netEase163") +#define LOG_MAIL_PASSWORD ("pv1Dev163") +#define LOG_MAIL_SERVER ("smtp.163.com") +#define LOG_MAIL_PORT (25) +#endif + +#define LOG_MAIL_RECEIVER ("pv1_es2@163.com") + +#define SYS_POINT_UPLOAD_TIME (600) + +typedef struct +{ + char* pDeviceId; + char savePath[MAX_PATH]; + int iMaxCacheSize; + int iEveryUploadTime; + time_t lastPostTime; + time_t lastMarkTime; + FILE* pMarkFile; + uv_rwlock_t uvRwLock; + uv_thread_t uvIOThread; +} SYSPOINT_INFO, *PSYSPOINT_INFO; + +typedef struct SYSPOINT_ITEM +{ + char* pContent; + struct SYSPOINT_ITEM *next, *prev; +} *PSYSPOINT_ITEM; + +typedef struct LOG_ITEM +{ + LOG_LEVEL level; + int isPrinted; + int isAddTags; + struct timeval timestamp; + char *pLogContent; + struct LOG_ITEM *next, *prev; +}*PLOG_ITEM; + +typedef struct LOG_BACKUP +{ + time_t timestamp; + char *plogFilePath; + char *pGzFilePath; + unsigned int sendTimes; + unsigned int tolLogs; + struct LOG_BACKUP *next, *prev; +} *PLOG_BACKUP; + +typedef struct +{ + pid_t pid; + char* pChipId; + char* pChipSerial; + char exeName[MAX_PATH]; + char logFilePath[MAX_PATH]; + FILE *pLogFile; +} LOG_PROCESS_INFO, *PLOG_PROCESS_INFO; + +static int g_bEnableLog = TRUE; // 是否启用 Log 功能 +static int g_bEnMailBackup = FALSE; +static char* g_pEmailBox = NULL; +static int g_bEnLogToFile = TRUE; +static int g_bEnLogToServer = TRUE; +static char g_strLogTag[32]; // Log 标志 +static unsigned int g_LogRdPos = 0; +static pthread_t g_logThreadId; +static pthread_t g_backupThreadId; +static LOG_PROCESS_INFO g_LogProcessInfo; +static uv_rwlock_t g_uvLogLock; +static uv_rwlock_t g_uvLogBackLock; +static PLOG_ITEM g_pLogItemList = NULL; +static PLOG_BACKUP g_pLogBackupList = NULL; +static int g_logSock = -1; +struct sockaddr_in g_logAddr; + +static SYSPOINT_INFO g_SysPonitInfo; +static PSYSPOINT_ITEM g_pSysPointArray = NULL; +static PHTTP_POST_ATTACH g_pLogParamsArray = NULL; + + +static int g_iMinLevel = LOG_Fatal | LOG_Error | LOG_Warn | LOG_Debug | LOG_Info | LOG_Step; + +/** + * @brief Log 调试等级转字符串 + * @param level 调试等级 + * @return 调试等级对应的字符串 + */ +const char* LogLevelToStr(LOG_LEVEL level) +{ + switch(level) + { + case LOG_Test: + return "T"; + + case LOG_Info: + return "I"; + + case LOG_Call: + return "C"; + + case LOG_Debug: + return "D"; + + case LOG_Warn: + return "W"; + + case LOG_Error: + return "E"; + + case LOG_Fatal: + return "F"; + + case LOG_Step: + return "S"; + + case LOG_Devp: + return "V"; + + case LOG_Unknown: + return "U"; + + case LOG_All: + return "A"; + + default: + return "?"; + } + + return "U"; +} + +#pragma pack (push) +#pragma pack (1) +typedef struct +{ + unsigned short logSeq; + unsigned int pid; + unsigned int timeStamp; + unsigned int nanotime; + unsigned int logLevel; + char logContent[0]; +} LOG_PROTO_CONTENT, *PLOG_PROTO_CONTENT; +#pragma pack (pop) + +static struct HTTP_POST_ATTACH g_PostLogParams[] = +{ + {"CPUID", "", NULL, NULL}, + {"MAC", "", NULL, NULL}, + {"Version", "", NULL, NULL}, + {"BuildTime", "", NULL, NULL}, + {"SerialNumber", "", NULL, NULL}, + {"Datetime", "", NULL, NULL}, + {"content", "", NULL, NULL}, +}; + +static void __initPostLogParams(void) +{ + char *pMacAddr = NULL; + struct tm localTime; + time_t timeStamp = time((time_t*)NULL); + + GetShellExecResult("ifconfig wlan0 | grep HWaddr | awk \'{print $5}\'", &pMacAddr); + + localtime_r(&timeStamp, &localTime); + + strncpy(g_PostLogParams[0].keyValue, g_LogProcessInfo.pChipId, MAX_HTTP_POST_SIZE); + strncpy(g_PostLogParams[1].keyValue, (pMacAddr && strlen(pMacAddr) > 0) ? pMacAddr : "00:00:00:00:00:00", MAX_HTTP_POST_SIZE); + strncpy(g_PostLogParams[2].keyValue, GetCurrentVersion(), MAX_HTTP_POST_SIZE); + sprintf(g_PostLogParams[3].keyValue, "Build: %s %s", __DATE__, __TIME__); + strncpy(g_PostLogParams[4].keyValue, g_LogProcessInfo.pChipSerial, MAX_HTTP_POST_SIZE); + + for(int i = 0; i < sizeof(g_PostLogParams) / sizeof(g_PostLogParams[0]); i++) + { + LL_APPEND(g_pLogParamsArray, &g_PostLogParams[i]); + } + + if(pMacAddr) + { + free(pMacAddr); + } +} + +int HttpPostLogFile(char* pSession) +{ + int ret; + struct tm localTime; + const char* pFileName = "/tmp/backuplog.tar.gz"; + const char* pLastFile = "/mnt/UDISK/backuplog_nand.tar.gz"; + char* pLogServerURL = GetCurServerAddr(LOG_MODULE); + time_t timeStamp = time((time_t*)NULL); + + ret = system(" /usr/sbin/backuplocalfiles.sh"); + + if(access(pFileName, F_OK) != 0 + && access(pLastFile, F_OK) != 0) + { + return -ERR_FILE_NOT_EXISTS; + } + + localtime_r(&timeStamp, &localTime); + + memset(g_PostLogParams[5].keyValue, 0, MAX_HTTP_POST_SIZE); + sprintf(g_PostLogParams[5].keyValue, "%04u-%02u-%02u %02u:%02u:%02u", + localTime.tm_year + 1900, + localTime.tm_mon + 1, + localTime.tm_mday, + localTime.tm_hour, + localTime.tm_min, + localTime.tm_sec); + + memset(g_PostLogParams[6].keyValue, 0, MAX_HTTP_POST_SIZE); + + if(pSession && strlen(pSession) >= 2) + { + strncpy(g_PostLogParams[6].keyValue, pSession, MAX_HTTP_POST_SIZE); + } + else + { + strncpy(g_PostLogParams[6].keyValue, "{}", MAX_HTTP_POST_SIZE); + } + + if(access(pFileName, F_OK) == 0) + { + ret = InetHttpUploadFileSync(pLogServerURL, pFileName, g_pLogParamsArray); + + if(ret == 0) + { + LOG_EX(LOG_Debug, "Upload Log Data [%s] To Server [%s]\n", pFileName, pLogServerURL); + unlink(pFileName); + } + else + { + LOG_EX(LOG_Error, "Upload Log Data [%s] To Server [%s]\n", pFileName, pLogServerURL); + } + } + + if(access(pLastFile, F_OK) == 0) + { + ret = InetHttpUploadFileSync(pLogServerURL, pLastFile, g_pLogParamsArray); + + if(ret == 0) + { + LOG_EX(LOG_Debug, "Upload Log Data [%s] To Server [%s]\n", pLastFile, pLogServerURL); + unlink(pLastFile); + } + else + { + LOG_EX(LOG_Error, "Upload Log Data [%s] To Server [%s]\n", pLastFile, pLogServerURL); + } + } + + //fprintf(stdout, "Upload Log Data [%s] To Server [%s], size = %d\n", pFileName, UPL_HTTP_URL, fileSize); + + return ret; +} + +static int __logNetworkSend(PLOG_ITEM pItem) +{ + PLOG_PROTO_CONTENT pLogInfo; + unsigned char *pBuf; + int ret, totalSize = 0; + static unsigned short sendSeq = 0; + + if(pItem == NULL || pItem->pLogContent == NULL || strlen(pItem->pLogContent) == 0) + { + return (-ERR_INPUT_PARAMS); + } + + totalSize = sizeof(LOG_PROTO_CONTENT) + strlen(pItem->pLogContent); + + pBuf = (unsigned char *)malloc(totalSize); + + if(pBuf == NULL) + { + return (-ERR_MALLOC_MEMORY); + } + + memset(pBuf, 0, totalSize); + + pLogInfo = (PLOG_PROTO_CONTENT)pBuf; + + pLogInfo->logSeq = htons(sendSeq++); + pLogInfo->timeStamp = htonl(pItem->timestamp.tv_sec); + pLogInfo->nanotime = htonl(pItem->timestamp.tv_usec); + pLogInfo->pid = htonl(g_LogProcessInfo.pid); + pLogInfo->logLevel = htonl(pItem->level); + + memcpy(pLogInfo->logContent, pItem->pLogContent, strlen(pItem->pLogContent)); + + ret = sendto(g_logSock, pBuf, totalSize, 0, + (struct sockaddr *)&g_logAddr, sizeof(g_logAddr)); + + if(ret == totalSize) + { + return (0); + } + else + { + //LOG_EX(LOG_Error, "Send %d bytes, need %d bytes\n", ret, totalSize); + return (-ERR_NETWORK_SEND); + } +} + +static void __cleanupBackupItem(PLOG_BACKUP pItem) +{ + if(pItem) + { + LL_DELETE(g_pLogBackupList, pItem); + + if(pItem->plogFilePath) + { + if(access(pItem->plogFilePath, F_OK) == 0) + { + unlink(pItem->plogFilePath); + } + + free(pItem->plogFilePath); + } + + if(pItem->pGzFilePath) + { + if(access(pItem->pGzFilePath, F_OK) == 0) + { + unlink(pItem->pGzFilePath); + } + + free(pItem->pGzFilePath); + } + + free(pItem); + } +} + +static void* __uvLogBackupProc(void *pParams) +{ + SMTP_MAIL_CONFIG smtpCfg; + char gzLogPath[MAX_PATH]; + struct tm localTime; + const char *pFrom = LOG_MAIL_USERNAME; + const char *pTo[] = {g_pEmailBox, NULL}; + char *pMacAddr = NULL; + + //const char *pCc[] = {"xajhuang@qq.com", "xajhuang@163.com", NULL}; + + memset(&smtpCfg, 0, sizeof(SMTP_MAIL_CONFIG)); + + smtpCfg.pUserName = LOG_MAIL_USERNAME; + smtpCfg.pPassword = LOG_MAIL_PASSWORD; + smtpCfg.pSmtpServer = LOG_MAIL_SERVER; + smtpCfg.smtpPort = LOG_MAIL_PORT; + +#ifdef PLATFORM_CPU + GetShellExecResult("ifconfig enp3s0 | grep HWaddr | awk \'{print $5}\'", &pMacAddr); +#else + GetShellExecResult("ifconfig wlan0 | grep HWaddr | awk \'{print $5}\'", &pMacAddr); +#endif + + if(pMacAddr == NULL || strlen(pMacAddr) == 0) + { + pMacAddr = strdup("00:00:00:00:00:00"); + } + + while(TRUE) + { + PLOG_BACKUP pItem = NULL, pTmp = NULL; + time_t timeStamp = time((time_t*)NULL); + localtime_r(&timeStamp, &localTime); + + uv_rwlock_wrlock(&g_uvLogBackLock); + + LL_FOREACH_SAFE(g_pLogBackupList, pItem, pTmp) + { + const char *pAttact[2]; + UT_string *pTitle, *pMessage, *pDatetime; + char* pMD5Val; + + pAttact[1] = NULL; + + if(pItem->plogFilePath == NULL || strlen(pItem->plogFilePath) == 0) + { + __cleanupBackupItem(pItem); + continue; + } + + if(timeStamp - pItem->timestamp >= 3600) + { + __cleanupBackupItem(pItem); + continue; + } + + if(pItem->sendTimes >= 3) + { + __cleanupBackupItem(pItem); + continue; + } +#if 0 + if(g_bEnLogToServer) + { + __logHttpPostFile(pItem->plogFilePath); + //InetHttpUploadFileSync(UPL_HTTP_URL, pItem->pGzFilePath, NULL); + } +#endif + if(pItem->pGzFilePath == NULL) + { + memset(gzLogPath, 0, MAX_PATH); + sprintf(gzLogPath, "%s/%d_%s_%u.log.gz", + LOG_FILE_BASEDIR, g_LogProcessInfo.pid, g_LogProcessInfo.exeName, pItem->tolLogs); + + if(GZipFileCompress(pItem->plogFilePath, gzLogPath) != 0) + { + LOG_EX(LOG_Error, "Create Gzip File Error: %s\n", gzLogPath); + continue; + } + else + { + pItem->pGzFilePath = strdup(gzLogPath); + } + } + + pMD5Val = (char*)EvpMD5HashFile(pItem->pGzFilePath); + + utstring_new(pTitle); + utstring_new(pMessage); + utstring_new(pDatetime); + + utstring_printf(pDatetime, "%04u-%02u-%02u %02u:%02u:%02u", + localTime.tm_year + 1900, + localTime.tm_mon + 1, + localTime.tm_mday, + localTime.tm_hour, + localTime.tm_min, + localTime.tm_sec); + + utstring_printf(pTitle, "Log [%s]-[%s]-[%s]", + g_LogProcessInfo.exeName, + g_LogProcessInfo.pChipSerial, + utstring_body(pDatetime)); + + utstring_printf(pMessage, "\r\n" + "

Summary information:

" + "


" + "

" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "
Items
%u
Process PID
%d
Process Name
%s
CPU ID
%s
Serial
%s
Mac Address
%s
File Checksum
%s
Log Level
0x%08X
Datetime
%s
" + "

" + "\r\n", + pItem->tolLogs, + g_LogProcessInfo.pid, + g_LogProcessInfo.exeName, + g_LogProcessInfo.pChipId, + g_LogProcessInfo.pChipSerial, + pMacAddr, + SAFE_STRING_VALUE(pMD5Val), + g_iMinLevel, + utstring_body(pDatetime)); + + pAttact[0] = pItem->pGzFilePath; +#if 0 + if(g_bEnMailBackup && + InetSmtpSendEmail(pFrom, pTo, NULL, utstring_body(pTitle), + utstring_body(pMessage), pAttact, &smtpCfg) == 0) + { + __cleanupBackupItem(pItem); + } + else + { + LOG_EX(LOG_Error, "Send email error: %s\n", pItem->pGzFilePath); + } +#endif + pItem->sendTimes++; + + if(pMD5Val) + { + free(pMD5Val); + } + + utstring_free(pTitle); + utstring_free(pMessage); + utstring_free(pDatetime); + } + + uv_rwlock_wrunlock(&g_uvLogBackLock); + + sleep(1); + } + + free(pMacAddr); + pthread_detach(pthread_self()); + return (NULL); +} + +static void __logColorOutput(const char* pColFmt, UT_string* pLog) +{ + if(pLog == NULL) + { + return; + } + + if(pColFmt == NULL) + { + print("%s", utstring_body(pLog)); + } + else + { + if(utstring_find(pLog, -1, "\n", 1) == utstring_len(pLog) - 1) + { + char* pLogArray = utstring_body(pLog); + pLogArray[utstring_len(pLog) - 1] = 0; + + print(pColFmt, pLogArray, '\n'); + + strcat(pLogArray, "\n"); + } + else + { + print(pColFmt, utstring_body(pLog), '\0'); + } + } +} + +static void* __logOutputThread(void *p) +{ + while(TRUE) + { + int isWriteLog = FALSE; + PLOG_ITEM pItem = NULL, pTmp = NULL; + + uv_rwlock_wrlock(&g_uvLogLock); + + LL_FOREACH_SAFE(g_pLogItemList, pItem, pTmp) + { + UT_string *pLogStr; + struct tm lTime; + int logFileSize = 0; + + if(++g_LogRdPos % 100 == 0) + { + GET_FILE_SIZE(g_LogProcessInfo.logFilePath, logFileSize); + } + + localtime_r(&(pItem->timestamp.tv_sec), &lTime); + + utstring_new(pLogStr); + + if(pItem->isAddTags) + { + utstring_printf(pLogStr, "[%04d-%02d-%02d %02d:%02d:%02d.%03ld] [%s] %s", + lTime.tm_year + 1900, lTime.tm_mon + 1, lTime.tm_mday, + lTime.tm_hour, lTime.tm_min, lTime.tm_sec, pItem->timestamp.tv_usec / 1000, + LogLevelToStr(pItem->level), pItem->pLogContent); + } + else + { + utstring_printf(pLogStr, "%s", pItem->pLogContent); + } + + if(pItem->isPrinted == FALSE) + { + if(pItem->level & LOG_Error + || pItem->level & LOG_Fatal) + { + __logColorOutput(SHOW_CONSOLE_RED, pLogStr); + } + else if(pItem->level & LOG_Warn + || pItem->level & LOG_Unknown) + { + __logColorOutput(SHOW_CONSOLE_YELLOW, pLogStr); + } + else if(pItem->level & LOG_Test + || pItem->level & LOG_Call) + { + __logColorOutput(SHOW_CONSOLE_BLUE, pLogStr); + } + else if(pItem->level & LOG_Devp) + { + __logColorOutput(SHOW_CONSOLE_GREEN, pLogStr); + } + else + { + print("%s", utstring_body(pLogStr)); + } + + pItem->isPrinted = TRUE; + } + + if(g_logSock != -1 && GetCurrWIFIConnStatus() == WIFI_CONNECTED) + { + __logNetworkSend(pItem); + } + + if(g_LogProcessInfo.pLogFile != NULL && g_bEnLogToFile) + { + if(logFileSize >= MAX_LOG_FILE_SIZE) + { + fflush(g_LogProcessInfo.pLogFile); + fclose(g_LogProcessInfo.pLogFile); +#if 0 + if(g_bEnMailBackup) + { + PLOG_BACKUP pBackup = (PLOG_BACKUP)malloc(sizeof(struct LOG_BACKUP)); + char path[MAX_PATH]; + + memset(path, 0, MAX_PATH); + sprintf(path, "%s/%s.bak_%u.log", + LOG_FILE_BASEDIR, + basename_v2(g_LogProcessInfo.logFilePath), + g_LogRdPos); + rename(g_LogProcessInfo.logFilePath, path); + + if(pBackup) + { + memset(pBackup, 0, sizeof(struct LOG_BACKUP)); + pBackup->timestamp = time(NULL); + pBackup->plogFilePath = strdup(path); + pBackup->sendTimes = 0; + pBackup->tolLogs = g_LogRdPos - 1; + + uv_rwlock_wrlock(&g_uvLogBackLock); + LL_APPEND(g_pLogBackupList, pBackup); + uv_rwlock_wrunlock(&g_uvLogBackLock); + } + } +#endif + g_LogProcessInfo.pLogFile = fopen(g_LogProcessInfo.logFilePath, "w+"); + } + + if(g_LogProcessInfo.pLogFile) + { + fwrite(utstring_body(pLogStr), 1, utstring_len(pLogStr), g_LogProcessInfo.pLogFile); + } + + isWriteLog = TRUE; + } + + LL_DELETE(g_pLogItemList, pItem); + + utstring_free(pLogStr); + free(pItem->pLogContent); + free(pItem); + + if(g_LogRdPos % 100 == 0) + { + break; + } + } + + uv_rwlock_wrunlock(&g_uvLogLock); + + usleep(1000); + if(g_LogProcessInfo.pLogFile != NULL && isWriteLog) + { + fflush(g_LogProcessInfo.pLogFile); + } + } + + pthread_detach(pthread_self()); + return (NULL); +} + +/** + * @brief 设置调试等级 + * @param level 调试等级 + * @param iEnable 1 打开调试等级, 0 关闭调试等级 + */ +void IHW_EnableLogLevel(LOG_LEVEL level, int iEnable) +{ + if(iEnable > 0) + { + g_iMinLevel |= level; + } + else + { + g_iMinLevel &= ~(level); + } +} + +static int __getCfgFromCfgFile(void) +{ + int ret = 0; + g_bEnableLog = CfgGetBoolValue("Global.Log.Enable", g_bEnableLog); + g_iMinLevel = CfgGetIntValue("Global.Log.Level", g_iMinLevel); + g_bEnMailBackup = CfgGetBoolValue("Global.Log.LogToEMail.Enable", g_bEnMailBackup); + g_pEmailBox = CfgGetStringValue("Global.Log.LogToEMail.EMail", LOG_MAIL_RECEIVER); + g_bEnLogToFile = CfgGetBoolValue("Global.Log.LogToFile", g_bEnLogToFile); + g_bEnLogToServer = CfgGetBoolValue("Global.Log.LogToServer", g_bEnLogToServer); + +#if 0 + LOG_EX(LOG_Debug, "g_bEnableLog = %d\n", g_bEnableLog); + LOG_EX(LOG_Debug, "g_iMinLevel = 0x%X\n", g_iMinLevel); + LOG_EX(LOG_Debug, "g_bEnMailBackup = %d\n", g_bEnMailBackup); + LOG_EX(LOG_Debug, "g_pEmailBox = %s\n", g_pEmailBox); + LOG_EX(LOG_Debug, "g_bEnLogToFile = %d\n", g_bEnLogToFile); + LOG_EX(LOG_Debug, "g_bEnLogToServer = %d\n", g_bEnLogToServer); +#endif + + ret = CfgGetBoolValue("Global.Log.LogToUDPServer.Enable", FALSE); + + if(ret) + { + char *pIpAddr = NULL; + int udpPortBase = CfgGetBoolValue("Global.Log.LogToUDPServer.UdpBasePort", 10000); + int port = udpPortBase + DBusLibGetModName(); + + if(g_logSock != -1) + { + close(g_logSock); + g_logSock = -1; + } + + pIpAddr = CfgGetStringValue("Global.Log.LogToUDPServer.UdpServerIp", NULL); + + LOG_EX(LOG_Debug, "UDP Ipaddr = %s, port = %d\n", pIpAddr, port); + + if(pIpAddr) + { + memset(&g_logAddr, 0, sizeof(g_logAddr)); + g_logAddr.sin_family = AF_INET; + g_logAddr.sin_port = htons(port); + g_logAddr.sin_addr.s_addr = inet_addr(pIpAddr); + + g_logSock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + } + } +} +/** + * @brief 初始化系统日志功能 + * @param pLogTag 系统日志标志 + * @param pPath 系统日志保存路径 + * @param bEnable 打开/关闭调试信息 + */ +void IHW_InitLOG(const char* pLogTag, const char* pPath, int bEnable) +{ + int ret; + char strPath[MAX_PATH]; + + memset(&g_logAddr, 0, sizeof(g_logAddr)); + uv_rwlock_init(&g_uvLogLock); + g_LogRdPos = 0; + memset(g_strLogTag, 0, 32); + + memset(&g_LogProcessInfo, 0, sizeof(LOG_PROCESS_INFO)); + + if(pLogTag == NULL) + { + strcpy(g_strLogTag, ""); + } + else + { + strncpy(g_strLogTag, pLogTag, 31); + } + + memset(strPath, 0, MAX_PATH); + + g_LogProcessInfo.pid = getpid(); + if(readlink("/proc/self/exe", strPath, MAX_PATH) == -1) + { + strcpy(g_LogProcessInfo.exeName, pLogTag); + } + else + { + char *pExeName = strrchr(strPath, '/'); + + if(pExeName == NULL) + { + strncpy(g_LogProcessInfo.exeName, strPath, MAX_PATH - 1); + } + else + { + strncpy(g_LogProcessInfo.exeName, pExeName + 1, MAX_PATH - 1); + } + } + + //fprintf(stdout, "pid = %d, name = %s\n", g_LogProcessInfo.pid, g_LogProcessInfo.exeName); + g_LogProcessInfo.pChipId = GetCpuChipId(); + g_LogProcessInfo.pChipSerial = GetCpuSerial(); + memset(g_LogProcessInfo.logFilePath, 0, MAX_PATH); + sprintf(g_LogProcessInfo.logFilePath, "%s/%s_%d.log", LOG_FILE_BASEDIR, g_LogProcessInfo.exeName, g_LogProcessInfo.pid); + + memset(strPath, 0, MAX_PATH); + sprintf(strPath, "rm -f %s/%s_*.log > /dev/zero", LOG_FILE_BASEDIR, g_LogProcessInfo.exeName); + ret = system(strPath); + + g_LogProcessInfo.pLogFile = fopen(g_LogProcessInfo.logFilePath, "w+"); + + g_bEnableLog = bEnable; + + __getCfgFromCfgFile(); + +#if 0 + LOG_CFG_PROTOCOL logCfg; + + memset(&logCfg, 0, sizeof(LOG_CFG_PROTOCOL)); + logCfg.cfgCmd = CMD_LOG_NETWORK; + logCfg.iParams1 = inet_addr("10.240.84.163"); + logCfg.iParams2 = htons(10000); + UpgradLogConfigure(&logCfg); +#endif + + __initPostLogParams(); +} + +void IHW_RunLogService(void) +{ + pthread_create(&g_logThreadId, NULL, __logOutputThread, NULL); + pthread_create(&g_backupThreadId, NULL, __uvLogBackupProc, NULL); +} + +static void __logTo(LOG_LEVEL level, int isAddTag, char* pMsg, int isPrint) +{ + PLOG_ITEM pLogItem; + + pLogItem = (PLOG_ITEM)malloc(sizeof(struct LOG_ITEM)); + + if(pLogItem == NULL) + { + return; + } + + pLogItem->pLogContent = strdup(pMsg); + pLogItem->isPrinted = isPrint ? FALSE : TRUE; + pLogItem->level = level; + pLogItem->isAddTags = isAddTag ? TRUE : FALSE; + gettimeofday(&(pLogItem->timestamp), NULL); + + uv_rwlock_wrlock(&g_uvLogLock); + LL_APPEND(g_pLogItemList, pLogItem); + uv_rwlock_wrunlock(&g_uvLogLock); +} + +void IHW_LogStrWithoutPrint(int level, char* pMsg) +{ + __logTo(level, TRUE, pMsg, FALSE); +} + +void IHW_LogRawString(int level, char* pMsg) +{ + __logTo(level, TRUE, pMsg, TRUE); +} + +/** + * @brief 输出调试信息 + * @param cFlag 调试信息开关 + * @param pMsg 调试信息内容 + */ +void IHW_LOG_UNTAG(LOG_LEVEL level, const char* pMsg, ...) +{ + va_list arg_ptr; + UT_string *pLogContent; + + if(!g_bEnableLog) + { + return; + } + + // 检查调试等级 + if(!(g_iMinLevel & level)) + { + return; + } + + utstring_new(pLogContent); + va_start(arg_ptr, pMsg); + utstring_printf_va(pLogContent, pMsg, arg_ptr); + va_end(arg_ptr); + + __logTo(level, FALSE, utstring_body(pLogContent), TRUE); + + utstring_free(pLogContent); +} + +/** + * @brief 输出调试信息 + * @param cFlag 调试信息开关 + * @param pMsg 调试信息内容 + */ +void IHW_LOG(LOG_LEVEL level, const char* pMsg, ...) +{ + UT_string* pLogContent = NULL; + va_list arg_ptr; + + if(!g_bEnableLog) + { + return; + } + + // 检查调试等级 + if(!(g_iMinLevel & level)) + { + return; + } + + utstring_new(pLogContent); + va_start(arg_ptr, pMsg); + utstring_printf_va(pLogContent, pMsg, arg_ptr); + va_end(arg_ptr); + + __logTo(level, TRUE, utstring_body(pLogContent), TRUE); + + utstring_free(pLogContent); +} + +void IHW_DisableLogOut(void) +{ + g_bEnableLog = FALSE; +} + +void IHW_EnableLogOut(void) +{ + g_bEnableLog = TRUE; +} + +#if 0 +void LogUploadCurLogFile(void) +{ + UT_string *pFn = NULL, *pCmd = NULL; + utstring_new(pFn); + utstring_new(pCmd); + + utstring_printf(pFn, "/tmp/%s_%s.bak.log", g_LogProcessInfo.exeName, g_LogProcessInfo.pChipId); + utstring_printf(pCmd, "cp %s %s", g_LogProcessInfo.logFilePath, utstring_body(pFn)); + + __logHttpPostFile(utstring_body(pFn)); + //InetHttpUploadFileSync(UPL_HTTP_URL, utstring_body(pFn), NULL); + + utstring_free(pFn); + utstring_free(pCmd); +} +#endif + +#if 0 +void UploadLogFile(char* pFilePath) +{ + int fileSize = 0; + + if(pFilePath == NULL || strlen(pFilePath) == 0) + { + return; + } + + GET_FILE_SIZE(pFilePath, fileSize); + + if(fileSize <= 0) + { + LOG_EX(LOG_Warn, "File Size Error: %d\n", fileSize); + return; + } + + __logHttpPostFile(pFilePath); +} +#endif + +void UpgradLogConfigure(PLOG_CFG_PROTOCOL pCfg) +{ + switch(pCfg->cfgCmd) + { + case CMD_LOG_ENABLE: + g_bEnableLog = pCfg->iParams1; + break; + + case CMD_LOG_FILE: + if(pCfg->iParams1 == FALSE) + { + g_bEnMailBackup = g_bEnLogToFile = FALSE; + } + else + { + g_bEnLogToFile = TRUE; + } + break; + + case CMD_LOG_MAIL: + g_bEnMailBackup = pCfg->iParams1; + break; + + case CMD_LOG_LEVEL: + if(pCfg->iParams2 == FALSE) + { + if(pCfg->iParams1 == 0) + { + g_iMinLevel = LOG_Fatal | LOG_Error | LOG_Devp; + } + else + { + g_iMinLevel &= ~(pCfg->iParams1); + } + } + else + { + g_iMinLevel |= pCfg->iParams1; + } + break; + + case CMD_LOG_NETWORK: + if(pCfg->iParams1 == 0) + { + memset(&g_logAddr, 0, sizeof(g_logAddr)); + close(g_logSock); + g_logSock = -1; + } + else + { + if(g_logSock != -1) + { + close(g_logSock); + } + + memset(&g_logAddr, 0, sizeof(g_logAddr)); + g_logAddr.sin_family = AF_INET; + g_logAddr.sin_port = htons((pCfg->iParams2 & 0xFFFF)); + g_logAddr.sin_addr.s_addr = (pCfg->iParams1); + + g_logSock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + } + break; + + case CMD_LOG_SERVER: + g_bEnLogToServer = pCfg->iParams1; + break; + + default: break; + } +} + +const char* LogLeveToString(LOG_LEVEL lv) +{ + switch(lv) + { + case LOG_Fatal: return "LOG_Fatal"; + case LOG_Error: return "LOG_Error"; + case LOG_Warn: return "LOG_Warn"; + case LOG_Debug: return "LOG_Debug"; + case LOG_Info: return "LOG_Info"; + case LOG_Test: return "LOG_Test"; + case LOG_Call: return "LOG_Call"; + case LOG_Devp: return "LOG_Devp"; + case LOG_Step: return "LOG_Step"; + case LOG_Unknown: return "LOG_Unknown"; + case LOG_All: return "LOG_All"; + case LOG_Close: return "LOG_Close"; + } + + return "Unknown"; +} + +static void __uvSysPointIOProc(void *pParams) +{ + while(TRUE) + { + PSYSPOINT_ITEM pItem = NULL, pTmp = NULL; + int iFileSize; + time_t tmNow = time(NULL); + + if(g_SysPonitInfo.pMarkFile) + { + uv_rwlock_wrlock(&g_SysPonitInfo.uvRwLock); + LL_FOREACH_SAFE(g_pSysPointArray, pItem, pTmp) + { + fwrite(pItem->pContent, 1, strlen(pItem->pContent), g_SysPonitInfo.pMarkFile); + free(pItem->pContent); + LL_DELETE(g_pSysPointArray, pItem); + free(pItem); + } + uv_rwlock_wrunlock(&g_SysPonitInfo.uvRwLock); + } + + GET_FILE_SIZE(g_SysPonitInfo.savePath, iFileSize); + + if(g_SysPonitInfo.lastPostTime == 0 || tmNow < g_SysPonitInfo.lastPostTime) + { + g_SysPonitInfo.lastPostTime = g_SysPonitInfo.lastMarkTime = tmNow; + tmNow = 0; + } +#if 0 + LOG_EX(LOG_Debug, "iFile = %d, MaxSize = %d, upTime = %d\n", + iFileSize, g_SysPonitInfo.iMaxCacheSize, g_SysPonitInfo.iEveryUploadTime); + + LOG_EX(LOG_Debug, "tm = %d, last = %d\n", tmNow, g_SysPonitInfo.lastPostTime); +#endif + if(iFileSize > g_SysPonitInfo.iMaxCacheSize + || tmNow - g_SysPonitInfo.lastPostTime > g_SysPonitInfo.iEveryUploadTime) + { + int fileSize = 0; + + GET_FILE_SIZE(g_SysPonitInfo.savePath, fileSize); + + if(fileSize > 0) + { + SysPointMarkUpload(); + g_SysPonitInfo.lastPostTime = tmNow; + } + + if(tmNow - g_SysPonitInfo.lastPostTime > g_SysPonitInfo.iEveryUploadTime) + { + SysPointMarkUpload(); + g_SysPonitInfo.lastPostTime = tmNow; + } + } + + if(g_SysPonitInfo.pMarkFile) + { + fflush(g_SysPonitInfo.pMarkFile); + } + + sleep(1); + } + + pthread_detach(pthread_self()); +} + +int SysPointMarkInit(char* pDevId, int iMaxSize, int iPostTime) +{ + LOG_EX(LOG_Debug, "pDevId = %s, iMaxSize = %d, iPostTime = %d\n", pDevId, iMaxSize, iPostTime); + + if(g_SysPonitInfo.pDeviceId != NULL) + { + if(pDevId && strlen(pDevId) > 0) + { + free(g_SysPonitInfo.pDeviceId); + g_SysPonitInfo.pDeviceId = strdup(pDevId); + } + + if(iMaxSize > 0) + { + g_SysPonitInfo.iMaxCacheSize = iMaxSize; + } + else + { + g_SysPonitInfo.iMaxCacheSize = 1024 * 10; + } + + if(iPostTime > 0) + { + g_SysPonitInfo.iEveryUploadTime = iPostTime; + } + else + { + g_SysPonitInfo.iEveryUploadTime = SYS_POINT_UPLOAD_TIME; + } + } + else + { + memset(&g_SysPonitInfo, 0, sizeof(SYSPOINT_INFO)); + + if(pDevId && strlen(pDevId) > 0) + { + g_SysPonitInfo.pDeviceId = strdup(pDevId); + } + + if(iMaxSize > 0) + { + g_SysPonitInfo.iMaxCacheSize = iMaxSize; + } + else + { + g_SysPonitInfo.iMaxCacheSize = 1024 * 1024; + } + + if(iPostTime > 0) + { + g_SysPonitInfo.iEveryUploadTime = iPostTime; + } + else + { + g_SysPonitInfo.iEveryUploadTime = SYS_POINT_UPLOAD_TIME; + } + + sprintf(g_SysPonitInfo.savePath, "%s/sys_point_mark.log", LOG_FILE_BASEDIR); + + g_SysPonitInfo.pMarkFile = fopen(g_SysPonitInfo.savePath, "w+"); + + if(g_SysPonitInfo.pMarkFile == NULL) + { + LOG_EX(LOG_Error, "Create File: %s Error\n", g_SysPonitInfo.savePath); + return -ERR_OPEN_FILE; + } + + uv_rwlock_init(&g_SysPonitInfo.uvRwLock); + + uv_thread_create(&g_SysPonitInfo.uvIOThread, __uvSysPointIOProc, NULL); + } + + return 0; +} + +int SysPointMark(char* pMarkInfo) +{ + PSYSPOINT_ITEM pItem; + + if(pMarkInfo == NULL || strlen(pMarkInfo) == 0) + { + return -ERR_INPUT_PARAMS; + } + + if(g_SysPonitInfo.iMaxCacheSize <= 0) + { + return -ERR_UNSUPPORT; + } + + pItem = (PSYSPOINT_ITEM)malloc(sizeof(struct SYSPOINT_ITEM)); + + if(pItem == NULL) + { + return -ERR_MALLOC_MEMORY; + } + + pItem->pContent = strdup(pMarkInfo); + g_SysPonitInfo.lastMarkTime = time(NULL); + + uv_rwlock_wrlock(&g_SysPonitInfo.uvRwLock); + LL_APPEND(g_pSysPointArray, pItem); + uv_rwlock_wrunlock(&g_SysPonitInfo.uvRwLock); + + //LOG_EX(LOG_Debug, "SysMark: %s\n", pItem->pContent); + + return 0; +} + +int SysPointMarkUpload(void) +{ + char path[MAX_PATH]; + + memset(path, 0, MAX_PATH); + sprintf(path, "%s.txt", g_SysPonitInfo.savePath); + + if(access(path, F_OK) == 0) + { + unlink(path); + } + + rename(g_SysPonitInfo.savePath, path); + + fclose(g_SysPonitInfo.pMarkFile); + g_SysPonitInfo.pMarkFile = fopen(g_SysPonitInfo.savePath, "w+"); + + InetHttpUploadFileSync(GetCurServerAddr(MARK_POINT_MODULE), path, NULL); + LOG_EX(LOG_Debug, "Upload System Mark Data [%s] To Server [%s]\n", path, GetCurServerAddr(MARK_POINT_MODULE)); + + unlink(path); +} +

r15nouU6y>3>(U?=tC!P8s$=hu8L9p6ttg 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%0A?GJ1UABg)_Sw=5Hj((&yMk1r; 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

xVqknoo`lk<| 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 z�Atjz~Y&*E&kX(&cHbQ)(Rh^ez7E41S3?hq0D;jW`&eh&?kl(66y;`la_b_!B=D zX1r?ROtAXDosGpO;7{=h_!zB$4RdFu=o?=CNl&MpZ`u3$@#9A8)&Hb3x}vvir|#e$ zSUA+2s@Y#wt+ehBYDuSb)%r%PJ%l8{Umj-^y-lsCf^sG}^y1C^{ z@m8)io3UjrD$9&h)~2$CM49jB#ki1BZ2}H?r4xDh(wan`(FDy^ahYt=${JnS#4>J8 z&u}t6Ga+N$V|?7=$x?T0Sd7#jjjN2Y=#Vr27W>qui{r-poK*c0dpHq%eyu?87H4vY zr{S+l;J3NF&3V8-5j=j7ICi|a6umJfGR7vyUvx#;U)uOv;%sK}>>+)_<`&x1cJhKp zTTg&)7gx*vnIAxZTn?Sd@;E-i4?+|7h@MP5K%cX*6nkT?YGdgPcYYOHWgN#oPd+aA zJDrsWg6>^dhC3Lz?eLw}f<; z(ydBkhxq8*q!-3a&V*<6#0R(QnU$?^Zi;cHRo^iIXI3ySCRO~=jx7%KYRyAW{RW3u^=m?W~u=ANb;R7yLcAI0FF>j?T2Fb0RoLbLzx!CZiLz>+s1B z`IuPqdePMw^6R-)6fK{2qU!R&!9*g=#-(W z${ae>AZ)s>ZdI8whVv%jQdVeXj-O+W(ckBNp7Xsq_vuYqkj=e*dA;&_o_n5izUOPhU$~{qUEkoP{&+@i{GfKiZMNsG{a}6E!8xmav-nQ2=l zPG}m=ZCaKbj?tm(Ie4Pcp=89t6VD&6j5xTe-y6t?!RSlL$m*1gnD1lnWHf1xa+1L& zwM*{rclkl?wTEU3ofPKcV#PX5igkJ=W9eKR<6J9V!~fxajqdSnxJOSXe)G)wM63KA zY(BDyFN3XyUy>Yz{A}@%=~^wRL{fb?{ zKF7Ky_Bn~)(X;H22DcsODJDqu$2t)CL*%sHGq?UFe9-d^v*A-tVqaio^qvvlr=Jt2 za)J{w{88a#IRWK1-Co-fVrI!KG{{CH?mcPBlAO3`EPQ683*%ogn0()dHsC}*j1L-F z8L(XWAz<|g7JXq)ZB865%E{a~JE-~TR3Ds^+7ij{if@q~8ZKu8x#leWP_DHv%B`=V zmx$NUO%8qx@7D6foV?=Yu^x}W8}JCc63$0D$74K#Ed!U&XinT1>)>)&{Bj7KfB{|^ zoiBN~c(Jy3rSQV1w0(RgyXz#oCE3URSl>aF|5ehs4`m;b-+KNRbVNryuD$21Q{l7V zgFz2`Htc(-ORw_w0vAzn{=nxTdBIoub_TUfxkS>RrlL z2nXyiI_MIW_X`ew!+@^nOT!EPGu_g!d-M>xv)=Oo|9qvMBNO;r*mLwXz6JW2cM{C5 z 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%0DefzXK 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