Note: autoconf must be re-run after applying this patch.
Changelog:
Mike McCormack <mike@codeweavers.com> Francois Gouget <fgouget@codeweavers.com>
* configure.ac, dlls/twain/Makefile.in, dlls/twain/capability.c, dlls/twain/ds_audio.c, dlls/twain/ds_image.c, dlls/twain/dsm_ctrl.c, dlls/twain/twain32_main.c, dlls/twain/twain_i.h, include/config.h.in
config.h must be included before including twain_i.h Dynamically load libsane.so
-- Francois Gouget fgouget@codeweavers.com
Index: configure.ac =================================================================== RCS file: /home/cvs/wine/configure.ac,v retrieving revision 1.192 diff -u -r1.192 configure.ac --- configure.ac 16 Oct 2003 05:16:05 -0000 1.192 +++ configure.ac 16 Oct 2003 12:30:22 -0000 @@ -387,26 +387,18 @@ AC_CHECK_PROG(sane_devel,sane-config,sane-config,no) if test "$sane_devel" = "no" then - SANELIBS="" SANEINCL="" else - SANELIBS="`$sane_devel --libs`" SANEINCL="`$sane_devel --cflags`" ac_save_CPPFLAGS="$CPPFLAGS" - ac_save_LIBS="$LIBS" CPPFLAGS="$CPPFLAGS $SANEINCL" - LIBS="$LIBS $SANELIBS" AC_CHECK_HEADER(sane/sane.h, [AC_CHECK_LIB(sane,sane_open, [AC_DEFINE(HAVE_SANE, 1, [Define if we have SANE development environment])], - [SANELIBS="" - SANEINCL=""])], - [SANELIBS="" - SANEINCL=""]) - LIBS="$ac_save_LIBS" + [SANEINCL=""])], + [ SANEINCL=""]) CPPFLAGS="$ac_save_CPPFLAGS" fi -AC_SUBST(SANELIBS) AC_SUBST(SANEINCL) dnl **** Check for the ICU library **** @@ -927,6 +919,7 @@ WINE_GET_SONAME(crypto,BIO_new_socket) WINE_GET_SONAME(ncurses,waddch) WINE_GET_SONAME(curses,waddch) + WINE_GET_SONAME(sane,sane_open) fi Index: dlls/twain/Makefile.in =================================================================== RCS file: /home/cvs/wine/dlls/twain/Makefile.in,v retrieving revision 1.5 diff -u -r1.5 Makefile.in --- dlls/twain/Makefile.in 11 Oct 2003 01:09:17 -0000 1.5 +++ dlls/twain/Makefile.in 13 Oct 2003 19:53:07 -0000 @@ -4,7 +4,7 @@ VPATH = @srcdir@ MODULE = twain_32.dll IMPORTS = user32 gdi32 kernel32 -EXTRALIBS = @SANELIBS@ +EXTRALIBS = EXTRAINCL = @SANEINCL@ C_SRCS = \ Index: dlls/twain/capability.c =================================================================== RCS file: /home/cvs/wine/dlls/twain/capability.c,v retrieving revision 1.3 diff -u -r1.3 capability.c --- dlls/twain/capability.c 22 Aug 2003 05:05:56 -0000 1.3 +++ dlls/twain/capability.c 13 Oct 2003 20:37:40 -0000 @@ -21,6 +21,8 @@ #include <stdarg.h> +#include "config.h" + #include "windef.h" #include "winbase.h" #include "twain.h" Index: dlls/twain/ds_audio.c =================================================================== RCS file: /home/cvs/wine/dlls/twain/ds_audio.c,v retrieving revision 1.1 diff -u -r1.1 ds_audio.c --- dlls/twain/ds_audio.c 21 Mar 2002 02:58:39 -0000 1.1 +++ dlls/twain/ds_audio.c 13 Oct 2003 20:38:03 -0000 @@ -16,6 +16,8 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include "config.h" + #include "twain.h" #include "twain_i.h" #include "wine/debug.h" Index: dlls/twain/ds_image.c =================================================================== RCS file: /home/cvs/wine/dlls/twain/ds_image.c,v retrieving revision 1.4 diff -u -r1.4 ds_image.c --- dlls/twain/ds_image.c 22 Aug 2003 05:05:56 -0000 1.4 +++ dlls/twain/ds_image.c 13 Oct 2003 19:53:07 -0000 @@ -89,6 +89,12 @@ TRACE("DG_IMAGE/DAT_IMAGEINFO/MSG_GET\n"); + if( !TWAIN32_sane_loaded ) + { + DSM_twCC = TWCC_NODS; + return TWRC_FAILURE; + } + if (!pSource) { twRC = TWRC_FAILURE; @@ -199,6 +205,12 @@ TRACE("DG_IMAGE/DAT_IMAGENATIVEXFER/MSG_GET\n"); + if( !TWAIN32_sane_loaded ) + { + DSM_twCC = TWCC_NODS; + return TWRC_FAILURE; + } + if (!pSource) { twRC = TWRC_FAILURE; Index: dlls/twain/dsm_ctrl.c =================================================================== RCS file: /home/cvs/wine/dlls/twain/dsm_ctrl.c,v retrieving revision 1.6 diff -u -r1.6 dsm_ctrl.c --- dlls/twain/dsm_ctrl.c 22 Aug 2003 05:05:56 -0000 1.6 +++ dlls/twain/dsm_ctrl.c 13 Oct 2003 19:53:07 -0000 @@ -46,6 +46,12 @@ TRACE ("DG_CONTROL/DAT_IDENTITY/MSG_CLOSEDS\n"); + if( !TWAIN32_sane_loaded ) + { + DSM_twCC = TWCC_NODS; + return TWRC_FAILURE; + } + for (currentDS = activeSources; currentDS; currentDS = currentDS->next) { if (currentDS->identity.Id == pIdentity->Id) @@ -95,6 +101,12 @@ TRACE("DG_CONTROL/DAT_IDENTITY/MSG_GETDEFAULT\n"); + if( !TWAIN32_sane_loaded ) + { + DSM_twCC = TWCC_NODS; + return TWRC_FAILURE; + } + if (!device_list) { if ((sane_get_devices (&device_list, SANE_FALSE) != SANE_STATUS_GOOD)) @@ -141,6 +153,12 @@ TRACE ("DG_CONTROL/DAT_IDENTITY/MSG_GETFIRST\n"); + if( !TWAIN32_sane_loaded ) + { + DSM_twCC = TWCC_NODS; + return TWRC_FAILURE; + } + status = sane_get_devices (&device_list, SANE_FALSE); if (status == SANE_STATUS_GOOD) { @@ -185,6 +203,12 @@ TRACE("DG_CONTROL/DAT_IDENTITY/MSG_GETNEXT\n"); + if( !TWAIN32_sane_loaded ) + { + DSM_twCC = TWCC_NODS; + return TWRC_FAILURE; + } + if (device_list && device_list[DSM_currentDevice]) { pSourceIdentity->Id = DSM_sourceId ++; @@ -222,6 +246,12 @@ TRACE("DG_CONTROL/DAT_IDENTITY/MSG_OPENDS\n"); + if( !TWAIN32_sane_loaded ) + { + DSM_twCC = TWCC_NODS; + return TWRC_FAILURE; + } + if (DSM_currentState != 3) { DSM_twCC = TWCC_SEQERROR; @@ -299,6 +329,12 @@ TRACE("DG_CONTROL/DAT_IDENTITY/MSG_USERSELECT\n"); + if( !TWAIN32_sane_loaded ) + { + DSM_twCC = TWCC_NODS; + return TWRC_FAILURE; + } + /* FIXME: we should replace xscanimage with our own User Select UI */ system("xscanimage"); @@ -318,6 +354,12 @@ TRACE("DG_CONTROL/DAT_PARENT/MSG_CLOSEDSM\n"); + if( !TWAIN32_sane_loaded ) + { + DSM_twCC = TWCC_NODS; + return TWRC_FAILURE; + } + if (DSM_currentState == 3) { sane_exit (); @@ -359,6 +401,12 @@ TRACE("DG_CONTROL/DAT_PARENT/MSG_OPENDSM\n"); + if( !TWAIN32_sane_loaded ) + { + DSM_twCC = TWCC_NODS; + return TWRC_FAILURE; + } + if (DSM_currentState == 2) { if (!DSM_initialized) Index: dlls/twain/twain32_main.c =================================================================== RCS file: /home/cvs/wine/dlls/twain/twain32_main.c,v retrieving revision 1.6 diff -u -r1.6 twain32_main.c --- dlls/twain/twain32_main.c 22 Aug 2003 05:05:56 -0000 1.6 +++ dlls/twain/twain32_main.c 13 Oct 2003 19:53:07 -0000 @@ -20,14 +20,93 @@ #include <stdarg.h> +#include "config.h" + +#define TWAIN32_NO_REDEFINE + #include "windef.h" #include "winbase.h" #include "twain.h" #include "twain_i.h" #include "wine/debug.h" +#include "wine/library.h" +#include "wine/port.h" + WINE_DEFAULT_DEBUG_CHANNEL(twain); +BOOL TWAIN32_sane_loaded = FALSE; + +#ifdef HAVE_SANE + +static void *sane_handle = NULL; + +#define d(f) typeof(f) * p##f; + +d(sane_cancel) +d(sane_init) +d(sane_exit) +d(sane_open) +d(sane_get_devices) +d(sane_strstatus) +d(sane_get_parameters) +d(sane_close) +d(sane_read) +d(sane_start) + +#undef d + +static BOOL load_sane(void) +{ + char *sane_name = SONAME_LIBSANE; + + sane_handle = wine_dlopen(sane_name, RTLD_NOW, NULL, 0); + if (!sane_handle) { + WARN("Wine cannot find the SANE scanner library (%s).\n",sane_name); + return FALSE; + } + +#define d(f) \ + if((p##f = wine_dlsym(sane_handle, #f, NULL, 0)) == NULL) \ + { \ + WARN("Can't find symbol %s\n", #f); \ + goto sym_not_found; \ + } + + d(sane_cancel) + d(sane_init) + d(sane_exit) + d(sane_open) + d(sane_get_devices) + d(sane_strstatus) + d(sane_get_parameters) + d(sane_close) + d(sane_read) + d(sane_start) + +#undef d + + return TRUE; + +sym_not_found: + WARN("Wine cannot find certain functions that it needs inside the SANE\n" + "scanner library. To enable Wine to use SANE please upgrade\n" + "your SANE libraries\n"); + wine_dlclose(sane_handle, NULL, 0); + sane_handle = NULL; + return FALSE; +} + +#else + +static BOOL load_sane(void) +{ + return FALSE; +} + +#endif + + BOOL WINAPI DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { TRACE("%p,%lx,%p\n", hinstDLL, fdwReason, lpvReserved); @@ -35,6 +114,7 @@ switch (fdwReason) { case DLL_PROCESS_ATTACH: + TWAIN32_sane_loaded = load_sane(); DisableThreadLibraryCalls(hinstDLL); DSM_currentState = 2; break; Index: dlls/twain/twain_i.h =================================================================== RCS file: /home/cvs/wine/dlls/twain/twain_i.h,v retrieving revision 1.4 diff -u -r1.4 twain_i.h --- dlls/twain/twain_i.h 5 Sep 2003 23:08:30 -0000 1.4 +++ dlls/twain/twain_i.h 13 Oct 2003 20:40:33 -0000 @@ -239,4 +241,36 @@ TW_UINT16 TWAIN_ICAPXferMech (activeDS *pSource, pTW_CAPABILITY pCapability, TW_UINT16 action); +#ifdef HAVE_SANE +#ifndef TWAIN32_NO_REDEFINE + +#define d(f) extern typeof(f) * p##f; +d(sane_cancel) +d(sane_init) +d(sane_exit) +d(sane_open) +d(sane_get_devices) +d(sane_strstatus) +d(sane_get_parameters) +d(sane_close) +d(sane_read) +d(sane_start) +#undef d + +#define sane_cancel psane_cancel +#define sane_init psane_init +#define sane_exit psane_exit +#define sane_open psane_open +#define sane_get_devices psane_get_devices +#define sane_strstatus psane_strstatus +#define sane_get_parameters psane_get_parameters +#define sane_close psane_close +#define sane_read psane_read +#define sane_start psane_start + +#endif +#endif + +extern BOOL TWAIN32_sane_loaded; + #endif Index: include/config.h.in =================================================================== RCS file: /home/cvs/wine/include/config.h.in,v retrieving revision 1.167 diff -u -r1.167 config.h.in --- include/config.h.in 15 Oct 2003 03:28:04 -0000 1.167 +++ include/config.h.in 15 Oct 2003 09:58:18 -0000 @@ -812,6 +812,9 @@ /* Define to the soname of the libXrender library. */ #undef SONAME_LIBXRENDER +/* Define to the soname of the libsane library. */ +#undef SONAME_LIBSANE + /* If using the C implementation of alloca, define if you know the direction of stack growth for your system; otherwise it will be automatically deduced at run-time.