1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski #ifndef INCLUDED_MAILDISPATCHER_HXX 25*b1cdbd2cSJim Jagielski #define INCLUDED_MAILDISPATCHER_HXX 26*b1cdbd2cSJim Jagielski 27*b1cdbd2cSJim Jagielski //#ifndef _COM_SUN_STAR_MAIL_XMAILSERVER_HPP_ 28*b1cdbd2cSJim Jagielski //#include "com/sun/star/mail/XMailServer.hpp" 29*b1cdbd2cSJim Jagielski //#endif 30*b1cdbd2cSJim Jagielski #include "com/sun/star/mail/XSmtpService.hpp" 31*b1cdbd2cSJim Jagielski #include "com/sun/star/mail/XMailMessage.hpp" 32*b1cdbd2cSJim Jagielski #include <osl/thread.hxx> 33*b1cdbd2cSJim Jagielski #include <osl/conditn.hxx> 34*b1cdbd2cSJim Jagielski #include <salhelper/refobj.hxx> 35*b1cdbd2cSJim Jagielski 36*b1cdbd2cSJim Jagielski #include <list> 37*b1cdbd2cSJim Jagielski 38*b1cdbd2cSJim Jagielski class IMailDispatcherListener; 39*b1cdbd2cSJim Jagielski 40*b1cdbd2cSJim Jagielski /** 41*b1cdbd2cSJim Jagielski A MailDispatcher should be used for sending a bunch a mail messages 42*b1cdbd2cSJim Jagielski asynchronously. Usually a client enqueues a number of mail messages 43*b1cdbd2cSJim Jagielski and then calls start to begin sending them. An instance of this class 44*b1cdbd2cSJim Jagielski must not be shared among different client threads. Instead each client 45*b1cdbd2cSJim Jagielski thread should create an own instance of this class. 46*b1cdbd2cSJim Jagielski */ 47*b1cdbd2cSJim Jagielski class MailDispatcher : public ::salhelper::ReferenceObject, private ::osl::Thread 48*b1cdbd2cSJim Jagielski { 49*b1cdbd2cSJim Jagielski public: 50*b1cdbd2cSJim Jagielski // bringing operator new/delete into scope 51*b1cdbd2cSJim Jagielski using osl::Thread::operator new; 52*b1cdbd2cSJim Jagielski using osl::Thread::operator delete; 53*b1cdbd2cSJim Jagielski using osl::Thread::join; 54*b1cdbd2cSJim Jagielski 55*b1cdbd2cSJim Jagielski public: 56*b1cdbd2cSJim Jagielski 57*b1cdbd2cSJim Jagielski /** 58*b1cdbd2cSJim Jagielski @param xSmtpService 59*b1cdbd2cSJim Jagielski [in] a reference to a mail server. A user must be 60*b1cdbd2cSJim Jagielski connected to the mail server otherwise errors occur 61*b1cdbd2cSJim Jagielski during the delivery of mail messages. 62*b1cdbd2cSJim Jagielski 63*b1cdbd2cSJim Jagielski @throws ::com::sun::star::uno::RuntimeException 64*b1cdbd2cSJim Jagielski on errors during construction of an instance of this class. 65*b1cdbd2cSJim Jagielski */ 66*b1cdbd2cSJim Jagielski MailDispatcher(::com::sun::star::uno::Reference< ::com::sun::star::mail::XSmtpService> xMailService); 67*b1cdbd2cSJim Jagielski 68*b1cdbd2cSJim Jagielski /** 69*b1cdbd2cSJim Jagielski Shutdown the mail dispatcher. Every mail messages 70*b1cdbd2cSJim Jagielski not yet sent will be discarded. 71*b1cdbd2cSJim Jagielski */ 72*b1cdbd2cSJim Jagielski virtual ~MailDispatcher(); 73*b1cdbd2cSJim Jagielski 74*b1cdbd2cSJim Jagielski /** 75*b1cdbd2cSJim Jagielski Enqueue a mail message for delivery. A client must 76*b1cdbd2cSJim Jagielski start the mail dispatcher in order to send the 77*b1cdbd2cSJim Jagielski enqueued mail messages. 78*b1cdbd2cSJim Jagielski 79*b1cdbd2cSJim Jagielski @param xMailMessage 80*b1cdbd2cSJim Jagielski [in] a mail message that should be send. 81*b1cdbd2cSJim Jagielski */ 82*b1cdbd2cSJim Jagielski void enqueueMailMessage(::com::sun::star::uno::Reference< ::com::sun::star::mail::XMailMessage> xMailMessage); 83*b1cdbd2cSJim Jagielski /** 84*b1cdbd2cSJim Jagielski Dequeues a mail message. 85*b1cdbd2cSJim Jagielski This enables the caller to remove attachments when sending mails is to be cancelled. 86*b1cdbd2cSJim Jagielski */ 87*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Reference< ::com::sun::star::mail::XMailMessage> dequeueMailMessage(); 88*b1cdbd2cSJim Jagielski 89*b1cdbd2cSJim Jagielski /** 90*b1cdbd2cSJim Jagielski Start sending mail messages asynchronously. A client may register 91*b1cdbd2cSJim Jagielski a listener for mail dispatcher events. For every mail message sent 92*b1cdbd2cSJim Jagielski the notification will be sent. While handling such notification a 93*b1cdbd2cSJim Jagielski client may enqueue new mail messages. If there are no more mail 94*b1cdbd2cSJim Jagielski messages to send an respective notification is sent and the mail 95*b1cdbd2cSJim Jagielski dispatcher waits for more mail messages. 96*b1cdbd2cSJim Jagielski 97*b1cdbd2cSJim Jagielski @precond not isStarted() 98*b1cdbd2cSJim Jagielski */ 99*b1cdbd2cSJim Jagielski void start(); 100*b1cdbd2cSJim Jagielski 101*b1cdbd2cSJim Jagielski /** 102*b1cdbd2cSJim Jagielski Stop sending mail messages. 103*b1cdbd2cSJim Jagielski 104*b1cdbd2cSJim Jagielski @precond isStarted() 105*b1cdbd2cSJim Jagielski */ 106*b1cdbd2cSJim Jagielski void stop(); 107*b1cdbd2cSJim Jagielski 108*b1cdbd2cSJim Jagielski /** 109*b1cdbd2cSJim Jagielski Request shutdown of the mail dispatcher thread. 110*b1cdbd2cSJim Jagielski NOTE: You must call this method before you release 111*b1cdbd2cSJim Jagielski your last reference to this class otherwise the 112*b1cdbd2cSJim Jagielski mail dispatcher thread will never end. 113*b1cdbd2cSJim Jagielski */ 114*b1cdbd2cSJim Jagielski void shutdown(); 115*b1cdbd2cSJim Jagielski 116*b1cdbd2cSJim Jagielski /** 117*b1cdbd2cSJim Jagielski Check whether the mail dispatcher is started or not. 118*b1cdbd2cSJim Jagielski 119*b1cdbd2cSJim Jagielski @return 120*b1cdbd2cSJim Jagielski <TRUE/> if the sending thread is running. 121*b1cdbd2cSJim Jagielski */ 122*b1cdbd2cSJim Jagielski bool isStarted() const; 123*b1cdbd2cSJim Jagielski 124*b1cdbd2cSJim Jagielski /** returns if the thread is still running 125*b1cdbd2cSJim Jagielski */ 126*b1cdbd2cSJim Jagielski using osl::Thread::isRunning; 127*b1cdbd2cSJim Jagielski 128*b1cdbd2cSJim Jagielski /** returns if shutdown has already been called 129*b1cdbd2cSJim Jagielski */ isShutdownRequested() const130*b1cdbd2cSJim Jagielski bool isShutdownRequested() const 131*b1cdbd2cSJim Jagielski { return shutdown_requested_; } 132*b1cdbd2cSJim Jagielski /** 133*b1cdbd2cSJim Jagielski Register a listener for mail dispatcher events. 134*b1cdbd2cSJim Jagielski */ 135*b1cdbd2cSJim Jagielski void addListener(::rtl::Reference<IMailDispatcherListener> listener); 136*b1cdbd2cSJim Jagielski 137*b1cdbd2cSJim Jagielski /** 138*b1cdbd2cSJim Jagielski Unregister a listener for mail dispatcher events 139*b1cdbd2cSJim Jagielski */ 140*b1cdbd2cSJim Jagielski void removeListener(::rtl::Reference<IMailDispatcherListener> listener); 141*b1cdbd2cSJim Jagielski 142*b1cdbd2cSJim Jagielski protected: 143*b1cdbd2cSJim Jagielski virtual void SAL_CALL run(); 144*b1cdbd2cSJim Jagielski virtual void SAL_CALL onTerminated(); 145*b1cdbd2cSJim Jagielski 146*b1cdbd2cSJim Jagielski private: 147*b1cdbd2cSJim Jagielski std::list< ::rtl::Reference<IMailDispatcherListener> > cloneListener(); 148*b1cdbd2cSJim Jagielski void sendMailMessageNotifyListener(::com::sun::star::uno::Reference< ::com::sun::star::mail::XMailMessage> message); 149*b1cdbd2cSJim Jagielski 150*b1cdbd2cSJim Jagielski private: 151*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Reference< ::com::sun::star::mail::XSmtpService> mailserver_; 152*b1cdbd2cSJim Jagielski ::std::list< ::com::sun::star::uno::Reference< ::com::sun::star::mail::XMailMessage > > messages_; 153*b1cdbd2cSJim Jagielski ::std::list< ::rtl::Reference<IMailDispatcherListener> > listeners_; 154*b1cdbd2cSJim Jagielski ::osl::Mutex message_container_mutex_; 155*b1cdbd2cSJim Jagielski ::osl::Mutex listener_container_mutex_; 156*b1cdbd2cSJim Jagielski ::osl::Mutex thread_status_mutex_; 157*b1cdbd2cSJim Jagielski ::osl::Condition mail_dispatcher_active_; 158*b1cdbd2cSJim Jagielski ::osl::Condition wakening_call_; 159*b1cdbd2cSJim Jagielski ::rtl::Reference<MailDispatcher> m_xSelfReference; 160*b1cdbd2cSJim Jagielski bool run_; 161*b1cdbd2cSJim Jagielski bool shutdown_requested_; 162*b1cdbd2cSJim Jagielski }; 163*b1cdbd2cSJim Jagielski 164*b1cdbd2cSJim Jagielski #endif // INCLUDED_MAILDISPATCHER_HXX 165