1 /* AirScan (a.k.a. eSCL) backend for SANE
2  *
3  * Copyright (C) 2019 and up by Alexander Pevzner (pzz@apevzner.com)
4  * See LICENSE for license terms and conditions
5  *
6  * Routines for SANE options handling
7  */
8 
9 #include "airscan.h"
10 
11 #include <string.h>
12 
13 /******************** Generic functions for IDs ********************/
14 /* Name/value mapping entry
15  */
16 typedef struct {
17     int        id;
18     const char *name;
19 } id_name_table;
20 
21 /* Get name by ID. For unknown ID returns NULL
22  */
23 static const char*
id_name(int id,const id_name_table * table)24 id_name (int id, const id_name_table *table)
25 {
26     int i;
27 
28     for (i = 0; table[i].name != NULL; i ++) {
29         if (table[i].id == id) {
30             return table[i].name;
31         }
32     }
33 
34     return NULL;
35 }
36 
37 /* Get ID by name. For unknown name returns -1
38  */
39 static int
id_by_name(const char * name,int (* cmp)(const char * s1,const char * s2),const id_name_table * table)40 id_by_name (const char *name, int (*cmp) (const char *s1, const char *s2),
41         const id_name_table *table)
42 {
43     int i;
44 
45     for (i = 0; table[i].name != NULL; i ++) {
46         if (!cmp(name, table[i].name)) {
47             return table[i].id;
48         }
49     }
50 
51     return -1;
52 }
53 
54 /******************** ID_PROTO ********************/
55 /* id_proto_name_table table represents name mapping for ID_PROTO
56  */
57 static id_name_table id_proto_name_table[] = {
58     {ID_PROTO_ESCL, "eSCL"},
59     {ID_PROTO_WSD,  "WSD"},
60     {-1, NULL}
61 };
62 
63 /* id_proto_name returns protocol name
64  * For unknown ID returns NULL
65  */
66 const char*
id_proto_name(ID_PROTO proto)67 id_proto_name (ID_PROTO proto)
68 {
69     return id_name(proto, id_proto_name_table);
70 }
71 
72 /* id_proto_by_name returns protocol identifier by name
73  * For unknown name returns ID_PROTO_UNKNOWN
74  */
75 ID_PROTO
id_proto_by_name(const char * name)76 id_proto_by_name (const char* name)
77 {
78     return id_by_name(name, strcasecmp, id_proto_name_table);
79 }
80 
81 /******************** ID_SOURCE ********************/
82 /* id_source_sane_name_table represents ID_SOURCE to
83  * SANE name mapping
84  */
85 static id_name_table id_source_sane_name_table[] = {
86     {ID_SOURCE_PLATEN,      OPTVAL_SOURCE_PLATEN},
87     {ID_SOURCE_ADF_SIMPLEX, OPTVAL_SOURCE_ADF_SIMPLEX},
88     {ID_SOURCE_ADF_DUPLEX,  OPTVAL_SOURCE_ADF_DUPLEX},
89     {-1, NULL}
90 };
91 
92 /* id_source_sane_name returns SANE name for the source
93  * For unknown ID returns NULL
94  */
95 const char*
id_source_sane_name(ID_SOURCE id)96 id_source_sane_name (ID_SOURCE id)
97 {
98     return id_name(id, id_source_sane_name_table);
99 }
100 
101 /* id_source_by_sane_name returns ID_SOURCE by its SANE name
102  * For unknown name returns ID_SOURCE_UNKNOWN
103  */
104 ID_SOURCE
id_source_by_sane_name(const char * name)105 id_source_by_sane_name (const char *name)
106 {
107     return id_by_name(name, strcasecmp, id_source_sane_name_table);
108 }
109 
110 /******************** ID_COLORMODE ********************/
111 /* id_colormode_sane_name_table represents ID_COLORMODE to
112  * SANE name mapping
113  */
114 static id_name_table id_colormode_sane_name_table[] = {
115     {ID_COLORMODE_BW1,       SANE_VALUE_SCAN_MODE_HALFTONE},
116     {ID_COLORMODE_GRAYSCALE, SANE_VALUE_SCAN_MODE_GRAY},
117     {ID_COLORMODE_COLOR,     SANE_VALUE_SCAN_MODE_COLOR},
118     {-1, NULL}
119 };
120 
121 /* id_colormode_sane_name returns SANE name for the color mode
122  * For unknown ID returns NULL
123  */
124 const char*
id_colormode_sane_name(ID_COLORMODE id)125 id_colormode_sane_name (ID_COLORMODE id)
126 {
127     return id_name(id, id_colormode_sane_name_table);
128 }
129 
130 /* id_colormode_by_sane_name returns ID_COLORMODE nu its SANE name
131  * For unknown name returns ID_COLORMODE_UNKNOWN
132  */
133 ID_COLORMODE
id_colormode_by_sane_name(const char * name)134 id_colormode_by_sane_name (const char *name)
135 {
136     return id_by_name(name, strcasecmp, id_colormode_sane_name_table);
137 }
138 
139 /******************** ID_FORMAT ********************/
140 /* id_format_mime_name_table represents ID_FORMAT to
141  * MIME name mapping
142  */
143 static id_name_table id_format_mime_name_table[] = {
144     {ID_FORMAT_JPEG, "image/jpeg"},
145     {ID_FORMAT_TIFF, "image/tiff"},
146     {ID_FORMAT_PNG,  "image/png"},
147     {ID_FORMAT_PDF,  "application/pdf"},
148     {ID_FORMAT_BMP,  "application/bmp"},
149     {-1, NULL}
150 };
151 
152 /* id_format_mime_name returns MIME name for the image format
153  */
154 const char*
id_format_mime_name(ID_FORMAT id)155 id_format_mime_name (ID_FORMAT id)
156 {
157     return id_name(id, id_format_mime_name_table);
158 }
159 
160 /* id_format_by_mime_name returns ID_FORMAT by its MIME name
161  * For unknown name returns ID_FORMAT_UNKNOWN
162  */
163 ID_FORMAT
id_format_by_mime_name(const char * name)164 id_format_by_mime_name (const char *name)
165 {
166     return id_by_name(name, strcasecmp, id_format_mime_name_table);
167 }
168 
169 /* if_format_short_name returns short name for ID_FORMAT
170  */
171 const char*
id_format_short_name(ID_FORMAT id)172 id_format_short_name (ID_FORMAT id)
173 {
174     const char *mime = id_format_mime_name(id);
175     const char *name = mime ? (strchr(mime, '/') + 1) : NULL;
176 
177     return name ? name : mime;
178 }
179 
180 /******************** PROTO_OP ********************/
181 /* proto_op_name_table represents PROTO_OP to its
182  * name mappind
183  */
184 static id_name_table proto_op_name_table[] = {
185     {PROTO_OP_NONE,     "PROTO_OP_NONE"},
186     {PROTO_OP_PRECHECK, "PROTO_OP_PRECHECK"},
187     {PROTO_OP_SCAN,     "PROTO_OP_SCAN"},
188     {PROTO_OP_LOAD,     "PROTO_OP_LOAD"},
189     {PROTO_OP_CHECK,    "PROTO_OP_CHECK"},
190     {PROTO_OP_CLEANUP,  "PROTO_OP_CLEANUP"},
191     {PROTO_OP_FINISH,   "PROTO_OP_FINISH"},
192     {-1, NULL}
193 };
194 
195 /* Get PROTO_OP name, for logging
196  */
197 const char*
proto_op_name(PROTO_OP op)198 proto_op_name (PROTO_OP op)
199 {
200     return id_name(op, proto_op_name_table);
201 }
202 
203 /* vim:ts=8:sw=4:et
204  */
205