增加立思辰定制websdk

This commit is contained in:
luoliangyi 2022-09-06 16:27:58 +08:00
parent a8bd4fee99
commit 2b976c6c2a
13 changed files with 3001 additions and 0 deletions

View File

@ -58,6 +58,13 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "HGScannerLib", "HGScannerLi
{4909ACEA-80FF-482E-9FA2-5E8534789A82} = {4909ACEA-80FF-482E-9FA2-5E8534789A82}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "HGWebScan", "HGWebScan\HGWebScan.vcxproj", "{2A4A0C71-D333-4978-B7C4-08401230E0A5}"
ProjectSection(ProjectDependencies) = postProject
{F85F4457-1B42-46E7-BA86-F088D6D5994F} = {F85F4457-1B42-46E7-BA86-F088D6D5994F}
{5D85F2AC-FACD-436C-A67B-E13056DD0C03} = {5D85F2AC-FACD-436C-A67B-E13056DD0C03}
{4909ACEA-80FF-482E-9FA2-5E8534789A82} = {4909ACEA-80FF-482E-9FA2-5E8534789A82}
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
@ -230,6 +237,22 @@ Global
{62CAD8E9-4461-49A1-8EB8-4CEBE113FE02}.Release|x64.Build.0 = Release|x64
{62CAD8E9-4461-49A1-8EB8-4CEBE113FE02}.Release|x86.ActiveCfg = Release|Win32
{62CAD8E9-4461-49A1-8EB8-4CEBE113FE02}.Release|x86.Build.0 = Release|Win32
{2A4A0C71-D333-4978-B7C4-08401230E0A5}.Debug|x64.ActiveCfg = Debug|x64
{2A4A0C71-D333-4978-B7C4-08401230E0A5}.Debug|x64.Build.0 = Debug|x64
{2A4A0C71-D333-4978-B7C4-08401230E0A5}.Debug|x86.ActiveCfg = Debug|Win32
{2A4A0C71-D333-4978-B7C4-08401230E0A5}.Debug|x86.Build.0 = Debug|Win32
{2A4A0C71-D333-4978-B7C4-08401230E0A5}.HWRelease|x64.ActiveCfg = HWRelease|x64
{2A4A0C71-D333-4978-B7C4-08401230E0A5}.HWRelease|x64.Build.0 = HWRelease|x64
{2A4A0C71-D333-4978-B7C4-08401230E0A5}.HWRelease|x86.ActiveCfg = HWRelease|Win32
{2A4A0C71-D333-4978-B7C4-08401230E0A5}.HWRelease|x86.Build.0 = HWRelease|Win32
{2A4A0C71-D333-4978-B7C4-08401230E0A5}.LSCRelease|x64.ActiveCfg = LSCRelease|x64
{2A4A0C71-D333-4978-B7C4-08401230E0A5}.LSCRelease|x64.Build.0 = LSCRelease|x64
{2A4A0C71-D333-4978-B7C4-08401230E0A5}.LSCRelease|x86.ActiveCfg = LSCRelease|Win32
{2A4A0C71-D333-4978-B7C4-08401230E0A5}.LSCRelease|x86.Build.0 = LSCRelease|Win32
{2A4A0C71-D333-4978-B7C4-08401230E0A5}.Release|x64.ActiveCfg = Release|x64
{2A4A0C71-D333-4978-B7C4-08401230E0A5}.Release|x64.Build.0 = Release|x64
{2A4A0C71-D333-4978-B7C4-08401230E0A5}.Release|x86.ActiveCfg = Release|Win32
{2A4A0C71-D333-4978-B7C4-08401230E0A5}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@ -0,0 +1,353 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="HWRelease|Win32">
<Configuration>HWRelease</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="HWRelease|x64">
<Configuration>HWRelease</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="LSCRelease|Win32">
<Configuration>LSCRelease</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="LSCRelease|x64">
<Configuration>LSCRelease</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\..\..\sdk\webscan\HttpHead.cpp" />
<ClCompile Include="..\..\..\sdk\webscan\main.cpp" />
<ClCompile Include="..\..\..\sdk\webscan\MsgPumpCallback.cpp" />
<ClCompile Include="..\..\..\sdk\webscan\WebServer.cpp" />
<ClCompile Include="..\..\..\sdk\webscan\WebUser.cpp" />
<ClCompile Include="..\..\..\third_party\base64\base64.cpp" />
<ClCompile Include="..\..\..\third_party\json\cJSON.c" />
<ClCompile Include="..\..\..\third_party\sha1\sha1.cpp" />
<ClCompile Include="..\..\..\utility\HGString.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\..\sdk\webscan\HttpHead.h" />
<ClInclude Include="..\..\..\sdk\webscan\Msg.h" />
<ClInclude Include="..\..\..\sdk\webscan\MsgPumpCallback.h" />
<ClInclude Include="..\..\..\sdk\webscan\WebServer.h" />
<ClInclude Include="..\..\..\sdk\webscan\WebUser.h" />
<ClInclude Include="..\..\..\third_party\base64\base64.h" />
<ClInclude Include="..\..\..\third_party\json\cJSON.h" />
<ClInclude Include="..\..\..\third_party\sha1\sha1.h" />
<ClInclude Include="..\..\..\utility\HGString.h" />
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>16.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword>
<ProjectGuid>{2A4A0C71-D333-4978-B7C4-08401230E0A5}</ProjectGuid>
<RootNamespace>HGWebScan</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='HWRelease|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LSCRelease|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='HWRelease|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LSCRelease|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='HWRelease|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='LSCRelease|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='HWRelease|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='LSCRelease|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='HWRelease|Win32'">
<LinkIncremental>false</LinkIncremental>
<TargetName>HWWebScan</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LSCRelease|Win32'">
<LinkIncremental>false</LinkIncremental>
<TargetName>LSCWebScan</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='HWRelease|x64'">
<LinkIncremental>false</LinkIncremental>
<TargetName>HWWebScan</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='LSCRelease|x64'">
<LinkIncremental>false</LinkIncremental>
<TargetName>LSCWebScan</TargetName>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_CONSOLE;_WINSOCK_DEPRECATED_NO_WARNINGS;ZIP_STATIC;CURL_STATICLIB;_CRT_SECURE_NO_WARNINGS;OEM_HUAGAO;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<AdditionalIncludeDirectories>../../../modules/;../../../third_party/sha1/;../../../third_party/base64/;../../../third_party/json/;../../../third_party/sqlite/;../../../utility/;../../../third_party/libzip/windows/include/;../../../third_party/libcurl/windows/include/;../../../../sdk/include/;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<DisableSpecificWarnings>28251;26812;%(DisableSpecificWarnings)</DisableSpecificWarnings>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>../Debug/HGBase.lib;../Debug/HGImgFmt.lib;../Debug/HGImgProc.lib;../../../../sdk/lib/win/x86/OEM/huagao/sane.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)</AdditionalDependencies>
<AdditionalOptions>/ignore:4098,4099,4075 %(AdditionalOptions)</AdditionalOptions>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_CONSOLE;_WINSOCK_DEPRECATED_NO_WARNINGS;ZIP_STATIC;CURL_STATICLIB;_CRT_SECURE_NO_WARNINGS;OEM_HUAGAO;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<AdditionalIncludeDirectories>../../../modules/;../../../third_party/sha1/;../../../third_party/base64/;../../../third_party/json/;../../../third_party/sqlite/;../../../utility/;../../../third_party/libzip/windows/include/;../../../third_party/libcurl/windows/include/;../../../../sdk/include/;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>../Release/HGBase.lib;../Release/HGImgFmt.lib;../Release/HGImgProc.lib;../../../../sdk/lib/win/x86/OEM/huagao/sane.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)</AdditionalDependencies>
<AdditionalOptions>/ignore:4099 /LTCG %(AdditionalOptions)</AdditionalOptions>
</Link>
<PostBuildEvent>
<Command>copy $(OutDir)HGWebScan.exe $(SolutionDir)..\..\..\release\win\x86\Release\</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='HWRelease|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_CONSOLE;_WINSOCK_DEPRECATED_NO_WARNINGS;ZIP_STATIC;CURL_STATICLIB;_CRT_SECURE_NO_WARNINGS;OEM_HANWANG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<AdditionalIncludeDirectories>../../../modules/;../../../third_party/sha1/;../../../third_party/base64/;../../../third_party/json/;../../../third_party/sqlite/;../../../utility/;../../../third_party/libzip/windows/include/;../../../third_party/libcurl/windows/include/;../../../../sdk/include/;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>../HWRelease/HWBase.lib;../HWRelease/HWImgFmt.lib;../HWRelease/HWImgProc.lib;../../../../sdk/lib/win/x86/OEM/hanvon/sane.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)</AdditionalDependencies>
<AdditionalOptions>/ignore:4099 /LTCG %(AdditionalOptions)</AdditionalOptions>
</Link>
<PostBuildEvent>
<Command>copy $(OutDir)HWWebScan.exe $(SolutionDir)..\..\..\release\win\x86\Release\</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='LSCRelease|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_CONSOLE;_WINSOCK_DEPRECATED_NO_WARNINGS;ZIP_STATIC;CURL_STATICLIB;_CRT_SECURE_NO_WARNINGS;OEM_LISICHENG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<AdditionalIncludeDirectories>../../../modules/;../../../third_party/sha1/;../../../third_party/base64/;../../../third_party/json/;../../../third_party/sqlite/;../../../utility/;../../../third_party/libzip/windows/include/;../../../third_party/libcurl/windows/include/;../../../../sdk/include/;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>../LSCRelease/LSCBase.lib;../LSCRelease/LSCImgFmt.lib;../LSCRelease/LSCImgProc.lib;../../../../sdk/lib/win/x86/OEM/lanxum/sane.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)</AdditionalDependencies>
<AdditionalOptions>/ignore:4099 /LTCG %(AdditionalOptions)</AdditionalOptions>
</Link>
<PostBuildEvent>
<Command>copy $(OutDir)LSCWebScan.exe $(SolutionDir)..\..\..\release\win\x86\Release\</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_WINDOWS;_CONSOLE;_WINSOCK_DEPRECATED_NO_WARNINGS;ZIP_STATIC;CURL_STATICLIB;_CRT_SECURE_NO_WARNINGS;OEM_HUAGAO;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<AdditionalIncludeDirectories>../../../modules/;../../../third_party/sha1/;../../../third_party/base64/;../../../third_party/json/;../../../third_party/sqlite/;../../../utility/;../../../third_party/libzip/windows/include/;../../../third_party/libcurl/windows/include/;../../../../sdk/include/;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>../x64/Debug/HGBase.lib;../x64/Debug/HGImgFmt.lib;../x64/Debug/HGImgProc.lib;../../../../sdk/lib/win/x64/OEM/huagao/sane.lib;../../../third_party/zlib/windows/lib/x64/zlib.lib;../../../third_party/libzip/windows/lib/x64/zip.lib;../../../third_party/libcurl/windows/lib/x64/libcurld.lib;wldap32.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalOptions>/ignore:4098,4099,4075 %(AdditionalOptions)</AdditionalOptions>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_WINDOWS;_CONSOLE;_WINSOCK_DEPRECATED_NO_WARNINGS;ZIP_STATIC;CURL_STATICLIB;_CRT_SECURE_NO_WARNINGS;OEM_HUAGAO;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<AdditionalIncludeDirectories>../../../modules/;../../../third_party/sha1/;../../../third_party/base64/;../../../third_party/json/;../../../third_party/sqlite/;../../../utility/;../../../third_party/libzip/windows/include/;../../../third_party/libcurl/windows/include/;../../../../sdk/include/;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>../x64/Release/HGBase.lib;../x64/Release/HGImgFmt.lib;../x64/Release/HGImgProc.lib;../../../../sdk/lib/win/x64/OEM/huagao/sane.lib;../../../third_party/zlib/windows/lib/x64/zlib.lib;../../../third_party/libzip/windows/lib/x64/zip.lib;../../../third_party/libcurl/windows/lib/x64/libcurl.lib;wldap32.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalOptions>/ignore:4099 /LTCG %(AdditionalOptions)</AdditionalOptions>
</Link>
<PostBuildEvent>
<Command>copy $(OutDir)HGWebScan.exe $(SolutionDir)..\..\..\release\win\x64\Release\</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='HWRelease|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_WINDOWS;_CONSOLE;_WINSOCK_DEPRECATED_NO_WARNINGS;ZIP_STATIC;CURL_STATICLIB;_CRT_SECURE_NO_WARNINGS;OEM_HANWANG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<AdditionalIncludeDirectories>../../../modules/;../../../third_party/sha1/;../../../third_party/base64/;../../../third_party/json/;../../../third_party/sqlite/;../../../utility/;../../../third_party/libzip/windows/include/;../../../third_party/libcurl/windows/include/;../../../../sdk/include/;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>../x64/HWRelease/HWBase.lib;../x64/HWRelease/HWImgFmt.lib;../x64/HWRelease/HWImgProc.lib;../../../../sdk/lib/win/x64/OEM/hanvon/sane.lib;../../../third_party/zlib/windows/lib/x64/zlib.lib;../../../third_party/libzip/windows/lib/x64/zip.lib;../../../third_party/libcurl/windows/lib/x64/libcurl.lib;wldap32.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalOptions>/ignore:4099 /LTCG %(AdditionalOptions)</AdditionalOptions>
</Link>
<PostBuildEvent>
<Command>copy $(OutDir)HWWebScan.exe $(SolutionDir)..\..\..\release\win\x64\Release\</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='LSCRelease|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_WINDOWS;_CONSOLE;_WINSOCK_DEPRECATED_NO_WARNINGS;ZIP_STATIC;CURL_STATICLIB;_CRT_SECURE_NO_WARNINGS;OEM_LISICHENG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<AdditionalIncludeDirectories>../../../modules/;../../../third_party/sha1/;../../../third_party/base64/;../../../third_party/json/;../../../third_party/sqlite/;../../../utility/;../../../third_party/libzip/windows/include/;../../../third_party/libcurl/windows/include/;../../../../sdk/include/;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>../x64/LSCRelease/LSCBase.lib;../x64/LSCRelease/LSCImgFmt.lib;../x64/LSCRelease/LSCImgProc.lib;../../../../sdk/lib/win/x64/OEM/lanxum/sane.lib;../../../third_party/zlib/windows/lib/x64/zlib.lib;../../../third_party/libzip/windows/lib/x64/zip.lib;../../../third_party/libcurl/windows/lib/x64/libcurl.lib;wldap32.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalOptions>/ignore:4099 /LTCG %(AdditionalOptions)</AdditionalOptions>
</Link>
<PostBuildEvent>
<Command>copy $(OutDir)LSCWebScan.exe $(SolutionDir)..\..\..\release\win\x64\Release\</Command>
</PostBuildEvent>
</ItemDefinitionGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

438
sdk/webscan/HttpHead.cpp Normal file
View File

@ -0,0 +1,438 @@
#include "HttpHead.h"
const unsigned int asciiTableData[256] =
{
0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004,
0x004, 0x104, 0x104, 0x004, 0x104, 0x104, 0x004, 0x004,
0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004,
0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004, 0x004,
0x140, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0,
0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0,
0x459, 0x459, 0x459, 0x459, 0x459, 0x459, 0x459, 0x459,
0x459, 0x459, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0,
0x0d0, 0x653, 0x653, 0x653, 0x653, 0x653, 0x653, 0x253,
0x253, 0x253, 0x253, 0x253, 0x253, 0x253, 0x253, 0x253,
0x253, 0x253, 0x253, 0x253, 0x253, 0x253, 0x253, 0x253,
0x253, 0x253, 0x253, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x0d0,
0x0d0, 0x473, 0x473, 0x473, 0x473, 0x473, 0x473, 0x073,
0x073, 0x073, 0x073, 0x073, 0x073, 0x073, 0x073, 0x073,
0x073, 0x073, 0x073, 0x073, 0x073, 0x073, 0x073, 0x073,
0x073, 0x073, 0x073, 0x0d0, 0x0d0, 0x0d0, 0x0d0, 0x004
/* the upper 128 are all zeroes */
};
static void TrimString(std::string& str)
{
std::string str1;
bool add1 = false;
std::string::const_iterator iter1;
for (iter1 = str.begin(); iter1 != str.end(); ++iter1)
{
int c = (HGByte)(*iter1);
if (!add1)
{
if (!isspace(c))
{
str1.push_back(c);
add1 = true;
}
}
else
{
str1.push_back(c);
}
}
if (str1.empty())
{
str.clear();
return;
}
std::string str2;
bool add2 = false;
std::string::const_reverse_iterator iter2;
for (iter2 = str1.rbegin(); iter2 != str1.rend(); ++iter2)
{
int c = (HGByte)(*iter2);
if (!add2)
{
if (!isspace(c))
{
str2.push_back(c);
add2 = true;
}
}
else
{
str2.push_back(c);
}
}
if (str2.empty())
{
str.clear();
return;
}
str = std::string(str2.rbegin(), str2.rend());
}
HttpHead::HttpHead()
{
}
HttpHead::~HttpHead()
{
}
bool HttpHead::Parse(const std::string& head)
{
AnalysisHead(head, m_requestMethod, m_requestURIPath, m_requestURIQueryInfos,
m_requestURIFragment, m_requestHttpVersion, m_headInfos);
return true;
}
void HttpHead::Clear()
{
m_requestMethod.clear();
m_requestURIPath.clear();
m_requestURIQueryInfos.clear();
m_requestURIFragment.clear();
m_requestHttpVersion.clear();
m_headInfos.clear();
}
std::string HttpHead::GetRequestMethod() const
{
return m_requestMethod;
}
std::string HttpHead::GetRequestURIPath() const
{
return m_requestURIPath;
}
HttpPairs HttpHead::GetRequestURIQueryInfos() const
{
return m_requestURIQueryInfos;
}
std::string HttpHead::GetRequestURIFragment() const
{
return m_requestURIFragment;
}
std::string HttpHead::GetRequestHttpVersion() const
{
return m_requestHttpVersion;
}
HttpPairs HttpHead::GetHeadInfos() const
{
return m_headInfos;
}
int HttpHead::GetContentLength() const
{
int len = 0;
for (int i = 0; i < (int)m_headInfos.size(); ++i)
{
#if defined(HG_CMP_MSC)
if (0 == _stricmp("Content-Length", m_headInfos[i].first.c_str()))
#else
if (0 == strcasecmp("Content-Length", m_headInfos[i].first.c_str()))
#endif
{
len = atoi(m_headInfos[i].second.c_str());
break;
}
}
return len;
}
std::string HttpHead::GetContentType() const
{
std::string type;
for (int i = 0; i < (int)m_headInfos.size(); ++i)
{
#if defined(HG_CMP_MSC)
if (0 == _stricmp("Content-Type", m_headInfos[i].first.c_str()))
#else
if (0 == strcasecmp("Content-Type", m_headInfos[i].first.c_str()))
#endif
{
type = m_headInfos[i].second.c_str();
break;
}
}
return type;
}
std::string HttpHead::GetValue(const HttpPairs& infos, const std::string& key)
{
std::string value;
for (int i = 0; i < (int)infos.size(); ++i)
{
if (key == infos[i].first)
{
value = infos[i].second;
break;
}
}
return value;
}
void HttpHead::AnalysisURIQuery(const std::string& query, HttpPairs& queryInfos)
{
std::vector<std::string> queryList;
char* p = new char[query.size() + 1];
strcpy(p, query.c_str());
char* pStr = strtok(p, "&");
if (NULL != pStr)
queryList.push_back(pStr);
while (1)
{
pStr = strtok(NULL, "&");
if (NULL == pStr)
break;
queryList.push_back(pStr);
}
delete[] p;
queryInfos.clear();
for (int i = 0; i < (int)queryList.size(); ++i)
{
p = new char[queryList[i].size() + 1];
strcpy(p, queryList[i].c_str());
std::pair <std::string, std::string> pr;
pStr = strtok(p, "=");
if (NULL != pStr)
pr.first = AnalyURIString(pStr);
pStr = strtok(NULL, "=");
if (NULL != pStr)
pr.second = AnalyURIString(pStr);
queryInfos.push_back(pr);
delete[] p;
}
}
void HttpHead::AnalysisURI(const std::string& uri, std::string& path, HttpPairs& queryInfos, std::string& fragment)
{
size_t pathPos = uri.find('/');
size_t queryPos = uri.find('?');
size_t fragmentPos = uri.find('#');
path.clear();
if (std::string::npos != pathPos)
{
size_t count = std::string::npos;
if (queryPos != std::string::npos)
{
assert(queryPos > pathPos);
count = queryPos - pathPos;
}
else if (fragmentPos != std::string::npos)
{
assert(fragmentPos > pathPos);
count = fragmentPos - pathPos;
}
path = AnalyURIString(uri.substr(pathPos, count));
}
queryInfos.clear();
if (std::string::npos != queryPos)
{
size_t count = std::string::npos;
if (fragmentPos != std::string::npos)
{
assert(fragmentPos > queryPos);
count = fragmentPos - queryPos;
}
std::string query = uri.substr(queryPos + 1, count - 1);
AnalysisURIQuery(query, queryInfos);
}
fragment.clear();
if (std::string::npos != fragmentPos)
{
fragment = AnalyURIString(uri.substr(fragmentPos + 1));
}
}
void HttpHead::AnalysisHead(const std::string& head, std::string& requestMethod, std::string& requestURIPath,
HttpPairs& requestURIQueryInfos, std::string& requestURIFragment, std::string& httpVersion, HttpPairs& headInfos)
{
requestMethod.clear();
requestURIPath.clear();
requestURIQueryInfos.clear();
requestURIFragment.clear();
httpVersion.clear();
headInfos.clear();
std::vector<std::string> headList;
char* p = new char[head.size() + 1];
strcpy(p, head.c_str());
char* pStr = strtok(p, "\r\n");
if (NULL != pStr)
headList.push_back(pStr);
while (1)
{
pStr = strtok(NULL, "\r\n");
if (NULL == pStr)
break;
headList.push_back(pStr);
}
delete[] p;
if (headList.size() < 1)
{
return;
}
std::string requestURI;
// 解析请求行
p = new char[headList[0].size() + 1];
strcpy(p, headList[0].c_str());
pStr = strtok(p, " ");
if (NULL != pStr)
requestMethod = pStr;
pStr = strtok(NULL, " ");
if (NULL != pStr)
requestURI = pStr;
pStr = strtok(NULL, " ");
if (NULL != pStr)
httpVersion = pStr;
delete[] p;
// 解析URI
AnalysisURI(requestURI, requestURIPath, requestURIQueryInfos, requestURIFragment);
// 解析请求头
for (int i = 1; i < (int)headList.size(); ++i)
{
p = new char[headList[i].size() + 1];
strcpy(p, headList[i].c_str());
std::pair <std::string, std::string> pr;
pStr = strtok(p, ":");
if (NULL != pStr)
pr.first = pStr;
pStr = strtok(NULL, ":");
if (NULL != pStr)
pr.second = pStr;
TrimString(pr.first);
TrimString(pr.second);
headInfos.push_back(pr);
delete[] p;
}
}
/*判断ascii码是否是数字0-9*/
static bool asciiIsDigit(char c)
{
/*字符的ascii码&8 结果为0-127则是数字*/
return asciiTableData[(unsigned char)c & (1 << 3)];
}
static int asciiDigitValue(char c)
{
if (asciiIsDigit(c))
return c - '0';
return -1;
}
static int asciiXdigitValue(char c)
{
//printf("-->%c\n",c);
if (c >= 'A' && c <= 'F')
return c - 'A' + 10;//(A B C D E F)->(10 11 12 13 14 15)
if (c >= 'a' && c <= 'f')
return c - 'a' + 10;
return asciiDigitValue(c);//('0'...'9')->(0...9)
}
static int unescapeCharacter(const char* scanner)
{
int first = asciiXdigitValue(scanner[0]);
if (first < 0)
return -1;
int second = asciiXdigitValue(scanner[1]);
if (second < 0)
return -1;
return (first << 4) | second; //== (first*16 | second) == (first*16 + second)
}
static char* unescapeUriString(const char* uriString, bool asciiEscape)
{
if (NULL == uriString)
return NULL;
int strLen = (int)strlen(uriString);
char* result = (char*)malloc(strLen + 1);//可推测解码后的长度<=原长度
char* out = result;
const char* in, * end;
for (in = uriString, end = in + strLen; in < end; ++in)
{
int c = *in;
//遇到了'%'才去解析
if ('%' == c)
{
if (in + 3 > end)
break;
//获取%后2个字符的解码值
c = unescapeCharacter(in + 1);
if (c <= 0)
break;
if (asciiEscape && c <= 0x7F)
break;
in += 2;//一般的格式为%后加两个ascii码字符
}
*out++ = c;//存储转义结果
}
*out = '\0';
if (in != end)
{
free(result);
return NULL;
}
return result;
}
std::string HttpHead::AnalyURIString(const std::string& str)
{
std::string ret;
char* decodeStr = unescapeUriString(str.c_str(), false);
if (NULL != decodeStr)
{
ret = decodeStr;
free(decodeStr);
}
return ret;
}

45
sdk/webscan/HttpHead.h Normal file
View File

@ -0,0 +1,45 @@
#pragma once
#include "base/HGDef.h"
#include "base/HGInc.h"
#include <string>
#include <vector>
typedef std::pair<std::string, std::string> HttpPair;
typedef std::vector<HttpPair> HttpPairs;
class HttpHead
{
public:
HttpHead();
~HttpHead();
bool Parse(const std::string& head);
void Clear();
std::string GetRequestMethod() const;
std::string GetRequestURIPath() const;
HttpPairs GetRequestURIQueryInfos() const;
std::string GetRequestURIFragment() const;
std::string GetRequestHttpVersion() const;
HttpPairs GetHeadInfos() const;
int GetContentLength() const;
std::string GetContentType() const;
static std::string GetValue(const HttpPairs& infos, const std::string& key);
static void AnalysisURIQuery(const std::string& query, HttpPairs& queryInfos);
static void AnalysisURI(const std::string& uri, std::string& path, HttpPairs& queryInfos, std::string& fragment);
static void AnalysisHead(const std::string& head, std::string& requestMethod, std::string& requestURIPath,
HttpPairs& requestURIQueryInfos, std::string& requestURIFragment, std::string& httpVersion, HttpPairs& headInfos);
private:
static std::string AnalyURIString(const std::string& str);
private:
std::string m_requestMethod;
std::string m_requestURIPath;
HttpPairs m_requestURIQueryInfos;
std::string m_requestURIFragment;
std::string m_requestHttpVersion;
HttpPairs m_headInfos;
};

65
sdk/webscan/Msg.h Normal file
View File

@ -0,0 +1,65 @@
#pragma once
#include "base/HGDef.h"
#include "base/HGInc.h"
#include <string>
#include "HttpHead.h"
enum
{
MSGID_CONNECT = 1L,
MSGID_DISCONNECT,
MSGID_CLOSE_DEVICE,
MSGID_SCAN_FINISH,
MSGID_WS_COMMAND,
MSGID_WS_EVENT
};
class WebServer;
struct ConnectParam
{
WebServer* svr;
std::string ip;
HGUShort port;
#if defined(HG_CMP_MSC)
SOCKET socket;
#else
int socket;
#endif
};
struct DisConnectParam
{
WebServer* svr;
HGUInt usrId;
};
struct CloseDevParam
{
WebServer* svr;
HGUInt usrId;
std::string devName;
};
struct ScanFinishParam
{
WebServer* svr;
HGUInt usrId;
};
struct WSCmdParam
{
WebServer* svr;
HGUInt usrId;
HGByte* data;
HGUInt size;
};
struct WSEvtParam
{
WebServer* svr;
HGUInt usrId;
HGByte* data;
HGUInt size;
};

View File

@ -0,0 +1,57 @@
#include "MsgPumpCallback.h"
#include "base/HGDef.h"
#include "base/HGInc.h"
#include "WebServer.h"
void HGMsgPumpCallback(HGMsgPump msgPump, const HGMsg* msg, HGPointer param)
{
(void)msgPump;
(void)param;
assert(NULL != msg);
switch (msg->id)
{
case MSGID_CONNECT:
{
ConnectParam* param = (ConnectParam*)msg->data;
param->svr->Connect(param);
delete param;
}
break;
case MSGID_DISCONNECT:
{
DisConnectParam* param = (DisConnectParam*)msg->data;
param->svr->DisConnect(param);
delete param;
}
break;
case MSGID_CLOSE_DEVICE:
{
CloseDevParam* param = (CloseDevParam*)msg->data;
param->svr->CloseDev(param);
delete param;
}
break;
case MSGID_SCAN_FINISH:
{
ScanFinishParam* param = (ScanFinishParam*)msg->data;
param->svr->ScanFinish(param);
delete param;
}
break;
case MSGID_WS_COMMAND:
{
WSCmdParam* param = (WSCmdParam*)msg->data;
param->svr->Command(param);
delete param;
}
break;
case MSGID_WS_EVENT:
{
WSEvtParam* param = (WSEvtParam*)msg->data;
param->svr->Event(param);
delete param;
}
break;
}
}

View File

@ -0,0 +1,5 @@
#pragma once
#include "base/HGMsgPump.h"
void HGMsgPumpCallback(HGMsgPump msgPump, const HGMsg* msg, HGPointer param);

262
sdk/webscan/WebServer.cpp Normal file
View File

@ -0,0 +1,262 @@
#include "WebServer.h"
#include "WebUser.h"
#include "base/HGInfo.h"
WebServer::WebServer(HGMsgPump msgPump)
{
m_msgPump = msgPump;
m_currUserId = 1;
#if defined(HG_CMP_MSC)
m_sockServer = INVALID_SOCKET;
#else
m_sockServer = -1;
#endif
m_listenThread = NULL;
}
WebServer::~WebServer()
{
}
bool WebServer::Open(HGUShort port)
{
#if defined(HG_CMP_MSC)
if (INVALID_SOCKET != m_sockServer)
#else
if (-1 != m_sockServer)
#endif
{
return false;
}
#if defined(HG_CMP_MSC)
SOCKET sockServer = socket(AF_INET, SOCK_STREAM, 0);
if (INVALID_SOCKET == sockServer)
#else
int sockServer = socket(AF_INET, SOCK_STREAM, 0);
if (-1 == sockServer)
#endif
{
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "open webserver failed 1, port=%u", port);
return false;
}
// bind
#if defined(HG_CMP_MSC)
SOCKADDR_IN addrServer;
addrServer.sin_addr.S_un.S_addr = INADDR_ANY;
addrServer.sin_family = AF_INET;
addrServer.sin_port = htons(port);
if (0 != bind(sockServer, (SOCKADDR*)&addrServer, sizeof(SOCKADDR_IN)))
#else
struct sockaddr_in addrServer;
addrServer.sin_addr.s_addr = htonl(INADDR_ANY);
addrServer.sin_family = AF_INET;
addrServer.sin_port = htons(port);
if (0 != bind(sockServer, (struct sockaddr*)&addrServer, sizeof(addrServer)))
#endif
{
#if defined(HG_CMP_MSC)
closesocket(sockServer);
#else
close(sockServer);
#endif
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "open webserver failed 2, port=%u", port);
return false;
}
// listen
if (0 != listen(sockServer, 5))
{
#if defined(HG_CMP_MSC)
closesocket(sockServer);
#else
close(sockServer);
#endif
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "open webserver failed 3, port=%u", port);
return false;
}
m_sockServer = sockServer;
HGBase_OpenThread(ThreadFunc, this, &m_listenThread);
assert(NULL != m_listenThread);
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "open webserver success, port=%u", port);
return true;
}
bool WebServer::Close()
{
#if defined(HG_CMP_MSC)
if (INVALID_SOCKET == m_sockServer)
#else
if (-1 == m_sockServer)
#endif
{
return false;
}
while (!m_vectorUser.empty())
{
WebUser* pUser = m_vectorUser[0];
m_vectorUser.erase(m_vectorUser.begin());
delete pUser;
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;
}
void WebServer::Connect(const ConnectParam* param)
{
assert(NULL != param && this == param->svr);
if (!m_vectorUser.empty())
{
#if defined(HG_CMP_MSC)
closesocket(param->socket);
#else
close(param->socket);
#endif
return;
}
WebUser* user = new WebUser(this, m_currUserId, m_msgPump, param->ip, param->port, param->socket);
++m_currUserId;
m_vectorUser.push_back(user);
}
void WebServer::DisConnect(const DisConnectParam* param)
{
assert(NULL != param && this == param->svr);
int nIndex = GetUserIndex(param->usrId);
if (-1 != nIndex)
{
WebUser* pUser = m_vectorUser[nIndex];
m_vectorUser.erase(m_vectorUser.begin() + nIndex);
delete pUser;
pUser = NULL;
}
}
void WebServer::CloseDev(const CloseDevParam* param)
{
assert(NULL != param && this == param->svr);
int nIndex = GetUserIndex(param->usrId);
if (-1 != nIndex)
{
((WebUser*)m_vectorUser[nIndex])->CloseDev(param);
}
}
void WebServer::ScanFinish(const ScanFinishParam* param)
{
assert(NULL != param && this == param->svr);
int nIndex = GetUserIndex(param->usrId);
if (-1 != nIndex)
{
((WebUser*)m_vectorUser[nIndex])->ScanFinish(param);
}
}
void WebServer::Command(const WSCmdParam* param)
{
assert(NULL != param && this == param->svr);
int nIndex = GetUserIndex(param->usrId);
if (-1 != nIndex)
{
((WebUser*)m_vectorUser[nIndex])->HandleCmd(param);
}
}
void WebServer::Event(const WSEvtParam* param)
{
assert(NULL != param && this == param->svr);
int nIndex = GetUserIndex(param->usrId);
if (-1 != nIndex)
{
((WebUser*)m_vectorUser[nIndex])->HandleEvent(param);
}
}
#if defined(HG_CMP_MSC)
void WebServer::PostConnectMsg(const std::string& ip, uint16_t port, SOCKET sockConn)
#else
void WebServer::PostConnectMsg(const std::string& ip, uint16_t port, int sockConn)
#endif
{
ConnectParam* param = new ConnectParam;
param->svr = this;
param->ip = ip;
param->port = port;
param->socket = sockConn;
HGMsg msg;
msg.id = MSGID_CONNECT;
msg.data = param;
if (HGBASE_ERR_OK != HGBase_PostPumpMessage(m_msgPump, &msg))
{
#if defined(HG_CMP_MSC)
closesocket(param->socket);
#else
close(param->socket);
#endif
delete param;
}
}
int WebServer::GetUserIndex(HGUInt id)
{
int nIndex = -1;
for (int i = 0; i < (int)m_vectorUser.size(); ++i)
{
if (id == m_vectorUser[i]->GetId())
{
nIndex = i;
break;
}
}
return nIndex;
}
void WebServer::ThreadFunc(HGThread thread, HGPointer param)
{
WebServer* p = (WebServer*)param;
while (1)
{
#if defined(HG_CMP_MSC)
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR_IN);
SOCKET socketConn = accept(p->m_sockServer, (SOCKADDR*)&addrClient, &len);
if (INVALID_SOCKET == socketConn)
#else
struct sockaddr_in addrClient;
socklen_t len = sizeof(addrClient);
int socketConn = accept(p->m_sockServer, (struct sockaddr*)&addrClient, &len);
if (-1 == socketConn)
#endif
{
// 这里跳出可能是服务器关闭了m_sockServer
break;
}
p->PostConnectMsg(inet_ntoa(addrClient.sin_addr), ntohs(addrClient.sin_port), socketConn);
}
}

46
sdk/webscan/WebServer.h Normal file
View File

@ -0,0 +1,46 @@
#pragma once
#include "base/HGDef.h"
#include "base/HGInc.h"
#include "base/HGThread.h"
#include "base/HGMsgPump.h"
#include "Msg.h"
#include <vector>
class WebServer
{
public:
WebServer(HGMsgPump msgPump);
~WebServer();
bool Open(HGUShort port);
bool Close();
void Connect(const ConnectParam* param);
void DisConnect(const DisConnectParam* param);
void CloseDev(const CloseDevParam* param);
void ScanFinish(const ScanFinishParam* param);
void Command(const WSCmdParam* param);
void Event(const WSEvtParam* param);
private:
#if defined(HG_CMP_MSC)
void PostConnectMsg(const std::string &ip, uint16_t port, SOCKET sockConn);
#else
void PostConnectMsg(const std::string &ip, uint16_t port, int sockConn);
#endif
int GetUserIndex(HGUInt id);
static void ThreadFunc(HGThread thread, HGPointer param);
private:
HGMsgPump m_msgPump;
HGUInt m_currUserId;
#if defined(HG_CMP_MSC)
SOCKET m_sockServer;
#else
int m_sockServer;
#endif
HGThread m_listenThread;
std::vector<class WebUser*> m_vectorUser;
};

1389
sdk/webscan/WebUser.cpp Normal file

File diff suppressed because it is too large Load Diff

78
sdk/webscan/WebUser.h Normal file
View File

@ -0,0 +1,78 @@
#pragma once
#include "base/HGDef.h"
#include "base/HGInc.h"
#include "base/HGLock.h"
#include "base/HGEvent.h"
#include "base/HGThread.h"
#include "base/HGImage.h"
#include "base/HGMsgPump.h"
#include "Msg.h"
#include "cJSON.h"
#include "sane/sane_ex.h"
#include "sane/sane_option_definitions.h"
#include <string>
class WebServer;
class WebUser
{
public:
#if defined(HG_CMP_MSC)
WebUser(WebServer* server, HGUInt id, HGMsgPump msgPump, const std::string& ip, uint16_t port, SOCKET sockConn);
#else
WebUser(WebServer* server, HGUInt id, HGMsgPump msgPump, const std::string& ip, uint16_t port, int sockConn);
#endif
~WebUser();
HGUInt GetId();
void CloseDev(const CloseDevParam* param);
void ScanFinish(const ScanFinishParam* param);
void HandleCmd(const WSCmdParam* param);
void HandleEvent(const WSEvtParam* param);
private:
void GetDeviceList(cJSON *json);
void SelectDevice(cJSON* json);
void SetScanColorType(cJSON* json);
void SetDPI(cJSON* json);
void SetDuplex(cJSON* json);
void SetScanJPGQuality(cJSON* json);
void StartScan(cJSON* json);
private:
void PostDisConnectMsg();
void PostCmdMsg(const HGByte* data, HGUInt dataSize);
void PostEventMsg(const HGByte* data, HGUInt dataSize);
static void 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);
HGBool SetParam(const char* optionName, const HGVoid* data);
HGInt GetDpi();
bool ShakeHand(const std::string& head);
void Pong();
bool SendResponse(const HGByte* data, HGUInt size, HGBool text);
private:
HGLock m_lock;
HGLock m_lockName;
WebServer* m_server;
HGUInt m_id;
HGMsgPump m_msgPump;
std::string m_ip;
uint16_t m_port;
#if defined(HG_CMP_MSC)
SOCKET m_sockConn;
#else
int m_sockConn;
#endif
HGThread m_thread;
int m_jpgQuality;
std::vector<std::string> m_devNameList;
std::string m_devName;
SANE_Handle m_devHandle;
int m_dpi;
HGEvent m_scanEvent;
};

50
sdk/webscan/main.cpp Normal file
View File

@ -0,0 +1,50 @@
#include "base/HGDef.h"
#include "base/HGInc.h"
#include "base/HGThread.h"
#include "base/HGMsgPump.h"
#include "WebServer.h"
#include "MsgPumpCallback.h"
static void ThreadFunc(HGThread thread, HGPointer param)
{
(void)thread;
HGMsgPump msgPump = (HGMsgPump)param;
WebServer wsServer(msgPump);
HGInt port = 9458;
if (wsServer.Open(port))
{
HGBase_RunMsgPump(msgPump, HGMsgPumpCallback, NULL);
wsServer.Close();
}
}
#if defined(HG_CMP_MSC)
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE iPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
#else
int main()
#endif
{
#if defined(HG_CMP_MSC)
WSADATA ws = { 0 };
int ret = WSAStartup(MAKEWORD(2, 2), &ws);
assert(0 == ret);
#endif
HGMsgPump msgPump = NULL;
HGBase_CreateMsgPump(&msgPump);
HGThread thread = NULL;
HGBase_OpenThread(ThreadFunc, msgPump, &thread);
HGBase_CloseThread(thread);
thread = NULL;
HGBase_DestroyMsgPump(msgPump);
msgPump = NULL;
#if defined(HG_CMP_MSC)
WSACleanup();
#endif
return 0;
}

190
test/webscan/demo.html Normal file
View File

@ -0,0 +1,190 @@
<html>
<title>Test</title>
<meta charset="utf-8"/>
<head>
<script type="text/javascript">
var socket;
function connect()
{
var host = "ws://" + $("serverIP").value + ":" + $("serverPort").value + "/"
socket = new WebSocket(host);
try
{
socket.onopen = function (msg)
{
$("serverIP").disabled = true;
$("serverPort").disabled = true;
$("btnConnect").disabled = true;
$("btnDisConnect").disabled = false;
};
socket.onclose = function (msg)
{
var myimg = document.getElementById("myCanvas");
myimg.src = null;
$("serverIP").disabled = false;
$("serverPort").disabled = false;
$("btnConnect").disabled = false;
$("btnDisConnect").disabled = true;
};
socket.onmessage = function (msg)
{
if (typeof msg.data == "string")
{
var message = JSON.parse(msg.data);
if ("GetDeviceList" == message['Func'])
{
alert(msg.data);
}
else if ("SelectDevice" == message['Func'])
{
alert(msg.data);
}
else if ("SetScanColorType" == message['Func'])
{
alert(msg.data);
}
else if ("SetDPI" == message['Func'])
{
alert(msg.data);
}
else if ("SetDuplex" == message['Func'])
{
alert(msg.data);
}
else if ("SetScanJPGQuality" == message['Func'])
{
alert(msg.data);
}
else if ("StartScan" == message['Func'])
{
alert(msg.data);
}
else if ("ImageSaveDone" == message['Func'])
{
myCanvas.src = "data:image/jpeg;base64," + message['result'];
}
else if ("ScanComplete" == message['Func'])
{
alert(msg.data);
}
}
}
}
catch (ex)
{
log(ex);
}
}
function disconnect()
{
socket.close();
socket = null;
}
function GetDeviceList()
{
socket.send(JSON.stringify({
'Func':'GetDeviceList',
'arg':0
}));
}
function SelectDevice()
{
socket.send(JSON.stringify({
'Func':'SelectDevice',
'arg':0
}));
}
function SetScanColorType()
{
socket.send(JSON.stringify({
'Func':'SetScanColorType',
'arg':3
}));
}
function SetDPI()
{
socket.send(JSON.stringify({
'Func':'SetDPI',
'arg':200
}));
}
function SetDuplex()
{
socket.send(JSON.stringify({
'Func':'SetDuplex',
'arg':1
}));
}
function SetScanJPGQuality()
{
socket.send(JSON.stringify({
'Func':'SetScanJPGQuality',
'arg':60
}));
}
function StartScan()
{
socket.send(JSON.stringify({
'Func':'StartScan',
'arg':60
}));
}
window.onload = function()
{
var myimg = document.getElementById("myCanvas");
myimg.src = null;
$("serverIP").disabled = false;
$("serverPort").disabled = false;
$("btnConnect").disabled = false;
$("btnDisConnect").disabled = true;
connect();
}
window.onbeforeunload = function ()
{
disconnect();
};
function $(id)
{
return document.getElementById(id);
}
</script>
</head>
<body>
<input id="serverIP" type="text" placeholder="服务器IP" value="127.0.0.1" autofocus="autofocus" />
<input id="serverPort" type="text" placeholder="服务器端口" value="9458" />
<input id="btnConnect" type="button" value="连接" onclick="connect()" />
<input id="btnDisConnect" type="button" value="断开" onclick="disconnect()" />
<input type="button" value="GetDeviceList" onclick="GetDeviceList()" />
<input type="button" value="SelectDevice" onclick="SelectDevice()" />
<input type="button" value="SetScanColorType" onclick="SetScanColorType()" />
<input type="button" value="SetDPI" onclick="SetDPI()" />
<input type="button" value="SetDuplex" onclick="SetDuplex()" />
<input type="button" value="SetScanJPGQuality" onclick="SetScanJPGQuality()" />
<input type="button" value="StartScan" onclick="StartScan()" />
<br />
<br />
<img id="myCanvas" width='640' height='480' style="background-color: black; float: left;"/>
<input type="text" id="info" style="width:800px; height:80px;" />
</body>
</html>