kopia lustrzana https://gitlab.com/sane-project/backends
240 wiersze
5.4 KiB
C
240 wiersze
5.4 KiB
C
#include "../include/sane/config.h"
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
|
|
#include <sys/fcntl.h>
|
|
|
|
#include "../include/sane/sane.h"
|
|
#include "../include/sane/sanei.h"
|
|
#include "../include/sane/sanei_wire.h"
|
|
#include "../include/sane/sanei_codec_ascii.h"
|
|
#include "../include/sane/sanei_codec_bin.h"
|
|
|
|
static Wire w;
|
|
|
|
static SANE_Word dpi_word_list[] =
|
|
{
|
|
4, /* # of elements */
|
|
3, 30, 300, -600
|
|
};
|
|
|
|
static SANE_String_Const mode_list[] =
|
|
{
|
|
"Lineart", "Grayscale", "Color", 0
|
|
};
|
|
|
|
static char *program_name;
|
|
static char *default_codec = "bin";
|
|
static char *default_outfile = "test_wire.out";
|
|
|
|
static int
|
|
usage (int code)
|
|
{
|
|
if (code == 0)
|
|
{
|
|
printf ("Usage: %s [OPTION]...\n\
|
|
\n\
|
|
Test the SANE wire manipulation library.\n\
|
|
\n\
|
|
--codec=CODEC set the codec [default=%s]\n\
|
|
--help display this message and exit\n\
|
|
-o, --output=FILE set the output file [default=%s]\n\
|
|
--readonly do not create FILE, just read it\n\
|
|
--version print version information\n\
|
|
\n\
|
|
Valid CODECs are: `ascii' `bin'\n",
|
|
program_name, default_codec, default_outfile);
|
|
}
|
|
else
|
|
{
|
|
fprintf (stderr, "Type ``%s --help'' for more information.\n",
|
|
program_name);
|
|
}
|
|
exit (code);
|
|
}
|
|
|
|
|
|
int
|
|
main (int argc, char ** argv)
|
|
{
|
|
SANE_Option_Descriptor desc[2], *desc_ptr;
|
|
SANE_Word len;
|
|
char *codec = default_codec;
|
|
char *outfile = default_outfile;
|
|
int readonly = 0;
|
|
|
|
program_name = argv[0];
|
|
argv ++;
|
|
while (*argv != 0)
|
|
{
|
|
if (!strcmp (*argv, "--codec"))
|
|
{
|
|
if (argv[1] == 0)
|
|
{
|
|
fprintf (stderr, "%s: option `%s' requires an argument\n",
|
|
program_name, *argv);
|
|
usage (1);
|
|
}
|
|
|
|
argv ++;
|
|
codec = *argv;
|
|
}
|
|
else if (!strncmp (*argv, "--codec=", 8))
|
|
{
|
|
codec = *argv + 8;
|
|
}
|
|
else if (!strcmp (*argv, "--help"))
|
|
{
|
|
usage (0);
|
|
}
|
|
else if (!strcmp (*argv, "-o") || !strcmp (*argv, "--output"))
|
|
{
|
|
if (argv[1] == 0)
|
|
{
|
|
fprintf (stderr, "%s: option `%s' requires an argument\n",
|
|
program_name, *argv);
|
|
usage (1);
|
|
}
|
|
|
|
argv ++;
|
|
outfile = *argv;
|
|
}
|
|
else if (!strncmp (*argv, "--output=", 9))
|
|
{
|
|
outfile = *argv + 9;
|
|
}
|
|
else if (!strcmp (*argv, "--readonly"))
|
|
{
|
|
readonly = 1;
|
|
}
|
|
else if (!strcmp (*argv, "--version"))
|
|
{
|
|
printf ("test_wire (%s) %s\n", PACKAGE, VERSION);
|
|
exit (0);
|
|
}
|
|
else if (**argv == '-')
|
|
{
|
|
fprintf (stderr, "%s: unrecognized option `%s'\n",
|
|
program_name, *argv);
|
|
usage (1);
|
|
}
|
|
else
|
|
{
|
|
fprintf (stderr, "%s: too many arguments\n", program_name);
|
|
}
|
|
|
|
argv ++;
|
|
}
|
|
|
|
|
|
if (!strcmp (codec, "bin"))
|
|
sanei_w_init (&w, sanei_codec_bin_init);
|
|
else if (!strcmp (codec, "ascii"))
|
|
sanei_w_init (&w, sanei_codec_ascii_init);
|
|
else
|
|
{
|
|
fprintf (stderr, "%s: unknown codec type `%s'\n", program_name, codec);
|
|
usage (1);
|
|
}
|
|
|
|
desc[0].name = "resolution";
|
|
desc[0].title = 0;
|
|
desc[0].desc = "Determines scan resolution in dots/inch (\"DPI\").";
|
|
desc[0].type = SANE_TYPE_FIXED;
|
|
desc[0].unit = SANE_UNIT_DPI;
|
|
desc[0].size = sizeof (SANE_Word);
|
|
desc[0].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
|
|
desc[0].constraint_type = SANE_CONSTRAINT_WORD_LIST;
|
|
desc[0].constraint.word_list = dpi_word_list;
|
|
|
|
desc[1].name = "mode";
|
|
desc[1].title ="Scan Mode";
|
|
desc[1].desc = "Determines scan mode.";
|
|
desc[1].type = SANE_TYPE_STRING;
|
|
desc[1].unit = SANE_UNIT_NONE;
|
|
desc[1].size = 10;
|
|
desc[1].cap = (SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT
|
|
| SANE_CAP_AUTOMATIC);
|
|
desc[1].constraint_type = SANE_CONSTRAINT_STRING_LIST;
|
|
desc[1].constraint.string_list = mode_list;
|
|
|
|
{
|
|
int flags;
|
|
if (readonly)
|
|
{
|
|
printf ("reading %s output from %s\n", codec, outfile);
|
|
flags = O_RDONLY;
|
|
}
|
|
else
|
|
{
|
|
printf ("creating %s\n", outfile);
|
|
flags = O_RDWR | O_CREAT | O_TRUNC;
|
|
}
|
|
|
|
w.io.fd = open (outfile, flags, 0666);
|
|
|
|
if (w.io.fd < 0)
|
|
{
|
|
perror (outfile);
|
|
return -1;
|
|
}
|
|
}
|
|
w.io.read = read;
|
|
w.io.write = readonly ? 0 : write;
|
|
|
|
if (!readonly)
|
|
{
|
|
sanei_w_set_dir (&w, WIRE_ENCODE);
|
|
w.status = 0;
|
|
|
|
len = NELEMS(desc);
|
|
desc_ptr = desc;
|
|
sanei_w_array (&w, &len, (void **) &desc_ptr,
|
|
(WireCodecFunc) sanei_w_option_descriptor,
|
|
sizeof (desc[0]));
|
|
|
|
if (w.status == 0)
|
|
printf ("%s encode successful\n", codec);
|
|
else
|
|
fprintf (stderr, "%s: %s encode error %d: %s\n",
|
|
codec, program_name, w.status, strerror (w.status));
|
|
|
|
printf ("%s output written to %s\n", codec, outfile);
|
|
}
|
|
|
|
sanei_w_set_dir (&w, WIRE_DECODE);
|
|
w.status = 0;
|
|
|
|
if (!readonly)
|
|
{
|
|
printf ("reading %s output from %s\n", codec, outfile);
|
|
lseek (w.io.fd, 0, SEEK_SET);
|
|
}
|
|
|
|
sanei_w_array (&w, &len, (void **) &desc_ptr,
|
|
(WireCodecFunc) sanei_w_option_descriptor, sizeof (desc[0]));
|
|
|
|
if (w.status == 0)
|
|
printf ("%s decode successful\n", codec);
|
|
else
|
|
fprintf (stderr, "%s: %s decode error %d: %s\n",
|
|
program_name, codec, w.status, strerror (w.status));
|
|
|
|
sanei_w_set_dir (&w, WIRE_FREE);
|
|
w.status = 0;
|
|
sanei_w_array (&w, &len, (void **) &desc_ptr,
|
|
(WireCodecFunc) sanei_w_option_descriptor, sizeof (desc[0]));
|
|
|
|
if (w.status == 0)
|
|
printf ("free successful\n");
|
|
else
|
|
fprintf (stderr, "%s: free error %d: %s\n",
|
|
program_name, w.status, strerror (w.status));
|
|
|
|
close (w.io.fd);
|
|
|
|
return 0;
|
|
}
|