]> gitweb.hhaalo.de Git - sane-kds-s2000w-net.git/commitdiff
fix read empty data with test
authorBastian Dehn <hhaalo@arcor.de>
Fri, 23 Feb 2024 16:30:22 +0000 (17:30 +0100)
committerBastian Dehn <hhaalo@arcor.de>
Fri, 23 Feb 2024 16:30:22 +0000 (17:30 +0100)
src/kds_s2000w_handler.c
src/kds_s2000w_handler.h
src/kds_s2000w_net.c
tests/kds_s2000w_net_read_tests.c
tests/runtests.c

index bd5eec947565856fad8bd6e5e3eeca9c51d6b028..e61876707ef52aec4309771ac66c3bfcb15e3b90 100644 (file)
@@ -155,12 +155,8 @@ void _get_current_scan_status(handler* h)
        sleep(1);
 }
 
-void kds_s2000w_handler_open(const char* devicename, void** handle)
+handler* init_handler()
 {
-       debug_printf(ALL, "kds_s2000w_handler_open");
-       if (strcmp(devicename, "kds_s2000w_net") != 0)
-               return;
-
        handler* h = malloc(sizeof(handler));
        h->current_scan_status = malloc(sizeof(scan_status));
        h->current_metadata = malloc(sizeof(metadata));
@@ -188,6 +184,30 @@ void kds_s2000w_handler_open(const char* devicename, void** handle)
        h->read_info->readed_bytes_per_line = 0;
        h->read_info->readed_lines = 0;
 
+       return h;
+}
+
+void free_handler(handler* h)
+{
+       free(h->current_scan_status);
+       h->current_scan_status = NULL;
+       free(h->current_metadata->image);
+       h->current_metadata->image = NULL;
+       free(h->current_metadata);
+       h->current_metadata = NULL;
+       free(h->read_info);
+       h->read_info = NULL;
+       free(h);
+       h = NULL;
+}
+
+void kds_s2000w_handler_open(const char* devicename, void** handle)
+{
+       debug_printf(ALL, "kds_s2000w_handler_open");
+       if (strcmp(devicename, "kds_s2000w_net") != 0)
+               return;
+
+       handler* h = init_handler();
        *handle = h;
 
        init_gamma_table();
@@ -252,15 +272,7 @@ void kds_s2000w_handler_close(void* handle)
 
        kds_s2000w_client_close_session(h->sessionid);
        h->sessionid = 0;
-       free(h->current_scan_status);
-       h->current_scan_status = NULL;
-       free(h->current_metadata->image);
-       h->current_metadata->image = NULL;
-       free(h->read_info);
-       h->read_info = NULL;
-       free(h->current_metadata);
-       h->current_metadata = NULL;
-       free(h);
+       free_handler(h);
        h = NULL;
 }
 
index 6f1798f70917d090036a68adda1bef4adf94c8b9..fdf6a666a4047cd735dc1149a1b51b8c5380a185 100644 (file)
@@ -47,6 +47,8 @@ typedef struct {
        readinfo* read_info;
 } handler;
 
+handler* init_handler();
+void free_handler(handler* h);
 void kds_s2000w_handler_open(const char* devicename, void** handle);
 void kds_s2000w_handler_close(void* handle);
 void kds_s2000w_handler_get_option(void* handle, int option, void* value);
index 6a15bdc4705d3d22438fa6e2c4ef0ae68f56f3b9..ad80a3629a8e5d439744fe11e1b16c348e1e3494 100644 (file)
@@ -182,11 +182,13 @@ SANE_Status _sane_kds_s2000w_net_read(SANE_Handle handle, SANE_Byte* data,
                sleep(1);
                kds_s2000w_handler_open("kds_s2000w_net", handle);
                return SANE_STATUS_CANCELLED;
-       }
+       }       
 
-       int skip_header_bytes = _sane_kds_s2000w_net_find_first_data_byte(h->current_metadata->image);
-       if (h->read_info->read_size <= 0)
-               h->read_info->read_size += skip_header_bytes;
+       if (h->current_metadata->image != NULL) {
+               int skip_header_bytes = _sane_kds_s2000w_net_find_first_data_byte(h->current_metadata->image);
+               if (h->read_info->read_size <= 0)
+                       h->read_info->read_size += skip_header_bytes;
+       }
 
        if (h->read_info->readed_lines >= h->current_metadata->lines) {
                *length = 0;
index 13248431e66219fb9224574d8816c7096f35f830..acc35ea8af55e26589da0140e75267eb0856faf4 100644 (file)
@@ -37,6 +37,45 @@ START_TEST(sane_kds_s2000w_net_read_cancel_test)
 }
 END_TEST
 
+START_TEST(sane_kds_s2000w_net_read_without_data)
+{
+       int length = 0;
+       handler* h = init_handler();
+       char* dataptr = malloc(sizeof(char));
+
+       SANE_Status status = _sane_kds_s2000w_net_read(h, dataptr, 65536, &length);
+
+       ck_assert_int_eq(status, SANE_STATUS_EOF);
+
+       free(dataptr);
+       dataptr = NULL;
+       free_handler(h);
+       h = NULL;
+}
+END_TEST
+
+START_TEST(sane_kds_s2000w_net_read_empty_image)
+{
+       int length = 0;
+       handler* h = init_handler();
+       h->current_metadata->size = 1;
+       char* image = malloc(sizeof(char));
+       image[0] = 0;
+       h->current_metadata->image = image;
+       char* dataptr = malloc(sizeof(char));
+
+       SANE_Status status = _sane_kds_s2000w_net_read(h, dataptr, 65536, &length);
+
+       ck_assert_int_eq(status, SANE_STATUS_EOF);
+
+       free(dataptr);
+       dataptr = NULL;
+       image = NULL;
+       free_handler(h);
+       h = NULL;
+}
+END_TEST
+
 START_TEST(sane_kds_s2000w_net_read_all_lines_test)
 {
        handler h;
index 696c6cdf5951971f3ac37355db197971bd70a67d..69b0c8c889e37380d8246895bfeedc9b10c35cb4 100644 (file)
@@ -24,6 +24,8 @@ Suite* net_read()
        TCase* net_read = tcase_create("read");
        tcase_add_test(net_read, sane_kds_s2000w_net_find_first_data_byte_test);
        tcase_add_test(net_read, sane_kds_s2000w_net_read_cancel_test);
+       tcase_add_test(net_read, sane_kds_s2000w_net_read_without_data);
+       tcase_add_test(net_read, sane_kds_s2000w_net_read_empty_image);
        tcase_add_test(net_read, sane_kds_s2000w_net_read_all_lines_test);
        tcase_add_test(net_read, sane_kds_s2000w_net_read_test);
        tcase_add_test(net_read, sane_kds_s2000w_net_read_bytes_per_line_bigger_test);