/* * no attach function */ static void null_attach (void) { SANE_Status status; status = sanei_configure_attach (CONFIG_PATH "/data/umax_pp.conf", NULL, NULL); /* check results */ assert (status == SANE_STATUS_GOOD); }
/* * string option */ static void string_option (void) { SANE_Status status; SANEI_Config config; SANE_Char modelname[128]; SANE_Char vendor[128]; SANE_Option_Descriptor *options[2]; void *values[2]; int i; i = 0; options[i] = (SANE_Option_Descriptor *) malloc (sizeof (SANE_Option_Descriptor)); options[i]->name = "modelname"; options[i]->title = "model name"; options[i]->desc = "user provided scanner's model name"; options[i]->type = SANE_TYPE_STRING; options[i]->unit = SANE_UNIT_NONE; options[i]->size = 128; options[i]->cap = SANE_CAP_SOFT_SELECT; options[i]->constraint_type = SANE_CONSTRAINT_NONE; values[i] = modelname; i++; options[i] = (SANE_Option_Descriptor *) malloc (sizeof (SANE_Option_Descriptor)); options[i]->name = "vendor"; options[i]->title = "vendor name"; options[i]->desc = "user provided scanner's vendor name"; options[i]->type = SANE_TYPE_STRING; options[i]->unit = SANE_UNIT_NONE; options[i]->size = 128; options[i]->cap = SANE_CAP_SOFT_SELECT; options[i]->constraint_type = SANE_CONSTRAINT_NONE; values[i] = vendor; i++; config.count = i; config.descriptors = options; config.values = values; /* configure and attach */ status = sanei_configure_attach (CONFIG_PATH "/data/string.conf", &config, check_config_attach); /* check results */ assert (status == SANE_STATUS_GOOD); assert (strcmp (modelname, "my model") == 0); assert (strcmp (vendor, "my vendor") == 0); }
/* * non-existent config file */ static void inexistent_config (void) { SANE_Status status; SANEI_Config config; config.count = 0; config.descriptors = NULL; config.values = NULL; status = sanei_configure_attach (CONFIG_PATH "/data/inexistent.conf", &config, NULL); /* check results */ assert (status != SANE_STATUS_GOOD); }
/* * boolean option */ static void wrong_bool_option (void) { SANE_Status status; SANEI_Config config; SANE_Option_Descriptor *options[2]; void *values[2]; SANE_Bool booltrue, boolfalse; int i; i = 0; options[i] = (SANE_Option_Descriptor *) malloc (sizeof (SANE_Option_Descriptor)); options[i]->name = "booltrue"; options[i]->title = "boolean true"; options[i]->type = SANE_TYPE_BOOL; options[i]->unit = SANE_UNIT_NONE; options[i]->size = sizeof (SANE_Bool); options[i]->cap = SANE_CAP_SOFT_SELECT; options[i]->constraint_type = SANE_CONSTRAINT_NONE; values[i] = &booltrue; i++; options[i] = (SANE_Option_Descriptor *) malloc (sizeof (SANE_Option_Descriptor)); options[i]->name = "boolfalse"; options[i]->title = "boolean false"; options[i]->type = SANE_TYPE_BOOL; options[i]->unit = SANE_UNIT_NONE; options[i]->size = sizeof (SANE_Bool); options[i]->cap = SANE_CAP_SOFT_SELECT; options[i]->constraint_type = SANE_CONSTRAINT_NONE; values[i] = &boolfalse; i++; config.descriptors = options; config.values = values; config.count = i; /* configure and attach */ status = sanei_configure_attach (CONFIG_PATH "/data/wrong-boolean.conf", &config, check_config_attach); /* check results */ assert (status == SANE_STATUS_INVAL); assert (booltrue == SANE_TRUE); }
/* * empty config : backend has no configuration option */ static void empty_config (void) { SANE_Status status; SANEI_Config config; config.count = 0; config.descriptors = NULL; config.values = NULL; status = sanei_configure_attach (CONFIG_PATH "/data/empty.conf", &config, check_config_attach); /* check results */ assert (status == SANE_STATUS_GOOD); }
/* * string option with string list constraint */ static void wrong_string_list_option (void) { SANE_Status status; SANEI_Config config; SANE_Char choice[128]; SANE_Option_Descriptor *options[1]; void *values[1]; int i; i = 0; options[i] = (SANE_Option_Descriptor *) malloc (sizeof (SANE_Option_Descriptor)); options[i]->name = "string-choice"; options[i]->title = "string choice"; options[i]->desc = "one string among a fixed list"; options[i]->type = SANE_TYPE_STRING; options[i]->unit = SANE_UNIT_NONE; options[i]->size = 128; options[i]->cap = SANE_CAP_SOFT_SELECT; options[i]->constraint_type = SANE_CONSTRAINT_STRING_LIST; options[i]->constraint.string_list = string_list; values[i] = choice; i++; config.descriptors = options; config.values = values; config.count = i; choice[0] = 0; /* configure and attach */ status = sanei_configure_attach (CONFIG_PATH "/data/wrong-string-list.conf", &config, check_config_attach); /* check results */ assert (status == SANE_STATUS_INVAL); assert (strcmp (choice, "") == 0); }
/* * word array */ static void word_array_option (void) { SANE_Status status; SANEI_Config config; SANE_Word numbers[7]; SANE_Option_Descriptor *options[1]; void *values[1]; int i; i = 0; options[i] = (SANE_Option_Descriptor *) malloc (sizeof (SANE_Option_Descriptor)); options[i]->name = "numbers"; options[i]->title = "some numbers"; options[i]->desc = "an array of numbers"; options[i]->type = SANE_TYPE_INT; options[i]->unit = SANE_UNIT_NONE; options[i]->size = sizeof (SANE_Word) * 7; options[i]->cap = SANE_CAP_SOFT_SELECT; options[i]->constraint_type = SANE_CONSTRAINT_RANGE; options[i]->constraint.range = &model_range; values[i] = numbers; i++; config.descriptors = options; config.values = values; config.count = i; /* configure and attach */ status = sanei_configure_attach (CONFIG_PATH "/data/word-array.conf", &config, check_config_attach); /* check results */ assert (status == SANE_STATUS_GOOD); for (i = 0; i < 7; i++) { assert (numbers[i] == 1000 + 100 * i); } }
SANE_Status sane_get_devices (const SANE_Device *** device_list, SANE_Bool local) { SANEI_Config config; struct device *dev; int dev_count; int i; DBG (3, "%s: %p, %d\n", __FUNCTION__, (const void *)device_list, local); if (devlist) { if (device_list) *device_list = devlist; return SANE_STATUS_GOOD; } free_devices (); config.count = 0; config.descriptors = NULL; config.values = NULL; sanei_configure_attach (XEROX_CONFIG_FILE, &config, list_conf_devices); for (dev_count = 0, dev = devices_head; dev; dev = dev->next) dev_count++; devlist = malloc ((dev_count + 1) * sizeof (*devlist)); if (!devlist) { DBG (1, "%s: malloc: no memory\n", __FUNCTION__); return SANE_STATUS_NO_MEM; } for (i = 0, dev = devices_head; dev; dev = dev->next) devlist[i++] = &dev->sane; devlist[i++] = NULL; if (device_list) *device_list = devlist; return SANE_STATUS_GOOD; }
static void snapscan (void) { SANE_Status status; SANEI_Config config; SANE_Char firmware[128]; SANE_Option_Descriptor *options[1]; void *values[1]; int i; i = 0; options[i] = (SANE_Option_Descriptor *) malloc (sizeof (SANE_Option_Descriptor)); options[i]->name = "firmware"; options[i]->title = "scanner's firmware path"; options[i]->desc = "user provided scanner's full path"; options[i]->type = SANE_TYPE_STRING; options[i]->unit = SANE_UNIT_NONE; options[i]->size = sizeof (firmware); options[i]->cap = SANE_CAP_SOFT_SELECT; options[i]->constraint_type = SANE_CONSTRAINT_NONE; values[i] = firmware; i++; config.descriptors = options; config.values = values; config.count = i; /* configure and attach */ status = sanei_configure_attach (CONFIG_PATH "/data/snapscan.conf", &config, check_config_attach); /* check results */ assert (status == SANE_STATUS_GOOD); assert (strcmp (firmware, "/usr/share/sane/snapscan/your-firmwarefile.bin") == 0); /* TODO must test attach() done */ }
/* * int option out of range */ static void wrong_range_int_option (void) { SANE_Status status; SANEI_Config config; SANE_Word modelnumber = -1; SANE_Option_Descriptor *options[1]; void *values[1]; int i; i = 0; options[i] = (SANE_Option_Descriptor *) malloc (sizeof (SANE_Option_Descriptor)); options[i]->name = "modelnumber"; options[i]->title = "model number"; options[i]->desc = "user provided scanner's model number"; options[i]->type = SANE_TYPE_INT; options[i]->unit = SANE_UNIT_NONE; options[i]->size = sizeof (SANE_Word); options[i]->cap = SANE_CAP_SOFT_SELECT; options[i]->constraint_type = SANE_CONSTRAINT_RANGE; options[i]->constraint.range = &model_range; values[i] = &modelnumber; i++; config.descriptors = options; config.values = values; config.count = i; /* configure and attach */ status = sanei_configure_attach (CONFIG_PATH "/data/wrong-range.conf", &config, check_config_attach); /* check results */ assert (status == SANE_STATUS_INVAL); assert (modelnumber == -1); }
/* * fixed option with value out of range */ static void wrong_fixed_option (void) { SANE_Status status; SANEI_Config config; SANE_Word height; SANE_Option_Descriptor *options[1]; void *values[1]; int i; i = 0; options[i] = (SANE_Option_Descriptor *) malloc (sizeof (SANE_Option_Descriptor)); options[i]->name = "height"; options[i]->title = "height"; options[i]->type = SANE_TYPE_FIXED; options[i]->unit = SANE_UNIT_NONE; options[i]->size = sizeof (SANE_Word); options[i]->cap = SANE_CAP_SOFT_SELECT; options[i]->constraint_type = SANE_CONSTRAINT_RANGE; options[i]->constraint.range = &height_range; values[i] = &height; i++; config.descriptors = options; config.values = values; config.count = i; /* configure and attach */ status = sanei_configure_attach (CONFIG_PATH "/data/wrong-fixed.conf", &config, check_config_attach); /* check results */ assert (status == SANE_STATUS_INVAL); }
/* * fixed option */ static void fixed_option (void) { SANE_Status status; SANEI_Config config; SANE_Word width, height, fixedarray[7]; SANE_Option_Descriptor *options[3]; void *values[3]; int i; i = 0; options[i] = (SANE_Option_Descriptor *) malloc (sizeof (SANE_Option_Descriptor)); options[i]->name = "width"; options[i]->title = "width"; options[i]->type = SANE_TYPE_FIXED; options[i]->unit = SANE_UNIT_NONE; options[i]->size = sizeof (SANE_Word); options[i]->cap = SANE_CAP_SOFT_SELECT; options[i]->constraint_type = SANE_CONSTRAINT_NONE; values[i] = &width; i++; options[i] = (SANE_Option_Descriptor *) malloc (sizeof (SANE_Option_Descriptor)); options[i]->name = "height"; options[i]->title = "height"; options[i]->type = SANE_TYPE_FIXED; options[i]->unit = SANE_UNIT_NONE; options[i]->size = sizeof (SANE_Word); options[i]->cap = SANE_CAP_SOFT_SELECT; options[i]->constraint_type = SANE_CONSTRAINT_NONE; values[i] = &height; i++; options[i] = (SANE_Option_Descriptor *) malloc (sizeof (SANE_Option_Descriptor)); options[i]->name = "array-of-fixed"; options[i]->title = "array of fixed"; options[i]->type = SANE_TYPE_FIXED; options[i]->unit = SANE_UNIT_NONE; options[i]->size = sizeof (fixedarray); options[i]->cap = SANE_CAP_SOFT_SELECT; options[i]->constraint_type = SANE_CONSTRAINT_RANGE; options[i]->constraint.range = &height_range; values[i] = fixedarray; i++; config.descriptors = options; config.values = values; config.count = i; /* configure and attach */ status = sanei_configure_attach (CONFIG_PATH "/data/fixed.conf", &config, check_config_attach); /* check results */ assert (status == SANE_STATUS_GOOD); assert (width == SANE_FIX (21.0)); assert (height == SANE_FIX (29.7)); for (i = 0; i < 7; i++) { assert (fixedarray[i] == SANE_FIX (2.0 + 0.1 * ((float) i))); } }
/* * real umax_pp confiugration file parsing */ static void umax_pp (void) { SANE_Status status; SANEI_Config config; SANE_Option_Descriptor *options[9]; void *values[9]; int i = 0; /* placeholders for options */ SANE_Word buffersize = -1; SANE_Word redgain = -1; SANE_Word greengain = -1; SANE_Word bluegain = -1; SANE_Word redoffset = -1; SANE_Word greenoffset = -1; SANE_Word blueoffset = -1; SANE_Char model[128]; i = 0; options[i] = (SANE_Option_Descriptor *) malloc (sizeof (SANE_Option_Descriptor)); options[i]->name = "buffer"; options[i]->type = SANE_TYPE_INT; options[i]->unit = SANE_UNIT_NONE; options[i]->size = sizeof (SANE_Word); options[i]->cap = SANE_CAP_SOFT_SELECT; options[i]->constraint_type = SANE_CONSTRAINT_RANGE; options[i]->constraint.range = &buffer_range; values[i] = &buffersize; i++; options[i] = (SANE_Option_Descriptor *) malloc (sizeof (SANE_Option_Descriptor)); options[i]->name = "red-gain"; options[i]->type = SANE_TYPE_INT; options[i]->unit = SANE_UNIT_NONE; options[i]->size = sizeof (SANE_Word); options[i]->cap = SANE_CAP_SOFT_SELECT; options[i]->constraint_type = SANE_CONSTRAINT_RANGE; options[i]->constraint.range = &value16_range; values[i] = &redgain; i++; options[i] = (SANE_Option_Descriptor *) malloc (sizeof (SANE_Option_Descriptor)); options[i]->name = "green-gain"; options[i]->type = SANE_TYPE_INT; options[i]->unit = SANE_UNIT_NONE; options[i]->size = sizeof (SANE_Word); options[i]->cap = SANE_CAP_SOFT_SELECT; options[i]->constraint_type = SANE_CONSTRAINT_RANGE; options[i]->constraint.range = &value16_range; values[i] = &greengain; i++; options[i] = (SANE_Option_Descriptor *) malloc (sizeof (SANE_Option_Descriptor)); options[i]->name = "blue-gain"; options[i]->type = SANE_TYPE_INT; options[i]->unit = SANE_UNIT_NONE; options[i]->size = sizeof (SANE_Word); options[i]->cap = SANE_CAP_SOFT_SELECT; options[i]->constraint_type = SANE_CONSTRAINT_RANGE; options[i]->constraint.range = &value16_range; values[i] = &bluegain; i++; options[i] = (SANE_Option_Descriptor *) malloc (sizeof (SANE_Option_Descriptor)); options[i]->name = "red-offset"; options[i]->type = SANE_TYPE_INT; options[i]->unit = SANE_UNIT_NONE; options[i]->size = sizeof (SANE_Word); options[i]->cap = SANE_CAP_SOFT_SELECT; options[i]->constraint_type = SANE_CONSTRAINT_RANGE; options[i]->constraint.range = &value16_range; values[i] = &redoffset; i++; options[i] = (SANE_Option_Descriptor *) malloc (sizeof (SANE_Option_Descriptor)); options[i]->name = "green-offset"; options[i]->type = SANE_TYPE_INT; options[i]->unit = SANE_UNIT_NONE; options[i]->size = sizeof (SANE_Word); options[i]->cap = SANE_CAP_SOFT_SELECT; options[i]->constraint_type = SANE_CONSTRAINT_RANGE; options[i]->constraint.range = &value16_range; values[i] = &greenoffset; i++; options[i] = (SANE_Option_Descriptor *) malloc (sizeof (SANE_Option_Descriptor)); options[i]->name = "blue-offset"; options[i]->type = SANE_TYPE_INT; options[i]->unit = SANE_UNIT_NONE; options[i]->size = sizeof (SANE_Word); options[i]->cap = SANE_CAP_SOFT_SELECT; options[i]->constraint_type = SANE_CONSTRAINT_RANGE; options[i]->constraint.range = &value16_range; values[i] = &blueoffset; i++; options[i] = (SANE_Option_Descriptor *) malloc (sizeof (SANE_Option_Descriptor)); options[i]->name = "astra"; options[i]->type = SANE_TYPE_STRING; options[i]->unit = SANE_UNIT_NONE; options[i]->size = 128; options[i]->cap = SANE_CAP_SOFT_SELECT; options[i]->constraint_type = SANE_CONSTRAINT_STRING_LIST; options[i]->constraint.string_list = astra_models; values[i] = &model; i++; config.descriptors = options; config.values = values; config.count = i; model[0] = 0; /* configure and attach */ status = sanei_configure_attach (CONFIG_PATH "/data/umax_pp.conf", &config, check_config_attach); /* check results */ assert (status == SANE_STATUS_GOOD); assert (buffersize == 1048576); assert (redgain == 1); assert (greengain == 2); assert (bluegain == 3); assert (redoffset == 4); assert (greenoffset == 5); assert (blueoffset == 6); assert (strcmp (model, "1600") == 0); assert (strcmp (lastdevname, "port safe-auto") == 0); /* free memory */ while (i > 0) { i--; free (options[i]); } }