/* * closeDSM * * Close the data source manager */ int closeDSM(pTW_SESSION twSession) { if (DSM_IS_CLOSED(twSession)) { LogMessage("closeDSM: Source Manager not open\n"); return FALSE; } else { if (DS_IS_OPEN(twSession)) { LogMessage("closeDSM: Can't close source manager with open source\n"); return FALSE; } else { twSession->twRC = callDSM(APP_IDENTITY(twSession), NULL, DG_CONTROL, DAT_PARENT, MSG_CLOSEDSM, (TW_MEMREF)&(twSession->hwnd)); if (twSession->twRC != TWRC_SUCCESS) { LogMessage("CloseDSM failure -- %s\n", currentTwainError(twSession)); } else { /* We are now in state 2 */ twSession->twainState = 2; } } } /* Let the caller know what happened */ return (twSession->twRC==TWRC_SUCCESS); }
/* * TwainProcessMessage * * Returns TRUE if the application should process message as usual. * Returns FALSE if the application should skip processing of this message */ int TwainProcessMessage(LPMSG lpMsg, pTW_SESSION twSession) { TW_EVENT twEvent; twSession->twRC = TWRC_NOTDSEVENT; /* Only ask Source Manager to process event if there is a Source connected. */ if (DSM_IS_OPEN(twSession) && DS_IS_OPEN(twSession)) { /* * A Source provides a modeless dialog box as its user interface. * The following call relays Windows messages down to the Source's * UI that were intended for its dialog box. It also retrieves TWAIN * messages sent from the Source to our Application. */ twEvent.pEvent = (TW_MEMREF) lpMsg; twSession->twRC = callDSM(APP_IDENTITY(twSession), DS_IDENTITY(twSession), DG_CONTROL, DAT_EVENT, MSG_PROCESSEVENT, (TW_MEMREF) &twEvent); /* Check the return code */ if (twSession->twRC == TWRC_NOTDSEVENT) { return FALSE; } /* Process the message as necessary */ processTwainMessage(twEvent.TWMessage, twSession); } /* tell the caller what happened */ return (twSession->twRC == TWRC_DSEVENT); }
/* * openDS * * Open a data source using the TWAIN user interface. */ int openDS(pTW_SESSION twSession) { TW_IDENTITY *dsIdentity; /* The datasource manager must be open */ if (DSM_IS_CLOSED(twSession)) { LogMessage("openDS: Cannot open data source... manager closed\n"); return FALSE; } /* Is the data source already open? */ if (DS_IS_OPEN(twSession)) { LogMessage("openDS: Data source already open\n"); return TRUE; } /* Open the TWAIN datasource */ dsIdentity = DS_IDENTITY(twSession); twSession->twRC = callDSM(APP_IDENTITY(twSession), NULL, DG_CONTROL, DAT_IDENTITY, MSG_OPENDS, (TW_MEMREF) dsIdentity); /* Check the return to determine what the user decided * to do. */ switch (twSession->twRC) { case TWRC_SUCCESS: /* We are now in TWAIN state 4 */ twSession->twainState = 4; LogMessage("Data source %s opened\n", DS_IDENTITY(twSession)->ProductName); LogMessage("\tVersion.MajorNum = %d\n", dsIdentity->Version.MajorNum); LogMessage("\tVersion.MinorNum = %d\n", dsIdentity->Version.MinorNum); LogMessage("\tVersion.Info = %s\n", dsIdentity->Version.Info); LogMessage("\tProtocolMajor = %d\n", dsIdentity->ProtocolMajor); LogMessage("\tProtocolMinor = %d\n", dsIdentity->ProtocolMinor); LogMessage("\tManufacturer = %s\n", dsIdentity->Manufacturer); LogMessage("\tProductFamily = %s\n", dsIdentity->ProductFamily); return TRUE; break; default: LogMessage("Error \"%s\" opening data source\n", currentTwainError(twSession)); break; } return FALSE; }