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.
 
 
 
 
 
 

817 lines
21 KiB

/***************************************************************************
MISC.C
Purpose: Miscellaneous device level scanner routines
$Log: S:\products\wangview\oiwh\scanlib\misc.c_v $
*
* Rev 1.5 22 Feb 1996 12:59:40 BG
* Removed all WANG I/F code. This interface is not supported under Norway.
*
* Rev 1.4 29 Sep 1995 13:57:54 BG
* // First look for HP DeskScan, then PictureScan, then THUNK_16
* // This is a hack in order for the DS dialogs to come on top
* // of our app! Setting the window of THUNK_16 up front will
* // work with 16 bit data sources, but not 32bit. So we must
* // explicitly look for the main windows of DeskScan and Picture
* // Scan in case they are the 32 bit versions. This fix should
* // occur in the data sources themselves, as they assume their
* // window will stay in front when it is loaded (at the time the DS
* // is loaded). At this time it is hidden and is only visible when
* // needed. When it is made visible, it should be set on top!
*
* Rev 1.3 22 Aug 1995 18:05:30 KFS
* add new function findwin() to be used to check all windows for Twain Twunk_16
* class so get set the z-order via SetWindowPos, this is a work around for the
* Twain thunking layer messes up the z order when thunking and they execute the
* TWUNK_16.EXE dde code. Do not know if the committee will fix.
*
* Rev 1.2 22 Aug 1995 15:17:12 BG
* Modified IMGGetCapabilities() of MISC.C in SCANLIB.DLL to check for
* null pointers passed to it. If found, IMGSE_NULL+PTR is returned.
*
*
* Rev 1.1 08 Aug 1995 17:54:06 KFS
* Fix bug 3284 P2 reported by D.Stetson agaist IMGGetScanVersion()
*
* Rev 1.0 20 Jul 1995 14:37:32 KFS
* Initial entry
*
* Rev 1.1 22 Aug 1994 15:47:02 KFS
* No code change, added vlog comments to file
*
****************************************************************************/
/* ccl 08-14-90 add GetScanVersion to insure handler version compatible */
/* ccl 08-24-90 change AutoFeed to PreFeed for better understanding */
// kfs 11-15-91 return long value for GETINFOITEM when MAXPAGESIZE flag
// ... set for function
// kfs 3-10-92 added color and handheld flag returns to GetCapability
// kfs 3-26-92 added dma flag for sc300 and any new pc dma scanners
// kfs 5-21-93 added GlobalUnlock(ToTwain.TSdh) for TWAIN calls
/* kfs 06-07-93 added support for TWAIN interface */
/* kfs 08-30-93 GetScanVersion will give TWAIN Source Version */
/* kfs 10-06-93 eliminate GPF on EnaPrefeed, found sp values being used
before pointer initialized */
#include "pvundef.h"
/*
CAUTION! Only data which can be shared among appliations,
or data that is only used without giving up the CPU should declared staticly.
*/
/* imports */
int GetTwainCapabilities(HWND , DWORD FAR * ); // For getting TWain scanner capabilities
extern char TwainPropName[]; // Taken from Open Module
/* exports */
/* locals */
/***********************/
/* ScannerPaperFeed*/
/***********************/
int PASCAL IMGScannerPaperFeed(hScancb, wFeedTrNo, wEjectTrNo)
HANDLE hScancb;
WORD wFeedTrNo;
WORD wEjectTrNo;
{
LPSCANCB sp;
WORD ret_val;
TWAIN_PROP ToTwain;
if (ret_val = ParmCheck(hScancb, (LPSCANCB far *)&sp, &ToTwain))
return ret_val;
sp->Gp1 = wFeedTrNo;
sp->Gp2 = wEjectTrNo;
sp->Func = SHF_FEED;
if (ToTwain.TSdh) // Is it a Twain source or a Wang Handler?
{
GlobalUnlock(ToTwain.TSdh);
}
else
SendMessage(sp->Wnd, WM_SCANCB, (WPARAM) hScancb, 0L);
return SuccessCheck(hScancb, sp);
}
/************************/
/* ScannerPaperEject*/
/************************/
int PASCAL IMGScannerPaperEject(hScancb, wEjectTrNo )
HANDLE hScancb;
WORD wEjectTrNo;
{
LPSCANCB sp;
WORD ret_val;
TWAIN_PROP ToTwain;
if (ret_val = ParmCheck(hScancb, (LPSCANCB far *)&sp, &ToTwain))
return ret_val;
sp->Gp1 = wEjectTrNo;
sp->Func = SHF_EJECT;
if (ToTwain.TSdh) // Is it a Twain source or a Wang Handler?
{
GlobalUnlock(ToTwain.TSdh);
}
else
{
SendMessage(sp->Wnd, WM_SCANCB, (WPARAM) hScancb, 0L);
}
return SuccessCheck(hScancb, sp);
}
/************************/
/* GetCapability */
/************************/
int PASCAL IMGGetCapability( hScancb, flag )
HANDLE hScancb;
DWORD FAR *flag;
{
LPSCANCB sp;
WORD ret_val;
TWAIN_PROP ToTwain;
if (ret_val = ParmCheck(hScancb, (LPSCANCB far *)&sp, &ToTwain))
return ret_val;
// BG 8/22/95 Must check for null pointer
if (flag == NULL)
return IMGSE_NULL_PTR;
if (ToTwain.TSdh) // Is it a Twain source or a Wang Handler?
{
return (ret_val = GetTwainCapabilities(ToTwain.lpTSdp->hMainWnd, flag));
GlobalUnlock(ToTwain.TSdh);
}
else
{
sp->Func = SHF_GETINFO;
SendMessage(sp->Wnd, WM_SCANCB, (WPARAM) hScancb, 0L);
*flag = 0;
if( sp->Flags & SHGI_FEEDER )
*flag |= IMG_SCAN_FEEDER;
if( sp->Flags & SHGI_ASYNC )
*flag |= IMG_SCAN_ASYNC;
if( sp->Flags & SHGI_ENDORSER )
*flag |= IMG_SCAN_ENDORSER;
if( sp->Flags & SHGI_KEYPANEL )
*flag |= IMG_SCAN_KEYPANEL;
if( sp->Flags & SHGI_DISPLAY )
*flag |= IMG_SCAN_DISPLAY;
if( sp->Flags & SHGI_AUTOSIZE )
*flag |= IMG_SCAN_AUTOSIZE;
if( sp->Flags & SHGI_COMPRESS )
*flag |= IMG_SCAN_CMPR;
if( sp->Flags & SHGI_IMGBUF )
*flag |= IMG_SCAN_IMGBUF;
if( sp->Flags & SHGI_TEXTINFO )
*flag |= IMG_SCAN_TEXTINFO;
if( sp->Flags & SHGI_AUTOFEED )
*flag |= IMG_SCAN_PREFEED;
if( sp->Flags & SHGI_SCANTOFIT )
*flag |= IMG_SCAN_SCANTOFIT;
if( sp->Flags & SHGI_SCALE )
*flag |= IMG_SCAN_SCALE;
if( sp->Flags & SHGI_ROTATE )
*flag |= IMG_SCAN_ROTATE;
if( sp->Flags & SHGI_DUPLEX )
*flag |= IMG_SCAN_DUPLEX;
if( sp->Flags & SHGI_TIMER )
*flag |= IMG_SCAN_TIMER;
if( sp->Flags & SHGI_COLOR)
*flag |= IMG_SCAN_COLOR;
if( sp->Flags & SHGI_HANDHELD)
*flag |= IMG_SCAN_HANDHELD;
if( sp->Flags & SHGI_DMA)
*flag |= IMG_SCAN_DMA;
}
return SuccessCheck(hScancb, sp);
}
/************************/
/* EnaKeypanel */
/************************/
int PASCAL IMGEnaKeypanel( hScancb, flag, hwnd )
HANDLE hScancb;
DWORD flag;
HWND hwnd;
{
LPSCANCB sp;
WORD ret_val;
TWAIN_PROP ToTwain;
if (ret_val = ParmCheck(hScancb, (LPSCANCB far *)&sp, &ToTwain))
return ret_val;
if (ToTwain.TSdh) // Is it a Twain source or a Wang Handler?
{
GlobalUnlock(ToTwain.TSdh);
}
else
{
sp->Func = SHF_ENAKEYPANEL;
sp->Flags = 0;
if( flag & IMG_SCKL_STOPSCAN )
sp->Flags |= SHKL_STOPSCAN;
if( flag & IMG_SCKL_STARTSCAN )
sp->Flags |= SHKL_STARTSCAN;
if( flag & IMG_SCKL_APP )
sp->Flags |= SHKL_APP;
if( flag & IMG_SCKL_OPTS )
sp->Flags |= SHKL_OPTS;
sp->Caller = hwnd;
SendMessage(sp->Wnd, WM_SCANCB, (WPARAM) hScancb, 0L);
}
return SuccessCheck(hScancb, sp);
}
/************************/
/* ScannerBeep */
/************************/
int PASCAL IMGScannerBeep(hScancb)
HANDLE hScancb;
{
LPSCANCB sp;
WORD ret_val;
TWAIN_PROP ToTwain;
if (ret_val = ParmCheck(hScancb, (LPSCANCB far *)&sp, &ToTwain))
return ret_val;
sp->Func = SHF_BEEP;
sp->Gp1 = 0; // tone (HZ)
sp->Gp2 = 0; // duration (milliseconds)
if (ToTwain.TSdh) // Is it a Twain source or a Wang Handler?
{
GlobalUnlock(ToTwain.TSdh);
}
else
{
SendMessage(sp->Wnd, WM_SCANCB, (WPARAM) hScancb, 0L);
}
return SuccessCheck(hScancb, sp);
}
/************************/
/* GetScanInfoItem */
/************************/
int PASCAL IMGGetScanInfoItem( hScancb, Flags, lpInfoItem )
HANDLE hScancb;
DWORD Flags;
LPINFOITEM lpInfoItem;
{
LPSCANCB sp;
WORD ret_val;
TWAIN_PROP ToTwain;
if (ret_val = ParmCheck(hScancb, (LPSCANCB far *)&sp, &ToTwain))
return ret_val;
if( Flags == IMG_SCII_NAMESTRINGSIZE )
sp->Flags = SHII_NAMESTRINGSIZE;
if( Flags == IMG_SCII_INTRAYS )
sp->Flags = SHII_INTRAYS;
if( Flags == IMG_SCII_OUTTRAYS )
sp->Flags = SHII_OUTTRAYS;
if( Flags == IMG_SCII_MAXPAGESIZE )
sp->Flags = SHII_MAXPAGESIZE;
if( Flags == IMG_SCII_COMPRE_OPTS )
sp->Flags = SHII_COMPRESSOPTS;
sp->Func = SHF_GETINFOITEM;
if (ToTwain.TSdh) // Is it a Twain source or a Wang Handler?
{
GlobalUnlock(ToTwain.TSdh);
}
else
{
SendMessage(sp->Wnd, WM_SCANCB, (WPARAM) hScancb, 0L);
}
if( Flags == IMG_SCII_MAXPAGESIZE ) // values are long returned
{
lpInfoItem->InfoItem1 = (WORD) sp->Gl1;
lpInfoItem->InfoItem2 = (WORD) sp->Gl2;
}
else
{
lpInfoItem->InfoItem1 = (WORD) sp->Gp1;
lpInfoItem->InfoItem2 = (WORD) sp->Gp2;
}
lpInfoItem->InfoItem3 = (WORD) sp->Gp3;
lpInfoItem->InfoItem4 = (WORD) sp->Gp4;
return SuccessCheck(hScancb, sp);
}
/************************/
/* GetScanVersion */
/************************/
int PASCAL IMGGetScanVersion( hScancb, lpVersion )
HANDLE hScancb;
LPVERSION lpVersion;
{
LPSCANCB sp;
WORD ret_val;
TWAIN_PROP ToTwain;
if (ret_val = ParmCheck(hScancb, (LPSCANCB far *)&sp, &ToTwain))
return ret_val;
sp->Func = SHF_GETVER;
if (ToTwain.TSdh) // Is it a Twain source or a Wang Handler?
{
LP_TWAIN_SCANDATA lpTwainData;
lpTwainData = ToTwain.lpTSdp;
lpVersion->HandlMajorVer = lpTwainData->DsID.Version.MajorNum;
lpVersion->HandlMinorVer = lpTwainData->DsID.Version.MinorNum;
lpVersion->ScanCtrlSize = sizeof(*sp);
GlobalUnlock(ToTwain.TSdh);
}
else
{
SendMessage(sp->Wnd, WM_SCANCB, (WPARAM) hScancb, 0L);
lpVersion->HandlMajorVer = sp->Gp2;
lpVersion->HandlMinorVer = sp->Gp3;
lpVersion->ScanCtrlSize = sp->Gp4;
}
lpVersion->InterfaceVer = sp->Gp1;
return SuccessCheck(hScancb, sp);
}
/************************/
/* EnaPreFeed */
/************************/
int PASCAL IMGEnaPreFeed( hScancb, flag, wFeedTrNo, wEjectTrNo )
HANDLE hScancb;
DWORD flag;
WORD wFeedTrNo;
WORD wEjectTrNo;
{
LPSCANCB sp;
WORD ret_val;
TWAIN_PROP ToTwain;
if (ret_val = ParmCheck(hScancb, (LPSCANCB far *)&sp, &ToTwain))
return ret_val;
sp->Func = SHF_ENAAUTOFEED;
sp->Flags = flag;
sp->Gp1 = wFeedTrNo;
sp->Gp2 = wEjectTrNo;
if (ToTwain.TSdh) // Is it a Twain source or a Wang Handler?
{
sp->Status = SHS_BADFUNC;
GlobalUnlock(ToTwain.TSdh);
}
else
{
SendMessage(sp->Wnd, WM_SCANCB, (WPARAM) hScancb, 0L);
}
return SuccessCheck(hScancb, sp);
}
/************************/
/* InqPreFeed */
/************************/
int PASCAL IMGInqPreFeed( hScancb, flag )
HANDLE hScancb;
DWORD FAR *flag;
{
LPSCANCB sp;
WORD ret_val;
TWAIN_PROP ToTwain;
if (ret_val = ParmCheck(hScancb, (LPSCANCB far *)&sp, &ToTwain))
return ret_val;
sp->Func = SHF_INQAUTOFEED;
if (ToTwain.TSdh) // Is it a Twain source or a Wang Handler?
{
GlobalUnlock(ToTwain.TSdh);
}
else
{
SendMessage(sp->Wnd, WM_SCANCB, (WPARAM) hScancb, 0L);
}
*flag = sp->Flags;
return SuccessCheck(hScancb, sp);
}
#if SDEBUG
/************************/
/* EnaEndorse */
/************************/
int PASCAL IMGEnaEndorse( hScancb, flag )
HANDLE hScancb;
DWORD flag;
{
LPSCANCB sp;
WORD ret_val;
TWAIN_PROP lpToTwain;
if (ret_val = ParmCheck(hScancb, (LPSCANCB far *)&sp, &lpToTwain))
return ret_val;
sp->Func = SHF_ENAENDORSE;
sp->Flags = flag;
if (ToTwain.TSdh) // Is it a Twain source or a Wang Handler?
{
GlobalUnlock(ToTwain.TSdh);
}
else
{
SendMessage(sp->Wnd, WM_SCANCB, hScancb, 0L);
}
return SuccessCheck(hScancb, sp);
}
/************************/
/* EnaAutoSize */
/************************/
int PASCAL IMGEnaAutoSize( hScancb, flag )
HANDLE hScancb;
DWORD flag;
{
LPSCANCB sp;
WORD ret_val;
TWAIN_PROP lpToTwain;
if (ret_val = ParmCheck(hScancb, (LPSCANCB far *)&sp, &lpToTwain))
return ret_val;
sp->Func = SHF_ENAAUTOSIZE;
sp->Flags = flag;
if (ToTwain.TSdh) // Is it a Twain source or a Wang Handler?
{
GlobalUnlock(ToTwain.TSdh);
}
else
{
SendMessage(sp->Wnd, WM_SCANCB, hScancb, 0L);
}
return SuccessCheck(hScancb, sp);
}
#endif
/******************************************************/
/* */
/* save_hwndinfo - used within walkwin() to set the */
/* info in fws for the windows */
/* */
/* params: hwnd = window handle */
/* level = 0,1,2,... 0 = parent, all */
/* other #'s are child windows */
/* lpfws = structure to save window info, */
/* struct defined in internal.h */
/* */
/* output: returns 0 if found classname match for */
/* DSWinName otherwise non zero */
/* */
/******************************************************/
int save_hwndinfo(HWND hwnd, int level, LPFINDWNDSPEC lpfws, LPSTR DSWinName)
{
char wndtext[128], classname[128];
GetWindowText(hwnd, wndtext, 128);
GetClassName(hwnd, classname, 128);
lpfws->level = level;
lpfws->flag32 = 0;
//lstrcpy(lpfws->taskname, taskname);
lpfws->hwnd = hwnd;
lpfws->htask = 0;
lpfws->htaskq = 0;
lpfws->wndproc = 0;
//lstrcpy(lpfws->wndproc_owner, wndproc_owner);
lstrcpy(lpfws->classname, classname);
if (level == 0)
{
return (lstrcmpi(classname, DSWinName));
}
return 0xffffffff;
}
/******************************************************/
/* */
/* findwinx - this is a recursive function, */
/* finds the window with classname */
/* passed, returns window, and */
/* associated info in fws. */
/* */
/* params: hwnd = window handle */
/* level = 0,1,2,... 0 = parent, all */
/* other #'s are child windows */
/* lpfws = structure to save window info, */
/* struct defined in internal.h */
/* */
/* output: returns 0 if found classname match for */
/* Twain Twunk_16 otherwise non zero */
/* */
/******************************************************/
int findwinx(HWND hwnd, int level, LPFINDWNDSPEC lpfws, LPSTR DSWinName)
{
int nSuccess = 0xffffffff;
if (hwnd == 0)
return nSuccess;
hwnd = GetWindow(hwnd, GW_HWNDFIRST);
while (hwnd)
{
if (nSuccess = save_hwndinfo(hwnd, level, lpfws, DSWinName)) {
findwinx(GetWindow(hwnd, GW_CHILD), level+1, lpfws, DSWinName);
hwnd = GetWindow(hwnd, GW_HWNDNEXT);
}
else
hwnd = 0L;
}
return(nSuccess);
}
// First look for HP DeskScan, then PictureScan, then THUNK_16
// This is a hack in order for the DS dialogs to come on top
// of our app! Setting the window of THUNK_16 up front will
// work with 16 bit data sources, but not 32bit. So we must
// explicitly look for the main windows of DeskScan and Picture
// Scan in case they are the 32 bit versions. This fix should
// occur in the data sources themselves, as they assume their
// window will stay in front when it is loaded (at the time the DS
// is loaded). At this time it is hidden and is only visible when
// needed. When it is made visible, it should be set on top!
int findwin(HWND hwnd, int level, LPFINDWNDSPEC lpfws)
{
int nSuccess = 0xffffffff;
HWND DeskTop;
DeskTop = GetWindow(GetDesktopWindow(), GW_CHILD);
if (!findwinx(DeskTop, 0, lpfws, "DS2main"))
nSuccess = 0;
else if (!findwinx(DeskTop, 0, lpfws, "HPPScanMain"))
nSuccess = 0;
else if (!findwinx(DeskTop, 0, lpfws, "Twain Twunk_16"))
nSuccess = 0;
return nSuccess;
}
/**************************/
/* Scanner Status */
/**************************/
int PASCAL IMGScannerStatus(hScancb, lpFlags, lpJLoc, lpValid)
HANDLE hScancb;
DWORD far *lpFlags;
WORD far *lpJLoc;
DWORD far *lpValid;
{
LPSCANCB sp;
int ret_val;
WORD tmp;
TWAIN_PROP ToTwain;
if (ret_val = ParmCheck(hScancb, (LPSCANCB far *)&sp, &ToTwain))
return ret_val;
// BG 8/22/95 Must also check lpJLoc and lpValid for NULL!!
// if (lpFlags == NULL)
if ((lpFlags == NULL) || (lpJLoc == NULL) || (lpValid == NULL))
return IMGSE_NULL_PTR;
sp->Func = SHF_CHECKSTATUS;
if (ToTwain.TSdh)
{
TW_BOOL bPaperInFeeder = FALSE;
STR_CAP TwainCap;
TW_UINT16 dcRC;
*lpValid = IMG_STAT_POWER | IMG_STAT_PAPER;
*lpFlags = IMG_STAT_POWER;
*lpJLoc = 0;
TwainCap.ItemIndex = 0;
TwainCap.wMsgState = MSG_GET;
TwainCap.ItemType = TWTY_BOOL;
TwainCap.lpData = (pTW_BOOL)&bPaperInFeeder;
TwainCap.wCapType = CAP_FEEDERENABLED;
if (dcRC = IMGTwainGetCaps((ToTwain.lpTSdp)->hMainWnd, &TwainCap, NULL))
*lpValid &= ~IMG_STAT_PAPER;
else{
TwainCap.wMsgState = MSG_GET;
TwainCap.wCapType = CAP_FEEDERLOADED;
TwainCap.ItemIndex = 0;
if (bPaperInFeeder &&
(!(dcRC = IMGTwainGetCaps((ToTwain.lpTSdp)->hMainWnd, &TwainCap, NULL)))){
if (bPaperInFeeder)
{
*lpFlags |= IMG_STAT_PAPER;
}
else
{
*lpFlags &= ~IMG_STAT_PAPER;
}
}
else
{
*lpValid &= ~IMG_STAT_PAPER;
}
}
GlobalUnlock(ToTwain.TSdh);
}
else
{
SendMessage(sp->Wnd, WM_SCANCB, (WPARAM) hScancb, 0L);
// LockData(0);
*lpValid = 0;
if (sp->Gl1 & SHSF_PAPER)
*lpValid |= IMG_STAT_PAPER;
if (sp->Gl1 & SHSF_BUSY)
*lpValid |= IMG_STAT_BUSY;
if (sp->Gl1 & SHSF_POWER)
*lpValid |= IMG_STAT_POWER;
if (sp->Gl1 & SHSF_JAM)
*lpValid |= IMG_STAT_JAM;
if (sp->Gl1 & SHSF_LIGHT)
*lpValid |= IMG_STAT_LIGHT;
if (sp->Gl1 & SHSF_FEED)
*lpValid |= IMG_STAT_FEED;
if (sp->Gl1 & SHSF_COVEROPEN)
*lpValid |= IMG_STAT_COVERUP;
if (sp->Gl1 & SHSF_HANDHELD)
*lpValid |= IMG_STAT_HANDHELD;
*lpFlags = 0;
sp->Flags &= sp->Gl1;
if (sp->Flags & SHSF_PAPER)
*lpFlags |= IMG_STAT_PAPER;
if (sp->Flags & SHSF_BUSY)
*lpFlags |= IMG_STAT_BUSY;
if (sp->Flags & SHSF_POWER)
*lpFlags |= IMG_STAT_POWER;
if (sp->Flags & SHSF_JAM)
*lpFlags |= IMG_STAT_JAM;
if (sp->Flags & SHSF_LIGHT)
*lpFlags |= IMG_STAT_LIGHT;
if (sp->Flags & SHSF_FEED)
*lpFlags |= IMG_STAT_FEED;
if (sp->Flags & SHSF_COVEROPEN)
*lpFlags |= IMG_STAT_COVERUP;
if (sp->Flags & SHSF_HANDHELD)
*lpFlags |= IMG_STAT_HANDHELD;
*lpJLoc = 0;
if (sp->Gp1 & SHJF_FEED)
*lpJLoc |= IMG_JL_FEED;
if (sp->Gp1 & SHJF_EJECT)
*lpJLoc |= IMG_JL_EJECT;
if (sp->Gp1 & SHJF_ENDORSER)
*lpJLoc |= IMG_JL_ENDORSER;
if (sp->Gp1 & SHJF_SCANNER)
*lpJLoc |= IMG_JL_SCANNER;
tmp = sp->Gp2;
tmp <<= 8;
*lpJLoc |= tmp;
// UnlockData(0);
}
return SuccessCheck(hScancb, sp);
}
/*********************/
/* ParmCheck */
/*********************/
/* Check hScancb, and lock */
int ParmCheck(HANDLE hScancb, LPSCANCB far * lpSp, LP_TWAIN_PROP lpToTwain)
{
HWND hParent;
int ret_val = IMGSE_SUCCESS;
if (!hScancb)
ret_val = IMGSE_NULL_PTR; // return on error
else if(!(*lpSp = (LPSCANCB)GlobalLock(hScancb)))
ret_val = IMGSE_MEMORY;
else if ((*lpSp)->Wnd == NULL) // return on error
{
GlobalUnlock(hScancb);
ret_val = IMGSE_NOT_OPEN; // return on error
}
else if ((*lpSp)->hwndTw)
{
hParent = (void *) (*lpSp)->hwndTw;
if (lpToTwain) // make sure its a valid pointer
{
if (hParent) // For this to work, Open must set (*lpSp)->Caller to Main hWnd
{
if (lpToTwain->TSdh = IMGGetProp(hParent, TwainPropName))
{
if (!(lpToTwain->lpTSdp =
(LP_TWAIN_SCANDATA)GlobalLock(lpToTwain->TSdh)))
ret_val = IMGSE_MEMORY;
}
}
else
ret_val = IMGSE_BAD_WND;
}
else
ret_val = IMGSE_NULL_PTR;
}
else // will have to assume it's Wang Scanner Interface if (*lpSp)->Caller = 0
lpToTwain->TSdh = 0;
return ret_val; // returns an error or success
}
/************************/
/* SuccessCheck */
/************************/
/* Check if success, and unlock */
int SuccessCheck(hScancb, sp)
HANDLE hScancb;
LPSCANCB sp;
{
int ret_stat;
if (sp->Status != SHS_OK)
if (sp->Status == SHS_MEMORY)
ret_stat = IMGSE_MEMORY;
else if (sp->Status == SHS_HWNOTFOUND)
ret_stat = IMGSE_HWNOTFOUND;
else if (sp->Status == SHS_JAM)
ret_stat = IMGSE_JAM | sp->Gp1 ; // caused by feeder/eject/endorser
else if (sp->Status == SHS_NOPOWER )
ret_stat = IMGSE_NO_POWER;
else if (sp->Status == SHS_NOPAPER )
ret_stat = IMGSE_NO_PAPER ;
else if (sp->Status == SHS_COVEROPEN )
ret_stat = IMGSE_COVER_OPEN;
else if (sp->Status == SHS_TIMEOUT )
ret_stat = IMGSE_TIMEOUT;
else if (sp->Status == SHS_BUSY )
ret_stat = IMGSE_BUSY;
else if (sp->Status == SHS_NOTSUPPORTED )
ret_stat = IMGSE_INVALIDPARM;
else if (sp->Status == SHS_PARMERROR )
ret_stat = IMGSE_INVALIDPARM;
else if (sp->Status == SHS_LIMIT ) /* such as in IMGSetDataOpts */
ret_stat = IMGSE_INVALIDPARM;
else if (sp->Status == SHS_BADWND ) /* such as in IMGEnaKeyPanel */
ret_stat = IMGSE_INVALIDPARM;
else if (sp->Status == SHS_BADSIZE ) /* such as in IMGNextScanData */
ret_stat = IMGSE_BAD_SIZE; /* and in IMGEndScanData */
else if (sp->Status == SHS_BADSTATE )
ret_stat = IMGSE_BADUSAGE; /* wrong time to use function */
else if (sp->Status == SHS_BADFUNC )
ret_stat = IMGSE_BADFUNCTION; /* function not supported */
else if (sp->Status == SHS_ABORT )
ret_stat = IMGSE_ABORT; /* user wants to abort scan in process */
else
ret_stat = IMGSE_HANDLER;
else
ret_stat = IMGSE_SUCCESS;
GlobalUnlock(hScancb);
return ret_stat;
}