/* mailstore.c - mail storage backends * * Copyright © 2009 Carl Worth * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/ . */ #include #include #include "notmuch-private.h" typedef struct _notmuch_mailstore { notmuch_status_t (*constructor) (void **data, va_list args); FILE *(*open) (struct _notmuch_mailstore *mailstore, const char *filename); int (*close) (struct _notmuch_mailstore *mailstore, FILE *); int (*rename) (struct _notmuch_mailstore *mailstore, const char *old_filename, const char *new_filename); void *data; } _notmuch_mailstore; static notmuch_status_t _maildir_constructor (void **data, unused (va_list ap)) { (*data) = NULL; return NOTMUCH_STATUS_SUCCESS; } static FILE * _maildir_open_function (unused (notmuch_mailstore_t *mailstore), const char *filename) { return fopen (filename, "r"); } static int _maildir_close_function (unused (notmuch_mailstore_t *mailstore), FILE *file) { return fclose (file); } static int _maildir_rename_function (unused (notmuch_mailstore_t *mailstore), const char *old_filename, const char *new_filename) { return rename (old_filename, new_filename); } /* A mailstore is defined as: * * - A function used to "open" a mail message. This takes the * "filename" for the file and should return a FILE *. * * - A function to "rename" a mail message, which is currently only * used in tags_to_maildir_flags. * * - A "constructor" that creates a mailstore object of the requisite * type. Arguments are passed via va_args. * * A mailstore also has a "data" field that can be used to store * instance-specific information about this mailstore -- for example, * a CouchDB URL or a path. FIXME: mailstores are all statically * allocated, so maybe we shouldn't do this. */ _notmuch_mailstore notmuch_mailstore_maildir = { _maildir_constructor, _maildir_open_function, _maildir_close_function, _maildir_rename_function, NULL }; _notmuch_mailstore * notmuch_mailstore_get_by_name (const char *name) { if (strcmp (name, "maildir") == 0) return ¬much_mailstore_maildir; return NULL; } FILE * notmuch_mailstore_open (notmuch_mailstore_t *mailstore, const char *filename) { return mailstore->open (mailstore, filename); } int notmuch_mailstore_rename (notmuch_mailstore_t *mailstore, const char *old_filename, const char *new_filename) { return mailstore->rename (mailstore, old_filename, new_filename); } int notmuch_mailstore_close (notmuch_mailstore_t *mailstore, FILE *file) { return mailstore->close (mailstore, file); } notmuch_status_t notmuch_mailstore_construct (notmuch_mailstore_t *mailstore, ...) { va_list va_args; notmuch_status_t status; va_start (va_args, mailstore); status = mailstore->constructor (&mailstore->data, va_args); va_end (va_args); return status; }