Fixed warnings.
[wine] / dlls / twain / ds_ctrl.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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17  */
18
19 #include <unistd.h>
20 #include <stdlib.h>
21 #include "twain.h"
22 #include "twain_i.h"
23 #include "wine/debug.h"
24
25 WINE_DEFAULT_DEBUG_CHANNEL(twain);
26
27 /* DG_CONTROL/DAT_CAPABILITY/MSG_GET */
28 TW_UINT16 TWAIN_CapabilityGet (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
29                                TW_MEMREF pData)
30 {
31     TW_UINT16 twRC = TWRC_SUCCESS, twCC = TWCC_SUCCESS;
32     pTW_CAPABILITY pCapability = (pTW_CAPABILITY) pData;
33     activeDS *pSource = TWAIN_LookupSource (pDest);
34     
35     TRACE("DG_CONTROL/DAT_CAPABILITY/MSG_GET\n");
36     
37     if (!pDest)
38     {
39         twRC = TWRC_FAILURE;
40         DSM_twCC = TWCC_BADDEST;
41     }
42     else if (pSource->currentState < 4 || pSource->currentState > 7)
43     {
44         twRC = TWRC_FAILURE;
45         pSource->twCC = TWCC_SEQERROR;
46     }
47     else
48     {
49         twCC = TWAIN_SaneCapability (pSource, pCapability, MSG_GET);
50         twRC = (twCC == TWCC_SUCCESS)?TWRC_SUCCESS:TWRC_FAILURE;
51         pSource->twCC = twCC; 
52     }
53
54     return twRC;
55 }
56
57 /* DG_CONTROL/DAT_CAPABILITY/MSG_GETCURRENT */
58 TW_UINT16 TWAIN_CapabilityGetCurrent (pTW_IDENTITY pOrigin,
59                                       pTW_IDENTITY pDest,TW_MEMREF pData)
60 {
61     TW_UINT16 twRC = TWRC_SUCCESS, twCC = TWCC_SUCCESS;
62     pTW_CAPABILITY pCapability = (pTW_CAPABILITY) pData;
63     activeDS *pSource = TWAIN_LookupSource (pDest);
64
65     TRACE("DG_CONTROL/DAT_CAPABILITY/MSG_GETCURRENT\n");
66
67     if (!pSource)
68     {
69         twRC = TWRC_FAILURE;
70         DSM_twCC = TWCC_BADDEST;
71     }
72     else if (pSource->currentState < 4 || pSource->currentState > 7)
73     {
74         twRC = TWRC_FAILURE;
75         pSource->twCC = TWCC_SEQERROR;
76     }
77     else
78     {
79         twCC = TWAIN_SaneCapability (pSource, pCapability, MSG_GETCURRENT);
80         twRC = (twCC == TWCC_SUCCESS)?TWRC_SUCCESS:TWRC_FAILURE;
81         pSource->twCC = twCC;
82     } 
83
84     return twRC;
85 }
86
87 /* DG_CONTROL/DAT_CAPABILITY/MSG_GETDEFAULT */
88 TW_UINT16 TWAIN_CapabilityGetDefault (pTW_IDENTITY pOrigin,
89                                       pTW_IDENTITY pDest, TW_MEMREF pData)
90 {
91     TW_UINT16 twRC = TWRC_SUCCESS, twCC = TWCC_SUCCESS;
92     pTW_CAPABILITY pCapability = (pTW_CAPABILITY) pData;
93     activeDS *pSource = TWAIN_LookupSource (pDest);
94
95     TRACE("DG_CONTROL/DAT_CAPABILITY/MSG_GETDEFAULT\n");
96
97     if (!pDest)
98     {
99         twRC = TWRC_FAILURE;
100         DSM_twCC = TWCC_BADDEST;
101     }
102     else if (pSource->currentState < 4 || pSource->currentState > 7)
103     {
104         twRC = TWRC_FAILURE;
105         pSource->twCC = TWCC_SEQERROR;
106     }
107     else
108     {
109         twCC = TWAIN_SaneCapability (pSource, pCapability, MSG_GETDEFAULT);
110         twRC = (twCC == TWCC_SUCCESS)?TWRC_SUCCESS:TWRC_FAILURE;
111         pSource->twCC = twCC;
112     }
113
114     return twRC;
115 }
116
117 /* DG_CONTROL/DAT_CAPABILITY/MSG_QUERYSUPPORT */
118 TW_UINT16 TWAIN_CapabilityQuerySupport (pTW_IDENTITY pOrigin,
119                                         pTW_IDENTITY pDest, TW_MEMREF pData)
120 {
121     FIXME ("stub!\n");
122
123     return TWRC_FAILURE;
124 }
125
126 /* DG_CONTROL/DAT_CAPABILITY/MSG_RESET */
127 TW_UINT16 TWAIN_CapabilityReset (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
128                                  TW_MEMREF pData)
129 {
130     TW_UINT16 twRC = TWRC_SUCCESS, twCC = TWCC_SUCCESS;
131     pTW_CAPABILITY pCapability = (pTW_CAPABILITY) pData;
132     activeDS *pSource = TWAIN_LookupSource (pDest);
133
134     TRACE("DG_CONTROL/DAT_CAPABILITY/MSG_RESET\n");
135
136     if (!pDest)
137     {
138         twRC = TWRC_FAILURE;
139         DSM_twCC = TWCC_BADDEST;
140     }
141     else if (pSource->currentState < 4 || pSource->currentState > 7)
142     {
143         twRC = TWRC_FAILURE;
144         pSource->twCC = TWCC_SEQERROR;
145     }
146     else
147     {
148         twCC = TWAIN_SaneCapability (pSource, pCapability, MSG_RESET);
149         twRC = (twCC == TWCC_SUCCESS)?TWRC_SUCCESS:TWRC_FAILURE;
150         pSource->twCC = twCC;
151     }
152
153     return twRC;
154 }
155
156 /* DG_CONTROL/DAT_CAPABILITY/MSG_SET */
157 TW_UINT16 TWAIN_CapabilitySet (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest, 
158                                TW_MEMREF pData)
159 {
160     TW_UINT16 twRC = TWRC_SUCCESS, twCC = TWCC_SUCCESS;
161     pTW_CAPABILITY pCapability = (pTW_CAPABILITY) pData;
162     activeDS *pSource = TWAIN_LookupSource (pDest);
163
164     TRACE ("DG_CONTROL/DAT_CAPABILITY/MSG_SET\n");
165
166     if (!pSource)
167     {
168         twRC = TWRC_FAILURE;
169         DSM_twCC = TWCC_BADDEST;
170     }
171     else if (pSource->currentState != 4)
172     {
173         twRC = TWRC_FAILURE;
174         pSource->twCC = TWCC_SEQERROR;
175     }
176     else
177     {
178         twCC = TWAIN_SaneCapability (pSource, pCapability, MSG_SET); 
179         twRC = (twCC == TWCC_SUCCESS)?TWRC_SUCCESS:TWRC_FAILURE;
180         pSource->twCC = twCC;
181     }
182     return twRC;
183 }
184
185 /* DG_CONTROL/DAT_CUSTOMDSDATA/MSG_GET */
186 TW_UINT16 TWAIN_CustomDSDataGet (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
187                                 TW_MEMREF pData)
188 {
189     FIXME ("stub!\n");
190
191     return TWRC_FAILURE;
192 }
193
194 /* DG_CONTROL/DAT_CUSTOMDSDATA/MSG_SET */
195 TW_UINT16 TWAIN_CustomDSDataSet (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
196                                  TW_MEMREF pData)
197 {
198     FIXME ("stub!\n");
199
200     return TWRC_FAILURE;
201 }
202
203 /* DG_CONTROL/DAT_FILESYSTEM/MSG_AUTOMATICCAPTUREDIRECTORY */
204 TW_UINT16 TWAIN_AutomaticCaptureDirectory (pTW_IDENTITY pOrigin,
205                                            pTW_IDENTITY pDest,
206                                            TW_MEMREF pData)
207 {
208     FIXME ("stub!\n");
209
210     return TWRC_FAILURE;
211 }
212
213 /* DG_CONTROL/DAT_FILESYSTEM/MSG_CHANGEDIRECTORY */
214 TW_UINT16 TWAIN_ChangeDirectory (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
215                                  TW_MEMREF pData)
216 {
217     FIXME ("stub!\n");
218
219     return TWRC_FAILURE;
220 }
221
222 /* DG_CONTROL/DAT_FILESYSTEM/MSG_COPY */
223 TW_UINT16 TWAIN_FileSystemCopy (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
224                                 TW_MEMREF pData)
225 {
226     FIXME ("stub!\n");
227
228     return TWRC_FAILURE;
229 }
230
231 /* DG_CONTROL/DAT_FILESYSTEM/MSG_CREATEDIRECTORY */
232 TW_UINT16 TWAIN_CreateDirectory (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
233                                  TW_MEMREF pData)
234 {
235     FIXME ("stub!\n");
236
237     return TWRC_FAILURE;
238 }
239
240 /* DG_CONTROL/DAT_FILESYSTEM/MSG_DELETE */
241 TW_UINT16 TWAIN_FileSystemDelete (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
242                                   TW_MEMREF pData)
243 {
244     FIXME ("stub!\n");
245
246     return TWRC_FAILURE;
247 }
248
249 /* DG_CONTROL/DAT_FILESYSTEM/MSG_FORMATMEDIA */
250 TW_UINT16 TWAIN_FormatMedia (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
251                              TW_MEMREF pData)
252 {
253     FIXME ("stub!\n");
254
255     return TWRC_FAILURE;
256 }
257
258 /* DG_CONTROL/DAT_FILESYSTEM/MSG_GETCLOSE */
259 TW_UINT16 TWAIN_FileSystemGetClose (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
260                                     TW_MEMREF pData)
261 {
262     FIXME ("stub!\n");
263
264     return TWRC_FAILURE;
265 }
266
267 /* DG_CONTROL/DAT_FILESYSTEM/MSG_GETFIRSTFILE */
268 TW_UINT16 TWAIN_FileSystemGetFirstFile (pTW_IDENTITY pOrigin,
269                                         pTW_IDENTITY pDest,
270                                         TW_MEMREF pData)
271 {
272     FIXME ("stub!\n");
273
274     return TWRC_FAILURE;
275 }
276
277 /* DG_CONTROL/DAT_FILESYSTEM/MSG_GETINFO */
278 TW_UINT16 TWAIN_FileSystemGetInfo (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
279                                    TW_MEMREF pData)
280 {
281     FIXME ("stub!\n");
282
283     return TWRC_FAILURE;
284 }
285
286 /* DG_CONTROL/DAT_FILESYSTEM/MSG_GETNEXTFILE */
287 TW_UINT16 TWAIN_FileSystemGetNextFile (pTW_IDENTITY pOrigin,
288                                        pTW_IDENTITY pDest,
289                                        TW_MEMREF pData)
290 {
291     FIXME ("stub!\n");
292
293     return TWRC_FAILURE;
294 }
295
296 /* DG_CONTROL/DAT_FILESYSTEM/MSG_RENAME */
297 TW_UINT16 TWAIN_FileSystemRename (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
298                                   TW_MEMREF pData)
299 {
300     FIXME ("stub!\n");
301
302     return TWRC_FAILURE;
303 }
304
305 /* DG_CONTROL/DAT_EVENT/MSG_PROCESSEVENT */
306 TW_UINT16 TWAIN_ProcessEvent (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
307                               TW_MEMREF pData)
308 {
309     TW_UINT16 twRC = TWRC_SUCCESS;
310     pTW_EVENT pEvent = (pTW_EVENT) pData;
311     activeDS *pSource = TWAIN_LookupSource (pDest);
312
313     TRACE("DG_CONTROL/DAT_EVENT/MSG_PROCESSEVENT\n");
314
315     if (!pSource)
316     {
317          twRC = TWRC_FAILURE;
318          DSM_twCC = TWCC_BADDEST;
319     }
320     else if (pSource->currentState < 5 || pSource->currentState > 7)
321     {
322         twRC = TWRC_FAILURE;
323         pSource->twCC = TWCC_SEQERROR;
324     }
325     else
326     {
327         if (pSource->pendingEvent.TWMessage != MSG_NULL)
328         {
329             pEvent->TWMessage = pSource->pendingEvent.TWMessage;
330             pSource->pendingEvent.TWMessage = MSG_NULL;
331             twRC = TWRC_DSEVENT;
332         }
333         else
334         {
335             pEvent->TWMessage = MSG_NULL;  /* no message to the application */
336             twRC = TWRC_NOTDSEVENT;
337         }
338         pSource->twCC = TWCC_SUCCESS;
339     }
340
341     return twRC;
342 }
343
344 /* DG_CONTROL/DAT_PASSTHRU/MSG_PASSTHRU */
345 TW_UINT16 TWAIN_PassThrough (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
346                              TW_MEMREF pData)
347 {
348     FIXME ("stub!\n");
349
350     return TWRC_FAILURE;
351 }
352
353 /* DG_CONTROL/DAT_PENDINGXFERS/MSG_ENDXFER */
354 TW_UINT16 TWAIN_PendingXfersEndXfer (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
355                                      TW_MEMREF pData)
356 {
357     TW_UINT16 twRC = TWRC_SUCCESS;
358     pTW_PENDINGXFERS pPendingXfers = (pTW_PENDINGXFERS) pData;
359     activeDS *pSource = TWAIN_LookupSource (pData);
360
361     TRACE("DG_CONTROL/DAT_PENDINGXFERS/MSG_ENDXFER\n");
362
363     if (!pSource)
364     {
365         twRC = TWRC_FAILURE;
366         DSM_twCC = TWCC_BADDEST;
367     }
368     else if (pSource->currentState != 6 && pSource->currentState != 7)
369     {
370         twRC = TWRC_FAILURE;
371         pSource->twCC = TWCC_SEQERROR;
372     }
373     else
374     {
375         if (pPendingXfers->Count != 0)
376         {
377             pPendingXfers->Count --;
378             pSource->currentState = 6;
379         }
380         else
381         {
382             pSource->currentState = 5;
383             /* Notify the application that it can close the data source */
384             pSource->pendingEvent.TWMessage = MSG_CLOSEDSREQ;
385         }
386         twRC = TWRC_SUCCESS;
387         pSource->twCC = TWCC_SUCCESS;
388     }
389
390     return twRC;
391 }
392
393 /* DG_CONTROL/DAT_PENDINGXFERS/MSG_GET */
394 TW_UINT16 TWAIN_PendingXfersGet (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
395                                  TW_MEMREF pData)
396 {
397     TW_UINT16 twRC = TWRC_SUCCESS;
398     pTW_PENDINGXFERS pPendingXfers = (pTW_PENDINGXFERS) pData;
399     activeDS *pSource = TWAIN_LookupSource (pDest);
400
401     TRACE("DG_CONTROL/DAT_PENDINGXFERS/MSG_GET\n");
402
403     if (!pSource)
404     {
405         twRC = TWRC_FAILURE;
406         DSM_twCC = TWCC_BADDEST;
407     }
408     else if (pSource->currentState < 4 || pSource->currentState > 7)
409     {
410         twRC = TWRC_FAILURE;
411         DSM_twCC = TWCC_SEQERROR;
412     }
413     else
414     {
415         /* FIXME: we shouldn't return 1 here */
416         pPendingXfers->Count = 1;
417         twRC = TWRC_SUCCESS;
418         pSource->twCC = TWCC_SUCCESS;
419     }
420
421     return twRC;
422 }
423
424 /* DG_CONTROL/DAT_PENDINGXFERS/MSG_RESET */
425 TW_UINT16 TWAIN_PendingXfersReset (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
426                                    TW_MEMREF pData)
427 {
428     TW_UINT16 twRC = TWRC_SUCCESS;
429     pTW_PENDINGXFERS pPendingXfers = (pTW_PENDINGXFERS) pData;
430     activeDS *pSource = TWAIN_LookupSource (pDest);
431
432     TRACE("DG_CONTROL/DAT_PENDINGXFERS/MSG_RESET\n");
433
434     if (!pSource)
435     {
436         twRC = TWRC_FAILURE;
437         DSM_twCC = TWCC_BADDEST;
438     }
439     else if (pSource->currentState != 6)
440     {
441         twRC = TWRC_FAILURE;
442         DSM_twCC = TWCC_SEQERROR;
443     }
444     else
445     {
446         pPendingXfers->Count = 0;
447         pSource->currentState = 5;
448         twRC = TWRC_SUCCESS;
449         pSource->twCC = TWCC_SUCCESS;
450     }
451
452     return twRC;
453 }
454
455 /* DG_CONTROL/DAT_PENDINGXFERS/MSG_STOPFEEDER */
456 TW_UINT16 TWAIN_PendingXfersStopFeeder (pTW_IDENTITY pOrigin,
457                                         pTW_IDENTITY pDest, TW_MEMREF pData)
458 {
459     FIXME ("stub!\n");
460
461     return TWRC_FAILURE;
462 }
463
464 /* DG_CONTROL/DAT_SETUPFILEXFER/MSG_GET */
465 TW_UINT16 TWAIN_SetupFileXferGet (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
466                                   TW_MEMREF pData)
467 {
468     FIXME ("stub!\n");
469
470     return TWRC_FAILURE;
471 }
472
473 /* DG_CONTROL/DAT_SETUPXFER/MSG_GETDEFAULT */
474 TW_UINT16 TWAIN_SetupFileXferGetDefault (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
475                                          TW_MEMREF pData)
476 {
477     FIXME ("stub!\n");
478
479     return TWRC_FAILURE;
480 }
481
482
483 /* DG_CONTROL/DAT_SETUPFILEXFER/MSG_RESET */
484 TW_UINT16 TWAIN_SetupFileXferReset (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
485                                     TW_MEMREF pData)
486 {
487     FIXME ("stub!\n");
488
489     return TWRC_FAILURE;
490 }
491
492 /* DG_CONTROL/DAT_SETUPFILEXFER/MSG_SET */
493 TW_UINT16 TWAIN_SetupFileXferSet (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
494                                   TW_MEMREF pData)
495 {
496     FIXME ("stub!\n");
497
498     return TWRC_FAILURE;
499 }
500
501 /* DG_CONTROL/DAT_SETUPFILEXFER2/MSG_GET */
502 TW_UINT16 TWAIN_SetupFileXfer2Get (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
503                                    TW_MEMREF pData)
504 {
505     FIXME ("stub!\n");
506
507     return TWRC_FAILURE;
508 }
509
510 /* DG_CONTROL/DAT_SETUPFILEXFER2/MSG_GETDEFAULT */
511 TW_UINT16 TWAIN_SetupFileXfer2GetDefault (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
512                                          TW_MEMREF pData)
513 {
514     FIXME ("stub!\n");
515
516     return TWRC_FAILURE;
517 }
518
519 /* DG_CONTROL/DAT_SETUPFILEXFER2/MSG_RESET */
520 TW_UINT16 TWAIN_SetupFileXfer2Reset (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
521                                   TW_MEMREF pData)
522 {
523     FIXME ("stub!\n");
524
525     return TWRC_FAILURE;
526 }
527
528 /* DG_CONTROL/DAT_SETUPFILEXFER2/MSG_SET */
529 TW_UINT16 TWAIN_SetupFileXfer2Set (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
530                                   TW_MEMREF pData)
531 {
532     FIXME ("stub!\n");
533
534     return TWRC_FAILURE;
535 }
536
537 /* DG_CONTROL/DAT_SETUPMEMXFER/MSG_GET */
538 TW_UINT16 TWAIN_SetupMemXferGet (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
539                                   TW_MEMREF pData)
540 {
541     FIXME ("stub!\n");
542
543     return TWRC_FAILURE;
544 }
545
546 /* DG_CONTROL/DAT_STATUS/MSG_GET */
547 TW_UINT16 TWAIN_GetDSStatus (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
548                              TW_MEMREF pData)
549 {
550     TW_UINT16 twRC = TWRC_FAILURE;
551     pTW_STATUS pSourceStatus = (pTW_STATUS) pData;
552     activeDS *pSource = TWAIN_LookupSource (pDest);
553
554     TRACE ("DG_CONTROL/DAT_STATUS/MSG_GET\n");
555
556     if (!pSource)
557     {
558         twRC = TWRC_FAILURE;
559         DSM_twCC = TWCC_BADDEST;
560         pSourceStatus->ConditionCode = TWCC_BADDEST;
561     }
562     else
563     {
564         twRC = TWRC_SUCCESS;
565         pSourceStatus->ConditionCode = pSource->twCC;
566         /* Reset the condition code */
567         pSource->twCC = TWCC_SUCCESS;
568     }
569  
570     return twRC;
571 }
572
573 /* DG_CONTROL/DAT_USERINTERFACE/MSG_DISABLEDS */
574 TW_UINT16 TWAIN_DisableDSUserInterface (pTW_IDENTITY pOrigin,
575                                         pTW_IDENTITY pDest, TW_MEMREF pData)
576 {
577     TW_UINT16 twRC = TWRC_SUCCESS;
578     activeDS *pSource = TWAIN_LookupSource (pDest);
579
580     TRACE ("DG_CONTROL/DAT_USERINTERFACE/MSG_DISABLEDS\n");
581
582     if (!pSource)
583     {
584         twRC = TWRC_FAILURE;
585         DSM_twCC = TWCC_BADDEST;
586     }
587     else if (pSource->currentState != 5)
588     {
589         twRC = TWRC_FAILURE;
590         pSource->twCC = TWCC_SEQERROR;
591     }
592     else
593     {
594         pSource->currentState = 4;
595         twRC = TWRC_SUCCESS;
596         pSource->twCC = TWCC_SUCCESS;
597     }
598
599     return twRC;
600 }
601
602 /* DG_CONTROL/DAT_USERINTERFACE/MSG_ENABLEDS */
603 TW_UINT16 TWAIN_EnableDSUserInterface (pTW_IDENTITY pOrigin,
604                                        pTW_IDENTITY pDest, TW_MEMREF pData)
605 {
606     TW_UINT16 twRC = TWRC_SUCCESS;
607     pTW_USERINTERFACE pUserInterface = (pTW_USERINTERFACE) pData;
608     activeDS *pSource = TWAIN_LookupSource (pDest);
609    
610     TRACE ("DG_CONTROL/DAT_USERINTERFACE/MSG_ENABLEDS\n");
611  
612     if (!pSource)
613     {
614         twRC = TWRC_FAILURE;
615         DSM_twCC = TWCC_BADDEST;
616     }
617     else if (pSource->currentState != 4)
618     {
619         twRC = TWRC_FAILURE;
620         pSource->twCC = TWCC_SEQERROR;
621     }
622     else
623     {
624         if (pUserInterface->ShowUI)
625         {
626             pSource->currentState = 5; /* Transitions to state 5 */ 
627             /* FIXME: we should replace xscanimage with our own device UI */
628             system ("xscanimage");
629             pSource->currentState = 6;
630             pSource->pendingEvent.TWMessage = MSG_XFERREADY;
631         }
632         else
633         {
634             /* no UI will be displayed, so source is ready to transfer data */
635             pSource->pendingEvent.TWMessage = MSG_XFERREADY; 
636             pSource->currentState = 6; /* Transitions to state 6 directly */
637         }
638         
639         pSource->hwndOwner = pUserInterface->hParent;
640         twRC = TWRC_SUCCESS;
641         pSource->twCC = TWCC_SUCCESS;
642     }
643
644     return twRC;
645 }
646
647 /* DG_CONTROL/DAT_USERINTERFACE/MSG_ENABLEDSUIONLY */
648 TW_UINT16 TWAIN_EnableDSUIOnly (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
649                                 TW_MEMREF pData)
650 {
651     TW_UINT16 twRC = TWRC_SUCCESS;
652     activeDS *pSource = TWAIN_LookupSource (pDest);
653
654     TRACE("DG_CONTROL/DAT_USERINTERFACE/MSG_ENABLEDSUIONLY\n");
655
656     if (!pSource)
657     {
658         twRC = TWRC_FAILURE;
659         DSM_twCC = TWCC_BADDEST;
660     }
661     else if (pSource->currentState != 4)
662     {
663         twRC = TWRC_FAILURE;
664         pSource->twCC = TWCC_SEQERROR;
665     }
666     else
667     {
668         /* FIXME: we should replace xscanimage with our own UI */
669         system ("xscanimage");
670         pSource->currentState = 5;
671         twRC = TWRC_SUCCESS;
672         pSource->twCC = TWCC_SUCCESS; 
673     }
674
675     return twRC;
676 }
677
678 /* DG_CONTROL/DAT_XFERGROUP/MSG_GET */
679 TW_UINT16 TWAIN_XferGroupGet (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
680                               TW_MEMREF pData)
681 {
682     FIXME ("stub!\n");
683
684     return TWRC_FAILURE;
685 }
686
687 /* DG_CONTROL/DAT_XFERGROUP/MSG_SET */
688 TW_UINT16 TWAIN_XferGroupSet (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
689                                   TW_MEMREF pData)
690 {
691     FIXME ("stub!\n");
692
693     return TWRC_FAILURE;
694 }