1 /*
2 ** Copyright 2002, Double Precision Inc.
3 **
4 ** See COPYING for distribution information.
5 */
6 #include "libmail_config.h"
7 #include "mboxmultilock.H"
8
9 using namespace std;
10
MultiLock(mail::mbox & mboxAccount,mail::callback & callbackArg)11 mail::mbox::MultiLock::MultiLock(mail::mbox &mboxAccount,
12 mail::callback &callbackArg)
13 :LockTask(mboxAccount, callbackArg)
14 {
15 }
16
~MultiLock()17 mail::mbox::MultiLock::~MultiLock()
18 {
19 }
20
locked(mail::mbox::lock & mlock,string path)21 bool mail::mbox::MultiLock::locked(mail::mbox::lock &mlock,
22 string path)
23 {
24 if (mboxAccount.multiLockLock &&
25 mboxAccount.multiLockFilename == path) // This is me
26 ;
27 else
28 {
29 if (mboxAccount.multiLockLock)
30 {
31 delete mboxAccount.multiLockLock;
32 mboxAccount.multiLockLock=NULL;
33 }
34
35 mboxAccount.multiLockFilename=path;
36 mboxAccount.multiLockLock=mlock.copy();
37 }
38
39 callback.success("Folder locked");
40 done();
41 return true;
42 }
43
locked(file & fileArg)44 bool mail::mbox::MultiLock::locked(file &fileArg) // No-op
45 {
46 return true;
47 }
48
49 /////////////////////////////////////////////////////////////////////////////
50 //
51 // After obtaining a MultiLock, finally do genericMessageAttributes/Read
52
53 mail::mbox::MultiLockGenericAttributes
MultiLockGenericAttributes(mbox & mboxAccountArg,const std::vector<size_t> & messagesArg,MessageAttributes attributesArg,mail::callback::message & callbackArg)54 ::MultiLockGenericAttributes(mbox &mboxAccountArg,
55 const std::vector<size_t> &messagesArg,
56 MessageAttributes attributesArg,
57 mail::callback::message &callbackArg)
58 : mboxAccount(&mboxAccountArg),
59 messages(messagesArg),
60 attributes(attributesArg),
61 callback(callbackArg)
62 {
63 }
64
~MultiLockGenericAttributes()65 mail::mbox::MultiLockGenericAttributes::~MultiLockGenericAttributes()
66 {
67 }
68
success(std::string message)69 void mail::mbox::MultiLockGenericAttributes::success(std::string message)
70 {
71 try {
72 if (mboxAccount.isDestroyed())
73 {
74 fail("Operation aborted.");
75 return;
76 }
77
78 mboxAccount->genericAttributes(&*mboxAccount,
79 &*mboxAccount,
80 messages,
81 attributes,
82 callback);
83 delete this;
84 } catch (...) {
85 fail("An exception occured in mbox::MultiLockGenericAttributes");
86 }
87 }
88
fail(string message)89 void mail::mbox::MultiLockGenericAttributes::fail(string message)
90 {
91 try {
92 callback.fail(message);
93 delete this;
94 } catch (...) {
95 delete this;
96 LIBMAIL_THROW(LIBMAIL_THROW_EMPTY);
97 }
98 }
99
100 void mail::mbox::MultiLockGenericAttributes
reportProgress(size_t bytesCompleted,size_t bytesEstimatedTotal,size_t messagesCompleted,size_t messagesEstimatedTotal)101 ::reportProgress(size_t bytesCompleted,
102 size_t bytesEstimatedTotal,
103
104 size_t messagesCompleted,
105 size_t messagesEstimatedTotal)
106 {
107 callback.reportProgress(bytesCompleted, bytesEstimatedTotal,
108 messagesCompleted, messagesEstimatedTotal);
109 }
110
111 //
112
113 mail::mbox::MultiLockGenericMessageRead
MultiLockGenericMessageRead(mbox & mboxAccountArg,const vector<size_t> & messagesArg,bool peekArg,enum mail::readMode readTypeArg,mail::callback::message & callbackArg)114 ::MultiLockGenericMessageRead(mbox &mboxAccountArg,
115 const vector<size_t> &messagesArg,
116 bool peekArg,
117 enum mail::readMode readTypeArg,
118 mail::callback::message &callbackArg)
119 : mboxAccount(&mboxAccountArg),
120 messages(messagesArg),
121 peek(peekArg),
122 readType(readTypeArg),
123 callback(callbackArg)
124 {
125 }
126
~MultiLockGenericMessageRead()127 mail::mbox::MultiLockGenericMessageRead::~MultiLockGenericMessageRead()
128 {
129 }
130
success(std::string message)131 void mail::mbox::MultiLockGenericMessageRead::success(std::string message)
132 {
133 try {
134 if (mboxAccount.isDestroyed())
135 {
136 fail("Operation aborted.");
137 return;
138 }
139
140 mboxAccount->genericReadMessageContent(&*mboxAccount,
141 &*mboxAccount,
142 messages,
143 peek,
144 readType,
145 callback);
146 delete this;
147 } catch (...) {
148 fail("An exception occured in mbox::MultiLockGenericAttributes");
149 }
150 }
151
fail(std::string message)152 void mail::mbox::MultiLockGenericMessageRead::fail(std::string message)
153 {
154 try {
155 callback.fail(message);
156 delete this;
157 } catch (...) {
158 delete this;
159 LIBMAIL_THROW(LIBMAIL_THROW_EMPTY);
160 }
161 }
162
163 void mail::mbox::MultiLockGenericMessageRead
reportProgress(size_t bytesCompleted,size_t bytesEstimatedTotal,size_t messagesCompleted,size_t messagesEstimatedTotal)164 ::reportProgress(size_t bytesCompleted,
165 size_t bytesEstimatedTotal,
166
167 size_t messagesCompleted,
168 size_t messagesEstimatedTotal)
169 {
170 callback.reportProgress(bytesCompleted, bytesEstimatedTotal,
171 messagesCompleted, messagesEstimatedTotal);
172 }
173
174 /////////////////////////////////////////////////////////////////////////////
175 //
176 // Cleanup.
177
MultiLockRelease(mbox & mboxAccountArg,callback::message & origCallbackArg)178 mail::mbox::MultiLockRelease::MultiLockRelease(mbox &mboxAccountArg,
179 callback::message
180 &origCallbackArg)
181 : origCallback(&origCallbackArg),
182 mboxAccount(&mboxAccountArg)
183 {
184 }
185
~MultiLockRelease()186 mail::mbox::MultiLockRelease::~MultiLockRelease()
187 {
188 if (origCallback)
189 {
190 callback *p=origCallback;
191
192 origCallback=NULL;
193
194 try {
195 p->fail("Request aborted.");
196 delete p;
197 } catch (...) {
198 delete p;
199 }
200 }
201 }
202
success(std::string message)203 void mail::mbox::MultiLockRelease::success(std::string message)
204 {
205 if (!mboxAccount.isDestroyed() &&
206 mboxAccount->multiLockLock)
207 {
208 delete mboxAccount->multiLockLock;
209 mboxAccount->multiLockLock=NULL;
210 }
211
212 callback *p=origCallback;
213
214 origCallback=NULL;
215
216 try {
217 p->success(message);
218 } catch (...) {
219 delete this;
220 LIBMAIL_THROW(LIBMAIL_THROW_EMPTY);
221 }
222 delete this;
223 }
224
fail(std::string message)225 void mail::mbox::MultiLockRelease::fail(std::string message)
226 {
227 if (!mboxAccount.isDestroyed() &&
228 mboxAccount->multiLockLock)
229 {
230 delete mboxAccount->multiLockLock;
231 mboxAccount->multiLockLock=NULL;
232 }
233
234 callback *p=origCallback;
235
236 origCallback=NULL;
237
238 try {
239 if (p)
240 p->fail(message);
241 delete this;
242 } catch (...) {
243 delete this;
244 LIBMAIL_THROW(LIBMAIL_THROW_EMPTY);
245 }
246 }
247
messageEnvelopeCallback(size_t messageNumber,const envelope & envelopeArg)248 void mail::mbox::MultiLockRelease::messageEnvelopeCallback(size_t
249 messageNumber,
250 const envelope
251 &envelopeArg)
252 {
253 if (origCallback)
254 origCallback->messageEnvelopeCallback(messageNumber,
255 envelopeArg);
256 }
257
messageArrivalDateCallback(size_t messageNumber,time_t datetime)258 void mail::mbox::MultiLockRelease::messageArrivalDateCallback(size_t
259 messageNumber,
260 time_t datetime)
261 {
262 if (origCallback)
263 origCallback->messageArrivalDateCallback(messageNumber,
264 datetime);
265 }
266
messageSizeCallback(size_t messageNumber,unsigned long size)267 void mail::mbox::MultiLockRelease::messageSizeCallback(size_t messageNumber,
268 unsigned long size)
269 {
270 if (origCallback)
271 origCallback->messageSizeCallback(messageNumber,
272 size);
273 }
274
messageStructureCallback(size_t messageNumber,const mimestruct & messageStructure)275 void mail::mbox::MultiLockRelease::messageStructureCallback(size_t
276 messageNumber,
277 const mimestruct &
278 messageStructure)
279 {
280 if (origCallback)
281 origCallback->messageStructureCallback(messageNumber,
282 messageStructure);
283 }
284
messageTextCallback(size_t n,string text)285 void mail::mbox::MultiLockRelease::messageTextCallback(size_t n,
286 string text)
287 {
288 if (origCallback)
289 origCallback->messageTextCallback(n, text);
290 }
291
reportProgress(size_t bytesCompleted,size_t bytesEstimatedTotal,size_t messagesCompleted,size_t messagesEstimatedTot)292 void mail::mbox::MultiLockRelease::reportProgress(size_t bytesCompleted,
293 size_t bytesEstimatedTotal,
294 size_t messagesCompleted,
295 size_t messagesEstimatedTot)
296 {
297 if (origCallback)
298 origCallback->reportProgress(bytesCompleted,
299 bytesEstimatedTotal,
300 messagesCompleted,
301 messagesEstimatedTot);
302 }
303