From bfcc042cbe0b34e1b50e10d9cba980374275be7a Mon Sep 17 00:00:00 2001 From: luoliangyi <87842688@qq.com> Date: Mon, 9 May 2022 18:58:09 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0ftp=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../windows/HGWebService/HGWebService.vcxproj | 16 +- imgfmt/HGBmp.h | 42 ++- sdk/webservice/HttpUser.cpp | 8 +- sdk/webservice/Manager.cpp | 283 ++++++++++++++---- sdk/webservice/Manager.h | 10 + sdk/webservice/MsgLoop.cpp | 87 ++++-- sdk/webservice/MsgLoop.h | 2 +- sdk/webservice/SockIoUser.cpp | 24 +- sdk/webservice/WebMsg.h | 28 +- sdk/webservice/WebServer.cpp | 12 +- sdk/webservice/WebServer.h | 4 +- sdk/webservice/WsUser.cpp | 22 +- 12 files changed, 380 insertions(+), 158 deletions(-) diff --git a/build/windows/HGWebService/HGWebService.vcxproj b/build/windows/HGWebService/HGWebService.vcxproj index 68b7af1a..20e0e643 100644 --- a/build/windows/HGWebService/HGWebService.vcxproj +++ b/build/windows/HGWebService/HGWebService.vcxproj @@ -116,15 +116,15 @@ Level3 true - WIN32;_DEBUG;_WINDOWS;_CONSOLE;_WINSOCK_DEPRECATED_NO_WARNINGS;ZIP_STATIC;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + WIN32;_DEBUG;_WINDOWS;_CONSOLE;_WINSOCK_DEPRECATED_NO_WARNINGS;ZIP_STATIC;CURL_STATICLIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true MultiThreadedDebug - ../../../third_party/sha1/;../../../third_party/base64/;../../../third_party/json/;../../../third_party/sane/;../../../third_party/libzip/windows/include;../../../../sdk/include;%(AdditionalIncludeDirectories) + ../../../third_party/sha1/;../../../third_party/base64/;../../../third_party/json/;../../../third_party/libzip/windows/include;../../../third_party/libcurl/windows/include;../../../../sdk/include;%(AdditionalIncludeDirectories) Windows true - ../Debug/HGBase.lib;../Debug/HGImgFmt.lib;../../../../sdk/lib/win/x86/Debug/hgsane.lib;../../../third_party/zlib/windows/lib/x86/zlib.lib;../../../third_party/libzip/windows/lib/x86/zip.lib;ws2_32.lib;%(AdditionalDependencies) + ../Debug/HGBase.lib;../Debug/HGImgFmt.lib;../../../../sdk/lib/win/x86/Debug/hgsane.lib;../../../third_party/zlib/windows/lib/x86/zlib.lib;../../../third_party/libzip/windows/lib/x86/zip.lib;../../../third_party/libcurl/windows/lib/x86/libcurld.lib;wldap32.lib;ws2_32.lib;%(AdditionalDependencies) /ignore:4098,4099,4075 /LTCG %(AdditionalOptions) @@ -134,17 +134,17 @@ true true true - WIN32;NDEBUG;_WINDOWS;_CONSOLE;_WINSOCK_DEPRECATED_NO_WARNINGS;ZIP_STATIC;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + WIN32;NDEBUG;_WINDOWS;_CONSOLE;_WINSOCK_DEPRECATED_NO_WARNINGS;ZIP_STATIC;CURL_STATICLIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true MultiThreaded - ../../../third_party/sha1/;../../../third_party/base64/;../../../third_party/json/;../../../third_party/sane/;../../../third_party/libzip/windows/include;../../../../sdk/include;%(AdditionalIncludeDirectories) + ../../../third_party/sha1/;../../../third_party/base64/;../../../third_party/json/;../../../third_party/libzip/windows/include;../../../third_party/libcurl/windows/include;../../../../sdk/include;%(AdditionalIncludeDirectories) Windows true true true - ../Release/HGBase.lib;../Release/HGImgFmt.lib;../../../../sdk/lib/win/x86/Release/hgsane.lib;../../../third_party/zlib/windows/lib/x86/zlib.lib;../../../third_party/libzip/windows/lib/x86/zip.lib;ws2_32.lib;%(AdditionalDependencies) + ../Release/HGBase.lib;../Release/HGImgFmt.lib;../../../../sdk/lib/win/x86/Release/hgsane.lib;../../../third_party/zlib/windows/lib/x86/zlib.lib;../../../third_party/libzip/windows/lib/x86/zip.lib;../../../third_party/libcurl/windows/lib/x86/libcurl.lib;wldap32.lib;ws2_32.lib;%(AdditionalDependencies) /ignore:4099 /LTCG %(AdditionalOptions) @@ -158,7 +158,7 @@ _DEBUG;_WINDOWS;_CONSOLE;_WINSOCK_DEPRECATED_NO_WARNINGS;ZIP_STATIC;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true MultiThreadedDebug - ../../../third_party/sha1/;../../../third_party/base64/;../../../third_party/json/;../../../third_party/sane/;../../../third_party/libzip/windows/include;../../../../sdk/include;%(AdditionalIncludeDirectories) + ../../../third_party/sha1/;../../../third_party/base64/;../../../third_party/json/;../../../third_party/libzip/windows/include;../../../third_party/libcurl/windows/include;../../../../sdk/include;%(AdditionalIncludeDirectories) Windows @@ -176,7 +176,7 @@ NDEBUG;_WINDOWS;_CONSOLE;_WINSOCK_DEPRECATED_NO_WARNINGS;ZIP_STATIC;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true MultiThreaded - ../../../third_party/sha1/;../../../third_party/base64/;../../../third_party/json/;../../../third_party/sane/;../../../third_party/libzip/windows/include;../../../../sdk/include;%(AdditionalIncludeDirectories) + ../../../third_party/sha1/;../../../third_party/base64/;../../../third_party/json/;../../../third_party/libzip/windows/include;../../../third_party/libcurl/windows/include;../../../../sdk/include;%(AdditionalIncludeDirectories) Windows diff --git a/imgfmt/HGBmp.h b/imgfmt/HGBmp.h index 3eb11e78..8496178c 100644 --- a/imgfmt/HGBmp.h +++ b/imgfmt/HGBmp.h @@ -8,26 +8,52 @@ typedef struct { - HGUInt width; - HGUInt height; - HGUShort bitCount; - HGUInt compression; + HGUInt width; /* 宽 */ + HGUInt height; /* 高 */ + HGUShort bitCount; /* 每像素比特数 */ + HGUInt compression; /* 压缩方式 */ - HGUInt xPelsPerMeter; - HGUInt yPelsPerMeter; + HGUInt xPelsPerMeter; /* 水平每米的像素数 */ + HGUInt yPelsPerMeter; /* 垂直每米的像素数 */ }HGBmpLoadInfo; typedef struct { - HGUInt xPelsPerMeter; - HGUInt yPelsPerMeter; + HGUInt xPelsPerMeter; /* 水平每米的像素数 */ + HGUInt yPelsPerMeter; /* 垂直每米的像素数 */ }HGBmpSaveInfo; +/* 检查文件是否是BMP图像 +* 参数: +* 1) fileName: in, 文件名, windows系统上是GBK编码, linux系统上是UTF8编码 +* 2) isBmp: out, 是否是BMP图像 +* 说明: +* 1) 该函数会打开文件判断文件头,而不是判断文件名后缀 +*/ HGEXPORT HGResult HGAPI HGImgFmt_CheckBmpFile(const HGChar* fileName, HGBool* isBmp); +/* 加载BMP图像 +* 参数: +* 1) fileName: in, 文件名, windows系统上是GBK编码, linux系统上是UTF8编码 +* 2) info: out, BMP图像加载信息, 如果不需要该信息可传NULL +* 3) imgType: in, 要生成的图像类型, 参见HGBASE_IMGTYPE_*, 传0表示自动获取 +* 4) imgOrigin: in, 要生成的图像数据排列方式, 参见HGBASE_IMGORIGIN_*, 传0表示自动获取 +* 5) image: out, 要生成的图像句柄 +* 说明: +* 1) 生成的图像不使用时需要调用HGBase_DestroyImage销毁 +*/ HGEXPORT HGResult HGAPI HGImgFmt_LoadBmpImage(const HGChar* fileName, HGBmpLoadInfo* info, HGUInt imgType, HGUInt imgOrigin, HGImage* image); +/* 保存BMP图像 +* 参数: +* 1) image: in, 要保存的图像句柄 +* 2) info: in, BMP图像保存信息, 如果没有则传NULL +* 3) fileName: in, 文件名, windows系统上是GBK编码, linux系统上是UTF8编码 +* 说明: +* 1) 忽略fileName的文件扩展名 +* 2) 如果info不为NULL, 保存的DPI使用info指定的; 否则使用image自带的 +*/ HGEXPORT HGResult HGAPI HGImgFmt_SaveBmpImage(HGImage image, const HGBmpSaveInfo* info, const HGChar* fileName); #endif /* __HGBMP_H__ */ \ No newline at end of file diff --git a/sdk/webservice/HttpUser.cpp b/sdk/webservice/HttpUser.cpp index e1c67d79..e9387eee 100644 --- a/sdk/webservice/HttpUser.cpp +++ b/sdk/webservice/HttpUser.cpp @@ -733,7 +733,7 @@ void HttpUser::ThreadFunc() // 这里跳出,可能是服务器关闭了socketConn,或者客户端关闭了socket,或者网络断开 WebMsg msg; msg.msgId = WEB_MSGID_DISCONNET; - msg.svrId = m_server->GetId(); + msg.svrType = m_server->GetType(); msg.usrId = m_id; msg.param = NULL; GetLoop()->Send(&msg); @@ -775,7 +775,7 @@ void HttpUser::ThreadFunc() { WebMsg msg; msg.msgId = WEB_MSGID_DISCONNET; - msg.svrId = m_server->GetId(); + msg.svrType = m_server->GetType(); msg.usrId = m_id; msg.param = NULL; GetLoop()->Send(&msg); @@ -800,7 +800,7 @@ void HttpUser::ThreadFunc() WebMsg msg; msg.msgId = WEB_MSGID_HTTPCMD; - msg.svrId = m_server->GetId(); + msg.svrType = m_server->GetType(); msg.usrId = m_id; msg.param = param; bool b = GetLoop()->Send(&msg); @@ -827,7 +827,7 @@ void HttpUser::ThreadFunc() WebMsg msg; msg.msgId = WEB_MSGID_HTTPCMD; - msg.svrId = m_server->GetId(); + msg.svrType = m_server->GetType(); msg.usrId = m_id; msg.param = param; bool b = GetLoop()->Send(&msg); diff --git a/sdk/webservice/Manager.cpp b/sdk/webservice/Manager.cpp index 11874e1f..875a49d4 100644 --- a/sdk/webservice/Manager.cpp +++ b/sdk/webservice/Manager.cpp @@ -14,6 +14,7 @@ extern "C" { #include "zip.h" }; +#include #include #include @@ -211,6 +212,13 @@ void Manager::CloseDev(const CloseDevParam* param) m_devName.clear(); } +void Manager::ScanFinish() +{ + m_scanInsertImgName.clear(); + m_scanIsInsert = false; + m_scanning = false; +} + void Manager::SetScanEvent(ScanEvent event, void* param) { assert(NULL != event && NULL != param); @@ -262,10 +270,6 @@ bool Manager::StopScan() { assert(NULL != m_devHandle); sane_cancel(m_devHandle); - m_scanning = false; - - m_scanInsertImgName.clear(); - m_scanIsInsert = false; } return true; @@ -619,15 +623,8 @@ bool Manager::ExportOfd(const std::string& devId, bool isAuto, std::string& imgB return !imgBase64.empty(); } -bool Manager::ExportOfdFile(const std::string& devId, bool isAuto, HGByte** data, HGUInt* size) +bool Manager::ExportOfdFile(const std::string& devId, bool isAuto, const std::string& fileName) { - *data = NULL; - *size = 0; - if (m_scanning) - { - return false; - } - std::string filePath = GetFilePath(devId); std::vector fileNameList = GetFileNameList(devId); if (fileNameList.empty()) @@ -635,11 +632,8 @@ bool Manager::ExportOfdFile(const std::string& devId, bool isAuto, HGByte** data return false; } - HGChar tmpFileName[512]; - HGBase_GetTmpFileName(tmpFileName, 512); - HGOfdImageWriter writer = NULL; - HGImgFmt_OpenOfdImageWriter(tmpFileName, &writer); + HGImgFmt_OpenOfdImageWriter(fileName.c_str(), &writer); if (NULL == writer) { return false; @@ -663,10 +657,26 @@ bool Manager::ExportOfdFile(const std::string& devId, bool isAuto, HGByte** data if (!ret) { - HGBase_DeleteFile(tmpFileName); + HGBase_DeleteFile(fileName.c_str()); return false; } + return true; +} + +bool Manager::ExportOfdFile(const std::string& devId, bool isAuto, HGByte** data, HGUInt* size) +{ + *data = NULL; + *size = 0; + if (m_scanning) + { + return false; + } + + HGChar tmpFileName[512]; + HGBase_GetTmpFileName(tmpFileName, 512); + ExportOfdFile(devId, isAuto, tmpFileName); + *data = GetBuffer(tmpFileName, size); HGBase_DeleteFile(tmpFileName); return (NULL != *data); @@ -692,15 +702,8 @@ bool Manager::ExportPdf(const std::string& devId, std::string& imgBase64) return !imgBase64.empty(); } -bool Manager::ExportPdfFile(const std::string& devId, HGByte** data, HGUInt* size) +bool Manager::ExportPdfFile(const std::string& devId, const std::string& fileName) { - *data = NULL; - *size = 0; - if (m_scanning) - { - return false; - } - std::string filePath = GetFilePath(devId); std::vector fileNameList = GetFileNameList(devId); if (fileNameList.empty()) @@ -708,11 +711,8 @@ bool Manager::ExportPdfFile(const std::string& devId, HGByte** data, HGUInt* siz return false; } - HGChar tmpFileName[512]; - HGBase_GetTmpFileName(tmpFileName, 512); - HGPdfImageWriter writer = NULL; - HGImgFmt_OpenPdfImageWriter(tmpFileName, &writer); + HGImgFmt_OpenPdfImageWriter(fileName.c_str(), &writer); if (NULL == writer) { return false; @@ -736,10 +736,26 @@ bool Manager::ExportPdfFile(const std::string& devId, HGByte** data, HGUInt* siz if (!ret) { - HGBase_DeleteFile(tmpFileName); + HGBase_DeleteFile(fileName.c_str()); return false; } + return true; +} + +bool Manager::ExportPdfFile(const std::string& devId, HGByte** data, HGUInt* size) +{ + *data = NULL; + *size = 0; + if (m_scanning) + { + return false; + } + + HGChar tmpFileName[512]; + HGBase_GetTmpFileName(tmpFileName, 512); + ExportPdfFile(devId, tmpFileName); + *data = GetBuffer(tmpFileName, size); HGBase_DeleteFile(tmpFileName); return (NULL != *data); @@ -765,15 +781,8 @@ bool Manager::ExportTiff(const std::string& devId, std::string& imgBase64) return !imgBase64.empty(); } -bool Manager::ExportTiffFile(const std::string& devId, HGByte** data, HGUInt* size) +bool Manager::ExportTiff(const std::string& devId, const std::string& fileName) { - *data = NULL; - *size = 0; - if (m_scanning) - { - return false; - } - std::string filePath = GetFilePath(devId); std::vector fileNameList = GetFileNameList(devId); if (fileNameList.empty()) @@ -781,11 +790,8 @@ bool Manager::ExportTiffFile(const std::string& devId, HGByte** data, HGUInt* si return false; } - HGChar tmpFileName[512]; - HGBase_GetTmpFileName(tmpFileName, 512); - HGTiffWriter writer = NULL; - HGImgFmt_OpenTiffWriter(tmpFileName, &writer); + HGImgFmt_OpenTiffWriter(fileName.c_str(), &writer); if (NULL == writer) { return false; @@ -809,10 +815,26 @@ bool Manager::ExportTiffFile(const std::string& devId, HGByte** data, HGUInt* si if (!ret) { - HGBase_DeleteFile(tmpFileName); + HGBase_DeleteFile(fileName.c_str()); return false; } + return true; +} + +bool Manager::ExportTiffFile(const std::string& devId, HGByte** data, HGUInt* size) +{ + *data = NULL; + *size = 0; + if (m_scanning) + { + return false; + } + + HGChar tmpFileName[512]; + HGBase_GetTmpFileName(tmpFileName, 512); + ExportTiff(devId, tmpFileName); + *data = GetBuffer(tmpFileName, size); HGBase_DeleteFile(tmpFileName); return (NULL != *data); @@ -838,15 +860,8 @@ bool Manager::ExportZip(const std::string& devId, std::string& imgBase64) return !imgBase64.empty(); } -bool Manager::ExportZipFile(const std::string& devId, HGByte** data, HGUInt* size) +bool Manager::ExportZipFile(const std::string& devId, const std::string& fileName) { - *data = NULL; - *size = 0; - if (m_scanning) - { - return false; - } - std::string filePath = GetFilePath(devId); std::vector fileNameList = GetFileNameList(devId); if (fileNameList.empty()) @@ -854,11 +869,8 @@ bool Manager::ExportZipFile(const std::string& devId, HGByte** data, HGUInt* siz return false; } - HGChar tmpFileName[512]; - HGBase_GetTmpFileName(tmpFileName, 512); - int error = 0; - zip* z = zip_open(StdStringToUtf8(tmpFileName).c_str(), ZIP_CREATE | ZIP_TRUNCATE, &error); + zip* z = zip_open(StdStringToUtf8(fileName.c_str()).c_str(), ZIP_CREATE | ZIP_TRUNCATE, &error); if (NULL == z) { return false; @@ -887,10 +899,26 @@ bool Manager::ExportZipFile(const std::string& devId, HGByte** data, HGUInt* siz if (!ret) { - HGBase_DeleteFile(tmpFileName); + HGBase_DeleteFile(fileName.c_str()); return false; } + return true; +} + +bool Manager::ExportZipFile(const std::string& devId, HGByte** data, HGUInt* size) +{ + *data = NULL; + *size = 0; + if (m_scanning) + { + return false; + } + + HGChar tmpFileName[512]; + HGBase_GetTmpFileName(tmpFileName, 512); + ExportZipFile(devId, tmpFileName); + *data = GetBuffer(tmpFileName, size); HGBase_DeleteFile(tmpFileName); return (NULL != *data); @@ -903,8 +931,32 @@ bool Manager::UploadImage(const UploadParam& uploadParam) return false; } - // 打包并上传 - return true; + std::string devId; + GetCurDevId(devId); + + HGChar tmpFileName[512]; + HGBase_GetTmpFileName(tmpFileName, 512); + if (0 == uploadParam.format) + ExportOfdFile(devId, true, tmpFileName); + else if (1 == uploadParam.format) + ExportPdfFile(devId, tmpFileName); + else + ExportZipFile(devId, tmpFileName); + + bool ret = false; + if (0 == uploadParam.uploadMode) // HTTP + { + ret = HTTPUpload(tmpFileName, uploadParam.httpUrl, uploadParam.fileName, uploadParam.httpMethod, + uploadParam.header, uploadParam.param); + } + else if (1 == uploadParam.uploadMode) // FTP + { + ret = FTPUpload(tmpFileName, uploadParam.ftpUrl, uploadParam.ftpPort, uploadParam.ftpPath, + uploadParam.ftpUser, uploadParam.ftpPassword, uploadParam.ftpMode); + } + + HGBase_DeleteFile(tmpFileName); + return ret; } bool Manager::SaveImage(const std::string& devId, const std::string& imgName, const std::string& imgBase64) @@ -1502,6 +1554,102 @@ bool Manager::SaveBase64(const std::string& fileName, const char* base64) return ret; } +bool Manager::HTTPUpload(const std::string& localFileName, const std::string& httpUrl, const std::string& remoteFileName, + const std::string& httpMethod, const std::string& header, const std::string& param) +{ + return false; +} + +static size_t read_callback(char* ptr, size_t size, size_t nmemb, void* stream) +{ + unsigned long nread; + /* in real-world cases, this would probably get this data differently + as this fread() stuff is exactly what the library already would do + by default internally */ + size_t retcode = fread(ptr, size, nmemb, (FILE*)stream); + + if (retcode > 0) + { + nread = (unsigned long)retcode; + fprintf(stderr, "*** We read %lu bytes from file\n", nread); + } + + return retcode; +} + +bool Manager::FTPUpload(const std::string& localFileName, const std::string& ftpUrl, int ftpPort, const std::string& ftpPath, + const std::string& ftpUser, const std::string& ftpPassword, int ftpMode) +{ + FILE* file = fopen(localFileName.c_str(), "rb"); + if (NULL == file) + { + return false; + } + + fseek(file, 0, SEEK_END); + long fsize = ftell(file); + fseek(file, 0, SEEK_SET); + + curl_global_init(CURL_GLOBAL_ALL); + + /* get a curl handle */ + CURL *curl = curl_easy_init(); + if (curl) + { + char tmpName[256]; + HGBase_GetUuid(tmpName, 256); + char remoteName[256]; + HGBase_GetFileName(localFileName.c_str(), remoteName, 256); + + char ftp_rnfr[256]; + sprintf(ftp_rnfr, "RNFR %s", tmpName); + char ftp_rnto[256]; + sprintf(ftp_rnto, "RNTO %s", remoteName); + + struct curl_slist* headerlist = NULL; + headerlist = curl_slist_append(headerlist, ftp_rnfr); + headerlist = curl_slist_append(headerlist, ftp_rnto); + + /* we want to use our own read function */ + curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback); + + curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); + + char url[512]; + sprintf(url, "ftp://%s:%s@%s:%d/%s/%s", ftpUser.c_str(), ftpPassword.c_str(), + ftpUrl.c_str(), ftpPort, ftpPath.c_str(), tmpName); + curl_easy_setopt(curl, CURLOPT_URL, url); + + /* pass in that last of FTP commands to run after the transfer */ + curl_easy_setopt(curl, CURLOPT_POSTQUOTE, headerlist); + + /* now specify which file to upload */ + curl_easy_setopt(curl, CURLOPT_READDATA, file); + + /* Set the size of the file to upload (optional). If you give a *_LARGE + option you MUST make sure that the type of the passed-in argument is a + curl_off_t. If you use CURLOPT_INFILESIZE (without _LARGE) you must + make sure that to pass in a type 'long' argument. */ + curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, (curl_off_t)fsize); + + /* Now run off and do what you have been told! */ + CURLcode res = curl_easy_perform(curl); + /* Check for errors */ + if (res != CURLE_OK) + fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); + + /* clean up the FTP commands list */ + curl_slist_free_all(headerlist); + + /* always cleanup */ + curl_easy_cleanup(curl); + } + fclose(file); /* close the local file */ + + curl_global_cleanup(); + return true; +} + int Manager::sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned int* len, void* param) { (void)hdev; @@ -1525,7 +1673,7 @@ int Manager::sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned i WebMsg msg; msg.msgId = WEB_MSGID_OPENDEV; - msg.svrId = 0; + msg.svrType = 0; msg.usrId = 0; msg.param = openDevParam; bool b = p->m_loop->Send(&msg); @@ -1550,7 +1698,7 @@ int Manager::sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned i WebMsg msg; msg.msgId = WEB_MSGID_CLOSEDEV; - msg.svrId = 0; + msg.svrType = 0; msg.usrId = 0; msg.param = closeDevParam; bool b = p->m_loop->Send(&msg); @@ -1629,6 +1777,17 @@ int Manager::sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned i std::string fileName = filePath + imgName; HGImgFmt_SaveImage(img, 0, NULL, 0, fileName.c_str()); + if (0 == p->m_devParam.uploadMode) // HTTP + { + HTTPUpload(fileName, p->m_devParam.httpUrl, p->m_devParam.fileName, p->m_devParam.httpMethod, + p->m_devParam.header, p->m_devParam.param); + } + else if (1 == p->m_devParam.uploadMode) // FTP + { + FTPUpload(fileName, p->m_devParam.ftpUrl, p->m_devParam.ftpPort, p->m_devParam.ftpPath, + p->m_devParam.ftpUser, p->m_devParam.ftpPassword, p->m_devParam.ftpMode); + } + if (p->m_scanIsInsert) { int index = -1; @@ -1679,8 +1838,8 @@ int Manager::sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned i HGBase_LeaveLock(p->m_lock); WebMsg msg; - msg.msgId = WEB_MSGID_STOPSCAN; - msg.svrId = 0; + msg.msgId = WEB_MSGID_SCANFINISH; + msg.svrType = 0; msg.usrId = 0; msg.param = NULL; p->m_loop->Send(&msg); diff --git a/sdk/webservice/Manager.h b/sdk/webservice/Manager.h index 68e295db..b214f99b 100644 --- a/sdk/webservice/Manager.h +++ b/sdk/webservice/Manager.h @@ -92,6 +92,8 @@ public: void OpenDev(const OpenDevParam *param); // 关闭设备 void CloseDev(const CloseDevParam* param); + // 扫描完成 + void ScanFinish(); // 设置回调 void SetScanEvent(ScanEvent event, void* param); @@ -114,15 +116,19 @@ public: bool SetDevParam(const std::string& devId, const DevParam& devParam); // 生成OFD bool ExportOfd(const std::string& devId, bool isAuto, std::string &imgBase64); + bool ExportOfdFile(const std::string& devId, bool isAuto, const std::string &fileName); bool ExportOfdFile(const std::string& devId, bool isAuto, HGByte **data, HGUInt *size); // 生成PDF bool ExportPdf(const std::string& devId, std::string& imgBase64); + bool ExportPdfFile(const std::string& devId, const std::string& fileName); bool ExportPdfFile(const std::string& devId, HGByte** data, HGUInt* size); // 生成TIFF bool ExportTiff(const std::string& devId, std::string& imgBase64); + bool ExportTiff(const std::string& devId, const std::string& fileName); bool ExportTiffFile(const std::string& devId, HGByte** data, HGUInt* size); // 生成ZIP bool ExportZip(const std::string& devId, std::string& imgBase64); + bool ExportZipFile(const std::string& devId, const std::string& fileName); bool ExportZipFile(const std::string& devId, HGByte** data, HGUInt* size); // 上传图像 bool UploadImage(const UploadParam& uploadParam); @@ -161,6 +167,10 @@ private: static std::string GetBase64(const std::string& fileName); static HGByte* GetBuffer(const std::string& fileName, HGUInt *size); static bool SaveBase64(const std::string& fileName, const char *base64); + static bool HTTPUpload(const std::string& localFileName, const std::string& httpUrl, const std::string& remoteFileName, + const std::string &httpMethod, const std::string& header, const std::string& param); + static bool FTPUpload(const std::string& localFileName, const std::string& ftpUrl, int ftpPort, const std::string& ftpPath, + const std::string& ftpUser, const std::string& ftpPassword, int ftpMode); static int sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned int* len, void* param); private: diff --git a/sdk/webservice/MsgLoop.cpp b/sdk/webservice/MsgLoop.cpp index 4fdba7d2..3bd6bca0 100644 --- a/sdk/webservice/MsgLoop.cpp +++ b/sdk/webservice/MsgLoop.cpp @@ -6,22 +6,44 @@ MsgLoop::MsgLoop() HGBase_CreateLock(&m_msgLock); m_bRecvMsg = HGTRUE; - m_manager = new Manager(this); - m_wsServer = new WebServer(this, ServerType_Ws, 1); - m_httpServer = new WebServer(this, ServerType_Http, 2); - m_sockIoServer = new WebServer(this, ServerType_SockIo, 3); + if (1) // 使用旧协议 + { + m_manager = new Manager(this); + m_httpServer = new WebServer(this, ServerType_Http); + m_sockIoServer = new WebServer(this, ServerType_SockIo); + m_wsServer = NULL; + } + else // 使用新协议 + { + m_manager = NULL; + m_httpServer = NULL; + m_sockIoServer = NULL; + m_wsServer = new WebServer(this, ServerType_Ws); + } } MsgLoop::~MsgLoop() { - delete m_sockIoServer; - m_sockIoServer = NULL; - delete m_httpServer; - m_httpServer = NULL; - delete m_wsServer; - m_wsServer = NULL; - delete m_manager; - m_manager = NULL; + if (NULL != m_wsServer) + { + delete m_wsServer; + m_wsServer = NULL; + } + if (NULL != m_sockIoServer) + { + delete m_sockIoServer; + m_sockIoServer = NULL; + } + if (NULL != m_httpServer) + { + delete m_httpServer; + m_httpServer = NULL; + } + if (NULL != m_manager) + { + delete m_manager; + m_manager = NULL; + } HGBase_DestroyLock(m_msgLock); m_msgLock = NULL; @@ -54,9 +76,12 @@ bool MsgLoop::Send(const WebMsg* msg) void MsgLoop::Loop() { - m_wsServer->Open(38999); - m_httpServer->Open(18999); - m_sockIoServer->Open(28999); + if (NULL != m_httpServer) + m_httpServer->Open(18999); + if (NULL != m_sockIoServer) + m_sockIoServer->Open(28999); + if (NULL != m_wsServer) + m_wsServer->Open(38999); while (1) { @@ -73,46 +98,56 @@ void MsgLoop::Loop() if (0 != msg.msgId) { - if (0 == msg.svrId) + if (0 == msg.svrType) { assert(0 == msg.usrId); if (WEB_MSGID_QUIT == msg.msgId) { assert(NULL == msg.param); - m_wsServer->Close(); - m_httpServer->Close(); - m_sockIoServer->Close(); + + if (NULL != m_wsServer) + m_wsServer->Close(); + if (NULL != m_sockIoServer) + m_sockIoServer->Close(); + if (NULL != m_httpServer) + m_httpServer->Close(); } else if (WEB_MSGID_OPENDEV == msg.msgId) { assert(NULL != msg.param); OpenDevParam* param = (OpenDevParam*)msg.param; - m_manager->OpenDev(param); + if (NULL != m_manager) + m_manager->OpenDev(param); delete param; } else if (WEB_MSGID_CLOSEDEV == msg.msgId) { assert(NULL != msg.param); CloseDevParam* param = (CloseDevParam*)msg.param; - m_manager->CloseDev(param); + if (NULL != m_manager) + m_manager->CloseDev(param); delete param; } - else if (WEB_MSGID_STOPSCAN == msg.msgId) + else if (WEB_MSGID_SCANFINISH == msg.msgId) { assert(NULL == msg.param); - m_manager->StopScan(); + if (NULL != m_manager) + m_manager->ScanFinish(); } } - else if (1 == msg.svrId) + else if (ServerType_Ws == msg.svrType) { + assert(NULL != m_wsServer); m_wsServer->HandleMsg(&msg); } - else if (2 == msg.svrId) + else if (ServerType_Http == msg.svrType) { + assert(NULL != m_httpServer); m_httpServer->HandleMsg(&msg); } - else if (3 == msg.svrId) + else if (ServerType_SockIo == msg.svrType) { + assert(NULL != m_sockIoServer); m_sockIoServer->HandleMsg(&msg); } } diff --git a/sdk/webservice/MsgLoop.h b/sdk/webservice/MsgLoop.h index cc15ea1e..66dbc0e3 100644 --- a/sdk/webservice/MsgLoop.h +++ b/sdk/webservice/MsgLoop.h @@ -27,9 +27,9 @@ private: std::list m_listMsg; Manager *m_manager; - WebServer *m_wsServer; WebServer *m_httpServer; WebServer *m_sockIoServer; + WebServer* m_wsServer; }; #endif /* __MSGLOOP_H__ */ diff --git a/sdk/webservice/SockIoUser.cpp b/sdk/webservice/SockIoUser.cpp index f41acb99..46033dd5 100644 --- a/sdk/webservice/SockIoUser.cpp +++ b/sdk/webservice/SockIoUser.cpp @@ -109,7 +109,7 @@ void SockIoUser::ThreadFunc() // 这里跳出,可能是服务器关闭了socketConn,或者客户端关闭了socket,或者网络断开 WebMsg msg; msg.msgId = WEB_MSGID_DISCONNET; - msg.svrId = m_server->GetId(); + msg.svrType = m_server->GetType(); msg.usrId = m_id; msg.param = NULL; GetLoop()->Send(&msg); @@ -154,7 +154,7 @@ void SockIoUser::ThreadFunc() { WebMsg msg; msg.msgId = WEB_MSGID_DISCONNET; - msg.svrId = m_server->GetId(); + msg.svrType = m_server->GetType(); msg.usrId = m_id; msg.param = NULL; GetLoop()->Send(&msg); @@ -182,7 +182,7 @@ void SockIoUser::ThreadFunc() { WebMsg msg; msg.msgId = WEB_MSGID_DISCONNET; - msg.svrId = m_server->GetId(); + msg.svrType = m_server->GetType(); msg.usrId = m_id; msg.param = NULL; GetLoop()->Send(&msg); @@ -214,7 +214,7 @@ void SockIoUser::ThreadFunc() { WebMsg msg; msg.msgId = WEB_MSGID_DISCONNET; - msg.svrId = m_server->GetId(); + msg.svrType = m_server->GetType(); msg.usrId = m_id; msg.param = NULL; GetLoop()->Send(&msg); @@ -227,7 +227,7 @@ void SockIoUser::ThreadFunc() { WebMsg msg; msg.msgId = WEB_MSGID_DISCONNET; - msg.svrId = m_server->GetId(); + msg.svrType = m_server->GetType(); msg.usrId = m_id; msg.param = NULL; GetLoop()->Send(&msg); @@ -240,7 +240,7 @@ void SockIoUser::ThreadFunc() { WebMsg msg; msg.msgId = WEB_MSGID_DISCONNET; - msg.svrId = m_server->GetId(); + msg.svrType = m_server->GetType(); msg.usrId = m_id; msg.param = NULL; GetLoop()->Send(&msg); @@ -253,7 +253,7 @@ void SockIoUser::ThreadFunc() { WebMsg msg; msg.msgId = WEB_MSGID_DISCONNET; - msg.svrId = m_server->GetId(); + msg.svrType = m_server->GetType(); msg.usrId = m_id; msg.param = NULL; GetLoop()->Send(&msg); @@ -271,7 +271,7 @@ void SockIoUser::ThreadFunc() { WebMsg msg; msg.msgId = WEB_MSGID_DISCONNET; - msg.svrId = m_server->GetId(); + msg.svrType = m_server->GetType(); msg.usrId = m_id; msg.param = NULL; GetLoop()->Send(&msg); @@ -306,7 +306,7 @@ void SockIoUser::ThreadFunc() { WebMsg msg; msg.msgId = WEB_MSGID_DISCONNET; - msg.svrId = m_server->GetId(); + msg.svrType = m_server->GetType(); msg.usrId = m_id; msg.param = NULL; GetLoop()->Send(&msg); @@ -345,7 +345,7 @@ void SockIoUser::ThreadFunc() { WebMsg msg; msg.msgId = WEB_MSGID_DISCONNET; - msg.svrId = m_server->GetId(); + msg.svrType = m_server->GetType(); msg.usrId = m_id; msg.param = NULL; GetLoop()->Send(&msg); @@ -411,7 +411,7 @@ void SockIoUser::ThreadFunc() WebMsg msg; msg.msgId = WEB_MSGID_SOCKIOCMD; - msg.svrId = m_server->GetId(); + msg.svrType = m_server->GetType(); msg.usrId = m_id; msg.param = param; bool b = GetLoop()->Send(&msg); @@ -487,7 +487,7 @@ void SockIoUser::ScanCallback(HGUInt event, void* value1, void* value2, void* pa WebMsg msg; msg.msgId = WEB_MSGID_SOCKIORET; - msg.svrId = p->m_server->GetId(); + msg.svrType = p->m_server->GetType(); msg.usrId = p->m_id; msg.param = param; bool b = p->GetLoop()->Send(&msg); diff --git a/sdk/webservice/WebMsg.h b/sdk/webservice/WebMsg.h index fdda1692..c8e00fe2 100644 --- a/sdk/webservice/WebMsg.h +++ b/sdk/webservice/WebMsg.h @@ -6,24 +6,24 @@ #include "HttpHead.h" #include -#define WEB_MSGID_QUIT 1 -#define WEB_MSGID_CONNET 2 -#define WEB_MSGID_DISCONNET 3 -#define WEB_MSGID_WSCMD 4 -#define WEB_MSGID_HTTPCMD 5 -#define WEB_MSGID_SOCKIOCMD 6 -#define WEB_MSGID_WSRET 7 -#define WEB_MSGID_HTTPRET 8 -#define WEB_MSGID_SOCKIORET 9 -#define WEB_MSGID_OPENDEV 10 -#define WEB_MSGID_CLOSEDEV 11 -#define WEB_MSGID_STOPSCAN 12 +#define WEB_MSGID_QUIT 1 +#define WEB_MSGID_CONNET 2 +#define WEB_MSGID_DISCONNET 3 +#define WEB_MSGID_WSCMD 4 +#define WEB_MSGID_HTTPCMD 5 +#define WEB_MSGID_SOCKIOCMD 6 +#define WEB_MSGID_WSRET 7 +#define WEB_MSGID_HTTPRET 8 +#define WEB_MSGID_SOCKIORET 9 +#define WEB_MSGID_OPENDEV 10 +#define WEB_MSGID_CLOSEDEV 11 +#define WEB_MSGID_SCANFINISH 12 struct WebMsg { HGUInt msgId; /* WEB_MSGID_** */ - HGUInt svrId; /* serverId */ - HGUInt usrId; /* userId */ + HGUInt svrType; /* svrType */ + HGUInt usrId; /* usrId */ HGPointer param; /* param */ }; diff --git a/sdk/webservice/WebServer.cpp b/sdk/webservice/WebServer.cpp index 45e1cb65..37e95f1d 100644 --- a/sdk/webservice/WebServer.cpp +++ b/sdk/webservice/WebServer.cpp @@ -5,11 +5,10 @@ #include "SockIoUser.h" #include "../../base/HGInfo.h" -WebServer::WebServer(class MsgLoop* loop, HGUInt type, HGUInt id) +WebServer::WebServer(class MsgLoop* loop, HGUInt type) { m_loop = loop; m_type = type; - m_id = id; m_currUserId = 1; #if defined(HG_CMP_MSC) @@ -35,11 +34,6 @@ HGUInt WebServer::GetType() return m_type; } -HGUInt WebServer::GetId() -{ - return m_id; -} - bool WebServer::Open(HGUShort port) { #if defined(HG_CMP_MSC) @@ -140,7 +134,7 @@ bool WebServer::Close() void WebServer::HandleMsg(const WebMsg* msg) { assert(NULL != msg); - assert(msg->svrId == m_id); + assert(msg->svrType == m_type); if (WEB_MSGID_CONNET == msg->msgId) { @@ -291,7 +285,7 @@ void WebServer::ThreadFunc(HGThread thread, HGPointer param) WebMsg msg; msg.msgId = WEB_MSGID_CONNET; - msg.svrId = p->m_id; + msg.svrType = p->m_type; msg.usrId = 0; msg.param = param; bool b = p->m_loop->Send(&msg); diff --git a/sdk/webservice/WebServer.h b/sdk/webservice/WebServer.h index 1aafb3b5..8049d17b 100644 --- a/sdk/webservice/WebServer.h +++ b/sdk/webservice/WebServer.h @@ -14,12 +14,11 @@ class WebServer { public: - WebServer(class MsgLoop *loop, HGUInt type, HGUInt id); + WebServer(class MsgLoop *loop, HGUInt type); ~WebServer(); class MsgLoop* GetLoop(); HGUInt GetType(); - HGUInt GetId(); bool Open(HGUShort port); bool Close(); @@ -32,7 +31,6 @@ private: private: class MsgLoop* m_loop; HGUInt m_type; - HGUInt m_id; HGUInt m_currUserId; #if defined(HG_CMP_MSC) diff --git a/sdk/webservice/WsUser.cpp b/sdk/webservice/WsUser.cpp index a61e0db0..6cdc69c4 100644 --- a/sdk/webservice/WsUser.cpp +++ b/sdk/webservice/WsUser.cpp @@ -62,7 +62,7 @@ void WsUser::ThreadFunc() // 这里跳出,可能是服务器关闭了socketConn,或者客户端关闭了socket,或者网络断开 WebMsg msg; msg.msgId = WEB_MSGID_DISCONNET; - msg.svrId = m_server->GetId(); + msg.svrType = m_server->GetType(); msg.usrId = m_id; msg.param = NULL; GetLoop()->Send(&msg); @@ -107,7 +107,7 @@ void WsUser::ThreadFunc() { WebMsg msg; msg.msgId = WEB_MSGID_DISCONNET; - msg.svrId = m_server->GetId(); + msg.svrType = m_server->GetType(); msg.usrId = m_id; msg.param = NULL; GetLoop()->Send(&msg); @@ -135,7 +135,7 @@ void WsUser::ThreadFunc() { WebMsg msg; msg.msgId = WEB_MSGID_DISCONNET; - msg.svrId = m_server->GetId(); + msg.svrType = m_server->GetType(); msg.usrId = m_id; msg.param = NULL; GetLoop()->Send(&msg); @@ -167,7 +167,7 @@ void WsUser::ThreadFunc() { WebMsg msg; msg.msgId = WEB_MSGID_DISCONNET; - msg.svrId = m_server->GetId(); + msg.svrType = m_server->GetType(); msg.usrId = m_id; msg.param = NULL; GetLoop()->Send(&msg); @@ -180,7 +180,7 @@ void WsUser::ThreadFunc() { WebMsg msg; msg.msgId = WEB_MSGID_DISCONNET; - msg.svrId = m_server->GetId(); + msg.svrType = m_server->GetType(); msg.usrId = m_id; msg.param = NULL; GetLoop()->Send(&msg); @@ -193,7 +193,7 @@ void WsUser::ThreadFunc() { WebMsg msg; msg.msgId = WEB_MSGID_DISCONNET; - msg.svrId = m_server->GetId(); + msg.svrType = m_server->GetType(); msg.usrId = m_id; msg.param = NULL; GetLoop()->Send(&msg); @@ -206,7 +206,7 @@ void WsUser::ThreadFunc() { WebMsg msg; msg.msgId = WEB_MSGID_DISCONNET; - msg.svrId = m_server->GetId(); + msg.svrType = m_server->GetType(); msg.usrId = m_id; msg.param = NULL; GetLoop()->Send(&msg); @@ -224,7 +224,7 @@ void WsUser::ThreadFunc() { WebMsg msg; msg.msgId = WEB_MSGID_DISCONNET; - msg.svrId = m_server->GetId(); + msg.svrType = m_server->GetType(); msg.usrId = m_id; msg.param = NULL; GetLoop()->Send(&msg); @@ -259,7 +259,7 @@ void WsUser::ThreadFunc() { WebMsg msg; msg.msgId = WEB_MSGID_DISCONNET; - msg.svrId = m_server->GetId(); + msg.svrType = m_server->GetType(); msg.usrId = m_id; msg.param = NULL; GetLoop()->Send(&msg); @@ -298,7 +298,7 @@ void WsUser::ThreadFunc() { WebMsg msg; msg.msgId = WEB_MSGID_DISCONNET; - msg.svrId = m_server->GetId(); + msg.svrType = m_server->GetType(); msg.usrId = m_id; msg.param = NULL; GetLoop()->Send(&msg); @@ -356,7 +356,7 @@ void WsUser::ThreadFunc() WebMsg msg; msg.msgId = WEB_MSGID_WSCMD; - msg.svrId = m_server->GetId(); + msg.svrType = m_server->GetType(); msg.usrId = m_id; msg.param = param; bool b = GetLoop()->Send(&msg);