Lines Matching defs:msgpart
19 #include "imap-msgpart.h"
59 struct imap_msgpart *msgpart;
62 pool = pool_alloconly_create("imap msgpart", sizeof(*msgpart)+32);
63 msgpart = p_new(pool, struct imap_msgpart, 1);
64 msgpart->pool = pool;
65 msgpart->partial_size = (uoff_t)-1;
66 msgpart->fetch_type = fetch_type;
67 msgpart->section_number = "";
69 msgpart->wanted_fields |= MAIL_FETCH_STREAM_HEADER;
71 msgpart->wanted_fields |= MAIL_FETCH_STREAM_BODY;
72 return msgpart;
181 imap_msgpart_parse_header_fields(struct imap_msgpart *msgpart,
190 if (imap_msgpart_get_header_fields(msgpart->pool, header_list,
195 msgpart->headers = array_idx(&fields, 0);
201 struct imap_msgpart *msgpart;
207 pool = pool_alloconly_create("imap msgpart", 1024);
208 msgpart = *msgpart_r = p_new(pool, struct imap_msgpart, 1);
209 msgpart->pool = pool;
210 msgpart->partial_size = (uoff_t)-1;
225 msgpart->section_number = "";
232 msgpart->section_number = p_strdup(pool, section);
240 msgpart->section_number = p_strndup(pool, section, i-1);
245 msgpart->wanted_fields |= MAIL_FETCH_STREAM_BODY;
246 if (*msgpart->section_number == '\0') {
248 msgpart->fetch_type = FETCH_FULL;
249 msgpart->wanted_fields |= MAIL_FETCH_STREAM_HEADER;
252 msgpart->fetch_type = FETCH_MIME_BODY;
259 if (msgpart->section_number[0] == '\0')
261 msgpart->fetch_type = FETCH_MIME;
262 msgpart->wanted_fields |= MAIL_FETCH_STREAM_BODY;
265 msgpart->fetch_type = FETCH_BODY;
266 msgpart->wanted_fields |= MAIL_FETCH_STREAM_BODY;
270 msgpart->fetch_type = FETCH_HEADER;
273 msgpart->fetch_type = FETCH_HEADER_FIELDS_NOT;
274 ret = imap_msgpart_parse_header_fields(msgpart,
277 msgpart->fetch_type = FETCH_HEADER_FIELDS;
278 ret = imap_msgpart_parse_header_fields(msgpart,
284 imap_msgpart_free(&msgpart);
287 if (msgpart->fetch_type == FETCH_HEADER_FIELDS) {
290 } else if (*msgpart->section_number == '\0')
291 msgpart->wanted_fields |= MAIL_FETCH_STREAM_HEADER;
293 msgpart->wanted_fields |= MAIL_FETCH_STREAM_BODY;
295 imap_msgpart_free(&msgpart);
303 struct imap_msgpart *msgpart = *_msgpart;
307 imap_msgpart_close_mailbox(msgpart);
308 pool_unref(&msgpart->pool);
311 bool imap_msgpart_contains_body(const struct imap_msgpart *msgpart)
313 switch (msgpart->fetch_type) {
327 void imap_msgpart_set_decode_to_binary(struct imap_msgpart *msgpart)
329 msgpart->decode_cte_to_binary = TRUE;
332 void imap_msgpart_set_partial(struct imap_msgpart *msgpart,
335 msgpart->partial_offset = offset;
336 msgpart->partial_size = size;
339 uoff_t imap_msgpart_get_partial_offset(struct imap_msgpart *msgpart)
341 return msgpart->partial_offset;
344 uoff_t imap_msgpart_get_partial_size(struct imap_msgpart *msgpart)
346 return msgpart->partial_size;
349 enum mail_fetch_field imap_msgpart_get_fetch_data(struct imap_msgpart *msgpart)
351 return msgpart->wanted_fields;
354 void imap_msgpart_get_wanted_headers(struct imap_msgpart *msgpart,
359 if (msgpart->fetch_type != FETCH_HEADER_FIELDS)
362 for (i = 0; msgpart->headers[i] != NULL; i++)
363 array_append(headers, &msgpart->headers[i], 1);
368 const struct imap_msgpart *msgpart,
372 const char *const *hdr_fields = msgpart->headers;
378 if (msgpart->fetch_type != FETCH_HEADER_FIELDS) {
379 i_assert(msgpart->fetch_type == FETCH_HEADER_FIELDS_NOT);
386 } else if (msgpart->section_number[0] != '\0') {
419 const struct imap_msgpart *msgpart)
424 uoff_t virtual_skip = msgpart->partial_offset;
444 (msgpart->partial_offset != 0 ||
445 msgpart->partial_size != (uoff_t)-1) && !input->eof) {
450 cache->virtual_pos = msgpart->partial_offset;
466 imap_msgpart_get_partial(struct mail *mail, const struct imap_msgpart *msgpart,
476 if (msgpart->partial_offset >= virtual_size) {
487 i_stream_skip(result->input, msgpart->partial_offset);
493 msgpart);
496 bytes_left = virtual_size - msgpart->partial_offset;
497 if (msgpart->partial_size <= bytes_left) {
499 result->size = msgpart->partial_size;
518 imap_msgpart_find_part(struct mail *mail, const struct imap_msgpart *msgpart,
523 if (*msgpart->section_number == '\0') {
530 part = imap_msgpart_find(parts, msgpart->section_number);
537 switch (msgpart->fetch_type) {
567 imap_msgpart_open_normal(struct mail *mail, struct imap_msgpart *msgpart,
580 if (*msgpart->section_number != '\0') {
588 } else switch (msgpart->fetch_type) {
614 if (msgpart->header_ctx == NULL) {
615 msgpart->header_ctx =
617 msgpart->headers);
619 if (mail_get_header_stream(mail, msgpart->header_ctx,
633 if (msgpart->headers != NULL) {
635 return imap_msgpart_get_partial_header(mail, input, msgpart,
640 switch (msgpart->fetch_type) {
669 int imap_msgpart_open(struct mail *mail, struct imap_msgpart *msgpart,
679 if ((ret = imap_msgpart_find_part(mail, msgpart, &part)) < 0)
687 if (msgpart->decode_cte_to_binary &&
688 (msgpart->fetch_type == FETCH_FULL ||
689 msgpart->fetch_type == FETCH_BODY ||
690 msgpart->fetch_type == FETCH_MIME_BODY)) {
692 include_hdr = msgpart->fetch_type == FETCH_FULL;
704 if (imap_msgpart_open_normal(mail, msgpart, part, &virtual_size,
711 if (binary && msgpart->decode_cte_to_binary)
714 imap_msgpart_get_partial(mail, msgpart, !binary, use_partial_cache,
719 int imap_msgpart_size(struct mail *mail, struct imap_msgpart *msgpart,
728 if (!msgpart->decode_cte_to_binary ||
729 (msgpart->fetch_type != FETCH_FULL &&
730 msgpart->fetch_type != FETCH_BODY &&
731 msgpart->fetch_type != FETCH_MIME_BODY)) {
733 if (imap_msgpart_open(mail, msgpart, &result) < 0)
741 if ((ret = imap_msgpart_find_part(mail, msgpart, &part)) < 0)
752 include_hdr = msgpart->fetch_type == FETCH_FULL;
808 struct imap_msgpart *msgpart,
819 if ((ret = imap_msgpart_find_part(mail, msgpart, &part)) < 0)
836 if (msgpart->decode_cte_to_binary)
848 void imap_msgpart_close_mailbox(struct imap_msgpart *msgpart)
850 mailbox_header_lookup_unref(&msgpart->header_ctx);