From 77b5b76c858bcad988ad4a5a3c7961881ab40b4b Mon Sep 17 00:00:00 2001
From: luoliangyi <87842688@qq.com>
Date: Wed, 16 Oct 2024 16:49:36 +0800
Subject: [PATCH] =?UTF-8?q?1=EF=BC=89=E5=A2=9E=E5=8A=A0=E7=AB=8B=E6=80=9D?=
=?UTF-8?q?=E8=BE=B0webapi-demo=202=EF=BC=89=E7=AB=8B=E6=80=9D=E8=BE=B0web?=
=?UTF-8?q?scan=E5=A2=9E=E5=8A=A0=E6=89=AB=E6=8F=8F=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sdk/webscan/WebUser.cpp | 731 ++++++++++++------
sdk/webscan/WebUser.h | 21 +-
sdk/webscan/main.cpp | 3 -
test/webscan-new/placeholder.png | Bin 0 -> 3802 bytes
test/webscan-new/psl.sane.webapi.min 2.1.0.js | 703 +++++++++++++++++
test/webscan-new/web-api.html | 201 +++++
6 files changed, 1433 insertions(+), 226 deletions(-)
create mode 100644 test/webscan-new/placeholder.png
create mode 100644 test/webscan-new/psl.sane.webapi.min 2.1.0.js
create mode 100644 test/webscan-new/web-api.html
diff --git a/sdk/webscan/WebUser.cpp b/sdk/webscan/WebUser.cpp
index 76d0f372..3df31de1 100644
--- a/sdk/webscan/WebUser.cpp
+++ b/sdk/webscan/WebUser.cpp
@@ -1,7 +1,9 @@
#include "WebUser.h"
#include "WebServer.h"
#include "base/HGBase64.h"
+#include "base/HGUtility.h"
#include "base/HGImage.h"
+#include "base/HGTime.h"
#include "imgfmt/HGJpeg.h"
#include "sha1.h"
#include "base64.h"
@@ -213,6 +215,21 @@ WebUser::WebUser(WebServer* server, HGUInt id, HGMsgPump msgPump, const std::str
m_devHandle = NULL;
m_scanEvent = NULL;
+ HGChar defSavePath[256];
+ HGBase_GetCacheFilePath(defSavePath, 256);
+ m_filepath = defSavePath;
+ m_fileprefix = "img";
+ m_deletefilesbeforescan = "0";
+ m_filetype = "3";
+ m_filesuffix = "jpg";
+ m_writerFileName.clear();
+ m_imgFmtWriter = NULL;
+ m_writerFileValid = false;
+ m_showbase64 = "0";
+ m_source = "Adf-duplex";
+ m_mode = "Color";
+ m_resolution = "200";
+
SANE_Int version_code = 0;
sane_init_ex(&version_code, sane_ex_callback, this);
}
@@ -363,11 +380,22 @@ void WebUser::HandleCmd(const WSCmdParam* param)
}
else if (cmdData.find("COPT|") == 0)
{
- GetSettingInfoNew(cmdData.substr(5));
+ GetSettingInfoNew(cmdData.substr(strlen("COPT|")));
}
else if (cmdData.find("CBASE64|") == 0)
{
- ConvertToBase64New(cmdData.substr(8));
+ ConvertToBase64New(cmdData.substr(strlen("CBASE64|")));
+ }
+ else if (cmdData.find("CSCAN|") == 0)
+ {
+ std::string param = cmdData.substr(strlen("CSCAN|"));
+ size_t pos = param.find("|");
+ if (std::string::npos != pos)
+ {
+ std::string devName = param.substr(0, pos);
+ std::string devParam = param.substr(pos + 1);
+ ScanNew(devName, devParam);
+ }
}
}
}
@@ -794,6 +822,115 @@ void WebUser::DeviceListPlugNew()
}
void WebUser::GetSettingInfoNew(const std::string& devName)
+{
+ 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();
+
+ bool find = false;
+ HGBase_EnterLock(m_lockName);
+ for (int i = 0; i < (int)m_devNameList.size(); ++i)
+ {
+ if (m_devNameList[i] == devName)
+ {
+ find = true;
+ break;
+ }
+ }
+ HGBase_LeaveLock(m_lockName);
+
+ if (find)
+ {
+ AddOptItem(optJson, arrayJson, "filepath", m_filepath.c_str(), NULL);
+ AddOptItem(optJson, arrayJson, "fileprefix", m_fileprefix.c_str(), NULL);
+ const char* deleteFileBeforeScanList[] = { "0", "1", NULL };
+ AddOptItem(optJson, arrayJson, "deletefilesbeforescan", m_deletefilesbeforescan.c_str(), deleteFileBeforeScanList);
+ const char* fileTypeList[] = { "1", "2", "3", "4", "5", "6", "7", NULL };
+ AddOptItem(optJson, arrayJson, "filetype", m_filetype.c_str(), fileTypeList);
+ const char* showBase64List[] = { "0", "1", NULL };
+ AddOptItem(optJson, arrayJson, "showbase64", m_showbase64.c_str(), showBase64List);
+ const char* sourceList[] = { "Adf-front", "Adf-back", "Adf-duplex", NULL };
+ AddOptItem(optJson, arrayJson, "source", m_source.c_str(), sourceList);
+ const char* modeList[] = { "Lineart", "Gray", "Color", NULL };
+ AddOptItem(optJson, arrayJson, "mode", m_mode.c_str(), modeList);
+ AddOptItem(optJson, arrayJson, "resolution", m_resolution.c_str(), NULL);
+ }
+
+ 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 base64 = GetBase64(filePath);
+ cJSON_AddItemToObject(retJson, "Data", cJSON_CreateString(base64.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::ScanNew(const std::string& devName, const std::string& devParam)
{
if (NULL != m_scanEvent)
{
@@ -828,245 +965,95 @@ void WebUser::GetSettingInfoNew(const std::string& devName)
if (NULL != m_devHandle)
{
- cJSON* retJson = cJSON_CreateObject();
- if (NULL != retJson)
+ cJSON* json = cJSON_Parse(devParam.c_str());
+ if (NULL != json)
{
- 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* p = json->child;
+ while (NULL != p)
{
- cJSON* optListJson = cJSON_CreateObject();
- if (NULL != optListJson)
+ if (0 == strcmp(p->string, "filepath"))
{
- 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 filePath[260];
+ HGBase_StandardiseFileName(p->valuestring, filePath, 260);
+ m_filepath = filePath;
+#ifdef _WIN32
+ if (m_filepath[m_filepath.size() - 1] != '\\')
+ m_filepath.push_back('\\');
+#else
+ if (m_filepath[m_filepath.size() - 1] != '/')
+ m_filepath.push_back('/');
+#endif
}
+ else if (0 == strcmp(p->string, "fileprefix"))
+ m_fileprefix = p->valuestring;
+ else if (0 == strcmp(p->string, "deletefilesbeforescan"))
+ m_deletefilesbeforescan = p->valuestring;
+ else if (0 == strcmp(p->string, "filetype"))
+ m_filetype = p->valuestring;
+ else if (0 == strcmp(p->string, "showbase64"))
+ m_showbase64 = p->valuestring;
+ else if (0 == strcmp(p->string, "source"))
+ m_source = p->valuestring;
+ else if (0 == strcmp(p->string, "mode"))
+ m_mode = p->valuestring;
+ else if (0 == strcmp(p->string, "resolution"))
+ m_resolution = p->valuestring;
- char* str = cJSON_Print(optJson);
- if (NULL != str)
- {
- optStr = GetBase64((HGByte*)str, strlen(str));
- free(str);
- }
-
- cJSON_Delete(optJson);
+ p = p->next;
}
- 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"));
+ cJSON_Delete(json);
+ }
- char* resp = cJSON_Print(retJson);
- if (NULL != resp)
+ SetParam();
+
+ HGBase_CreateEvent(HGFALSE, HGFALSE, &m_scanEvent);
+ assert(NULL != m_scanEvent);
+
+ SANE_Status status = sane_start(m_devHandle);
+ if (SANE_STATUS_GOOD != status)
+ {
+ HGBase_DestroyEvent(m_scanEvent);
+ m_scanEvent = NULL;
+
+ if (NULL != m_imgFmtWriter)
{
- SendResponse((const HGByte*)resp, (HGUInt)strlen(resp), HGTRUE);
- free(resp);
+ HGImgFmt_CloseImageWriter(m_imgFmtWriter);
+ m_imgFmtWriter = NULL;
+ HGBase_DeleteFile(m_writerFileName.c_str());
+ m_writerFileName.clear();
+ m_writerFileValid = false;
}
-
- cJSON_Delete(retJson);
}
}
}
-void WebUser::ConvertToBase64New(const std::string& filePath)
+void WebUser::AddOptItem(cJSON* optJson, cJSON* arrayJson, const char* name, const char* value, const char** list)
{
- cJSON* retJson = cJSON_CreateObject();
- if (NULL != retJson)
+ 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 (NULL != list)
{
- 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)
+ cJSON* arrayJson2 = cJSON_CreateArray();
+ const char** p = list;
+ while (0 != *p)
{
- 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_AddItemToArray(arrayJson2, cJSON_CreateString(*p));
+ ++p;
}
-
- 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);
+ 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);
}
void WebUser::PostDisConnectMsg()
@@ -1499,6 +1486,8 @@ int WebUser::sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned i
if (p->m_server->IsOld())
{
+ assert(NULL == p->m_imgFmtWriter);
+
int code = 0;
std::string result = "";
@@ -1518,6 +1507,63 @@ int WebUser::sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned i
free(resp);
}
+ cJSON_Delete(retJson);
+ }
+ }
+ else
+ {
+ if (NULL != p->m_imgFmtWriter)
+ {
+ HGImgFmt_CloseImageWriter(p->m_imgFmtWriter);
+ p->m_imgFmtWriter = NULL;
+
+ if (p->m_writerFileValid)
+ {
+ cJSON* retJson = cJSON_CreateObject();
+ if (NULL != retJson)
+ {
+ cJSON_AddItemToObject(retJson, "Cmd", cJSON_CreateString("SSCANMUL"));
+ cJSON_AddItemToObject(retJson, "Code", cJSON_CreateNumber(2003));
+ std::string data = p->m_filesuffix + "|" + p->m_writerFileName;
+ cJSON_AddItemToObject(retJson, "Data", cJSON_CreateString(data.c_str()));
+ cJSON_AddItemToObject(retJson, "DataType", cJSON_CreateString("string"));
+ cJSON_AddItemToObject(retJson, "Msg", cJSON_CreateString("Success"));
+
+ char* resp = cJSON_Print(retJson);
+ if (NULL != resp)
+ {
+ p->PostEventMsg((const HGByte*)resp, (HGUInt)strlen(resp));
+ free(resp);
+ }
+
+ cJSON_Delete(retJson);
+ }
+ }
+ else
+ {
+ HGBase_DeleteFile(p->m_writerFileName.c_str());
+ }
+
+ p->m_writerFileName.clear();
+ p->m_writerFileValid = false;
+ }
+
+ cJSON* retJson = cJSON_CreateObject();
+ if (NULL != retJson)
+ {
+ cJSON_AddItemToObject(retJson, "Cmd", cJSON_CreateString("SSCANALL"));
+ cJSON_AddItemToObject(retJson, "Code", cJSON_CreateNumber(2004));
+ cJSON_AddItemToObject(retJson, "Data", cJSON_CreateString(""));
+ cJSON_AddItemToObject(retJson, "DataType", cJSON_CreateString(""));
+ cJSON_AddItemToObject(retJson, "Msg", cJSON_CreateString("Success"));
+
+ char* resp = cJSON_Print(retJson);
+ if (NULL != resp)
+ {
+ p->PostEventMsg((const HGByte*)resp, (HGUInt)strlen(resp));
+ free(resp);
+ }
+
cJSON_Delete(retJson);
}
}
@@ -1582,6 +1628,69 @@ int WebUser::sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned i
cJSON_Delete(retJson);
}
}
+ else if (NULL != p->m_imgFmtWriter)
+ {
+ if (HGBASE_ERR_OK == HGImgFmt_SaveImageToWriter(p->m_imgFmtWriter, img, NULL))
+ p->m_writerFileValid = true;
+ }
+ else
+ {
+ cJSON* retJson = cJSON_CreateObject();
+ if (NULL != retJson)
+ {
+ cJSON_AddItemToObject(retJson, "Cmd", cJSON_CreateString("SSCANONE"));
+ cJSON_AddItemToObject(retJson, "Code", cJSON_CreateNumber(2002));
+
+ HGBase_CreateDir(p->m_filepath.c_str());
+ HGChar fileName[256];
+ HGTimeInfo timeInfo;
+ HGBase_GetLocalTime(&timeInfo);
+ sprintf(fileName, "%s%04d%02d%02d%02d%02d%02d%03d.%s", p->m_fileprefix.c_str(), timeInfo.year, timeInfo.month,
+ timeInfo.day, timeInfo.hour, timeInfo.minute, timeInfo.second, timeInfo.milliseconds, p->m_filesuffix.c_str());
+ HGChar filePath[256];
+ sprintf(filePath, "%s%s", p->m_filepath.c_str(), fileName);
+
+ if (atoi(p->m_showbase64.c_str()))
+ {
+ std::string data;
+
+ cJSON* obj = cJSON_CreateObject();
+ if (HGBASE_ERR_OK == HGImgFmt_SaveImage(img, 0, NULL, filePath))
+ cJSON_AddItemToObject(obj, "ImagePath", cJSON_CreateString(filePath));
+ std::string imgBase64 = GetBase64(filePath);
+ if (!imgBase64.empty())
+ cJSON_AddItemToObject(obj, "Base64Data", cJSON_CreateString(imgBase64.c_str()));
+
+ char* objStr = cJSON_Print(obj);
+ data = p->m_filesuffix + "|" + GetBase64((HGByte*)objStr, strlen(objStr));
+ free(objStr);
+ cJSON_Delete(obj);
+
+ cJSON_AddItemToObject(retJson, "Data", cJSON_CreateString(data.c_str()));
+ cJSON_AddItemToObject(retJson, "DataType", cJSON_CreateString("base64"));
+ }
+ else
+ {
+ std::string data = p->m_filesuffix + "|";
+ if (HGBASE_ERR_OK == HGImgFmt_SaveImage(img, 0, NULL, filePath))
+ data += filePath;
+
+ cJSON_AddItemToObject(retJson, "Data", cJSON_CreateString(data.c_str()));
+ cJSON_AddItemToObject(retJson, "DataType", cJSON_CreateString("string"));
+ }
+
+ cJSON_AddItemToObject(retJson, "Msg", cJSON_CreateString("Success"));
+
+ char* resp = cJSON_Print(retJson);
+ if (NULL != resp)
+ {
+ p->PostEventMsg((const HGByte*)resp, (HGUInt)strlen(resp));
+ free(resp);
+ }
+
+ cJSON_Delete(retJson);
+ }
+ }
HGBase_DestroyImage(img);
}
@@ -1630,6 +1739,61 @@ std::string WebUser::GetBase64(HGImage image)
return ret;
}
+std::string WebUser::GetBase64(const std::string& filePath)
+{
+ std::string base64;
+ 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;
+ base64 = (const char*)base64Data;
+ delete[] base64Data;
+ }
+
+ delete[] data;
+ }
+
+ fclose(file);
+ }
+
+ if (!base64.empty())
+ {
+ HGUInt imgType = 0;
+ HGImgFmt_GetImgFmtType(filePath.c_str(), &imgType);
+
+ std::string prefix;
+ if (HGIMGFMT_TYPE_JPEG == imgType)
+ prefix = "data:image/jpeg;base64,";
+ else if (HGIMGFMT_TYPE_BMP == imgType)
+ prefix = "data:image/bmp;base64,";
+ else if (HGIMGFMT_TYPE_PNG == imgType)
+ prefix = "data:image/png;base64,";
+ else if (HGIMGFMT_TYPE_TIFF == imgType)
+ prefix = "data:image/tiff;base64,";
+ else if (HGIMGFMT_TYPE_PDF == imgType)
+ prefix = "data:image/pdf;base64,";
+ else if (HGIMGFMT_TYPE_OFD == imgType)
+ prefix = "data:image/ofd;base64,";
+ base64.insert(0, prefix);
+ }
+
+ return base64;
+}
+
std::string WebUser::GetBase64(const HGByte* data, HGUInt size)
{
std::string ret;
@@ -1647,6 +1811,129 @@ std::string WebUser::GetBase64(const HGByte* data, HGUInt size)
return ret;
}
+void WebUser::ClearPath(const std::string& path)
+{
+#if defined(HG_CMP_MSC)
+ char szFind[MAX_PATH];
+ sprintf(szFind, "%s*.*", path.c_str());
+
+ WIN32_FIND_DATAA FindFileData;
+ HANDLE hFind = FindFirstFileA(szFind, &FindFileData);
+ if (INVALID_HANDLE_VALUE == hFind)
+ return;
+
+ do
+ {
+ if (0 == (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
+ {
+ char fileName[MAX_PATH];
+ sprintf(fileName, "%s%s", path.c_str(), FindFileData.cFileName);
+ HGBase_DeleteFile(fileName);
+ }
+
+ } while (FindNextFileA(hFind, &FindFileData));
+
+ FindClose(hFind);
+#else
+ DIR* dir = opendir(path.c_str());
+ if (NULL != dir)
+ {
+ struct dirent* dire = NULL;
+ while (dire = readdir(dir))
+ {
+ char fileName[256];
+ sprintf(fileName, "%s%s", path.c_str(), dire->d_name);
+
+ struct stat filebuf;
+ lstat(fileName, &filebuf);
+ if (!S_ISDIR(filebuf.st_mode))
+ {
+ HGBase_DeleteFile(fileName);
+ }
+ }
+
+ closedir(dir);
+ }
+#endif
+}
+
+void WebUser::SetParam()
+{
+ // Set Param
+
+ if (m_source == "Adf-front")
+ {
+ SetParam(OPTION_TITLE_SMYM, OPTION_VALUE_SMYM_DM);
+ HGBool b = HGFALSE;
+ SetParam(OPTION_TITLE_JHZFM, &b);
+ }
+ else if (m_source == "Adf-back")
+ {
+ SetParam(OPTION_TITLE_SMYM, OPTION_VALUE_SMYM_DM);
+ HGBool b = HGTRUE;
+ SetParam(OPTION_TITLE_JHZFM, &b);
+ }
+ else
+ {
+ SetParam(OPTION_TITLE_SMYM, OPTION_VALUE_SMYM_SM);
+ HGBool b = HGFALSE;
+ SetParam(OPTION_TITLE_JHZFM, &b);
+ }
+
+ if (m_mode == "Lineart")
+ {
+ SetParam(OPTION_TITLE_YSMS, OPTION_VALUE_YSMS_HB);
+ }
+ else if (m_mode == "Gray")
+ {
+ SetParam(OPTION_TITLE_YSMS, OPTION_VALUE_YSMS_256JHD);
+ }
+ else
+ {
+ SetParam(OPTION_TITLE_YSMS, OPTION_VALUE_YSMS_24WCS);
+ }
+
+ HGInt dpi = atoi(m_resolution.c_str());
+ SetParam(OPTION_TITLE_FBL, &dpi);
+
+ if (atoi(m_deletefilesbeforescan.c_str()))
+ {
+ ClearPath(m_filepath);
+ }
+
+ if (1 == atoi(m_filetype.c_str()))
+ m_filesuffix = "bmp";
+ else if (2 == atoi(m_filetype.c_str()))
+ m_filesuffix = "png";
+ else if (4 == atoi(m_filetype.c_str()))
+ m_filesuffix = "tif";
+ else if (5 == atoi(m_filetype.c_str()))
+ m_filesuffix = "gif";
+ else if (6 == atoi(m_filetype.c_str()))
+ m_filesuffix = "pdf";
+ else if (7 == atoi(m_filetype.c_str()))
+ m_filesuffix = "ofd";
+ else
+ m_filesuffix = "jpg";
+
+ if ("tif" == m_filesuffix || "pdf" == m_filesuffix || "ofd" == m_filesuffix)
+ {
+ HGBase_CreateDir(m_filepath.c_str());
+ HGChar fileName[256];
+ HGTimeInfo timeInfo;
+ HGBase_GetLocalTime(&timeInfo);
+ sprintf(fileName, "%s%04d%02d%02d%02d%02d%02d%03d.%s", m_fileprefix.c_str(), timeInfo.year, timeInfo.month,
+ timeInfo.day, timeInfo.hour, timeInfo.minute, timeInfo.second, timeInfo.milliseconds, m_filesuffix.c_str());
+ m_writerFileName = m_filepath + fileName;
+ m_writerFileValid = false;
+ HGImgFmt_OpenImageWriter(m_writerFileName.c_str(), 0, &m_imgFmtWriter);
+ if (NULL == m_imgFmtWriter)
+ {
+ m_writerFileName.clear();
+ }
+ }
+}
+
HGBool WebUser::SetParam(const char* optionName, const HGVoid* data)
{
assert(NULL != m_devHandle);
diff --git a/sdk/webscan/WebUser.h b/sdk/webscan/WebUser.h
index 9e01da47..8d083115 100644
--- a/sdk/webscan/WebUser.h
+++ b/sdk/webscan/WebUser.h
@@ -7,6 +7,7 @@
#include "base/HGThread.h"
#include "base/HGImage.h"
#include "base/HGMsgPump.h"
+#include "imgfmt/HGImgFmt.h"
#include "Msg.h"
#include "cJSON.h"
#include "sane/sane_ex.h"
@@ -45,15 +46,20 @@ private:
void DeviceListPlugNew();
void GetSettingInfoNew(const std::string &devName);
void ConvertToBase64New(const std::string& filePath);
+ void ScanNew(const std::string& devName, const std::string& devParam);
private:
+ static void AddOptItem(cJSON* optJson, cJSON* arrayJson, const char *name, const char *value, const char **list);
void PostDisConnectMsg();
void PostCmdMsg(const HGByte* data, HGUInt dataSize);
void PostEventMsg(const HGByte* data, HGUInt dataSize);
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);
+ static std::string GetBase64(const std::string& filePath);
+ static std::string GetBase64(const HGByte* data, HGUInt size);
+ static void ClearPath(const std::string &path);
+ void SetParam();
HGBool SetParam(const char* optionName, const HGVoid* data);
bool ShakeHand(const std::string& head);
@@ -80,4 +86,17 @@ private:
std::string m_devName;
SANE_Handle m_devHandle;
HGEvent m_scanEvent;
+
+ std::string m_filepath;
+ std::string m_fileprefix;
+ std::string m_deletefilesbeforescan;
+ std::string m_filetype;
+ std::string m_filesuffix;
+ std::string m_writerFileName;
+ HGImgFmtWriter m_imgFmtWriter;
+ bool m_writerFileValid;
+ std::string m_showbase64;
+ std::string m_source;
+ std::string m_mode;
+ std::string m_resolution;
};
diff --git a/sdk/webscan/main.cpp b/sdk/webscan/main.cpp
index 1162fe3d..fe269c7e 100644
--- a/sdk/webscan/main.cpp
+++ b/sdk/webscan/main.cpp
@@ -42,9 +42,6 @@ int main()
assert(0 == ret);
#endif
- lang_initialize(nullptr);
- lang_set_code_page(20127);
-
HGMsgPump msgPump = NULL;
HGBase_CreateMsgPump(&msgPump);
diff --git a/test/webscan-new/placeholder.png b/test/webscan-new/placeholder.png
new file mode 100644
index 0000000000000000000000000000000000000000..2a2a33d57f057c1e63724b67b3f1e00268a9aa4f
GIT binary patch
literal 3802
zcmZuzc`y|47yqtZtXr-XxsMKtT$Q4AWfj?0t|V6|=azGwiyY-zxzAj=T9U{n$5w<~
z5prKSl4aMOv!CYo&+m`ln|bdu^WMCfcg}pCqHpT5F$*vQ0NC_U+L$B6|5G@_k^QW0
z({Th$Sd_U304&`96aq4`_yJ%xc&Md?Mn7=(boY4Rjuq9@(h|i!c6WH_Vh@1tNVbuW
zS>iUI`sB7fhl%D8?M
+ pOaFmE
zj#Zskla-0hT;y@0I~lPixMQa{<|v!d%lj3c&3i|1SH4qPUwH6XTtp9ik~7G?Xh(ms
z^Bp{DO4lWdB=YchI$|e~=kytcvU9(0RU3Ie^4yjkB+i=eIX1+t#+SytzdY*n?y
Test!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
++ +
++ +
+ + +