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