#ifndef SIMPLEDS_HPP #define SIMPLEDS_HPP #include #include // #include #include #include #include #include #include "twpp.hpp" #include #include "s2t_api.h" namespace std { template<> struct hash { size_t operator()(Twpp::CapType cap) const { return hash()(static_cast(cap)); } }; } enum scanner_status { SCANNER_STATUS_NOT_INIT = 0, // has not call identityOpenDs or called identityCloseDs SCANNER_STATUS_READY, // called identityOpenDs SCANNER_STATUS_SCAN_1, // scanner_->start() should be called SCANNER_STATUS_SCANNING, // received SANE_EVENT_WORKING SCANNER_STATUS_STOPPED, // received SANE_EVENT_SCAN_FINISHED }; class huagao_ds : public Twpp::SourceFromThis { std::unordered_map> m_caps; std::unordered_map m_query; std::unordered_map org_func_; // std::unique_ptr scanner_; Twpp::SetupFileXfer m_fileXfer; Twpp::XferMech m_capXferMech = Twpp::XferMech::Native; std::unique_ptr memoryinfo; bool m_memoryfalg = true; bool m_bFeederEnabled = true; bool m_bAutoFeed = true; Twpp::Bool m_autoscan = true; int automaticcolortype_ = 0; bool multi_out_ = false; bool m_bIndicator = true; int m_jpegQuality = 80; Twpp::Compression m_compression = Twpp::Compression::None; SANE_Parameters* cur_head_; int dpi_; volatile int scanner_status_; bool xfer_ready_failed_; bool log_all_triple_; bool app_trigger_event_; bool bUiOnly_; bool show_setting_; bool no_bitdepth_ = false; // 军队扫描2.0.exe set this but sychronize to APP int count_; volatile bool notfify_close_ = false; enum {NOTIFY_AUTO = 0, NOTIFY_ALWAYS, NOTIFY_NONE}; volatile unsigned notify_close_ = 0; // 0 - auto; 1 - notify always; 2 - no notify enum {DOUBLE_CHECK_TWAIN = 1, DOUBLE_CHECK_ULTRASONIC, DOUBLE_CHECK_INFRARED}; // for BUG-402 volatile unsigned double_check_mode_ = 0; // 1 - standard twain protocol; 2 - bool for ultrasonic; 3 - bool for infrared std::mutex notify_close_lock_; std::unique_ptr notify_close_thread_; bool take_and_reset_notify_close_flag(void); void notify_close_thread(void); static std::string get_hidedlg_path(void); static void showmsg(const char* msg, int err); static int on_scanner_event(int ev, void* param); void CapabilityPrintf(Twpp::Msg msg, std::string capability, std::string value = ""); Twpp::Result capCommon(const Twpp::Identity& origin, Twpp::Msg msg, Twpp::Capability& data); Twpp::Result showTwainUI(Twpp::UserInterface& data, bool bUiOnly = false); void init_support_caps(int err); void init_caps_from_sane_directly(const std::vector& ids); std::string get_config_file(void); std::string get_config_value(const char* sec, const char* key); DWORD get_config_number(const char* sec, const char* key, DWORD def = 0, DWORD empty = 0); int handle_scanner_event(int ev, bool from_event_proc = true); int get_scanned_image_count(DWORD timeout); void trigger_ProcessEvent(Twpp::DataGroup dg, Twpp::Dat dat, Twpp::Msg msg); typedef struct _pending_xfer { IScanImg* img = nullptr; unsigned int off = 0; void clear(void) { if (img) img->release(); img = NULL; off = 0; } }PENDXFER; PENDXFER pending_xfer_; public: huagao_ds(); virtual ~huagao_ds(); static const Twpp::Identity& defaultIdentity() noexcept; static Twpp::Result selectIdentity(Twpp::Identity& ident) noexcept; static Twpp::ConditionCode condition_code_from_hg_error(int hgerr); // SourceFromThis interface protected: typedef Twpp::SourceFromThis Base; virtual Twpp::Result capabilityGet(const Twpp::Identity& origin, Twpp::Capability& data) override; virtual Twpp::Result capabilityGetCurrent(const Twpp::Identity& origin, Twpp::Capability& data) override; virtual Twpp::Result capabilityGetDefault(const Twpp::Identity& origin, Twpp::Capability& data) override; virtual Twpp::Result capabilityQuerySupport(const Twpp::Identity& origin, Twpp::Capability& data) override; virtual Twpp::Result capabilityReset(const Twpp::Identity& origin, Twpp::Capability& data) override; virtual Twpp::Result capabilityResetAll(const Twpp::Identity& origin) override; virtual Twpp::Result capabilitySet(const Twpp::Identity& origin, Twpp::Capability& data) override; virtual Twpp::Result eventProcess(const Twpp::Identity& origin, Twpp::Event& data) override; virtual Twpp::Result deviceEventGet(const Twpp::Identity& origin, Twpp::DeviceEvent& data) override; virtual Twpp::Result identityOpenDs(const Twpp::Identity& origin) override; virtual Twpp::Result identityCloseDs(const Twpp::Identity& origin) override; virtual Twpp::Result pendingXfersGet(const Twpp::Identity& origin, Twpp::PendingXfers& data) override; virtual Twpp::Result pendingXfersEnd(const Twpp::Identity& origin, Twpp::PendingXfers& data) override; virtual Twpp::Result pendingXfersReset(const Twpp::Identity& origin, Twpp::PendingXfers& data) override; virtual Twpp::Result setupMemXferGet(const Twpp::Identity& origin, Twpp::SetupMemXfer& data) override; virtual Twpp::Result userInterfaceDisable(const Twpp::Identity& origin, Twpp::UserInterface& data) override; virtual Twpp::Result userInterfaceEnable(const Twpp::Identity& origin, Twpp::UserInterface& data) override; virtual Twpp::Result userInterfaceEnableUiOnly(const Twpp::Identity& origin, Twpp::UserInterface& data) override; virtual Twpp::Result extImageInfoGet(const Twpp::Identity& origin, Twpp::ExtImageInfo& data) override; virtual Twpp::Result imageInfoGet(const Twpp::Identity& origin, Twpp::ImageInfo& data) override; virtual Twpp::Result imageLayoutGet(const Twpp::Identity& origin, Twpp::ImageLayout& data) override; virtual Twpp::Result imageLayoutGetDefault(const Twpp::Identity& origin, Twpp::ImageLayout& data) override; virtual Twpp::Result imageLayoutSet(const Twpp::Identity& origin, Twpp::ImageLayout& data) override; virtual Twpp::Result imageLayoutReset(const Twpp::Identity& origin, Twpp::ImageLayout& data) override; virtual Twpp::Result imageMemXferGet(const Twpp::Identity& origin, Twpp::ImageMemXfer& data) override; virtual Twpp::Result imageNativeXferGet(const Twpp::Identity& origin, Twpp::ImageNativeXfer& data) override; virtual Twpp::Result pendingXfersStopFeeder(const Twpp::Identity& origin, Twpp::PendingXfers& data) override; virtual Twpp::Result imageFileXferGet(const Twpp::Identity& origin) override; virtual Twpp::Result setupFileXferGet(const Twpp::Identity& origin, Twpp::SetupFileXfer& data) override; virtual Twpp::Result setupFileXferGetDefault(const Twpp::Identity& origin, Twpp::SetupFileXfer& data) override; virtual Twpp::Result setupFileXferSet(const Twpp::Identity& origin, Twpp::SetupFileXfer& data) override; virtual Twpp::Result setupFileXferReset(const Twpp::Identity& origin, Twpp::SetupFileXfer& data) override; virtual Twpp::Result call(const Twpp::Identity& origin, Twpp::DataGroup dg, Twpp::Dat dat, Twpp::Msg msg, void* data) override; virtual Twpp::Result customDataGet(const Twpp::Identity& origin, Twpp::CustomData& data) override; virtual Twpp::Result customDataSet(const Twpp::Identity& origin, Twpp::CustomData& data) override; public: void SetResoluton(const char* path, int resolution); }; #endif // SIMPLEDS_HPP