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
27 #include "gphoto2_i.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
;
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
;
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
;
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
,
89 /* DG_CONTROL/DAT_CAPABILITY/MSG_RESET */
90 static TW_UINT16
GPHOTO2_CapabilityReset (pTW_IDENTITY pOrigin
,
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
;
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
,
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
;
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
,
130 /* DG_CONTROL/DAT_CUSTOMDSDATA/MSG_SET */
131 static TW_UINT16
GPHOTO2_CustomDSDataSet (pTW_IDENTITY pOrigin
,
139 /* DG_CONTROL/DAT_FILESYSTEM/MSG_CHANGEDIRECTORY */
140 static TW_UINT16
GPHOTO2_ChangeDirectory (pTW_IDENTITY pOrigin
,
148 /* DG_CONTROL/DAT_FILESYSTEM/MSG_CREATEDIRECTORY */
149 static TW_UINT16
GPHOTO2_CreateDirectory (pTW_IDENTITY pOrigin
,
157 /* DG_CONTROL/DAT_FILESYSTEM/MSG_DELETE */
158 static TW_UINT16
GPHOTO2_FileSystemDelete (pTW_IDENTITY pOrigin
,
166 /* DG_CONTROL/DAT_FILESYSTEM/MSG_FORMATMEDIA */
167 static TW_UINT16
GPHOTO2_FormatMedia (pTW_IDENTITY pOrigin
,
175 /* DG_CONTROL/DAT_FILESYSTEM/MSG_GETCLOSE */
176 static TW_UINT16
GPHOTO2_FileSystemGetClose (pTW_IDENTITY pOrigin
,
184 /* DG_CONTROL/DAT_FILESYSTEM/MSG_GETFIRSTFILE */
185 static TW_UINT16
GPHOTO2_FileSystemGetFirstFile (pTW_IDENTITY pOrigin
,
194 /* DG_CONTROL/DAT_FILESYSTEM/MSG_GETINFO */
195 static TW_UINT16
GPHOTO2_FileSystemGetInfo (pTW_IDENTITY pOrigin
,
203 /* DG_CONTROL/DAT_FILESYSTEM/MSG_GETNEXTFILE */
204 static TW_UINT16
GPHOTO2_FileSystemGetNextFile (pTW_IDENTITY pOrigin
,
213 /* DG_CONTROL/DAT_FILESYSTEM/MSG_RENAME */
214 static TW_UINT16
GPHOTO2_FileSystemRename (pTW_IDENTITY pOrigin
,
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
;
237 /* DG_CONTROL/DAT_EVENT/MSG_PROCESSEVENT */
238 static TW_UINT16
GPHOTO2_ProcessEvent (pTW_IDENTITY pOrigin
,
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
;
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
,
264 /* DG_CONTROL/DAT_PENDINGXFERS/MSG_ENDXFER */
265 static TW_UINT16
GPHOTO2_PendingXfersEndXfer (pTW_IDENTITY pOrigin
,
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
;
276 TRACE("count = %d\n", activeDS
.download_count
);
277 pPendingXfers
->Count
= activeDS
.download_count
;
278 if (pPendingXfers
->Count
!= 0) {
279 activeDS
.currentState
= 6;
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
;
292 /* DG_CONTROL/DAT_PENDINGXFERS/MSG_GET */
293 static TW_UINT16
GPHOTO2_PendingXfersGet (pTW_IDENTITY pOrigin
,
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
;
305 TRACE("count = %d\n", activeDS
.download_count
);
306 pPendingXfers
->Count
= activeDS
.download_count
;
307 activeDS
.twCC
= TWCC_SUCCESS
;
311 /* DG_CONTROL/DAT_PENDINGXFERS/MSG_RESET */
312 static TW_UINT16
GPHOTO2_PendingXfersReset (pTW_IDENTITY pOrigin
,
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
;
323 pPendingXfers
->Count
= 0;
324 activeDS
.currentState
= 5;
325 activeDS
.twCC
= TWCC_SUCCESS
;
329 /* DG_CONTROL/DAT_SETUPFILEXFER/MSG_GET */
330 static TW_UINT16
GPHOTO2_SetupFileXferGet (pTW_IDENTITY pOrigin
,
338 /* DG_CONTROL/DAT_SETUPXFER/MSG_GETDEFAULT */
339 static TW_UINT16
GPHOTO2_SetupFileXferGetDefault (pTW_IDENTITY pOrigin
,
348 /* DG_CONTROL/DAT_SETUPFILEXFER/MSG_RESET */
349 static TW_UINT16
GPHOTO2_SetupFileXferReset (pTW_IDENTITY pOrigin
,
357 /* DG_CONTROL/DAT_SETUPFILEXFER/MSG_SET */
358 static TW_UINT16
GPHOTO2_SetupFileXferSet (pTW_IDENTITY pOrigin
,
366 /* DG_CONTROL/DAT_SETUPMEMXFER/MSG_GET */
367 static TW_UINT16
GPHOTO2_SetupMemXferGet (pTW_IDENTITY pOrigin
,
370 pTW_SETUPMEMXFER pSetupMemXfer
= (pTW_SETUPMEMXFER
)pData
;
372 TRACE("DG_CONTROL/DAT_SETUPMEMXFER/MSG_GET\n");
374 pSetupMemXfer
->MinBufSize
= 20000;
375 pSetupMemXfer
->MaxBufSize
= 80000;
376 pSetupMemXfer
->Preferred
= 40000;
380 /* DG_CONTROL/DAT_STATUS/MSG_GET */
381 static TW_UINT16
GPHOTO2_GetDSStatus (pTW_IDENTITY pOrigin
,
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
;
393 /* DG_CONTROL/DAT_USERINTERFACE/MSG_DISABLEDS */
394 static TW_UINT16
GPHOTO2_DisableDSUserInterface (pTW_IDENTITY pOrigin
,
397 TRACE ("DG_CONTROL/DAT_USERINTERFACE/MSG_DISABLEDS\n");
399 if (activeDS
.currentState
!= 5) {
400 activeDS
.twCC
= TWCC_SEQERROR
;
403 activeDS
.currentState
= 4;
404 activeDS
.twCC
= TWCC_SUCCESS
;
408 /* DG_CONTROL/DAT_USERINTERFACE/MSG_ENABLEDS */
409 static TW_UINT16
GPHOTO2_EnableDSUserInterface (pTW_IDENTITY pOrigin
,
412 pTW_USERINTERFACE pUserInterface
= (pTW_USERINTERFACE
) pData
;
413 struct load_file_list_params params
= { "/", &activeDS
.file_count
};
415 GPHOTO2_CALL( load_file_list
, ¶ms
);
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
;
425 if (pUserInterface
->ShowUI
)
428 activeDS
.currentState
= 5; /* Transitions to state 5 */
431 GPHOTO2_Notify(MSG_CLOSEDSREQ
);
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 */
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
;
446 /* DG_CONTROL/DAT_USERINTERFACE/MSG_ENABLEDSUIONLY */
447 static TW_UINT16
GPHOTO2_EnableDSUIOnly (pTW_IDENTITY pOrigin
,
450 TRACE("DG_CONTROL/DAT_USERINTERFACE/MSG_ENABLEDSUIONLY\n");
452 if (activeDS
.currentState
!= 4) {
453 activeDS
.twCC
= TWCC_SEQERROR
;
456 /* FIXME: we should replace xscanimage with our own UI */
457 FIXME ("not implemented!\n");
458 activeDS
.currentState
= 5;
459 activeDS
.twCC
= TWCC_SUCCESS
;
463 /* DG_CONTROL/DAT_XFERGROUP/MSG_GET */
464 static TW_UINT16
GPHOTO2_XferGroupGet (pTW_IDENTITY pOrigin
,
471 /* DG_CONTROL/DAT_XFERGROUP/MSG_SET */
472 static TW_UINT16
GPHOTO2_XferGroupSet (pTW_IDENTITY pOrigin
,
479 HINSTANCE GPHOTO2_instance
= 0;
481 BOOL WINAPI
DllMain (HINSTANCE hinstDLL
, DWORD fdwReason
, LPVOID lpvReserved
)
483 TRACE("%p,%lx,%p\n", hinstDLL
, fdwReason
, lpvReserved
);
487 case DLL_PROCESS_ATTACH
:
488 GPHOTO2_instance
= hinstDLL
;
489 DisableThreadLibraryCalls(hinstDLL
);
490 __wine_init_unix_call();
497 static TW_UINT16
GPHOTO2_OpenDS( pTW_IDENTITY pOrigin
, pTW_IDENTITY self
)
499 if (GPHOTO2_dsmentry
== NULL
)
501 HMODULE moddsm
= GetModuleHandleW(L
"twain_32");
504 GPHOTO2_dsmentry
= (void*)GetProcAddress(moddsm
, "DSM_Entry");
506 if (!GPHOTO2_dsmentry
)
508 ERR("can't find DSM entry point\n");
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
;
529 static TW_UINT16
GPHOTO2_SourceControlHandler (
530 pTW_IDENTITY pOrigin
,
535 TW_UINT16 twRC
= TWRC_SUCCESS
;
543 GPHOTO2_CALL( close_ds
, NULL
);
546 if (GPHOTO2_CALL( get_identity
, pData
)) twRC
= TWRC_FAILURE
;
549 twRC
= GPHOTO2_OpenDS(pOrigin
,(pTW_IDENTITY
)pData
);
557 twRC
= GPHOTO2_CapabilityGet (pOrigin
, pData
);
560 twRC
= GPHOTO2_CapabilityGetCurrent (pOrigin
, pData
);
563 twRC
= GPHOTO2_CapabilityGetDefault (pOrigin
, pData
);
565 case MSG_QUERYSUPPORT
:
566 twRC
= GPHOTO2_CapabilityQuerySupport (pOrigin
, pData
);
569 twRC
= GPHOTO2_CapabilityReset (pOrigin
, pData
);
572 twRC
= GPHOTO2_CapabilitySet (pOrigin
, pData
);
576 FIXME("unrecognized operation triplet\n");
580 case DAT_CUSTOMDSDATA
:
584 twRC
= GPHOTO2_CustomDSDataGet (pOrigin
, pData
);
587 twRC
= GPHOTO2_CustomDSDataSet (pOrigin
, pData
);
597 /*case MSG_AUTOMATICCAPTUREDIRECTORY:
598 twRC = GPHOTO2_AutomaticCaptureDirectory
601 case MSG_CHANGEDIRECTORY
:
602 twRC
= GPHOTO2_ChangeDirectory (pOrigin
, pData
);
605 twRC = GPHOTO2_FileSystemCopy (pOrigin, pData);
607 case MSG_CREATEDIRECTORY
:
608 twRC
= GPHOTO2_CreateDirectory (pOrigin
, pData
);
611 twRC
= GPHOTO2_FileSystemDelete (pOrigin
, pData
);
613 case MSG_FORMATMEDIA
:
614 twRC
= GPHOTO2_FormatMedia (pOrigin
, pData
);
617 twRC
= GPHOTO2_FileSystemGetClose (pOrigin
, pData
);
619 case MSG_GETFIRSTFILE
:
620 twRC
= GPHOTO2_FileSystemGetFirstFile (pOrigin
, pData
);
623 twRC
= GPHOTO2_FileSystemGetInfo (pOrigin
, pData
);
625 case MSG_GETNEXTFILE
:
626 twRC
= GPHOTO2_FileSystemGetNextFile (pOrigin
, pData
);
629 twRC
= GPHOTO2_FileSystemRename (pOrigin
, pData
);
639 twRC
= GPHOTO2_SetEntryPoint (pOrigin
, pData
);
645 if (MSG
== MSG_PROCESSEVENT
)
646 twRC
= GPHOTO2_ProcessEvent (pOrigin
, pData
);
652 if (MSG
== MSG_PASSTHRU
)
653 twRC
= GPHOTO2_PassThrough (pOrigin
, pData
);
658 case DAT_PENDINGXFERS
:
662 twRC
= GPHOTO2_PendingXfersEndXfer (pOrigin
, pData
);
665 twRC
= GPHOTO2_PendingXfersGet (pOrigin
, pData
);
668 twRC
= GPHOTO2_PendingXfersReset (pOrigin
, pData
);
670 /*case MSG_STOPFEEDER:
671 twRC = GPHOTO2_PendingXfersStopFeeder (pOrigin, pData);
678 case DAT_SETUPFILEXFER
:
682 twRC
= GPHOTO2_SetupFileXferGet (pOrigin
, pData
);
685 twRC
= GPHOTO2_SetupFileXferGetDefault (pOrigin
, pData
);
688 twRC
= GPHOTO2_SetupFileXferReset (pOrigin
, pData
);
691 twRC
= GPHOTO2_SetupFileXferSet (pOrigin
, pData
);
699 /*case DAT_SETUPFILEXFER2:
703 twRC = GPHOTO2_SetupFileXfer2Get (pOrigin, pData);
706 twRC = GPHOTO2_SetupFileXfer2GetDefault (pOrigin, pData);
709 twRC = GPHOTO2_SetupFileXfer2Reset (pOrigin, pData);
712 twRC = GPHOTO2_SetupFileXfer2Set (pOrigin, pData);
716 case DAT_SETUPMEMXFER
:
718 twRC
= GPHOTO2_SetupMemXferGet (pOrigin
, pData
);
725 twRC
= GPHOTO2_GetDSStatus (pOrigin
, pData
);
730 case DAT_USERINTERFACE
:
734 twRC
= GPHOTO2_DisableDSUserInterface (pOrigin
, pData
);
737 twRC
= GPHOTO2_EnableDSUserInterface (pOrigin
, pData
);
739 case MSG_ENABLEDSUIONLY
:
740 twRC
= GPHOTO2_EnableDSUIOnly (pOrigin
, pData
);
752 twRC
= GPHOTO2_XferGroupGet (pOrigin
, pData
);
755 twRC
= GPHOTO2_XferGroupSet (pOrigin
, pData
);
764 FIXME("code unknown: %d\n", DAT
);
773 static TW_UINT16
GPHOTO2_ImageGroupHandler (
774 pTW_IDENTITY pOrigin
,
779 TW_UINT16 twRC
= TWRC_SUCCESS
;
785 twRC
= GPHOTO2_CIEColorGet (pOrigin
, pData
);
790 case DAT_EXTIMAGEINFO
:
792 twRC
= GPHOTO2_ExtImageInfoGet (pOrigin
, pData
);
797 case DAT_GRAYRESPONSE
:
801 twRC
= GPHOTO2_GrayResponseReset (pOrigin
, pData
);
804 twRC
= GPHOTO2_GrayResponseSet (pOrigin
, pData
);
808 activeDS
.twCC
= TWCC_BADPROTOCOL
;
809 FIXME("unrecognized operation triplet\n");
813 case DAT_IMAGEFILEXFER
:
815 twRC
= GPHOTO2_ImageFileXferGet (pOrigin
, pData
);
822 twRC
= GPHOTO2_ImageInfoGet (pOrigin
, pData
);
827 case DAT_IMAGELAYOUT
:
831 twRC
= GPHOTO2_ImageLayoutGet (pOrigin
, pData
);
834 twRC
= GPHOTO2_ImageLayoutGetDefault (pOrigin
, pData
);
837 twRC
= GPHOTO2_ImageLayoutReset (pOrigin
, pData
);
840 twRC
= GPHOTO2_ImageLayoutSet (pOrigin
, pData
);
844 activeDS
.twCC
= TWCC_BADPROTOCOL
;
845 ERR("unrecognized operation triplet\n");
850 case DAT_IMAGEMEMXFER
:
852 twRC
= GPHOTO2_ImageMemXferGet (pOrigin
, pData
);
857 case DAT_IMAGENATIVEXFER
:
859 twRC
= GPHOTO2_ImageNativeXferGet (pOrigin
, pData
);
864 case DAT_JPEGCOMPRESSION
:
868 twRC
= GPHOTO2_JPEGCompressionGet (pOrigin
, pData
);
871 twRC
= GPHOTO2_JPEGCompressionGetDefault (pOrigin
, pData
);
874 twRC
= GPHOTO2_JPEGCompressionReset (pOrigin
, pData
);
877 twRC
= GPHOTO2_JPEGCompressionSet (pOrigin
, pData
);
881 activeDS
.twCC
= TWCC_BADPROTOCOL
;
882 WARN("unrecognized operation triplet\n");
891 twRC
= GPHOTO2_Palette8Get (pOrigin
, pData
);
894 twRC
= GPHOTO2_Palette8GetDefault (pOrigin
, pData
);
897 twRC
= GPHOTO2_Palette8Reset (pOrigin
, pData
);
900 twRC
= GPHOTO2_Palette8Set (pOrigin
, pData
);
904 activeDS
.twCC
= TWCC_BADPROTOCOL
;
905 WARN("unrecognized operation triplet\n");
909 case DAT_RGBRESPONSE
:
913 twRC
= GPHOTO2_RGBResponseReset (pOrigin
, pData
);
916 twRC
= GPHOTO2_RGBResponseSet (pOrigin
, pData
);
920 activeDS
.twCC
= TWCC_BADPROTOCOL
;
921 WARN("unrecognized operation triplet\n");
928 activeDS
.twCC
= TWCC_BADPROTOCOL
;
929 FIXME("unrecognized DG type %d\n", DAT
);
934 /* Main entry point for the TWAIN library */
936 DS_Entry ( pTW_IDENTITY pOrigin
,
942 TW_UINT16 twRC
= TWRC_SUCCESS
; /* Return Code */
944 TRACE("(DG=%ld DAT=%d MSG=%d)\n", DG
, DAT
, MSG
);
949 twRC
= GPHOTO2_SourceControlHandler (pOrigin
,DAT
,MSG
,pData
);
952 twRC
= GPHOTO2_ImageGroupHandler (pOrigin
,DAT
,MSG
,pData
);
955 FIXME("The audio group of entry codes is not implemented.\n");
957 activeDS
.twCC
= TWCC_BADPROTOCOL
;