For all DLLs with defined DllMain and which do not require
[wine/wine-kai.git] / dlls / twain / twain32_main.c
blob56a5a329d62343f28d750f591c755604e3996322
1 /*
2 * TWAIN32 functions
4 * Copyright 2000 Shi Quan He <shiquan@cyberdude.com>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 #include "windef.h"
22 #include "winbase.h"
23 #include "twain.h"
24 #include "twain_i.h"
25 #include "wine/debug.h"
27 WINE_DEFAULT_DEBUG_CHANNEL(twain);
29 BOOL WINAPI DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
31 TRACE("%p,%lx,%p\n", hinstDLL, fdwReason, lpvReserved);
33 switch (fdwReason)
35 case DLL_PROCESS_ATTACH:
36 DisableThreadLibraryCalls(hinstDLL);
37 DSM_currentState = 2;
38 break;
40 case DLL_PROCESS_DETACH:
41 DSM_currentState = 1;
42 break;
45 return TRUE;
48 TW_UINT16 TWAIN_SourceManagerHandler (
49 pTW_IDENTITY pOrigin,
50 TW_UINT16 DAT,
51 TW_UINT16 MSG,
52 TW_MEMREF pData)
54 TW_UINT16 twRC = TWRC_SUCCESS;
56 switch (DAT)
58 case DAT_IDENTITY:
59 switch (MSG)
61 case MSG_CLOSEDS:
62 twRC = TWAIN_CloseDS (pOrigin, pData);
63 break;
65 case MSG_GETDEFAULT:
66 twRC = TWAIN_IdentityGetDefault (pOrigin, pData);
67 break;
69 case MSG_GETFIRST:
70 twRC = TWAIN_IdentityGetFirst (pOrigin, pData);
71 break;
73 case MSG_GETNEXT:
74 twRC = TWAIN_IdentityGetNext (pOrigin, pData);
75 break;
77 case MSG_OPENDS:
78 twRC = TWAIN_OpenDS (pOrigin, pData);
79 break;
81 case MSG_USERSELECT:
82 twRC = TWAIN_UserSelect (pOrigin, pData);
83 break;
85 default:
86 /* Unrecognized operation triplet */
87 twRC = TWRC_FAILURE;
88 DSM_twCC = TWCC_BADPROTOCOL;
89 WARN("unrecognized operation triplet\n");
90 break;
92 break;
94 case DAT_PARENT:
95 switch (MSG)
97 case MSG_CLOSEDSM:
98 twRC = TWAIN_CloseDSM (pOrigin, pData);
99 break;
101 case MSG_OPENDSM:
102 twRC = TWAIN_OpenDSM (pOrigin, pData);
103 break;
105 default:
106 /* Unrecognized operation triplet */
107 twRC = TWRC_FAILURE;
108 DSM_twCC = TWCC_BADPROTOCOL;
109 WARN("unrecognized operation triplet\n");
111 break;
113 case DAT_STATUS:
114 if (MSG == MSG_GET)
116 twRC = TWAIN_GetDSMStatus (pOrigin, pData);
118 else
120 twRC = TWRC_FAILURE;
121 DSM_twCC = TWCC_BADPROTOCOL;
122 WARN("unrecognized operation triplet\n");
124 break;
126 default:
127 twRC = TWRC_FAILURE;
128 DSM_twCC = TWCC_BADPROTOCOL;
129 WARN("unrecognized operation triplet\n");
130 break;
133 return twRC;
136 TW_UINT16 TWAIN_SourceControlHandler (
137 pTW_IDENTITY pOrigin,
138 pTW_IDENTITY pDest,
139 TW_UINT16 DAT,
140 TW_UINT16 MSG,
141 TW_MEMREF pData)
143 TW_UINT16 twRC = TWRC_SUCCESS;
145 switch (DAT)
147 case DAT_CAPABILITY:
148 switch (MSG)
150 case MSG_GET:
151 twRC = TWAIN_CapabilityGet (pOrigin, pDest, pData);
152 break;
153 case MSG_GETCURRENT:
154 twRC = TWAIN_CapabilityGetCurrent (pOrigin, pDest, pData);
155 break;
156 case MSG_GETDEFAULT:
157 twRC = TWAIN_CapabilityGetDefault (pOrigin, pDest, pData);
158 break;
159 case MSG_QUERYSUPPORT:
160 twRC = TWAIN_CapabilityQuerySupport (pOrigin, pDest, pData);
161 break;
162 case MSG_RESET:
163 twRC = TWAIN_CapabilityReset (pOrigin, pDest, pData);
164 break;
165 case MSG_SET:
166 twRC = TWAIN_CapabilitySet (pOrigin, pDest, pData);
167 break;
168 default:
169 twRC = TWRC_FAILURE;
170 WARN("unrecognized opertion triplet\n");
172 break;
174 case DAT_CUSTOMDSDATA:
175 switch (MSG)
177 case MSG_GET:
178 twRC = TWAIN_CustomDSDataGet (pOrigin, pDest, pData);
179 break;
180 case MSG_SET:
181 twRC = TWAIN_CustomDSDataSet (pOrigin, pDest, pData);
182 break;
183 default:
184 break;
186 break;
188 case DAT_FILESYSTEM:
189 switch (MSG)
191 /*case MSG_AUTOMATICCAPTUREDIRECTORY:
192 twRC = TWAIN_AutomaticCaptureDirectory
193 (pOrigin, pDest, pData);
194 break;*/
195 case MSG_CHANGEDIRECTORY:
196 twRC = TWAIN_ChangeDirectory (pOrigin, pDest, pData);
197 break;
198 /*case MSG_COPY:
199 twRC = TWAIN_FileSystemCopy (pOrigin, pDest, pData);
200 break;*/
201 case MSG_CREATEDIRECTORY:
202 twRC = TWAIN_CreateDirectory (pOrigin, pDest, pData);
203 break;
204 case MSG_DELETE:
205 twRC = TWAIN_FileSystemDelete (pOrigin, pDest, pData);
206 break;
207 case MSG_FORMATMEDIA:
208 twRC = TWAIN_FormatMedia (pOrigin, pDest, pData);
209 break;
210 case MSG_GETCLOSE:
211 twRC = TWAIN_FileSystemGetClose (pOrigin, pDest, pData);
212 break;
213 case MSG_GETFIRSTFILE:
214 twRC = TWAIN_FileSystemGetFirstFile
215 (pOrigin, pDest, pData);
216 break;
217 case MSG_GETINFO:
218 twRC = TWAIN_FileSystemGetInfo (pOrigin, pDest, pData);
219 break;
220 case MSG_GETNEXTFILE:
221 twRC = TWAIN_FileSystemGetNextFile
222 (pOrigin, pDest, pData);
223 break;
224 case MSG_RENAME:
225 twRC = TWAIN_FileSystemRename (pOrigin, pDest, pData);
226 break;
227 default:
228 twRC = TWRC_FAILURE;
229 break;
231 break;
233 case DAT_EVENT:
234 if (MSG == MSG_PROCESSEVENT)
235 twRC = TWAIN_ProcessEvent (pOrigin, pDest, pData);
236 else
237 twRC = TWRC_FAILURE;
238 break;
240 case DAT_PASSTHRU:
241 if (MSG == MSG_PASSTHRU)
242 twRC = TWAIN_PassThrough (pOrigin, pDest, pData);
243 else
244 twRC = TWRC_FAILURE;
245 break;
247 case DAT_PENDINGXFERS:
248 switch (MSG)
250 case MSG_ENDXFER:
251 twRC = TWAIN_PendingXfersEndXfer (pOrigin, pDest, pData);
252 break;
253 case MSG_GET:
254 twRC = TWAIN_PendingXfersGet (pOrigin, pDest, pData);
255 break;
256 case MSG_RESET:
257 twRC = TWAIN_PendingXfersReset (pOrigin, pDest, pData);
258 break;
259 /*case MSG_STOPFEEDER:
260 twRC = TWAIN_PendingXfersStopFeeder
261 (pOrigin, pDest, pData);
262 break;*/
263 default:
264 twRC = TWRC_FAILURE;
266 break;
268 case DAT_SETUPFILEXFER:
269 switch (MSG)
271 case MSG_GET:
272 twRC = TWAIN_SetupFileXferGet (pOrigin, pDest, pData);
273 break;
274 case MSG_GETDEFAULT:
275 twRC = TWAIN_SetupFileXferGetDefault
276 (pOrigin, pDest, pData);
277 break;
278 case MSG_RESET:
279 twRC = TWAIN_SetupFileXferReset (pOrigin, pDest, pData);
280 break;
281 case MSG_SET:
282 twRC = TWAIN_SetupFileXferSet (pOrigin, pDest, pData);
283 break;
284 default:
285 twRC = TWRC_FAILURE;
286 break;
288 break;
290 /*case DAT_SETUPFILEXFER2:
291 switch (MSG)
293 case MSG_GET:
294 twRC = TWAIN_SetupFileXfer2Get (pOrigin, pDest, pData);
295 break;
296 case MSG_GETDEFAULT:
297 twRC = TWAIN_SetupFileXfer2GetDefault
298 (pOrigin, pDest, pData);
299 break;
300 case MSG_RESET:
301 twRC = TWAIN_SetupFileXfer2Reset (pOrigin, pDest, pData);
302 break;
303 case MSG_SET:
304 twRC = TWAIN_SetupFileXfer2Set (pOrigin, pDest, pData);
305 break;
307 break;*/
308 case DAT_SETUPMEMXFER:
309 if (MSG == MSG_GET)
310 twRC = TWAIN_SetupMemXferGet (pOrigin, pDest, pData);
311 else
312 twRC = TWRC_FAILURE;
313 break;
315 case DAT_STATUS:
316 if (MSG == MSG_GET)
317 twRC = TWAIN_GetDSStatus (pOrigin, pDest, pData);
318 else
319 twRC = TWRC_FAILURE;
320 break;
322 case DAT_USERINTERFACE:
323 switch (MSG)
325 case MSG_DISABLEDS:
326 twRC = TWAIN_DisableDSUserInterface
327 (pOrigin, pDest, pData);
328 break;
329 case MSG_ENABLEDS:
330 twRC = TWAIN_EnableDSUserInterface
331 (pOrigin, pDest, pData);
332 break;
333 case MSG_ENABLEDSUIONLY:
334 twRC = TWAIN_EnableDSUIOnly (pOrigin, pDest, pData);
335 break;
336 default:
337 twRC = TWRC_FAILURE;
338 break;
340 break;
342 case DAT_XFERGROUP:
343 switch (MSG)
345 case MSG_GET:
346 twRC = TWAIN_XferGroupGet (pOrigin, pDest, pData);
347 break;
348 case MSG_SET:
349 twRC = TWAIN_XferGroupSet (pOrigin, pDest, pData);
350 break;
351 default:
352 twRC = TWRC_FAILURE;
353 break;
355 break;
357 default:
358 twRC = TWRC_FAILURE;
359 break;
362 return twRC;
365 TW_UINT16 TWAIN_ControlGroupHandler (
366 pTW_IDENTITY pOrigin,
367 pTW_IDENTITY pDest,
368 TW_UINT16 DAT,
369 TW_UINT16 MSG,
370 TW_MEMREF pData)
372 TW_UINT16 twRC = TWRC_SUCCESS;
374 if (pDest)
376 /* This operation's destination is a source */
377 twRC = TWAIN_SourceControlHandler (pOrigin, pDest, DAT, MSG, pData);
379 else
381 /* This operation's destination is the Source Manager */
382 twRC = TWAIN_SourceManagerHandler (pOrigin, DAT, MSG, pData);
385 return twRC;
388 TW_UINT16 TWAIN_ImageGroupHandler (
389 pTW_IDENTITY pOrigin,
390 pTW_IDENTITY pDest,
391 TW_UINT16 DAT,
392 TW_UINT16 MSG,
393 TW_MEMREF pData)
395 TW_UINT16 twRC = TWRC_SUCCESS;
397 if (pDest == NULL)
399 DSM_twCC = TWCC_BADDEST;
400 return TWRC_FAILURE;
403 switch (DAT)
405 case DAT_CIECOLOR:
406 if (MSG == MSG_GET)
407 twRC = TWAIN_CIEColorGet (pOrigin, pDest, pData);
408 else
409 twRC = TWRC_FAILURE;
410 break;
412 case DAT_EXTIMAGEINFO:
413 if (MSG == MSG_GET)
414 twRC = TWAIN_ExtImageInfoGet (pOrigin, pDest, pData);
415 else
416 twRC = TWRC_FAILURE;
417 break;
419 case DAT_GRAYRESPONSE:
420 switch (MSG)
422 case MSG_RESET:
423 twRC = TWAIN_GrayResponseReset (pOrigin, pDest, pData);
424 break;
425 case MSG_SET:
426 twRC = TWAIN_GrayResponseSet (pOrigin, pDest, pData);
427 break;
428 default:
429 twRC = TWRC_FAILURE;
430 DSM_twCC = TWCC_BADPROTOCOL;
431 WARN("unrecognized operation triplet\n");
432 break;
434 break;
435 case DAT_IMAGEFILEXFER:
436 if (MSG == MSG_GET)
437 twRC = TWAIN_ImageFileXferGet (pOrigin, pDest, pData);
438 else
439 twRC = TWRC_FAILURE;
440 break;
442 case DAT_IMAGEINFO:
443 if (MSG == MSG_GET)
444 twRC = TWAIN_ImageInfoGet (pOrigin, pDest, pData);
445 else
446 twRC = TWRC_FAILURE;
447 break;
449 case DAT_IMAGELAYOUT:
450 switch (MSG)
452 case MSG_GET:
453 twRC = TWAIN_ImageLayoutGet (pOrigin, pDest, pData);
454 break;
455 case MSG_GETDEFAULT:
456 twRC = TWAIN_ImageLayoutGetDefault (pOrigin, pDest, pData);
457 break;
458 case MSG_RESET:
459 twRC = TWAIN_ImageLayoutReset (pOrigin, pDest, pData);
460 break;
461 case MSG_SET:
462 twRC = TWAIN_ImageLayoutSet (pOrigin, pDest, pData);
463 break;
464 default:
465 twRC = TWRC_FAILURE;
466 DSM_twCC = TWCC_BADPROTOCOL;
467 WARN("unrecognized operation triplet\n");
468 break;
470 break;
472 case DAT_IMAGEMEMXFER:
473 if (MSG == MSG_GET)
474 twRC = TWAIN_ImageMemXferGet (pOrigin, pDest, pData);
475 else
476 twRC = TWRC_FAILURE;
477 break;
479 case DAT_IMAGENATIVEXFER:
480 if (MSG == MSG_GET)
481 twRC = TWAIN_ImageNativeXferGet (pOrigin, pDest, pData);
482 else
483 twRC = TWRC_FAILURE;
484 break;
486 case DAT_JPEGCOMPRESSION:
487 switch (MSG)
489 case MSG_GET:
490 twRC = TWAIN_JPEGCompressionGet (pOrigin, pDest, pData);
491 break;
492 case MSG_GETDEFAULT:
493 twRC = TWAIN_JPEGCompressionGetDefault
494 (pOrigin, pDest, pData);
495 break;
496 case MSG_RESET:
497 twRC = TWAIN_JPEGCompressionReset (pOrigin, pDest, pData);
498 break;
499 case MSG_SET:
500 twRC = TWAIN_JPEGCompressionSet (pOrigin, pDest, pData);
501 break;
502 default:
503 twRC = TWRC_FAILURE;
504 DSM_twCC = TWCC_BADPROTOCOL;
505 WARN("unrecognized operation triplet\n");
506 break;
508 break;
510 case DAT_PALETTE8:
511 switch (MSG)
513 case MSG_GET:
514 twRC = TWAIN_Palette8Get (pOrigin, pDest, pData);
515 break;
516 case MSG_GETDEFAULT:
517 twRC = TWAIN_Palette8GetDefault (pOrigin, pDest, pData);
518 break;
519 case MSG_RESET:
520 twRC = TWAIN_Palette8Reset (pOrigin, pDest, pData);
521 break;
522 case MSG_SET:
523 twRC = TWAIN_Palette8Set (pOrigin, pDest, pData);
524 break;
525 default:
526 twRC = TWRC_FAILURE;
527 DSM_twCC = TWCC_BADPROTOCOL;
528 WARN("unrecognized operation triplet\n");
530 break;
532 case DAT_RGBRESPONSE:
533 switch (MSG)
535 case MSG_RESET:
536 twRC = TWAIN_RGBResponseReset (pOrigin, pDest, pData);
537 break;
538 case MSG_SET:
539 twRC = TWAIN_RGBResponseSet (pOrigin, pDest, pData);
540 break;
541 default:
542 twRC = TWRC_FAILURE;
543 DSM_twCC = TWCC_BADPROTOCOL;
544 WARN("unrecognized operation triplet\n");
545 break;
547 break;
549 default:
550 twRC = TWRC_FAILURE;
551 DSM_twCC = TWCC_BADPROTOCOL;
552 WARN("unrecognized operation triplet\n");
554 return twRC;
557 TW_UINT16 TWAIN_AudioGroupHandler (
558 pTW_IDENTITY pOrigin,
559 pTW_IDENTITY pDest,
560 TW_UINT16 DAT,
561 TW_UINT16 MSG,
562 TW_MEMREF pData)
564 TW_UINT16 twRC = TWRC_FAILURE;
566 switch (DAT)
568 case DAT_AUDIOFILEXFER:
569 if (MSG == MSG_GET)
570 twRC = TWAIN_AudioFileXferGet (pOrigin, pDest, pData);
571 break;
573 case DAT_AUDIOINFO:
574 if (MSG == MSG_GET)
575 twRC = TWAIN_AudioInfoGet (pOrigin, pDest, pData);
576 break;
578 case DAT_AUDIONATIVEXFER:
579 if (MSG == MSG_GET)
580 twRC = TWAIN_AudioNativeXferGet (pOrigin, pDest, pData);
581 break;
583 default:
584 DSM_twCC = TWCC_BADPROTOCOL;
585 twRC = TWRC_FAILURE;
586 break;
589 return twRC;
592 /* Main entry point for the TWAIN library */
593 TW_UINT16 WINAPI
594 DSM_Entry (pTW_IDENTITY pOrigin,
595 pTW_IDENTITY pDest,
596 TW_UINT32 DG,
597 TW_UINT16 DAT,
598 TW_UINT16 MSG,
599 TW_MEMREF pData)
601 TW_UINT16 twRC = TWRC_SUCCESS; /* Return Code */
603 TRACE("(DG=%ld DAT=%d MSG=%d)\n", DG, DAT, MSG);
605 switch (DG)
607 case DG_CONTROL:
608 twRC = TWAIN_ControlGroupHandler (pOrigin,pDest,DAT,MSG,pData);
609 break;
610 case DG_IMAGE:
611 twRC = TWAIN_ImageGroupHandler (pOrigin,pDest,DAT,MSG,pData);
612 break;
613 case DG_AUDIO:
614 twRC = TWAIN_AudioGroupHandler (pOrigin,pDest,DAT,MSG,pData);
615 break;
616 default:
617 DSM_twCC = TWCC_BADPROTOCOL;
618 twRC = TWRC_FAILURE;
621 return twRC;
624 /* A helper function that looks up a destination identity in the active
625 source list */
626 activeDS *TWAIN_LookupSource (pTW_IDENTITY pDest)
628 activeDS *pSource;
630 for (pSource = activeSources; pSource; pSource = pSource->next)
631 if (pSource->identity.Id == pDest->Id)
632 break;
634 return pSource;