#include "kds_s2000w_handler.h"
#include "kds_s2000w_debug.h"
-int _sane_kds_s2000w_net_find_first_data_byte(const char* data)
+int _sane_kds_s2000w_net_find_first_data_byte(imagedata* image)
{
debug_printf(ALL, "sane_kds_s2000w_net_find_first_data_byte");
+ char* data = image->data;
int header_spaces = 3;
if (strncmp(data, "P4", 2) == 0)
int space_count = 0;
int byte_count = 0;
- while(space_count < header_spaces) {
- if (data[byte_count] == space) {
+ while(space_count < header_spaces && byte_count < image->size) {
+ if (data[byte_count] == space)
space_count++;
- }
byte_count++;
}
return SANE_STATUS_CANCELLED;
}
+ // calc max length
+ *length = h->pnm_image->size - h->read_info->read_size;
+ if (*length > max_length)
+ *length = max_length;
+
+ // read image
+ if (h->pnm_image->data != NULL && h->read_info->read_size <= 0)
+ h->read_info->read_size += _sane_kds_s2000w_net_find_first_data_byte(h->pnm_image);
+
// last frame
if (h->read_info->read_size >= h->pnm_image->size) {
*length = 0;
return SANE_STATUS_EOF;
}
- // calc max length
- *length = h->pnm_image->size - h->read_info->read_size;
- if (*length > max_length)
- *length = max_length;
-
- // read image
- if (h->pnm_image->data != NULL && h->read_info->read_size <= 0)
- h->read_info->read_size += _sane_kds_s2000w_net_find_first_data_byte(h->pnm_image->data);
-
memcpy(data, h->pnm_image->data + h->read_info->read_size, *length);
h->read_info->read_size += *length;
h = NULL;
}
+void sane_kds_s2000w_net_read_without_header_test()
+{
+ handler* h = init_handler();
+ h->pnm_image->size = 65536;
+ h->pnm_image->data = malloc(sizeof(char) * 65536);
+ char* imagedata = (char*) h->pnm_image->data;
+ for (int i = 0; i < 65536; i++) {
+ imagedata[i] = 0xff;
+ }
+
+ SANE_Int maxlen = 65536;
+ char* dataptr = malloc(sizeof(char) * maxlen);
+ SANE_Int* length = malloc(sizeof(SANE_Int));
+
+ SANE_Status status = _sane_kds_s2000w_net_read(h, (void*) dataptr, maxlen, length);
+
+ assert_int_equal(*length, 0);
+ assert_null(h->pnm_image->data);
+ assert_int_equal(h->read_info->read_size, 65536);
+ assert_int_equal(status, SANE_STATUS_EOF);
+
+ free(dataptr);
+ dataptr = NULL;
+ free(length);
+ length = NULL;
+ free(h->pnm_image->data);
+ h->pnm_image->data = NULL;
+ free_handler(h);
+ h = NULL;
+}
+
void sane_kds_s2000w_net_read_test()
{
handler* h = init_handler();
void sane_kds_s2000w_net_read_cancel_test();
void sane_kds_s2000w_net_read_without_data();
void sane_kds_s2000w_net_read_empty_image();
+void sane_kds_s2000w_net_read_without_header_test();
void sane_kds_s2000w_net_read_test();
void sane_kds_s2000w_net_read_bw_test();
void sane_kds_s2000w_net_read_bytes_per_line_bigger_test();
cmocka_unit_test(sane_kds_s2000w_net_read_cancel_test),
cmocka_unit_test(sane_kds_s2000w_net_read_without_data),
cmocka_unit_test(sane_kds_s2000w_net_read_empty_image),
+ cmocka_unit_test(sane_kds_s2000w_net_read_without_header_test),
cmocka_unit_test(sane_kds_s2000w_net_read_test),
cmocka_unit_test(sane_kds_s2000w_net_read_bw_test),
cmocka_unit_test(sane_kds_s2000w_net_read_bytes_per_line_bigger_test)