From: Timo Sirainen Date: Sat, 26 Jul 2003 18:23:10 +0000 (+0300) Subject: Added proxy classes for use with modules. X-Git-Tag: 1.1.alpha1~4462 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ba6c1d5d6227dc42cb08c59c8bfc93c2964552f2;p=thirdparty%2Fdovecot%2Fcore.git Added proxy classes for use with modules. --HG-- branch : HEAD --- diff --git a/src/lib-storage/Makefile.am b/src/lib-storage/Makefile.am index 56049bc4e0..01fe71e3c7 100644 --- a/src/lib-storage/Makefile.am +++ b/src/lib-storage/Makefile.am @@ -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 index 0000000000..b5e1027765 --- /dev/null +++ b/src/lib-storage/proxy-mail-storage.c @@ -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 index 0000000000..c46db8c901 --- /dev/null +++ b/src/lib-storage/proxy-mail-storage.h @@ -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 index 0000000000..7ab43c2629 --- /dev/null +++ b/src/lib-storage/proxy-mail.c @@ -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 index 0000000000..a98dfee5df --- /dev/null +++ b/src/lib-storage/proxy-mail.h @@ -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 index 0000000000..f66c7db80f --- /dev/null +++ b/src/lib-storage/proxy-mailbox.c @@ -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 index 0000000000..a26ce04336 --- /dev/null +++ b/src/lib-storage/proxy-mailbox.h @@ -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