diff --git a/build/windows/HGVersion/HGVersion.def b/build/windows/HGVersion/HGVersion.def index b40b9671..a3a453c8 100644 --- a/build/windows/HGVersion/HGVersion.def +++ b/build/windows/HGVersion/HGVersion.def @@ -9,6 +9,18 @@ HGVersion_PostInstallInfo HGVersion_PostUninstallInfo HGVersion_PostCrashInfo HGVersion_PostUserFeedback + +HGVersion_PostDeviceOpenInfo +HGVersion_PostDeviceCloseInfo +HGVersion_PostDeviceScanCountInfo +HGVersion_PostDeviceClearRollerInfo +HGVersion_PostDeviceHistroyCountInfo +HGVersion_PostDeviceRollerCountInfo +HGVersion_PostUserOpenInfo +HGVersion_PostUserCloseInfo +HGVersion_PostUserLoginInfo +HGVersion_PostUserLogoutInfo + HGVersion_GetVersionList HGVersion_HttpDownload HGVersion_ReleaseVersionList diff --git a/build/windows/HGVersion/HGVersion.vcxproj b/build/windows/HGVersion/HGVersion.vcxproj index 51d16693..6464690e 100644 --- a/build/windows/HGVersion/HGVersion.vcxproj +++ b/build/windows/HGVersion/HGVersion.vcxproj @@ -26,6 +26,7 @@ + diff --git a/modules/base/HGMsgPumpImpl.cpp b/modules/base/HGMsgPumpImpl.cpp index 6764955a..e78cb6a2 100644 --- a/modules/base/HGMsgPumpImpl.cpp +++ b/modules/base/HGMsgPumpImpl.cpp @@ -84,7 +84,7 @@ HGResult HGMsgPumpImpl::PostMessage(const HGMsg* msg) HGResult HGMsgPumpImpl::Exit() { HGMsg msg; - msg.data = 0; + msg.id = 0; msg.data = NULL; HGResult ret = HGBASE_ERR_FAIL; diff --git a/modules/version/HGVersion.cpp b/modules/version/HGVersion.cpp index 75d8523c..bd89f9c8 100644 --- a/modules/version/HGVersion.cpp +++ b/modules/version/HGVersion.cpp @@ -84,6 +84,122 @@ HGResult HGAPI HGVersion_PostUserFeedback(HGVersionMgr mgr, const HGChar* appNam return versionMgrImpl->PostUserFeedback(appName, desc, feedback, contact); } +HGResult HGAPI HGVersion_PostDeviceOpenInfo(HGVersionMgr mgr, const HGChar* devName, const HGChar* devSN, + const HGChar* devType, const HGChar* devFW) +{ + if (NULL == mgr) + { + return HGBASE_ERR_INVALIDARG; + } + + HGVersionMgrImpl* versionMgrImpl = (HGVersionMgrImpl*)mgr; + return versionMgrImpl->PostDeviceOpenInfo(devName, devSN, devType, devFW); +} + +HGResult HGAPI HGVersion_PostDeviceCloseInfo(HGVersionMgr mgr, const HGChar* devName, const HGChar* devSN, + const HGChar* devType, const HGChar* devFW) +{ + if (NULL == mgr) + { + return HGBASE_ERR_INVALIDARG; + } + + HGVersionMgrImpl* versionMgrImpl = (HGVersionMgrImpl*)mgr; + return versionMgrImpl->PostDeviceCloseInfo(devName, devSN, devType, devFW); +} + +HGResult HGAPI HGVersion_PostDeviceScanCountInfo(HGVersionMgr mgr, const HGChar* devName, const HGChar* devSN, + const HGChar* devType, const HGChar* devFW, HGUInt scanCount) +{ + if (NULL == mgr) + { + return HGBASE_ERR_INVALIDARG; + } + + HGVersionMgrImpl* versionMgrImpl = (HGVersionMgrImpl*)mgr; + return versionMgrImpl->PostDeviceScanCountInfo(devName, devSN, devType, devFW, scanCount); +} + +HGResult HGAPI HGVersion_PostDeviceClearRollerInfo(HGVersionMgr mgr, const HGChar* devName, const HGChar* devSN, + const HGChar* devType, const HGChar* devFW) +{ + if (NULL == mgr) + { + return HGBASE_ERR_INVALIDARG; + } + + HGVersionMgrImpl* versionMgrImpl = (HGVersionMgrImpl*)mgr; + return versionMgrImpl->PostDeviceClearRollerInfo(devName, devSN, devType, devFW); +} + +HGResult HGAPI HGVersion_PostDeviceHistroyCountInfo(HGVersionMgr mgr, const HGChar* devName, const HGChar* devSN, + const HGChar* devType, const HGChar* devFW, HGUInt histroyCount) +{ + if (NULL == mgr) + { + return HGBASE_ERR_INVALIDARG; + } + + HGVersionMgrImpl* versionMgrImpl = (HGVersionMgrImpl*)mgr; + return versionMgrImpl->PostDeviceHistroyCountInfo(devName, devSN, devType, devFW, histroyCount); +} + +HGResult HGAPI HGVersion_PostDeviceRollerCountInfo(HGVersionMgr mgr, const HGChar* devName, const HGChar* devSN, + const HGChar* devType, const HGChar* devFW, HGUInt rollerCount) +{ + if (NULL == mgr) + { + return HGBASE_ERR_INVALIDARG; + } + + HGVersionMgrImpl* versionMgrImpl = (HGVersionMgrImpl*)mgr; + return versionMgrImpl->PostDeviceRollerCountInfo(devName, devSN, devType, devFW, rollerCount); +} + +HGResult HGAPI HGVersion_PostUserOpenInfo(HGVersionMgr mgr, const HGChar* appName) +{ + if (NULL == mgr) + { + return HGBASE_ERR_INVALIDARG; + } + + HGVersionMgrImpl* versionMgrImpl = (HGVersionMgrImpl*)mgr; + return versionMgrImpl->PostUserOpenInfo(appName); +} + +HGResult HGAPI HGVersion_PostUserCloseInfo(HGVersionMgr mgr, const HGChar* appName) +{ + if (NULL == mgr) + { + return HGBASE_ERR_INVALIDARG; + } + + HGVersionMgrImpl* versionMgrImpl = (HGVersionMgrImpl*)mgr; + return versionMgrImpl->PostUserCloseInfo(appName); +} + +HGResult HGAPI HGVersion_PostUserLoginInfo(HGVersionMgr mgr, const HGChar* appName) +{ + if (NULL == mgr) + { + return HGBASE_ERR_INVALIDARG; + } + + HGVersionMgrImpl* versionMgrImpl = (HGVersionMgrImpl*)mgr; + return versionMgrImpl->PostUserLoginInfo(appName); +} + +HGResult HGAPI HGVersion_PostUserLogoutInfo(HGVersionMgr mgr, const HGChar* appName) +{ + if (NULL == mgr) + { + return HGBASE_ERR_INVALIDARG; + } + + HGVersionMgrImpl* versionMgrImpl = (HGVersionMgrImpl*)mgr; + return versionMgrImpl->PostUserLogoutInfo(appName); +} + HGResult HGAPI HGVersion_GetVersionList(HGVersionMgr mgr, const HGChar* appName, HGVersionInfo** info, HGUInt* count) { if (NULL == mgr) diff --git a/modules/version/HGVersion.h b/modules/version/HGVersion.h index b519995a..fca3347c 100644 --- a/modules/version/HGVersion.h +++ b/modules/version/HGVersion.h @@ -12,7 +12,7 @@ HG_DECLARE_HANDLE(HGVersionMgr); typedef struct { HGBool postCrashInfo; /* 是否上报崩溃信息 */ - HGBool postUserBehavior; /* 是否上报用户行为 */ + HGBool postUserBehaviorInfo; /* 是否上报用户行为 */ HGBool postDeviceInfo; /* 是否上报设备信息 */ }HGServerConfig; @@ -44,6 +44,26 @@ HGEXPORT HGResult HGAPI HGVersion_PostCrashInfo(HGVersionMgr mgr, const HGChar* HGEXPORT HGResult HGAPI HGVersion_PostUserFeedback(HGVersionMgr mgr, const HGChar* appName, const HGChar* desc, const HGChar* feedback, const HGChar* contact); +// 设备信息 +HGEXPORT HGResult HGAPI HGVersion_PostDeviceOpenInfo(HGVersionMgr mgr, const HGChar* devName, const HGChar* devSN, + const HGChar* devType, const HGChar* devFW); +HGEXPORT HGResult HGAPI HGVersion_PostDeviceCloseInfo(HGVersionMgr mgr, const HGChar* devName, const HGChar* devSN, + const HGChar* devType, const HGChar* devFW); +HGEXPORT HGResult HGAPI HGVersion_PostDeviceScanCountInfo(HGVersionMgr mgr, const HGChar* devName, const HGChar* devSN, + const HGChar* devType, const HGChar* devFW, HGUInt scanCount); +HGEXPORT HGResult HGAPI HGVersion_PostDeviceClearRollerInfo(HGVersionMgr mgr, const HGChar* devName, const HGChar* devSN, + const HGChar* devType, const HGChar* devFW); +HGEXPORT HGResult HGAPI HGVersion_PostDeviceHistroyCountInfo(HGVersionMgr mgr, const HGChar* devName, const HGChar* devSN, + const HGChar* devType, const HGChar* devFW, HGUInt histroyCount); +HGEXPORT HGResult HGAPI HGVersion_PostDeviceRollerCountInfo(HGVersionMgr mgr, const HGChar* devName, const HGChar* devSN, + const HGChar* devType, const HGChar* devFW, HGUInt rollerCount); + +// 用户行为 +HGEXPORT HGResult HGAPI HGVersion_PostUserOpenInfo(HGVersionMgr mgr, const HGChar* appName); +HGEXPORT HGResult HGAPI HGVersion_PostUserCloseInfo(HGVersionMgr mgr, const HGChar* appName); +HGEXPORT HGResult HGAPI HGVersion_PostUserLoginInfo(HGVersionMgr mgr, const HGChar* appName); +HGEXPORT HGResult HGAPI HGVersion_PostUserLogoutInfo(HGVersionMgr mgr, const HGChar* appName); + HGEXPORT HGResult HGAPI HGVersion_GetVersionList(HGVersionMgr mgr, const HGChar* appName, HGVersionInfo **info, HGUInt *count); HGEXPORT HGResult HGAPI HGVersion_HttpDownload(HGVersionMgr mgr, const HGChar *url, const HGChar *saveFilePath, HGHttpDownloadFunc func, HGPointer param); diff --git a/modules/version/HGVersionImpl.cpp b/modules/version/HGVersionImpl.cpp index 06afbbd8..9f71461f 100644 --- a/modules/version/HGVersionImpl.cpp +++ b/modules/version/HGVersionImpl.cpp @@ -3,6 +3,7 @@ #include "../base/HGInfo.h" #include "../base/HGMd5.h" #include "../base/HGUtility.h" +#include "HGVersionMsg.h" #include #include #include @@ -42,7 +43,7 @@ static size_t write_data(void* ptr, size_t size, size_t nmemb, void* stream) static HGResult GetServerConfig(HGServerConfig& config) { config.postCrashInfo = HGFALSE; - config.postUserBehavior = HGFALSE; + config.postUserBehaviorInfo = HGFALSE; config.postDeviceInfo = HGFALSE; HGResult ret = HGBASE_ERR_FAIL; @@ -92,7 +93,7 @@ static HGResult GetServerConfig(HGServerConfig& config) while (NULL != p2) { if (0 == strcmp(p2->string, "report_switch")) - config.postUserBehavior = (HGBool)p2->valueint; + config.postUserBehaviorInfo = (HGBool)p2->valueint; else if (0 == strcmp(p2->string, "collapse_switch")) config.postCrashInfo = (HGBool)p2->valueint; else if (0 == strcmp(p2->string, "device_info_switch")) @@ -532,7 +533,6 @@ static HGResult PostInfo(int type, const std::string& appName, const std::string } std::string version = GetCurrVersion(appName); - std::string osName = GetOSName(); std::string archName = GetArchName(); std::string oemName = GetOemName(); @@ -639,6 +639,187 @@ static HGResult PostUserFeedback(const std::string& appName, const std::string& return PostInfo(4, appName, desc, "", "", feedback, contact); } +static HGResult PostDeviceInfo(const std::string& devName, const std::string& devSN, const std::string& devType, + const std::string& devFW, HGUInt start, HGUInt close, HGUInt scan, HGUInt clean, HGUInt count, HGUInt pages) +{ + HGResult ret = HGBASE_ERR_FAIL; + CURL* curl = curl_easy_init(); + if (NULL != curl) + { + std::stringstream out; + + std::string url = "http://cd.holdtecs.net:50080/api/bhs"; + curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 2); + curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); + + std::string jsonStr; + cJSON* json = cJSON_CreateObject(); + if (NULL != json) + { + cJSON_AddItemToObject(json, "name", cJSON_CreateString(devName.c_str())); + cJSON_AddItemToObject(json, "sn", cJSON_CreateString(devSN.c_str())); + cJSON_AddItemToObject(json, "type", cJSON_CreateString(devType.c_str())); + cJSON_AddItemToObject(json, "fw", cJSON_CreateString(devFW.c_str())); + + cJSON_AddItemToObject(json, "start", cJSON_CreateNumber(start)); + cJSON_AddItemToObject(json, "close", cJSON_CreateNumber(close)); + cJSON_AddItemToObject(json, "scan", cJSON_CreateNumber(scan)); + cJSON_AddItemToObject(json, "clean", cJSON_CreateNumber(clean)); + cJSON_AddItemToObject(json, "count", cJSON_CreateNumber(count)); + cJSON_AddItemToObject(json, "pages", cJSON_CreateNumber(pages)); + + jsonStr = cJSON_Print(json); + cJSON_Delete(json); + } + + struct curl_slist* headers = NULL; + headers = curl_slist_append(headers, "Content-Type:application/json;charset=UTF-8"); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); + curl_easy_setopt(curl, CURLOPT_POST, 1); + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonStr.c_str()); + + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &out); + + /* Perform the request, res will get the return code */ + CURLcode res = curl_easy_perform(curl); + /* Check for errors */ + if (res != CURLE_OK) + fprintf(stderr, "curl_easy_perform() failed: %s", curl_easy_strerror(res)); + else + { + std::string str_json = out.str(); // 返回值 + HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "str_json=%s", str_json.c_str()); + + cJSON* json = cJSON_Parse(str_json.c_str()); + if (NULL != json) + { + cJSON* p = json->child; + while (NULL != p) + { + if (0 == strcmp(p->string, "code") && p->type == cJSON_Number) + { + if (1 == p->valueint) + ret = HGBASE_ERR_OK; + } + + p = p->next; + } + + cJSON_Delete(json); + } + } + + curl_slist_free_all(headers); + /* always cleanup */ + curl_easy_cleanup(curl); + } + + return ret; +} + +static HGResult PostUserInfo(const std::string& appName, const std::string& action) +{ + HGResult ret = HGBASE_ERR_FAIL; + CURL* curl = curl_easy_init(); + if (NULL != curl) + { + std::stringstream out; + + std::string url = "http://cd.holdtecs.net:50080/api/behaviors"; + curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 2); + curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); + + std::vector macList; + GetMacAddrList(macList); + if (macList.empty()) + macList.push_back("00-00-00-00-00-00"); + + std::sort(macList.begin(), macList.end(), Greater); + std::string strMacAddrTotal; + for (int i = 0; i < (int)macList.size(); ++i) + { + strMacAddrTotal += macList[i]; + } + + HGByte md5[16] = { 0 }; + HGBase_MakeMd5((const HGByte*)strMacAddrTotal.c_str(), (HGUInt)strMacAddrTotal.size(), md5); + char md5Str[64] = { 0 }; + char* pstr = md5Str; + for (int i = 0; i < 16; ++i) + { + sprintf(pstr, "%02x", md5[i]); + pstr += 2; + } + + std::string version = GetCurrVersion(appName); + std::string osName = GetOSName(); + std::string archName = GetArchName(); + std::string oemName = GetOemName(); + + std::string jsonStr; + cJSON* json = cJSON_CreateObject(); + if (NULL != json) + { + cJSON_AddItemToObject(json, "mac", cJSON_CreateString(macList[0].c_str())); + cJSON_AddItemToObject(json, "localid", cJSON_CreateString(md5Str)); + cJSON_AddItemToObject(json, "v", cJSON_CreateString(version.c_str())); + cJSON_AddItemToObject(json, "sys", cJSON_CreateString(osName.c_str())); + cJSON_AddItemToObject(json, "cpu", cJSON_CreateString(archName.c_str())); + cJSON_AddItemToObject(json, "oem", cJSON_CreateString(oemName.c_str())); + cJSON_AddItemToObject(json, "app_name", cJSON_CreateString(appName.c_str())); + cJSON_AddItemToObject(json, "act", cJSON_CreateString(action.c_str())); + + jsonStr = cJSON_Print(json); + cJSON_Delete(json); + } + + struct curl_slist* headers = NULL; + headers = curl_slist_append(headers, "Content-Type:application/json;charset=UTF-8"); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); + curl_easy_setopt(curl, CURLOPT_POST, 1); + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonStr.c_str()); + + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &out); + + /* Perform the request, res will get the return code */ + CURLcode res = curl_easy_perform(curl); + /* Check for errors */ + if (res != CURLE_OK) + fprintf(stderr, "curl_easy_perform() failed: %s", curl_easy_strerror(res)); + else + { + std::string str_json = out.str(); // 返回值 + HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "str_json=%s", str_json.c_str()); + + cJSON* json = cJSON_Parse(str_json.c_str()); + if (NULL != json) + { + cJSON* p = json->child; + while (NULL != p) + { + if (0 == strcmp(p->string, "code") && p->type == cJSON_Number) + { + if (1 == p->valueint) + ret = HGBASE_ERR_OK; + } + + p = p->next; + } + + cJSON_Delete(json); + } + } + + curl_slist_free_all(headers); + /* always cleanup */ + curl_easy_cleanup(curl); + } + + return ret; +} + static HGResult GetVersionList(const std::string& appName, std::list &versionList) { versionList.clear(); @@ -799,16 +980,28 @@ static HGResult HttpDownload(const std::string& url, const std::string& saveFile HGVersionMgrImpl::HGVersionMgrImpl() { m_serverCfg.postCrashInfo = HGFALSE; - m_serverCfg.postUserBehavior = HGFALSE; + m_serverCfg.postUserBehaviorInfo = HGFALSE; m_serverCfg.postDeviceInfo = HGFALSE; + m_msgPump = NULL; m_thread = NULL; curl_global_init(CURL_GLOBAL_ALL); ::GetServerConfig(m_serverCfg); + if (m_serverCfg.postDeviceInfo || m_serverCfg.postUserBehaviorInfo) + { + HGBase_CreateMsgPump(&m_msgPump); + HGBase_OpenThread(ThreadFunc, this, &m_thread); + } } HGVersionMgrImpl::~HGVersionMgrImpl() { + HGBase_ExitMsgPump(m_msgPump); + HGBase_CloseThread(m_thread); + m_thread = NULL; + HGBase_DestroyMsgPump(m_msgPump); + m_msgPump = NULL; + curl_global_cleanup(); } @@ -846,6 +1039,203 @@ HGResult HGVersionMgrImpl::PostUserFeedback(const HGChar* appName, const HGChar* return ::PostUserFeedback(appName, desc, feedback, contact); } +HGResult HGVersionMgrImpl::PostDeviceOpenInfo(const HGChar* devName, const HGChar* devSN, const HGChar* devType, + const HGChar* devFW) +{ + if (!m_serverCfg.postDeviceInfo) + return HGBASE_ERR_FAIL; + + PostDeviceInfoParam* param = new PostDeviceInfoParam; + param->devName = devName; + param->devSN = devSN; + param->devType = devType; + param->devFW = devFW; + + HGMsg msg; + msg.id = MsgId_PostDeviceOpenInfo; + msg.data = param; + HGResult ret = HGBase_PostPumpMessage(m_msgPump, &msg); + if (HGBASE_ERR_OK != ret) + delete param; + return ret; +} + +HGResult HGVersionMgrImpl::PostDeviceCloseInfo(const HGChar* devName, const HGChar* devSN, const HGChar* devType, + const HGChar* devFW) +{ + if (!m_serverCfg.postDeviceInfo) + return HGBASE_ERR_FAIL; + + PostDeviceInfoParam* param = new PostDeviceInfoParam; + param->devName = devName; + param->devSN = devSN; + param->devType = devType; + param->devFW = devFW; + + HGMsg msg; + msg.id = MsgId_PostDeviceCloseInfo; + msg.data = param; + HGResult ret = HGBase_PostPumpMessage(m_msgPump, &msg); + if (HGBASE_ERR_OK != ret) + delete param; + return ret; +} + +HGResult HGVersionMgrImpl::PostDeviceScanCountInfo(const HGChar* devName, const HGChar* devSN, const HGChar* devType, + const HGChar* devFW, HGUInt scanCount) +{ + if (!m_serverCfg.postDeviceInfo) + return HGBASE_ERR_FAIL; + + PostDeviceScanCountInfoParam* param = new PostDeviceScanCountInfoParam; + param->baseInfo.devName = devName; + param->baseInfo.devSN = devSN; + param->baseInfo.devType = devType; + param->baseInfo.devFW = devFW; + param->scanCount = scanCount; + + HGMsg msg; + msg.id = MsgId_PostDeviceScanCountInfo; + msg.data = param; + HGResult ret = HGBase_PostPumpMessage(m_msgPump, &msg); + if (HGBASE_ERR_OK != ret) + delete param; + return ret; +} + +HGResult HGVersionMgrImpl::PostDeviceClearRollerInfo(const HGChar* devName, const HGChar* devSN, const HGChar* devType, + const HGChar* devFW) +{ + if (!m_serverCfg.postDeviceInfo) + return HGBASE_ERR_FAIL; + + PostDeviceInfoParam* param = new PostDeviceInfoParam; + param->devName = devName; + param->devSN = devSN; + param->devType = devType; + param->devFW = devFW; + + HGMsg msg; + msg.id = MsgId_PostDeviceClearRollerInfo; + msg.data = param; + HGResult ret = HGBase_PostPumpMessage(m_msgPump, &msg); + if (HGBASE_ERR_OK != ret) + delete param; + return ret; +} + +HGResult HGVersionMgrImpl::PostDeviceHistroyCountInfo(const HGChar* devName, const HGChar* devSN, const HGChar* devType, + const HGChar* devFW, HGUInt histroyCount) +{ + if (!m_serverCfg.postDeviceInfo) + return HGBASE_ERR_FAIL; + + PostDeviceHistroyCountInfoParam* param = new PostDeviceHistroyCountInfoParam; + param->baseInfo.devName = devName; + param->baseInfo.devSN = devSN; + param->baseInfo.devType = devType; + param->baseInfo.devFW = devFW; + param->histroyCount = histroyCount; + + HGMsg msg; + msg.id = MsgId_PostDeviceHistroyCountInfo; + msg.data = param; + HGResult ret = HGBase_PostPumpMessage(m_msgPump, &msg); + if (HGBASE_ERR_OK != ret) + delete param; + return ret; +} + +HGResult HGVersionMgrImpl::PostDeviceRollerCountInfo(const HGChar* devName, const HGChar* devSN, const HGChar* devType, + const HGChar* devFW, HGUInt rollerCount) +{ + if (!m_serverCfg.postDeviceInfo) + return HGBASE_ERR_FAIL; + + PostDeviceRollerCountInfoParam* param = new PostDeviceRollerCountInfoParam; + param->baseInfo.devName = devName; + param->baseInfo.devSN = devSN; + param->baseInfo.devType = devType; + param->baseInfo.devFW = devFW; + param->rollerCount = rollerCount; + + HGMsg msg; + msg.id = MsgId_PostDeviceRollerCountInfo; + msg.data = param; + HGResult ret = HGBase_PostPumpMessage(m_msgPump, &msg); + if (HGBASE_ERR_OK != ret) + delete param; + return ret; +} + +HGResult HGVersionMgrImpl::PostUserOpenInfo(const HGChar* appName) +{ + if (!m_serverCfg.postUserBehaviorInfo) + return HGBASE_ERR_FAIL; + + PostUserInfoParam* param = new PostUserInfoParam; + param->appName = appName; + + HGMsg msg; + msg.id = MsgId_PostUserOpenInfo; + msg.data = param; + HGResult ret = HGBase_PostPumpMessage(m_msgPump, &msg); + if (HGBASE_ERR_OK != ret) + delete param; + return ret; +} + +HGResult HGVersionMgrImpl::PostUserCloseInfo(const HGChar* appName) +{ + if (!m_serverCfg.postUserBehaviorInfo) + return HGBASE_ERR_FAIL; + + PostUserInfoParam* param = new PostUserInfoParam; + param->appName = appName; + + HGMsg msg; + msg.id = MsgId_PostUserCloseInfo; + msg.data = param; + HGResult ret = HGBase_PostPumpMessage(m_msgPump, &msg); + if (HGBASE_ERR_OK != ret) + delete param; + return ret; +} + +HGResult HGVersionMgrImpl::PostUserLoginInfo(const HGChar* appName) +{ + if (!m_serverCfg.postUserBehaviorInfo) + return HGBASE_ERR_FAIL; + + PostUserInfoParam* param = new PostUserInfoParam; + param->appName = appName; + + HGMsg msg; + msg.id = MsgId_PostUserLoginInfo; + msg.data = param; + HGResult ret = HGBase_PostPumpMessage(m_msgPump, &msg); + if (HGBASE_ERR_OK != ret) + delete param; + return ret; +} + +HGResult HGVersionMgrImpl::PostUserLogoutInfo(const HGChar* appName) +{ + if (!m_serverCfg.postUserBehaviorInfo) + return HGBASE_ERR_FAIL; + + PostUserInfoParam* param = new PostUserInfoParam; + param->appName = appName; + + HGMsg msg; + msg.id = MsgId_PostUserLogoutInfo; + msg.data = param; + HGResult ret = HGBase_PostPumpMessage(m_msgPump, &msg); + if (HGBASE_ERR_OK != ret) + delete param; + return ret; +} + HGResult HGVersionMgrImpl::GetVersionList(const HGChar* appName, HGVersionInfo** info, HGUInt* count) { if (NULL == info || NULL == count) @@ -938,4 +1328,94 @@ HGResult HGVersionMgrImpl::GetCurrVersion(const HGChar* appName, HGChar* version strcpy(version, ver.c_str()); return HGBASE_ERR_OK; +} + +void HGVersionMgrImpl::ThreadFunc(HGThread thread, HGPointer param) +{ + HGVersionMgrImpl* p = (HGVersionMgrImpl*)param; + HGBase_RunMsgPump(p->m_msgPump, MsgPumpFunc, p); +} + +void HGVersionMgrImpl::MsgPumpFunc(HGMsgPump msgPump, const HGMsg* msg, HGPointer param) +{ + (void)msgPump; + assert(NULL != msg); + HGVersionMgrImpl* p = (HGVersionMgrImpl*)param; + + switch (msg->id) + { + case MsgId_PostDeviceOpenInfo: + { + PostDeviceInfoParam* param = (PostDeviceInfoParam*)msg->data; + ::PostDeviceInfo(param->devName, param->devSN, param->devType, param->devFW, 1, 0, 0, 0, 0, 0); + delete param; + } + break; + case MsgId_PostDeviceCloseInfo: + { + PostDeviceInfoParam* param = (PostDeviceInfoParam*)msg->data; + ::PostDeviceInfo(param->devName, param->devSN, param->devType, param->devFW, 0, 1, 0, 0, 0, 0); + delete param; + } + break; + case MsgId_PostDeviceScanCountInfo: + { + PostDeviceScanCountInfoParam* param = (PostDeviceScanCountInfoParam*)msg->data; + ::PostDeviceInfo(param->baseInfo.devName, param->baseInfo.devSN, param->baseInfo.devType, + param->baseInfo.devFW, 0, 0, param->scanCount, 0, 0, 0); + delete param; + } + break; + case MsgId_PostDeviceClearRollerInfo: + { + PostDeviceInfoParam* param = (PostDeviceInfoParam*)msg->data; + ::PostDeviceInfo(param->devName, param->devSN, param->devType, param->devFW, 0, 0, 0, 1, 0, 0); + delete param; + } + break; + case MsgId_PostDeviceHistroyCountInfo: + { + PostDeviceHistroyCountInfoParam* param = (PostDeviceHistroyCountInfoParam*)msg->data; + ::PostDeviceInfo(param->baseInfo.devName, param->baseInfo.devSN, param->baseInfo.devType, + param->baseInfo.devFW, 0, 0, 0, 0, 0, param->histroyCount); + delete param; + } + break; + case MsgId_PostDeviceRollerCountInfo: + { + PostDeviceRollerCountInfoParam* param = (PostDeviceRollerCountInfoParam*)msg->data; + ::PostDeviceInfo(param->baseInfo.devName, param->baseInfo.devSN, param->baseInfo.devType, + param->baseInfo.devFW, 0, 0, 0, 0, param->rollerCount, 0); + delete param; + } + break; + case MsgId_PostUserOpenInfo: + { + PostUserInfoParam* param = (PostUserInfoParam*)msg->data; + ::PostUserInfo(param->appName, "power_on"); + delete param; + } + break; + case MsgId_PostUserCloseInfo: + { + PostUserInfoParam* param = (PostUserInfoParam*)msg->data; + ::PostUserInfo(param->appName, "power_off"); + delete param; + } + break; + case MsgId_PostUserLoginInfo: + { + PostUserInfoParam* param = (PostUserInfoParam*)msg->data; + ::PostUserInfo(param->appName, "login"); + delete param; + } + break; + case MsgId_PostUserLogoutInfo: + { + PostUserInfoParam* param = (PostUserInfoParam*)msg->data; + ::PostUserInfo(param->appName, "logout"); + delete param; + } + break; + } } \ No newline at end of file diff --git a/modules/version/HGVersionImpl.hpp b/modules/version/HGVersionImpl.hpp index e29767f7..17da5f14 100644 --- a/modules/version/HGVersionImpl.hpp +++ b/modules/version/HGVersionImpl.hpp @@ -2,6 +2,7 @@ #define __HGVERSIONIMPL_HPP__ #include "HGVersion.h" +#include "../base/HGMsgPump.h" #include "../base/HGThread.h" class HGVersionMgrImpl @@ -15,13 +16,39 @@ public: HGResult PostUninstallInfo(const HGChar* appName, const HGChar* desc); HGResult PostCrashInfo(const HGChar* appName, const HGChar* desc, const HGChar* crashFilePath, const HGChar* exceptionAddr); HGResult PostUserFeedback(const HGChar* appName, const HGChar* desc, const HGChar* feedback, const HGChar* contact); + + // 设备信息 + HGResult PostDeviceOpenInfo(const HGChar* devName, const HGChar* devSN, const HGChar* devType, + const HGChar* devFW); + HGResult PostDeviceCloseInfo(const HGChar* devName, const HGChar* devSN, const HGChar* devType, + const HGChar* devFW); + HGResult PostDeviceScanCountInfo(const HGChar* devName, const HGChar* devSN, const HGChar* devType, + const HGChar* devFW, HGUInt scanCount); + HGResult PostDeviceClearRollerInfo(const HGChar* devName, const HGChar* devSN, const HGChar* devType, + const HGChar* devFW); + HGResult PostDeviceHistroyCountInfo(const HGChar* devName, const HGChar* devSN, const HGChar* devType, + const HGChar* devFW, HGUInt histroyCount); + HGResult PostDeviceRollerCountInfo(const HGChar* devName, const HGChar* devSN, const HGChar* devType, + const HGChar* devFW, HGUInt rollerCount); + + // 用户行为 + HGResult PostUserOpenInfo(const HGChar* appName); + HGResult PostUserCloseInfo(const HGChar* appName); + HGResult PostUserLoginInfo(const HGChar* appName); + HGResult PostUserLogoutInfo(const HGChar* appName); + HGResult GetVersionList(const HGChar* appName, HGVersionInfo** info, HGUInt* count); HGResult HttpDownload(const HGChar* url, const HGChar* saveFilePath, HGHttpDownloadFunc func, HGPointer param); static HGResult ReleaseVersionList(HGVersionInfo *info, HGUInt count); static HGResult GetCurrVersion(const HGChar* appName, HGChar* version, HGUInt maxLen); +private: + static void ThreadFunc(HGThread thread, HGPointer param); + static void MsgPumpFunc(HGMsgPump msgPump, const HGMsg* msg, HGPointer param); + private: HGServerConfig m_serverCfg; + HGMsgPump m_msgPump; HGThread m_thread; }; diff --git a/modules/version/HGVersionMsg.h b/modules/version/HGVersionMsg.h new file mode 100644 index 00000000..ad16b227 --- /dev/null +++ b/modules/version/HGVersionMsg.h @@ -0,0 +1,53 @@ +#ifndef __HGVERSIONMSG_H__ +#define __HGVERSIONMSG_H__ + +#include "../base/HGDef.h" +#include + +enum +{ + MsgId_PostDeviceOpenInfo = 1, + MsgId_PostDeviceCloseInfo, + MsgId_PostDeviceScanCountInfo, + MsgId_PostDeviceClearRollerInfo, + MsgId_PostDeviceHistroyCountInfo, + MsgId_PostDeviceRollerCountInfo, + + MsgId_PostUserOpenInfo, + MsgId_PostUserCloseInfo, + MsgId_PostUserLoginInfo, + MsgId_PostUserLogoutInfo +}; + +struct PostDeviceInfoParam +{ + std::string devName; + std::string devSN; + std::string devType; + std::string devFW; +}; + +struct PostDeviceScanCountInfoParam +{ + PostDeviceInfoParam baseInfo; + HGUInt scanCount; +}; + +struct PostDeviceHistroyCountInfoParam +{ + PostDeviceInfoParam baseInfo; + HGUInt histroyCount; +}; + +struct PostDeviceRollerCountInfoParam +{ + PostDeviceInfoParam baseInfo; + HGUInt rollerCount; +}; + +struct PostUserInfoParam +{ + std::string appName; +}; + +#endif /* __HGVERSIONMSG_H__ */ \ No newline at end of file