mapi32/tests: Fix typo.
[wine] / dlls / sane.ds / capability.c
1 /*
2  * Copyright 2000 Corel Corporation
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18
19 #define NONAMELESSUNION
20 #define NONAMELESSSTRUCT
21
22 #include "config.h"
23
24 #include <stdarg.h>
25
26 #include "windef.h"
27 #include "winbase.h"
28 #include "twain.h"
29 #include "sane_i.h"
30 #include "wine/debug.h"
31
32 WINE_DEFAULT_DEBUG_CHANNEL(twain);
33
34 static TW_UINT16 SANE_ICAPXferMech (pTW_CAPABILITY pCapability, TW_UINT16 action);
35 static TW_UINT16 TWAIN_GetSupportedCaps(pTW_CAPABILITY pCapability);
36
37 TW_UINT16 SANE_SaneCapability (pTW_CAPABILITY pCapability, TW_UINT16 action)
38 {
39     TW_UINT16 twCC = TWCC_SUCCESS;
40
41     TRACE("capability=%d action=%d\n", pCapability->Cap, action);
42
43     switch (pCapability->Cap)
44     {
45         case CAP_SUPPORTEDCAPS:
46             if (action == MSG_GET)
47                 twCC = TWAIN_GetSupportedCaps(pCapability);
48             else
49                 twCC = TWCC_BADVALUE;
50             break;
51
52         case CAP_DEVICEEVENT:
53         case CAP_ALARMS:
54         case CAP_ALARMVOLUME:
55         case ACAP_AUDIOFILEFORMAT:
56         case ACAP_XFERMECH:
57         case ICAP_AUTOMATICBORDERDETECTION:
58         case ICAP_AUTOMATICDESKEW:
59         case ICAP_AUTODISCARDBLANKPAGES:
60         case ICAP_AUTOMATICROTATE:
61         case ICAP_FLIPROTATION:
62         case CAP_AUTOMATICCAPTURE:
63         case CAP_TIMEBEFOREFIRSTCAPTURE:
64         case CAP_TIMEBETWEENCAPTURES:
65         case CAP_AUTOSCAN:
66         case CAP_CLEARBUFFERS:
67         case CAP_MAXBATCHBUFFERS:
68         case ICAP_BARCODEDETECTIONENABLED:
69         case ICAP_SUPPORTEDBARCODETYPES:
70         case ICAP_BARCODEMAXSEARCHPRIORITIES:
71         case ICAP_BARCODESEARCHPRIORITIES:
72         case ICAP_BARCODESEARCHMODE:
73         case ICAP_BARCODEMAXRETRIES:
74         case ICAP_BARCODETIMEOUT:
75         case CAP_EXTENDEDCAPS:
76         case ICAP_FILTER:
77         case ICAP_GAMMA:
78         case ICAP_PLANARCHUNKY:
79         case ICAP_BITORDERCODES:
80         case ICAP_CCITTKFACTOR:
81         case ICAP_COMPRESSION:
82         case ICAP_JPEGPIXELTYPE:
83         /*case ICAP_JPEGQUALITY:*/
84         case ICAP_PIXELFLAVORCODES:
85         case ICAP_TIMEFILL:
86         case CAP_DEVICEONLINE:
87         case CAP_DEVICETIMEDATE:
88         case CAP_SERIALNUMBER:
89         case ICAP_EXPOSURETIME:
90         case ICAP_FLASHUSED2:
91         case ICAP_IMAGEFILTER:
92         case ICAP_LAMPSTATE:
93         case ICAP_LIGHTPATH:
94         case ICAP_NOISEFILTER:
95         case ICAP_OVERSCAN:
96         case ICAP_PHYSICALHEIGHT:
97         case ICAP_PHYSICALWIDTH:
98         case ICAP_UNITS:
99         case ICAP_ZOOMFACTOR:
100         case CAP_PRINTER:
101         case CAP_PRINTERENABLED:
102         case CAP_PRINTERINDEX:
103         case CAP_PRINTERMODE:
104         case CAP_PRINTERSTRING:
105         case CAP_PRINTERSUFFIX:
106         case CAP_AUTHOR:
107         case CAP_CAPTION:
108         case CAP_TIMEDATE:
109         case ICAP_AUTOBRIGHT:
110         case ICAP_BRIGHTNESS:
111         case ICAP_CONTRAST:
112         case ICAP_HIGHLIGHT:
113         case ICAP_ORIENTATION:
114         case ICAP_ROTATION:
115         case ICAP_SHADOW:
116         case ICAP_XSCALING:
117         case ICAP_YSCALING:
118         case ICAP_BITDEPTH:
119         case ICAP_BITDEPTHREDUCTION:
120         case ICAP_BITORDER:
121         case ICAP_CUSTHALFTONE:
122         case ICAP_HALFTONES:
123         case ICAP_PIXELFLAVOR:
124         case ICAP_PIXELTYPE:
125         case ICAP_THRESHOLD:
126         case CAP_LANGUAGE:
127         case ICAP_FRAMES:
128         case ICAP_MAXFRAMES:
129         case ICAP_SUPPORTEDSIZES:
130         case CAP_AUTOFEED:
131         case CAP_CLEARPAGE:
132         case CAP_FEEDERALIGNMENT:
133         case CAP_FEEDERENABLED:
134         case CAP_FEEDERLOADED:
135         case CAP_FEEDERORDER:
136         case CAP_FEEDPAGE:
137         case CAP_PAPERBINDING:
138         case CAP_PAPERDETECTABLE:
139         case CAP_REACQUIREALLOWED:
140         case CAP_REWINDPAGE:
141         case ICAP_PATCHCODEDETECTIONENABLED:
142         case ICAP_SUPPORTEDPATCHCODETYPES:
143         case ICAP_PATCHCODEMAXSEARCHPRIORITIES:
144         case ICAP_PATCHCODESEARCHPRIORITIES:
145         case ICAP_PATCHCODESEARCHMODE:
146         case ICAP_PATCHCODEMAXRETRIES:
147         case ICAP_PATCHCODETIMEOUT:
148         case CAP_BATTERYMINUTES:
149         case CAP_BATTERYPERCENTAGE:
150         case CAP_POWERDOWNTIME:
151         case CAP_POWERSUPPLY:
152         case ICAP_XNATIVERESOLUTION:
153         case ICAP_XRESOLUTION:
154         case ICAP_YNATIVERESOLUTION:
155         case ICAP_YRESOLUTION:
156             twCC = TWCC_CAPUNSUPPORTED;
157             break;
158         case CAP_XFERCOUNT:
159             /* This is a required capability that every source needs to
160                support but we haven't implemented it yet. */
161             twCC = TWCC_SUCCESS;
162             break;
163         /*case ICAP_COMPRESSION:*/
164         case ICAP_IMAGEFILEFORMAT:
165         case ICAP_TILES:
166             twCC = TWCC_CAPUNSUPPORTED;
167             break;
168         case ICAP_XFERMECH:
169             twCC = SANE_ICAPXferMech (pCapability, action);
170             break;
171         case ICAP_UNDEFINEDIMAGESIZE:
172         case CAP_CAMERAPREVIEWUI:
173         case CAP_ENABLEDSUIONLY:
174         case CAP_INDICATORS:
175         case CAP_UICONTROLLABLE:
176             twCC = TWCC_CAPUNSUPPORTED;
177             break;
178         default:
179             twCC = TWRC_FAILURE;
180
181     }
182
183     return twCC;
184 }
185
186 static TW_UINT16 TWAIN_GetSupportedCaps(pTW_CAPABILITY pCapability)
187 {
188     TW_ARRAY *a;
189     static const UINT16 supported_caps[] = { CAP_SUPPORTEDCAPS, ICAP_XFERMECH };
190
191     pCapability->hContainer = GlobalAlloc (0, FIELD_OFFSET( TW_ARRAY, ItemList[sizeof(supported_caps)] ));
192     pCapability->ConType = TWON_ARRAY;
193
194     if (pCapability->hContainer)
195     {
196         UINT16 *u;
197         int i;
198         a = GlobalLock (pCapability->hContainer);
199         a->ItemType = TWTY_UINT16;
200         a->NumItems = sizeof(supported_caps) / sizeof(supported_caps[0]);
201         u = (UINT16 *) a->ItemList;
202         for (i = 0; i < a->NumItems; i++)
203             u[i] = supported_caps[i];
204         GlobalUnlock (pCapability->hContainer);
205         return TWCC_SUCCESS;
206     }
207     else
208         return TWCC_LOWMEMORY;
209 }
210
211
212 static TW_BOOL TWAIN_OneValueSet (pTW_CAPABILITY pCapability, TW_UINT32 value)
213 {
214     pCapability->hContainer = GlobalAlloc (0, sizeof(TW_ONEVALUE));
215
216     if (pCapability->hContainer)
217     {
218         pTW_ONEVALUE pVal = GlobalLock (pCapability->hContainer);
219         pVal->ItemType = TWTY_UINT32;
220         pVal->Item = value;
221         GlobalUnlock (pCapability->hContainer);
222         return TRUE;
223     }
224     else
225         return FALSE;
226 }
227
228 static TW_BOOL TWAIN_OneValueGet (pTW_CAPABILITY pCapability, TW_UINT32 *pValue)
229 {
230     pTW_ONEVALUE pVal = GlobalLock (pCapability->hContainer);
231
232     if (pVal)
233     {
234         *pValue = pVal->Item;
235         GlobalUnlock (pCapability->hContainer);
236         return TRUE;
237     }
238     else
239         return FALSE;
240 }
241
242 /* ICAP_XFERMECH */
243 static TW_UINT16 SANE_ICAPXferMech (pTW_CAPABILITY pCapability, TW_UINT16 action)
244 {
245     TRACE("ICAP_XFERMECH\n");
246
247     switch (action)
248     {
249         case MSG_GET:
250             if (pCapability->ConType == TWON_ONEVALUE)
251             {
252                 if (!TWAIN_OneValueSet (pCapability, activeDS.capXferMech))
253                     return TWCC_LOWMEMORY;
254             }
255             break;
256         case MSG_SET:
257             if (pCapability->ConType == TWON_ONEVALUE)
258             {
259                 TW_UINT32 xfermechtemp = 0;
260                 if (!TWAIN_OneValueGet (pCapability, &xfermechtemp))
261                     return TWCC_LOWMEMORY;
262                 activeDS.capXferMech = xfermechtemp;
263             }
264             else if (pCapability->ConType == TWON_ENUMERATION)
265             {
266
267             }
268             break;
269         case MSG_GETCURRENT:
270             if (!TWAIN_OneValueSet (pCapability, activeDS.capXferMech))
271                 return TWCC_LOWMEMORY;
272             break;
273         case MSG_GETDEFAULT:
274             if (!TWAIN_OneValueSet (pCapability, TWSX_NATIVE))
275                 return TWCC_LOWMEMORY;
276             break;
277         case MSG_RESET:
278             activeDS.capXferMech = TWSX_NATIVE;
279             break;
280     }
281     return TWCC_SUCCESS;
282 }