更新配置文件存取(CUSTOMDATA)

This commit is contained in:
gb 2023-06-30 16:58:57 +08:00
parent 532e2a283e
commit 558490dcbe
1 changed files with 45 additions and 31 deletions

View File

@ -1,4 +1,4 @@

#include "scanner.h"
@ -85,13 +85,13 @@ namespace callback
}SCNINST;
std::vector<SCNINST> g_scanner_instances;
int sane_event_callback( // 娉ㄥ唽鍥炶皟鐨勫璞★紝闇€瑕佷繚璇佽鍥炶皟鏄绾跨▼瀹夊叏鐨?
SANE_Handle hdev // 浜х敓浜嬩欢鐨勮澶囧彞鏌?
, int code // 鍥炶皟浜嬩欢浠g爜
, void* data // 鍥炶皟浜嬩欢鏁版嵁锛屾牴鎹簨浠朵唬鐮佹湁鎵€涓嶅悓锛屽弬鐓у叿浣撲簨浠跺畾涔?
, unsigned int* len // 鏁版嵁闀垮害锛堝瓧鑺傦級锛屾垨鑰卐vent_data鐨勭紦鍐插尯闀垮害锛岃缁嗚鐪嬬浉搴旂殑浜嬩欢浠
, void* param // 鐢ㄦ埛鑷畾涔夋暟鎹紝涓庤皟鐢╯ane_init_ex浼犲叆鏃剁殑淇濇寔涓€鑷?
) // 杩斿洖鍊间緷涓嶅悓鐨勪簨浠朵唬鐮佽€屽畾锛岄€氬父涓衡€?鈥?
int sane_event_callback( // 注册回调的对象,需要保证该回调是多线程安全的
SANE_Handle hdev // 产生事件的设备句柄
, int code // 回调事件代码
, void* data // 回调事件数据,根据事件代码有所不同,参照具体事件定义
, unsigned int* len // 数据长度字节或者event_data的缓冲区长度详细请看相应的事件代码
, void* param // 用户自定义数据与调用sane_init_ex传入时的保持一致
) // 返回值依不同的事件代码而定通常为“0”
{
std::lock_guard<std::mutex> lock(cb_lock_);
std::vector<SCNINST>::iterator it = std::find(g_scanner_instances.begin(), g_scanner_instances.end(), hdev);
@ -207,10 +207,10 @@ namespace callback
, {SANE_STD_OPT_NAME_FOLD_TYPE , OPTION_TITLE_DZMS}
, {SANE_STD_OPT_NAME_COLOR_CORRECTION , OPTION_TITLE_SPJZ}
},
g_discard[] = { {SANE_STD_OPT_NAME_REVERSE_01 , "\351\273\221\347\231\275\345\233\276\345\203\217\345\217\215\350\211\262\350\276\223\345\207\272\357\274\210\346\255\243\345\270\270\351\242\234\350\211\262\344\270\272\357\274\2320-\351\273\221\350\211\262\357\274\2331-\347\231\275\350\211\262\357\274\211"} // 榛戠櫧鍥惧儚鍙嶈壊杈撳嚭锛堟甯搁鑹蹭负锛?-榛戣壊锛?-鐧借壊锛?
, {SANE_STD_OPT_NAME_FILTER , "\347\201\260\345\272\246\346\210\226\351\273\221\347\231\275\345\233\276\345\203\217 - \351\231\244\350\211\262"} // 鐏板害鎴栭粦鐧藉浘鍍?- 闄よ壊
, {SANE_STD_OPT_NAME_IS_AUTO_FEED_STRENGTH , "\350\207\252\345\212\250\346\220\223\347\272\270\345\274\272\345\272\246"} // 鑷姩鎼撶焊寮哄害
, {SANE_STD_OPT_NAME_FEED_STRENGTH_VALUE , "\346\220\223\347\272\270\351\230\210\345\200\274"} // " 鎼撶焊闃堝€?
g_discard[] = { {SANE_STD_OPT_NAME_REVERSE_01 , "\351\273\221\347\231\275\345\233\276\345\203\217\345\217\215\350\211\262\350\276\223\345\207\272\357\274\210\346\255\243\345\270\270\351\242\234\350\211\262\344\270\272\357\274\2320-\351\273\221\350\211\262\357\274\2331-\347\231\275\350\211\262\357\274\211"} // 黑白图像反色输出正常颜色为0-黑色1-白色)
, {SANE_STD_OPT_NAME_FILTER , "\347\201\260\345\272\246\346\210\226\351\273\221\347\231\275\345\233\276\345\203\217 - \351\231\244\350\211\262"} // 灰度或黑白图像 - 除色
, {SANE_STD_OPT_NAME_IS_AUTO_FEED_STRENGTH , "\350\207\252\345\212\250\346\220\223\347\272\270\345\274\272\345\272\246"} // 自动搓纸强度
, {SANE_STD_OPT_NAME_FEED_STRENGTH_VALUE , "\346\220\223\347\272\270\351\230\210\345\200\274"} // " 搓纸阈值"
};
const char* option_title_2_name(const char* title)
{
@ -347,11 +347,13 @@ namespace callback
// SANE_EVENT_IMAGE_OK - void* unused, be NULL, flag - unused, be 0
static HMODULE hui = NULL;
int (*choose_scanner)(const std::vector<DEVQUEUI>& devs) = NULL; // blocked. return selected DEVQUE::id or -1 if user cancelled
char* (*apply_current_config)(const char* dev_name, SANE_Handle device, LPSANEAPI api) = NULL; // 搴旂敤璁惧鐨勫綋鍓嶉厤锟?
char* (*apply_current_config)(const char* dev_name, SANE_Handle device, LPSANEAPI api) = NULL; // 应用设备的当前配<EFBFBD>?
int (*show_setting_ui)(SANE_Handle device, HWND parent, LPSANEAPI api, const char* devname, bool with_scan, std::function<void(ui_result)> callback) = NULL;
int (*show_progress_ui)(HWND parent, std::function<void(ui_result)> callback, std::function<void(int/*event*/, void*/*msg*/, int/*flag*/)>* notify) = NULL;
int (*show_messagebox_ui)(HWND parent, int event, void* msg, int flag) = NULL;
int (*close_ui)(int) = NULL;
int (*apply_given_config)(const char* content, SANE_Handle device, LPSANEAPI api) = NULL; // 应用指定的配置content为配置数据流
char* (*get_config_content)(const char* dev_name, const char* name) = NULL;
void (*twain_ui_free)(void* buf) = NULL;
@ -385,6 +387,8 @@ namespace callback
GET_API(show_messagebox_ui);
GET_API(close_ui);
GET_API(twain_ui_free);
GET_API(apply_given_config);
GET_API(get_config_content);
}
}
static void unint_ui(void)
@ -398,6 +402,8 @@ namespace callback
show_messagebox_ui = NULL;
close_ui = NULL;
twain_ui_free = NULL;
apply_given_config = NULL;
get_config_content = NULL;
if (hui)
{
FreeLibrary(hui);
@ -919,7 +925,7 @@ int scanner::open(void)
{
if (callback::show_messagebox_ui)
{
// 绾歌疆鎼撶焊娆℃暟宸茶秴杩囪璁′娇鐢ㄨ寖鍥达紝鎵弿杩囩▼涓悡绾稿け璐ャ€佹鏂溿€佹悡澶氬紶绛夊紓甯搁娆″彲鑳戒細鏄庢樉澧炲锛岃娉ㄦ剰鍙婃椂娓呮磥銆佸苟鑱旂郴璁惧渚涘簲鍟嗚喘涔版浛鎹㈢焊杞紒
// 纸轮搓纸次数已超过设计使用范围,扫描过程中搓纸失败、歪斜、搓多张等异常频次可能会明显增多,请注意及时清洁、并联系设备供应商购买替换纸轮!
std::wstring roller_msgw(local_trans::lang_trans_between_hz936(L"\u7EB8\u8F6E\u6413\u7EB8\u6B21\u6570\u5DF2\u8D85\u8FC7\u8BBE\u8BA1\u4F7F\u7528\u8303\u56F4\uFF0C\u626B\u63CF\u8FC7\u7A0B\u4E2D\u6413\u7EB8\u5931\u8D25\u3001\u6B6A\u659C\u3001\u6413\u591A\u5F20\u7B49\u5F02\u5E38\u9891\u6B21\u53EF\u80FD\u4F1A\u660E\u663E\u589E\u591A\uFF0C\u8BF7\u6CE8\u610F\u53CA\u65F6\u6E05\u6D01\u3001\u5E76\u8054\u7CFB\u8BBE\u5907\u4F9B\u5E94\u5546\u8D2D\u4E70\u66FF\u6362\u7EB8\u8F6E\uFF01"));
std::string roller_msg(local_trans::u2a(roller_msgw.c_str(), CP_UTF8));
app_wnd_ = callback::find_main_wnd();
@ -1133,7 +1139,7 @@ int scanner::init_options_id(void)
if (is_erase_hole_id_ == -1)
{
// 鍏煎鑰佺殑闄ゅ瓟绠楁硶
// 兼容老的除孔算法
EXAPI ea;
ea.ind = is_erase_hole_id_ = ex_id_++;
@ -2961,7 +2967,7 @@ COM_API_IMPLEMENT(scanner, bool, get_value(int sn, void* data, int* len))
swprintf_s(msg, _countof(msg) - 1, L"get log of(%x) = 0x%x\r\n", sn, ret);
log_info(msg, 1);
return ret == SANE_STATUS_GOOD;
return ret == SANE_STATUS_GOOD;
}
COM_API_IMPLEMENT(scanner, int, set_value(int sn, void* val))
{
@ -3161,29 +3167,37 @@ COM_API_IMPLEMENT(scanner, void, twain_set_compression(SANE_CompressionType comp
}
COM_API_IMPLEMENT(scanner, int, twain_get_config(char* buf, size_t* len))
{
if (cfg_)
int ret = SCANNER_ERR_NO_DATA;
if (callback::get_config_content)
{
std::string cont(cfg_->to_text_stream());
if (*len < cont.length())
char* cont = callback::get_config_content(local_trans::u2a(scanner_name_.c_str(), CP_UTF8).c_str(), NULL);
if (cont)
{
*len = cont.length() + 4;
if (*len <= strlen(cont))
{
*len = strlen(cont) + 4;
return SCANNER_ERR_INSUFFICIENT_MEMORY;
ret = SCANNER_ERR_INSUFFICIENT_MEMORY;
}
else
{
strcpy(buf, cont);
ret = SCANNER_ERR_OK;
*len = strlen(cont);
}
if (callback::twain_ui_free)
callback::twain_ui_free(cont);
}
strcpy(buf, cont.c_str());
}
return SCANNER_ERR_OK;
return ret;
}
COM_API_IMPLEMENT(scanner, int, twain_set_config(char* buf, size_t len))
{
if(cfg_ && cfg_->load_mem(buf))
if(callback::apply_given_config)
{
update_config();
apply_config();
return SCANNER_ERR_OK;
if(callback::apply_given_config(buf, handle_, &sane_api_) == 0)
return SCANNER_ERR_OK;
}
return SCANNER_ERR_DATA_DAMAGED;
@ -3448,13 +3462,13 @@ int scanner::handle_device_event(int ev_code, void* data, unsigned int* len)
log_info(msg, 1);
}
}
//else if (ev_code == SANE_EVENT_ERROR) // 灞忚斀锛屽湪鍋滄鎵弿鏃跺睍绀轰俊鎭?- 2023-05-30
//else if (ev_code == SANE_EVENT_ERROR) // 屏蔽,在停止扫描时展示信息 - 2023-05-30
//{
// if (callback::show_messagebox_ui && *len)
// {
// callback::show_messagebox_ui(app_wnd_, ev_code, (void*)data, 0);
// }
// else if (*len) //閿欒寮瑰嚭
// else if (*len) //错误弹出
// {
// std::wstring msg(local_trans::a2u((char*)data, CP_UTF8));
// if (!IsWindow(app_wnd_))