xref: /third_party/backends/frontend/test.c (revision 141cc406)
1/* sane - Scanner Access Now Easy.
2   Copyright (C) 1997 Andreas Beck
3   This file is part of the SANE package.
4
5   SANE is free software; you can redistribute it and/or modify it under
6   the terms of the GNU General Public License as published by the Free
7   Software Foundation; either version 2 of the License, or (at your
8   option) any later version.
9
10   SANE is distributed in the hope that it will be useful, but WITHOUT
11   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
13   for more details.
14
15   You should have received a copy of the GNU General Public License
16   along with sane; see the file COPYING.
17   If not, see <https://www.gnu.org/licenses/>.
18
19   This file implements a simple SANE frontend (well it rather is a
20   transport layer, but seen from libsane it is a frontend) which acts
21   as a NETSANE server. The NETSANE specifications should have come
22   with this package.
23   Feel free to enhance this program ! It needs extension especially
24   regarding crypto-support and authentication.
25 */
26
27#include <ctype.h>
28#include <limits.h>
29#include <stdio.h>
30#include <stdlib.h>
31#include <string.h>
32#include <unistd.h>
33
34#include <sys/socket.h>
35#include <sys/types.h>
36
37#include <netdb.h>
38#include <netinet/in.h>
39
40#include "../include/sane/sane.h"
41
42void
43auth_callback (SANE_String_Const domain,
44	       SANE_Char *username,
45	       SANE_Char *password)
46{
47  printf ("Client '%s' requested authorization.\nUser:\n", domain);
48  scanf ("%s", username);
49  printf ("Password:\n");
50  scanf ("%s", password);
51  return;
52}
53
54void
55testsane (const char *dev_name)
56{
57  int hlp, x;
58  SANE_Status bla;
59  SANE_Int blubb;
60  SANE_Handle hand;
61  SANE_Parameters pars;
62  const SANE_Option_Descriptor *sod;
63  const SANE_Device **device_list;
64  char buffer[2048];
65
66  bla = sane_init (&blubb, auth_callback);
67  fprintf (stderr, "Init : stat=%d ver=%x\nPress Enter to continue...",
68	   bla, blubb);
69  getchar ();
70  if (bla != SANE_STATUS_GOOD)
71    return;
72
73  bla = sane_get_devices (&device_list, SANE_FALSE);
74  fprintf (stderr, "GetDev : stat=%s\n", sane_strstatus (bla));
75  if (bla != SANE_STATUS_GOOD)
76    return;
77
78  bla = sane_open (dev_name, &hand);
79  fprintf (stderr, "Open : stat=%s hand=%p\n", sane_strstatus (bla), hand);
80  if (bla != SANE_STATUS_GOOD)
81    return;
82
83  bla = sane_set_io_mode (hand, 0);
84  fprintf (stderr, "SetIoMode : stat=%s\n", sane_strstatus (bla));
85
86  for (hlp = 0; hlp < 9999; hlp++)
87    {
88      sod = sane_get_option_descriptor (hand, hlp);
89      if (sod == NULL)
90	break;
91      fprintf (stderr, "Gopt(%d) : stat=%p\n", hlp, sod);
92      fprintf (stderr, "name : %s\n", sod->name);
93      fprintf (stderr, "title: %s\n", sod->title);
94      fprintf (stderr, "desc : %s\n", sod->desc);
95
96      fprintf (stderr, "type : %d\n", sod->type);
97      fprintf (stderr, "unit : %d\n", sod->unit);
98      fprintf (stderr, "size : %d\n", sod->size);
99      fprintf (stderr, "cap  : %d\n", sod->cap);
100      fprintf (stderr, "ctyp : %d\n", sod->constraint_type);
101      switch (sod->constraint_type)
102	{
103	case SANE_CONSTRAINT_NONE:
104	  break;
105	case SANE_CONSTRAINT_STRING_LIST:
106	  fprintf (stderr, "stringlist:\n");
107	  break;
108	case SANE_CONSTRAINT_WORD_LIST:
109	  fprintf (stderr, "wordlist (%d) : ", sod->constraint.word_list[0]);
110	  for (x = 1; x <= sod->constraint.word_list[0]; x++)
111	    fprintf (stderr, " %d ", sod->constraint.word_list[x]);
112	  fprintf (stderr, "\n");
113	  break;
114	case SANE_CONSTRAINT_RANGE:
115	  fprintf (stderr, "range: %d-%d %d \n", sod->constraint.range->min,
116		   sod->constraint.range->max, sod->constraint.range->quant);
117	  break;
118	}
119    }
120
121  bla = sane_get_parameters (hand, &pars);
122  fprintf (stderr,
123	   "Parm : stat=%s form=%d,lf=%d,bpl=%d,pixpl=%d,lin=%d,dep=%d\n",
124	   sane_strstatus (bla),
125	   pars.format, pars.last_frame,
126	   pars.bytes_per_line, pars.pixels_per_line,
127	   pars.lines, pars.depth);
128  if (bla != SANE_STATUS_GOOD)
129    return;
130
131  bla = sane_start (hand);
132  fprintf (stderr, "Start : stat=%s\n", sane_strstatus (bla));
133  if (bla != SANE_STATUS_GOOD)
134    return;
135
136  do
137    {
138      bla = sane_read (hand, buffer, sizeof (buffer), &blubb);
139      /*printf("Read : stat=%s len=%d\n",sane_strstatus (bla),blubb); */
140      if (bla != SANE_STATUS_GOOD)
141	{
142	  if (bla == SANE_STATUS_EOF)
143	    break;
144	  return;
145	}
146      fwrite (buffer, 1, blubb, stdout);
147    }
148  while (1);
149
150  sane_cancel (hand);
151  fprintf (stderr, "Cancel.\n");
152
153  sane_close (hand);
154  fprintf (stderr, "Close\n");
155
156  for (hlp = 0; hlp < 20; hlp++)
157    fprintf (stderr, "STRS %d=%s\n", hlp, sane_strstatus (hlp));
158
159  fprintf (stderr, "Exit.\n");
160}
161
162int
163main (int argc, char *argv[])
164{
165  if (argc != 2 && argc != 3)
166    {
167      fprintf (stderr, "Usage: %s devicename [hostname]\n", argv[0]);
168      exit (0);
169    }
170  if (argc == 3)
171    {
172      char envbuf[1024];
173      sprintf (envbuf, "SANE_NET_HOST=%s", argv[2]);
174      putenv (envbuf);
175    }
176
177  fprintf (stderr, "This is a SANE test application.\n"
178	   "Now connecting to device %s.\n", argv[1]);
179  testsane (argv[1]);
180  sane_exit ();
181  return 0;
182}
183