ReactOS 0.4.15-dev-7931-gfd331f1
twain32_main.c
Go to the documentation of this file.
1/*
2 * TWAIN32 functions
3 *
4 * Copyright 2000 Shi Quan He <shiquan@cyberdude.com>
5 * Copyright 2006 Marcus Meissner
6 *
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.
11 *
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.
16 *
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
20 */
21
22#include <stdarg.h>
23
24#include "windef.h"
25#include "winbase.h"
26#include "twain.h"
27#include "twain_i.h"
28#include "wine/debug.h"
29
31
35
37{
38 TRACE("%p,%x,%p\n", hinstance, reason, reserved);
39
40 switch (reason)
41 {
44 DSM_hinstance = hinstance;
45 break;
47 break;
48 }
49 return TRUE;
50}
51
52/* A helper function that looks up a destination identity in the active
53 source list */
55{
56 activeDS *pSource;
57
58 for (pSource = activeSources; pSource; pSource = pSource->next)
59 if (pSource->identity.Id == pDest->Id)
60 break;
61 return pSource;
62}
63
65 pTW_IDENTITY pOrigin,
69{
71
72 switch (DAT)
73 {
74 case DAT_IDENTITY:
75 switch (MSG)
76 {
77 case MSG_CLOSEDS:
78 twRC = TWAIN_CloseDS (pOrigin, pData);
79 break;
80
81 case MSG_GETDEFAULT:
82 twRC = TWAIN_IdentityGetDefault (pOrigin, pData);
83 break;
84
85 case MSG_GETFIRST:
86 twRC = TWAIN_IdentityGetFirst (pOrigin, pData);
87 break;
88
89 case MSG_GETNEXT:
90 twRC = TWAIN_IdentityGetNext (pOrigin, pData);
91 break;
92
93 case MSG_OPENDS:
94 twRC = TWAIN_OpenDS (pOrigin, pData);
95 break;
96
97 case MSG_USERSELECT:
98 twRC = TWAIN_UserSelect (pOrigin, pData);
99 break;
100
101 default:
102 /* Unrecognized operation triplet */
103 twRC = TWRC_FAILURE;
105 WARN("unrecognized operation triplet\n");
106 break;
107 }
108 break;
109
110 case DAT_PARENT:
111 switch (MSG)
112 {
113 case MSG_CLOSEDSM:
114 twRC = TWAIN_CloseDSM (pOrigin, pData);
115 break;
116
117 case MSG_OPENDSM:
118 twRC = TWAIN_OpenDSM (pOrigin, pData);
119 break;
120
121 default:
122 /* Unrecognized operation triplet */
123 twRC = TWRC_FAILURE;
125 WARN("unrecognized operation triplet\n");
126 }
127 break;
128
129 case DAT_STATUS:
130 if (MSG == MSG_GET) {
131 twRC = TWAIN_GetDSMStatus (pOrigin, pData);
132 } else {
133 twRC = TWRC_FAILURE;
135 WARN("unrecognized operation triplet\n");
136 }
137 break;
138
139 default:
140 twRC = TWRC_FAILURE;
142 WARN("unrecognized operation triplet\n");
143 break;
144 }
145
146 return twRC;
147}
148
149
150/* Main entry point for the TWAIN library */
153 pTW_IDENTITY pDest,
158{
159 TW_UINT16 twRC = TWRC_SUCCESS; /* Return Code */
160
161 TRACE("(DG=%d DAT=%d MSG=%d)\n", DG, DAT, MSG);
162
163 if (DG == DG_CONTROL && DAT == DAT_NULL)
164 {
165 activeDS *pSource = TWAIN_LookupSource (pOrigin);
166 if (!pSource)
167 {
168 ERR("No source associated with pSource %p\n", pDest);
170 return TWRC_FAILURE;
171 }
172
173 return TWAIN_ControlNull (pOrigin, pDest, pSource, MSG, pData);
174 }
175
176 if (pDest)
177 {
178 activeDS *pSource = TWAIN_LookupSource (pDest);
179 /* This operation's destination is a source */
180
181 if (!pSource) {
182 ERR("No source associated with pDest %p\n", pDest);
184 return TWRC_FAILURE;
185 }
186
187 if (DG == DG_CONTROL && DAT == DAT_EVENT && MSG == MSG_PROCESSEVENT)
188 {
189 twRC = TWAIN_ProcessEvent(pOrigin, pSource, pData);
190 if (twRC == TWRC_DSEVENT)
191 return twRC;
192 }
193
194 if (DG == DG_CONTROL && DAT == DAT_USERINTERFACE &&
196 pData != NULL)
197 {
198 pSource->ui_window = ((TW_USERINTERFACE*)pData)->hParent;
199 }
200
202 TRACE("Forwarding %d/%d/%d/%p to DS.\n", DG, DAT, MSG, pData);
203 twRC = pSource->dsEntry(pOrigin, DG, DAT, MSG, pData);
204 TRACE("return value is %d\n", twRC);
205 return twRC;
206 }
207 switch (DG)
208 {
209 case DG_CONTROL:
210 twRC = TWAIN_SourceManagerHandler (pOrigin, DAT, MSG, pData);
211 break;
212 default:
213 FIXME("The DSM does not handle DG %d\n", DG);
215 twRC = TWRC_FAILURE;
216 }
217 return twRC;
218}
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define FIXME(fmt,...)
Definition: debug.h:111
#define WARN(fmt,...)
Definition: debug.h:112
#define ERR(fmt,...)
Definition: debug.h:110
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
static WCHAR reason[MAX_STRING_RESOURCE_LEN]
Definition: object.c:1904
#define DLL_PROCESS_ATTACH
Definition: compat.h:131
#define DLL_PROCESS_DETACH
Definition: compat.h:130
BOOL WINAPI DisableThreadLibraryCalls(IN HMODULE hLibModule)
Definition: loader.c:85
r reserved
Definition: btrfs.c:3006
TW_UINT16 TWAIN_CloseDS(pTW_IDENTITY pOrigin, TW_MEMREF pData)
Definition: dsm_ctrl.c:200
TW_UINT16 TWAIN_IdentityGetDefault(pTW_IDENTITY pOrigin, TW_MEMREF pData)
Definition: dsm_ctrl.c:234
TW_UINT16 TWAIN_IdentityGetFirst(pTW_IDENTITY pOrigin, TW_MEMREF pData)
Definition: dsm_ctrl.c:249
TW_UINT16 TWAIN_UserSelect(pTW_IDENTITY pOrigin, TW_MEMREF pData)
Definition: dsm_ctrl.c:428
TW_UINT16 TWAIN_GetDSMStatus(pTW_IDENTITY pOrigin, TW_MEMREF pData)
Definition: dsm_ctrl.c:505
TW_UINT16 TWAIN_IdentityGetNext(pTW_IDENTITY pOrigin, TW_MEMREF pData)
Definition: dsm_ctrl.c:266
TW_UINT16 TWAIN_ProcessEvent(pTW_IDENTITY pOrigin, activeDS *pSource, TW_MEMREF pData)
Definition: dsm_ctrl.c:162
TW_UINT16 TWAIN_OpenDS(pTW_IDENTITY pOrigin, TW_MEMREF pData)
Definition: dsm_ctrl.c:280
TW_UINT16 TWAIN_CloseDSM(pTW_IDENTITY pOrigin, TW_MEMREF pData)
Definition: dsm_ctrl.c:455
TW_UINT16 TWAIN_ControlNull(pTW_IDENTITY pOrigin, pTW_IDENTITY pDest, activeDS *pSource, TW_UINT16 MSG, TW_MEMREF pData)
Definition: dsm_ctrl.c:120
TW_UINT16 TWAIN_OpenDSM(pTW_IDENTITY pOrigin, TW_MEMREF pData)
Definition: dsm_ctrl.c:484
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
#define TRACE(s)
Definition: solgame.cpp:4
TW_UINT32 Id
Definition: twain.h:257
HWND ui_window
Definition: twain_i.h:44
DSENTRYPROC dsEntry
Definition: twain_i.h:42
struct tagActiveDS * next
Definition: twain_i.h:39
TW_IDENTITY identity
Definition: twain_i.h:40
static TW_UINT16 TWAIN_SourceManagerHandler(pTW_IDENTITY pOrigin, TW_UINT16 DAT, TW_UINT16 MSG, TW_MEMREF pData)
Definition: twain32_main.c:64
TW_UINT16 DSM_twCC
Definition: twain32_main.c:32
static activeDS * TWAIN_LookupSource(const TW_IDENTITY *pDest)
Definition: twain32_main.c:54
HINSTANCE DSM_hinstance
Definition: twain32_main.c:34
TW_UINT16 WINAPI DSM_Entry(pTW_IDENTITY pOrigin, pTW_IDENTITY pDest, TW_UINT32 DG, TW_UINT16 DAT, TW_UINT16 MSG, TW_MEMREF pData)
Definition: twain32_main.c:152
activeDS * activeSources
Definition: twain32_main.c:33
BOOL WINAPI DllMain(HINSTANCE hinstance, DWORD reason, LPVOID reserved)
Definition: twain32_main.c:36
#define TWRC_FAILURE
Definition: twain.h:1665
#define MSG_GETFIRST
Definition: twain.h:1388
#define MSG_GETDEFAULT
Definition: twain.h:1387
#define DAT_IDENTITY
Definition: twain.h:1337
#define DAT_NULL
Definition: twain.h:1331
#define MSG_OPENDS
Definition: twain.h:1409
#define MSG_ENABLEDSUIONLY
Definition: twain.h:1416
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1830
#define MSG_CLOSEDS
Definition: twain.h:1410
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1829
#define TWRC_DSEVENT
Definition: twain.h:1668
#define MSG_CLOSEDSM
Definition: twain.h:1406
unsigned short TW_UINT16
Definition: twain.h:119
#define MSG_OPENDSM
Definition: twain.h:1405
#define MSG_USERSELECT
Definition: twain.h:1411
TW_UINT32 DG
Definition: twain.h:1827
ULONG TW_UINT32
Definition: twain.h:120
#define DAT_PARENT
Definition: twain.h:1338
#define TWRC_SUCCESS
Definition: twain.h:1664
#define DAT_EVENT
Definition: twain.h:1336
#define TWCC_BADDEST
Definition: twain.h:1688
#define MSG_GET
Definition: twain.h:1385
#define TWCC_BADPROTOCOL
Definition: twain.h:1685
#define MSG_ENABLEDS
Definition: twain.h:1415
#define DAT_USERINTERFACE
Definition: twain.h:1343
#define DAT_STATUS
Definition: twain.h:1342
#define DG_CONTROL
Definition: twain.h:1311
#define TWCC_SUCCESS
Definition: twain.h:1678
TW_UINT32 TW_UINT16 DAT
Definition: twain.h:1828
#define MSG_GETNEXT
Definition: twain.h:1389
#define MSG_PROCESSEVENT
Definition: twain.h:1419
#define WINAPI
Definition: msvc.h:6