273 lines
8.6 KiB
C
273 lines
8.6 KiB
C
/***************************************************************************
|
|
* Copyright © 2007 TWAIN Working Group:
|
|
* Adobe Systems Incorporated, AnyDoc Software Inc., Eastman Kodak Company,
|
|
* Fujitsu Computer Products of America, JFL Peripheral Solutions Inc.,
|
|
* Ricoh Corporation, and Xerox Corporation.
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions are met:
|
|
* * Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* * Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
* * Neither the name of the TWAIN Working Group nor the
|
|
* names of its contributors may be used to endorse or promote products
|
|
* derived from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY TWAIN Working Group ``AS IS'' AND ANY
|
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
* DISCLAIMED. IN NO EVENT SHALL TWAIN Working Group BE LIABLE FOR ANY
|
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*
|
|
***************************************************************************/
|
|
|
|
/**
|
|
* @file Common.h
|
|
* Common defines and typedefs used by the DS, App, and scanner
|
|
* @author TWAIN Working Group
|
|
* @date April 2007
|
|
*/
|
|
|
|
#ifndef __COMMON_H__
|
|
#define __COMMON_H__
|
|
|
|
#if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64)
|
|
#define TWNDS_OS_WIN
|
|
#ifndef WIN32_LEAN_AND_MEAN
|
|
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
|
|
#endif
|
|
#include <windows.h>
|
|
#endif
|
|
|
|
#if defined(__APPLE__)
|
|
#define TWNDS_OS_APPLE
|
|
#endif
|
|
|
|
#include "twain.h"
|
|
|
|
#ifdef TWH_CMP_GNU
|
|
#if !(defined(TWNDS_OS_WIN) || defined(TWNDS_OS_APPLE))
|
|
#define TWNDS_OS_LINUX
|
|
#endif
|
|
#include <wchar.h>
|
|
#include <stdarg.h>
|
|
#endif
|
|
|
|
/**
|
|
* These headers are available on all platforms...
|
|
*/
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <limits.h>
|
|
#include <stdio.h>
|
|
#include <assert.h>
|
|
|
|
/**
|
|
* First off, figure out what compiler we're running and on which
|
|
* platform we think we're running it. We assume that you're building
|
|
* on the same platform you intend to run, so if you are cross compiling
|
|
* you will likely have a bit of work to do here...
|
|
*/
|
|
|
|
/**
|
|
* Compilers we support...
|
|
*/
|
|
#define TWNDS_CMP_VISUALCPP 0x1001 // Preferably 2005+
|
|
#define TWNDS_CMP_GNUGPP 0x1002 // Preferably v4.x+
|
|
#define TWNDS_CMP_XCODE 0x1003 // Xcode
|
|
|
|
/**
|
|
* If the user defines TWNDS_CMP in their make file or project,
|
|
* then we'll assume they want to take responsibility for picking
|
|
* how we'll build the system. At this point it seems like the
|
|
* compiler definition is used to select which native library calls
|
|
* we're dealing with, while the os definition is more about
|
|
* where we'll expect to find stuff on the running system, like
|
|
* directories...
|
|
*/
|
|
#ifndef TWNDS_CMP
|
|
|
|
// GNU g++
|
|
#if defined(TWH_CMP_GNU) || defined(TWH_CMP_XCODE)
|
|
#define TWNDS_CMP TWNDS_CMP_GNUGPP
|
|
#define TWNDS_CMP_VERSION __GNUC__
|
|
|
|
#define kTWAIN_DSM_DIR "/usr/local/lib/"
|
|
|
|
// Visual Studio C++
|
|
#elif defined(TWH_CMP_MSC)
|
|
#define TWNDS_CMP TWNDS_CMP_VISUALCPP
|
|
#define TWNDS_CMP_VERSION _MSC_VER
|
|
// Not neccessary it is in Windows path
|
|
#define kTWAIN_DSM_DIR ""
|
|
|
|
// Xcode
|
|
#elif defined (TWH_CMP_XCODE)
|
|
#define TWNDS_CMP TWNDS_CMP_XCODE
|
|
#define TWNDS_CMP_VERSION
|
|
|
|
// ruh-roh...
|
|
#else
|
|
#error Sorry, we don't recognize this system...
|
|
#endif
|
|
#endif
|
|
|
|
|
|
/**
|
|
* @def LOADLIBRARY(lib)
|
|
* Call system loadibrary function. OS abstraction macro that tries to load a library.
|
|
* @param lib path and name of library
|
|
*
|
|
* @def LOADFUNCTION(lib, func)
|
|
* Call system GetProcAddress function. OS abstraction macro that tries to locate the addess of a funtion name.
|
|
* @param lib path and name of library
|
|
* @param func name of the funtion
|
|
*
|
|
* @def UNLOADLIBRARY(lib)
|
|
* Call system FreeLibrary function. OS abstraction macro that tries to release the library.
|
|
* @param lib library modual to unload
|
|
*
|
|
* @def UNLINK
|
|
* OS abstraction macro that calls system _unlink function.
|
|
*
|
|
* @def READ
|
|
* OS abstraction macro that calls system _read function.
|
|
*
|
|
* @def CLOSE
|
|
* OS abstraction macro that calls system _close function.
|
|
*
|
|
* @def SNPRINTF
|
|
* OS abstraction macro that calls system _snprintf function.
|
|
*
|
|
*/
|
|
|
|
#if (TWNDS_CMP == TWNDS_CMP_VISUALCPP)
|
|
//#include "stdafx.h"
|
|
#define DllExport __declspec( dllexport )
|
|
#define LOADLIBRARY(lib) LoadLibraryA(lib)
|
|
#define LOADFUNCTION(lib, func) GetProcAddress(lib, func)
|
|
#define UNLOADLIBRARY(lib) FreeLibrary(lib)
|
|
#define UNLINK _unlink
|
|
#define READ _read
|
|
#define CLOSE _close
|
|
#define FILE_EXISTS(FILE_NAME) ((0xFFFFFFFF==GetFileAttributes(FILE_NAME))?FALSE:TRUE)
|
|
#define PATH_SEPERATOR '\\'
|
|
#ifndef PATH_MAX
|
|
#define PATH_MAX _MAX_PATH
|
|
#endif
|
|
|
|
#if (TWNDS_CMP_VERSION >= 1400)
|
|
#define SNPRINTF _snprintf_s
|
|
#define SSCANF sscanf_s
|
|
#define FOPEN(pf,name,mode) (void)fopen_s(&pf,name,mode)
|
|
#define _OPEN(pf,name,mode,share,perm) (void)_sopen_s(&pf,name,mode,share,perm)
|
|
#else
|
|
#define SSCANF sscanf
|
|
#define SNPRINTF _snprintf
|
|
#define FOPEN(pf,name,mode) pf=fopen(name,mode)
|
|
#define _OPEN(pf,name,mode,share,perm) pf = _open(name,mode,share)
|
|
#endif
|
|
#define MAX(a, b) max(a,b)
|
|
#define MIN(a, b) min(a,b)
|
|
|
|
#elif (TWNDS_CMP == TWNDS_CMP_GNUGPP)
|
|
#define DllExport
|
|
#define LOADLIBRARY(lib) dlopen(lib, RTLD_NOW)
|
|
#define LOADFUNCTION(lib, func) dlsym(lib, func)
|
|
#define UNLOADLIBRARY(lib) dlclose(lib)
|
|
#define UNLINK unlink
|
|
#define kTWAIN_DSM_DLL_NAME "libtwaindsm.so"
|
|
#define READ read
|
|
#define CLOSE close
|
|
#define PATH_SEPERATOR '/'
|
|
#define SNPRINTF snprintf
|
|
#define SSCANF sscanf
|
|
typedef void * HMODULE;
|
|
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
|
|
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
|
|
#define FILE_EXISTS(FILE_NAME) ((0 == access(FILE_NAME, R_OK))?TRUE:FALSE)
|
|
#define FOPEN(pf,name,mode) (pf=fopen(name,mode))
|
|
|
|
#if !defined(TRUE)
|
|
#define FALSE 0
|
|
#define TRUE 1
|
|
#endif
|
|
|
|
#include <inttypes.h>
|
|
typedef uint16_t WORD;
|
|
typedef uint32_t DWORD;
|
|
|
|
#else
|
|
#error Sorry, we don't recognize this system...
|
|
#endif
|
|
|
|
|
|
/**
|
|
* We want to use secure string functions whenever possible, if g++
|
|
* every includes a set I think it would be excellent to switch over
|
|
* to it, but at least with Windows using them we stand a better
|
|
* chance of finding boo-boos...
|
|
*/
|
|
#if (TWNDS_CMP == TWNDS_CMP_VISUALCPP) && (TWNDS_CMP_VERSION >= 1400)
|
|
#define SSTRCPY(d,z,s) strncpy_s(d,z,s,_TRUNCATE)
|
|
#define SSTRCAT(d,z,s) strncat_s(d,z,s,_TRUNCATE)
|
|
#define SSTRNCPY(d,z,s,m) strncpy_s(d,z,s,m)
|
|
#define SGETENV(d,z,n) ::GetEnvironmentVariable(n,d,z)
|
|
inline int SSNPRINTF(char *d, size_t z, size_t c, const char *f,...)
|
|
{
|
|
int result;
|
|
va_list valist;
|
|
va_start(valist,f);
|
|
result = _vsnprintf_s(d,z,c,f,valist);
|
|
va_end(valist);
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* These functions are insecure, but everybody has them, so we
|
|
* don't need an else/error section like we use everywhere else...
|
|
*/
|
|
#else
|
|
#define SSTRCPY(d,z,s) strcpy(d,s)
|
|
#define SSTRCAT(d,z,s) strcat(d,s)
|
|
#define SSTRNCPY(d,z,s,m) strncpy(d,s,m)
|
|
#define SGETENV(d,z,n) strcpy(d,getenv(n)?getenv(n):"")
|
|
inline int SSNPRINTF(char *d, size_t, size_t c, const char *f,...)
|
|
{
|
|
int result;
|
|
va_list valist;
|
|
va_start(valist,f);
|
|
#if (TWNDS_CMP == TWNDS_CMP_VISUALCPP)
|
|
result = _vsnprintf(d,c,f,valist);
|
|
#elif (TWNDS_CMP == TWNDS_CMP_GNUGPP)
|
|
result = vsnprintf(d,c,f,valist);
|
|
#else
|
|
#error Sorry, we don't recognize this system...
|
|
#endif
|
|
va_end(valist);
|
|
return result;
|
|
}
|
|
#endif
|
|
|
|
/**
|
|
* Determine the number of bytes needed for one line.
|
|
*/
|
|
#define BYTES_PERLINE(width, bpp) ((((int)(width)*(bpp))+7)/8)
|
|
|
|
/**
|
|
* Determine the number of bytes needed rouned up to 4 byte alignment.
|
|
*/
|
|
#define BYTES_PERLINE_ALIGN4(width, bpp) (((((int)(width)*(bpp))+31)/32)*4)
|
|
|
|
|
|
#endif // __COMMON_H__
|
|
|