2010-10-12 15:53:47 +02:00
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2004-01-28 13:29:18 +00:00
/*************************************************************************
*
2008-04-11 07:25:31 +00:00
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER .
2004-01-28 13:29:18 +00:00
*
2010-02-12 15:01:35 +01:00
* Copyright 2000 , 2010 Oracle and / or its affiliates .
2004-01-28 13:29:18 +00:00
*
2008-04-11 07:25:31 +00:00
* OpenOffice . org - a multi - platform office productivity suite
2004-01-28 13:29:18 +00:00
*
2008-04-11 07:25:31 +00:00
* This file is part of OpenOffice . org .
2004-01-28 13:29:18 +00:00
*
2008-04-11 07:25:31 +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 .
2004-01-28 13:29:18 +00:00
*
2008-04-11 07:25:31 +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 ) .
2004-01-28 13:29:18 +00:00
*
2008-04-11 07:25:31 +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 .
2004-01-28 13:29:18 +00:00
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2006-09-16 12:55:00 +00:00
// MARKER(update_precomp.py): autogen include statement, do not remove
# include "precompiled_framework.hxx"
2004-01-28 13:29:18 +00:00
//_______________________________________________
// my own includes
# include <dispatch/loaddispatcher.hxx>
# include <threadhelp/readguard.hxx>
# include <threadhelp/writeguard.hxx>
//_______________________________________________
// interface includes
# include <com/sun/star/frame/DispatchResultState.hpp>
//_______________________________________________
// includes of other projects
//_______________________________________________
// namespace
namespace framework {
namespace css = : : com : : sun : : star ;
//_______________________________________________
// declarations
/*-----------------------------------------------
20.08 .2003 09 : 52
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
LoadDispatcher : : LoadDispatcher ( const css : : uno : : Reference < css : : lang : : XMultiServiceFactory > & xSMGR ,
const css : : uno : : Reference < css : : frame : : XFrame > & xOwnerFrame ,
const : : rtl : : OUString sTargetName ,
sal_Int32 nSearchFlags )
: ThreadHelpBase ( )
, m_xSMGR ( xSMGR )
, m_xOwnerFrame ( xOwnerFrame )
, m_sTarget ( sTargetName )
, m_nSearchFlags ( nSearchFlags )
2006-06-19 10:16:12 +00:00
, m_aLoader ( xSMGR )
2004-01-28 13:29:18 +00:00
{
}
/*-----------------------------------------------
20.08 .2003 09 : 12
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
LoadDispatcher : : ~ LoadDispatcher ( )
{
m_xSMGR . clear ( ) ;
}
/*-----------------------------------------------
20.08 .2003 09 : 58
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
void SAL_CALL LoadDispatcher : : dispatchWithNotification ( const css : : util : : URL & aURL ,
const css : : uno : : Sequence < css : : beans : : PropertyValue > & lArguments ,
const css : : uno : : Reference < css : : frame : : XDispatchResultListener > & xListener )
throw ( css : : uno : : RuntimeException )
2008-05-15 08:04:48 +00:00
{
impl_dispatch ( aURL , lArguments , xListener ) ;
}
/*-----------------------------------------------
20.08 .2003 09 : 16
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
void SAL_CALL LoadDispatcher : : dispatch ( const css : : util : : URL & aURL ,
const css : : uno : : Sequence < css : : beans : : PropertyValue > & lArguments )
throw ( css : : uno : : RuntimeException )
{
impl_dispatch ( aURL , lArguments , css : : uno : : Reference < css : : frame : : XDispatchResultListener > ( ) ) ;
}
/*-----------------------------------------------
14.04 .2008
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
css : : uno : : Any SAL_CALL LoadDispatcher : : dispatchWithReturnValue ( const css : : util : : URL & rURL ,
const css : : uno : : Sequence < css : : beans : : PropertyValue > & lArguments )
throw ( css : : uno : : RuntimeException )
{
return impl_dispatch ( rURL , lArguments , css : : uno : : Reference < css : : frame : : XDispatchResultListener > ( ) ) ;
}
/*-----------------------------------------------
20.08 .2003 10 : 48
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
void SAL_CALL LoadDispatcher : : addStatusListener ( const css : : uno : : Reference < css : : frame : : XStatusListener > & /*xListener*/ ,
const css : : util : : URL & /*aURL*/ )
throw ( css : : uno : : RuntimeException )
{
}
/*-----------------------------------------------
20.08 .2003 10 : 49
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
void SAL_CALL LoadDispatcher : : removeStatusListener ( const css : : uno : : Reference < css : : frame : : XStatusListener > & /*xListener*/ ,
const css : : util : : URL & /*aURL*/ )
throw ( css : : uno : : RuntimeException )
{
}
/*-----------------------------------------------
20.08 .2003 09 : 58
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
css : : uno : : Any LoadDispatcher : : impl_dispatch ( const css : : util : : URL & rURL ,
const css : : uno : : Sequence < css : : beans : : PropertyValue > & lArguments ,
const css : : uno : : Reference < css : : frame : : XDispatchResultListener > & xListener )
2004-01-28 13:29:18 +00:00
{
// Attention: May be nobody outside hold such temp. dispatch object alive (because
// the container in which we resists isnt implemented threadsafe but updated by a timer
// and clear our reference ...) we should hold us self alive!
css : : uno : : Reference < css : : uno : : XInterface > xThis ( static_cast < css : : frame : : XNotifyingDispatch * > ( this ) , css : : uno : : UNO_QUERY ) ;
// SAFE -> ----------------------------------
ReadGuard aReadLock ( m_aLock ) ;
// We are the only client of this load env object ... but
// may a dispatch request before is still in progress (?!).
// Then we should wait a little bit and block this new request.
// In case we run into the timeout, we should reject this new request
// and return "FAILED" as result. Otherwhise we can start this new operation.
if ( ! m_aLoader . waitWhileLoading ( 2000 ) ) // => 2 sec.
{
if ( xListener . is ( ) )
xListener - > dispatchFinished (
css : : frame : : DispatchResultEvent ( xThis , css : : frame : : DispatchResultState : : DONTKNOW , css : : uno : : Any ( ) ) ) ; // DONTKNOW? ... not realy started ... not realy failed :-)
}
css : : uno : : Reference < css : : frame : : XFrame > xBaseFrame ( m_xOwnerFrame . get ( ) , css : : uno : : UNO_QUERY ) ;
if ( ! xBaseFrame . is ( ) )
{
if ( xListener . is ( ) )
xListener - > dispatchFinished (
css : : frame : : DispatchResultEvent ( xThis , css : : frame : : DispatchResultState : : FAILURE , css : : uno : : Any ( ) ) ) ;
}
// OK ... now the internal loader seems to be useable for new requests
// and our owner frame seems to be valid for such operations.
// Initialize it with all new but needed properties and start the loading.
2004-03-08 15:16:39 +00:00
css : : uno : : Reference < css : : lang : : XComponent > xComponent ;
2004-01-28 13:29:18 +00:00
try
{
2008-05-15 08:04:48 +00:00
m_aLoader . initializeLoading ( rURL . Complete , lArguments , xBaseFrame , m_sTarget , m_nSearchFlags , ( LoadEnv : : EFeature ) ( LoadEnv : : E_ALLOW_CONTENTHANDLER | LoadEnv : : E_WORK_WITH_UI ) ) ;
2004-01-28 13:29:18 +00:00
m_aLoader . startLoading ( ) ;
2004-03-08 15:16:39 +00:00
m_aLoader . waitWhileLoading ( ) ; // wait for ever!
xComponent = m_aLoader . getTargetComponent ( ) ;
// TODO thinking about asynchronous operations and listener support
2004-01-28 13:29:18 +00:00
}
catch ( const LoadEnvException & )
2004-03-08 15:16:39 +00:00
{ xComponent . clear ( ) ; }
if ( xListener . is ( ) )
2004-01-28 13:29:18 +00:00
{
2004-03-08 15:16:39 +00:00
if ( xComponent . is ( ) )
xListener - > dispatchFinished (
css : : frame : : DispatchResultEvent ( xThis , css : : frame : : DispatchResultState : : SUCCESS , css : : uno : : Any ( ) ) ) ;
else
2004-01-28 13:29:18 +00:00
xListener - > dispatchFinished (
css : : frame : : DispatchResultEvent ( xThis , css : : frame : : DispatchResultState : : FAILURE , css : : uno : : Any ( ) ) ) ;
}
2008-05-15 08:04:48 +00:00
// return the model - like loadComponentFromURL()
css : : uno : : Any aRet ;
if ( xComponent . is ( ) )
aRet = css : : uno : : makeAny ( xComponent ) ;
2004-01-28 13:29:18 +00:00
aReadLock . unlock ( ) ;
// <- SAFE ----------------------------------
2008-05-15 08:04:48 +00:00
return aRet ;
2004-01-28 13:29:18 +00:00
}
} // namespace framework
2010-10-12 15:53:47 +02:00
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */