ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

twain32_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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.