| 
									
										
										
										
											2009-05-08 03:06:20 +00:00
										 |  |  | #include "../include/sane/config.h"
 | 
					
						
							| 
									
										
										
										
											1999-08-09 18:06:01 +00:00
										 |  |  | #include <stdio.h>
 | 
					
						
							|  |  |  | #include <stdlib.h>
 | 
					
						
							|  |  |  | #include <string.h>
 | 
					
						
							|  |  |  | #include <unistd.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <sys/fcntl.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-08 03:06:20 +00:00
										 |  |  | #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"
 | 
					
						
							| 
									
										
										
										
											1999-08-09 18:06:01 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | static Wire w; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-20 05:10:22 +00:00
										 |  |  | static SANE_Word dpi_word_list[] = { | 
					
						
							|  |  |  |   4,				/* # of elements */ | 
					
						
							|  |  |  |   3, 30, 300, -600 | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											1999-08-09 18:06:01 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-20 05:10:22 +00:00
										 |  |  | static SANE_String_Const mode_list[] = { | 
					
						
							|  |  |  |   "Lineart", "Grayscale", "Color", 0 | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											1999-08-09 18:06:01 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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\ | 
					
						
							| 
									
										
										
										
											2013-03-20 05:10:22 +00:00
										 |  |  | Valid CODECs are: `ascii' `bin'\n", program_name, default_codec, default_outfile); | 
					
						
							| 
									
										
										
										
											1999-08-09 18:06:01 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       fprintf (stderr, "Type ``%s --help'' for more information.\n", | 
					
						
							|  |  |  | 	       program_name); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   exit (code); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int | 
					
						
							| 
									
										
										
										
											2017-05-14 10:47:31 +00:00
										 |  |  | main (int __sane_unused__ arg, char **argv) | 
					
						
							| 
									
										
										
										
											1999-08-09 18:06:01 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   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]; | 
					
						
							| 
									
										
										
										
											2013-03-20 05:10:22 +00:00
										 |  |  |   argv++; | 
					
						
							| 
									
										
										
										
											1999-08-09 18:06:01 +00:00
										 |  |  |   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); | 
					
						
							|  |  |  | 	    } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-20 05:10:22 +00:00
										 |  |  | 	  argv++; | 
					
						
							| 
									
										
										
										
											1999-08-09 18:06:01 +00:00
										 |  |  | 	  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); | 
					
						
							|  |  |  | 	    } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-20 05:10:22 +00:00
										 |  |  | 	  argv++; | 
					
						
							| 
									
										
										
										
											1999-08-09 18:06:01 +00:00
										 |  |  | 	  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); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-20 05:10:22 +00:00
										 |  |  |       argv++; | 
					
						
							| 
									
										
										
										
											1999-08-09 18:06:01 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   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"; | 
					
						
							| 
									
										
										
										
											2013-03-20 05:10:22 +00:00
										 |  |  |   desc[1].title = "Scan Mode"; | 
					
						
							| 
									
										
										
										
											1999-08-09 18:06:01 +00:00
										 |  |  |   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; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2013-03-20 05:10:22 +00:00
										 |  |  |   w.io.read = read; | 
					
						
							| 
									
										
										
										
											1999-08-09 18:06:01 +00:00
										 |  |  |   w.io.write = readonly ? 0 : write; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (!readonly) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       sanei_w_set_dir (&w, WIRE_ENCODE); | 
					
						
							|  |  |  |       w.status = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-20 05:10:22 +00:00
										 |  |  |       len = NELEMS (desc); | 
					
						
							| 
									
										
										
										
											1999-08-09 18:06:01 +00:00
										 |  |  |       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; | 
					
						
							|  |  |  | } |