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 @@
=================================================================================================================*/
#include <services/desktop.hxx>
#include <services/frame.hxx>
#include <services/modulemanager.hxx>
#include <jobs/jobexecutor.hxx>
#include <services/layoutmanager.hxx>
#include <uifactory/uielementfactorymanager.hxx>
......@@ -72,7 +71,6 @@ COMPONENTGETFACTORY ( fwk,
IFFACTORY( ::framework::PopupMenuControllerFactory ) else
IFFACTORY( ::framework::ControlMenuController ) else
IFFACTORY( ::framework::UICommandDescription ) else
IFFACTORY( ::framework::ModuleManager ) else
IFFACTORY( ::framework::ModuleUIConfigurationManagerSupplier ) else
IFFACTORY( ::framework::ModuleUIConfigurationManager ) else
IFFACTORY( ::framework::MenuBarFactory ) else
......
......@@ -18,54 +18,173 @@
*/
#include "services/modulemanager.hxx"
#include "services/frame.hxx"
#include <sal/config.h>
#include <threadhelp/readguard.hxx>
#include <threadhelp/threadhelpbase.hxx>
#include <threadhelp/writeguard.hxx>
#include <services.h>
#include <com/sun/star/frame/XFrame.hpp>
#include <com/sun/star/frame/XController.hpp>
#include <com/sun/star/frame/XModel.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/sequenceashashmap.hxx>
#include <comphelper/sequenceasvector.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 MODULEPROP_IDENTIFIER[] = "ooSetupFactoryModuleIdentifier";
OUString ModuleManager::impl_getStaticImplementationName() {
return IMPLEMENTATIONNAME_MODULEMANAGER;
}
css::uno::Reference< css::lang::XSingleServiceFactory >
ModuleManager::impl_createFactory(
css::uno::Reference< css::lang::XMultiServiceFactory > const & manager)
class ModuleManager:
public cppu::WeakImplHelper3<
css::lang::XServiceInfo,
css::frame::XModuleManager2,
css::container::XContainerQuery >,
private ThreadHelpBase, private boost::noncopyable
{
return cppu::createSingleFactory(
manager, impl_getStaticImplementationName(), &impl_createInstance,
impl_getSupportedServiceNames());
}
private:
css::uno::Sequence< OUString >
ModuleManager::impl_getSupportedServiceNames() {
css::uno::Sequence< OUString > s(1);
s[0] = "com.sun.star.frame.ModuleManager";
return s;
}
//---------------------------------------
/** the global uno service manager.
Must be used to create own needed services.
*/
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)
{
return static_cast< cppu::OWeakObject * >(new ModuleManager( comphelper::getComponentContext(manager) ));
}
//---------------------------------------
/** 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:
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)
: ThreadHelpBase( )
......@@ -82,25 +201,21 @@ ModuleManager::~ModuleManager()
OUString ModuleManager::getImplementationName()
throw (css::uno::RuntimeException)
{
return impl_getStaticImplementationName();
return OUString("com.sun.star.comp.framework.ModuleManager");
}
sal_Bool ModuleManager::supportsService(OUString const & ServiceName)
throw (css::uno::RuntimeException)
{
css::uno::Sequence< OUString > s(getSupportedServiceNames());
for (sal_Int32 i = 0; i != s.getLength(); ++i) {
if (s[i] == ServiceName) {
return true;
}
}
return false;
return cppu::supportsService(this, ServiceName);
}
css::uno::Sequence< OUString > ModuleManager::getSupportedServiceNames()
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)
......@@ -372,6 +487,16 @@ OUString ModuleManager::implts_identify(const css::uno::Reference< css::uno::XIn
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: */
......@@ -66,7 +66,8 @@
<implementation name="com.sun.star.comp.framework.ModuleAcceleratorConfiguration">
<service name="com.sun.star.ui.ModuleAcceleratorConfiguration"/>
</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"/>
</implementation>
<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