cmd-select.c revision 869e97e89856be3d7b32edab14f467d1e3496706
5a580c3a38ced62d4bcc95b8ac7c4f2935b5d294Timo Sirainen/* Copyright (C) 2002 Timo Sirainen */
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen#include "common.h"
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen#include "temp-string.h"
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen#include "commands.h"
5d60e31c7b701b606067a20bc88dcc8a6de7bbd6Timo Sirainen
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainenextern MailboxSyncCallbacks sync_callbacks;
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenint cmd_select_full(Client *client, int readonly)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen{
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen Mailbox *box;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen MailboxStatus status;
d477acb83e14a776ece4ca94dcd1869e75d0c6eeTimo Sirainen const char *mailbox;
9dd1c256910f1fb42823116a641e7edb3ad11970Timo Sirainen
9dd1c256910f1fb42823116a641e7edb3ad11970Timo Sirainen /* <mailbox> */
d477acb83e14a776ece4ca94dcd1869e75d0c6eeTimo Sirainen if (!client_read_string_args(client, 1, &mailbox))
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen return FALSE;
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen
daa7e7459749ae8f82cd3eed9c44522d81c609a3Timo Sirainen if (client->mailbox != NULL)
46ec5983bf4519ea42dbfcae3d7c62be0d8ef95fTimo Sirainen client->mailbox->close(client->mailbox);
bbadd5331f534017cf62d5183003b3d9fdad079eTimo Sirainen
6523f54d1521edf894880f2d45e75cef5dd31c3dTimo Sirainen client->mailbox = client->storage->open_mailbox(client->storage,
72f5f2c5c6905b5d3f389b424313e2c450dfad96Timo Sirainen mailbox, readonly,
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen FALSE);
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen if (client->mailbox == NULL) {
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen client_send_storage_error(client);
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen return TRUE;
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen }
373492be949e159fda651807b3acda2c5c077027Timo Sirainen
bbadd5331f534017cf62d5183003b3d9fdad079eTimo Sirainen box = client->mailbox;
ab90f702ceedb7ba445a9a592be0b213b27cbafaStephan Bosch if (!box->get_status(box, STATUS_MESSAGES | STATUS_RECENT |
ab90f702ceedb7ba445a9a592be0b213b27cbafaStephan Bosch STATUS_FIRST_UNSEEN_SEQ | STATUS_UIDVALIDITY |
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen STATUS_CUSTOM_FLAGS, &status)) {
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen client_send_storage_error(client);
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen return TRUE;
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen }
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen /* set callbacks after STATUS, which might otherwise try calling
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen some of them */
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen box->set_sync_callbacks(box, &sync_callbacks, client);
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen client_send_mailbox_flags(client, box, status.custom_flags,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen status.custom_flags_count);
635df5b4cbcd7b24c825e01d9dd66d3a4274c4c7Timo Sirainen
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen client_send_line(client,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen t_strdup_printf("* %u EXISTS", status.messages));
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen client_send_line(client,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen t_strdup_printf("* %u RECENT", status.recent));
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen if (status.first_unseen_seq != 0) {
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen client_send_line(client,
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen t_strdup_printf("* OK [UNSEEN %u] First unseen.",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen status.first_unseen_seq));
51fb710488efa419a2964335c30451c62b9633b1Timo Sirainen }
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen
93a7d1ee4b518b5c85f9721dc6539e4dab6aae00Timo Sirainen client_send_line(client,
f7f25f9e1a38678d0e97d2e609beac16285fac6bTimo Sirainen t_strdup_printf("* OK [UIDVALIDITY %u] UIDs valid",
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen status.uidvalidity));
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen if (status.diskspace_full) {
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen client_send_line(client, "* OK [ALERT] "
35fcdde46a71ac151c2518d48c841019f1181bb2Timo Sirainen "Disk space is full, delete some messages.");
35fcdde46a71ac151c2518d48c841019f1181bb2Timo Sirainen }
35fcdde46a71ac151c2518d48c841019f1181bb2Timo Sirainen
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen client_send_tagline(client, box->readonly ?
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen "OK [READ-ONLY] Select completed." :
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen "OK [READ-WRITE] Select completed.");
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen
635df5b4cbcd7b24c825e01d9dd66d3a4274c4c7Timo Sirainen return TRUE;
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen}
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainenint cmd_select(Client *client)
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen{
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen return cmd_select_full(client, FALSE);
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen}
9f0f2de10e4ea0c99052bf4b2bef8179f2536228Timo Sirainen