summaryrefslogtreecommitdiff
path: root/extensions/source/scanner/scanwin.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/source/scanner/scanwin.cxx')
-rw-r--r--extensions/source/scanner/scanwin.cxx1059
1 files changed, 0 insertions, 1059 deletions
diff --git a/extensions/source/scanner/scanwin.cxx b/extensions/source/scanner/scanwin.cxx
deleted file mode 100644
index f8d006f08..000000000
--- a/extensions/source/scanner/scanwin.cxx
+++ /dev/null
@@ -1,1059 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-// MARKER(update_precomp.py): autogen include statement, do not remove
-#include "precompiled_extensions.hxx"
-#include <com/sun/star/uno/Any.hxx>
-#include <com/sun/star/uno/Reference.hxx>
-#include <com/sun/star/util/XCloseable.hpp>
-#include <com/sun/star/util/XCloseBroadcaster.hpp>
-#include <com/sun/star/util/XCloseListener.hpp>
-#include <com/sun/star/frame/XFrame.hpp>
-#include <com/sun/star/frame/XDesktop.hpp>
-#include <com/sun/star/beans/XPropertySet.hpp>
-#include <cppuhelper/implbase1.hxx>
-#include <comphelper/processfactory.hxx>
-
-#include <prewin.h>
-#include <windows.h>
-#include <postwin.h>
-#include <math.h>
-#include <tools/stream.hxx>
-#include <osl/mutex.hxx>
-#include <osl/module.hxx>
-#include <vcl/svapp.hxx>
-#include <vcl/wrkwin.hxx>
-#include <vcl/sysdata.hxx>
-#include <vcl/salbtype.hxx>
-#include "scanner.hxx"
-
-#pragma warning (push,1)
-#pragma warning (disable:4668)
-#include "twain/twain.h"
-#pragma warning (pop)
-
-using namespace ::com::sun::star;
-
-// -----------
-// - Defines -
-// -----------
-
-#define TWAIN_SELECT 0x00000001UL
-#define TWAIN_ACQUIRE 0x00000002UL
-#define TWAIN_TERMINATE 0xFFFFFFFFUL
-
-#define TWAIN_EVENT_NONE 0x00000000UL
-#define TWAIN_EVENT_QUIT 0x00000001UL
-#define TWAIN_EVENT_SCANNING 0x00000002UL
-#define TWAIN_EVENT_XFER 0x00000004UL
-
-#define PFUNC (*pDSM)
-#define PTWAINMSG MSG*
-#define FIXTODOUBLE( nFix ) ((double)nFix.Whole+(double)nFix.Frac/65536.)
-#define FIXTOLONG( nFix ) ((long)floor(FIXTODOUBLE(nFix)+0.5))
-
-#if defined WNT
-#define TWAIN_LIBNAME "TWAIN_32.DLL"
-#define TWAIN_FUNCNAME "DSM_Entry"
-#endif
-
-// --------------
-// - TwainState -
-// --------------
-
-enum TwainState
-{
- TWAIN_STATE_NONE = 0,
- TWAIN_STATE_SCANNING = 1,
- TWAIN_STATE_DONE = 2,
- TWAIN_STATE_CANCELED = 3
-};
-
-// ------------
-// - ImpTwain -
-// ------------
-
-class ImpTwain : public ::cppu::WeakImplHelper1< util::XCloseListener >
-{
- friend LRESULT CALLBACK TwainMsgProc( int nCode, WPARAM wParam, LPARAM lParam );
-
- uno::Reference< uno::XInterface > mxSelfRef;
- uno::Reference< scanner::XScannerManager > mxMgr;
- ScannerManager& mrMgr;
- TW_IDENTITY aAppIdent;
- TW_IDENTITY aSrcIdent;
- Link aNotifyLink;
- DSMENTRYPROC pDSM;
- osl::Module* pMod;
- ULONG nCurState;
- HWND hTwainWnd;
- HHOOK hTwainHook;
- bool mbCloseFrameOnExit;
-
- bool ImplHandleMsg( void* pMsg );
- void ImplCreate();
- void ImplOpenSourceManager();
- void ImplOpenSource();
- bool ImplEnableSource();
- void ImplXfer();
- void ImplFallback( ULONG nEvent );
- void ImplSendCloseEvent();
- void ImplDeregisterCloseListener();
- void ImplRegisterCloseListener();
- uno::Reference< frame::XFrame > ImplGetActiveFrame();
- uno::Reference< util::XCloseBroadcaster > ImplGetActiveFrameCloseBroadcaster();
-
- DECL_LINK( ImplFallbackHdl, void* );
- DECL_LINK( ImplDestroyHdl, void* );
-
- // from util::XCloseListener
- virtual void SAL_CALL queryClosing( const lang::EventObject& Source, sal_Bool GetsOwnership ) throw (util::CloseVetoException, uno::RuntimeException);
- virtual void SAL_CALL notifyClosing( const lang::EventObject& Source ) throw (uno::RuntimeException);
-
- // from lang::XEventListener
- virtual void SAL_CALL disposing( const lang::EventObject& Source ) throw (uno::RuntimeException);
-
-public:
-
- ImpTwain( ScannerManager& rMgr, const Link& rNotifyLink );
- ~ImpTwain();
-
- void Destroy();
-
- bool SelectSource();
- bool InitXfer();
-};
-
-// ---------
-// - Procs -
-// ---------
-
-static ImpTwain* pImpTwainInstance = NULL;
-
-// -------------------------------------------------------------------------
-
-LRESULT CALLBACK TwainWndProc( HWND hWnd,UINT nMsg, WPARAM nPar1, LPARAM nPar2 )
-{
- return DefWindowProc( hWnd, nMsg, nPar1, nPar2 );
-}
-
-// -------------------------------------------------------------------------
-
-LRESULT CALLBACK TwainMsgProc( int nCode, WPARAM wParam, LPARAM lParam )
-{
- MSG* pMsg = (MSG*) lParam;
-
- if( ( nCode < 0 ) || ( pImpTwainInstance->hTwainWnd != pMsg->hwnd ) || !pImpTwainInstance->ImplHandleMsg( (void*) lParam ) )
- {
- return CallNextHookEx( pImpTwainInstance->hTwainHook, nCode, wParam, lParam );
- }
- else
- {
- pMsg->message = WM_USER;
- pMsg->lParam = 0;
-
- return 0;
- }
-}
-
-// -----------------------------------------------------------------------------
-
-// #107835# hold reference to ScannerManager, to prevent premature death
-ImpTwain::ImpTwain( ScannerManager& rMgr, const Link& rNotifyLink ) :
- mrMgr( rMgr ),
- mxMgr( uno::Reference< scanner::XScannerManager >( static_cast< OWeakObject* >( &rMgr ), uno::UNO_QUERY) ),
- aNotifyLink( rNotifyLink ),
- pDSM( NULL ),
- pMod( NULL ),
- hTwainWnd( 0 ),
- hTwainHook( 0 ),
- nCurState( 1 ),
- mbCloseFrameOnExit( false )
-{
- // setup TWAIN window
- pImpTwainInstance = this;
-
- aAppIdent.Id = 0;
- aAppIdent.Version.MajorNum = 1;
- aAppIdent.Version.MinorNum = 0;
- aAppIdent.Version.Language = TWLG_USA;
- aAppIdent.Version.Country = TWCY_USA;
- aAppIdent.ProtocolMajor = TWON_PROTOCOLMAJOR;
- aAppIdent.ProtocolMinor = TWON_PROTOCOLMINOR;
- aAppIdent.SupportedGroups = DG_IMAGE | DG_CONTROL;
- strncpy( aAppIdent.Version.Info, "8.0", 32 );
- aAppIdent.Version.Info[32] = aAppIdent.Version.Info[33] = 0;
- strncpy( aAppIdent.Manufacturer, "Sun Microsystems", 32 );
- aAppIdent.Manufacturer[32] = aAppIdent.Manufacturer[33] = 0;
- strncpy( aAppIdent.ProductFamily,"Office", 32 );
- aAppIdent.ProductFamily[32] = aAppIdent.ProductFamily[33] = 0;
- strncpy( aAppIdent.ProductName, "Office", 32 );
- aAppIdent.ProductName[32] = aAppIdent.ProductName[33] = 0;
-
- WNDCLASS aWc = { 0, &TwainWndProc, 0, sizeof( WNDCLASS ), GetModuleHandle( NULL ), NULL, NULL, NULL, NULL, "TwainClass" };
- RegisterClass( &aWc );
-
- hTwainWnd = CreateWindowEx( WS_EX_TOPMOST, aWc.lpszClassName, "TWAIN", 0, 0, 0, 0, 0, HWND_DESKTOP, NULL, aWc.hInstance, 0 );
- hTwainHook = SetWindowsHookEx( WH_GETMESSAGE, &TwainMsgProc, NULL, GetCurrentThreadId() );
-
- // block destruction until ImplDestroyHdl is called
- mxSelfRef = static_cast< ::cppu::OWeakObject* >( this );
-}
-
-// -----------------------------------------------------------------------------
-
-ImpTwain::~ImpTwain()
-{
- // are we responsible for application shutdown?
- if( mbCloseFrameOnExit )
- ImplSendCloseEvent();
-}
-
-// -----------------------------------------------------------------------------
-
-void ImpTwain::Destroy()
-{
- ImplFallback( TWAIN_EVENT_NONE );
- Application::PostUserEvent( LINK( this, ImpTwain, ImplDestroyHdl ), NULL );
-}
-
-// -----------------------------------------------------------------------------
-
-bool ImpTwain::SelectSource()
-{
- TW_UINT16 nRet = TWRC_FAILURE;
-
- ImplOpenSourceManager();
-
- if( 3 == nCurState )
- {
- TW_IDENTITY aIdent;
-
- aIdent.Id = 0, aIdent.ProductName[ 0 ] = '\0';
- aNotifyLink.Call( (void*) TWAIN_EVENT_SCANNING );
- nRet = PFUNC( &aAppIdent, NULL, DG_CONTROL, DAT_IDENTITY, MSG_USERSELECT, &aIdent );
- }
-
- ImplFallback( TWAIN_EVENT_QUIT );
-
- return( TWRC_SUCCESS == nRet );
-}
-
-// -----------------------------------------------------------------------------
-
-bool ImpTwain::InitXfer()
-{
- bool bRet = false;
-
- ImplOpenSourceManager();
-
- if( 3 == nCurState )
- {
- ImplOpenSource();
-
- if( 4 == nCurState )
- bRet = ImplEnableSource();
- }
-
- if( !bRet )
- ImplFallback( TWAIN_EVENT_QUIT );
-
- return bRet;
-}
-
-// -----------------------------------------------------------------------------
-
-void ImpTwain::ImplOpenSourceManager()
-{
- if( 1 == nCurState )
- {
- pMod = new ::osl::Module( ::rtl::OUString() );
-
- if( pMod->load( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( TWAIN_LIBNAME ) ) ) )
- {
- nCurState = 2;
-
- if( ( ( pDSM = (DSMENTRYPROC) pMod->getSymbol( String( RTL_CONSTASCII_USTRINGPARAM( TWAIN_FUNCNAME ) ) ) ) != NULL ) &&
- ( PFUNC( &aAppIdent, NULL, DG_CONTROL, DAT_PARENT, MSG_OPENDSM, &hTwainWnd ) == TWRC_SUCCESS ) )
- {
- nCurState = 3;
- }
- }
- else
- {
- delete pMod;
- pMod = NULL;
- }
- }
-}
-
-// -----------------------------------------------------------------------------
-
-void ImpTwain::ImplOpenSource()
-{
- if( 3 == nCurState )
- {
- if( ( PFUNC( &aAppIdent, NULL, DG_CONTROL, DAT_IDENTITY, MSG_GETDEFAULT, &aSrcIdent ) == TWRC_SUCCESS ) &&
- ( PFUNC( &aAppIdent, NULL, DG_CONTROL, DAT_IDENTITY, MSG_OPENDS, &aSrcIdent ) == TWRC_SUCCESS ) )
- {
- TW_CAPABILITY aCap = { CAP_XFERCOUNT, TWON_ONEVALUE, GlobalAlloc( GHND, sizeof( TW_ONEVALUE ) ) };
- TW_ONEVALUE* pVal = (TW_ONEVALUE*) GlobalLock( aCap.hContainer );
-
- pVal->ItemType = TWTY_INT16, pVal->Item = 1;
- GlobalUnlock( aCap.hContainer );
- PFUNC( &aAppIdent, &aSrcIdent, DG_CONTROL, DAT_CAPABILITY, MSG_SET, &aCap );
- GlobalFree( aCap.hContainer );
- nCurState = 4;
- }
- }
-}
-
-// -----------------------------------------------------------------------------
-
-bool ImpTwain::ImplEnableSource()
-{
- bool bRet = false;
-
- if( 4 == nCurState )
- {
- TW_USERINTERFACE aUI = { true, true, hTwainWnd };
-
- aNotifyLink.Call( (void*) TWAIN_EVENT_SCANNING );
- nCurState = 5;
-
- // register as vetoable close listener, to prevent application to die under us
- ImplRegisterCloseListener();
-
- if( PFUNC( &aAppIdent, &aSrcIdent, DG_CONTROL, DAT_USERINTERFACE, MSG_ENABLEDS, &aUI ) == TWRC_SUCCESS )
- {
- bRet = true;
- }
- else
- {
- nCurState = 4;
-
- // deregister as vetoable close listener, dialog failed
- ImplDeregisterCloseListener();
- }
- }
-
- return bRet;
-}
-
-// -----------------------------------------------------------------------------
-
-bool ImpTwain::ImplHandleMsg( void* pMsg )
-{
- TW_UINT16 nRet;
- PTWAINMSG pMess = (PTWAINMSG) pMsg;
- TW_EVENT aEvt = { pMess, MSG_NULL };
-
- nRet = PFUNC( &aAppIdent, &aSrcIdent, DG_CONTROL, DAT_EVENT, MSG_PROCESSEVENT, &aEvt );
-
- if( aEvt.TWMessage != MSG_NULL )
- {
- switch( aEvt.TWMessage )
- {
- case MSG_XFERREADY:
- {
- ULONG nEvent = TWAIN_EVENT_QUIT;
-
- if( 5 == nCurState )
- {
- nCurState = 6;
- ImplXfer();
-
- if( mrMgr.GetData() )
- nEvent = TWAIN_EVENT_XFER;
- }
-
- ImplFallback( nEvent );
- }
- break;
-
- case MSG_CLOSEDSREQ:
- ImplFallback( TWAIN_EVENT_QUIT );
- break;
-
- default:
- break;
- }
- }
- else
- nRet = TWRC_NOTDSEVENT;
-
- return( TWRC_DSEVENT == nRet );
-}
-
-// -----------------------------------------------------------------------------
-
-void ImpTwain::ImplXfer()
-{
- if( nCurState == 6 )
- {
- TW_IMAGEINFO aInfo;
- TW_UINT32 hDIB = 0;
- long nWidth, nHeight, nXRes, nYRes;
-
- if( PFUNC( &aAppIdent, &aSrcIdent, DG_IMAGE, DAT_IMAGEINFO, MSG_GET, &aInfo ) == TWRC_SUCCESS )
- {
- nWidth = aInfo.ImageWidth;
- nHeight = aInfo.ImageLength;
- nXRes = FIXTOLONG( aInfo.XResolution );
- nYRes = FIXTOLONG( aInfo.YResolution );
- }
- else
- nWidth = nHeight = nXRes = nYRes = -1L;
-
- switch( PFUNC( &aAppIdent, &aSrcIdent, DG_IMAGE, DAT_IMAGENATIVEXFER, MSG_GET, &hDIB ) )
- {
- case( TWRC_CANCEL ):
- nCurState = 7;
- break;
-
- case( TWRC_XFERDONE ):
- {
- if( hDIB )
- {
- if( ( nXRes != -1 ) && ( nYRes != - 1 ) && ( nWidth != - 1 ) && ( nHeight != - 1 ) )
- {
- // set resolution of bitmap
- BITMAPINFOHEADER* pBIH = (BITMAPINFOHEADER*) GlobalLock( (HGLOBAL) hDIB );
- static const double fFactor = 100.0 / 2.54;
-
- pBIH->biXPelsPerMeter = FRound( fFactor * nXRes );
- pBIH->biYPelsPerMeter = FRound( fFactor * nYRes );
-
- GlobalUnlock( (HGLOBAL) hDIB );
- }
-
- mrMgr.SetData( (void*)(long) hDIB );
- }
- else
- GlobalFree( (HGLOBAL) hDIB );
-
- nCurState = 7;
- }
- break;
-
- default:
- break;
- }
- }
-}
-
-// -----------------------------------------------------------------------------
-
-void ImpTwain::ImplFallback( ULONG nEvent )
-{
- Application::PostUserEvent( LINK( this, ImpTwain, ImplFallbackHdl ), (void*) nEvent );
-}
-
-// -----------------------------------------------------------------------------
-
-IMPL_LINK( ImpTwain, ImplFallbackHdl, void*, pData )
-{
- const ULONG nEvent = (ULONG) pData;
- bool bFallback = true;
-
- switch( nCurState )
- {
- case( 7 ):
- case( 6 ):
- {
- TW_PENDINGXFERS aXfers;
-
- if( PFUNC( &aAppIdent, &aSrcIdent, DG_CONTROL, DAT_PENDINGXFERS, MSG_ENDXFER, &aXfers ) == TWRC_SUCCESS )
- {
- if( aXfers.Count != 0 )
- PFUNC( &aAppIdent, &aSrcIdent, DG_CONTROL, DAT_PENDINGXFERS, MSG_RESET, &aXfers );
- }
-
- nCurState = 5;
- }
- break;
-
- case( 5 ):
- {
- TW_USERINTERFACE aUI = { true, true, hTwainWnd };
-
- PFUNC( &aAppIdent, &aSrcIdent, DG_CONTROL, DAT_USERINTERFACE, MSG_DISABLEDS, &aUI );
- nCurState = 4;
-
- // deregister as vetoable close listener
- ImplDeregisterCloseListener();
- }
- break;
-
- case( 4 ):
- {
- PFUNC( &aAppIdent, NULL, DG_CONTROL, DAT_IDENTITY, MSG_CLOSEDS, &aSrcIdent );
- nCurState = 3;
- }
- break;
-
- case( 3 ):
- {
- PFUNC( &aAppIdent, NULL, DG_CONTROL, DAT_PARENT, MSG_CLOSEDSM, &hTwainWnd );
- nCurState = 2;
- }
- break;
-
- case( 2 ):
- {
- delete pMod;
- pMod = NULL;
- nCurState = 1;
- }
- break;
-
- default:
- {
- if( nEvent != TWAIN_EVENT_NONE )
- aNotifyLink.Call( (void*) nEvent );
-
- bFallback = false;
- }
- break;
- }
-
- if( bFallback )
- ImplFallback( nEvent );
-
- return 0L;
-}
-
-// -----------------------------------------------------------------------------
-
-IMPL_LINK( ImpTwain, ImplDestroyHdl, void*, /*p*/ )
-{
- if( hTwainWnd )
- DestroyWindow( hTwainWnd );
-
- if( hTwainHook )
- UnhookWindowsHookEx( hTwainHook );
-
- // permit destruction of ourselves (normally, refcount
- // should drop to zero exactly here)
- mxSelfRef = NULL;
- pImpTwainInstance = NULL;
-
- return 0L;
-}
-
-// -----------------------------------------------------------------------------
-
-uno::Reference< frame::XFrame > ImpTwain::ImplGetActiveFrame()
-{
- try
- {
- uno::Reference< lang::XMultiServiceFactory > xMgr( ::comphelper::getProcessServiceFactory() );
-
- if( xMgr.is() )
- {
- // query desktop instance
- uno::Reference< frame::XDesktop > xDesktop( xMgr->createInstance(
- OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.frame.Desktop")) ), uno::UNO_QUERY );
-
- if( xDesktop.is() )
- {
- // query property set from desktop, which contains the currently active frame
- uno::Reference< beans::XPropertySet > xDesktopProps( xDesktop, uno::UNO_QUERY );
-
- if( xDesktopProps.is() )
- {
- uno::Any aActiveFrame;
-
- try
- {
- aActiveFrame = xDesktopProps->getPropertyValue(
- OUString(RTL_CONSTASCII_USTRINGPARAM("ActiveFrame")) );
- }
- catch( const beans::UnknownPropertyException& )
- {
- // property unknown.
- OSL_FAIL("ImpTwain::ImplGetActiveFrame: ActiveFrame property unknown, cannot determine active frame!");
- return uno::Reference< frame::XFrame >();
- }
-
- uno::Reference< frame::XFrame > xActiveFrame;
-
- if( (aActiveFrame >>= xActiveFrame) &&
- xActiveFrame.is() )
- {
- return xActiveFrame;
- }
- }
- }
- }
- }
- catch( const uno::Exception& )
- {
- }
-
- OSL_FAIL("ImpTwain::ImplGetActiveFrame: Could not determine active frame!");
- return uno::Reference< frame::XFrame >();
-}
-
-// -----------------------------------------------------------------------------
-
-uno::Reference< util::XCloseBroadcaster > ImpTwain::ImplGetActiveFrameCloseBroadcaster()
-{
- try
- {
- return uno::Reference< util::XCloseBroadcaster >( ImplGetActiveFrame(), uno::UNO_QUERY );
- }
- catch( const uno::Exception& )
- {
- }
-
- OSL_FAIL("ImpTwain::ImplGetActiveFrameCloseBroadcaster: Could determine close broadcaster on active frame!");
- return uno::Reference< util::XCloseBroadcaster >();
-}
-
-// -----------------------------------------------------------------------------
-
-void ImpTwain::ImplRegisterCloseListener()
-{
- try
- {
- uno::Reference< util::XCloseBroadcaster > xCloseBroadcaster( ImplGetActiveFrameCloseBroadcaster() );
-
- if( xCloseBroadcaster.is() )
- {
- xCloseBroadcaster->addCloseListener(this);
- return; // successfully registered as a close listener
- }
- else
- {
- // interface unknown. don't register, then
- OSL_FAIL("ImpTwain::ImplRegisterCloseListener: XFrame has no XCloseBroadcaster!");
- return;
- }
- }
- catch( const uno::Exception& )
- {
- }
-
- OSL_FAIL("ImpTwain::ImplRegisterCloseListener: Could not register as close listener!");
-}
-
-// -----------------------------------------------------------------------------
-
-void ImpTwain::ImplDeregisterCloseListener()
-{
- try
- {
- uno::Reference< util::XCloseBroadcaster > xCloseBroadcaster(
- ImplGetActiveFrameCloseBroadcaster() );
-
- if( xCloseBroadcaster.is() )
- {
- xCloseBroadcaster->removeCloseListener(this);
- return; // successfully deregistered as a close listener
- }
- else
- {
- // interface unknown. don't deregister, then
- OSL_FAIL("ImpTwain::ImplDeregisterCloseListener: XFrame has no XCloseBroadcaster!");
- return;
- }
- }
- catch( const uno::Exception& )
- {
- }
-
- OSL_FAIL("ImpTwain::ImplDeregisterCloseListener: Could not deregister as close listener!");
-}
-
-// -----------------------------------------------------------------------------
-
-void SAL_CALL ImpTwain::queryClosing( const lang::EventObject& /*Source*/, sal_Bool GetsOwnership ) throw (util::CloseVetoException, uno::RuntimeException)
-{
- // shall we re-send the close query later on?
- mbCloseFrameOnExit = GetsOwnership;
-
- // the sole purpose of this listener is to forbid closing of the listened-at frame
- throw util::CloseVetoException();
-}
-
-// -----------------------------------------------------------------------------
-
-void SAL_CALL ImpTwain::notifyClosing( const lang::EventObject& /*Source*/ ) throw (uno::RuntimeException)
-{
- // should not happen
- OSL_FAIL("ImpTwain::notifyClosing called, but we vetoed the closing before!");
-}
-
-// -----------------------------------------------------------------------------
-
-void SAL_CALL ImpTwain::disposing( const lang::EventObject& /*Source*/ ) throw (uno::RuntimeException)
-{
- // we're not holding any references to the frame, thus noop
-}
-
-// -----------------------------------------------------------------------------
-
-void ImpTwain::ImplSendCloseEvent()
-{
- try
- {
- uno::Reference< util::XCloseable > xCloseable( ImplGetActiveFrame(), uno::UNO_QUERY );
-
- if( xCloseable.is() )
- xCloseable->close( true );
- }
- catch( const uno::Exception& )
- {
- }
-
- OSL_FAIL("ImpTwain::ImplSendCloseEvent: Could not send required close broadcast!");
-}
-
-
-// ---------
-// - Twain -
-// ---------
-
-class Twain
-{
- uno::Reference< lang::XEventListener > mxListener;
- uno::Reference< scanner::XScannerManager > mxMgr;
- const ScannerManager* mpCurMgr;
- ImpTwain* mpImpTwain;
- TwainState meState;
-
- DECL_LINK( ImpNotifyHdl, ImpTwain* );
-
-public:
-
- Twain();
- ~Twain();
-
- bool SelectSource( ScannerManager& rMgr );
- bool PerformTransfer( ScannerManager& rMgr, const uno::Reference< lang::XEventListener >& rxListener );
-
- TwainState GetState() const { return meState; }
-};
-
-// ------------------------------------------------------------------------
-
-Twain::Twain() :
- mpCurMgr( NULL ),
- mpImpTwain( NULL ),
- meState( TWAIN_STATE_NONE )
-{
-}
-
-// ------------------------------------------------------------------------
-
-Twain::~Twain()
-{
- if( mpImpTwain )
- mpImpTwain->Destroy();
-}
-
-// ------------------------------------------------------------------------
-
-bool Twain::SelectSource( ScannerManager& rMgr )
-{
- bool bRet;
-
- if( !mpImpTwain )
- {
- // hold reference to ScannerManager, to prevent premature death
- mxMgr = uno::Reference< scanner::XScannerManager >( static_cast< OWeakObject* >( const_cast< ScannerManager* >( mpCurMgr = &rMgr ) ),
- uno::UNO_QUERY ),
-
- meState = TWAIN_STATE_NONE;
- mpImpTwain = new ImpTwain( rMgr, LINK( this, Twain, ImpNotifyHdl ) );
- bRet = mpImpTwain->SelectSource();
- }
- else
- bRet = false;
-
- return bRet;
-}
-
-// ------------------------------------------------------------------------
-
-bool Twain::PerformTransfer( ScannerManager& rMgr, const uno::Reference< lang::XEventListener >& rxListener )
-{
- bool bRet;
-
- if( !mpImpTwain )
- {
- // hold reference to ScannerManager, to prevent premature death
- mxMgr = uno::Reference< scanner::XScannerManager >( static_cast< OWeakObject* >( const_cast< ScannerManager* >( mpCurMgr = &rMgr ) ),
- uno::UNO_QUERY ),
-
- mxListener = rxListener;
- meState = TWAIN_STATE_NONE;
- mpImpTwain = new ImpTwain( rMgr, LINK( this, Twain, ImpNotifyHdl ) );
- bRet = mpImpTwain->InitXfer();
- }
- else
- bRet = false;
-
- return bRet;
-}
-
-// ------------------------------------------------------------------------
-
-IMPL_LINK( Twain, ImpNotifyHdl, ImpTwain*, nEvent )
-{
- switch( (ULONG)(void*) nEvent )
- {
- case( TWAIN_EVENT_SCANNING ):
- meState = TWAIN_STATE_SCANNING;
- break;
-
- case( TWAIN_EVENT_QUIT ):
- {
- if( meState != TWAIN_STATE_DONE )
- meState = TWAIN_STATE_CANCELED;
-
- if( mpImpTwain )
- {
- mpImpTwain->Destroy();
- mpImpTwain = NULL;
- mpCurMgr = NULL;
- }
-
- if( mxListener.is() )
- mxListener->disposing( lang::EventObject( mxMgr ) );
-
- mxListener = NULL;
- }
- break;
-
- case( TWAIN_EVENT_XFER ):
- {
- if( mpImpTwain )
- {
- meState = ( mpCurMgr->GetData() ? TWAIN_STATE_DONE : TWAIN_STATE_CANCELED );
-
- mpImpTwain->Destroy();
- mpImpTwain = NULL;
- mpCurMgr = NULL;
-
- if( mxListener.is() )
- mxListener->disposing( lang::EventObject( mxMgr ) );
- }
-
- mxListener = NULL;
- }
- break;
-
- default:
- break;
- }
-
- return 0L;
-}
-
-// -----------
-// - statics -
-// -----------
-
-static Twain aTwain;
-
-// ------------------
-// - ScannerManager -
-// ------------------
-
-void ScannerManager::AcquireData()
-{
-}
-
-void ScannerManager::ReleaseData()
-{
- if( mpData )
- {
- GlobalFree( (HGLOBAL)(long) mpData );
- mpData = NULL;
- }
-}
-
-// -----------------------------------------------------------------------------
-
-AWT::Size ScannerManager::getSize() throw()
-{
- AWT::Size aRet;
- HGLOBAL hDIB = (HGLOBAL)(long) mpData;
-
- if( hDIB )
- {
- BITMAPINFOHEADER* pBIH = (BITMAPINFOHEADER*) GlobalLock( hDIB );
-
- if( pBIH )
- {
- aRet.Width = pBIH->biWidth;
- aRet.Height = pBIH->biHeight;
- }
- else
- aRet.Width = aRet.Height = 0;
-
- GlobalUnlock( hDIB );
- }
- else
- aRet.Width = aRet.Height = 0;
-
- return aRet;
-}
-
-// -----------------------------------------------------------------------------
-
-SEQ( sal_Int8 ) ScannerManager::getDIB() throw()
-{
- SEQ( sal_Int8 ) aRet;
-
- if( mpData )
- {
- HGLOBAL hDIB = (HGLOBAL)(long) mpData;
- const sal_uInt32 nDIBSize = GlobalSize( hDIB );
- BITMAPINFOHEADER* pBIH = (BITMAPINFOHEADER*) GlobalLock( hDIB );
-
- if( pBIH )
- {
- sal_uInt32 nColEntries;
-
- switch( pBIH->biBitCount )
- {
- case( 1 ):
- case( 4 ):
- case( 8 ):
- nColEntries = pBIH->biClrUsed ? pBIH->biClrUsed : ( 1 << pBIH->biBitCount );
- break;
-
- case( 24 ):
- nColEntries = pBIH->biClrUsed ? pBIH->biClrUsed : 0;
- break;
-
- case( 16 ):
- case( 32 ):
- {
- nColEntries = pBIH->biClrUsed;
-
- if( pBIH->biCompression == BI_BITFIELDS )
- nColEntries += 3;
- }
- break;
-
- default:
- nColEntries = 0;
- break;
- }
-
- aRet = SEQ( sal_Int8 )( sizeof( BITMAPFILEHEADER ) + nDIBSize );
-
- sal_Int8* pBuf = aRet.getArray();
- SvMemoryStream* pMemStm = new SvMemoryStream( (char*) pBuf, sizeof( BITMAPFILEHEADER ), STREAM_WRITE );
-
- *pMemStm << 'B' << 'M' << (sal_uInt32) 0 << (sal_uInt32) 0;
- *pMemStm << (sal_uInt32) ( sizeof( BITMAPFILEHEADER ) + pBIH->biSize + ( nColEntries * sizeof( RGBQUAD ) ) );
-
- delete pMemStm;
- memcpy( pBuf + sizeof( BITMAPFILEHEADER ), pBIH, nDIBSize );
- }
-
- GlobalUnlock( hDIB );
- ReleaseData();
- }
-
- return aRet;
-}
-
-// -----------------------------------------------------------------------------
-
-SEQ( ScannerContext ) SAL_CALL ScannerManager::getAvailableScanners() throw()
-{
- osl::MutexGuard aGuard( maProtector );
- SEQ( ScannerContext ) aRet( 1 );
-
- aRet.getArray()[0].ScannerName = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "TWAIN" ) );
- aRet.getArray()[0].InternalData = 0;
-
- return aRet;
-}
-
-// -----------------------------------------------------------------------------
-
-sal_Bool SAL_CALL ScannerManager::configureScanner( ScannerContext& rContext )
- throw( ScannerException )
-{
- osl::MutexGuard aGuard( maProtector );
- uno::Reference< XScannerManager > xThis( this );
-
- if( rContext.InternalData != 0 || rContext.ScannerName != ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "TWAIN" ) ) )
- throw ScannerException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Scanner does not exist" ) ), xThis, ScanError_InvalidContext );
-
- ReleaseData();
-
- return aTwain.SelectSource( *this );
-}
-
-// -----------------------------------------------------------------------------
-
-void SAL_CALL ScannerManager::startScan( const ScannerContext& rContext, const uno::Reference< lang::XEventListener >& rxListener )
- throw( ScannerException )
-{
- osl::MutexGuard aGuard( maProtector );
- uno::Reference< XScannerManager > xThis( this );
-
- if( rContext.InternalData != 0 || rContext.ScannerName != ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "TWAIN" ) ) )
- throw ScannerException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Scanner does not exist" ) ), xThis, ScanError_InvalidContext );
-
- ReleaseData();
- aTwain.PerformTransfer( *this, rxListener );
-}
-
-// -----------------------------------------------------------------------------
-
-ScanError SAL_CALL ScannerManager::getError( const ScannerContext& rContext )
- throw( ScannerException )
-{
- osl::MutexGuard aGuard( maProtector );
- uno::Reference< XScannerManager > xThis( this );
-
- if( rContext.InternalData != 0 || rContext.ScannerName != ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "TWAIN" ) ) )
- throw ScannerException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Scanner does not exist" ) ), xThis, ScanError_InvalidContext );
-
- return( ( aTwain.GetState() == TWAIN_STATE_CANCELED ) ? ScanError_ScanCanceled : ScanError_ScanErrorNone );
-}
-
-// -----------------------------------------------------------------------------
-
-uno::Reference< awt::XBitmap > SAL_CALL ScannerManager::getBitmap( const ScannerContext& /*rContext*/ )
- throw( ScannerException )
-{
- osl::MutexGuard aGuard( maProtector );
- return uno::Reference< awt::XBitmap >( this );
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */