diff options
Diffstat (limited to 'sw/source/ui/dbui/maildispatcher.cxx')
-rw-r--r-- | sw/source/ui/dbui/maildispatcher.cxx | 180 |
1 files changed, 90 insertions, 90 deletions
diff --git a/sw/source/ui/dbui/maildispatcher.cxx b/sw/source/ui/dbui/maildispatcher.cxx index ef073f6ebabf..d2c9e28fbf9a 100644 --- a/sw/source/ui/dbui/maildispatcher.cxx +++ b/sw/source/ui/dbui/maildispatcher.cxx @@ -2,7 +2,7 @@ /************************************************************************* * * 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 @@ -41,30 +41,30 @@ typedef std::list< ::rtl::Reference<IMailDispatcherListener> > MailDispatcherLis namespace /* private */ { - /* Generic event notifier for started, - stopped, and idle events which are + /* Generic event notifier for started, + stopped, and idle events which are very similary */ class GenericEventNotifier { public: // pointer to virtual function typedef typedef void (IMailDispatcherListener::*GenericNotificationFunc_t)(::rtl::Reference<MailDispatcher>); - + GenericEventNotifier( - GenericNotificationFunc_t notification_function, + GenericNotificationFunc_t notification_function, ::rtl::Reference<MailDispatcher> mail_dispatcher) : notification_function_(notification_function), mail_dispatcher_(mail_dispatcher) {} - + void operator() (::rtl::Reference<IMailDispatcherListener> listener) const { (listener.get()->*notification_function_)(mail_dispatcher_); } - + private: GenericNotificationFunc_t notification_function_; ::rtl::Reference<MailDispatcher> mail_dispatcher_; }; - + class MailDeliveryNotifier { public: @@ -72,77 +72,77 @@ namespace /* private */ mail_dispatcher_(xMailDispatcher), message_(message) {} - + void operator() (::rtl::Reference<IMailDispatcherListener> listener) const - { listener->mailDelivered(mail_dispatcher_, message_); } - + { listener->mailDelivered(mail_dispatcher_, message_); } + private: ::rtl::Reference<MailDispatcher> mail_dispatcher_; uno::Reference<mail::XMailMessage> message_; }; - + class MailDeliveryErrorNotifier { public: MailDeliveryErrorNotifier( ::rtl::Reference<MailDispatcher> xMailDispatcher, - uno::Reference<mail::XMailMessage> message, - const ::rtl::OUString& error_message) : + uno::Reference<mail::XMailMessage> message, + const ::rtl::OUString& error_message) : mail_dispatcher_(xMailDispatcher), message_(message), error_message_(error_message) {} - + void operator() (::rtl::Reference<IMailDispatcherListener> listener) const { listener->mailDeliveryError(mail_dispatcher_, message_, error_message_); } - + private: ::rtl::Reference<MailDispatcher> mail_dispatcher_; uno::Reference<mail::XMailMessage> message_; ::rtl::OUString error_message_; }; - + } // namespace private - + MailDispatcher::MailDispatcher(uno::Reference<mail::XSmtpService> mailserver) : mailserver_ (mailserver), - run_(false), + run_(false), shutdown_requested_(false) -{ +{ wakening_call_.reset(); mail_dispatcher_active_.reset(); - - if (!create()) - throw uno::RuntimeException(); - - // wait until the mail dispatcher thread is really alive - // and has aquired a reference to this instance of the - // class - mail_dispatcher_active_.wait(); + + if (!create()) + throw uno::RuntimeException(); + + // wait until the mail dispatcher thread is really alive + // and has aquired a reference to this instance of the + // class + mail_dispatcher_active_.wait(); } MailDispatcher::~MailDispatcher() -{ +{ } void MailDispatcher::enqueueMailMessage(uno::Reference<mail::XMailMessage> message) -{ - ::osl::MutexGuard thread_status_guard(thread_status_mutex_); +{ + ::osl::MutexGuard thread_status_guard(thread_status_mutex_); ::osl::MutexGuard message_container_guard(message_container_mutex_); - + OSL_PRECOND(!shutdown_requested_, "MailDispatcher thread is shuting down already"); - - messages_.push_back(message); + + messages_.push_back(message); if (run_) - wakening_call_.set(); + wakening_call_.set(); } uno::Reference<mail::XMailMessage> MailDispatcher::dequeueMailMessage() -{ +{ ::osl::MutexGuard guard(message_container_mutex_); uno::Reference<mail::XMailMessage> message; if(!messages_.empty()) - { + { message = messages_.front(); messages_.pop_front(); } @@ -150,51 +150,51 @@ uno::Reference<mail::XMailMessage> MailDispatcher::dequeueMailMessage() } void MailDispatcher::start() -{ - OSL_PRECOND(!isStarted(), "MailDispatcher is already started!"); - - ::osl::ClearableMutexGuard thread_status_guard(thread_status_mutex_); - +{ + OSL_PRECOND(!isStarted(), "MailDispatcher is already started!"); + + ::osl::ClearableMutexGuard thread_status_guard(thread_status_mutex_); + OSL_PRECOND(!shutdown_requested_, "MailDispatcher thread is shuting down already"); - + if (!shutdown_requested_) { run_ = true; wakening_call_.set(); thread_status_guard.clear(); - - MailDispatcherListenerContainer_t listeners_cloned(cloneListener()); - std::for_each(listeners_cloned.begin(), listeners_cloned.end(), GenericEventNotifier(&IMailDispatcherListener::started, this)); - } + + MailDispatcherListenerContainer_t listeners_cloned(cloneListener()); + std::for_each(listeners_cloned.begin(), listeners_cloned.end(), GenericEventNotifier(&IMailDispatcherListener::started, this)); + } } void MailDispatcher::stop() { - OSL_PRECOND(isStarted(), "MailDispatcher not started!"); - - ::osl::ClearableMutexGuard thread_status_guard(thread_status_mutex_); - + OSL_PRECOND(isStarted(), "MailDispatcher not started!"); + + ::osl::ClearableMutexGuard thread_status_guard(thread_status_mutex_); + OSL_PRECOND(!shutdown_requested_, "MailDispatcher thread is shuting down already"); - + if (!shutdown_requested_) { run_ = false; wakening_call_.reset(); thread_status_guard.clear(); - - MailDispatcherListenerContainer_t listeners_cloned(cloneListener()); - std::for_each(listeners_cloned.begin(), listeners_cloned.end(), GenericEventNotifier(&IMailDispatcherListener::stopped, this)); + + MailDispatcherListenerContainer_t listeners_cloned(cloneListener()); + std::for_each(listeners_cloned.begin(), listeners_cloned.end(), GenericEventNotifier(&IMailDispatcherListener::stopped, this)); } } void MailDispatcher::shutdown() -{ - ::osl::MutexGuard thread_status_guard(thread_status_mutex_); - +{ + ::osl::MutexGuard thread_status_guard(thread_status_mutex_); + OSL_PRECOND(!shutdown_requested_, "MailDispatcher thread is shuting down already"); - + shutdown_requested_ = true; - wakening_call_.set(); + wakening_call_.set(); } bool MailDispatcher::isStarted() const @@ -205,7 +205,7 @@ bool MailDispatcher::isStarted() const void MailDispatcher::addListener(::rtl::Reference<IMailDispatcherListener> listener) { OSL_PRECOND(!shutdown_requested_, "MailDispatcher thread is shuting down already"); - + ::osl::MutexGuard guard(listener_container_mutex_); listeners_.push_back(listener); } @@ -213,7 +213,7 @@ void MailDispatcher::addListener(::rtl::Reference<IMailDispatcherListener> liste void MailDispatcher::removeListener(::rtl::Reference<IMailDispatcherListener> listener) { OSL_PRECOND(!shutdown_requested_, "MailDispatcher thread is shuting down already"); - + ::osl::MutexGuard guard(listener_container_mutex_); listeners_.remove(listener); } @@ -228,67 +228,67 @@ void MailDispatcher::sendMailMessageNotifyListener(uno::Reference<mail::XMailMes { try { - mailserver_->sendMailMessage(message); - MailDispatcherListenerContainer_t listeners_cloned(cloneListener()); - std::for_each(listeners_cloned.begin(), listeners_cloned.end(), MailDeliveryNotifier(this, message)); + mailserver_->sendMailMessage(message); + MailDispatcherListenerContainer_t listeners_cloned(cloneListener()); + std::for_each(listeners_cloned.begin(), listeners_cloned.end(), MailDeliveryNotifier(this, message)); } catch (mail::MailException& ex) - { - MailDispatcherListenerContainer_t listeners_cloned(cloneListener()); - std::for_each(listeners_cloned.begin(), listeners_cloned.end(), MailDeliveryErrorNotifier(this, message, ex.Message)); + { + MailDispatcherListenerContainer_t listeners_cloned(cloneListener()); + std::for_each(listeners_cloned.begin(), listeners_cloned.end(), MailDeliveryErrorNotifier(this, message, ex.Message)); } catch (uno::RuntimeException& ex) - { - MailDispatcherListenerContainer_t listeners_cloned(cloneListener()); - std::for_each(listeners_cloned.begin(), listeners_cloned.end(), MailDeliveryErrorNotifier(this, message, ex.Message)); + { + MailDispatcherListenerContainer_t listeners_cloned(cloneListener()); + std::for_each(listeners_cloned.begin(), listeners_cloned.end(), MailDeliveryErrorNotifier(this, message, ex.Message)); } } void MailDispatcher::run() -{ +{ // aquire a self reference in order to avoid race // conditions. The last client of this class must - // call shutdown before releasing his last reference + // call shutdown before releasing his last reference // to this class in order to shutdown this thread // which will release his (the very last reference - // to the class and so force their destruction - m_xSelfReference = this; - + // to the class and so force their destruction + m_xSelfReference = this; + // signal that the mail dispatcher thread is now alive mail_dispatcher_active_.set(); - + for(;;) - { + { wakening_call_.wait(); - - ::osl::ClearableMutexGuard thread_status_guard(thread_status_mutex_); + + ::osl::ClearableMutexGuard thread_status_guard(thread_status_mutex_); if (shutdown_requested_) break; - + ::osl::ClearableMutexGuard message_container_guard(message_container_mutex_); - + if (messages_.size()) - { - thread_status_guard.clear(); + { + thread_status_guard.clear(); uno::Reference<mail::XMailMessage> message = messages_.front(); messages_.pop_front(); message_container_guard.clear(); sendMailMessageNotifyListener(message); } - else // idle - put ourself to sleep + else // idle - put ourself to sleep { wakening_call_.reset(); message_container_guard.clear(); thread_status_guard.clear(); - MailDispatcherListenerContainer_t listeners_cloned(cloneListener()); - std::for_each(listeners_cloned.begin(), listeners_cloned.end(), GenericEventNotifier(&IMailDispatcherListener::idle, this)); - } + MailDispatcherListenerContainer_t listeners_cloned(cloneListener()); + std::for_each(listeners_cloned.begin(), listeners_cloned.end(), GenericEventNotifier(&IMailDispatcherListener::idle, this)); + } } // end for SSH ALI } -void MailDispatcher::onTerminated() +void MailDispatcher::onTerminated() { - //keep the reference until the end of onTerminated() because of the call order in the + //keep the reference until the end of onTerminated() because of the call order in the //_threadFunc() from osl/thread.hxx m_xSelfReference = 0; } |