2000-10-25 12:00:01 +00:00
/*************************************************************************
*
2008-04-10 15:53:58 +00:00
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER .
2000-10-25 12:00:01 +00:00
*
2008-04-10 15:53:58 +00:00
* Copyright 2008 by Sun Microsystems , Inc .
2000-10-25 12:00:01 +00:00
*
2008-04-10 15:53:58 +00:00
* OpenOffice . org - a multi - platform office productivity suite
2000-10-25 12:00:01 +00:00
*
2008-04-10 15:53:58 +00:00
* $ RCSfile : dbinteraction . cxx , v $
* $ Revision : 1.18 $
2000-10-25 12:00:01 +00:00
*
2008-04-10 15:53:58 +00:00
* This file is part of OpenOffice . org .
2000-10-25 12:00:01 +00:00
*
2008-04-10 15:53:58 +00:00
* 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 .
2000-10-25 12:00:01 +00:00
*
2008-04-10 15:53:58 +00:00
* 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 ) .
2000-10-25 12:00:01 +00:00
*
2008-04-10 15:53:58 +00:00
* 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 .
2000-10-25 12:00:01 +00:00
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2006-09-17 06:34:07 +00:00
// MARKER(update_precomp.py): autogen include statement, do not remove
# include "precompiled_dbaccess.hxx"
2000-10-25 12:00:01 +00:00
# ifndef _DBAUI_INTERACTION_HXX_
# include "dbinteraction.hxx"
# endif
2000-12-15 14:54:12 +00:00
# ifndef _DBU_REGHELPER_HXX_
# include "dbu_reghelper.hxx"
2000-10-25 12:00:01 +00:00
# endif
# ifndef _TOOLS_DEBUG_HXX
# include <tools/debug.hxx>
# endif
2008-03-06 17:30:56 +00:00
# ifndef TOOLS_DIAGNOSE_EX_H
# include <tools/diagnose_ex.h>
# endif
2000-10-25 12:00:01 +00:00
# ifndef _SV_MSGBOX_HXX
# include <vcl/msgbox.hxx>
# endif
# ifndef _DBHELPER_DBEXCEPTION_HXX_
# include <connectivity/dbexception.hxx>
# endif
# ifndef _DBAUI_SQLMESSAGE_HXX_
# include "sqlmessage.hxx"
# endif
# ifndef _COM_SUN_STAR_TASK_XINTERACTIONAPPROVE_HPP_
# include <com/sun/star/task/XInteractionApprove.hpp>
# endif
# ifndef _COM_SUN_STAR_TASK_XINTERACTIONDISAPPROVE_HPP_
# include <com/sun/star/task/XInteractionDisapprove.hpp>
# endif
# ifndef _COM_SUN_STAR_TASK_XINTERACTIONRETRY_HPP_
# include <com/sun/star/task/XInteractionRetry.hpp>
# endif
# ifndef _COM_SUN_STAR_TASK_XINTERACTIONABORT_HPP_
# include <com/sun/star/task/XInteractionAbort.hpp>
# endif
2000-10-26 17:08:16 +00:00
# ifndef _COM_SUN_STAR_SDB_XINTERACTIONSUPPLYPARAMETERS_HPP_
# include <com/sun/star/sdb/XInteractionSupplyParameters.hpp>
# endif
2004-08-02 15:23:14 +00:00
# ifndef _COM_SUN_STAR_SDB_XINTERACTIONDOCUMENTSAVE_HPP_
# include <com/sun/star/sdb/XInteractionDocumentSave.hpp>
# endif
2000-10-25 12:00:01 +00:00
# ifndef _SVTOOLS_LOGINDLG_HXX_
# include <svtools/logindlg.hxx>
# endif
2004-11-17 13:54:05 +00:00
# ifndef SFX_QUERYSAVEDOCUMENT_HXX
# include <sfx2/QuerySaveDocument.hxx>
# endif
2002-08-19 07:01:32 +00:00
# ifndef _DBU_UNO_HRC_
# include "dbu_uno.hrc"
2000-10-25 12:00:01 +00:00
# endif
2000-10-26 17:08:16 +00:00
# ifndef _DBAUI_PARAMDIALOG_HXX_
# include "paramdialog.hxx"
# endif
2001-05-17 08:09:44 +00:00
# ifndef _SV_SVAPP_HXX
# include <vcl/svapp.hxx>
# endif
# ifndef _VOS_MUTEX_HXX_
# include <vos/mutex.hxx>
# endif
2004-08-02 15:23:14 +00:00
# ifndef DBAUI_COLLECTIONVIEW_HXX
# include "CollectionView.hxx"
# endif
2005-03-10 15:55:44 +00:00
# ifndef DBAUI_TOOLS_HXX
# include "UITools.hxx"
# endif
2000-10-25 12:00:01 +00:00
//==========================================================================
extern " C " void SAL_CALL createRegistryInfo_OInteractionHandler ( )
{
2000-12-15 14:54:12 +00:00
static : : dbaui : : OMultiInstanceAutoRegistration < : : dbaui : : OInteractionHandler > aOInteractionHandler_AutoRegistration ;
2000-10-25 12:00:01 +00:00
}
//.........................................................................
namespace dbaui
{
//.........................................................................
using namespace : : com : : sun : : star : : uno ;
using namespace : : com : : sun : : star : : ucb ;
2000-10-26 17:08:16 +00:00
using namespace : : com : : sun : : star : : sdb ;
2000-10-25 12:00:01 +00:00
using namespace : : com : : sun : : star : : lang ;
using namespace : : com : : sun : : star : : task ;
2000-10-26 17:08:16 +00:00
using namespace : : com : : sun : : star : : beans ;
2000-10-25 12:00:01 +00:00
using namespace : : dbtools ;
//=========================================================================
//= OInteractionHandler
//=========================================================================
//-------------------------------------------------------------------------
OInteractionHandler : : OInteractionHandler ( const Reference < XMultiServiceFactory > & _rxORB )
: m_xORB ( _rxORB )
{
}
//-------------------------------------------------------------------------
2001-01-05 11:16:07 +00:00
IMPLEMENT_SERVICE_INFO1_STATIC ( OInteractionHandler , " com.sun.star.comp.dbu.OInteractionHandler " , " com.sun.star.sdb.InteractionHandler " ) ;
2000-10-25 12:00:01 +00:00
//-------------------------------------------------------------------------
void SAL_CALL OInteractionHandler : : handle ( const Reference < XInteractionRequest > & _rxRequest ) throw ( RuntimeException )
{
Any aRequest ;
if ( _rxRequest . is ( ) )
{
try { aRequest = _rxRequest - > getRequest ( ) ; }
catch ( RuntimeException & ) { }
}
DBG_ASSERT ( aRequest . hasValue ( ) , " OInteractionHandler::handle: invalid request! " ) ;
if ( ! aRequest . hasValue ( ) )
// no request -> no handling
return ;
Sequence < Reference < XInteractionContinuation > > aContinuations ;
try { aContinuations = _rxRequest - > getContinuations ( ) ; }
catch ( RuntimeException & ) { }
// try to extract an SQLException (or one of it's derived members
SQLExceptionInfo aInfo ( aRequest ) ;
if ( aInfo . isValid ( ) )
{
implHandle ( aInfo , aContinuations ) ;
return ;
}
2000-10-26 17:08:16 +00:00
ParametersRequest aParamRequest ;
if ( aRequest > > = aParamRequest )
2008-03-06 17:30:56 +00:00
{ // it's an authentication request
2000-10-26 17:08:16 +00:00
implHandle ( aParamRequest , aContinuations ) ;
return ;
}
2004-08-02 15:23:14 +00:00
DocumentSaveRequest aDocuRequest ;
if ( aRequest > > = aDocuRequest )
{ // it's an document request
implHandle ( aDocuRequest , aContinuations ) ;
return ;
}
2005-01-21 16:21:42 +00:00
OSL_VERIFY ( implHandleUnknown ( _rxRequest ) ) ;
2000-10-25 12:00:01 +00:00
}
2000-10-26 17:08:16 +00:00
//-------------------------------------------------------------------------
void OInteractionHandler : : implHandle ( const ParametersRequest & _rParamRequest , const Sequence < Reference < XInteractionContinuation > > & _rContinuations )
{
2001-05-17 08:09:44 +00:00
: : vos : : OGuard aGuard ( Application : : GetSolarMutex ( ) ) ;
// want to open a dialog ....
2000-10-26 17:08:16 +00:00
sal_Int32 nAbortPos = getContinuation ( ABORT , _rContinuations ) ;
sal_Int32 nParamPos = getContinuation ( SUPPLY_PARAMETERS , _rContinuations ) ;
Reference < XInteractionSupplyParameters > xParamCallback ;
if ( - 1 ! = nParamPos )
xParamCallback = Reference < XInteractionSupplyParameters > ( _rContinuations [ nParamPos ] , UNO_QUERY ) ;
DBG_ASSERT ( xParamCallback . is ( ) , " OInteractionHandler::implHandle(ParametersRequest): can't set the parameters without an appropriate interaction handler!s " ) ;
// determine the style of the dialog, dependent on the present continuation types
WinBits nDialogStyle = WB_OK | WB_DEF_OK ;
if ( - 1 ! = nAbortPos )
nDialogStyle = WB_OK_CANCEL ;
OParameterDialog aDlg ( NULL , _rParamRequest . Parameters , _rParamRequest . Connection , m_xORB ) ;
sal_Int16 nResult = aDlg . Execute ( ) ;
try
{
switch ( nResult )
{
case RET_OK :
if ( xParamCallback . is ( ) )
{
xParamCallback - > setParameters ( aDlg . getValues ( ) ) ;
xParamCallback - > select ( ) ;
}
break ;
default :
if ( - 1 ! = nAbortPos )
_rContinuations [ nAbortPos ] - > select ( ) ;
break ;
}
}
catch ( RuntimeException & )
{
DBG_ERROR ( " OInteractionHandler::implHandle(ParametersRequest): caught a RuntimeException while calling the continuation callback! " ) ;
}
}
2000-10-25 12:00:01 +00:00
//-------------------------------------------------------------------------
void OInteractionHandler : : implHandle ( const SQLExceptionInfo & _rSqlInfo , const Sequence < Reference < XInteractionContinuation > > & _rContinuations )
{
2001-05-17 08:09:44 +00:00
: : vos : : OGuard aGuard ( Application : : GetSolarMutex ( ) ) ;
// want to open a dialog ....
2000-10-25 12:00:01 +00:00
sal_Int32 nApprovePos = getContinuation ( APPROVE , _rContinuations ) ;
2008-01-30 07:56:49 +00:00
sal_Int32 nDisapprovePos = getContinuation ( DISAPPROVE , _rContinuations ) ;
2000-10-25 12:00:01 +00:00
sal_Int32 nAbortPos = getContinuation ( ABORT , _rContinuations ) ;
sal_Int32 nRetryPos = getContinuation ( RETRY , _rContinuations ) ;
2008-01-30 07:56:49 +00:00
2000-10-26 17:08:16 +00:00
// determine the style of the dialog, dependent on the present continuation types
2008-01-30 07:56:49 +00:00
WinBits nDialogStyle = 0 ;
bool bHaveCancel = nAbortPos ! = - 1 ;
// "approve" means "Yes", "disapprove" means "No"
// VCL only supports having both (which makes sense ...)
if ( ( nApprovePos ! = - 1 ) | | ( nDisapprovePos ! = - 1 ) )
nDialogStyle = ( bHaveCancel ? WB_YES_NO_CANCEL : WB_YES_NO ) | WB_DEF_YES ;
else
{
// if there's no yes/no, then use a default OK button
nDialogStyle = ( bHaveCancel ? WB_OK_CANCEL : WB_OK ) | WB_DEF_OK ;
}
// If there's a "Retry" continuation, have a "Retry" button
if ( nRetryPos ! = - 1 )
{
nDialogStyle = WB_RETRY_CANCEL | WB_DEF_RETRY ;
}
2000-10-25 12:00:01 +00:00
// excute the dialog
OSQLMessageBox aDialog ( NULL , _rSqlInfo , nDialogStyle ) ;
// TODO: need a way to specify the parent window
sal_Int16 nResult = aDialog . Execute ( ) ;
try
{
switch ( nResult )
{
2008-01-30 07:56:49 +00:00
case RET_YES :
2000-10-25 12:00:01 +00:00
case RET_OK :
2008-01-30 07:56:49 +00:00
if ( nApprovePos ! = - 1 )
_rContinuations [ nApprovePos ] - > select ( ) ;
else
OSL_ENSURE ( nResult ! = RET_YES , " OInteractionHandler::implHandle: no handler for YES! " ) ;
break ;
case RET_NO :
if ( nDisapprovePos ! = - 1 )
_rContinuations [ nDisapprovePos ] - > select ( ) ;
else
OSL_ENSURE ( false , " OInteractionHandler::implHandle: no handler for NO! " ) ;
2000-10-25 12:00:01 +00:00
break ;
2008-01-30 07:56:49 +00:00
2000-10-25 12:00:01 +00:00
case RET_CANCEL :
2008-01-30 07:56:49 +00:00
if ( nAbortPos ! = - 1 )
_rContinuations [ nAbortPos ] - > select ( ) ;
else if ( nDisapprovePos ! = - 1 )
_rContinuations [ nDisapprovePos ] - > select ( ) ;
else
OSL_ENSURE ( false , " OInteractionHandler::implHandle: no handler for CANCEL! " ) ;
2000-10-25 12:00:01 +00:00
break ;
case RET_RETRY :
2008-01-30 07:56:49 +00:00
if ( nRetryPos ! = - 1 )
_rContinuations [ nRetryPos ] - > select ( ) ;
else
OSL_ENSURE ( false , " OInteractionHandler::implHandle: where does the RETRY come from? " ) ;
2000-10-25 12:00:01 +00:00
break ;
}
}
2008-03-06 17:30:56 +00:00
catch ( const Exception & )
2000-10-25 12:00:01 +00:00
{
2008-03-06 17:30:56 +00:00
DBG_UNHANDLED_EXCEPTION ( ) ;
2000-10-25 12:00:01 +00:00
}
}
2004-08-02 15:23:14 +00:00
//-------------------------------------------------------------------------
void OInteractionHandler : : implHandle ( const DocumentSaveRequest & _rDocuRequest , const Sequence < Reference < XInteractionContinuation > > & _rContinuations )
{
: : vos : : OGuard aGuard ( Application : : GetSolarMutex ( ) ) ;
// want to open a dialog ....
sal_Int32 nApprovePos = getContinuation ( APPROVE , _rContinuations ) ;
sal_Int32 nDisApprovePos = getContinuation ( DISAPPROVE , _rContinuations ) ;
sal_Int32 nAbortPos = getContinuation ( ABORT , _rContinuations ) ;
short nRet = RET_YES ;
if ( - 1 ! = nApprovePos )
{
// fragen, ob gespeichert werden soll
2004-11-17 13:54:05 +00:00
nRet = ExecuteQuerySaveDocument ( NULL , _rDocuRequest . Name ) ;
2004-08-02 15:23:14 +00:00
}
if ( RET_CANCEL = = nRet )
{
if ( - 1 ! = nAbortPos )
_rContinuations [ nAbortPos ] - > select ( ) ;
return ;
}
else if ( RET_YES = = nRet )
{
sal_Int32 nDocuPos = getContinuation ( SUPPLY_DOCUMENTSAVE , _rContinuations ) ;
if ( - 1 ! = nDocuPos )
{
Reference < XInteractionDocumentSave > xCallback ( _rContinuations [ nDocuPos ] , UNO_QUERY ) ;
DBG_ASSERT ( xCallback . is ( ) , " OInteractionHandler::implHandle(DocumentSaveRequest): can't save document without an appropriate interaction handler!s " ) ;
// determine the style of the dialog, dependent on the present continuation types
WinBits nDialogStyle = WB_OK | WB_DEF_OK ;
if ( - 1 ! = nAbortPos )
nDialogStyle = WB_OK_CANCEL ;
OCollectionView aDlg ( NULL , _rDocuRequest . Content , _rDocuRequest . Name , m_xORB ) ;
sal_Int16 nResult = aDlg . Execute ( ) ;
try
{
switch ( nResult )
{
case RET_OK :
if ( xCallback . is ( ) )
{
xCallback - > setName ( aDlg . getName ( ) , aDlg . getSelectedFolder ( ) ) ;
xCallback - > select ( ) ;
}
break ;
default :
if ( - 1 ! = nAbortPos )
_rContinuations [ nAbortPos ] - > select ( ) ;
break ;
}
}
catch ( RuntimeException & )
{
DBG_ERROR ( " OInteractionHandler::implHandle(DocumentSaveRequest): caught a RuntimeException while calling the continuation callback! " ) ;
}
}
else if ( - 1 ! = nApprovePos )
_rContinuations [ nApprovePos ] - > select ( ) ;
}
else if ( - 1 ! = nDisApprovePos )
_rContinuations [ nDisApprovePos ] - > select ( ) ;
}
2000-10-25 12:00:01 +00:00
2005-01-21 16:21:42 +00:00
//-------------------------------------------------------------------------
bool OInteractionHandler : : implHandleUnknown ( const Reference < XInteractionRequest > & _rxRequest )
{
Reference < XInteractionHandler > xFallbackHandler ;
if ( m_xORB . is ( ) )
xFallbackHandler = xFallbackHandler . query ( m_xORB - > createInstance ( : : rtl : : OUString ( RTL_CONSTASCII_USTRINGPARAM ( " com.sun.star.task.InteractionHandler " ) ) ) ) ;
if ( xFallbackHandler . is ( ) )
{
xFallbackHandler - > handle ( _rxRequest ) ;
return true ;
}
return false ;
}
2000-10-25 12:00:01 +00:00
//-------------------------------------------------------------------------
sal_Int32 OInteractionHandler : : getContinuation ( Continuation _eCont , const Sequence < Reference < XInteractionContinuation > > & _rContinuations )
{
const Reference < XInteractionContinuation > * pContinuations = _rContinuations . getConstArray ( ) ;
for ( sal_Int32 i = 0 ; i < _rContinuations . getLength ( ) ; + + i , + + pContinuations )
{
switch ( _eCont )
{
case APPROVE :
if ( Reference < XInteractionApprove > ( * pContinuations , UNO_QUERY ) . is ( ) )
return i ;
break ;
case DISAPPROVE :
if ( Reference < XInteractionDisapprove > ( * pContinuations , UNO_QUERY ) . is ( ) )
return i ;
break ;
case RETRY :
if ( Reference < XInteractionRetry > ( * pContinuations , UNO_QUERY ) . is ( ) )
return i ;
break ;
case ABORT :
if ( Reference < XInteractionAbort > ( * pContinuations , UNO_QUERY ) . is ( ) )
return i ;
break ;
2000-10-26 17:08:16 +00:00
case SUPPLY_PARAMETERS :
if ( Reference < XInteractionSupplyParameters > ( * pContinuations , UNO_QUERY ) . is ( ) )
return i ;
break ;
2004-08-02 15:23:14 +00:00
case SUPPLY_DOCUMENTSAVE :
if ( Reference < XInteractionDocumentSave > ( * pContinuations , UNO_QUERY ) . is ( ) )
return i ;
break ;
2000-10-25 12:00:01 +00:00
}
}
return - 1 ;
}
//.........................................................................
} // namespace dbaui
//.........................................................................