Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygentwain32_main.c
Go to the documentation of this file.
00001 /* 00002 * TWAIN32 functions 00003 * 00004 * Copyright 2000 Shi Quan He <shiquan@cyberdude.com> 00005 * 00006 * This library is free software; you can redistribute it and/or 00007 * modify it under the terms of the GNU Lesser General Public 00008 * License as published by the Free Software Foundation; either 00009 * version 2.1 of the License, or (at your option) any later version. 00010 * 00011 * This library is distributed in the hope that it will be useful, 00012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00014 * Lesser General Public License for more details. 00015 * 00016 * You should have received a copy of the GNU Lesser General Public 00017 * License along with this library; if not, write to the Free Software 00018 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 00019 */ 00020 00021 #include <stdarg.h> 00022 00023 #include "windef.h" 00024 #include "winbase.h" 00025 #include "twain.h" 00026 #include "twain_i.h" 00027 #include "wine/debug.h" 00028 00029 WINE_DEFAULT_DEBUG_CHANNEL(twain); 00030 00031 BOOL WINAPI DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) 00032 { 00033 TRACE("%p,%lx,%p\n", hinstDLL, fdwReason, lpvReserved); 00034 00035 switch (fdwReason) 00036 { 00037 case DLL_PROCESS_ATTACH: 00038 DisableThreadLibraryCalls(hinstDLL); 00039 DSM_currentState = 2; 00040 break; 00041 00042 case DLL_PROCESS_DETACH: 00043 DSM_currentState = 1; 00044 break; 00045 } 00046 00047 return TRUE; 00048 } 00049 00050 TW_UINT16 TWAIN_SourceManagerHandler ( 00051 pTW_IDENTITY pOrigin, 00052 TW_UINT16 DAT, 00053 TW_UINT16 MSG, 00054 TW_MEMREF pData) 00055 { 00056 TW_UINT16 twRC = TWRC_SUCCESS; 00057 00058 switch (DAT) 00059 { 00060 case DAT_IDENTITY: 00061 switch (MSG) 00062 { 00063 case MSG_CLOSEDS: 00064 twRC = TWAIN_CloseDS (pOrigin, pData); 00065 break; 00066 00067 case MSG_GETDEFAULT: 00068 twRC = TWAIN_IdentityGetDefault (pOrigin, pData); 00069 break; 00070 00071 case MSG_GETFIRST: 00072 twRC = TWAIN_IdentityGetFirst (pOrigin, pData); 00073 break; 00074 00075 case MSG_GETNEXT: 00076 twRC = TWAIN_IdentityGetNext (pOrigin, pData); 00077 break; 00078 00079 case MSG_OPENDS: 00080 twRC = TWAIN_OpenDS (pOrigin, pData); 00081 break; 00082 00083 case MSG_USERSELECT: 00084 twRC = TWAIN_UserSelect (pOrigin, pData); 00085 break; 00086 00087 default: 00088 /* Unrecognized operation triplet */ 00089 twRC = TWRC_FAILURE; 00090 DSM_twCC = TWCC_BADPROTOCOL; 00091 WARN("unrecognized operation triplet\n"); 00092 break; 00093 } 00094 break; 00095 00096 case DAT_PARENT: 00097 switch (MSG) 00098 { 00099 case MSG_CLOSEDSM: 00100 twRC = TWAIN_CloseDSM (pOrigin, pData); 00101 break; 00102 00103 case MSG_OPENDSM: 00104 twRC = TWAIN_OpenDSM (pOrigin, pData); 00105 break; 00106 00107 default: 00108 /* Unrecognized operation triplet */ 00109 twRC = TWRC_FAILURE; 00110 DSM_twCC = TWCC_BADPROTOCOL; 00111 WARN("unrecognized operation triplet\n"); 00112 } 00113 break; 00114 00115 case DAT_STATUS: 00116 if (MSG == MSG_GET) 00117 { 00118 twRC = TWAIN_GetDSMStatus (pOrigin, pData); 00119 } 00120 else 00121 { 00122 twRC = TWRC_FAILURE; 00123 DSM_twCC = TWCC_BADPROTOCOL; 00124 WARN("unrecognized operation triplet\n"); 00125 } 00126 break; 00127 00128 default: 00129 twRC = TWRC_FAILURE; 00130 DSM_twCC = TWCC_BADPROTOCOL; 00131 WARN("unrecognized operation triplet\n"); 00132 break; 00133 } 00134 00135 return twRC; 00136 } 00137 00138 TW_UINT16 TWAIN_SourceControlHandler ( 00139 pTW_IDENTITY pOrigin, 00140 pTW_IDENTITY pDest, 00141 TW_UINT16 DAT, 00142 TW_UINT16 MSG, 00143 TW_MEMREF pData) 00144 { 00145 TW_UINT16 twRC = TWRC_SUCCESS; 00146 00147 switch (DAT) 00148 { 00149 case DAT_CAPABILITY: 00150 switch (MSG) 00151 { 00152 case MSG_GET: 00153 twRC = TWAIN_CapabilityGet (pOrigin, pDest, pData); 00154 break; 00155 case MSG_GETCURRENT: 00156 twRC = TWAIN_CapabilityGetCurrent (pOrigin, pDest, pData); 00157 break; 00158 case MSG_GETDEFAULT: 00159 twRC = TWAIN_CapabilityGetDefault (pOrigin, pDest, pData); 00160 break; 00161 case MSG_QUERYSUPPORT: 00162 twRC = TWAIN_CapabilityQuerySupport (pOrigin, pDest, pData); 00163 break; 00164 case MSG_RESET: 00165 twRC = TWAIN_CapabilityReset (pOrigin, pDest, pData); 00166 break; 00167 case MSG_SET: 00168 twRC = TWAIN_CapabilitySet (pOrigin, pDest, pData); 00169 break; 00170 default: 00171 twRC = TWRC_FAILURE; 00172 WARN("unrecognized opertion triplet\n"); 00173 } 00174 break; 00175 00176 case DAT_CUSTOMDSDATA: 00177 switch (MSG) 00178 { 00179 case MSG_GET: 00180 twRC = TWAIN_CustomDSDataGet (pOrigin, pDest, pData); 00181 break; 00182 case MSG_SET: 00183 twRC = TWAIN_CustomDSDataSet (pOrigin, pDest, pData); 00184 break; 00185 default: 00186 break; 00187 } 00188 break; 00189 00190 case DAT_FILESYSTEM: 00191 switch (MSG) 00192 { 00193 /*case MSG_AUTOMATICCAPTUREDIRECTORY: 00194 twRC = TWAIN_AutomaticCaptureDirectory 00195 (pOrigin, pDest, pData); 00196 break;*/ 00197 case MSG_CHANGEDIRECTORY: 00198 twRC = TWAIN_ChangeDirectory (pOrigin, pDest, pData); 00199 break; 00200 /*case MSG_COPY: 00201 twRC = TWAIN_FileSystemCopy (pOrigin, pDest, pData); 00202 break;*/ 00203 case MSG_CREATEDIRECTORY: 00204 twRC = TWAIN_CreateDirectory (pOrigin, pDest, pData); 00205 break; 00206 case MSG_DELETE: 00207 twRC = TWAIN_FileSystemDelete (pOrigin, pDest, pData); 00208 break; 00209 case MSG_FORMATMEDIA: 00210 twRC = TWAIN_FormatMedia (pOrigin, pDest, pData); 00211 break; 00212 case MSG_GETCLOSE: 00213 twRC = TWAIN_FileSystemGetClose (pOrigin, pDest, pData); 00214 break; 00215 case MSG_GETFIRSTFILE: 00216 twRC = TWAIN_FileSystemGetFirstFile 00217 (pOrigin, pDest, pData); 00218 break; 00219 case MSG_GETINFO: 00220 twRC = TWAIN_FileSystemGetInfo (pOrigin, pDest, pData); 00221 break; 00222 case MSG_GETNEXTFILE: 00223 twRC = TWAIN_FileSystemGetNextFile 00224 (pOrigin, pDest, pData); 00225 break; 00226 case MSG_RENAME: 00227 twRC = TWAIN_FileSystemRename (pOrigin, pDest, pData); 00228 break; 00229 default: 00230 twRC = TWRC_FAILURE; 00231 break; 00232 } 00233 break; 00234 00235 case DAT_EVENT: 00236 if (MSG == MSG_PROCESSEVENT) 00237 twRC = TWAIN_ProcessEvent (pOrigin, pDest, pData); 00238 else 00239 twRC = TWRC_FAILURE; 00240 break; 00241 00242 case DAT_PASSTHRU: 00243 if (MSG == MSG_PASSTHRU) 00244 twRC = TWAIN_PassThrough (pOrigin, pDest, pData); 00245 else 00246 twRC = TWRC_FAILURE; 00247 break; 00248 00249 case DAT_PENDINGXFERS: 00250 switch (MSG) 00251 { 00252 case MSG_ENDXFER: 00253 twRC = TWAIN_PendingXfersEndXfer (pOrigin, pDest, pData); 00254 break; 00255 case MSG_GET: 00256 twRC = TWAIN_PendingXfersGet (pOrigin, pDest, pData); 00257 break; 00258 case MSG_RESET: 00259 twRC = TWAIN_PendingXfersReset (pOrigin, pDest, pData); 00260 break; 00261 /*case MSG_STOPFEEDER: 00262 twRC = TWAIN_PendingXfersStopFeeder 00263 (pOrigin, pDest, pData); 00264 break;*/ 00265 default: 00266 twRC = TWRC_FAILURE; 00267 } 00268 break; 00269 00270 case DAT_SETUPFILEXFER: 00271 switch (MSG) 00272 { 00273 case MSG_GET: 00274 twRC = TWAIN_SetupFileXferGet (pOrigin, pDest, pData); 00275 break; 00276 case MSG_GETDEFAULT: 00277 twRC = TWAIN_SetupFileXferGetDefault 00278 (pOrigin, pDest, pData); 00279 break; 00280 case MSG_RESET: 00281 twRC = TWAIN_SetupFileXferReset (pOrigin, pDest, pData); 00282 break; 00283 case MSG_SET: 00284 twRC = TWAIN_SetupFileXferSet (pOrigin, pDest, pData); 00285 break; 00286 default: 00287 twRC = TWRC_FAILURE; 00288 break; 00289 } 00290 break; 00291 00292 /*case DAT_SETUPFILEXFER2: 00293 switch (MSG) 00294 { 00295 case MSG_GET: 00296 twRC = TWAIN_SetupFileXfer2Get (pOrigin, pDest, pData); 00297 break; 00298 case MSG_GETDEFAULT: 00299 twRC = TWAIN_SetupFileXfer2GetDefault 00300 (pOrigin, pDest, pData); 00301 break; 00302 case MSG_RESET: 00303 twRC = TWAIN_SetupFileXfer2Reset (pOrigin, pDest, pData); 00304 break; 00305 case MSG_SET: 00306 twRC = TWAIN_SetupFileXfer2Set (pOrigin, pDest, pData); 00307 break; 00308 } 00309 break;*/ 00310 case DAT_SETUPMEMXFER: 00311 if (MSG == MSG_GET) 00312 twRC = TWAIN_SetupMemXferGet (pOrigin, pDest, pData); 00313 else 00314 twRC = TWRC_FAILURE; 00315 break; 00316 00317 case DAT_STATUS: 00318 if (MSG == MSG_GET) 00319 twRC = TWAIN_GetDSStatus (pOrigin, pDest, pData); 00320 else 00321 twRC = TWRC_FAILURE; 00322 break; 00323 00324 case DAT_USERINTERFACE: 00325 switch (MSG) 00326 { 00327 case MSG_DISABLEDS: 00328 twRC = TWAIN_DisableDSUserInterface 00329 (pOrigin, pDest, pData); 00330 break; 00331 case MSG_ENABLEDS: 00332 twRC = TWAIN_EnableDSUserInterface 00333 (pOrigin, pDest, pData); 00334 break; 00335 case MSG_ENABLEDSUIONLY: 00336 twRC = TWAIN_EnableDSUIOnly (pOrigin, pDest, pData); 00337 break; 00338 default: 00339 twRC = TWRC_FAILURE; 00340 break; 00341 } 00342 break; 00343 00344 case DAT_XFERGROUP: 00345 switch (MSG) 00346 { 00347 case MSG_GET: 00348 twRC = TWAIN_XferGroupGet (pOrigin, pDest, pData); 00349 break; 00350 case MSG_SET: 00351 twRC = TWAIN_XferGroupSet (pOrigin, pDest, pData); 00352 break; 00353 default: 00354 twRC = TWRC_FAILURE; 00355 break; 00356 } 00357 break; 00358 00359 default: 00360 twRC = TWRC_FAILURE; 00361 break; 00362 } 00363 00364 return twRC; 00365 } 00366 00367 TW_UINT16 TWAIN_ControlGroupHandler ( 00368 pTW_IDENTITY pOrigin, 00369 pTW_IDENTITY pDest, 00370 TW_UINT16 DAT, 00371 TW_UINT16 MSG, 00372 TW_MEMREF pData) 00373 { 00374 TW_UINT16 twRC = TWRC_SUCCESS; 00375 00376 if (pDest) 00377 { 00378 /* This operation's destination is a source */ 00379 twRC = TWAIN_SourceControlHandler (pOrigin, pDest, DAT, MSG, pData); 00380 } 00381 else 00382 { 00383 /* This operation's destination is the Source Manager */ 00384 twRC = TWAIN_SourceManagerHandler (pOrigin, DAT, MSG, pData); 00385 } 00386 00387 return twRC; 00388 } 00389 00390 TW_UINT16 TWAIN_ImageGroupHandler ( 00391 pTW_IDENTITY pOrigin, 00392 pTW_IDENTITY pDest, 00393 TW_UINT16 DAT, 00394 TW_UINT16 MSG, 00395 TW_MEMREF pData) 00396 { 00397 TW_UINT16 twRC = TWRC_SUCCESS; 00398 00399 if (pDest == NULL) 00400 { 00401 DSM_twCC = TWCC_BADDEST; 00402 return TWRC_FAILURE; 00403 } 00404 00405 switch (DAT) 00406 { 00407 case DAT_CIECOLOR: 00408 if (MSG == MSG_GET) 00409 twRC = TWAIN_CIEColorGet (pOrigin, pDest, pData); 00410 else 00411 twRC = TWRC_FAILURE; 00412 break; 00413 00414 case DAT_EXTIMAGEINFO: 00415 if (MSG == MSG_GET) 00416 twRC = TWAIN_ExtImageInfoGet (pOrigin, pDest, pData); 00417 else 00418 twRC = TWRC_FAILURE; 00419 break; 00420 00421 case DAT_GRAYRESPONSE: 00422 switch (MSG) 00423 { 00424 case MSG_RESET: 00425 twRC = TWAIN_GrayResponseReset (pOrigin, pDest, pData); 00426 break; 00427 case MSG_SET: 00428 twRC = TWAIN_GrayResponseSet (pOrigin, pDest, pData); 00429 break; 00430 default: 00431 twRC = TWRC_FAILURE; 00432 DSM_twCC = TWCC_BADPROTOCOL; 00433 WARN("unrecognized operation triplet\n"); 00434 break; 00435 } 00436 break; 00437 case DAT_IMAGEFILEXFER: 00438 if (MSG == MSG_GET) 00439 twRC = TWAIN_ImageFileXferGet (pOrigin, pDest, pData); 00440 else 00441 twRC = TWRC_FAILURE; 00442 break; 00443 00444 case DAT_IMAGEINFO: 00445 if (MSG == MSG_GET) 00446 twRC = TWAIN_ImageInfoGet (pOrigin, pDest, pData); 00447 else 00448 twRC = TWRC_FAILURE; 00449 break; 00450 00451 case DAT_IMAGELAYOUT: 00452 switch (MSG) 00453 { 00454 case MSG_GET: 00455 twRC = TWAIN_ImageLayoutGet (pOrigin, pDest, pData); 00456 break; 00457 case MSG_GETDEFAULT: 00458 twRC = TWAIN_ImageLayoutGetDefault (pOrigin, pDest, pData); 00459 break; 00460 case MSG_RESET: 00461 twRC = TWAIN_ImageLayoutReset (pOrigin, pDest, pData); 00462 break; 00463 case MSG_SET: 00464 twRC = TWAIN_ImageLayoutSet (pOrigin, pDest, pData); 00465 break; 00466 default: 00467 twRC = TWRC_FAILURE; 00468 DSM_twCC = TWCC_BADPROTOCOL; 00469 WARN("unrecognized operation triplet\n"); 00470 break; 00471 } 00472 break; 00473 00474 case DAT_IMAGEMEMXFER: 00475 if (MSG == MSG_GET) 00476 twRC = TWAIN_ImageMemXferGet (pOrigin, pDest, pData); 00477 else 00478 twRC = TWRC_FAILURE; 00479 break; 00480 00481 case DAT_IMAGENATIVEXFER: 00482 if (MSG == MSG_GET) 00483 twRC = TWAIN_ImageNativeXferGet (pOrigin, pDest, pData); 00484 else 00485 twRC = TWRC_FAILURE; 00486 break; 00487 00488 case DAT_JPEGCOMPRESSION: 00489 switch (MSG) 00490 { 00491 case MSG_GET: 00492 twRC = TWAIN_JPEGCompressionGet (pOrigin, pDest, pData); 00493 break; 00494 case MSG_GETDEFAULT: 00495 twRC = TWAIN_JPEGCompressionGetDefault 00496 (pOrigin, pDest, pData); 00497 break; 00498 case MSG_RESET: 00499 twRC = TWAIN_JPEGCompressionReset (pOrigin, pDest, pData); 00500 break; 00501 case MSG_SET: 00502 twRC = TWAIN_JPEGCompressionSet (pOrigin, pDest, pData); 00503 break; 00504 default: 00505 twRC = TWRC_FAILURE; 00506 DSM_twCC = TWCC_BADPROTOCOL; 00507 WARN("unrecognized operation triplet\n"); 00508 break; 00509 } 00510 break; 00511 00512 case DAT_PALETTE8: 00513 switch (MSG) 00514 { 00515 case MSG_GET: 00516 twRC = TWAIN_Palette8Get (pOrigin, pDest, pData); 00517 break; 00518 case MSG_GETDEFAULT: 00519 twRC = TWAIN_Palette8GetDefault (pOrigin, pDest, pData); 00520 break; 00521 case MSG_RESET: 00522 twRC = TWAIN_Palette8Reset (pOrigin, pDest, pData); 00523 break; 00524 case MSG_SET: 00525 twRC = TWAIN_Palette8Set (pOrigin, pDest, pData); 00526 break; 00527 default: 00528 twRC = TWRC_FAILURE; 00529 DSM_twCC = TWCC_BADPROTOCOL; 00530 WARN("unrecognized operation triplet\n"); 00531 } 00532 break; 00533 00534 case DAT_RGBRESPONSE: 00535 switch (MSG) 00536 { 00537 case MSG_RESET: 00538 twRC = TWAIN_RGBResponseReset (pOrigin, pDest, pData); 00539 break; 00540 case MSG_SET: 00541 twRC = TWAIN_RGBResponseSet (pOrigin, pDest, pData); 00542 break; 00543 default: 00544 twRC = TWRC_FAILURE; 00545 DSM_twCC = TWCC_BADPROTOCOL; 00546 WARN("unrecognized operation triplet\n"); 00547 break; 00548 } 00549 break; 00550 00551 default: 00552 twRC = TWRC_FAILURE; 00553 DSM_twCC = TWCC_BADPROTOCOL; 00554 WARN("unrecognized operation triplet\n"); 00555 } 00556 return twRC; 00557 } 00558 00559 TW_UINT16 TWAIN_AudioGroupHandler ( 00560 pTW_IDENTITY pOrigin, 00561 pTW_IDENTITY pDest, 00562 TW_UINT16 DAT, 00563 TW_UINT16 MSG, 00564 TW_MEMREF pData) 00565 { 00566 TW_UINT16 twRC = TWRC_FAILURE; 00567 00568 switch (DAT) 00569 { 00570 case DAT_AUDIOFILEXFER: 00571 if (MSG == MSG_GET) 00572 twRC = TWAIN_AudioFileXferGet (pOrigin, pDest, pData); 00573 break; 00574 00575 case DAT_AUDIOINFO: 00576 if (MSG == MSG_GET) 00577 twRC = TWAIN_AudioInfoGet (pOrigin, pDest, pData); 00578 break; 00579 00580 case DAT_AUDIONATIVEXFER: 00581 if (MSG == MSG_GET) 00582 twRC = TWAIN_AudioNativeXferGet (pOrigin, pDest, pData); 00583 break; 00584 00585 default: 00586 DSM_twCC = TWCC_BADPROTOCOL; 00587 twRC = TWRC_FAILURE; 00588 break; 00589 } 00590 00591 return twRC; 00592 } 00593 00594 /* Main entry point for the TWAIN library */ 00595 TW_UINT16 WINAPI 00596 DSM_Entry (pTW_IDENTITY pOrigin, 00597 pTW_IDENTITY pDest, 00598 TW_UINT32 DG, 00599 TW_UINT16 DAT, 00600 TW_UINT16 MSG, 00601 TW_MEMREF pData) 00602 { 00603 TW_UINT16 twRC = TWRC_SUCCESS; /* Return Code */ 00604 00605 TRACE("(DG=%ld DAT=%d MSG=%d)\n", DG, DAT, MSG); 00606 00607 switch (DG) 00608 { 00609 case DG_CONTROL: 00610 twRC = TWAIN_ControlGroupHandler (pOrigin,pDest,DAT,MSG,pData); 00611 break; 00612 case DG_IMAGE: 00613 twRC = TWAIN_ImageGroupHandler (pOrigin,pDest,DAT,MSG,pData); 00614 break; 00615 case DG_AUDIO: 00616 twRC = TWAIN_AudioGroupHandler (pOrigin,pDest,DAT,MSG,pData); 00617 break; 00618 default: 00619 DSM_twCC = TWCC_BADPROTOCOL; 00620 twRC = TWRC_FAILURE; 00621 } 00622 00623 return twRC; 00624 } 00625 00626 /* A helper function that looks up a destination identity in the active 00627 source list */ 00628 activeDS *TWAIN_LookupSource (pTW_IDENTITY pDest) 00629 { 00630 activeDS *pSource; 00631 00632 for (pSource = activeSources; pSource; pSource = pSource->next) 00633 if (pSource->identity.Id == pDest->Id) 00634 break; 00635 00636 return pSource; 00637 } Generated on Fri May 25 2012 04:24:42 for ReactOS by
1.7.6.1
|