/** @shortimplementsajobexecutor,whichcanbetriggeredfromanycode @descrItusesthegiventriggereventtolocateanyregisteredjobservice insidetheconfigurationandexecuteit.Ofcourseitcontrolsthe lifetimeofsuchjobstoo.
*/ class JobExecutor : public Base
{ private:
/** reference to the uno service manager */
css::uno::Reference< css::uno::XComponentContext > m_xContext;
/** cached list of all registered event names of cfg for call optimization. */
std::vector<OUString> 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 */
rtl::Reference<WeakContainerListener> m_xConfigListener;
virtualvoid disposing(std::unique_lock<std::mutex>& rGuard) final override;
void JobExecutor::initListeners()
{ if (comphelper::IsFuzzing()) return;
// 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) return;
// Optimization! // Check if the given event name exist inside configuration and reject wrong requests. // This optimization suppress using of the cfg api for getting event and job descriptions ... if (std::find(m_lEvents.begin(), m_lEvents.end(), sEvent) == m_lEvents.end()) return;
} /* SAFE */
// get list of all enabled jobs // The called static helper methods read it from the configuration and // filter disabled jobs using it's time stamp values.
std::vector< OUString > lJobs = JobData::getEnabledJobsForEvent(m_xContext, sEvent);
// step over all enabled jobs and execute it
size_t c = lJobs.size(); for (size_t j=0; j<c; ++j)
{
JobData aCfg(m_xContext);
aCfg.setEvent(sEvent, lJobs[j]);
aCfg.setEnvironment(JobData::E_EXECUTION);
// Optimization! // Check if the given event name exist inside configuration and reject wrong requests. // This optimization suppress using of the cfg api for getting event and job descriptions. // see using of m_lEvents.find() below ...
// Special feature: If the events "OnNew" or "OnLoad" occurs - we generate our own event "onDocumentOpened". if (
(aEvent.EventName == "OnNew") ||
(aEvent.EventName == "OnLoad")
)
{ if (std::find(m_lEvents.begin(), m_lEvents.end(), EVENT_ON_DOCUMENT_OPENED) != m_lEvents.end())
JobData::appendEnabledJobsForEvent(m_xContext, EVENT_ON_DOCUMENT_OPENED, lJobs);
}
// Special feature: If the events "OnCreate" or "OnLoadFinished" occurs - we generate our own event "onDocumentAdded". if (
(aEvent.EventName == "OnCreate") ||
(aEvent.EventName == "OnLoadFinished")
)
{ if (std::find(m_lEvents.begin(), m_lEvents.end(), EVENT_ON_DOCUMENT_ADDED) != m_lEvents.end())
JobData::appendEnabledJobsForEvent(m_xContext, EVENT_ON_DOCUMENT_ADDED, lJobs);
}
// Add all jobs for "real" notified event too .-) if (std::find(m_lEvents.begin(), m_lEvents.end(), aEvent.EventName) != m_lEvents.end())
JobData::appendEnabledJobsForEvent(m_xContext, aEvent.EventName, lJobs);
} /* SAFE */
// step over all enabled jobs and execute it for (autoconst& lJob : lJobs)
{
rtl::Reference<Job> pJob;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.