/************************************************************************* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * Copyright 2000, 2010 Oracle and/or its affiliates. * * OpenOffice.org - a multi-platform office productivity suite * * 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 * * for a copy of the LGPLv3 License. * ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_extensions.hxx" #include "onlogrotate_job.hxx" #include "config.hxx" #include "logpacker.hxx" #include "logstorage.hxx" #include "soaprequest.hxx" #include "soapsender.hxx" #include #include #include #include #include #include #include #include using namespace ::com::sun::star::beans; using namespace ::com::sun::star::lang; using namespace ::com::sun::star::task; using namespace ::com::sun::star::uno; using ::com::sun::star::frame::XTerminateListener; using ::com::sun::star::frame::XDesktop; using ::com::sun::star::ucb::XSimpleFileAccess; using ::rtl::OUString; using ::std::vector; namespace { using namespace oooimprovement; static void packLogs(const Reference& sf) { try { Config config(sf); LogPacker log_packer(sf); vector csvfiles = LogStorage(sf).getUnzippedLogFiles(); for( vector::iterator item = csvfiles.begin(); item!=csvfiles.end(); item++) config.incrementEventCount(log_packer.pack(*item)); } catch(...) {}; }; static void uploadLogs(const Reference& sf) { try { Config config(sf); Reference file_access( sf->createInstance(OUString::createFromAscii("com.sun.star.ucb.SimpleFileAccess")), UNO_QUERY_THROW); SoapSender sender(sf, config.getSoapUrl()); OUString soap_id = config.getSoapId(); vector zipfiles = LogStorage(sf).getZippedLogFiles(); for( vector::iterator item = zipfiles.begin(); item!=zipfiles.end(); item++) { if(config.incrementFailedAttempts(1) > 25) { config.giveupUploading(); LogStorage(sf).clear(); return; } sender.send(SoapRequest(sf, soap_id, *item)); config.incrementReportCount(1); file_access->kill(*item); config.resetFailedAttempts(); } } catch(...) {}; } class OnLogRotateThread : public ::osl::Thread { public: OnLogRotateThread(Reference sf); virtual void SAL_CALL run(); void stop(); private: Reference m_ServiceFactory; ::osl::Condition m_Stop; }; OnLogRotateThread::OnLogRotateThread(Reference sf) : m_ServiceFactory(sf) { OSL_ASSERT(sf.is()); } void SAL_CALL OnLogRotateThread::run() { TimeValue wait_intervall = {30,0}; if (m_Stop.wait(&wait_intervall) == ::osl::Condition::result_timeout) { try { if(Config(m_ServiceFactory).getInvitationAccepted()) { packLogs(m_ServiceFactory); uploadLogs(m_ServiceFactory); } else LogStorage(m_ServiceFactory).clear(); } catch(...) {} } } void OnLogRotateThread::stop() { m_Stop.set(); } class OnLogRotateThreadWatcher : public ::cppu::WeakImplHelper1 { public: OnLogRotateThreadWatcher(Reference sf) : m_Thread(new OnLogRotateThread(sf)) { m_Thread->create(); } virtual ~OnLogRotateThreadWatcher() { m_Thread->stop(); m_Thread->join(); }; // XTerminateListener virtual void SAL_CALL queryTermination(const EventObject&) throw(RuntimeException) { }; virtual void SAL_CALL notifyTermination(const EventObject&) throw(RuntimeException) { m_Thread->stop(); m_Thread->join(); }; // XEventListener virtual void SAL_CALL disposing(const EventObject&) throw(RuntimeException) { m_Thread->stop(); m_Thread->join(); }; private: ::std::auto_ptr m_Thread; }; } namespace oooimprovement { OnLogRotateJob::OnLogRotateJob(const Reference& context) : m_ServiceFactory(Reference( context->getServiceManager()->createInstanceWithContext( OUString::createFromAscii("com.sun.star.lang.XMultiServiceFactory"), context), UNO_QUERY)) { } OnLogRotateJob::OnLogRotateJob(const Reference& sf) : m_ServiceFactory(sf) { } OnLogRotateJob::~OnLogRotateJob() { } void SAL_CALL OnLogRotateJob::executeAsync( const Sequence&, const Reference& listener) throw(RuntimeException) { Reference xDesktop( m_ServiceFactory->createInstance(OUString::createFromAscii("com.sun.star.frame.Desktop")), UNO_QUERY); if(xDesktop.is()) xDesktop->addTerminateListener(Reference(new OnLogRotateThreadWatcher(m_ServiceFactory))); Any result; listener->jobFinished(Reference(this), result); } sal_Bool SAL_CALL OnLogRotateJob::supportsService(const OUString& service_name) throw(RuntimeException) { const Sequence service_names(getSupportedServiceNames()); for (sal_Int32 idx = service_names.getLength()-1; idx>=0; --idx) if(service_name == service_names[idx]) return sal_True; return sal_False; } OUString SAL_CALL OnLogRotateJob::getImplementationName() throw(RuntimeException) { return getImplementationName_static(); } Sequence SAL_CALL OnLogRotateJob::getSupportedServiceNames() throw(RuntimeException) { return getSupportedServiceNames_static(); } OUString SAL_CALL OnLogRotateJob::getImplementationName_static() { return OUString::createFromAscii("com.sun.star.comp.extensions.oooimprovement.OnLogRotateJob"); } Sequence SAL_CALL OnLogRotateJob::getSupportedServiceNames_static() { Sequence aServiceNames(1); aServiceNames[0] = OUString::createFromAscii("com.sun.star.task.AsyncJob"); return aServiceNames; } Reference OnLogRotateJob::Create(const Reference& context) { return *(new OnLogRotateJob(context)); } Reference OnLogRotateJob::Create(const Reference& sf) { return *(new OnLogRotateJob(sf)); } }