summaryrefslogtreecommitdiffstats
path: root/libmail/mboxmultilock.H
blob: 9100ff05841f38f61e8f1d2e5d325de720017586 (plain)
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