summaryrefslogtreecommitdiffstats
path: root/libmail/mboxmultilock.H
diff options
context:
space:
mode:
Diffstat (limited to 'libmail/mboxmultilock.H')
-rw-r--r--libmail/mboxmultilock.H126
1 files changed, 126 insertions, 0 deletions
diff --git a/libmail/mboxmultilock.H b/libmail/mboxmultilock.H
new file mode 100644
index 0000000..9100ff0
--- /dev/null
+++ b/libmail/mboxmultilock.H
@@ -0,0 +1,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