2023-07-10 07:28:45 +00:00
|
|
|
#ifndef SIMPLEDS_HPP
|
|
|
|
#define SIMPLEDS_HPP
|
|
|
|
|
|
|
|
#include <unordered_map>
|
|
|
|
#include <vector>
|
|
|
|
// #include <atlstr.h>
|
|
|
|
#include <functional>
|
|
|
|
#include <queue>
|
|
|
|
#include <string>
|
|
|
|
#include <thread>
|
|
|
|
#include "twpp.hpp"
|
2023-07-13 09:00:13 +00:00
|
|
|
#include "../sdk/hginclude/utils.h"
|
2023-07-10 07:28:45 +00:00
|
|
|
#include "s2t_api.h"
|
|
|
|
|
|
|
|
namespace std {
|
|
|
|
|
|
|
|
template<>
|
|
|
|
struct hash<Twpp::CapType> {
|
|
|
|
size_t operator()(Twpp::CapType cap) const {
|
|
|
|
return hash<Twpp::UInt16>()(static_cast<Twpp::UInt16>(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<huagao_ds> {
|
|
|
|
std::unordered_map<Twpp::CapType, std::function<Twpp::Result(Twpp::CapType type, Twpp::Msg msg, Twpp::Capability& data)>> m_caps;
|
|
|
|
std::unordered_map<Twpp::CapType, Twpp::MsgSupport> m_query;
|
|
|
|
std::unordered_map<int, int> org_func_; // <my id, function origin id>
|
|
|
|
std::unique_ptr <ISaneInvoker, delete_scanner> scanner_;
|
|
|
|
Twpp::SetupFileXfer m_fileXfer;
|
|
|
|
Twpp::XferMech m_capXferMech = Twpp::XferMech::Native;
|
|
|
|
std::unique_ptr<std::thread> 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_;
|
|
|
|
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<std::thread> 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(void);
|
|
|
|
void init_caps_from_sane_directly(void);
|
|
|
|
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);
|
|
|
|
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<huagao_ds> 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
|