]> gitweb.hhaalo.de Git - sane-kds-s2000w-net.git/commitdiff
implements option descriptor array
authorBastian Dehn <hhaalo@arcor.de>
Sat, 27 Jan 2024 07:40:51 +0000 (08:40 +0100)
committerBastian Dehn <hhaalo@arcor.de>
Sat, 27 Jan 2024 07:40:51 +0000 (08:40 +0100)
src/kds_s2000w_net.c

index 34b8bdb512587ed2cd77d6d49539145176d3b430..8bfab0c948544faa95df8a3f64fc89b867f503b7 100644 (file)
@@ -4,14 +4,21 @@
 #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;
@@ -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,