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