#include <sane/sane.h>
#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;
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,
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,