diff --git a/app/scanner/HGVersion.cpp b/app/scanner/HGVersion.cpp index b6cbb2b8..844414e8 100644 --- a/app/scanner/HGVersion.cpp +++ b/app/scanner/HGVersion.cpp @@ -13,17 +13,6 @@ #include #endif -bool GetServerConfig(ServerConfig& cfg) -{ - return false; -} - -static int xferinfo(void* p, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow) -{ - HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "ulnow=%lld, ultotal=%lld", ulnow, ultotal); - return 0; -} - static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream) { std::string data((const char*) ptr, (size_t) size * nmemb); @@ -33,6 +22,87 @@ static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream) return size * nmemb; } +bool GetServerConfig(ServerConfig& cfg) +{ + cfg.postCrashInfo = false; + cfg.postUserBehavior = false; + cfg.postDeviceInfo = false; + + bool ret = false; + CURL* curl = curl_easy_init(); + if (nullptr != curl) + { + std::stringstream out; + + std::string url = "http://up.appqy.com/api/ver/setting"; + curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 2); + curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); + + struct curl_slist* headers = nullptr; + headers = curl_slist_append(headers, "Accept-Encoding:gzip, deflate, sdch"); + headers = curl_slist_append(headers, "Accept-Language:zh-CN,zh;q=0.8"); + headers = curl_slist_append(headers, "Connection:keep-alive"); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1); + + 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 + ret = true; + + curl_slist_free_all(headers); + + std::string str_json = out.str(); // 返回值 + printf("%s\n", str_json.c_str()); + + cJSON* json = cJSON_Parse(str_json.c_str()); + if (nullptr != json) + { + cJSON* p = json->child; + if (nullptr != p) + { + while (nullptr != p && 0 != strcmp(p->string, "data")) + p = p->next; + + if (nullptr != p && 0 == strcmp(p->string, "data") && p->type == cJSON_Object) + { + cJSON* p2 = p->child; + while (nullptr != p2) + { + if (0 == strcmp(p2->string, "report_switch")) + cfg.postUserBehavior = (bool)p2->valueint; + else if (0 == strcmp(p2->string, "collapse_switch")) + cfg.postCrashInfo = (bool)p2->valueint; + else if (0 == strcmp(p2->string, "device_info_switch")) + cfg.postDeviceInfo = (bool)p2->valueint; + + p2 = p2->next; + } + } + } + + cJSON_Delete(json); + } + + /* always cleanup */ + curl_easy_cleanup(curl); + } + + return ret; +} + +static int xferinfo(void* p, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow) +{ + HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "ulnow=%lld, ultotal=%lld", ulnow, ultotal); + return 0; +} + static bool CrashFileUpload(const std::string &filePath, std::string &crashFileUrl) { crashFileUrl.clear(); @@ -259,7 +329,8 @@ static bool Greater(const std::string &str1, const std::string &str2) return str1 > str2; } -static bool PostCrashInfo(const std::string &crashFileUrl, const std::string &exceptionAddr, const std::string &desc) +static bool PostInfo(int type, const std::string &crashFileUrl, const std::string &exceptionAddr, + const std::string &feedbackInfo, const std::string &feedbackContact, const std::string &desc) { bool ret = false; CURL* curl = curl_easy_init(); @@ -358,8 +429,17 @@ static bool PostCrashInfo(const std::string &crashFileUrl, const std::string &ex std::string source = osName + "-" + archName + "-" + oemName; char json[1024]; - sprintf(json, "{\"type\":%d, \"mac\":\"%s\", \"localid\":\"%s\", \"v\":\"%s\", \"ref\":\"%s\", \"desc\":\"%s\", \"crashaddress\":\"%s\", \"crash_data\":\"%s\"}", - 3, macList[0].c_str(), md5Str, version.c_str(), source.c_str(), desc.c_str(), exceptionAddr.c_str(), crashFileUrl.c_str()); + if (3 == type) + { + sprintf(json, "{\"type\":%d, \"mac\":\"%s\", \"localid\":\"%s\", \"v\":\"%s\", \"ref\":\"%s\", \"desc\":\"%s\", \"crashaddress\":\"%s\", \"crash_data\":\"%s\"}", + type, macList[0].c_str(), md5Str, version.c_str(), source.c_str(), desc.c_str(), exceptionAddr.c_str(), crashFileUrl.c_str()); + } + else + { + assert(4 == type); + sprintf(json, "{\"type\":%d, \"mac\":\"%s\", \"localid\":\"%s\", \"v\":\"%s\", \"ref\":\"%s\", \"desc\":\"%s\", \"content\":\"%s\", \"contact\":\"%s\"}", + type, macList[0].c_str(), md5Str, version.c_str(), source.c_str(), desc.c_str(), feedbackInfo.c_str(), feedbackContact.c_str()); + } struct curl_slist* headers = nullptr; headers = curl_slist_append(headers, "Content-Type:application/json;charset=UTF-8"); @@ -396,15 +476,15 @@ bool PostCrashInfo(const std::string& crashFilePath, const std::string& exceptio bool ret = CrashFileUpload(crashFilePath, crashFileUrl); if (ret) { - ret = PostCrashInfo(crashFileUrl, exceptionAddr, "collapse"); + ret = PostInfo(3, crashFileUrl, exceptionAddr, "", "", "collapse"); } return ret; } -bool PostUserHabits(const std::list& habits) +bool PostUserFeedback(const std::string &info, const std::string &contact) { - return false; + return PostInfo(4, "", "", info, contact, "feedback"); } std::string GetCurrVersion() @@ -544,7 +624,7 @@ bool GetVersionInfoList(std::list& versionList) oemName = "Huago"; #endif - std::string url = "http://up.appqy.com/api/ver?oem=" + oemName + "&cpu=" + archName + "&sys=" + osName; + std::string url = "http://up.appqy.com/api/ver?app=Scanner&oem=" + oemName + "&cpu=" + archName + "&sys=" + osName; curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 2); curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); diff --git a/app/scanner/HGVersion.h b/app/scanner/HGVersion.h index fdcb389e..ff0ac719 100644 --- a/app/scanner/HGVersion.h +++ b/app/scanner/HGVersion.h @@ -8,8 +8,10 @@ struct ServerConfig { // 是否上传崩溃日志 bool postCrashInfo; - // 是否上传用户使用习惯 - bool postUserHabits; + // 是否上传用户行为 + bool postUserBehavior; + // 是否上传设备信息 + bool postDeviceInfo; }; struct VersionInfo @@ -38,8 +40,23 @@ bool GetServerConfig(ServerConfig &cfg); // 上传崩溃日志 bool PostCrashInfo(const std::string& crashFilePath, const std::string& exceptionAddr); -// 上传用户使用习惯 -bool PostUserHabits(const std::list& habits); +// 上传用户行为 +bool PostOpenApp(); +bool PostCloseApp(); +bool PostLogin(); +bool PostLogout(); + +// 上传设备信息 +bool PostDeviceInfo(const std::string &type, const std::string &name, const std::string &fw, const std::string &sn); +bool PostOpenDevice(const std::string &sn); +bool PostCloseDevice(const std::string &sn); +bool PostScanCount(const std::string &sn, int count); +bool PostClearRollerCount(const std::string &sn); +bool PostRollerCount(const std::string &sn, int count); +bool PostHistoryCount(const std::string &sn, int count); + +// 上传用户反馈 +bool PostUserFeedback(const std::string &info, const std::string &contact); // 获取当前版本号 std::string GetCurrVersion(); diff --git a/app/scanner/main.cpp b/app/scanner/main.cpp index c2c0fae5..1b93d7e0 100644 --- a/app/scanner/main.cpp +++ b/app/scanner/main.cpp @@ -12,6 +12,8 @@ #include #endif +ServerConfig g_serverCfg; + #if defined(HG_CMP_MSC) static LONG WINAPI UnhandledExceptionFilterEx(struct _EXCEPTION_POINTERS *ExceptionInfo) { @@ -51,9 +53,14 @@ int main(int argc, char *argv[]) curl_global_init(CURL_GLOBAL_ALL); + GetServerConfig(g_serverCfg); + + if (g_serverCfg.postCrashInfo) + { #if defined(HG_CMP_MSC) - SetUnhandledExceptionFilter(UnhandledExceptionFilterEx); + SetUnhandledExceptionFilter(UnhandledExceptionFilterEx); #endif + } QTranslator translator_qt_; if (translator_qt_.load(":translation/qt_zh_CN.qm"))