fwk: Use constructor feature for JobExecutor.

Change-Id: I5087320137dc17f27a382d564a59cec68f1a4f95
This commit is contained in:
Matúš Kukan 2014-01-09 20:41:58 +01:00 committed by Jan Holesovsky
parent c61ecda75b
commit 748aa84e98
4 changed files with 126 additions and 162 deletions

View file

@ -1,115 +0,0 @@
/* -*- 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_JOBS_JOBEXECUTOR_HXX
#define INCLUDED_FRAMEWORK_INC_JOBS_JOBEXECUTOR_HXX
#include <jobs/configaccess.hxx>
#include <threadhelp/threadhelpbase.hxx>
#include <macros/xinterface.hxx>
#include <macros/xtypeprovider.hxx>
#include <macros/xserviceinfo.hxx>
#include <stdtypes.h>
#include <general.h>
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <com/sun/star/task/XJobExecutor.hpp>
#include <com/sun/star/lang/XComponent.hpp>
#include <com/sun/star/container/XContainerListener.hpp>
#include <com/sun/star/lang/XEventListener.hpp>
#include <com/sun/star/document/XEventListener.hpp>
#include <com/sun/star/frame/XModuleManager2.hpp>
#include <cppuhelper/implbase4.hxx>
#include <rtl/ustring.hxx>
namespace framework{
//_______________________________________
/**
@short implements a job executor, which can be triggered from any code
@descr It uses the given trigger event to locate any registered job service
inside the configuration and execute it. Of course it controls the
liftime of such jobs too.
*/
class JobExecutor : private ThreadHelpBase
, public ::cppu::WeakImplHelper4<
css::lang::XServiceInfo
, css::task::XJobExecutor
, css::container::XContainerListener // => lang.XEventListener
, css::document::XEventListener >
{
//___________________________________
// member
private:
/** reference to the uno service manager */
css::uno::Reference< css::uno::XComponentContext > m_xContext;
/** reference to the module info service */
css::uno::Reference< css::frame::XModuleManager2 > m_xModuleManager;
/** cached list of all registered event names of cfg for call optimization. */
OUStringList m_lEvents;
/** we listen at the configuration for changes at the event list. */
ConfigAccess m_aConfig;
/** helper to allow us listen to the configuration without a cyclic dependency */
com::sun::star::uno::Reference<com::sun::star::container::XContainerListener> m_xConfigListener;
//___________________________________
// native interface methods
public:
JobExecutor( const css::uno::Reference< css::uno::XComponentContext >& xContext );
virtual ~JobExecutor( );
//___________________________________
// uno interface methods
public:
// XInterface, XTypeProvider, XServiceInfo
DECLARE_XSERVICEINFO
// task.XJobExecutor
virtual void SAL_CALL trigger( const OUString& sEvent ) throw(css::uno::RuntimeException);
// document.XEventListener
virtual void SAL_CALL notifyEvent( const css::document::EventObject& aEvent ) throw(css::uno::RuntimeException);
// container.XContainerListener
virtual void SAL_CALL elementInserted( const css::container::ContainerEvent& aEvent ) throw(css::uno::RuntimeException);
virtual void SAL_CALL elementRemoved ( const css::container::ContainerEvent& aEvent ) throw(css::uno::RuntimeException);
virtual void SAL_CALL elementReplaced( const css::container::ContainerEvent& aEvent ) throw(css::uno::RuntimeException);
// lang.XEventListener
virtual void SAL_CALL disposing( const css::lang::EventObject& aEvent ) throw(css::uno::RuntimeException);
};
} // namespace framework
#endif // INCLUDED_FRAMEWORK_INC_JOBS_JOBEXECUTOR_HXX
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View file

@ -17,16 +17,16 @@
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#include <jobs/jobexecutor.hxx>
#include <jobs/job.hxx>
#include <jobs/joburl.hxx>
#include <jobs/configaccess.hxx>
#include <classes/converter.hxx>
#include <threadhelp/transactionguard.hxx>
#include <threadhelp/threadhelpbase.hxx>
#include <threadhelp/readguard.hxx>
#include <threadhelp/writeguard.hxx>
#include <general.h>
#include <services.h>
#include <stdtypes.h>
#include "helper/mischelper.hxx"
@ -34,56 +34,100 @@
#include <com/sun/star/container/XNameAccess.hpp>
#include <com/sun/star/container/XContainer.hpp>
#include <com/sun/star/frame/ModuleManager.hpp>
#include <com/sun/star/task/XJobExecutor.hpp>
#include <com/sun/star/container/XContainerListener.hpp>
#include <com/sun/star/lang/XEventListener.hpp>
#include <com/sun/star/lang/XInitialization.hpp>
#include <com/sun/star/lang/XServiceInfo.hpp>
#include <com/sun/star/document/XEventListener.hpp>
#include <com/sun/star/frame/XModuleManager2.hpp>
#include <cppuhelper/implbase5.hxx>
#include <cppuhelper/supportsservice.hxx>
#include <unotools/configpaths.hxx>
#include <rtl/ref.hxx>
#include <rtl/ustrbuf.hxx>
#include <vcl/svapp.hxx>
using namespace framework;
namespace framework{
namespace {
DEFINE_XSERVICEINFO_ONEINSTANCESERVICE_2( JobExecutor ,
::cppu::OWeakObject ,
"com.sun.star.task.JobExecutor",
IMPLEMENTATIONNAME_JOBEXECUTOR
)
/**
@short implements a job executor, which can be triggered from any code
@descr It uses the given trigger event to locate any registered job service
inside the configuration and execute it. Of course it controls the
liftime of such jobs too.
*/
class JobExecutor : private ThreadHelpBase
, public ::cppu::WeakImplHelper5<
css::lang::XServiceInfo
, css::task::XJobExecutor
, css::lang::XInitialization
, css::container::XContainerListener // => lang.XEventListener
, css::document::XEventListener >
{
private:
DEFINE_INIT_SERVICE( JobExecutor,
{
m_xModuleManager = css::frame::ModuleManager::create( m_xContext );
/** reference to the uno service manager */
css::uno::Reference< css::uno::XComponentContext > m_xContext;
/*Attention
I think we don't need any mutex or lock here ... because we are called by our own static method impl_createInstance()
to create a new instance of this class by our own supported service factory.
see macro DEFINE_XSERVICEINFO_MULTISERVICE and "impl_initService()" for further information!
*/
// read the list of all currently registered events inside configuration.
// e.g. "/org.openoffice.Office.Jobs/Events/<event name>"
// We need it later to check if an incoming event request can be executed successfully
// or must be rejected. It's an optimization! Of course we must implement updating of this
// list too ... Be listener at the configuration.
/** reference to the module info service */
css::uno::Reference< css::frame::XModuleManager2 > m_xModuleManager;
m_aConfig.open(ConfigAccess::E_READONLY);
if (m_aConfig.getMode() == ConfigAccess::E_READONLY)
{
css::uno::Reference< css::container::XNameAccess > xRegistry(m_aConfig.cfg(), css::uno::UNO_QUERY);
if (xRegistry.is())
m_lEvents = Converter::convert_seqOUString2OUStringList(xRegistry->getElementNames());
/** cached list of all registered event names of cfg for call optimization. */
OUStringList m_lEvents;
css::uno::Reference< css::container::XContainer > xNotifier(m_aConfig.cfg(), css::uno::UNO_QUERY);
if (xNotifier.is())
{
m_xConfigListener = new WeakContainerListener(this);
xNotifier->addContainerListener(m_xConfigListener);
}
/** we listen at the configuration for changes at the event list. */
ConfigAccess m_aConfig;
// don't close cfg here!
// It will be done inside disposing ...
}
}
)
/** helper to allow us listen to the configuration without a cyclic dependency */
com::sun::star::uno::Reference<com::sun::star::container::XContainerListener> m_xConfigListener;
//________________________________
public:
JobExecutor( const css::uno::Reference< css::uno::XComponentContext >& xContext );
virtual ~JobExecutor();
virtual OUString SAL_CALL getImplementationName()
throw (css::uno::RuntimeException)
{
return OUString("com.sun.star.comp.framework.JobExecutor");
}
virtual sal_Bool SAL_CALL supportsService(OUString const & ServiceName)
throw (css::uno::RuntimeException)
{
return cppu::supportsService(this, ServiceName);
}
virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames()
throw (css::uno::RuntimeException)
{
css::uno::Sequence< OUString > aSeq(1);
aSeq[0] = OUString("com.sun.star.task.JobExecutor");
return aSeq;
}
// task.XJobExecutor
virtual void SAL_CALL trigger( const OUString& sEvent ) throw(css::uno::RuntimeException);
// XInitialization
virtual void SAL_CALL initialize( const css::uno::Sequence< css::uno::Any >& aArguments ) throw (css::uno::Exception, css::uno::RuntimeException);
// document.XEventListener
virtual void SAL_CALL notifyEvent( const css::document::EventObject& aEvent ) throw(css::uno::RuntimeException);
// container.XContainerListener
virtual void SAL_CALL elementInserted( const css::container::ContainerEvent& aEvent ) throw(css::uno::RuntimeException);
virtual void SAL_CALL elementRemoved ( const css::container::ContainerEvent& aEvent ) throw(css::uno::RuntimeException);
virtual void SAL_CALL elementReplaced( const css::container::ContainerEvent& aEvent ) throw(css::uno::RuntimeException);
// lang.XEventListener
virtual void SAL_CALL disposing( const css::lang::EventObject& aEvent ) throw(css::uno::RuntimeException);
void onCreate();
};
/**
@short standard ctor
@ -95,11 +139,39 @@ DEFINE_INIT_SERVICE( JobExecutor,
JobExecutor::JobExecutor( /*IN*/ const css::uno::Reference< css::uno::XComponentContext >& xContext )
: ThreadHelpBase (&Application::GetSolarMutex() )
, m_xContext (xContext )
, m_xModuleManager ( )
, m_xModuleManager (css::frame::ModuleManager::create( m_xContext ))
, m_aConfig (xContext, OUString::createFromAscii(JobData::EVENTCFG_ROOT) )
{
// Don't do any reference related code here! Do it inside special
// impl_ method() ... see DEFINE_INIT_SERVICE() macro for further information.
}
void JobExecutor::initialize(const css::uno::Sequence< css::uno::Any >& ) throw (css::uno::Exception, css::uno::RuntimeException)
{
// read the list of all currently registered events inside configuration.
// e.g. "/org.openoffice.Office.Jobs/Events/<event name>"
// We need it later to check if an incoming event request can be executed successfully
// or must be rejected. It's an optimization! Of course we must implement updating of this
// list too ... Be listener at the configuration.
m_aConfig.open(ConfigAccess::E_READONLY);
if (m_aConfig.getMode() == ConfigAccess::E_READONLY)
{
css::uno::Reference< css::container::XNameAccess > xRegistry(
m_aConfig.cfg(), css::uno::UNO_QUERY);
if (xRegistry.is())
m_lEvents = Converter::convert_seqOUString2OUStringList(
xRegistry->getElementNames());
css::uno::Reference< css::container::XContainer > xNotifier(
m_aConfig.cfg(), css::uno::UNO_QUERY);
if (xNotifier.is())
{
m_xConfigListener = new WeakContainerListener(this);
xNotifier->addContainerListener(m_xConfigListener);
}
// don't close cfg here!
// It will be done inside disposing ...
}
}
JobExecutor::~JobExecutor()
@ -329,6 +401,14 @@ void SAL_CALL JobExecutor::disposing( const css::lang::EventObject& aEvent ) thr
/* } SAFE */
}
} // namespace framework
}
extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface * SAL_CALL
com_sun_star_comp_framework_JobExecutor_get_implementation(
css::uno::XComponentContext *context,
css::uno::Sequence<css::uno::Any> const &)
{
return static_cast<cppu::OWeakObject *>(new JobExecutor(context));
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View file

@ -34,7 +34,6 @@
)
=================================================================================================================*/
#include <services/desktop.hxx>
#include <jobs/jobexecutor.hxx>
#include <uifactory/uielementfactorymanager.hxx>
#include <uifactory/uicontrollerfactory.hxx>
#include <uielement/uicommanddescription.hxx>
@ -55,7 +54,6 @@
COMPONENTGETFACTORY ( fwk,
IFFACTORY( ::framework::Desktop ) else
IFFACTORY( ::framework::JobExecutor ) else
IFFACTORY( ::framework::UIElementFactoryManager ) else
IFFACTORY( ::framework::PopupMenuControllerFactory ) else
IFFACTORY( ::framework::UICommandDescription ) else

View file

@ -55,7 +55,8 @@
constructor="com_sun_star_comp_framework_ImageManager_get_implementation">
<service name="com.sun.star.ui.ImageManager"/>
</implementation>
<implementation name="com.sun.star.comp.framework.JobExecutor">
<implementation name="com.sun.star.comp.framework.JobExecutor"
constructor="com_sun_star_comp_framework_JobExecutor_get_implementation">
<service name="com.sun.star.task.JobExecutor"/>
</implementation>
<implementation name="com.sun.star.comp.framework.LangSelectionStatusbarController"