Kaydet (Commit) db69bd91 authored tarafından Matúš Kukan's avatar Matúš Kukan

fwk: Use constructor feature for ModuleManager.

Change-Id: Ic0bcec6fffc52ed1ce535f87da933bdf01c6db01
üst af96a663
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* 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 .
*/
#ifndef INCLUDED_FRAMEWORK_INC_SERVICES_MODULEMANAGER_HXX
#define INCLUDED_FRAMEWORK_INC_SERVICES_MODULEMANAGER_HXX
#include "sal/config.h"
#include <threadhelp/threadhelpbase.hxx>
#include <boost/noncopyable.hpp>
#include <com/sun/star/lang/XServiceInfo.hpp>
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <com/sun/star/frame/XModuleManager2.hpp>
#include <com/sun/star/container/XNameReplace.hpp>
#include <com/sun/star/container/XContainerQuery.hpp>
#include <com/sun/star/uno/XComponentContext.hpp>
#include <cppuhelper/implbase3.hxx>
namespace com { namespace sun { namespace star { namespace lang {
class XSingleServiceFactory;
} } } }
//_______________________________________________
// definition
namespace framework
{
//_______________________________________________
/**
implements the service com.sun.star.frame.ModuleManager
*/
class ModuleManager:
public cppu::WeakImplHelper3<
css::lang::XServiceInfo,
css::frame::XModuleManager2,
css::container::XContainerQuery >,
private ThreadHelpBase, private boost::noncopyable
{
//___________________________________________
// member
private:
//---------------------------------------
/** the global uno service manager.
Must be used to create own needed services.
*/
css::uno::Reference< css::uno::XComponentContext > m_xContext;
//---------------------------------------
/** points to the underlying configuration.
This ModuleManager does not cache - it calls directly the
configuration API!
*/
css::uno::Reference< css::container::XNameAccess > m_xCFG;
//___________________________________________
// interface
public:
static OUString SAL_CALL impl_getStaticImplementationName();
static css::uno::Reference< css::lang::XSingleServiceFactory > SAL_CALL
impl_createFactory(
css::uno::Reference< css::lang::XMultiServiceFactory > const &
manager);
private:
static css::uno::Sequence< OUString >
impl_getSupportedServiceNames();
static css::uno::Reference< css::uno::XInterface > SAL_CALL
impl_createInstance(
css::uno::Reference< css::lang::XMultiServiceFactory > const &
manager);
ModuleManager(const css::uno::Reference< css::uno::XComponentContext >& xContext);
virtual ~ModuleManager( );
// XServiceInfo
virtual OUString SAL_CALL getImplementationName()
throw (css::uno::RuntimeException);
virtual sal_Bool SAL_CALL supportsService(
OUString const & ServiceName)
throw (css::uno::RuntimeException);
virtual css::uno::Sequence< OUString > SAL_CALL
getSupportedServiceNames() throw (css::uno::RuntimeException);
// XModuleManager
virtual OUString SAL_CALL identify(const css::uno::Reference< css::uno::XInterface >& xModule)
throw(css::lang::IllegalArgumentException,
css::frame::UnknownModuleException,
css::uno::RuntimeException );
// XNameReplace
virtual void SAL_CALL replaceByName(const OUString& sName ,
const css::uno::Any& aValue)
throw (css::lang::IllegalArgumentException ,
css::container::NoSuchElementException,
css::lang::WrappedTargetException ,
css::uno::RuntimeException );
// XNameAccess
virtual css::uno::Any SAL_CALL getByName(const OUString& sName)
throw(css::container::NoSuchElementException,
css::lang::WrappedTargetException ,
css::uno::RuntimeException );
virtual css::uno::Sequence< OUString > SAL_CALL getElementNames()
throw(css::uno::RuntimeException);
virtual sal_Bool SAL_CALL hasByName(const OUString& sName)
throw(css::uno::RuntimeException);
// XElementAccess
virtual css::uno::Type SAL_CALL getElementType()
throw(css::uno::RuntimeException);
virtual sal_Bool SAL_CALL hasElements()
throw(css::uno::RuntimeException);
// XContainerQuery
virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL createSubSetEnumerationByQuery(const OUString& sQuery)
throw(css::uno::RuntimeException);
virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL createSubSetEnumerationByProperties(const css::uno::Sequence< css::beans::NamedValue >& lProperties)
throw(css::uno::RuntimeException);
//___________________________________________
// helper
private:
//---------------------------------------
/** @short open the underlying configuration.
@descr This method must be called every time
a (reaonly!) configuration is needed. Because
method works together with the member
m_xCFG, open it on demand and cache it
afterwards.
Note: A writable configuration access
must be created explicitly. Otherwise
we cant make sure that broken write requests
wont affect our read access !
@return [com.sun.star.container.XNameAccess]
the configuration object
@throw [com.sun.star.uno.RuntimeException]
if config could not be opened successfully!
@threadsafe
*/
css::uno::Reference< css::container::XNameAccess > implts_getConfig()
throw(css::uno::RuntimeException);
//---------------------------------------
/** @short makes the real identification of the module.
@descr It checks for the optional but preferred interface
XModule first. If this module does not exists at the
given component it tries to use XServiceInfo instead.
Note: This method try to locate a suitable module name.
Nothing else. Selecting the right component and throwing suitable
exceptions must be done outside.
@see identify()
@param xComponent
the module for identification.
@return The identifier of the given module.
Can be empty if given component is not a real module !
@threadsafe
*/
OUString implts_identify(const css::uno::Reference< css::uno::XInterface >& xComponent);
};
} // namespace framework
#endif // INCLUDED_FRAMEWORK_INC_SERVICES_MODULEMANAGER_HXX
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -35,7 +35,6 @@ ...@@ -35,7 +35,6 @@
=================================================================================================================*/ =================================================================================================================*/
#include <services/desktop.hxx> #include <services/desktop.hxx>
#include <services/frame.hxx> #include <services/frame.hxx>
#include <services/modulemanager.hxx>
#include <jobs/jobexecutor.hxx> #include <jobs/jobexecutor.hxx>
#include <services/layoutmanager.hxx> #include <services/layoutmanager.hxx>
#include <uifactory/uielementfactorymanager.hxx> #include <uifactory/uielementfactorymanager.hxx>
...@@ -72,7 +71,6 @@ COMPONENTGETFACTORY ( fwk, ...@@ -72,7 +71,6 @@ COMPONENTGETFACTORY ( fwk,
IFFACTORY( ::framework::PopupMenuControllerFactory ) else IFFACTORY( ::framework::PopupMenuControllerFactory ) else
IFFACTORY( ::framework::ControlMenuController ) else IFFACTORY( ::framework::ControlMenuController ) else
IFFACTORY( ::framework::UICommandDescription ) else IFFACTORY( ::framework::UICommandDescription ) else
IFFACTORY( ::framework::ModuleManager ) else
IFFACTORY( ::framework::ModuleUIConfigurationManagerSupplier ) else IFFACTORY( ::framework::ModuleUIConfigurationManagerSupplier ) else
IFFACTORY( ::framework::ModuleUIConfigurationManager ) else IFFACTORY( ::framework::ModuleUIConfigurationManager ) else
IFFACTORY( ::framework::MenuBarFactory ) else IFFACTORY( ::framework::MenuBarFactory ) else
......
...@@ -18,54 +18,173 @@ ...@@ -18,54 +18,173 @@
*/ */
#include "services/modulemanager.hxx" #include <sal/config.h>
#include "services/frame.hxx"
#include <threadhelp/readguard.hxx> #include <threadhelp/readguard.hxx>
#include <threadhelp/threadhelpbase.hxx>
#include <threadhelp/writeguard.hxx> #include <threadhelp/writeguard.hxx>
#include <services.h>
#include <com/sun/star/frame/XFrame.hpp> #include <com/sun/star/frame/XFrame.hpp>
#include <com/sun/star/frame/XController.hpp> #include <com/sun/star/frame/XController.hpp>
#include <com/sun/star/frame/XModel.hpp> #include <com/sun/star/frame/XModel.hpp>
#include <com/sun/star/frame/XModule.hpp> #include <com/sun/star/frame/XModule.hpp>
#include <com/sun/star/lang/XServiceInfo.hpp>
#include <com/sun/star/frame/XModuleManager2.hpp>
#include <com/sun/star/container/XNameReplace.hpp>
#include <com/sun/star/container/XContainerQuery.hpp>
#include <com/sun/star/uno/XComponentContext.hpp>
#include <cppuhelper/implbase3.hxx>
#include <cppuhelper/supportsservice.hxx>
#include <comphelper/configurationhelper.hxx> #include <comphelper/configurationhelper.hxx>
#include <comphelper/sequenceashashmap.hxx> #include <comphelper/sequenceashashmap.hxx>
#include <comphelper/sequenceasvector.hxx> #include <comphelper/sequenceasvector.hxx>
#include <comphelper/enumhelper.hxx> #include <comphelper/enumhelper.hxx>
#include <rtl/ref.hxx>
#include <boost/noncopyable.hpp>
namespace framework using namespace framework;
{
namespace {
static const char CFGPATH_FACTORIES[] = "/org.openoffice.Setup/Office/Factories"; static const char CFGPATH_FACTORIES[] = "/org.openoffice.Setup/Office/Factories";
static const char MODULEPROP_IDENTIFIER[] = "ooSetupFactoryModuleIdentifier"; static const char MODULEPROP_IDENTIFIER[] = "ooSetupFactoryModuleIdentifier";
OUString ModuleManager::impl_getStaticImplementationName() { class ModuleManager:
return IMPLEMENTATIONNAME_MODULEMANAGER; public cppu::WeakImplHelper3<
} css::lang::XServiceInfo,
css::frame::XModuleManager2,
css::uno::Reference< css::lang::XSingleServiceFactory > css::container::XContainerQuery >,
ModuleManager::impl_createFactory( private ThreadHelpBase, private boost::noncopyable
css::uno::Reference< css::lang::XMultiServiceFactory > const & manager)
{ {
return cppu::createSingleFactory( private:
manager, impl_getStaticImplementationName(), &impl_createInstance,
impl_getSupportedServiceNames());
}
css::uno::Sequence< OUString > //---------------------------------------
ModuleManager::impl_getSupportedServiceNames() { /** the global uno service manager.
css::uno::Sequence< OUString > s(1); Must be used to create own needed services.
s[0] = "com.sun.star.frame.ModuleManager"; */
return s; css::uno::Reference< css::uno::XComponentContext > m_xContext;
}
css::uno::Reference< css::uno::XInterface > ModuleManager::impl_createInstance( //---------------------------------------
css::uno::Reference< css::lang::XMultiServiceFactory > const & manager) /** points to the underlying configuration.
{ This ModuleManager does not cache - it calls directly the
return static_cast< cppu::OWeakObject * >(new ModuleManager( comphelper::getComponentContext(manager) )); configuration API!
} */
css::uno::Reference< css::container::XNameAccess > m_xCFG;
//___________________________________________
// interface
public:
ModuleManager(const css::uno::Reference< css::uno::XComponentContext >& xContext);
virtual ~ModuleManager();
// XServiceInfo
virtual OUString SAL_CALL getImplementationName()
throw (css::uno::RuntimeException);
virtual sal_Bool SAL_CALL supportsService(
OUString const & ServiceName)
throw (css::uno::RuntimeException);
virtual css::uno::Sequence< OUString > SAL_CALL
getSupportedServiceNames() throw (css::uno::RuntimeException);
// XModuleManager
virtual OUString SAL_CALL identify(const css::uno::Reference< css::uno::XInterface >& xModule)
throw(css::lang::IllegalArgumentException,
css::frame::UnknownModuleException,
css::uno::RuntimeException );
// XNameReplace
virtual void SAL_CALL replaceByName(const OUString& sName ,
const css::uno::Any& aValue)
throw (css::lang::IllegalArgumentException ,
css::container::NoSuchElementException,
css::lang::WrappedTargetException ,
css::uno::RuntimeException );
// XNameAccess
virtual css::uno::Any SAL_CALL getByName(const OUString& sName)
throw(css::container::NoSuchElementException,
css::lang::WrappedTargetException ,
css::uno::RuntimeException );
virtual css::uno::Sequence< OUString > SAL_CALL getElementNames()
throw(css::uno::RuntimeException);
virtual sal_Bool SAL_CALL hasByName(const OUString& sName)
throw(css::uno::RuntimeException);
// XElementAccess
virtual css::uno::Type SAL_CALL getElementType()
throw(css::uno::RuntimeException);
virtual sal_Bool SAL_CALL hasElements()
throw(css::uno::RuntimeException);
// XContainerQuery
virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL createSubSetEnumerationByQuery(const OUString& sQuery)
throw(css::uno::RuntimeException);
virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL createSubSetEnumerationByProperties(const css::uno::Sequence< css::beans::NamedValue >& lProperties)
throw(css::uno::RuntimeException);
//___________________________________________
// helper
private:
//---------------------------------------
/** @short open the underlying configuration.
@descr This method must be called every time
a (reaonly!) configuration is needed. Because
method works together with the member
m_xCFG, open it on demand and cache it
afterwards.
Note: A writable configuration access
must be created explicitly. Otherwise
we cant make sure that broken write requests
wont affect our read access !
@return [com.sun.star.container.XNameAccess]
the configuration object
@throw [com.sun.star.uno.RuntimeException]
if config could not be opened successfully!
@threadsafe
*/
css::uno::Reference< css::container::XNameAccess > implts_getConfig()
throw(css::uno::RuntimeException);
//---------------------------------------
/** @short makes the real identification of the module.
@descr It checks for the optional but preferred interface
XModule first. If this module does not exists at the
given component it tries to use XServiceInfo instead.
Note: This method try to locate a suitable module name.
Nothing else. Selecting the right component and throwing suitable
exceptions must be done outside.
@see identify()
@param xComponent
the module for identification.
@return The identifier of the given module.
Can be empty if given component is not a real module !
@threadsafe
*/
OUString implts_identify(const css::uno::Reference< css::uno::XInterface >& xComponent);
};
ModuleManager::ModuleManager(const css::uno::Reference< css::uno::XComponentContext >& xContext) ModuleManager::ModuleManager(const css::uno::Reference< css::uno::XComponentContext >& xContext)
: ThreadHelpBase( ) : ThreadHelpBase( )
...@@ -82,25 +201,21 @@ ModuleManager::~ModuleManager() ...@@ -82,25 +201,21 @@ ModuleManager::~ModuleManager()
OUString ModuleManager::getImplementationName() OUString ModuleManager::getImplementationName()
throw (css::uno::RuntimeException) throw (css::uno::RuntimeException)
{ {
return impl_getStaticImplementationName(); return OUString("com.sun.star.comp.framework.ModuleManager");
} }
sal_Bool ModuleManager::supportsService(OUString const & ServiceName) sal_Bool ModuleManager::supportsService(OUString const & ServiceName)
throw (css::uno::RuntimeException) throw (css::uno::RuntimeException)
{ {
css::uno::Sequence< OUString > s(getSupportedServiceNames()); return cppu::supportsService(this, ServiceName);
for (sal_Int32 i = 0; i != s.getLength(); ++i) {
if (s[i] == ServiceName) {
return true;
}
}
return false;
} }
css::uno::Sequence< OUString > ModuleManager::getSupportedServiceNames() css::uno::Sequence< OUString > ModuleManager::getSupportedServiceNames()
throw (css::uno::RuntimeException) throw (css::uno::RuntimeException)
{ {
return impl_getSupportedServiceNames(); css::uno::Sequence< OUString > s(1);
s[0] = "com.sun.star.frame.ModuleManager";
return s;
} }
OUString SAL_CALL ModuleManager::identify(const css::uno::Reference< css::uno::XInterface >& xModule) OUString SAL_CALL ModuleManager::identify(const css::uno::Reference< css::uno::XInterface >& xModule)
...@@ -372,6 +487,16 @@ OUString ModuleManager::implts_identify(const css::uno::Reference< css::uno::XIn ...@@ -372,6 +487,16 @@ OUString ModuleManager::implts_identify(const css::uno::Reference< css::uno::XIn
return OUString(); return OUString();
} }
} // namespace framework }
extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface * SAL_CALL
com_sun_star_comp_framework_ModuleManager_get_implementation(
css::uno::XComponentContext *context,
css::uno::Sequence<css::uno::Any> const &)
{
rtl::Reference<ModuleManager> x(new ModuleManager(context));
x->acquire();
return static_cast<cppu::OWeakObject *>(x.get());
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -66,7 +66,8 @@ ...@@ -66,7 +66,8 @@
<implementation name="com.sun.star.comp.framework.ModuleAcceleratorConfiguration"> <implementation name="com.sun.star.comp.framework.ModuleAcceleratorConfiguration">
<service name="com.sun.star.ui.ModuleAcceleratorConfiguration"/> <service name="com.sun.star.ui.ModuleAcceleratorConfiguration"/>
</implementation> </implementation>
<implementation name="com.sun.star.comp.framework.ModuleManager"> <implementation name="com.sun.star.comp.framework.ModuleManager"
constructor="com_sun_star_comp_framework_ModuleManager_get_implementation">
<service name="com.sun.star.frame.ModuleManager"/> <service name="com.sun.star.frame.ModuleManager"/>
</implementation> </implementation>
<implementation name="com.sun.star.comp.framework.ModuleUIConfigurationManager"> <implementation name="com.sun.star.comp.framework.ModuleUIConfigurationManager">
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment