pop3c-mail.c revision 9f0a996c22ebe39dcfe5cb84c8fd2f22ef5ce9d8
5f5870385cff47efd2f58e7892f251cf13761528Timo Sirainen/* Copyright (c) 2011-2012 Dovecot authors, see the included COPYING file */
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainenstatic int pop3c_mail_get_received_date(struct mail *_mail, time_t *date_r)
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen mail_storage_set_error(_mail->box->storage, MAIL_ERROR_NOTPOSSIBLE,
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen "POP3 has no received date");
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainenstatic int pop3c_mail_get_save_date(struct mail *_mail, time_t *date_r)
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen mail_storage_set_error(_mail->box->storage, MAIL_ERROR_NOTPOSSIBLE,
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen "POP3 has no save date");
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainenstatic int pop3c_mail_get_physical_size(struct mail *_mail, uoff_t *size_r)
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen struct index_mail *mail = (struct index_mail *)_mail;
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen struct pop3c_mailbox *mbox = (struct pop3c_mailbox *)_mail->box;
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen /* virtual size is already known. it's the same as our
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen (correct) physical size */
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen if (index_mail_get_physical_size(_mail, size_r) == 0) {
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen if (_mail->lookup_abort == MAIL_LOOKUP_ABORT_READ_MAIL &&
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen (_mail->box->flags & MAILBOX_FLAG_POP3_SESSION) != 0) {
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen /* kludge: we want output for POP3 LIST with
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen pop3_fast_size_lookups=yes. use the remote's LIST values
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen regardless of their correctness */
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen /* slow way: get the whole message body */
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen if (mail_get_stream(_mail, &hdr_size, &body_size, &input) < 0)
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen i_assert(mail->data.physical_size != (uoff_t)-1);
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainenstatic void pop3c_mail_cache_size(struct index_mail *mail)
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen if (i_stream_get_size(mail->data.stream, TRUE, &size) <= 0)
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen cache_idx = mail->ibox->cache_fields[MAIL_CACHE_VIRTUAL_FULL_SIZE].idx;
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen if (mail_cache_field_exists(_mail->transaction->cache_view,
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen index_mail_cache_add_idx(mail, cache_idx, &size, sizeof(size));
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen /* make sure it's not cached twice */
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainenpop3c_mail_get_stream(struct mail *_mail, bool get_body,
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen struct message_size *body_size, struct istream **stream_r)
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen struct index_mail *mail = (struct index_mail *)_mail;
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen struct pop3c_mailbox *mbox = (struct pop3c_mailbox *)_mail->box;
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen /* we've fetched the body */
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen /* we've fetched the header, but we need the body
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen i_panic("Unexpected POP3 stream name: %s", name);
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen capa = pop3c_client_get_capabilities(mbox->client);
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen if (get_body || (capa & POP3C_CAPABILITY_TOP) == 0)
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen cmd = t_strdup_printf("RETR %u\r\n", _mail->seq);
9f0a996c22ebe39dcfe5cb84c8fd2f22ef5ce9d8Timo Sirainen cmd = t_strdup_printf("TOP %u 0\r\n", _mail->seq);
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen if (pop3c_client_cmd_stream(mbox->client, cmd,
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen MAIL_ERROR_TEMP : MAIL_ERROR_EXPUNGED, error);
2026684bfc269f4ab3196dea3594f9fe17b1238dTimo Sirainen i_stream_set_name(mail->data.stream, t_strcut(cmd, '\r'));
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen return index_mail_init_stream(mail, hdr_size, body_size, stream_r);
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainenpop3c_mail_get_special(struct mail *_mail, enum mail_fetch_field field,
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen const char **value_r)
01435c38e7d671d5a892c4b802cfb204881cd454Timo Sirainen struct pop3c_mailbox *mbox = (struct pop3c_mailbox *)_mail->box;