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