From e705ba136a5131d8e71f2e88fbcf49329f907b56 Mon Sep 17 00:00:00 2001 From: luoliangyi <87842688@qq.com> Date: Wed, 16 Oct 2024 09:11:27 +0800 Subject: [PATCH] =?UTF-8?q?webscan=E9=A1=B9=E7=9B=AE=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E7=AB=8B=E6=80=9D=E8=BE=B0=E6=96=B0webapi=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sdk/webscan/WebServer.cpp | 30 ++- sdk/webscan/WebServer.h | 4 +- sdk/webscan/WebUser.cpp | 543 ++++++++++++++++++++++++++++++++------ sdk/webscan/WebUser.h | 9 +- sdk/webscan/main.cpp | 15 +- 5 files changed, 512 insertions(+), 89 deletions(-) diff --git a/sdk/webscan/WebServer.cpp b/sdk/webscan/WebServer.cpp index a77c0db1..b731eb90 100644 --- a/sdk/webscan/WebServer.cpp +++ b/sdk/webscan/WebServer.cpp @@ -4,8 +4,9 @@ WebServer::WebServer(HGMsgPump msgPump) { m_msgPump = msgPump; - m_currUserId = 1; + + m_port = 0; #if defined(HG_CMP_MSC) m_sockServer = INVALID_SOCKET; #else @@ -75,6 +76,7 @@ bool WebServer::Open(HGUShort port) return false; } + m_port = port; m_sockServer = sockServer; HGBase_OpenThread(ThreadFunc, this, &m_listenThread); assert(NULL != m_listenThread); @@ -92,6 +94,17 @@ bool WebServer::Close() return false; } +#if defined(HG_CMP_MSC) + closesocket(m_sockServer); + m_sockServer = INVALID_SOCKET; +#else + close(m_sockServer); + m_sockServer = -1; +#endif + m_port = 0; + HGBase_CloseThread(m_listenThread); + m_listenThread = NULL; + while (!m_vectorUser.empty()) { WebUser* pUser = m_vectorUser[0]; @@ -100,18 +113,14 @@ bool WebServer::Close() pUser = NULL; } -#if defined(HG_CMP_MSC) - closesocket(m_sockServer); - m_sockServer = INVALID_SOCKET; -#else - close(m_sockServer); - m_sockServer = -1; -#endif - HGBase_CloseThread(m_listenThread); - m_listenThread = NULL; return true; } +bool WebServer::IsOld() +{ + return (9458 == m_port); +} + void WebServer::Connect(const ConnectParam* param) { assert(NULL != param && this == param->svr); @@ -232,6 +241,7 @@ int WebServer::GetUserIndex(HGUInt id) void HGAPI WebServer::ThreadFunc(HGThread thread, HGPointer param) { + (void)thread; WebServer* p = (WebServer*)param; while (1) diff --git a/sdk/webscan/WebServer.h b/sdk/webscan/WebServer.h index a0f7676c..d8631ffb 100644 --- a/sdk/webscan/WebServer.h +++ b/sdk/webscan/WebServer.h @@ -15,6 +15,7 @@ public: bool Open(HGUShort port); bool Close(); + bool IsOld(); void Connect(const ConnectParam* param); void DisConnect(const DisConnectParam* param); @@ -34,8 +35,9 @@ private: private: HGMsgPump m_msgPump; - HGUInt m_currUserId; + + HGUShort m_port; #if defined(HG_CMP_MSC) SOCKET m_sockServer; #else diff --git a/sdk/webscan/WebUser.cpp b/sdk/webscan/WebUser.cpp index e9a26c79..76d0f372 100644 --- a/sdk/webscan/WebUser.cpp +++ b/sdk/webscan/WebUser.cpp @@ -211,7 +211,6 @@ WebUser::WebUser(WebServer* server, HGUInt id, HGMsgPump msgPump, const std::str m_devNameList.clear(); m_devName.clear(); m_devHandle = NULL; - m_dpi = 0; m_scanEvent = NULL; SANE_Int version_code = 0; @@ -232,7 +231,6 @@ WebUser::~WebUser() if (NULL != m_devHandle) { - m_dpi = 0; sane_close(m_devHandle); m_devHandle = NULL; m_devName.clear(); @@ -284,7 +282,6 @@ void WebUser::CloseDev(const CloseDevParam* param) if (NULL != m_devHandle) { - m_dpi = 0; sane_close(m_devHandle); m_devHandle = NULL; m_devName.clear(); @@ -310,11 +307,17 @@ void WebUser::ScanFinish(const ScanFinishParam* param) void WebUser::HandleCmd(const WSCmdParam* param) { assert(NULL != param && m_id == param->usrId); - std::string cmdData((const char*)param->data, param->size); - cJSON* json = cJSON_Parse(cmdData.c_str()); - if (NULL != json) + + if (m_server->IsOld()) { + // OLD + cJSON* json = cJSON_Parse(cmdData.c_str()); + if (NULL == json) + { + return; + } + std::string func = GetJsonStringValue(json, "Func"); if ("GetDeviceList" == func) { @@ -347,6 +350,26 @@ void WebUser::HandleCmd(const WSCmdParam* param) cJSON_Delete(json); } + else + { + // NEW + if (cmdData == "CDEV") + { + GetDeviceListNew(); + } + else if (cmdData == "CDEVPLUG") + { + DeviceListPlugNew(); + } + else if (cmdData.find("COPT|") == 0) + { + GetSettingInfoNew(cmdData.substr(5)); + } + else if (cmdData.find("CBASE64|") == 0) + { + ConvertToBase64New(cmdData.substr(8)); + } + } } void WebUser::HandleEvent(const WSEvtParam* param) @@ -423,7 +446,6 @@ void WebUser::SelectDevice(cJSON* json) if (NULL != m_devHandle) { - m_dpi = 0; sane_close(m_devHandle); m_devHandle = NULL; m_devName.clear(); @@ -435,7 +457,6 @@ void WebUser::SelectDevice(cJSON* json) { m_devName = m_devNameList[index]; m_devHandle = dev; - m_dpi = GetDpi(); code = 0; result.clear(); } @@ -520,7 +541,6 @@ void WebUser::SetDPI(cJSON* json) { if (SetParam(OPTION_TITLE_FBL, &dpi)) { - m_dpi = dpi; code = 0; result.clear(); } @@ -681,6 +701,374 @@ void WebUser::StartScan(cJSON* json) } } +void WebUser::GetDeviceListNew() +{ + cJSON* retJson = cJSON_CreateObject(); + if (NULL != retJson) + { + cJSON_AddItemToObject(retJson, "Cmd", cJSON_CreateString("SDEV")); + cJSON_AddItemToObject(retJson, "Code", cJSON_CreateNumber(2005)); + + std::string dataStr; + + cJSON* arrayJson = cJSON_CreateArray(); + HGBase_EnterLock(m_lockName); + for (int i = 0; i < (int)m_devNameList.size(); ++i) + { + cJSON* js = cJSON_CreateObject(); + cJSON_AddItemToObject(js, "Index", cJSON_CreateNumber(i)); + cJSON_AddItemToObject(js, "Name", cJSON_CreateString(m_devNameList[i].c_str())); + cJSON_AddItemToArray(arrayJson, js); + } + HGBase_LeaveLock(m_lockName); + + cJSON* dataJson = cJSON_CreateObject(); + cJSON_AddItemToObject(dataJson, "Devs", arrayJson); + + char* str = cJSON_Print(dataJson); + if (NULL != str) + { + dataStr = GetBase64((HGByte*)str, strlen(str)); + free(str); + } + + cJSON_AddItemToObject(retJson, "Data", cJSON_CreateString(dataStr.c_str())); + cJSON_AddItemToObject(retJson, "DataType", cJSON_CreateString("json")); + cJSON_AddItemToObject(retJson, "Msg", cJSON_CreateString("Success")); + + char* resp = cJSON_Print(retJson); + if (NULL != resp) + { + SendResponse((const HGByte*)resp, (HGUInt)strlen(resp), HGTRUE); + free(resp); + } + + cJSON_Delete(retJson); + } +} + +void WebUser::DeviceListPlugNew() +{ + cJSON* retJson = cJSON_CreateObject(); + if (NULL != retJson) + { + cJSON_AddItemToObject(retJson, "Cmd", cJSON_CreateString("SDEVPLUG")); + cJSON_AddItemToObject(retJson, "Code", cJSON_CreateNumber(2005)); + + std::string dataStr; + + cJSON* arrayJson = cJSON_CreateArray(); + HGBase_EnterLock(m_lockName); + for (int i = 0; i < (int)m_devNameList.size(); ++i) + { + cJSON* js = cJSON_CreateObject(); + cJSON_AddItemToObject(js, "Index", cJSON_CreateNumber(i)); + cJSON_AddItemToObject(js, "Name", cJSON_CreateString(m_devNameList[i].c_str())); + cJSON_AddItemToArray(arrayJson, js); + } + HGBase_LeaveLock(m_lockName); + + cJSON* dataJson = cJSON_CreateObject(); + cJSON_AddItemToObject(dataJson, "Devs", arrayJson); + + char* str = cJSON_Print(dataJson); + if (NULL != str) + { + dataStr = GetBase64((HGByte*)str, strlen(str)); + free(str); + } + + cJSON_AddItemToObject(retJson, "Data", cJSON_CreateString(dataStr.c_str())); + cJSON_AddItemToObject(retJson, "DataType", cJSON_CreateString("json")); + cJSON_AddItemToObject(retJson, "Msg", cJSON_CreateString("Success")); + + char* resp = cJSON_Print(retJson); + if (NULL != resp) + { + SendResponse((const HGByte*)resp, (HGUInt)strlen(resp), HGTRUE); + free(resp); + } + + cJSON_Delete(retJson); + } +} + +void WebUser::GetSettingInfoNew(const std::string& devName) +{ + if (NULL != m_scanEvent) + { + assert(NULL != m_devHandle); + sane_cancel(m_devHandle); + + HGBase_WaitEvent(m_scanEvent); + HGBase_DestroyEvent(m_scanEvent); + m_scanEvent = NULL; + } + + if (NULL != m_devHandle) + { + if (m_devName != devName) + { + sane_close(m_devHandle); + m_devHandle = NULL; + m_devName.clear(); + } + } + + if (NULL == m_devHandle) + { + SANE_Handle dev = NULL; + SANE_Status status = sane_open(devName.c_str(), &dev); + if (SANE_STATUS_GOOD == status) + { + m_devName = devName; + m_devHandle = dev; + } + } + + if (NULL != m_devHandle) + { + cJSON* retJson = cJSON_CreateObject(); + if (NULL != retJson) + { + cJSON_AddItemToObject(retJson, "Cmd", cJSON_CreateString("SOPT")); + cJSON_AddItemToObject(retJson, "Code", cJSON_CreateNumber(2006)); + + std::string optStr; + std::string optListStr; + + cJSON* optJson = cJSON_CreateObject(); + if (NULL != optJson) + { + cJSON* optListJson = cJSON_CreateObject(); + if (NULL != optListJson) + { + cJSON* arrayJson = cJSON_CreateArray(); + + SANE_Int num_dev_options = 0; + sane_control_option(m_devHandle, 0, SANE_ACTION_GET_VALUE, &num_dev_options, NULL); + for (int i = 1; i < num_dev_options; ++i) + { + const SANE_Option_Descriptor* desp = sane_get_option_descriptor(m_devHandle, i); + if (NULL == desp) + continue; + + const char* name = desp->title; + while (' ' == *name) + ++name; + + if (SANE_TYPE_STRING == desp->type) + { + char value[256] = { 0 }; + sane_control_option(m_devHandle, i, SANE_ACTION_GET_VALUE, value, NULL); + cJSON_AddItemToObject(optJson, name, cJSON_CreateString(value)); + + cJSON* objJson = cJSON_CreateObject(); + cJSON_AddItemToObject(objJson, "constType", cJSON_CreateNumber(3)); + cJSON_AddItemToObject(objJson, "current", cJSON_CreateString(value)); + cJSON_AddItemToObject(objJson, "isActive", cJSON_CreateTrue()); + cJSON_AddItemToObject(objJson, "isSettable", cJSON_CreateTrue()); + + if (SANE_CONSTRAINT_STRING_LIST == desp->constraint_type) + { + cJSON* arrayJson2 = cJSON_CreateArray(); + const SANE_String_Const* p = desp->constraint.string_list; + while (NULL != *p) + { + cJSON_AddItemToArray(arrayJson2, cJSON_CreateString(*p)); + ++p; + } + + cJSON_AddItemToObject(objJson, "list", arrayJson2); + } + + cJSON_AddItemToObject(objJson, "name", cJSON_CreateString(name)); + cJSON_AddItemToObject(objJson, "type", cJSON_CreateNumber(3)); + cJSON_AddItemToObject(objJson, "unit", cJSON_CreateString("")); + + cJSON_AddItemToArray(arrayJson, objJson); + } + else if (SANE_TYPE_INT == desp->type) + { + SANE_Int value = 0; + sane_control_option(m_devHandle, i, SANE_ACTION_GET_VALUE, &value, NULL); + cJSON_AddItemToObject(optJson, name, cJSON_CreateNumber(value)); + + cJSON* objJson = cJSON_CreateObject(); + cJSON_AddItemToObject(objJson, "constType", cJSON_CreateNumber(1)); + cJSON_AddItemToObject(objJson, "current", cJSON_CreateNumber(value)); + cJSON_AddItemToObject(objJson, "isActive", cJSON_CreateTrue()); + cJSON_AddItemToObject(objJson, "isSettable", cJSON_CreateTrue()); + + if (SANE_CONSTRAINT_WORD_LIST == desp->constraint_type) + { + cJSON* arrayJson2 = cJSON_CreateArray(); + const SANE_Word* p = desp->constraint.word_list; + for (SANE_Int i = 0; i < p[0]; ++i) + { + cJSON_AddItemToArray(arrayJson2, cJSON_CreateNumber(p[i + 1])); + } + + cJSON_AddItemToObject(objJson, "list", arrayJson2); + } + else if (SANE_CONSTRAINT_RANGE == desp->constraint_type) + { + // desp->constraint.range->min; + // desp->constraint.range->max; + } + + cJSON_AddItemToObject(objJson, "name", cJSON_CreateString(name)); + cJSON_AddItemToObject(objJson, "type", cJSON_CreateNumber(1)); + cJSON_AddItemToObject(objJson, "unit", cJSON_CreateString("")); + + cJSON_AddItemToArray(arrayJson, objJson); + } + else if (SANE_TYPE_FIXED == desp->type) + { + SANE_Word value = 0; + sane_control_option(m_devHandle, i, SANE_ACTION_GET_VALUE, &value, NULL); + cJSON_AddItemToObject(optJson, name, cJSON_CreateNumber(SANE_UNFIX(value))); + + cJSON* objJson = cJSON_CreateObject(); + cJSON_AddItemToObject(objJson, "constType", cJSON_CreateNumber(2)); + cJSON_AddItemToObject(objJson, "current", cJSON_CreateNumber(SANE_UNFIX(value))); + cJSON_AddItemToObject(objJson, "isActive", cJSON_CreateTrue()); + cJSON_AddItemToObject(objJson, "isSettable", cJSON_CreateTrue()); + + if (SANE_CONSTRAINT_WORD_LIST == desp->constraint_type) + { + cJSON* arrayJson2 = cJSON_CreateArray(); + const SANE_Word* p = desp->constraint.word_list; + for (SANE_Int i = 0; i < p[0]; ++i) + { + cJSON_AddItemToArray(arrayJson2, cJSON_CreateNumber(SANE_UNFIX(p[i + 1]))); + } + + cJSON_AddItemToObject(objJson, "list", arrayJson2); + } + else if (SANE_CONSTRAINT_RANGE == desp->constraint_type) + { + // SANE_UNFIX(desp->constraint.range->min); + // SANE_UNFIX(desp->constraint.range->max); + } + + cJSON_AddItemToObject(objJson, "name", cJSON_CreateString(name)); + cJSON_AddItemToObject(objJson, "type", cJSON_CreateNumber(2)); + cJSON_AddItemToObject(objJson, "unit", cJSON_CreateString("")); + + cJSON_AddItemToArray(arrayJson, objJson); + } + else if (SANE_TYPE_BOOL == desp->type) + { + SANE_Bool value = 0; + sane_control_option(m_devHandle, i, SANE_ACTION_GET_VALUE, &value, NULL); + cJSON_AddItemToObject(optJson, name, value ? cJSON_CreateTrue() : cJSON_CreateFalse()); + + cJSON* objJson = cJSON_CreateObject(); + cJSON_AddItemToObject(objJson, "constType", cJSON_CreateNumber(0)); + cJSON_AddItemToObject(objJson, "current", value ? cJSON_CreateTrue() : cJSON_CreateFalse()); + cJSON_AddItemToObject(objJson, "isActive", cJSON_CreateTrue()); + cJSON_AddItemToObject(objJson, "isSettable", cJSON_CreateTrue()); + + cJSON_AddItemToObject(objJson, "name", cJSON_CreateString(name)); + cJSON_AddItemToObject(objJson, "type", cJSON_CreateNumber(0)); + cJSON_AddItemToObject(objJson, "unit", cJSON_CreateString("")); + + cJSON_AddItemToArray(arrayJson, objJson); + } + } + + cJSON_AddItemToObject(optListJson, "Options", arrayJson); + + char* str = cJSON_Print(optListJson); + if (NULL != str) + { + optListStr = GetBase64((HGByte*)str, strlen(str)); + free(str); + } + + cJSON_Delete(optListJson); + } + + char* str = cJSON_Print(optJson); + if (NULL != str) + { + optStr = GetBase64((HGByte*)str, strlen(str)); + free(str); + } + + cJSON_Delete(optJson); + } + + std::string dataStr = optStr + "|" + optListStr; + cJSON_AddItemToObject(retJson, "Data", cJSON_CreateString(dataStr.c_str())); + cJSON_AddItemToObject(retJson, "DataType", cJSON_CreateString("json")); + cJSON_AddItemToObject(retJson, "Msg", cJSON_CreateString("Success")); + + char* resp = cJSON_Print(retJson); + if (NULL != resp) + { + SendResponse((const HGByte*)resp, (HGUInt)strlen(resp), HGTRUE); + free(resp); + } + + cJSON_Delete(retJson); + } + } +} + +void WebUser::ConvertToBase64New(const std::string& filePath) +{ + cJSON* retJson = cJSON_CreateObject(); + if (NULL != retJson) + { + cJSON_AddItemToObject(retJson, "Cmd", cJSON_CreateString("SBASE64")); + cJSON_AddItemToObject(retJson, "Code", cJSON_CreateNumber(2007)); + + std::string dataStr; + FILE* file = fopen(filePath.c_str(), "rb"); + if (NULL != file) + { + fseek(file, 0, SEEK_END); + long size = ftell(file); + fseek(file, 0, SEEK_SET); + + if (size > 0) + { + HGByte* data = new HGByte[size]; + long readLen = (long)fread(data, 1, size, file); + if (readLen == size) + { + HGSize base64Size = 0; + HGBase_Base64Encode(data, size, NULL, &base64Size); + uint8_t* base64Data = new uint8_t[base64Size + 1]; + HGBase_Base64Encode(data, size, base64Data, &base64Size); + base64Data[base64Size] = 0; + dataStr = (const char*)base64Data; + delete[] base64Data; + } + + delete[] data; + } + + fclose(file); + } + + cJSON_AddItemToObject(retJson, "Data", cJSON_CreateString(dataStr.c_str())); + cJSON_AddItemToObject(retJson, "DataType", cJSON_CreateString("base64")); + cJSON_AddItemToObject(retJson, "Msg", cJSON_CreateString("Success")); + + char* resp = cJSON_Print(retJson); + if (NULL != resp) + { + SendResponse((const HGByte*)resp, (HGUInt)strlen(resp), HGTRUE); + free(resp); + } + + cJSON_Delete(retJson); + } +} + void WebUser::PostDisConnectMsg() { DisConnectParam* param = new DisConnectParam; @@ -738,6 +1126,7 @@ void WebUser::PostEventMsg(const HGByte* data, HGUInt dataSize) void HGAPI WebUser::ThreadFunc(HGThread thread, HGPointer param) { + (void)thread; WebUser* p = (WebUser*)param; char chBuffer[2048]; @@ -1042,6 +1431,12 @@ int WebUser::sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned i HGBase_EnterLock(p->m_lockName); p->m_devNameList.push_back(sane_dev->name); HGBase_LeaveLock(p->m_lockName); + + if (!p->m_server->IsOld()) + { + std::string cmd = "CDEVPLUG"; + p->PostCmdMsg((const HGByte*)cmd.c_str(), (HGUInt)cmd.size()); + } } break; case SANE_EVENT_DEVICE_LEFT: @@ -1061,16 +1456,24 @@ int WebUser::sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned i delete closeDevParam; } + bool b = false; HGBase_EnterLock(p->m_lockName); for (int i = 0; i < (int)p->m_devNameList.size(); ++i) { if (0 == strcmp(sane_dev->name, p->m_devNameList[i].c_str())) { p->m_devNameList.erase(p->m_devNameList.begin() + i); + b = true; break; } } HGBase_LeaveLock(p->m_lockName); + + if (b && !p->m_server->IsOld()) + { + std::string cmd = "CDEVPLUG"; + p->PostCmdMsg((const HGByte*)cmd.c_str(), (HGUInt)cmd.size()); + } } break; case SANE_EVENT_WORKING: @@ -1094,26 +1497,29 @@ int WebUser::sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned i delete scanFinishParam; } - int code = 0; - std::string result = ""; - - cJSON* retJson = cJSON_CreateObject(); - if (NULL != retJson) + if (p->m_server->IsOld()) { - cJSON_AddItemToObject(retJson, "Func", cJSON_CreateString("ScanComplete")); - char str[10] = { 0 }; - sprintf(str, "%d", code); - cJSON_AddItemToObject(retJson, "code", cJSON_CreateString(str)); - cJSON_AddItemToObject(retJson, "result", cJSON_CreateString(StdStringToUtf8(result).c_str())); + int code = 0; + std::string result = ""; - char* resp = cJSON_Print(retJson); - if (NULL != resp) + cJSON* retJson = cJSON_CreateObject(); + if (NULL != retJson) { - p->PostEventMsg((const HGByte*)resp, (HGUInt)strlen(resp)); - free(resp); - } + cJSON_AddItemToObject(retJson, "Func", cJSON_CreateString("ScanComplete")); + char str[10] = { 0 }; + sprintf(str, "%d", code); + cJSON_AddItemToObject(retJson, "code", cJSON_CreateString(str)); + cJSON_AddItemToObject(retJson, "result", cJSON_CreateString(StdStringToUtf8(result).c_str())); - cJSON_Delete(retJson); + char* resp = cJSON_Print(retJson); + if (NULL != resp) + { + p->PostEventMsg((const HGByte*)resp, (HGUInt)strlen(resp)); + free(resp); + } + + cJSON_Delete(retJson); + } } } break; @@ -1150,28 +1556,31 @@ int WebUser::sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned i HGBase_CreateImageFromData(data, &imgInfo, NULL, 0, HGBASE_IMGORIGIN_TOP, &img); if (NULL != img) { - HGBase_SetImageDpi(img, p->m_dpi, p->m_dpi); + HGBase_SetImageDpi(img, sane_img->flag.dpi, sane_img->flag.dpi); - int code = 0; - std::string result = p->GetBase64(img); - - cJSON* retJson = cJSON_CreateObject(); - if (NULL != retJson) + if (p->m_server->IsOld()) { - cJSON_AddItemToObject(retJson, "Func", cJSON_CreateString("ImageSaveDone")); - char str[10] = { 0 }; - sprintf(str, "%d", code); - cJSON_AddItemToObject(retJson, "code", cJSON_CreateString(str)); - cJSON_AddItemToObject(retJson, "result", cJSON_CreateString(StdStringToUtf8(result).c_str())); + int code = 0; + std::string result = p->GetBase64(img); - char* resp = cJSON_Print(retJson); - if (NULL != resp) + cJSON* retJson = cJSON_CreateObject(); + if (NULL != retJson) { - p->PostEventMsg((const HGByte*)resp, (HGUInt)strlen(resp)); - free(resp); - } + cJSON_AddItemToObject(retJson, "Func", cJSON_CreateString("ImageSaveDone")); + char str[10] = { 0 }; + sprintf(str, "%d", code); + cJSON_AddItemToObject(retJson, "code", cJSON_CreateString(str)); + cJSON_AddItemToObject(retJson, "result", cJSON_CreateString(StdStringToUtf8(result).c_str())); - cJSON_Delete(retJson); + char* resp = cJSON_Print(retJson); + if (NULL != resp) + { + p->PostEventMsg((const HGByte*)resp, (HGUInt)strlen(resp)); + free(resp); + } + + cJSON_Delete(retJson); + } } HGBase_DestroyImage(img); @@ -1221,6 +1630,23 @@ std::string WebUser::GetBase64(HGImage image) return ret; } +std::string WebUser::GetBase64(const HGByte* data, HGUInt size) +{ + std::string ret; + if (NULL != data && 0 != size) + { + HGSize base64Size = 0; + HGBase_Base64Encode(data, size, NULL, &base64Size); + HGByte* base64 = new HGByte[base64Size + 1]; + HGBase_Base64Encode(data, size, base64, &base64Size); + base64[base64Size] = 0; + ret = (const char*)base64; + delete[] base64; + } + + return ret; +} + HGBool WebUser::SetParam(const char* optionName, const HGVoid* data) { assert(NULL != m_devHandle); @@ -1277,39 +1703,6 @@ HGBool WebUser::SetParam(const char* optionName, const HGVoid* data) return ret; } -HGInt WebUser::GetDpi() -{ - assert(NULL != m_devHandle); - HGInt dpi = 0; - - SANE_Int num_dev_options = 0; - sane_control_option(m_devHandle, 0, SANE_ACTION_GET_VALUE, &num_dev_options, NULL); - for (int i = 1; i < num_dev_options; ++i) - { - const SANE_Option_Descriptor* desp = sane_get_option_descriptor(m_devHandle, i); - if (NULL == desp) - continue; - - const char* name = desp->title; - while (' ' == *name) - ++name; - - if (0 == strcmp(OPTION_TITLE_FBL, name)) - { - if (SANE_TYPE_INT == desp->type) - { - SANE_Int value = 0; - sane_control_option(m_devHandle, i, SANE_ACTION_GET_VALUE, &value, NULL); - dpi = value; - } - - break; - } - } - - return dpi; -} - bool WebUser::ShakeHand(const std::string& head) { std::string requestMethod; diff --git a/sdk/webscan/WebUser.h b/sdk/webscan/WebUser.h index cec7f42b..9e01da47 100644 --- a/sdk/webscan/WebUser.h +++ b/sdk/webscan/WebUser.h @@ -32,6 +32,7 @@ public: void HandleEvent(const WSEvtParam* param); private: + // OLD void GetDeviceList(cJSON *json); void SelectDevice(cJSON* json); void SetScanColorType(cJSON* json); @@ -39,6 +40,11 @@ private: void SetDuplex(cJSON* json); void SetScanJPGQuality(cJSON* json); void StartScan(cJSON* json); + //NEW + void GetDeviceListNew(); + void DeviceListPlugNew(); + void GetSettingInfoNew(const std::string &devName); + void ConvertToBase64New(const std::string& filePath); private: void PostDisConnectMsg(); @@ -47,8 +53,8 @@ private: static void HGAPI ThreadFunc(HGThread thread, HGPointer param); static int sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned int* len, void* param); std::string GetBase64(HGImage image); + std::string GetBase64(const HGByte* data, HGUInt size); HGBool SetParam(const char* optionName, const HGVoid* data); - HGInt GetDpi(); bool ShakeHand(const std::string& head); void Pong(); @@ -73,6 +79,5 @@ private: std::vector m_devNameList; std::string m_devName; SANE_Handle m_devHandle; - int m_dpi; HGEvent m_scanEvent; }; diff --git a/sdk/webscan/main.cpp b/sdk/webscan/main.cpp index 6875e2b5..1162fe3d 100644 --- a/sdk/webscan/main.cpp +++ b/sdk/webscan/main.cpp @@ -2,17 +2,27 @@ #include "base/HGInc.h" #include "base/HGThread.h" #include "base/HGMsgPump.h" +#include "base/HGUtility.h" +#include "base/HGIni.h" #include "WebServer.h" #include "MsgPumpCallback.h" +#include "lang/app_language.h" static void HGAPI ThreadFunc(HGThread thread, HGPointer param) { (void)thread; HGMsgPump msgPump = (HGMsgPump)param; + HGChar cfgPath[256]; + HGBase_GetConfigPath(cfgPath, 256); + HGChar cfgName[256]; + sprintf(cfgName, "%s%s", cfgPath, "config.ini"); + WebServer wsServer(msgPump); - HGInt port = 9458; + //HGInt port = 9458; + HGInt port = 23165; + HGBase_GetProfileInt(cfgName, "connect", "port", 23165, &port); if (wsServer.Open(port)) { HGBase_RunMsgPump(msgPump, HGMsgPumpCallback, NULL); @@ -32,6 +42,9 @@ int main() assert(0 == ret); #endif + lang_initialize(nullptr); + lang_set_code_page(20127); + HGMsgPump msgPump = NULL; HGBase_CreateMsgPump(&msgPump);