Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

291 lines
11 KiB

/***************************************************************************
OPEN.C
Purpose: Open for any scanner
$Log: S:\oiwh\scanlib\open.c_v $
*
* Rev 1.3 19 Dec 1995 13:16:24 HEIDI
* Changed prototype for IMGTwainGetDSNames to return a word, as the actual rout
* ine does. Also cast the return code to an int in the actual call.
*
* Rev 1.2 07 Sep 1995 09:58:30 BG
* IMGOpenScanner() has been modified to return the names of all available
* TWAIN sources on the system.
*
* A (LPSTR) lpszTWAINNamesBuffer parameter has been added to IMGOpenScanner()
* of OPEN.C in OISLB400.DLL. This is a pointer to a caller's buffer (1K, zeroed
* out). If this parm is null, a normal open will occur. If it is not null,
* IMGOpenScanner will call IMGGetTWAINDSNames() of SELECT.C in OITWAIN.DLL to
* inquire via the TWAIN Source Manager the names of all available TWAIN data
* sources and write these name strings to the lpszTWAINNamesBuffer. Every 32
* bytes will contain a TWAIN Data Source name string. If the first byte of a
* 32 byte boundary is null, then the rest of the buffer is invalid. There is
* enough room for 32 TWAIN data source names to be returned.
*
* Rev 1.0 20 Jul 1995 14:36:34 KFS
* Initial entry
*
* Rev 1.2 06 Dec 1994 14:41:00 KFS
* Will default to WIN.IN [O/i] scanner= when have valid lpFileName as pointer,
* but the contents = 0 (*lpFileName). Was going to check for twain devices.
* PTR 00061 P2 8/16/94
*
* Rev 1.1 22 Aug 1994 15:49:10 KFS
* No code change, added vlog comments to file
*
****************************************************************************/
/* ccl 08-14-90 add IMGGetScanVersion call to insure handler compatible */
/* ccl 09-20-90 fix GetProfileString 3rd param */
/* kfs 06-07-93 added support for TWAIN interface */
/* kfs 07/12/93 (1)fix problem with scan from Cabinet Doc/File Mgr with TWAIN
in 3.6, was setting hTwainWnd to the real parent of the
OiCreateWndw when I wanted the image window, not the hidden
image window, a fix must be done to scanseq.dll scanpage.c
file to use reserved[2] to work correctly. (2) found needed
to change GetParent call to use hWnd passed in */
/* kfs 07/12/93 added new param to OiControl() for hImageWnd */
/* kfs 08/13/93 made code close down OpenScanner on cancel of TWAIN select
source dlg box instead of using default value and going on */
// kfs 08/27/93 return product name when twain keyname found
/* kfs 09/14/93 move statement sp->calller = hMainWnd into TWAIN only code,
was producing a fatal error message on non twain open */
/* BG 07/19/95 Must now use the WIN95 Registry, so get the scanner name
using OiGetStringfromReg in IMGOpenScanner. Also must
include "engadm.h" to define this call. */
#include "pvundef.h"
WORD PASCAL IMGTwainGetDSNames (HWND hImageWnd, LPSTR lpstrTwainNamesBuffer);
// 7/19/95 BG Changed to use the WIN95 Registry instead of WIN.INI!
//#include "engadm.h" // put into precompiled header - kfs
/*
CAUTION! Only data which can be shared among appliations,
or data that is only used without giving up the CPU should declared staticly.
*/
#define STRLENGTH 100
/* imports */
int CapsSetup(HWND);
extern HANDLE hLibInst;
/* exports */
TW_IDENTITY PrivdsID; // access to open ds id structure
TW_UINT16 DCDSOpen = 0; // glue code flag for an Open Source
TW_UINT16 DCDSMOpen = 0; // glue code flag for an Open Source Manager
TWAIN_PROP TwainProperty; // handle and pointer to property struct
/* locals */
/************************/
/* Open Scanner */
/************************/
/*
alloc SCANCB
get handler name of current scanner
exec handler
return handle of scancb
*/
int PASCAL IMGOpenScanner(hWnd, lpFilename, lphScancb, lpTwainNamesBuff)
HWND hWnd;
LPSTR lpFilename;
LPSTR lpTwainNamesBuff;
LPHANDLE lphScancb;
{
HANDLE sh;
LPSCANCB sp;
int ret_val;
char szAppName[STRLENGTH];
char szKeyName[STRLENGTH];
char TempScanner[80];
VERSION Version;
HWND hMainWnd; // Main Window of Application
BOOL bIsItTWAIN = FALSE;
LPSTR lpEXE;
int buffsize; // for OiGetStringfromReg()
if (!IsWindow(hWnd))
return IMGSE_BAD_WND;
if (lphScancb == NULL)
return IMGSE_NULL_PTR;
// BG 9/5/95 Added this for Scan OCX so it can get a list of available TWAIN DS names
if (lpTwainNamesBuff)
{
return ret_val = (int) IMGTwainGetDSNames(hWnd, lpTwainNamesBuff);
}
else
{
ret_val = IMGSE_MEMORY;
/* will need to substitute with new handle to larger struct which begins
... with original memory struct if it's a TWAIN scanner
*/
sh = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT | GMEM_NOT_BANKED,
(DWORD)sizeof(SCANCB));
if (!sh)
goto exit;
// LockData(0); // Win32
if ((lpFilename != NULL) && *lpFilename)
{
// Check to see if it's a ProductName
lstrcpy(TempScanner, AnsiLower(lpFilename));
lpEXE = lstrchr(TempScanner, '.'); // find string with dot
if (lpEXE && !lstrcmp(lpEXE, ".exe")) // Wang Scanner Interface Call
// BG 8/22/95 No longer support Wang Scanner Handlers! They are not 32bit apps!
// ret_val = IMGExecScannerHandler(hWnd, lpFilename, sh);
ret_val = IMGSE_EXEC;
else
{ // TWAIN Scanner Interface Call
// if any of above conditions met, its a TWAIN ProductName
bIsItTWAIN = TRUE;
// shouldn't have to be main window of app
// if (!(hMainWnd = GetParent(hWnd))) // make sure its main window of app
// hMainWnd = hWnd;
hMainWnd = hWnd;
if (!(ret_val = IMGTwainOpenScanner(hMainWnd, TempScanner, &TwainProperty)))
{
if (IMGTwaintoOiControl(hMainWnd, hMainWnd, OI_TWAIN_EXTERNXFER,
OI_TWAIN_EXTERNXFER))
ret_val = IMGSE_INSTALL; // couldn't control transfer
}
lstrcpy(lpFilename, TempScanner);
}
}
else
{
ret_val = IMGSE_INSTALL;
LoadString(hLibInst, IDS_PC_WIIS, szAppName, STRLENGTH);
LoadString(hLibInst, IDS_SCANNER, szKeyName, STRLENGTH);
// 7/19/95 BG Changed to use the WIN95 Registry instead of WIN.INI!
// if (GetProfileString (szAppName, szKeyName, "\0",
// TempScanner, sizeof(TempScanner)) == 0)
buffsize = sizeof(TempScanner);
if (OiGetStringfromReg (szAppName, szKeyName, "\0",
TempScanner, &buffsize) == 0)
{
// change this so it doesn't go to exit but to TWAIN code
// goto exit;
bIsItTWAIN = TRUE;
//if (!(hMainWnd = GetParent(hWnd))) // make sure its main window of app
// hMainWnd = hWnd;
hMainWnd = hWnd;
if (ret_val = IMGTwainOpenScanner(hMainWnd, TempScanner, &TwainProperty))
{
goto exit; // on any failure, even cancel for now
}
if (IMGTwaintoOiControl(hMainWnd, hMainWnd, OI_TWAIN_EXTERNXFER,
OI_TWAIN_EXTERNXFER))
{
ret_val = IMGSE_INSTALL; // couldn't control transfer
goto exit;
}
goto CheckSuccess;
}
// Check to see if it's a ProductName
lstrcpy(TempScanner, AnsiLower(TempScanner));
lpEXE = lstrchr(TempScanner, '.'); // find string with dot
if (lpEXE && !lstrcmp(AnsiLower(lpEXE), ".exe")) // Wang Scanner Interface Call
ret_val = IMGExecScannerHandler(hWnd, TempScanner, sh);
else
{ // TWAIN Scanner Interface Call
// if any of above conditions met, its a TWAIN ProductName
bIsItTWAIN = TRUE;
// if (!(hMainWnd = GetParent(hWnd))) // make sure its main window of app
// hMainWnd = hWnd;
hMainWnd = hWnd;
if (!(ret_val = IMGTwainOpenScanner(hMainWnd, TempScanner, &TwainProperty)))
{
if (IMGTwaintoOiControl(hMainWnd, hMainWnd, OI_TWAIN_EXTERNXFER,
OI_TWAIN_EXTERNXFER))
ret_val = IMGSE_INSTALL; // couldn't control transfer
}
}
}
CheckSuccess: // Jump for now from Twain Code
if (ret_val == IMGSE_SUCCESS)
{
*lphScancb = sh;
sp = (LPSCANCB)GlobalLock(sh);
// sp->Func = SHF_WGETOPTS;
if (bIsItTWAIN)
{
sp->Caller = hMainWnd; // Will store Main Wnd Handle for GetProp(TWAIN)
// changed reserved words to HANDLE and HWND for WIN32
sp->Twph = TwainProperty.TSdh; // handle to TWAIN prop
sp->hwndTw = hMainWnd; // handle to original image wndw
// Setup TWAIN source basic capabilities structure
// if ((ret_val = CapsSetup(hMainWnd)) != IMGSE_SUCCESS)
// goto exit; // on any failure
CapsSetup(hMainWnd); // do it unconditionally instead - kfs
// changed this to ctl wndw handle kfs - 1/15/93
// ... so all messages get sent to it instead of app wndw
sp->Wnd = (TwainProperty.lpTSdp)->hCtlWnd;
// sp->Inst = ; // may need to assign a value
}
// changed it to do it, no error reported as original code
IMGGetScanOpts(sh); // This will do the SHF_WGETOPTS B.G. 12/14/92
// else
// SendMessage(sp->Wnd, WM_SCANCB, sh, 0L);
sp->Gl1 = MAKELONG((('S') | 'c' << 8), (('a') | 'n' << 8));
sp->Gl2 = MAKELONG((('C') | 'B' << 8), (('*') | '*' << 8));
/* tag the control block */
GlobalUnlock(sh);
}
exit:
// UnlockData(0); // Win32
if (ret_val) /* if error - free mem */
{
if (sh)
GlobalFree(sh);
}
else
{
if (!bIsItTWAIN) // don't do this for now for TWAIN
{
/* success, check version */
if( (ret_val = IMGGetScanVersion( *lphScancb, (VERSION FAR *)&Version ) )
== IMGSE_SUCCESS )
{
/* This is a check of the size SCANCB of scan.h of handler
...to application size of the struct
*/
if( Version.ScanCtrlSize < sizeof(SCANCB) )
{
/* handler version # is not compatible with O/I version # */
ret_val = IMGSE_BADVERSION ;
IMGCloseScanner( *lphScancb );
}
}
else
{
ret_val = IMGSE_BADVERSION;
IMGCloseScanner( *lphScancb );
}
}
}
return ret_val;
}
}