2010-10-12 15:53:47 +02:00
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2012-11-12 17:21:24 +00:00
/*
* This file is part of the LibreOffice project .
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License , v . 2.0 . If a copy of the MPL was not distributed with this
* file , You can obtain one at http : //mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice :
*
* Licensed to the Apache Software Foundation ( ASF ) under one or more
* contributor license agreements . See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership . The ASF licenses this file to you under the Apache
* License , Version 2.0 ( the " License " ) ; you may not use this file
* except in compliance with the License . You may obtain a copy of
* the License at http : //www.apache.org/licenses/LICENSE-2.0 .
*/
2004-01-28 13:29:18 +00:00
# include <dispatch/loaddispatcher.hxx>
# include <threadhelp/readguard.hxx>
# include <threadhelp/writeguard.hxx>
# include <com/sun/star/frame/DispatchResultState.hpp>
namespace framework {
2013-05-21 17:38:02 +02:00
LoadDispatcher : : LoadDispatcher ( const css : : uno : : Reference < css : : uno : : XComponentContext > & xContext ,
const css : : uno : : Reference < css : : frame : : XFrame > & xOwnerFrame ,
2013-04-07 12:06:47 +02:00
const OUString sTargetName ,
2004-01-28 13:29:18 +00:00
sal_Int32 nSearchFlags )
: ThreadHelpBase ( )
2013-05-21 17:38:02 +02:00
, m_xContext ( xContext )
2004-01-28 13:29:18 +00:00
, m_xOwnerFrame ( xOwnerFrame )
, m_sTarget ( sTargetName )
, m_nSearchFlags ( nSearchFlags )
2013-05-21 17:38:02 +02:00
, m_aLoader ( xContext )
2004-01-28 13:29:18 +00:00
{
}
LoadDispatcher : : ~ LoadDispatcher ( )
{
2013-05-21 17:38:02 +02:00
m_xContext . clear ( ) ;
2004-01-28 13:29:18 +00:00
}
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 ) ;
}
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 > ( ) ) ;
}
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 > ( ) ) ;
}
void SAL_CALL LoadDispatcher : : addStatusListener ( const css : : uno : : Reference < css : : frame : : XStatusListener > & /*xListener*/ ,
const css : : util : : URL & /*aURL*/ )
throw ( css : : uno : : RuntimeException )
{
}
void SAL_CALL LoadDispatcher : : removeStatusListener ( const css : : uno : : Reference < css : : frame : : XStatusListener > & /*xListener*/ ,
const css : : util : : URL & /*aURL*/ )
throw ( css : : uno : : RuntimeException )
{
}
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
}
2013-08-20 17:58:20 +02:00
catch ( const LoadEnvException & e )
{
SAL_WARN (
" fwk.dispatch " ,
" caught LoadEnvException " < < + e . m_nID < < " \" " < < e . m_sMessage
< < " \" "
< < ( e . m_exOriginal . has < css : : uno : : Exception > ( )
? ( " , " + e . m_exOriginal . getValueTypeName ( ) + " \" "
+ e . m_exOriginal . get < css : : uno : : Exception > ( ) . Message
+ " \" " )
: OUString ( ) )
< < " while dispatching < " < < rURL . Complete < < " > " ) ;
xComponent . clear ( ) ;
}
2004-03-08 15:16:39 +00:00
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: */