| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
 | /*
** Copyright 2002, Double Precision Inc.
**
** See COPYING for distribution information.
*/
#ifndef libmail_mboxmultilock_H
#define libmail_mboxmultilock_H
#include "libmail_config.h"
#include "mboxlock.H"
//
// A request for multiple messages would normally result in a separate lock
// attempt for each message.  Horribly inefficient.
//
// What we do is open a lock first, and save it in the mail::mbox object.
// Before we actually try to lock something check if this lock is already
// obtained.  If so, just reuse the lock
//
LIBMAIL_START
class mbox::MultiLock : public mbox::LockTask {
	bool locked(file &fileArg); // No-op
public:
	MultiLock(mbox &mboxAccount,
		  mail::callback &callbackArg);
	~MultiLock();
	bool locked(mbox::lock &mlock, std::string path);
};
class mbox::MultiLockGenericAttributes : public callback {
	ptr<mbox> mboxAccount;
	std::vector<size_t> messages;
	MessageAttributes attributes;
	mail::callback::message &callback;
	void reportProgress(size_t bytesCompleted,
			    size_t bytesEstimatedTotal,
			    size_t messagesCompleted,
			    size_t messagesEstimatedTotal);
public:
	MultiLockGenericAttributes(mbox &mboxAccountArg,
				   const std::vector<size_t> &messagesArg,
				   MessageAttributes attributesArg,
				   mail::callback::message &callbackArg);
	~MultiLockGenericAttributes();
	void success(std::string message);
	void fail(std::string message);
};
class mbox::MultiLockGenericMessageRead : public callback {
	ptr<mbox> mboxAccount;
	const std::vector<size_t> messages;
	bool peek;
	enum mail::readMode readType;
	bool justHeader;
	bool justContents;
	callback::message &callback;
	void reportProgress(size_t bytesCompleted,
			    size_t bytesEstimatedTotal,
			    size_t messagesCompleted,
			    size_t messagesEstimatedTotal);
public:
	MultiLockGenericMessageRead(mbox &mboxAccountArg,
				    const std::vector<size_t> &messagesArg,
				    bool peekArg,
				    enum mail::readMode readTypeArg,
				    callback::message &callbackArg);
	~MultiLockGenericMessageRead();
	void success(std::string message);
	void fail(std::string message);
};
//
// After we're done with a multilocked request, we can free the lock
//
class mbox::MultiLockRelease : public callback::message {
	callback::message * volatile origCallback;
	ptr<mbox> mboxAccount;
public:
	MultiLockRelease(mbox &mboxAccountArg,
			 callback::message &origCallbackArg);
	~MultiLockRelease();
	void success(std::string message);
	void fail(std::string message);
	void messageEnvelopeCallback(size_t messageNumber,
				     const envelope &envelope);
	void messageArrivalDateCallback(size_t messageNumber,
					time_t datetime);
	void messageSizeCallback(size_t messageNumber,
				 unsigned long size);
	void messageStructureCallback(size_t messageNumber,
				      const mimestruct &messageStructure);
	void messageTextCallback(size_t n, std::string text);
	void reportProgress(size_t bytesCompleted,
			    size_t bytesEstimatedTotal,
			    size_t messagesCompleted,
			    size_t messagesEstimatedTotal);
};
LIBMAIL_END
#endif
 |