xref: /aoo4110/main/sw/source/ui/inc/maildispatcher.hxx (revision b1cdbd2c)
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