From: Bastian Dehn Date: Sat, 27 Jan 2024 07:40:51 +0000 (+0100) Subject: implements option descriptor array X-Git-Tag: v1.0.0^2~457 X-Git-Url: https://gitweb.hhaalo.de/?a=commitdiff_plain;h=61377f78de6cc916ea55087e66027f7868dfb841;p=sane-kds-s2000w-net.git implements option descriptor array --- diff --git a/src/kds_s2000w_net.c b/src/kds_s2000w_net.c index 34b8bdb..8bfab0c 100644 --- a/src/kds_s2000w_net.c +++ b/src/kds_s2000w_net.c @@ -4,14 +4,21 @@ #include #include "kds_s2000w_handler.h" -SANE_Option_Descriptor* optionDescripor = NULL; +typedef struct { + SANE_Option_Descriptor** option_descriptors; + int length; +} option_descriptors; + SANE_Device* device_info = NULL; SANE_Parameters* parameter = NULL; +option_descriptors option_descriptor_array; SANE_Status _sane_kds_s2000w_net_init(SANE_Int* version_code, SANE_Auth_Callback authorize) { *version_code = SANE_VERSION_CODE(1, 0, 0); - optionDescripor = malloc(sizeof(SANE_Option_Descriptor)); + option_descriptor_array.option_descriptors = malloc(sizeof(SANE_Option_Descriptor**)); + option_descriptor_array.option_descriptors[0] = NULL; + option_descriptor_array.length = 0; device_info = malloc(sizeof(SANE_Device)); parameter = malloc(sizeof(SANE_Parameters)); return SANE_STATUS_GOOD; @@ -24,10 +31,14 @@ void _sane_kds_s2000w_net_exit(void) free(device_info); device_info = NULL; - free(optionDescripor); - optionDescripor = NULL; free(parameter); parameter = NULL; + for (int i = 0; i < option_descriptor_array.length; i++) { + free(option_descriptor_array.option_descriptors[i]); + option_descriptor_array.option_descriptors[i] = NULL; + } + free(option_descriptor_array.option_descriptors); + option_descriptor_array.option_descriptors = NULL; } SANE_Status _sane_kds_s2000w_net_get_devices(SANE_Device*** device_list, @@ -72,33 +83,47 @@ void _sane_kds_s2000w_net_close(SANE_Handle handle) const SANE_Option_Descriptor* _sane_kds_s2000w_net_get_option_descriptor( SANE_Handle handle, SANE_Int option) { + if (option_descriptor_array.length < (option + 1)) { + option_descriptor_array.option_descriptors[option] = malloc(sizeof(SANE_Option_Descriptor)); + option_descriptor_array.length++; + } + current_state* state = kds_s2000w_handler_current_state(); switch (option) { + case 0: + free(option_descriptor_array.option_descriptors[option]); + option_descriptor_array.option_descriptors[option] = NULL; + option_descriptor_array.option_descriptors[option] = malloc(sizeof(SANE_Option_Descriptor)); + option_descriptor_array.option_descriptors[option]->name = ""; + option_descriptor_array.option_descriptors[option]->title = "option number count"; + option_descriptor_array.option_descriptors[option]->desc = "available number of options"; + option_descriptor_array.option_descriptors[option]->type = SANE_TYPE_INT; + option_descriptor_array.option_descriptors[option]->unit = SANE_UNIT_NONE; + option_descriptor_array.option_descriptors[option]->size = sizeof(SANE_Int); + option_descriptor_array.option_descriptors[option]->cap = SANE_CAP_SOFT_SELECT; + option_descriptor_array.option_descriptors[option]->constraint_type = SANE_CONSTRAINT_NONE; + option_descriptor_array.option_descriptors[option]->constraint.string_list = NULL; + break; case 1: - optionDescripor->name = "resolution"; - optionDescripor->title = "resolution"; - optionDescripor->desc = "resolution"; - optionDescripor->type = SANE_TYPE_INT; - optionDescripor->unit = SANE_UNIT_DPI; - optionDescripor->size = sizeof(SANE_Int); - optionDescripor->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT; - optionDescripor->constraint_type = SANE_CONSTRAINT_NONE; - optionDescripor->constraint.string_list = NULL; + free(option_descriptor_array.option_descriptors[option]); + option_descriptor_array.option_descriptors[option] = NULL; + option_descriptor_array.option_descriptors[option] = malloc(sizeof(SANE_Option_Descriptor)); + option_descriptor_array.option_descriptors[option]->name = "resolution"; + option_descriptor_array.option_descriptors[option]->title = "resolution"; + option_descriptor_array.option_descriptors[option]->desc = "resolution"; + option_descriptor_array.option_descriptors[option]->type = SANE_TYPE_INT; + option_descriptor_array.option_descriptors[option]->unit = SANE_UNIT_DPI; + option_descriptor_array.option_descriptors[option]->size = sizeof(SANE_Int); + option_descriptor_array.option_descriptors[option]->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT; + option_descriptor_array.option_descriptors[option]->constraint_type = SANE_CONSTRAINT_NONE; + option_descriptor_array.option_descriptors[option]->constraint.string_list = NULL; break; default: - optionDescripor->name = ""; - optionDescripor->title = "option number count"; - optionDescripor->desc = "available number of options"; - optionDescripor->type = SANE_TYPE_INT; - optionDescripor->unit = SANE_UNIT_NONE; - optionDescripor->size = sizeof(SANE_Int); - optionDescripor->cap = SANE_CAP_SOFT_SELECT; - optionDescripor->constraint_type = SANE_CONSTRAINT_NONE; - optionDescripor->constraint.string_list = NULL; + return NULL; break; } - return optionDescripor; + return option_descriptor_array.option_descriptors[option]; } SANE_Status _sane_kds_s2000w_net_control_option(SANE_Handle handle,