office-gobmx/configmgr/source/inc/bootstrapcontext.hxx
Rüdiger Timm 4ba19843f2 INTEGRATION: CWS sb88 (1.8.10); FILE MERGED
2008/06/03 15:29:48 sb 1.8.10.1: #i89553 applied patch by cmc
2008-06-16 12:43:19 +00:00

185 lines
7 KiB
C++

/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2008 by Sun Microsystems, Inc.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: bootstrapcontext.hxx,v $
* $Revision: 1.9 $
*
* 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.
*
************************************************************************/
#ifndef CONFIGMGR_BOOTSTRAPCONTEXT_HXX_
#define CONFIGMGR_BOOTSTRAPCONTEXT_HXX_
#include <cppuhelper/compbase3.hxx>
#include <cppuhelper/implbase1.hxx>
#include <rtl/bootstrap.h>
#include <com/sun/star/uno/XComponentContext.hpp>
#include <com/sun/star/uno/XCurrentContext.hpp>
#include <com/sun/star/lang/XEventListener.hpp>
#include <com/sun/star/lang/XUnoTunnel.hpp>
#include <com/sun/star/beans/NamedValue.hpp>
#include <com/sun/star/uno/Sequence.hxx>
#include <com/sun/star/lang/XServiceInfo.hpp>
namespace com { namespace sun { namespace star { namespace uno {
class XComponentContext;
} } } }
// -----------------------------------------------------------------------------
#define SINGLETON_ "/singletons/"
#define SINGLETON( NAME ) OUString( RTL_CONSTASCII_USTRINGPARAM( SINGLETON_ NAME ) )
// -----------------------------------------------------------------------------
namespace configmgr
{
// -----------------------------------------------------------------------------
namespace uno = ::com::sun::star::uno;
namespace lang = ::com::sun::star::lang;
namespace beans = ::com::sun::star::beans;
using ::rtl::OUString;
// -----------------------------------------------------------------------------
typedef ::cppu::WeakComponentImplHelper3 <
uno::XComponentContext,
uno::XCurrentContext,
lang::XServiceInfo
> ComponentContext_Base;
/** Base class for customized ComponentContext using bootstrap data and overrides
*/
class ComponentContext : public ComponentContext_Base
{
public:
typedef uno::Reference< uno::XComponentContext > Context;
typedef uno::Reference< lang::XMultiComponentFactory > ServiceManager;
// creation and destruction
public:
/** Constructs a ComponentContext based on the given overrides and context.
Initially no bootstrap data will be used.
@param _xContext
The base context of this component context.
Values from here take precedence over values from bootstrap data.
@param _aOverrides
The overrides used to create this component context.
These values take precedence over values from the base context or bootstrap data.
*/
explicit
ComponentContext(Context const & _xContext);
/// Destroys this BootstrapContext
~ComponentContext();
// gets the INI in use for getting bootstrap data
OUString getBootstrapURL() const;
static sal_Bool isPassthrough(Context const & _xContext);
static beans::NamedValue makePassthroughMarker(sal_Bool bPassthrough = true);
// interface implementations
public:
// XComponentContext only
virtual ServiceManager SAL_CALL
getServiceManager( )
throw (uno::RuntimeException);
protected:
// ComponentHelper
virtual void SAL_CALL disposing();
protected:
// two phase construct - also initialized the bootstrap data
void initialize(const OUString& _aBootstrapURL);
bool lookupInContext ( uno::Any & _rValue, const OUString& _aName ) const;
bool lookupInBootstrap( uno::Any & _rValue, const OUString& _aName ) const;
Context const & basecontext() const { return m_xContext; }
private:
/// The context that most requests are delegated to
Context m_xContext;
/// The bootstrap data consulted as fallback
rtlBootstrapHandle m_hBootstrapData;
/// The service manager associated with this context
ServiceManager m_xServiceManager;
};
// -----------------------------------------------------------------------------
class UnoContextTunnel
{
public:
typedef uno::Reference< uno::XCurrentContext > CurrentContext;
typedef uno::Reference< lang::XUnoTunnel > FailureTunnel;
typedef uno::Reference< uno::XComponentContext > Context;
public:
UnoContextTunnel();
~UnoContextTunnel();
void tunnel(Context const & xContext);
void passthru(Context const & xContext);
uno::Any recoverFailure(bool bRaise); // true, if there is a failure
static Context recoverContext(Context const & xFallback = Context());
static bool tunnelFailure(uno::Any const & aException, bool bRaise = false);
private:
CurrentContext m_xOldContext;
FailureTunnel m_xActiveTunnel;
class Tunnel;
};
// -----------------------------------------------------------------------------
class DisposingForwarder : public cppu::WeakImplHelper1< lang::XEventListener >
{
uno::Reference< lang::XComponent > m_xTarget;
DisposingForwarder( uno::Reference< lang::XComponent > const & xTarget ) SAL_THROW( () )
: m_xTarget( xTarget )
{ OSL_ASSERT( m_xTarget.is() ); }
virtual void SAL_CALL disposing( lang::EventObject const & rSource )
throw (uno::RuntimeException);
public:
// listens at source for disposing, then disposes target
static inline void forward(
uno::Reference< lang::XComponent > const & xSource,
uno::Reference< lang::XComponent > const & xTarget )
SAL_THROW( (uno::RuntimeException) );
};
//__________________________________________________________________________________________________
inline void DisposingForwarder::forward(
uno::Reference< lang::XComponent > const & xSource,
uno::Reference< lang::XComponent > const & xTarget )
SAL_THROW( (uno::RuntimeException) )
{
if (xSource.is())
{
xSource->addEventListener( new DisposingForwarder( xTarget ) );
}
}
// -----------------------------------------------------------------------------
} // namespace configmgr
#endif