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