kernelbase: Use nameless unions/structs for loader data.
[wine.git] / dlls / gphoto2.ds / gphoto2_main.c
bloba47fdcc67f4a76f05d3e74c6c8f0e519b08dd288
1 /*
2 * SANE.DS functions
4 * Copyright 2000 Shi Quan He <shiquan@cyberdude.com>
5 * Copyright 2006 Marcus Meissner
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23 #include <stdarg.h>
24 #include <stdio.h>
25 #include <stdlib.h>
27 #include "gphoto2_i.h"
28 #include "unixlib.h"
29 #include "wine/debug.h"
31 WINE_DEFAULT_DEBUG_CHANNEL(twain);
33 struct tagActiveDS activeDS;
35 static DSMENTRYPROC GPHOTO2_dsmentry;
37 /* DG_CONTROL/DAT_CAPABILITY/MSG_GET */
38 static TW_UINT16 GPHOTO2_CapabilityGet (pTW_IDENTITY pOrigin, TW_MEMREF pData)
40 pTW_CAPABILITY pCapability = (pTW_CAPABILITY) pData;
42 TRACE("DG_CONTROL/DAT_CAPABILITY/MSG_GET\n");
43 if (activeDS.currentState < 4 || activeDS.currentState > 7) {
44 activeDS.twCC = TWCC_SEQERROR;
45 return TWRC_FAILURE;
47 activeDS.twCC = GPHOTO2_SaneCapability (pCapability, MSG_GET);
48 return (activeDS.twCC == TWCC_SUCCESS)?TWRC_SUCCESS:TWRC_FAILURE;
51 /* DG_CONTROL/DAT_CAPABILITY/MSG_GETCURRENT */
52 static TW_UINT16 GPHOTO2_CapabilityGetCurrent (pTW_IDENTITY pOrigin, TW_MEMREF pData)
54 pTW_CAPABILITY pCapability = (pTW_CAPABILITY) pData;
56 TRACE("DG_CONTROL/DAT_CAPABILITY/MSG_GETCURRENT\n");
58 if (activeDS.currentState < 4 || activeDS.currentState > 7) {
59 activeDS.twCC = TWCC_SEQERROR;
60 return TWRC_FAILURE;
62 activeDS.twCC = GPHOTO2_SaneCapability (pCapability, MSG_GETCURRENT);
63 return (activeDS.twCC == TWCC_SUCCESS)?TWRC_SUCCESS:TWRC_FAILURE;
66 /* DG_CONTROL/DAT_CAPABILITY/MSG_GETDEFAULT */
67 static TW_UINT16 GPHOTO2_CapabilityGetDefault (pTW_IDENTITY pOrigin, TW_MEMREF pData)
69 pTW_CAPABILITY pCapability = (pTW_CAPABILITY) pData;
71 TRACE("DG_CONTROL/DAT_CAPABILITY/MSG_GETDEFAULT\n");
72 if (activeDS.currentState < 4 || activeDS.currentState > 7) {
73 activeDS.twCC = TWCC_SEQERROR;
74 return TWRC_FAILURE;
76 activeDS.twCC = GPHOTO2_SaneCapability (pCapability, MSG_GETDEFAULT);
77 return (activeDS.twCC == TWCC_SUCCESS)?TWRC_SUCCESS:TWRC_FAILURE;
80 /* DG_CONTROL/DAT_CAPABILITY/MSG_QUERYSUPPORT */
81 static TW_UINT16 GPHOTO2_CapabilityQuerySupport (pTW_IDENTITY pOrigin,
82 TW_MEMREF pData)
84 FIXME ("stub!\n");
86 return TWRC_FAILURE;
89 /* DG_CONTROL/DAT_CAPABILITY/MSG_RESET */
90 static TW_UINT16 GPHOTO2_CapabilityReset (pTW_IDENTITY pOrigin,
91 TW_MEMREF pData)
93 pTW_CAPABILITY pCapability = (pTW_CAPABILITY) pData;
95 TRACE("DG_CONTROL/DAT_CAPABILITY/MSG_RESET\n");
97 if (activeDS.currentState < 4 || activeDS.currentState > 7) {
98 activeDS.twCC = TWCC_SEQERROR;
99 return TWRC_FAILURE;
101 activeDS.twCC = GPHOTO2_SaneCapability (pCapability, MSG_RESET);
102 return (activeDS.twCC == TWCC_SUCCESS)?TWRC_SUCCESS:TWRC_FAILURE;
105 /* DG_CONTROL/DAT_CAPABILITY/MSG_SET */
106 static TW_UINT16 GPHOTO2_CapabilitySet (pTW_IDENTITY pOrigin,
107 TW_MEMREF pData)
109 pTW_CAPABILITY pCapability = (pTW_CAPABILITY) pData;
111 TRACE ("DG_CONTROL/DAT_CAPABILITY/MSG_SET\n");
113 if (activeDS.currentState != 4) {
114 activeDS.twCC = TWCC_SEQERROR;
115 return TWRC_FAILURE;
117 activeDS.twCC = GPHOTO2_SaneCapability (pCapability, MSG_SET);
118 return (activeDS.twCC == TWCC_SUCCESS)?TWRC_SUCCESS:TWRC_FAILURE;
121 /* DG_CONTROL/DAT_CUSTOMDSDATA/MSG_GET */
122 static TW_UINT16 GPHOTO2_CustomDSDataGet (pTW_IDENTITY pOrigin,
123 TW_MEMREF pData)
125 FIXME ("stub!\n");
127 return TWRC_FAILURE;
130 /* DG_CONTROL/DAT_CUSTOMDSDATA/MSG_SET */
131 static TW_UINT16 GPHOTO2_CustomDSDataSet (pTW_IDENTITY pOrigin,
132 TW_MEMREF pData)
134 FIXME ("stub!\n");
136 return TWRC_FAILURE;
139 /* DG_CONTROL/DAT_FILESYSTEM/MSG_CHANGEDIRECTORY */
140 static TW_UINT16 GPHOTO2_ChangeDirectory (pTW_IDENTITY pOrigin,
141 TW_MEMREF pData)
143 FIXME ("stub!\n");
145 return TWRC_FAILURE;
148 /* DG_CONTROL/DAT_FILESYSTEM/MSG_CREATEDIRECTORY */
149 static TW_UINT16 GPHOTO2_CreateDirectory (pTW_IDENTITY pOrigin,
150 TW_MEMREF pData)
152 FIXME ("stub!\n");
154 return TWRC_FAILURE;
157 /* DG_CONTROL/DAT_FILESYSTEM/MSG_DELETE */
158 static TW_UINT16 GPHOTO2_FileSystemDelete (pTW_IDENTITY pOrigin,
159 TW_MEMREF pData)
161 FIXME ("stub!\n");
163 return TWRC_FAILURE;
166 /* DG_CONTROL/DAT_FILESYSTEM/MSG_FORMATMEDIA */
167 static TW_UINT16 GPHOTO2_FormatMedia (pTW_IDENTITY pOrigin,
168 TW_MEMREF pData)
170 FIXME ("stub!\n");
172 return TWRC_FAILURE;
175 /* DG_CONTROL/DAT_FILESYSTEM/MSG_GETCLOSE */
176 static TW_UINT16 GPHOTO2_FileSystemGetClose (pTW_IDENTITY pOrigin,
177 TW_MEMREF pData)
179 FIXME ("stub!\n");
181 return TWRC_FAILURE;
184 /* DG_CONTROL/DAT_FILESYSTEM/MSG_GETFIRSTFILE */
185 static TW_UINT16 GPHOTO2_FileSystemGetFirstFile (pTW_IDENTITY pOrigin,
187 TW_MEMREF pData)
189 FIXME ("stub!\n");
191 return TWRC_FAILURE;
194 /* DG_CONTROL/DAT_FILESYSTEM/MSG_GETINFO */
195 static TW_UINT16 GPHOTO2_FileSystemGetInfo (pTW_IDENTITY pOrigin,
196 TW_MEMREF pData)
198 FIXME ("stub!\n");
200 return TWRC_FAILURE;
203 /* DG_CONTROL/DAT_FILESYSTEM/MSG_GETNEXTFILE */
204 static TW_UINT16 GPHOTO2_FileSystemGetNextFile (pTW_IDENTITY pOrigin,
206 TW_MEMREF pData)
208 FIXME ("stub!\n");
210 return TWRC_FAILURE;
213 /* DG_CONTROL/DAT_FILESYSTEM/MSG_RENAME */
214 static TW_UINT16 GPHOTO2_FileSystemRename (pTW_IDENTITY pOrigin,
215 TW_MEMREF pData)
217 FIXME ("stub!\n");
219 return TWRC_FAILURE;
222 static void GPHOTO2_Notify (TW_UINT16 message)
224 GPHOTO2_dsmentry (&activeDS.identity, &activeDS.appIdentity, DG_CONTROL, DAT_NULL, message, NULL);
227 /* DG_CONTROL/DAT_ENTRYPOINT/MSG_SET */
228 static TW_UINT16 GPHOTO2_SetEntryPoint (pTW_IDENTITY pOrigin, TW_MEMREF pData)
230 TW_ENTRYPOINT *entry = (TW_ENTRYPOINT*)pData;
232 GPHOTO2_dsmentry = entry->DSM_Entry;
234 return TWRC_SUCCESS;
237 /* DG_CONTROL/DAT_EVENT/MSG_PROCESSEVENT */
238 static TW_UINT16 GPHOTO2_ProcessEvent (pTW_IDENTITY pOrigin,
239 TW_MEMREF pData)
241 pTW_EVENT pEvent = (pTW_EVENT) pData;
243 TRACE("DG_CONTROL/DAT_EVENT/MSG_PROCESSEVENT\n");
245 if (activeDS.currentState < 5 || activeDS.currentState > 7) {
246 activeDS.twCC = TWCC_SEQERROR;
247 return TWRC_FAILURE;
250 pEvent->TWMessage = MSG_NULL; /* no message to the application */
251 activeDS.twCC = TWCC_SUCCESS;
252 return TWRC_NOTDSEVENT;
255 /* DG_CONTROL/DAT_PASSTHRU/MSG_PASSTHRU */
256 static TW_UINT16 GPHOTO2_PassThrough (pTW_IDENTITY pOrigin,
257 TW_MEMREF pData)
259 FIXME ("stub!\n");
261 return TWRC_FAILURE;
264 /* DG_CONTROL/DAT_PENDINGXFERS/MSG_ENDXFER */
265 static TW_UINT16 GPHOTO2_PendingXfersEndXfer (pTW_IDENTITY pOrigin,
266 TW_MEMREF pData)
268 pTW_PENDINGXFERS pPendingXfers = (pTW_PENDINGXFERS) pData;
270 TRACE("DG_CONTROL/DAT_PENDINGXFERS/MSG_ENDXFER\n");
272 if (activeDS.currentState != 6 && activeDS.currentState != 7) {
273 activeDS.twCC = TWCC_SEQERROR;
274 return TWRC_FAILURE;
276 TRACE("count = %d\n", activeDS.download_count);
277 pPendingXfers->Count = activeDS.download_count;
278 if (pPendingXfers->Count != 0) {
279 activeDS.currentState = 6;
280 } else {
281 activeDS.currentState = 5;
282 /* Notify the application that it can close the data source */
283 GPHOTO2_Notify(MSG_CLOSEDSREQ);
284 /* close any Transferring dialog */
285 TransferringDialogBox(activeDS.progressWnd,-1);
286 activeDS.progressWnd = 0;
288 activeDS.twCC = TWCC_SUCCESS;
289 return TWRC_SUCCESS;
292 /* DG_CONTROL/DAT_PENDINGXFERS/MSG_GET */
293 static TW_UINT16 GPHOTO2_PendingXfersGet (pTW_IDENTITY pOrigin,
294 TW_MEMREF pData)
296 pTW_PENDINGXFERS pPendingXfers = (pTW_PENDINGXFERS) pData;
298 TRACE("DG_CONTROL/DAT_PENDINGXFERS/MSG_GET\n");
300 if (activeDS.currentState < 4 || activeDS.currentState > 7) {
301 activeDS.twCC = TWCC_SEQERROR;
302 return TWRC_FAILURE;
305 TRACE("count = %d\n", activeDS.download_count);
306 pPendingXfers->Count = activeDS.download_count;
307 activeDS.twCC = TWCC_SUCCESS;
308 return TWRC_SUCCESS;
311 /* DG_CONTROL/DAT_PENDINGXFERS/MSG_RESET */
312 static TW_UINT16 GPHOTO2_PendingXfersReset (pTW_IDENTITY pOrigin,
313 TW_MEMREF pData)
315 pTW_PENDINGXFERS pPendingXfers = (pTW_PENDINGXFERS) pData;
317 TRACE("DG_CONTROL/DAT_PENDINGXFERS/MSG_RESET\n");
319 if (activeDS.currentState != 6) {
320 activeDS.twCC = TWCC_SEQERROR;
321 return TWRC_FAILURE;
323 pPendingXfers->Count = 0;
324 activeDS.currentState = 5;
325 activeDS.twCC = TWCC_SUCCESS;
326 return TWRC_SUCCESS;
329 /* DG_CONTROL/DAT_SETUPFILEXFER/MSG_GET */
330 static TW_UINT16 GPHOTO2_SetupFileXferGet (pTW_IDENTITY pOrigin,
331 TW_MEMREF pData)
333 FIXME ("stub!\n");
335 return TWRC_FAILURE;
338 /* DG_CONTROL/DAT_SETUPXFER/MSG_GETDEFAULT */
339 static TW_UINT16 GPHOTO2_SetupFileXferGetDefault (pTW_IDENTITY pOrigin,
340 TW_MEMREF pData)
342 FIXME ("stub!\n");
344 return TWRC_FAILURE;
348 /* DG_CONTROL/DAT_SETUPFILEXFER/MSG_RESET */
349 static TW_UINT16 GPHOTO2_SetupFileXferReset (pTW_IDENTITY pOrigin,
350 TW_MEMREF pData)
352 FIXME ("stub!\n");
354 return TWRC_FAILURE;
357 /* DG_CONTROL/DAT_SETUPFILEXFER/MSG_SET */
358 static TW_UINT16 GPHOTO2_SetupFileXferSet (pTW_IDENTITY pOrigin,
359 TW_MEMREF pData)
361 FIXME ("stub!\n");
363 return TWRC_FAILURE;
366 /* DG_CONTROL/DAT_SETUPMEMXFER/MSG_GET */
367 static TW_UINT16 GPHOTO2_SetupMemXferGet (pTW_IDENTITY pOrigin,
368 TW_MEMREF pData)
370 pTW_SETUPMEMXFER pSetupMemXfer = (pTW_SETUPMEMXFER)pData;
372 TRACE("DG_CONTROL/DAT_SETUPMEMXFER/MSG_GET\n");
373 /* Guessing */
374 pSetupMemXfer->MinBufSize = 20000;
375 pSetupMemXfer->MaxBufSize = 80000;
376 pSetupMemXfer->Preferred = 40000;
377 return TWRC_SUCCESS;
380 /* DG_CONTROL/DAT_STATUS/MSG_GET */
381 static TW_UINT16 GPHOTO2_GetDSStatus (pTW_IDENTITY pOrigin,
382 TW_MEMREF pData)
384 pTW_STATUS pSourceStatus = (pTW_STATUS) pData;
386 TRACE ("DG_CONTROL/DAT_STATUS/MSG_GET\n");
387 pSourceStatus->ConditionCode = activeDS.twCC;
388 /* Reset the condition code */
389 activeDS.twCC = TWCC_SUCCESS;
390 return TWRC_SUCCESS;
393 /* DG_CONTROL/DAT_USERINTERFACE/MSG_DISABLEDS */
394 static TW_UINT16 GPHOTO2_DisableDSUserInterface (pTW_IDENTITY pOrigin,
395 TW_MEMREF pData)
397 TRACE ("DG_CONTROL/DAT_USERINTERFACE/MSG_DISABLEDS\n");
399 if (activeDS.currentState != 5) {
400 activeDS.twCC = TWCC_SEQERROR;
401 return TWRC_FAILURE;
403 activeDS.currentState = 4;
404 activeDS.twCC = TWCC_SUCCESS;
405 return TWRC_SUCCESS;
408 /* DG_CONTROL/DAT_USERINTERFACE/MSG_ENABLEDS */
409 static TW_UINT16 GPHOTO2_EnableDSUserInterface (pTW_IDENTITY pOrigin,
410 TW_MEMREF pData)
412 pTW_USERINTERFACE pUserInterface = (pTW_USERINTERFACE) pData;
413 struct load_file_list_params params = { "/", &activeDS.file_count };
415 GPHOTO2_CALL( load_file_list, &params );
416 activeDS.download_flags = calloc( activeDS.file_count, sizeof(*activeDS.download_flags) );
417 activeDS.download_count = 0;
419 TRACE ("DG_CONTROL/DAT_USERINTERFACE/MSG_ENABLEDS\n");
420 if (activeDS.currentState != 4) {
421 FIXME("Sequence error %d\n", activeDS.currentState);
422 activeDS.twCC = TWCC_SEQERROR;
423 return TWRC_FAILURE;
425 if (pUserInterface->ShowUI)
427 BOOL rc;
428 activeDS.currentState = 5; /* Transitions to state 5 */
429 rc = DoCameraUI();
430 if (!rc) {
431 GPHOTO2_Notify(MSG_CLOSEDSREQ);
432 } else {
433 /* FIXME: The GUI should have marked the files to download... */
434 GPHOTO2_Notify(MSG_XFERREADY);
435 activeDS.currentState = 6; /* Transitions to state 6 directly */
437 } else {
438 /* no UI will be displayed, so source is ready to transfer data */
439 GPHOTO2_Notify(MSG_XFERREADY);
440 activeDS.currentState = 6; /* Transitions to state 6 directly */
442 activeDS.twCC = TWCC_SUCCESS;
443 return TWRC_SUCCESS;
446 /* DG_CONTROL/DAT_USERINTERFACE/MSG_ENABLEDSUIONLY */
447 static TW_UINT16 GPHOTO2_EnableDSUIOnly (pTW_IDENTITY pOrigin,
448 TW_MEMREF pData)
450 TRACE("DG_CONTROL/DAT_USERINTERFACE/MSG_ENABLEDSUIONLY\n");
452 if (activeDS.currentState != 4) {
453 activeDS.twCC = TWCC_SEQERROR;
454 return TWRC_FAILURE;
456 /* FIXME: we should replace xscanimage with our own UI */
457 FIXME ("not implemented!\n");
458 activeDS.currentState = 5;
459 activeDS.twCC = TWCC_SUCCESS;
460 return TWRC_SUCCESS;
463 /* DG_CONTROL/DAT_XFERGROUP/MSG_GET */
464 static TW_UINT16 GPHOTO2_XferGroupGet (pTW_IDENTITY pOrigin,
465 TW_MEMREF pData)
467 FIXME ("stub!\n");
468 return TWRC_FAILURE;
471 /* DG_CONTROL/DAT_XFERGROUP/MSG_SET */
472 static TW_UINT16 GPHOTO2_XferGroupSet (pTW_IDENTITY pOrigin,
473 TW_MEMREF pData)
475 FIXME ("stub!\n");
476 return TWRC_FAILURE;
479 HINSTANCE GPHOTO2_instance = 0;
481 BOOL WINAPI DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
483 TRACE("%p,%lx,%p\n", hinstDLL, fdwReason, lpvReserved);
485 switch (fdwReason)
487 case DLL_PROCESS_ATTACH:
488 GPHOTO2_instance = hinstDLL;
489 DisableThreadLibraryCalls(hinstDLL);
490 __wine_init_unix_call();
491 break;
494 return TRUE;
497 static TW_UINT16 GPHOTO2_OpenDS( pTW_IDENTITY pOrigin, pTW_IDENTITY self )
499 if (GPHOTO2_dsmentry == NULL)
501 HMODULE moddsm = GetModuleHandleW(L"twain_32");
503 if (moddsm)
504 GPHOTO2_dsmentry = (void*)GetProcAddress(moddsm, "DSM_Entry");
506 if (!GPHOTO2_dsmentry)
508 ERR("can't find DSM entry point\n");
509 return TWRC_FAILURE;
513 if (GPHOTO2_CALL( open_ds, self )) return TWRC_FAILURE;
515 activeDS.file_count = 0;
516 activeDS.file_handle = 0;
517 activeDS.download_count = 0;
518 activeDS.currentState = 4;
519 activeDS.twCC = TWRC_SUCCESS;
520 activeDS.pixelflavor = TWPF_CHOCOLATE;
521 activeDS.pixeltype = TWPT_RGB;
522 activeDS.capXferMech = TWSX_MEMORY;
523 activeDS.identity.Id = self->Id;
524 activeDS.appIdentity = *pOrigin;
525 TRACE("OK!\n");
526 return TWRC_SUCCESS;
529 static TW_UINT16 GPHOTO2_SourceControlHandler (
530 pTW_IDENTITY pOrigin,
531 TW_UINT16 DAT,
532 TW_UINT16 MSG,
533 TW_MEMREF pData)
535 TW_UINT16 twRC = TWRC_SUCCESS;
537 switch (DAT)
539 case DAT_IDENTITY:
540 switch (MSG)
542 case MSG_CLOSEDS:
543 GPHOTO2_CALL( close_ds, NULL );
544 break;
545 case MSG_GET:
546 if (GPHOTO2_CALL( get_identity, pData )) twRC = TWRC_FAILURE;
547 break;
548 case MSG_OPENDS:
549 twRC = GPHOTO2_OpenDS(pOrigin,(pTW_IDENTITY)pData);
550 break;
552 break;
553 case DAT_CAPABILITY:
554 switch (MSG)
556 case MSG_GET:
557 twRC = GPHOTO2_CapabilityGet (pOrigin, pData);
558 break;
559 case MSG_GETCURRENT:
560 twRC = GPHOTO2_CapabilityGetCurrent (pOrigin, pData);
561 break;
562 case MSG_GETDEFAULT:
563 twRC = GPHOTO2_CapabilityGetDefault (pOrigin, pData);
564 break;
565 case MSG_QUERYSUPPORT:
566 twRC = GPHOTO2_CapabilityQuerySupport (pOrigin, pData);
567 break;
568 case MSG_RESET:
569 twRC = GPHOTO2_CapabilityReset (pOrigin, pData);
570 break;
571 case MSG_SET:
572 twRC = GPHOTO2_CapabilitySet (pOrigin, pData);
573 break;
574 default:
575 twRC = TWRC_FAILURE;
576 FIXME("unrecognized operation triplet\n");
578 break;
580 case DAT_CUSTOMDSDATA:
581 switch (MSG)
583 case MSG_GET:
584 twRC = GPHOTO2_CustomDSDataGet (pOrigin, pData);
585 break;
586 case MSG_SET:
587 twRC = GPHOTO2_CustomDSDataSet (pOrigin, pData);
588 break;
589 default:
590 break;
592 break;
594 case DAT_FILESYSTEM:
595 switch (MSG)
597 /*case MSG_AUTOMATICCAPTUREDIRECTORY:
598 twRC = GPHOTO2_AutomaticCaptureDirectory
599 (pOrigin, pData);
600 break;*/
601 case MSG_CHANGEDIRECTORY:
602 twRC = GPHOTO2_ChangeDirectory (pOrigin, pData);
603 break;
604 /*case MSG_COPY:
605 twRC = GPHOTO2_FileSystemCopy (pOrigin, pData);
606 break;*/
607 case MSG_CREATEDIRECTORY:
608 twRC = GPHOTO2_CreateDirectory (pOrigin, pData);
609 break;
610 case MSG_DELETE:
611 twRC = GPHOTO2_FileSystemDelete (pOrigin, pData);
612 break;
613 case MSG_FORMATMEDIA:
614 twRC = GPHOTO2_FormatMedia (pOrigin, pData);
615 break;
616 case MSG_GETCLOSE:
617 twRC = GPHOTO2_FileSystemGetClose (pOrigin, pData);
618 break;
619 case MSG_GETFIRSTFILE:
620 twRC = GPHOTO2_FileSystemGetFirstFile (pOrigin, pData);
621 break;
622 case MSG_GETINFO:
623 twRC = GPHOTO2_FileSystemGetInfo (pOrigin, pData);
624 break;
625 case MSG_GETNEXTFILE:
626 twRC = GPHOTO2_FileSystemGetNextFile (pOrigin, pData);
627 break;
628 case MSG_RENAME:
629 twRC = GPHOTO2_FileSystemRename (pOrigin, pData);
630 break;
631 default:
632 twRC = TWRC_FAILURE;
633 break;
635 break;
637 case DAT_ENTRYPOINT:
638 if (MSG == MSG_SET)
639 twRC = GPHOTO2_SetEntryPoint (pOrigin, pData);
640 else
641 twRC = TWRC_FAILURE;
642 break;
644 case DAT_EVENT:
645 if (MSG == MSG_PROCESSEVENT)
646 twRC = GPHOTO2_ProcessEvent (pOrigin, pData);
647 else
648 twRC = TWRC_FAILURE;
649 break;
651 case DAT_PASSTHRU:
652 if (MSG == MSG_PASSTHRU)
653 twRC = GPHOTO2_PassThrough (pOrigin, pData);
654 else
655 twRC = TWRC_FAILURE;
656 break;
658 case DAT_PENDINGXFERS:
659 switch (MSG)
661 case MSG_ENDXFER:
662 twRC = GPHOTO2_PendingXfersEndXfer (pOrigin, pData);
663 break;
664 case MSG_GET:
665 twRC = GPHOTO2_PendingXfersGet (pOrigin, pData);
666 break;
667 case MSG_RESET:
668 twRC = GPHOTO2_PendingXfersReset (pOrigin, pData);
669 break;
670 /*case MSG_STOPFEEDER:
671 twRC = GPHOTO2_PendingXfersStopFeeder (pOrigin, pData);
672 break;*/
673 default:
674 twRC = TWRC_FAILURE;
676 break;
678 case DAT_SETUPFILEXFER:
679 switch (MSG)
681 case MSG_GET:
682 twRC = GPHOTO2_SetupFileXferGet (pOrigin, pData);
683 break;
684 case MSG_GETDEFAULT:
685 twRC = GPHOTO2_SetupFileXferGetDefault (pOrigin, pData);
686 break;
687 case MSG_RESET:
688 twRC = GPHOTO2_SetupFileXferReset (pOrigin, pData);
689 break;
690 case MSG_SET:
691 twRC = GPHOTO2_SetupFileXferSet (pOrigin, pData);
692 break;
693 default:
694 twRC = TWRC_FAILURE;
695 break;
697 break;
699 /*case DAT_SETUPFILEXFER2:
700 switch (MSG)
702 case MSG_GET:
703 twRC = GPHOTO2_SetupFileXfer2Get (pOrigin, pData);
704 break;
705 case MSG_GETDEFAULT:
706 twRC = GPHOTO2_SetupFileXfer2GetDefault (pOrigin, pData);
707 break;
708 case MSG_RESET:
709 twRC = GPHOTO2_SetupFileXfer2Reset (pOrigin, pData);
710 break;
711 case MSG_SET:
712 twRC = GPHOTO2_SetupFileXfer2Set (pOrigin, pData);
713 break;
715 break;*/
716 case DAT_SETUPMEMXFER:
717 if (MSG == MSG_GET)
718 twRC = GPHOTO2_SetupMemXferGet (pOrigin, pData);
719 else
720 twRC = TWRC_FAILURE;
721 break;
723 case DAT_STATUS:
724 if (MSG == MSG_GET)
725 twRC = GPHOTO2_GetDSStatus (pOrigin, pData);
726 else
727 twRC = TWRC_FAILURE;
728 break;
730 case DAT_USERINTERFACE:
731 switch (MSG)
733 case MSG_DISABLEDS:
734 twRC = GPHOTO2_DisableDSUserInterface (pOrigin, pData);
735 break;
736 case MSG_ENABLEDS:
737 twRC = GPHOTO2_EnableDSUserInterface (pOrigin, pData);
738 break;
739 case MSG_ENABLEDSUIONLY:
740 twRC = GPHOTO2_EnableDSUIOnly (pOrigin, pData);
741 break;
742 default:
743 twRC = TWRC_FAILURE;
744 break;
746 break;
748 case DAT_XFERGROUP:
749 switch (MSG)
751 case MSG_GET:
752 twRC = GPHOTO2_XferGroupGet (pOrigin, pData);
753 break;
754 case MSG_SET:
755 twRC = GPHOTO2_XferGroupSet (pOrigin, pData);
756 break;
757 default:
758 twRC = TWRC_FAILURE;
759 break;
761 break;
763 default:
764 FIXME("code unknown: %d\n", DAT);
765 twRC = TWRC_FAILURE;
766 break;
769 return twRC;
773 static TW_UINT16 GPHOTO2_ImageGroupHandler (
774 pTW_IDENTITY pOrigin,
775 TW_UINT16 DAT,
776 TW_UINT16 MSG,
777 TW_MEMREF pData)
779 TW_UINT16 twRC = TWRC_SUCCESS;
781 switch (DAT)
783 case DAT_CIECOLOR:
784 if (MSG == MSG_GET)
785 twRC = GPHOTO2_CIEColorGet (pOrigin, pData);
786 else
787 twRC = TWRC_FAILURE;
788 break;
790 case DAT_EXTIMAGEINFO:
791 if (MSG == MSG_GET)
792 twRC = GPHOTO2_ExtImageInfoGet (pOrigin, pData);
793 else
794 twRC = TWRC_FAILURE;
795 break;
797 case DAT_GRAYRESPONSE:
798 switch (MSG)
800 case MSG_RESET:
801 twRC = GPHOTO2_GrayResponseReset (pOrigin, pData);
802 break;
803 case MSG_SET:
804 twRC = GPHOTO2_GrayResponseSet (pOrigin, pData);
805 break;
806 default:
807 twRC = TWRC_FAILURE;
808 activeDS.twCC = TWCC_BADPROTOCOL;
809 FIXME("unrecognized operation triplet\n");
810 break;
812 break;
813 case DAT_IMAGEFILEXFER:
814 if (MSG == MSG_GET)
815 twRC = GPHOTO2_ImageFileXferGet (pOrigin, pData);
816 else
817 twRC = TWRC_FAILURE;
818 break;
820 case DAT_IMAGEINFO:
821 if (MSG == MSG_GET)
822 twRC = GPHOTO2_ImageInfoGet (pOrigin, pData);
823 else
824 twRC = TWRC_FAILURE;
825 break;
827 case DAT_IMAGELAYOUT:
828 switch (MSG)
830 case MSG_GET:
831 twRC = GPHOTO2_ImageLayoutGet (pOrigin, pData);
832 break;
833 case MSG_GETDEFAULT:
834 twRC = GPHOTO2_ImageLayoutGetDefault (pOrigin, pData);
835 break;
836 case MSG_RESET:
837 twRC = GPHOTO2_ImageLayoutReset (pOrigin, pData);
838 break;
839 case MSG_SET:
840 twRC = GPHOTO2_ImageLayoutSet (pOrigin, pData);
841 break;
842 default:
843 twRC = TWRC_FAILURE;
844 activeDS.twCC = TWCC_BADPROTOCOL;
845 ERR("unrecognized operation triplet\n");
846 break;
848 break;
850 case DAT_IMAGEMEMXFER:
851 if (MSG == MSG_GET)
852 twRC = GPHOTO2_ImageMemXferGet (pOrigin, pData);
853 else
854 twRC = TWRC_FAILURE;
855 break;
857 case DAT_IMAGENATIVEXFER:
858 if (MSG == MSG_GET)
859 twRC = GPHOTO2_ImageNativeXferGet (pOrigin, pData);
860 else
861 twRC = TWRC_FAILURE;
862 break;
864 case DAT_JPEGCOMPRESSION:
865 switch (MSG)
867 case MSG_GET:
868 twRC = GPHOTO2_JPEGCompressionGet (pOrigin, pData);
869 break;
870 case MSG_GETDEFAULT:
871 twRC = GPHOTO2_JPEGCompressionGetDefault (pOrigin, pData);
872 break;
873 case MSG_RESET:
874 twRC = GPHOTO2_JPEGCompressionReset (pOrigin, pData);
875 break;
876 case MSG_SET:
877 twRC = GPHOTO2_JPEGCompressionSet (pOrigin, pData);
878 break;
879 default:
880 twRC = TWRC_FAILURE;
881 activeDS.twCC = TWCC_BADPROTOCOL;
882 WARN("unrecognized operation triplet\n");
883 break;
885 break;
887 case DAT_PALETTE8:
888 switch (MSG)
890 case MSG_GET:
891 twRC = GPHOTO2_Palette8Get (pOrigin, pData);
892 break;
893 case MSG_GETDEFAULT:
894 twRC = GPHOTO2_Palette8GetDefault (pOrigin, pData);
895 break;
896 case MSG_RESET:
897 twRC = GPHOTO2_Palette8Reset (pOrigin, pData);
898 break;
899 case MSG_SET:
900 twRC = GPHOTO2_Palette8Set (pOrigin, pData);
901 break;
902 default:
903 twRC = TWRC_FAILURE;
904 activeDS.twCC = TWCC_BADPROTOCOL;
905 WARN("unrecognized operation triplet\n");
907 break;
909 case DAT_RGBRESPONSE:
910 switch (MSG)
912 case MSG_RESET:
913 twRC = GPHOTO2_RGBResponseReset (pOrigin, pData);
914 break;
915 case MSG_SET:
916 twRC = GPHOTO2_RGBResponseSet (pOrigin, pData);
917 break;
918 default:
919 twRC = TWRC_FAILURE;
920 activeDS.twCC = TWCC_BADPROTOCOL;
921 WARN("unrecognized operation triplet\n");
922 break;
924 break;
926 default:
927 twRC = TWRC_FAILURE;
928 activeDS.twCC = TWCC_BADPROTOCOL;
929 FIXME("unrecognized DG type %d\n", DAT);
931 return twRC;
934 /* Main entry point for the TWAIN library */
935 TW_UINT16 WINAPI
936 DS_Entry ( pTW_IDENTITY pOrigin,
937 TW_UINT32 DG,
938 TW_UINT16 DAT,
939 TW_UINT16 MSG,
940 TW_MEMREF pData)
942 TW_UINT16 twRC = TWRC_SUCCESS; /* Return Code */
944 TRACE("(DG=%ld DAT=%d MSG=%d)\n", DG, DAT, MSG);
946 switch (DG)
948 case DG_CONTROL:
949 twRC = GPHOTO2_SourceControlHandler (pOrigin,DAT,MSG,pData);
950 break;
951 case DG_IMAGE:
952 twRC = GPHOTO2_ImageGroupHandler (pOrigin,DAT,MSG,pData);
953 break;
954 case DG_AUDIO:
955 FIXME("The audio group of entry codes is not implemented.\n");
956 default:
957 activeDS.twCC = TWCC_BADPROTOCOL;
958 twRC = TWRC_FAILURE;
961 return twRC;