From 6f48c5df042d70b74e2fc9af21d793dbd3125141 Mon Sep 17 00:00:00 2001 From: Bastian Dehn Date: Sat, 20 Apr 2024 09:17:31 +0200 Subject: [PATCH] add handler feeder mode --- src/kds_s2000w_handler.c | 1 + src/kds_s2000w_handler.h | 1 + src/kds_s2000w_handler_opts.c | 6 ++ src/kds_s2000w_net.c | 6 +- tests/kds_s2000w_net_get_opt_tests.c | 1 + tests/kds_s2000w_net_tests.c | 107 +++++++++++++++++++++++++++ tests/kds_s2000w_net_tests.h | 1 + tests/kds_s2000w_net_tests_run.c | 3 +- 8 files changed, 123 insertions(+), 3 deletions(-) diff --git a/src/kds_s2000w_handler.c b/src/kds_s2000w_handler.c index 7525865..4aeea91 100644 --- a/src/kds_s2000w_handler.c +++ b/src/kds_s2000w_handler.c @@ -188,6 +188,7 @@ handler* init_handler() h->current_scan_status->available_images = 0; h->current_scan_status->downloaded_images = 0; h->current_scan_status->complete_scanned = 0; + h->current_scan_status->feeder = 1; h->current_metadata->format = 1; h->current_metadata->channels = 3; h->current_metadata->is_last = 1; diff --git a/src/kds_s2000w_handler.h b/src/kds_s2000w_handler.h index 6a5cf80..f2ae97a 100644 --- a/src/kds_s2000w_handler.h +++ b/src/kds_s2000w_handler.h @@ -36,6 +36,7 @@ typedef struct { int available_images; int downloaded_images; int complete_scanned; + int feeder; } scanstatus; typedef struct { diff --git a/src/kds_s2000w_handler_opts.c b/src/kds_s2000w_handler_opts.c index 5ca9b57..257c976 100644 --- a/src/kds_s2000w_handler_opts.c +++ b/src/kds_s2000w_handler_opts.c @@ -80,6 +80,12 @@ void kds_s2000w_handler_get_option(handler* h, int option, void* value, int* inf case 2: value_object = json_object_object_get(config, "ScanSource"); _write_string_value(value_object, value); + + if (strcmp(value, "DocumentFeeder") == 0) + h->current_scan_status->feeder = 1; + else + h->current_scan_status->feeder = 0; + break; case 3: value_object = json_object_object_get(config, "ColorMode"); diff --git a/src/kds_s2000w_net.c b/src/kds_s2000w_net.c index 491135b..57cb527 100644 --- a/src/kds_s2000w_net.c +++ b/src/kds_s2000w_net.c @@ -181,7 +181,8 @@ SANE_Status _sane_kds_s2000w_net_start(SANE_Handle handle) return SANE_STATUS_NO_DOCS; } - if (h->current_scan_status->complete_scanned + if (h->current_scan_status->feeder + && h->current_scan_status->complete_scanned && h->current_scan_status->available_images <= 0) { kds_s2000w_handler_recreate_session(h); return SANE_STATUS_GOOD; @@ -192,7 +193,8 @@ SANE_Status _sane_kds_s2000w_net_start(SANE_Handle handle) return SANE_STATUS_GOOD; } - if (h->current_scan_status->available_images <= 0) { + if (!h->current_scan_status->feeder + && h->current_scan_status->available_images <= 0) { kds_s2000w_handler_recreate_session(h); return SANE_STATUS_GOOD; } diff --git a/tests/kds_s2000w_net_get_opt_tests.c b/tests/kds_s2000w_net_get_opt_tests.c index fcd7f45..a8af197 100644 --- a/tests/kds_s2000w_net_get_opt_tests.c +++ b/tests/kds_s2000w_net_get_opt_tests.c @@ -53,6 +53,7 @@ void sane_kds_s2000w_net_control_get_option_two(void** state) _sane_kds_s2000w_net_control_option(h, 2, SANE_ACTION_GET_VALUE, &value, NULL); assert_string_equal(value, "DocumentFeeder"); + assert_int_equal(h->current_scan_status->feeder, 1); free_handler(h); h = NULL; diff --git a/tests/kds_s2000w_net_tests.c b/tests/kds_s2000w_net_tests.c index 56b05dd..01702bd 100644 --- a/tests/kds_s2000w_net_tests.c +++ b/tests/kds_s2000w_net_tests.c @@ -234,6 +234,7 @@ void sane_kds_s2000w_net_start_one_page_per_flatscan(void** state) expect_function_call(__wrap_kds_s2000w_client_open_session); expect_function_call(__wrap_kds_s2000w_client_set_option); handler* h = init_handler(); + h->current_scan_status->feeder = 0; const char* test_config = "{\"Configuration\": { \"ColorMode\": \"Color\" } }"; h->current_scanner_config = json_tokener_parse(test_config); @@ -448,6 +449,112 @@ void sane_kds_s2000w_net_start_two_pages_per_feeder(void** state) h = NULL; } +void sane_kds_s2000w_net_start_slow_two_pages_per_feeder(void** state) +{ + response** response_list = (response**) *state; + will_return(mock_response, response_list[0]); + will_return(__wrap_kds_s2000w_client_start_scan, 0); + response* resp_status = kds_s2000w_client_response_init(); + resp_status->data = realloc(resp_status->data, 205); + const char* status = "{ \ + \"Status\": { \ + \"NumImagesScanned\": 1, \ + \"NumImagesStored\": 1, \ + \"State\": \"Scanning\", \ + \"ErrorNum\": 0, \ + \"LastError\": \"Status: 200 Success\", \ + \"PaperDetected\": \"0\", \ + \"PercentAvailable\": 99 \ + }}\0"; + memcpy(resp_status->data, status, 205); + resp_status->code = 200; + resp_status->size = 205; + will_return(mock_response, resp_status); + will_return(__wrap_kds_s2000w_client_status_session, 0); + will_return(mock_response, response_list[0]); + will_return(__wrap_kds_s2000w_client_get_image, 0); + will_return(mock_response, response_list[1]); + will_return(__wrap_kds_s2000w_client_get_metadata, 0); + will_return(mock_response, response_list[0]); + will_return(__wrap_kds_s2000w_client_delete_image, 0); + expect_function_call(__wrap_kds_s2000w_client_start_scan); + expect_function_call(__wrap_kds_s2000w_client_status_session); + expect_function_call(__wrap_kds_s2000w_client_get_image); + expect_function_call(__wrap_kds_s2000w_client_get_metadata); + expect_function_call(__wrap_kds_s2000w_client_delete_image); + + handler* h = init_handler(); + h->current_scan_status->feeder = 1; + const char* test_config = "{\"Configuration\": { \"ColorMode\": \"Color\" } }"; + h->current_scanner_config = json_tokener_parse(test_config); + + int result = _sane_kds_s2000w_net_start(h); + + resp_status->data = realloc(resp_status->data, 210); + const char* status2 = "{ \ + \"Status\": { \ + \"NumImagesScanned\": 2, \ + \"NumImagesStored\": 1, \ + \"State\": \"Done Scanning\", \ + \"ErrorNum\": 0, \ + \"LastError\": \"Status: 200 Success\", \ + \"PaperDetected\": \"0\", \ + \"PercentAvailable\": 99 \ + }}\0"; + memcpy(resp_status->data, status2, 210); + resp_status->code = 200; + resp_status->size = 210; + will_return(mock_response, resp_status); + will_return(__wrap_kds_s2000w_client_status_session, 0); + will_return(mock_response, response_list[0]); + will_return(__wrap_kds_s2000w_client_get_image, 0); + will_return(mock_response, response_list[1]); + will_return(__wrap_kds_s2000w_client_get_metadata, 0); + will_return(mock_response, response_list[0]); + will_return(__wrap_kds_s2000w_client_delete_image, 0); + response* resp_open_session = kds_s2000w_client_response_init(); + resp_open_session->data = realloc(resp_open_session->data, 25); + const char* session_data = "{\"SessionId\":\"8154711\"}\0"; + memcpy(resp_open_session->data, session_data, 25); + resp_open_session->code = 200; + resp_open_session->size = 25; + will_return(mock_response, resp_open_session); + will_return(__wrap_kds_s2000w_client_open_session, 0); + response* resp_set_option = kds_s2000w_client_response_init(); + resp_set_option->code = 200; + will_return(mock_response, resp_set_option); + will_return(__wrap_kds_s2000w_client_set_option, 0); + expect_function_call(__wrap_kds_s2000w_client_status_session); + expect_function_call(__wrap_kds_s2000w_client_get_image); + expect_function_call(__wrap_kds_s2000w_client_get_metadata); + expect_function_call(__wrap_kds_s2000w_client_delete_image); + expect_function_call(__wrap_kds_s2000w_client_close_session); + expect_function_call(__wrap_kds_s2000w_client_open_session); + expect_function_call(__wrap_kds_s2000w_client_set_option); + result = _sane_kds_s2000w_net_start(h); + + assert_int_equal(result, SANE_STATUS_GOOD); + assert_int_equal(h->current_scan_status->complete_scanned, 1); + assert_int_equal(h->current_metadata->depth, 8); + assert_int_equal(h->current_metadata->channels, 3); + assert_int_equal(h->current_metadata->format, 1); + assert_int_equal(h->current_metadata->pixels_per_line, 1000); + assert_int_equal(h->current_metadata->lines, 1000); + assert_int_equal(h->current_metadata->valid, 1); + assert_int_equal(h->current_metadata->is_last, 1); + + json_object_put(h->current_scanner_config); + h->current_scanner_config = NULL; + kds_s2000w_client_response_free(resp_status); + resp_status = NULL; + kds_s2000w_client_response_free(resp_open_session); + resp_open_session = NULL; + kds_s2000w_client_response_free(resp_set_option); + resp_set_option = NULL; + free_handler(h); + h = NULL; +} + void sane_kds_s2000w_net_get_parameter_cancel() { handler* h = init_handler(); diff --git a/tests/kds_s2000w_net_tests.h b/tests/kds_s2000w_net_tests.h index 19a5380..f8e7ba8 100644 --- a/tests/kds_s2000w_net_tests.h +++ b/tests/kds_s2000w_net_tests.h @@ -17,6 +17,7 @@ void sane_kds_s2000w_net_start(void** state); void sane_kds_s2000w_net_start_one_page_per_flatscan(void** state); void sane_kds_s2000w_net_start_one_page_per_feeder(void** state); void sane_kds_s2000w_net_start_two_pages_per_feeder(void** state); +void sane_kds_s2000w_net_start_slow_two_pages_per_feeder(void** state); void sane_kds_s2000w_net_get_parameter_cancel(); void sane_kds_s2000w_net_cancel(); void sane_kds_s2000w_net_open(); diff --git a/tests/kds_s2000w_net_tests_run.c b/tests/kds_s2000w_net_tests_run.c index 0ef32e7..3463660 100644 --- a/tests/kds_s2000w_net_tests_run.c +++ b/tests/kds_s2000w_net_tests_run.c @@ -58,7 +58,8 @@ int main() cmocka_unit_test_setup_teardown(sane_kds_s2000w_net_start, setup_net_start, teardown_net_start), cmocka_unit_test_setup_teardown(sane_kds_s2000w_net_start_one_page_per_flatscan, setup_net_start, teardown_net_start), cmocka_unit_test_setup_teardown(sane_kds_s2000w_net_start_one_page_per_feeder, setup_net_start, teardown_net_start), - cmocka_unit_test_setup_teardown(sane_kds_s2000w_net_start_two_pages_per_feeder, setup_net_start, teardown_net_start) + cmocka_unit_test_setup_teardown(sane_kds_s2000w_net_start_two_pages_per_feeder, setup_net_start, teardown_net_start), + cmocka_unit_test_setup_teardown(sane_kds_s2000w_net_start_slow_two_pages_per_feeder, setup_net_start, teardown_net_start) }; return cmocka_run_group_tests(net_tests, NULL, NULL); -- 2.39.5