]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Added proxy classes for use with modules.
authorTimo Sirainen <tss@iki.fi>
Sat, 26 Jul 2003 18:23:10 +0000 (21:23 +0300)
committerTimo Sirainen <tss@iki.fi>
Sat, 26 Jul 2003 18:23:10 +0000 (21:23 +0300)
--HG--
branch : HEAD

src/lib-storage/Makefile.am
src/lib-storage/proxy-mail-storage.c [new file with mode: 0644]
src/lib-storage/proxy-mail-storage.h [new file with mode: 0644]
src/lib-storage/proxy-mail.c [new file with mode: 0644]
src/lib-storage/proxy-mail.h [new file with mode: 0644]
src/lib-storage/proxy-mailbox.c [new file with mode: 0644]
src/lib-storage/proxy-mailbox.h [new file with mode: 0644]

index 56049bc4e06d7118892bd68c34627682163fe2f7..01fe71e3c7a76b1041d81f33df1cad3966d98b4e 100644 (file)
@@ -10,9 +10,15 @@ INCLUDES = \
 libstorage_a_SOURCES = \
        mail-save.c \
        mail-search.c \
-       mail-storage.c
+       mail-storage.c \
+       proxy-mail.c \
+       proxy-mail-storage.c \
+       proxy-mailbox.c
 
 noinst_HEADERS = \
        mail-save.h \
        mail-search.h \
-       mail-storage.h
+       mail-storage.h \
+       proxy-mail.h \
+       proxy-mail-storage.h \
+       proxy-mailbox.h
diff --git a/src/lib-storage/proxy-mail-storage.c b/src/lib-storage/proxy-mail-storage.c
new file mode 100644 (file)
index 0000000..b5e1027
--- /dev/null
@@ -0,0 +1,113 @@
+/* Copyright (C) 2003 Timo Sirainen */
+
+#include "lib.h"
+#include "proxy-mail-storage.h"
+
+static void _free(struct mail_storage *storage)
+{
+       struct proxy_mail_storage *s = (struct proxy_mail_storage *) storage;
+
+       return s->storage->free(s->storage);
+}
+
+static void _set_callbacks(struct mail_storage *storage,
+                          struct mail_storage_callbacks *callbacks,
+                          void *context)
+{
+       struct proxy_mail_storage *s = (struct proxy_mail_storage *) storage;
+
+       s->storage->set_callbacks(s->storage, callbacks, context);
+}
+
+static struct mailbox *_open_mailbox(struct mail_storage *storage,
+                                    const char *name,
+                                    enum mailbox_open_flags flags)
+{
+       struct proxy_mail_storage *s = (struct proxy_mail_storage *) storage;
+
+        return s->storage->open_mailbox(s->storage, name, flags);
+}
+
+static int _create_mailbox(struct mail_storage *storage, const char *name,
+                          int only_hierarchy)
+{
+       struct proxy_mail_storage *s = (struct proxy_mail_storage *) storage;
+
+       return s->storage->create_mailbox(s->storage, name, only_hierarchy);
+}
+
+static int _delete_mailbox(struct mail_storage *storage, const char *name)
+{
+       struct proxy_mail_storage *s = (struct proxy_mail_storage *) storage;
+
+       return s->storage->delete_mailbox(s->storage, name);
+}
+
+static int _rename_mailbox(struct mail_storage *storage, const char *oldname,
+                          const char *newname)
+{
+       struct proxy_mail_storage *s = (struct proxy_mail_storage *) storage;
+
+       return s->storage->rename_mailbox(s->storage, oldname, newname);
+}
+
+static struct mailbox_list_context *
+_list_mailbox_init(struct mail_storage *storage, const char *mask,
+                  enum mailbox_list_flags flags, int *sorted)
+{
+       struct proxy_mail_storage *s = (struct proxy_mail_storage *) storage;
+
+       return s->storage->list_mailbox_init(s->storage, mask, flags, sorted);
+}
+
+static int _set_subscribed(struct mail_storage *storage,
+                          const char *name, int set)
+{
+       struct proxy_mail_storage *s = (struct proxy_mail_storage *) storage;
+
+       return s->storage->set_subscribed(s->storage, name, set);
+}
+
+static int _get_mailbox_name_status(struct mail_storage *storage,
+                                   const char *name,
+                                   enum mailbox_name_status *status)
+{
+       struct proxy_mail_storage *s = (struct proxy_mail_storage *) storage;
+
+       return s->storage->get_mailbox_name_status(s->storage, name, status);
+}
+
+static const char *_get_last_error(struct mail_storage *storage,
+                                  int *syntax_error)
+{
+       struct proxy_mail_storage *s = (struct proxy_mail_storage *) storage;
+
+       return s->storage->get_last_error(s->storage, syntax_error);
+}
+
+void proxy_mail_storage_init(struct proxy_mail_storage *proxy,
+                            struct mail_storage *storage)
+{
+       struct mail_storage *ps = &proxy->proxy_storage;
+
+       proxy->storage = storage;
+
+       ps->name = storage->name;
+       ps->hierarchy_sep = storage->hierarchy_sep;
+
+       ps->create = storage->create;
+       ps->autodetect = storage->autodetect;
+       ps->list_mailbox_deinit = storage->list_mailbox_deinit;
+       ps->list_mailbox_next = storage->list_mailbox_next;
+
+       ps->free = _free;
+       ps->set_callbacks = _set_callbacks;
+       ps->open_mailbox = _open_mailbox;
+       ps->create_mailbox = _create_mailbox;
+       ps->delete_mailbox = _delete_mailbox;
+       ps->rename_mailbox = _rename_mailbox;
+       ps->list_mailbox_init = _list_mailbox_init;
+       ps->set_subscribed = _set_subscribed;
+       ps->get_mailbox_name_status = _get_mailbox_name_status;
+       ps->get_last_error = _get_last_error;
+}
diff --git a/src/lib-storage/proxy-mail-storage.h b/src/lib-storage/proxy-mail-storage.h
new file mode 100644 (file)
index 0000000..c46db8c
--- /dev/null
@@ -0,0 +1,14 @@
+#ifndef __PROXY_MAIL_STORAGE_H
+#define __PROXY_MAIL_STORAGE_H
+
+#include "mail-storage.h"
+
+struct proxy_mail_storage {
+       struct mail_storage proxy_storage;
+       struct mail_storage *storage;
+};
+
+void proxy_mail_storage_init(struct proxy_mail_storage *proxy,
+                            struct mail_storage *storage);
+
+#endif
diff --git a/src/lib-storage/proxy-mail.c b/src/lib-storage/proxy-mail.c
new file mode 100644 (file)
index 0000000..7ab43c2
--- /dev/null
@@ -0,0 +1,132 @@
+/* Copyright (C) 2003 Timo Sirainen */
+
+#include "lib.h"
+#include "proxy-mail.h"
+
+static const struct mail_full_flags *_get_flags(struct mail *mail)
+{
+       struct proxy_mail *p = (struct proxy_mail *) mail;
+
+       return p->mail->get_flags(p->mail);
+}
+
+static const struct message_part *_get_parts(struct mail *mail)
+{
+       struct proxy_mail *p = (struct proxy_mail *) mail;
+
+       return p->mail->get_parts(p->mail);
+}
+
+static time_t _get_received_date(struct mail *mail)
+{
+       struct proxy_mail *p = (struct proxy_mail *) mail;
+
+       return p->mail->get_received_date(p->mail);
+}
+
+static time_t _get_date(struct mail *mail, int *timezone)
+{
+       struct proxy_mail *p = (struct proxy_mail *) mail;
+
+       return p->mail->get_date(p->mail, timezone);
+}
+
+static uoff_t _get_size(struct mail *mail)
+{
+       struct proxy_mail *p = (struct proxy_mail *) mail;
+
+       return p->mail->get_size(p->mail);
+}
+
+static const char *_get_header(struct mail *mail, const char *field)
+{
+       struct proxy_mail *p = (struct proxy_mail *) mail;
+
+       return p->mail->get_header(p->mail, field);
+}
+
+static const struct message_address *
+_get_address(struct mail *mail, const char *field)
+{
+       struct proxy_mail *p = (struct proxy_mail *) mail;
+
+       return p->mail->get_address(p->mail, field);
+}
+
+static const char *_get_first_mailbox(struct mail *mail, const char *field)
+{
+       struct proxy_mail *p = (struct proxy_mail *) mail;
+
+       return p->mail->get_first_mailbox(p->mail, field);
+}
+
+static struct istream *_get_stream(struct mail *mail,
+                                  struct message_size *hdr_size,
+                                  struct message_size *body_size)
+{
+       struct proxy_mail *p = (struct proxy_mail *) mail;
+
+       return p->mail->get_stream(p->mail, hdr_size, body_size);
+}
+
+static const char *_get_special(struct mail *mail, enum mail_fetch_field field)
+{
+       struct proxy_mail *p = (struct proxy_mail *) mail;
+
+       return p->mail->get_special(p->mail, field);
+}
+
+static int _update_flags(struct mail *mail, const struct mail_full_flags *flags,
+                        enum modify_type modify_type)
+{
+       struct proxy_mail *p = (struct proxy_mail *) mail;
+
+       return p->mail->update_flags(p->mail, flags, modify_type);
+}
+
+static int _copy(struct mail *mail, struct mail_copy_context *ctx)
+{
+       struct proxy_mail *p = (struct proxy_mail *) mail;
+
+       return p->mail->copy(p->mail, ctx);
+}
+
+static int _expunge(struct mail *mail, struct mail_expunge_context *ctx,
+                   unsigned int *seq_r, int notify)
+{
+       struct proxy_mail *p = (struct proxy_mail *) mail;
+
+       return p->mail->expunge(p->mail, ctx, seq_r, notify);
+}
+
+void proxy_mail_init(struct proxy_mail *proxy, struct mail *mail)
+{
+       struct mail *pm = &proxy->proxy_mail;
+
+       proxy->mail = mail;
+
+       pm->box = mail->box;
+
+       pm->get_flags = _get_flags;
+       pm->get_parts = _get_parts;
+       pm->get_received_date = _get_received_date;
+       pm->get_date = _get_date;
+       pm->get_size = _get_size;
+       pm->get_header = _get_header;
+       pm->get_address = _get_address;
+       pm->get_first_mailbox = _get_first_mailbox;
+       pm->get_stream = _get_stream;
+       pm->get_special = _get_special;
+       pm->update_flags = _update_flags;
+       pm->copy = _copy;
+       pm->expunge = _expunge;
+}
+
+void proxy_mail_next(struct proxy_mail *proxy)
+{
+       proxy->proxy_mail.seq = proxy->mail->seq;
+       proxy->proxy_mail.uid = proxy->mail->uid;
+
+       proxy->proxy_mail.has_nuls = proxy->mail->has_nuls;
+       proxy->proxy_mail.has_no_nuls = proxy->mail->has_no_nuls;
+}
diff --git a/src/lib-storage/proxy-mail.h b/src/lib-storage/proxy-mail.h
new file mode 100644 (file)
index 0000000..a98dfee
--- /dev/null
@@ -0,0 +1,14 @@
+#ifndef __PROXY_MAIL_H
+#define __PROXY_MAIL_H
+
+#include "mail-storage.h"
+
+struct proxy_mail {
+       struct mail proxy_mail;
+       struct mail *mail;
+};
+
+void proxy_mail_init(struct proxy_mail *proxy, struct mail *mail);
+void proxy_mail_next(struct proxy_mail *proxy);
+
+#endif
diff --git a/src/lib-storage/proxy-mailbox.c b/src/lib-storage/proxy-mailbox.c
new file mode 100644 (file)
index 0000000..f66c7db
--- /dev/null
@@ -0,0 +1,169 @@
+/* Copyright (C) 2003 Timo Sirainen */
+
+#include "lib.h"
+#include "proxy-mailbox.h"
+
+static int _is_readonly(struct mailbox *box)
+{
+       struct proxy_mailbox *p = (struct proxy_mailbox *) box;
+
+       return p->box->is_readonly(p->box);
+}
+
+static int _allow_new_custom_flags(struct mailbox *box)
+{
+       struct proxy_mailbox *p = (struct proxy_mailbox *) box;
+
+       return p->box->allow_new_custom_flags(p->box);
+}
+
+static int _close(struct mailbox *box)
+{
+       struct proxy_mailbox *p = (struct proxy_mailbox *) box;
+
+       return p->box->close(p->box);
+}
+
+static int _lock(struct mailbox *box, enum mailbox_lock_type lock_type)
+{
+       struct proxy_mailbox *p = (struct proxy_mailbox *) box;
+
+       return p->box->lock(p->box, lock_type);
+}
+
+static int _get_status(struct mailbox *box, enum mailbox_status_items items,
+                      struct mailbox_status *status)
+{
+       struct proxy_mailbox *p = (struct proxy_mailbox *) box;
+
+       return p->box->get_status(p->box, items, status);
+}
+
+static int _sync(struct mailbox *box, enum mail_sync_flags flags)
+{
+       struct proxy_mailbox *p = (struct proxy_mailbox *) box;
+
+       return p->box->sync(p->box, flags);
+}
+
+static void _auto_sync(struct mailbox *box, enum mailbox_sync_type sync_type,
+                      unsigned int min_newmail_notify_interval)
+{
+       struct proxy_mailbox *p = (struct proxy_mailbox *) box;
+
+       p->box->auto_sync(p->box, sync_type, min_newmail_notify_interval);
+}
+
+static struct mail_fetch_context *
+_fetch_init(struct mailbox *box, enum mail_fetch_field wanted_fields,
+           const char *messageset, int uidset)
+{
+       struct proxy_mailbox *p = (struct proxy_mailbox *) box;
+
+       return p->box->fetch_init(p->box, wanted_fields, messageset, uidset);
+}
+
+static struct mail *_fetch_uid(struct mailbox *box, unsigned int uid,
+                              enum mail_fetch_field wanted_fields)
+{
+       struct proxy_mailbox *p = (struct proxy_mailbox *) box;
+
+       return p->box->fetch_uid(p->box, uid, wanted_fields);
+}
+
+static struct mail *_fetch_seq(struct mailbox *box, unsigned int seq,
+                              enum mail_fetch_field wanted_fields)
+{
+       struct proxy_mailbox *p = (struct proxy_mailbox *) box;
+
+       return p->box->fetch_uid(p->box, seq, wanted_fields);
+}
+
+static int _search_get_sorting(struct mailbox *box,
+                              enum mail_sort_type *sort_program)
+{
+       struct proxy_mailbox *p = (struct proxy_mailbox *) box;
+
+       return p->box->search_get_sorting(p->box, sort_program);
+}
+
+static struct mail_search_context *
+_search_init(struct mailbox *box, const char *charset,
+            struct mail_search_arg *args,
+            const enum mail_sort_type *sort_program,
+            enum mail_fetch_field wanted_fields,
+            const char *const wanted_headers[])
+{
+       struct proxy_mailbox *p = (struct proxy_mailbox *) box;
+
+       return p->box->search_init(p->box, charset, args, sort_program,
+                                  wanted_fields, wanted_headers);
+}
+
+static struct mail_save_context *
+_save_init(struct mailbox *box, int transaction)
+{
+       struct proxy_mailbox *p = (struct proxy_mailbox *) box;
+
+       return p->box->save_init(p->box, transaction);
+}
+
+static struct mail_copy_context *_copy_init(struct mailbox *box)
+{
+       struct proxy_mailbox *p = (struct proxy_mailbox *) box;
+
+       return p->box->copy_init(p->box);
+}
+
+static struct mail_expunge_context *
+_expunge_init(struct mailbox *box, enum mail_fetch_field wanted_fields,
+             int expunge_all)
+{
+       struct proxy_mailbox *p = (struct proxy_mailbox *) box;
+
+       return p->box->expunge_init(p->box, wanted_fields, expunge_all);
+}
+
+static int _is_inconsistency_error(struct mailbox *box)
+{
+       struct proxy_mailbox *p = (struct proxy_mailbox *) box;
+
+       return p->box->is_inconsistency_error(p->box);
+}
+
+void proxy_mailbox_init(struct proxy_mailbox *proxy, struct mailbox *box)
+{
+       struct mailbox *pb = &proxy->proxy_box;
+
+       proxy->box = box;
+
+       pb->name = box->name;
+       pb->storage = box->storage;
+
+       pb->fetch_deinit = box->fetch_deinit;
+       pb->fetch_next = box->fetch_next;
+       pb->search_deinit = box->search_deinit;
+       pb->search_next = box->search_next;
+       pb->save_deinit = box->save_deinit;
+       pb->save_next = box->save_next;
+       pb->copy_deinit = box->copy_deinit;
+       pb->expunge_deinit = box->expunge_deinit;
+       pb->expunge_fetch_next = box->expunge_fetch_next;
+
+       pb->is_readonly = _is_readonly;
+       pb->allow_new_custom_flags = _allow_new_custom_flags;
+       pb->close = _close;
+       pb->lock = _lock;
+       pb->get_status = _get_status;
+       pb->sync = _sync;
+       pb->auto_sync = _auto_sync;
+       pb->fetch_init = _fetch_init;
+       pb->fetch_uid = _fetch_uid;
+       pb->fetch_seq = _fetch_seq;
+       pb->search_get_sorting = _search_get_sorting;
+       pb->search_init = _search_init;
+       pb->save_init = _save_init;
+       pb->copy_init = _copy_init;
+       pb->expunge_init = _expunge_init;
+       pb->is_inconsistency_error = _is_inconsistency_error;
+}
diff --git a/src/lib-storage/proxy-mailbox.h b/src/lib-storage/proxy-mailbox.h
new file mode 100644 (file)
index 0000000..a26ce04
--- /dev/null
@@ -0,0 +1,13 @@
+#ifndef __PROXY_MAILBOX_H
+#define __PROXY_MAILBOX_H
+
+#include "mail-storage.h"
+
+struct proxy_mailbox {
+       struct mailbox proxy_box;
+       struct mailbox *box;
+};
+
+void proxy_mailbox_init(struct proxy_mailbox *proxy, struct mailbox *box);
+
+#endif