# HG changeset patch # User Timo Sirainen # Date 1184481234 -10800 # Node ID 2d815150cf57f75e71bd71b03487d050da4530bf # Parent 1208344cc1df96f8d6bf00e02056f7d2c53ed00a Moved STATUS handling code to imap-status.[ch] diff -r 1208344cc1df -r 2d815150cf57 src/imap/Makefile.am --- a/src/imap/Makefile.am Sun Jul 15 09:25:12 2007 +0300 +++ b/src/imap/Makefile.am Sun Jul 15 09:33:54 2007 +0300 @@ -81,6 +81,7 @@ imap-messageset.c \ imap-search.c \ imap-sort.c \ + imap-status.c \ imap-sync.c \ imap-thread.c \ mail-storage-callbacks.c \ @@ -97,6 +98,7 @@ imap-messageset.h \ imap-search.h \ imap-sort.h \ + imap-status.h \ imap-sync.h \ imap-thread.h diff -r 1208344cc1df -r 2d815150cf57 src/imap/cmd-status.c --- a/src/imap/cmd-status.c Sun Jul 15 09:25:12 2007 +0300 +++ b/src/imap/cmd-status.c Sun Jul 15 09:33:54 2007 +0300 @@ -1,82 +1,9 @@ /* Copyright (C) 2002 Timo Sirainen */ #include "common.h" -#include "str.h" -#include "imap-quote.h" #include "commands.h" #include "imap-sync.h" - -/* Returns status items, or -1 if error */ -static enum mailbox_status_items -get_status_items(struct client_command_context *cmd, - const struct imap_arg *args) -{ - const char *item; - enum mailbox_status_items items; - - items = 0; - for (; args->type != IMAP_ARG_EOL; args++) { - if (args->type != IMAP_ARG_ATOM) { - /* list may contain only atoms */ - client_send_command_error(cmd, - "Status list contains non-atoms."); - return -1; - } - - item = t_str_ucase(IMAP_ARG_STR(args)); - - if (strcmp(item, "MESSAGES") == 0) - items |= STATUS_MESSAGES; - else if (strcmp(item, "RECENT") == 0) - items |= STATUS_RECENT; - else if (strcmp(item, "UIDNEXT") == 0) - items |= STATUS_UIDNEXT; - else if (strcmp(item, "UIDVALIDITY") == 0) - items |= STATUS_UIDVALIDITY; - else if (strcmp(item, "UNSEEN") == 0) - items |= STATUS_UNSEEN; - else { - client_send_tagline(cmd, t_strconcat( - "BAD Invalid status item ", item, NULL)); - return -1; - } - } - - return items; -} - -static bool -get_mailbox_status(struct client *client, struct mail_storage *storage, - const char *mailbox, enum mailbox_status_items items, - struct mailbox_status *status) -{ - struct mailbox *box; - bool failed = FALSE; - - if (client->mailbox != NULL && - mailbox_equals(client->mailbox, storage, mailbox)) { - /* this mailbox is selected */ - box = client->mailbox; - } else { - /* open the mailbox */ - box = mailbox_open(storage, mailbox, NULL, MAILBOX_OPEN_FAST | - MAILBOX_OPEN_READONLY | - MAILBOX_OPEN_KEEP_RECENT); - if (box == NULL) - return FALSE; - - if (imap_sync_nonselected(box, 0) < 0) - failed = TRUE; - } - - if (!failed) - failed = mailbox_get_status(box, items, status) < 0; - - if (box != client->mailbox) - mailbox_close(&box); - - return !failed; -} +#include "imap-status.h" bool cmd_status(struct client_command_context *cmd) { @@ -86,7 +13,6 @@ enum mailbox_status_items items; struct mail_storage *storage; const char *mailbox, *real_mailbox; - string_t *str; /* */ if (!client_read_args(cmd, 2, 0, &args)) @@ -99,44 +25,20 @@ } /* get the items client wants */ - items = get_status_items(cmd, IMAP_ARG_LIST_ARGS(&args[1])); - if (items == (enum mailbox_status_items)-1) { - /* error */ + if (imap_status_parse_items(cmd, IMAP_ARG_LIST_ARGS(&args[1]), + &items) < 0) return TRUE; - } storage = client_find_storage(cmd, &real_mailbox); if (storage == NULL) return TRUE; - /* get status */ - if (!get_mailbox_status(client, storage, real_mailbox, - items, &status)) { + if (!imap_status_get(client, storage, real_mailbox, items, &status)) { client_send_storage_error(cmd, storage); return TRUE; } - str = t_str_new(128); - str_append(str, "* STATUS "); - imap_quote_append_string(str, mailbox, FALSE); - str_append(str, " ("); - - if (items & STATUS_MESSAGES) - str_printfa(str, "MESSAGES %u ", status.messages); - if (items & STATUS_RECENT) - str_printfa(str, "RECENT %u ", status.recent); - if (items & STATUS_UIDNEXT) - str_printfa(str, "UIDNEXT %u ", status.uidnext); - if (items & STATUS_UIDVALIDITY) - str_printfa(str, "UIDVALIDITY %u ", status.uidvalidity); - if (items & STATUS_UNSEEN) - str_printfa(str, "UNSEEN %u ", status.unseen); - - if (items != 0) - str_truncate(str, str_len(str)-1); - str_append_c(str, ')'); - - client_send_line(client, str_c(str)); + imap_status_send(client, mailbox, items, &status); client_send_tagline(cmd, "OK Status completed."); return TRUE; diff -r 1208344cc1df -r 2d815150cf57 src/imap/imap-status.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/imap/imap-status.c Sun Jul 15 09:33:54 2007 +0300 @@ -0,0 +1,106 @@ +/* Copyright (C) 2002-2007 Timo Sirainen */ + +#include "common.h" +#include "str.h" +#include "imap-quote.h" +#include "imap-status.h" + +int imap_status_parse_items(struct client_command_context *cmd, + const struct imap_arg *args, + enum mailbox_status_items *items_r) +{ + const char *item; + enum mailbox_status_items items; + + items = 0; + for (; args->type != IMAP_ARG_EOL; args++) { + if (args->type != IMAP_ARG_ATOM) { + /* list may contain only atoms */ + client_send_command_error(cmd, + "Status list contains non-atoms."); + return -1; + } + + item = t_str_ucase(IMAP_ARG_STR(args)); + + if (strcmp(item, "MESSAGES") == 0) + items |= STATUS_MESSAGES; + else if (strcmp(item, "RECENT") == 0) + items |= STATUS_RECENT; + else if (strcmp(item, "UIDNEXT") == 0) + items |= STATUS_UIDNEXT; + else if (strcmp(item, "UIDVALIDITY") == 0) + items |= STATUS_UIDVALIDITY; + else if (strcmp(item, "UNSEEN") == 0) + items |= STATUS_UNSEEN; + else { + client_send_tagline(cmd, t_strconcat( + "BAD Invalid status item ", item, NULL)); + return -1; + } + } + + *items_r = items; + return 0; +} + +bool imap_status_get(struct client *client, struct mail_storage *storage, + const char *mailbox, enum mailbox_status_items items, + struct mailbox_status *status_r) +{ + struct mailbox *box; + bool failed = FALSE; + + if (client->mailbox != NULL && + mailbox_equals(client->mailbox, storage, mailbox)) { + /* this mailbox is selected */ + box = client->mailbox; + } else { + /* open the mailbox */ + box = mailbox_open(storage, mailbox, NULL, MAILBOX_OPEN_FAST | + MAILBOX_OPEN_READONLY | + MAILBOX_OPEN_KEEP_RECENT); + if (box == NULL) + return FALSE; + + if (imap_sync_nonselected(box, 0) < 0) + failed = TRUE; + } + + if (!failed) + failed = mailbox_get_status(box, items, status_r) < 0; + + if (box != client->mailbox) + mailbox_close(&box); + + return !failed; +} + +void imap_status_send(struct client *client, const char *mailbox, + enum mailbox_status_items items, + const struct mailbox_status *status) +{ + string_t *str; + + str = t_str_new(128); + str_append(str, "* STATUS "); + imap_quote_append_string(str, mailbox, FALSE); + str_append(str, " ("); + + if (items & STATUS_MESSAGES) + str_printfa(str, "MESSAGES %u ", status->messages); + if (items & STATUS_RECENT) + str_printfa(str, "RECENT %u ", status->recent); + if (items & STATUS_UIDNEXT) + str_printfa(str, "UIDNEXT %u ", status->uidnext); + if (items & STATUS_UIDVALIDITY) + str_printfa(str, "UIDVALIDITY %u ", status->uidvalidity); + if (items & STATUS_UNSEEN) + str_printfa(str, "UNSEEN %u ", status->unseen); + + if (items != 0) + str_truncate(str, str_len(str)-1); + str_append_c(str, ')'); + + client_send_line(client, str_c(str)); +} diff -r 1208344cc1df -r 2d815150cf57 src/imap/imap-status.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/imap/imap-status.h Sun Jul 15 09:33:54 2007 +0300 @@ -0,0 +1,14 @@ +#ifndef __IMAP_STATUS_H +#define __IMAP_STATUS_H + +int imap_status_parse_items(struct client_command_context *cmd, + const struct imap_arg *args, + enum mailbox_status_items *items_r); +bool imap_status_get(struct client *client, struct mail_storage *storage, + const char *mailbox, enum mailbox_status_items items, + struct mailbox_status *status_r); +void imap_status_send(struct client *client, const char *mailbox, + enum mailbox_status_items items, + const struct mailbox_status *status); + +#endif