1141cc406Sopenharmony_ci#include "../include/sane/config.h" 2141cc406Sopenharmony_ci#include <stdio.h> 3141cc406Sopenharmony_ci#include <stdlib.h> 4141cc406Sopenharmony_ci#include <string.h> 5141cc406Sopenharmony_ci#include <unistd.h> 6141cc406Sopenharmony_ci 7141cc406Sopenharmony_ci#include <sys/fcntl.h> 8141cc406Sopenharmony_ci 9141cc406Sopenharmony_ci#include "../include/sane/sane.h" 10141cc406Sopenharmony_ci#include "../include/sane/sanei.h" 11141cc406Sopenharmony_ci#include "../include/sane/sanei_wire.h" 12141cc406Sopenharmony_ci#include "../include/sane/sanei_codec_ascii.h" 13141cc406Sopenharmony_ci#include "../include/sane/sanei_codec_bin.h" 14141cc406Sopenharmony_ci 15141cc406Sopenharmony_cistatic Wire w; 16141cc406Sopenharmony_ci 17141cc406Sopenharmony_cistatic SANE_Word dpi_word_list[] = { 18141cc406Sopenharmony_ci 4, /* # of elements */ 19141cc406Sopenharmony_ci 3, 30, 300, -600 20141cc406Sopenharmony_ci}; 21141cc406Sopenharmony_ci 22141cc406Sopenharmony_cistatic SANE_String_Const mode_list[] = { 23141cc406Sopenharmony_ci "Lineart", "Grayscale", "Color", 0 24141cc406Sopenharmony_ci}; 25141cc406Sopenharmony_ci 26141cc406Sopenharmony_cistatic char *program_name; 27141cc406Sopenharmony_cistatic char *default_codec = "bin"; 28141cc406Sopenharmony_cistatic char *default_outfile = "test_wire.out"; 29141cc406Sopenharmony_ci 30141cc406Sopenharmony_cistatic int 31141cc406Sopenharmony_ciusage (int code) 32141cc406Sopenharmony_ci{ 33141cc406Sopenharmony_ci if (code == 0) 34141cc406Sopenharmony_ci { 35141cc406Sopenharmony_ci printf ("Usage: %s [OPTION]...\n\ 36141cc406Sopenharmony_ci\n\ 37141cc406Sopenharmony_ciTest the SANE wire manipulation library.\n\ 38141cc406Sopenharmony_ci\n\ 39141cc406Sopenharmony_ci --codec=CODEC set the codec [default=%s]\n\ 40141cc406Sopenharmony_ci --help display this message and exit\n\ 41141cc406Sopenharmony_ci-o, --output=FILE set the output file [default=%s]\n\ 42141cc406Sopenharmony_ci --readonly do not create FILE, just read it\n\ 43141cc406Sopenharmony_ci --version print version information\n\ 44141cc406Sopenharmony_ci\n\ 45141cc406Sopenharmony_ciValid CODECs are: `ascii' `bin'\n", program_name, default_codec, default_outfile); 46141cc406Sopenharmony_ci } 47141cc406Sopenharmony_ci else 48141cc406Sopenharmony_ci { 49141cc406Sopenharmony_ci fprintf (stderr, "Type ``%s --help'' for more information.\n", 50141cc406Sopenharmony_ci program_name); 51141cc406Sopenharmony_ci } 52141cc406Sopenharmony_ci exit (code); 53141cc406Sopenharmony_ci} 54141cc406Sopenharmony_ci 55141cc406Sopenharmony_ci 56141cc406Sopenharmony_ciint 57141cc406Sopenharmony_cimain (int __sane_unused__ arg, char **argv) 58141cc406Sopenharmony_ci{ 59141cc406Sopenharmony_ci SANE_Option_Descriptor desc[2], *desc_ptr; 60141cc406Sopenharmony_ci SANE_Word len; 61141cc406Sopenharmony_ci char *codec = default_codec; 62141cc406Sopenharmony_ci char *outfile = default_outfile; 63141cc406Sopenharmony_ci int readonly = 0; 64141cc406Sopenharmony_ci 65141cc406Sopenharmony_ci program_name = argv[0]; 66141cc406Sopenharmony_ci argv++; 67141cc406Sopenharmony_ci while (*argv != 0) 68141cc406Sopenharmony_ci { 69141cc406Sopenharmony_ci if (!strcmp (*argv, "--codec")) 70141cc406Sopenharmony_ci { 71141cc406Sopenharmony_ci if (argv[1] == 0) 72141cc406Sopenharmony_ci { 73141cc406Sopenharmony_ci fprintf (stderr, "%s: option `%s' requires an argument\n", 74141cc406Sopenharmony_ci program_name, *argv); 75141cc406Sopenharmony_ci usage (1); 76141cc406Sopenharmony_ci } 77141cc406Sopenharmony_ci 78141cc406Sopenharmony_ci argv++; 79141cc406Sopenharmony_ci codec = *argv; 80141cc406Sopenharmony_ci } 81141cc406Sopenharmony_ci else if (!strncmp (*argv, "--codec=", 8)) 82141cc406Sopenharmony_ci { 83141cc406Sopenharmony_ci codec = *argv + 8; 84141cc406Sopenharmony_ci } 85141cc406Sopenharmony_ci else if (!strcmp (*argv, "--help")) 86141cc406Sopenharmony_ci { 87141cc406Sopenharmony_ci usage (0); 88141cc406Sopenharmony_ci } 89141cc406Sopenharmony_ci else if (!strcmp (*argv, "-o") || !strcmp (*argv, "--output")) 90141cc406Sopenharmony_ci { 91141cc406Sopenharmony_ci if (argv[1] == 0) 92141cc406Sopenharmony_ci { 93141cc406Sopenharmony_ci fprintf (stderr, "%s: option `%s' requires an argument\n", 94141cc406Sopenharmony_ci program_name, *argv); 95141cc406Sopenharmony_ci usage (1); 96141cc406Sopenharmony_ci } 97141cc406Sopenharmony_ci 98141cc406Sopenharmony_ci argv++; 99141cc406Sopenharmony_ci outfile = *argv; 100141cc406Sopenharmony_ci } 101141cc406Sopenharmony_ci else if (!strncmp (*argv, "--output=", 9)) 102141cc406Sopenharmony_ci { 103141cc406Sopenharmony_ci outfile = *argv + 9; 104141cc406Sopenharmony_ci } 105141cc406Sopenharmony_ci else if (!strcmp (*argv, "--readonly")) 106141cc406Sopenharmony_ci { 107141cc406Sopenharmony_ci readonly = 1; 108141cc406Sopenharmony_ci } 109141cc406Sopenharmony_ci else if (!strcmp (*argv, "--version")) 110141cc406Sopenharmony_ci { 111141cc406Sopenharmony_ci printf ("test_wire (%s) %s\n", PACKAGE, VERSION); 112141cc406Sopenharmony_ci exit (0); 113141cc406Sopenharmony_ci } 114141cc406Sopenharmony_ci else if (**argv == '-') 115141cc406Sopenharmony_ci { 116141cc406Sopenharmony_ci fprintf (stderr, "%s: unrecognized option `%s'\n", 117141cc406Sopenharmony_ci program_name, *argv); 118141cc406Sopenharmony_ci usage (1); 119141cc406Sopenharmony_ci } 120141cc406Sopenharmony_ci else 121141cc406Sopenharmony_ci { 122141cc406Sopenharmony_ci fprintf (stderr, "%s: too many arguments\n", program_name); 123141cc406Sopenharmony_ci } 124141cc406Sopenharmony_ci 125141cc406Sopenharmony_ci argv++; 126141cc406Sopenharmony_ci } 127141cc406Sopenharmony_ci 128141cc406Sopenharmony_ci 129141cc406Sopenharmony_ci if (!strcmp (codec, "bin")) 130141cc406Sopenharmony_ci sanei_w_init (&w, sanei_codec_bin_init); 131141cc406Sopenharmony_ci else if (!strcmp (codec, "ascii")) 132141cc406Sopenharmony_ci sanei_w_init (&w, sanei_codec_ascii_init); 133141cc406Sopenharmony_ci else 134141cc406Sopenharmony_ci { 135141cc406Sopenharmony_ci fprintf (stderr, "%s: unknown codec type `%s'\n", program_name, codec); 136141cc406Sopenharmony_ci usage (1); 137141cc406Sopenharmony_ci } 138141cc406Sopenharmony_ci 139141cc406Sopenharmony_ci desc[0].name = "resolution"; 140141cc406Sopenharmony_ci desc[0].title = 0; 141141cc406Sopenharmony_ci desc[0].desc = "Determines scan resolution in dots/inch (\"DPI\")."; 142141cc406Sopenharmony_ci desc[0].type = SANE_TYPE_FIXED; 143141cc406Sopenharmony_ci desc[0].unit = SANE_UNIT_DPI; 144141cc406Sopenharmony_ci desc[0].size = sizeof (SANE_Word); 145141cc406Sopenharmony_ci desc[0].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT; 146141cc406Sopenharmony_ci desc[0].constraint_type = SANE_CONSTRAINT_WORD_LIST; 147141cc406Sopenharmony_ci desc[0].constraint.word_list = dpi_word_list; 148141cc406Sopenharmony_ci 149141cc406Sopenharmony_ci desc[1].name = "mode"; 150141cc406Sopenharmony_ci desc[1].title = "Scan Mode"; 151141cc406Sopenharmony_ci desc[1].desc = "Determines scan mode."; 152141cc406Sopenharmony_ci desc[1].type = SANE_TYPE_STRING; 153141cc406Sopenharmony_ci desc[1].unit = SANE_UNIT_NONE; 154141cc406Sopenharmony_ci desc[1].size = 10; 155141cc406Sopenharmony_ci desc[1].cap = (SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT 156141cc406Sopenharmony_ci | SANE_CAP_AUTOMATIC); 157141cc406Sopenharmony_ci desc[1].constraint_type = SANE_CONSTRAINT_STRING_LIST; 158141cc406Sopenharmony_ci desc[1].constraint.string_list = mode_list; 159141cc406Sopenharmony_ci 160141cc406Sopenharmony_ci { 161141cc406Sopenharmony_ci int flags; 162141cc406Sopenharmony_ci if (readonly) 163141cc406Sopenharmony_ci { 164141cc406Sopenharmony_ci printf ("reading %s output from %s\n", codec, outfile); 165141cc406Sopenharmony_ci flags = O_RDONLY; 166141cc406Sopenharmony_ci } 167141cc406Sopenharmony_ci else 168141cc406Sopenharmony_ci { 169141cc406Sopenharmony_ci printf ("creating %s\n", outfile); 170141cc406Sopenharmony_ci flags = O_RDWR | O_CREAT | O_TRUNC; 171141cc406Sopenharmony_ci } 172141cc406Sopenharmony_ci 173141cc406Sopenharmony_ci w.io.fd = open (outfile, flags, 0666); 174141cc406Sopenharmony_ci 175141cc406Sopenharmony_ci if (w.io.fd < 0) 176141cc406Sopenharmony_ci { 177141cc406Sopenharmony_ci perror (outfile); 178141cc406Sopenharmony_ci return -1; 179141cc406Sopenharmony_ci } 180141cc406Sopenharmony_ci } 181141cc406Sopenharmony_ci w.io.read = read; 182141cc406Sopenharmony_ci w.io.write = readonly ? 0 : write; 183141cc406Sopenharmony_ci 184141cc406Sopenharmony_ci if (!readonly) 185141cc406Sopenharmony_ci { 186141cc406Sopenharmony_ci sanei_w_set_dir (&w, WIRE_ENCODE); 187141cc406Sopenharmony_ci w.status = 0; 188141cc406Sopenharmony_ci 189141cc406Sopenharmony_ci len = NELEMS (desc); 190141cc406Sopenharmony_ci desc_ptr = desc; 191141cc406Sopenharmony_ci sanei_w_array (&w, &len, (void **) &desc_ptr, 192141cc406Sopenharmony_ci (WireCodecFunc) sanei_w_option_descriptor, 193141cc406Sopenharmony_ci sizeof (desc[0])); 194141cc406Sopenharmony_ci 195141cc406Sopenharmony_ci if (w.status == 0) 196141cc406Sopenharmony_ci printf ("%s encode successful\n", codec); 197141cc406Sopenharmony_ci else 198141cc406Sopenharmony_ci fprintf (stderr, "%s: %s encode error %d: %s\n", 199141cc406Sopenharmony_ci codec, program_name, w.status, strerror (w.status)); 200141cc406Sopenharmony_ci 201141cc406Sopenharmony_ci printf ("%s output written to %s\n", codec, outfile); 202141cc406Sopenharmony_ci } 203141cc406Sopenharmony_ci 204141cc406Sopenharmony_ci sanei_w_set_dir (&w, WIRE_DECODE); 205141cc406Sopenharmony_ci w.status = 0; 206141cc406Sopenharmony_ci 207141cc406Sopenharmony_ci if (!readonly) 208141cc406Sopenharmony_ci { 209141cc406Sopenharmony_ci printf ("reading %s output from %s\n", codec, outfile); 210141cc406Sopenharmony_ci lseek (w.io.fd, 0, SEEK_SET); 211141cc406Sopenharmony_ci } 212141cc406Sopenharmony_ci 213141cc406Sopenharmony_ci sanei_w_array (&w, &len, (void **) &desc_ptr, 214141cc406Sopenharmony_ci (WireCodecFunc) sanei_w_option_descriptor, sizeof (desc[0])); 215141cc406Sopenharmony_ci 216141cc406Sopenharmony_ci if (w.status == 0) 217141cc406Sopenharmony_ci printf ("%s decode successful\n", codec); 218141cc406Sopenharmony_ci else 219141cc406Sopenharmony_ci fprintf (stderr, "%s: %s decode error %d: %s\n", 220141cc406Sopenharmony_ci program_name, codec, w.status, strerror (w.status)); 221141cc406Sopenharmony_ci 222141cc406Sopenharmony_ci sanei_w_set_dir (&w, WIRE_FREE); 223141cc406Sopenharmony_ci w.status = 0; 224141cc406Sopenharmony_ci sanei_w_array (&w, &len, (void **) &desc_ptr, 225141cc406Sopenharmony_ci (WireCodecFunc) sanei_w_option_descriptor, sizeof (desc[0])); 226141cc406Sopenharmony_ci 227141cc406Sopenharmony_ci if (w.status == 0) 228141cc406Sopenharmony_ci printf ("free successful\n"); 229141cc406Sopenharmony_ci else 230141cc406Sopenharmony_ci fprintf (stderr, "%s: free error %d: %s\n", 231141cc406Sopenharmony_ci program_name, w.status, strerror (w.status)); 232141cc406Sopenharmony_ci 233141cc406Sopenharmony_ci close (w.io.fd); 234141cc406Sopenharmony_ci 235141cc406Sopenharmony_ci return 0; 236141cc406Sopenharmony_ci} 237