Cleaned up a bit, removed todos for OpenThread, avoid TerminateThread
[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     pTW_USERINTERFACE pUserInterface = (pTW_USERINTERFACE) pData;
579     activeDS *pSource = TWAIN_LookupSource (pDest);
580
581     TRACE ("DG_CONTROL/DAT_USERINTERFACE/MSG_DISABLEDS\n");
582
583     if (!pSource)
584     {
585         twRC = TWRC_FAILURE;
586         DSM_twCC = TWCC_BADDEST;
587     }
588     else if (pSource->currentState != 5)
589     {
590         twRC = TWRC_FAILURE;
591         pSource->twCC = TWCC_SEQERROR;
592     }
593     else
594     {
595         pSource->currentState = 4;
596         twRC = TWRC_SUCCESS;
597         pSource->twCC = TWCC_SUCCESS;
598     }
599
600     return twRC;
601 }
602
603 /* DG_CONTROL/DAT_USERINTERFACE/MSG_ENABLEDS */
604 TW_UINT16 TWAIN_EnableDSUserInterface (pTW_IDENTITY pOrigin,
605                                        pTW_IDENTITY pDest, TW_MEMREF pData)
606 {
607     TW_UINT16 twRC = TWRC_SUCCESS;
608     pTW_USERINTERFACE pUserInterface = (pTW_USERINTERFACE) pData;
609     activeDS *pSource = TWAIN_LookupSource (pDest);
610    
611     TRACE ("DG_CONTROL/DAT_USERINTERFACE/MSG_ENABLEDS\n");
612  
613     if (!pSource)
614     {
615         twRC = TWRC_FAILURE;
616         DSM_twCC = TWCC_BADDEST;
617     }
618     else if (pSource->currentState != 4)
619     {
620         twRC = TWRC_FAILURE;
621         pSource->twCC = TWCC_SEQERROR;
622     }
623     else
624     {
625         if (pUserInterface->ShowUI)
626         {
627             pSource->currentState = 5; /* Transitions to state 5 */ 
628             /* FIXME: we should replace xscanimage with our own device UI */
629             system ("xscanimage");
630             pSource->currentState = 6;
631             pSource->pendingEvent.TWMessage = MSG_XFERREADY;
632         }
633         else
634         {
635             /* no UI will be displayed, so source is ready to transfer data */
636             pSource->pendingEvent.TWMessage = MSG_XFERREADY; 
637             pSource->currentState = 6; /* Transitions to state 6 directly */
638         }
639         
640         pSource->hwndOwner = pUserInterface->hParent;
641         twRC = TWRC_SUCCESS;
642         pSource->twCC = TWCC_SUCCESS;
643     }
644
645     return twRC;
646 }
647
648 /* DG_CONTROL/DAT_USERINTERFACE/MSG_ENABLEDSUIONLY */
649 TW_UINT16 TWAIN_EnableDSUIOnly (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
650                                 TW_MEMREF pData)
651 {
652     TW_UINT16 twRC = TWRC_SUCCESS;
653     pTW_USERINTERFACE pUserInterface = (pTW_USERINTERFACE) pData;
654     activeDS *pSource = TWAIN_LookupSource (pDest);
655
656     TRACE("DG_CONTROL/DAT_USERINTERFACE/MSG_ENABLEDSUIONLY\n");
657
658     if (!pSource)
659     {
660         twRC = TWRC_FAILURE;
661         DSM_twCC = TWCC_BADDEST;
662     }
663     else if (pSource->currentState != 4)
664     {
665         twRC = TWRC_FAILURE;
666         pSource->twCC = TWCC_SEQERROR;
667     }
668     else
669     {
670         /* FIXME: we should replace xscanimage with our own UI */
671         system ("xscanimage");
672         pSource->currentState = 5;
673         twRC = TWRC_SUCCESS;
674         pSource->twCC = TWCC_SUCCESS; 
675     }
676
677     return twRC;
678 }
679
680 /* DG_CONTROL/DAT_XFERGROUP/MSG_GET */
681 TW_UINT16 TWAIN_XferGroupGet (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
682                               TW_MEMREF pData)
683 {
684     FIXME ("stub!\n");
685
686     return TWRC_FAILURE;
687 }
688
689 /* DG_CONTROL/DAT_XFERGROUP/MSG_SET */
690 TW_UINT16 TWAIN_XferGroupSet (pTW_IDENTITY pOrigin, pTW_IDENTITY pDest,
691                                   TW_MEMREF pData)
692 {
693     FIXME ("stub!\n");
694
695     return TWRC_FAILURE;
696 }