@ -161,6 +161,191 @@ TWPP_ENTRY(huagao_ds)
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// utilites ...
// some helper functions to handle capability stuff
# define RETURN_ENUM_DESC(en, v, space) \
if ( v = = space : : en ) \
return L # # # en ;
const wchar_t * desc_state ( DsState s , wchar_t unk [ 20 ] )
{
RETURN_ENUM_DESC ( Closed , s , DsState ) ;
RETURN_ENUM_DESC ( Open , s , DsState ) ;
RETURN_ENUM_DESC ( Enabled , s , DsState ) ;
RETURN_ENUM_DESC ( XferReady , s , DsState ) ;
RETURN_ENUM_DESC ( Xferring , s , DsState ) ;
swprintf ( unk , L " %d " , s ) ;
return unk ;
}
const wchar_t * desc_data_group ( DataGroup d , wchar_t unk [ 20 ] )
{
RETURN_ENUM_DESC ( Control , d , DataGroup ) ;
RETURN_ENUM_DESC ( Image , d , DataGroup ) ;
RETURN_ENUM_DESC ( Audio , d , DataGroup ) ;
{
swprintf ( unk , L " %d " , d ) ;
return unk ;
}
}
const wchar_t * desc_data ( Dat d , wchar_t unk [ 20 ] )
{
RETURN_ENUM_DESC ( Null , d , Dat ) ;
RETURN_ENUM_DESC ( Capability , d , Dat ) ;
RETURN_ENUM_DESC ( Event , d , Dat ) ;
RETURN_ENUM_DESC ( Identity , d , Dat ) ;
RETURN_ENUM_DESC ( Parent , d , Dat ) ;
RETURN_ENUM_DESC ( PendingXfers , d , Dat ) ;
RETURN_ENUM_DESC ( SetupMemXfer , d , Dat ) ;
RETURN_ENUM_DESC ( SetupFileXfer , d , Dat ) ;
RETURN_ENUM_DESC ( Status , d , Dat ) ;
RETURN_ENUM_DESC ( UserInterface , d , Dat ) ;
RETURN_ENUM_DESC ( XferGroup , d , Dat ) ;
RETURN_ENUM_DESC ( CustomData , d , Dat ) ;
RETURN_ENUM_DESC ( DeviceEvent , d , Dat ) ;
RETURN_ENUM_DESC ( FileSystem , d , Dat ) ;
RETURN_ENUM_DESC ( PassThrough , d , Dat ) ;
RETURN_ENUM_DESC ( Callback , d , Dat ) ;
RETURN_ENUM_DESC ( StatusUtf8 , d , Dat ) ;
RETURN_ENUM_DESC ( Callback2 , d , Dat ) ;
RETURN_ENUM_DESC ( ImageInfo , d , Dat ) ;
RETURN_ENUM_DESC ( ImageLayout , d , Dat ) ;
RETURN_ENUM_DESC ( ImageMemXfer , d , Dat ) ;
RETURN_ENUM_DESC ( ImageNativeXfer , d , Dat ) ;
RETURN_ENUM_DESC ( ImageFileXfer , d , Dat ) ;
RETURN_ENUM_DESC ( CieColor , d , Dat ) ;
RETURN_ENUM_DESC ( GrayResponse , d , Dat ) ;
RETURN_ENUM_DESC ( RgbResponse , d , Dat ) ;
RETURN_ENUM_DESC ( JpegCompression , d , Dat ) ;
RETURN_ENUM_DESC ( Palette8 , d , Dat ) ;
RETURN_ENUM_DESC ( ExtImageInfo , d , Dat ) ;
RETURN_ENUM_DESC ( Filter , d , Dat ) ;
RETURN_ENUM_DESC ( AudioFileXfer , d , Dat ) ;
RETURN_ENUM_DESC ( AudioInfo , d , Dat ) ;
RETURN_ENUM_DESC ( AudioNativeXfer , d , Dat ) ;
RETURN_ENUM_DESC ( IccProfile , d , Dat ) ;
RETURN_ENUM_DESC ( ImageMemFileXfer , d , Dat ) ;
RETURN_ENUM_DESC ( EntryPoint , d , Dat ) ;
{
swprintf ( unk , L " %d " , d ) ;
return unk ;
}
}
const wchar_t * desc_msg ( Msg m , wchar_t unk [ 20 ] )
{
RETURN_ENUM_DESC ( Null , m , Msg ) ;
RETURN_ENUM_DESC ( Get , m , Msg ) ;
RETURN_ENUM_DESC ( GetCurrent , m , Msg ) ;
RETURN_ENUM_DESC ( GetDefault , m , Msg ) ;
RETURN_ENUM_DESC ( GetFirst , m , Msg ) ;
RETURN_ENUM_DESC ( GetNext , m , Msg ) ;
RETURN_ENUM_DESC ( Set , m , Msg ) ;
RETURN_ENUM_DESC ( Reset , m , Msg ) ;
RETURN_ENUM_DESC ( QuerySupport , m , Msg ) ;
RETURN_ENUM_DESC ( GetHelp , m , Msg ) ;
RETURN_ENUM_DESC ( GetLabel , m , Msg ) ;
RETURN_ENUM_DESC ( GetLabelEnum , m , Msg ) ;
RETURN_ENUM_DESC ( SetConstraint , m , Msg ) ;
RETURN_ENUM_DESC ( XferReady , m , Msg ) ;
RETURN_ENUM_DESC ( CloseDsReq , m , Msg ) ;
RETURN_ENUM_DESC ( CloseDsOk , m , Msg ) ;
RETURN_ENUM_DESC ( DeviceEvent , m , Msg ) ;
RETURN_ENUM_DESC ( OpenDsm , m , Msg ) ;
RETURN_ENUM_DESC ( CloseDsm , m , Msg ) ;
RETURN_ENUM_DESC ( OpenDs , m , Msg ) ;
RETURN_ENUM_DESC ( CloseDs , m , Msg ) ;
RETURN_ENUM_DESC ( UserSelect , m , Msg ) ;
RETURN_ENUM_DESC ( DisableDs , m , Msg ) ;
RETURN_ENUM_DESC ( EnableDs , m , Msg ) ;
RETURN_ENUM_DESC ( EnableDsUiOnly , m , Msg ) ;
RETURN_ENUM_DESC ( ProcessEvent , m , Msg ) ;
RETURN_ENUM_DESC ( EndXfer , m , Msg ) ;
RETURN_ENUM_DESC ( StopFeeder , m , Msg ) ;
RETURN_ENUM_DESC ( ChangeDir , m , Msg ) ;
RETURN_ENUM_DESC ( CreateDir , m , Msg ) ;
RETURN_ENUM_DESC ( Delete , m , Msg ) ;
RETURN_ENUM_DESC ( FormatMedia , m , Msg ) ;
RETURN_ENUM_DESC ( GetClose , m , Msg ) ;
RETURN_ENUM_DESC ( GetFirstFile , m , Msg ) ;
RETURN_ENUM_DESC ( GetInfo , m , Msg ) ;
RETURN_ENUM_DESC ( GetNextFile , m , Msg ) ;
RETURN_ENUM_DESC ( Rename , m , Msg ) ;
RETURN_ENUM_DESC ( Copy , m , Msg ) ;
RETURN_ENUM_DESC ( AutomaticCaptureDir , m , Msg ) ;
RETURN_ENUM_DESC ( PassThrough , m , Msg ) ;
RETURN_ENUM_DESC ( RegisterCallback , m , Msg ) ;
RETURN_ENUM_DESC ( ResetAll , m , Msg ) ;
RETURN_ENUM_DESC ( CustomBase , m , Msg ) ;
{
swprintf ( unk , L " %d " , m ) ;
return unk ;
}
}
const wchar_t * desc_return_code ( ReturnCode rc , wchar_t unk [ 20 ] )
{
RETURN_ENUM_DESC ( Success , rc , ReturnCode ) ;
RETURN_ENUM_DESC ( Failure , rc , ReturnCode ) ;
RETURN_ENUM_DESC ( CheckStatus , rc , ReturnCode ) ;
RETURN_ENUM_DESC ( Cancel , rc , ReturnCode ) ;
RETURN_ENUM_DESC ( DsEvent , rc , ReturnCode ) ;
RETURN_ENUM_DESC ( NotDsEvent , rc , ReturnCode ) ;
RETURN_ENUM_DESC ( XferDone , rc , ReturnCode ) ;
RETURN_ENUM_DESC ( EndOfList , rc , ReturnCode ) ;
RETURN_ENUM_DESC ( InfoNotSupported , rc , ReturnCode ) ;
RETURN_ENUM_DESC ( DataNotAvailable , rc , ReturnCode ) ;
RETURN_ENUM_DESC ( Busy , rc , ReturnCode ) ;
RETURN_ENUM_DESC ( ScannerLocked , rc , ReturnCode ) ;
{
swprintf ( unk , L " %d " , rc ) ;
return unk ;
}
}
const wchar_t * desc_condition_code ( ConditionCode c , wchar_t unk [ 20 ] )
{
RETURN_ENUM_DESC ( Success , c , ConditionCode ) ;
RETURN_ENUM_DESC ( Bummer , c , ConditionCode ) ;
RETURN_ENUM_DESC ( LowMemory , c , ConditionCode ) ;
RETURN_ENUM_DESC ( NoDs , c , ConditionCode ) ;
RETURN_ENUM_DESC ( MaxConnections , c , ConditionCode ) ;
RETURN_ENUM_DESC ( OperationError , c , ConditionCode ) ;
RETURN_ENUM_DESC ( BadCap , c , ConditionCode ) ;
RETURN_ENUM_DESC ( BadProtocol , c , ConditionCode ) ;
RETURN_ENUM_DESC ( BadValue , c , ConditionCode ) ;
RETURN_ENUM_DESC ( SeqError , c , ConditionCode ) ;
RETURN_ENUM_DESC ( BadDest , c , ConditionCode ) ;
RETURN_ENUM_DESC ( CapUnsupported , c , ConditionCode ) ;
RETURN_ENUM_DESC ( CapBadOperation , c , ConditionCode ) ;
RETURN_ENUM_DESC ( CapSeqError , c , ConditionCode ) ;
RETURN_ENUM_DESC ( Denied , c , ConditionCode ) ;
RETURN_ENUM_DESC ( FileExists , c , ConditionCode ) ;
RETURN_ENUM_DESC ( FileNotFound , c , ConditionCode ) ;
RETURN_ENUM_DESC ( NotEmpty , c , ConditionCode ) ;
RETURN_ENUM_DESC ( PaperJam , c , ConditionCode ) ;
RETURN_ENUM_DESC ( PaperDoubleFeed , c , ConditionCode ) ;
RETURN_ENUM_DESC ( FileWriteError , c , ConditionCode ) ;
RETURN_ENUM_DESC ( CheckDeviceOnline , c , ConditionCode ) ;
RETURN_ENUM_DESC ( InterLock , c , ConditionCode ) ;
RETURN_ENUM_DESC ( DamagedCorner , c , ConditionCode ) ;
RETURN_ENUM_DESC ( FocusError , c , ConditionCode ) ;
RETURN_ENUM_DESC ( DocTooLight , c , ConditionCode ) ;
RETURN_ENUM_DESC ( DocTooDark , c , ConditionCode ) ;
RETURN_ENUM_DESC ( NoMedia , c , ConditionCode ) ;
{
swprintf ( unk , L " %d " , c ) ;
return unk ;
}
}
template < typename T >
static Result oneValGet ( Msg msg , Capability & data , const T & value ) {
switch ( msg ) {
@ -668,7 +853,7 @@ static const SCANNERID scanner_guid = MAKE_SCANNER_ID(PRODUCT_PID, PRODUCT_VID);
static std : : once_flag oc ;
huagao_ds : : huagao_ds ( ) : cur_head_ ( NULL ) , dpi_ ( 200 )
huagao_ds : : huagao_ds ( ) : cur_head_ ( NULL ) , dpi_ ( 200 ) , xfer_ready_failed_ ( false ) , log_all_triple_ ( false ) , scanner_status_ ( SCANNER_STATUS_NOT_INIT )
{
//std::call_once(oc, [&]() { log4cplus::Initializer(); });
}
@ -707,7 +892,7 @@ void huagao_ds::showmsg(const char* msg, int err)
}
int __stdcall huagao_ds : : on_scanner_event ( int ev , void * param )
{
return ( ( huagao_ds * ) param ) - > handle_scanner_event ( ev );
return ( ( huagao_ds * ) param ) - > handle_scanner_event ( ev , false );
}
const Identity & huagao_ds : : defaultIdentity ( ) noexcept {
@ -866,10 +1051,12 @@ Result huagao_ds::identityOpenDs(const Identity& id)
cur_head_ = new SANE_Parameters ;
memset ( cur_head_ , 0 , sizeof ( SANE_Parameters ) ) ;
}
log_all_triple_ = get_config_number ( L " twain-app " , L " log-all-triple " ) = = 1 ;
m_compression = Compression : : None ;
init_support_caps ( ) ;
m_fileXfer . setFormat ( ImageFileFormat : : Bmp ) ;
scanner_status_ = SCANNER_STATUS_READY ;
return success ( ) ;
}
@ -887,6 +1074,7 @@ Result huagao_ds::identityCloseDs(const Identity&)
singleton_ = NULL ;
}
load_sane_util : : uninitialize ( ) ;
scanner_status_ = SCANNER_STATUS_NOT_INIT ;
return success ( ) ;
}
@ -895,7 +1083,7 @@ Result huagao_ds::pendingXfersGet(const Identity&, PendingXfers& data)
if ( ! scanner_ . get ( ) )
return seqError ( ) ;
data . setCount ( scanner_- > get_scanned_images ( - 1 ) ) ;
data . setCount ( get_scanned_image_count ( - 1 ) ) ;
return success ( ) ;
}
Result huagao_ds : : pendingXfersEnd ( const Identity & id , PendingXfers & data )
@ -905,7 +1093,7 @@ Result huagao_ds::pendingXfersEnd(const Identity& id, PendingXfers& data)
Result huagao_ds : : pendingXfersReset ( const Identity & , PendingXfers & data )
{
pending_xfer_ . clear ( ) ;
data . setCount ( scanner_- > get_scanned_images ( - 1 ) ) ;
data . setCount ( get_scanned_image_count ( - 1 ) ) ;
return success ( ) ;
}
@ -915,7 +1103,7 @@ Result huagao_ds::setupMemXferGet(const Identity& id, SetupMemXfer& data)
size_t total = 0 ;
DWORD to = cur_head_ ? - 1 : 0 ;
if ( ! scanner_ . get ( ) | | scanner_- > get_scanned_images ( to ) = = 0 )
if ( ! scanner_ . get ( ) | | get_scanned_image_count ( to ) = = 0 )
{
if ( cur_head_ )
{
@ -969,7 +1157,10 @@ Result huagao_ds::userInterfaceEnable(const Identity&, UserInterface& ui)
if ( m_bIndicator & & ! scanner_ - > ui_show_progress ( ( HWND ) ui . parent ( ) . raw ( ) ) )
return seqError ( ) ;
xfer_ready_failed_ = false ;
scanner_ - > twain_set_transfer ( ( twain_xfer ) m_capXferMech ) ;
scanner_status_ = SCANNER_STATUS_SCAN_1 ;
app_trigger_event_ = false ;
int err = scanner_ - > start ( ) ;
if ( err = = SCANNER_ERR_OK )
{
@ -977,6 +1168,7 @@ Result huagao_ds::userInterfaceEnable(const Identity&, UserInterface& ui)
}
else
{
scanner_status_ = SCANNER_STATUS_READY ;
// if (err == SCANNER_ERR_DEVICE_NO_PAPER)
return { ReturnCode : : Failure , huagao_ds : : condition_code_from_hg_error ( err ) } ;
@ -1045,7 +1237,7 @@ Result huagao_ds::imageInfoGet(const Identity&, ImageInfo& data)
{
if ( ! scanner_ - > wait_image ( ) )
{
notifyCloseOk ( ) ;
// notifyCloseOk();
return success ( ) ; // ºÃ·ÖÊýÐèÒª·µ»Ø³É¹¦
}
ok = scanner_ - > get_first_image_header ( & head , NULL , & res ) ;
@ -1091,8 +1283,10 @@ Result huagao_ds::imageLayoutGet(const Identity&, ImageLayout& data)
{
SANE_Parameters head = { 0 } ;
if ( ! scanner_ . get ( ) | | scanner_ - > get_scanned_images ( - 1 ) = = 0 )
if ( ! scanner_ . get ( ) )
return seqError ( ) ;
else if ( get_scanned_image_count ( - 1 ) = = 0 )
return { ReturnCode : : XferDone , ConditionCode : : Success } ;
int res = 200 ;
@ -1126,13 +1320,15 @@ Result huagao_ds::imageMemXferGet(const Identity& origin, ImageMemXfer& data)
if ( ! scanner_ . get ( ) )
return seqError ( ) ;
if ( scanner_- > get_scanned_images ( - 1 ) = = 0 & & ! pending_xfer_ . img )
if ( get_scanned_image_count ( - 1 ) = = 0 & & ! pending_xfer_ . img )
{
if ( ! cur_head_ | | ! scanner_ - > wait_image ( ) )
{
notifyCloseOk ( ) ;
return seqError ( ) ;
}
//if (!cur_head_ || !scanner_->wait_image())
//{
// notifyCloseOk();
// return seqError();
//}
return { ReturnCode : : XferDone , ConditionCode : : Success } ;
}
IScanImg * img = pending_xfer_ . img ? pending_xfer_ . img : scanner_ - > take_first_image ( TWAIN_XFER_Memory ) ;
@ -1205,8 +1401,10 @@ Result huagao_ds::imageMemXferGet(const Identity& origin, ImageMemXfer& data)
}
Result huagao_ds : : imageNativeXferGet ( const Identity & id , ImageNativeXfer & data )
{
if ( ! scanner_ . get ( ) | | scanner_ - > get_scanned_images ( - 1 ) = = 0 )
if ( ! scanner_ . get ( ) )
return seqError ( ) ;
else if ( get_scanned_image_count ( - 1 ) = = 0 )
return { ReturnCode : : XferDone , ConditionCode : : Success } ;
IScanImg * img = scanner_ - > take_first_image ( TWAIN_XFER_Native ) ;
@ -1244,8 +1442,10 @@ Twpp::Result huagao_ds::pendingXfersStopFeeder(const Identity& origin, PendingXf
Twpp : : Result huagao_ds : : imageFileXferGet ( const Twpp : : Identity & origin )
{
// assume that the file format has set before start-scanning, so we write-down the image content to file directly here ...
if ( ! scanner_ . get ( ) | | scanner_ - > get_scanned_images ( - 1 ) = = 0 )
if ( ! scanner_ . get ( ) )
return seqError ( ) ;
else if ( get_scanned_image_count ( - 1 ) = = 0 )
return { ReturnCode : : XferDone , ConditionCode : : Success } ;
IScanImg * img = scanner_ - > take_first_image ( TWAIN_XFER_File ) ;
Twpp : : Result ret = seqError ( ) ;
@ -1410,14 +1610,19 @@ Result huagao_ds::call(const Identity& origin, DataGroup dg, Dat dat, Msg msg, v
try {
// we can override almost anything from SourceFromThis, even the top-most source instance call
//FileTools::write_log("D:\\1.txt", "call:datagroup-"+to_string((int)dg)+"dat-"+to_string(int(dat))+"msg-"+to_string(int(msg)));
if ( dat = = Dat : : ImageNativeXfer & & state ( ) = = DsState : : Enabled ) // 云阅卷扫描端不等状态改变,直接取图,此处设置一次状态 2022-11-07
Result rt ;
trigger_ProcessEvent ( dg , dat , msg ) ; // some APPs may be not trigger (Control, Event, ProcessEvent), we help them :( ... // 云阅卷扫描端不等状态改变,直接取图,此处设置一次状态 2022-11-07
rt = Base : : call ( origin , dg , dat , msg , data ) ;
if ( log_all_triple_ | | ( int ) rt . returnCode ( ) )
{
load_sane_util : : log_info ( L " APP SEQ ERROR: fetch image while status in 'Enabled' yet! we change it to 'XferReady' manually. \r \n " , 0 ) ;
notifyXferReady ( ) ;
wchar_t buf [ 128 ] = { 0 } , dgs [ 20 ] = { 0 } , dts [ 20 ] = { 0 } , ms [ 20 ] = { 0 } , ss [ 20 ] = { 0 } , rcs [ 20 ] = { 0 } , cs [ 20 ] = { 0 } ;
swprintf_s ( buf , _countof ( buf ) - 1 , L " [%x - %s]DSEntry(%s, %s, %s) = {%s, %s} \r \n " , GetCurrentThreadId ( ) , desc_state ( state ( ) , ss ) ,
desc_data_group ( dg , dgs ) , desc_data ( dat , dts ) , desc_msg ( msg , ms ) , desc_return_code ( rt , rcs ) , desc_condition_code ( ( ConditionCode ) ( Status ) rt , cs ) ) ;
load_sane_util : : log_info ( buf , 0 ) ;
}
return Base : : call ( origin , dg , dat , msg , data ) ;
return rt ;
}
catch ( const CapabilityException & e ) {
//FileTools::writelog(log_ERROR, e.what());
@ -3085,31 +3290,53 @@ void huagao_ds::init_support_caps_ex(void)
}
std : : wstring huagao_ds : : get_config_file ( void )
{
wchar_t path [ MAX_PATH ] = { 0 } , * name = NULL ;
char * tmp = getenv ( " LOCALAPPDATA " ) ;
if ( tmp )
{
std : : wstring str ( L " " ) ;
std : : string path ( tmp ) ;
GetModuleFileNameW ( me_ , path , _countof ( path ) - 1 ) ;
name = wcsrchr ( path , L ' \\ ' ) ;
if ( name + + = = NULL )
name = path ;
wcscpy_s ( name , _countof ( path ) - 1 - ( name - path ) , L " first.cfg " ) ;
path + = std : : string ( " \\ " ) + PRODUCT_VENDOR + " Scan \\ config \\ debug.cfg " ;
return path ;
return std : : move ( load_sane_util : : ansi2unic ( path . c_str ( ) ) ) ;
}
else
{
wchar_t path [ MAX_PATH ] = { 0 } , * name = NULL ;
GetModuleFileNameW ( me_ , path , _countof ( path ) - 1 ) ;
name = wcsrchr ( path , L ' \\ ' ) ;
if ( name + + = = NULL )
name = path ;
wcscpy_s ( name , _countof ( path ) - 1 - ( name - path ) , L " debug.cfg " ) ;
return path ;
}
}
std : : wstring huagao_ds : : get_config_value ( const wchar_t * sec , const wchar_t * key )
{
wchar_t v [ 256 ] = { 0 } ;
std : : wstring cfg_f ( get_config_file ( ) ) ;
GetPrivateProfileStringW ( sec , key , L " " , v , _countof ( v ) - 1 , get_config_file ( ) . c_str ( ) ) ;
if ( ! cfg_f . empty ( ) )
GetPrivateProfileStringW ( sec , key , L " " , v , _countof ( v ) - 1 , get_config_file ( ) . c_str ( ) ) ;
return v ;
}
DWORD huagao_ds : : get_config_number ( const wchar_t * sec , const wchar_t * key )
{
return GetPrivateProfileIntW ( sec , key , 0 , get_config_file ( ) . c_str ( ) ) ;
std : : wstring cfg_f ( get_config_file ( ) ) ;
if ( cfg_f . empty ( ) )
return 0 ;
else
return GetPrivateProfileIntW ( sec , key , 0 , get_config_file ( ) . c_str ( ) ) ;
}
int huagao_ds : : handle_scanner_event ( int ev )
int huagao_ds : : handle_scanner_event ( int ev , bool from_event_proc )
{
static int count_0 = 0 ;
ReturnCode rc = ReturnCode : : Success ;
int ret = 0 ;
if ( ev = = 0 )
count_0 + + ;
@ -3117,41 +3344,149 @@ int huagao_ds::handle_scanner_event(int ev)
{
wchar_t msg [ 128 ] = { 0 } ;
if ( count_0 )
swprintf_s ( msg , _countof ( msg ) - 1 , L " ds::eventProcess (0x0 +%d)\r \n ds::eventProcess(0x%x) \r \n " , count_0 , ev ) ;
swprintf_s ( msg , _countof ( msg ) - 1 , L " [%x]handle_scanner_event (0x0 +%d)\r \n ds::eventProcess(0x%x) \r \n " , GetCurrentThreadId ( ) , count_0 , ev ) ;
else
swprintf_s ( msg , _countof ( msg ) - 1 , L " ds::eventProcess(0x%x)\r \n " , ev ) ;
swprintf_s ( msg , _countof ( msg ) - 1 , L " [%x]handle_scanner_event(0x%x)\r \n " , GetCurrentThreadId ( ) , ev ) ;
load_sane_util : : log_info ( msg , 0 ) ;
count_0 = 0 ;
}
switch ( ev )
{
case SANE_EVENT_WORKING :
notifyXferReady ( ) ;
scanner_status_ = SCANNER_STATUS_SCANNING ;
rc = notifyXferReady ( ) ;
if ( ! Twpp : : success ( rc ) )
{
wchar_t msg [ 128 ] = { 0 } ;
swprintf_s ( msg , _countof ( msg ) - 1 , L " [%x]Warning: change state to XferReady failed with error %d while in state(%d), STOP scanning ... \r \n " , GetCurrentThreadId ( ) , rc , state ( ) ) ;
load_sane_util : : log_info ( msg , 0 ) ;
// we stop scanning here ...
scanner_ - > stop ( ) ;
}
break ;
case SANE_EVENT_UI_CLOSE_CANCEL :
scanner_ - > stop ( ) ;
// notifyEndWithoutImages();
notifyCloseCancel ( ) ; // 修复点击进度框"取消"按钮, UI不能正常结束的BUG - added on 2023-02-14
break ;
//notifyCloseCancel(); // 修复点击进度框"取消"按钮, UI不能正常结束的BUG - added on 2023-02-14
//break;
case SANE_EVENT_UI_CLOSE_NORMAL :
scanner_ - > ui_hide ( ) ;
case SANE_EVENT_SCAN_FINISHED :
scanner_status_ = SCANNER_STATUS_STOPPED ;
//notifyCloseOk();
//break;
case SANE_EVENT_UI_CLOSE_SETTING :
if ( m_bIndicator )
notifyCloseCancel ( ) ;
else
notifyXferReady ( ) ; // 好分数需要再通知 FAINT :( - modified on 2022-10-20
notifyCloseCancel ( ) ;
if ( ev = = SANE_EVENT_UI_CLOSE_SETTING )
{
rc = notifyXferReady ( ) ; // 好分数需要再通知 FAINT :( - modified on 2022-10-20
if ( ! Twpp : : success ( rc ) )
{
wchar_t msg [ 128 ] = { 0 } , unk [ 20 ] = { 0 } ;
swprintf_s ( msg , _countof ( msg ) - 1 , L " [%x]yscan: notifyXferReady failed after setting UI closed with error %d \r \n " , GetCurrentThreadId ( ) , rc ) ;
load_sane_util : : log_info ( msg , 0 ) ;
}
}
break ;
case SANE_EVENT_UI_SCAN_COMMAND :
scanner_ - > ui_show_progress ( NULL ) ;
scanner_ - > start ( ) ;
if ( m_bIndicator )
scanner_ - > ui_show_progress ( NULL ) ;
else
scanner_ - > ui_hide ( ) ;
scanner_status_ = SCANNER_STATUS_SCAN_1 ;
app_trigger_event_ = false ;
if ( ( ret = scanner_ - > start ( ) ) )
{
wchar_t msg [ 128 ] = { 0 } , unk [ 20 ] = { 0 } ;
swprintf_s ( msg , _countof ( msg ) - 1 , L " [%x - %s]Fatal: start scanning from setting UI failed with error %d \r \n " , GetCurrentThreadId ( ) , desc_state ( state ( ) , unk ) , ret ) ;
load_sane_util : : log_info ( msg , 0 ) ;
scanner_status_ = SCANNER_STATUS_STOPPED ;
rc = notifyCloseCancel ( ) ;
if ( Twpp : : success ( rc ) )
{
scanner_status_ = SCANNER_STATUS_READY ;
}
else
{
swprintf_s ( msg , _countof ( msg ) - 1 , L " [%x]Warning: notifyCloseCancel failed with error %d after start scanning failed \r \n " , GetCurrentThreadId ( ) , rc , state ( ) ) ;
load_sane_util : : log_info ( msg , 0 ) ;
}
}
break ;
}
return 0 ;
}
int huagao_ds : : get_scanned_image_count ( DWORD timeout )
{
int cnt = scanner_ - > get_scanned_images ( timeout ) ;
//if (cnt == -1)
//{
// // This is a special value indicates the scanning is over
// cnt = 0;
// scanner_->ui_hide();
// notifyCloseCancel();
//}
return cnt ;
}
void huagao_ds : : trigger_ProcessEvent ( Twpp : : DataGroup dg , Twpp : : Dat dat , Twpp : : Msg msg )
{
ReturnCode rc ;
if ( state ( ) = = DsState : : Enabled & & scanner_status_ > = SCANNER_STATUS_SCAN_1 ) // in scanning events ...
{
// here ensure APP enter into XferImage process ...
if ( ! app_trigger_event_ & & scanner_status_ = = SCANNER_STATUS_STOPPED )
{
// scanning stopped, reset APP state to ready ...
scanner_status_ = SCANNER_STATUS_READY ;
rc = notifyCloseCancel ( ) ;
if ( ! Twpp : : success ( rc ) )
{
wchar_t info [ 128 ] = { 0 } , unk [ 20 ] = { 0 } ;
swprintf_s ( info , _countof ( info ) - 1 , L " [%x]Warning: notifyCloseCancel failed with error %s! \r \n " , GetCurrentThreadId ( ) , desc_return_code ( rc , unk ) ) ;
load_sane_util : : log_info ( info , 0 ) ;
}
}
else
{
// start scanning, expect frist TRIPLE is ProcessEvent ...
if ( dg = = DataGroup : : Control & & dat = = Dat : : Event & & msg = = Msg : : ProcessEvent & & scanner_status_ = = SCANNER_STATUS_SCAN_1 )
{
app_trigger_event_ = true ; // nothing else to do
load_sane_util : : log_info ( L " Good! first event is (Control, Event, ProcessEvent) after start scanning ^_^. \r \n " , 0 ) ;
}
else if ( ! app_trigger_event_ )
{
int ev = 0 ;
if ( scanner_status_ = = SCANNER_STATUS_SCAN_1 )
load_sane_util : : log_info ( L " Sorry, first event is not (Control, Event, ProcessEvent) after start scanning, we takeover it! \r \n " , 0 ) ;
if ( scanner_ . get ( ) )
{
ev = scanner_ - > get_event ( ) ;
if ( ev )
handle_scanner_event ( ev , true ) ;
}
}
}
}
else if ( state ( ) > = DsState : : XferReady & & scanner_status_ = = SCANNER_STATUS_STOPPED )
{
// here ensure APP return to ready state ...
if ( scanner_ . get ( ) & & scanner_ - > get_scanned_images ( 0 ) = = 0 )
{
rc = notifyCloseCancel ( ) ;
if ( ! Twpp : : success ( rc ) )
{
wchar_t info [ 128 ] = { 0 } , unk [ 20 ] = { 0 } ;
swprintf_s ( info , _countof ( info ) - 1 , L " [%x]Warning: notifyCloseCancel failed with error %s when scanner is stopped! \r \n " , GetCurrentThreadId ( ) , desc_return_code ( rc , unk ) ) ;
load_sane_util : : log_info ( info , 0 ) ;
}
}
}
}