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
--- /dev/null
+/* 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;
+}
--- /dev/null
+#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
--- /dev/null
+/* 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;
+}
--- /dev/null
+#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
--- /dev/null
+/* 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;
+}
--- /dev/null
+#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