summaryrefslogtreecommitdiffstats
path: root/src/lib-mail/istream-attachment-extractor.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib-mail/istream-attachment-extractor.h')
-rw-r--r--src/lib-mail/istream-attachment-extractor.h62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/lib-mail/istream-attachment-extractor.h b/src/lib-mail/istream-attachment-extractor.h
new file mode 100644
index 0000000..151566e
--- /dev/null
+++ b/src/lib-mail/istream-attachment-extractor.h
@@ -0,0 +1,62 @@
+#ifndef ISTREAM_ATTACHMENT_H
+#define ISTREAM_ATTACHMENT_H
+
+struct istream_attachment_header {
+ struct message_part *part;
+ const char *content_type, *content_disposition;
+};
+
+struct istream_attachment_info {
+ const char *hash;
+ /* offset within input stream where the attachment starts */
+ uoff_t start_offset;
+ /* original (base64-encoded) size of the attachment */
+ uoff_t encoded_size;
+
+ unsigned int base64_blocks_per_line;
+ bool base64_have_crlf;
+
+ const struct message_part *part;
+};
+
+struct istream_attachment_settings {
+ /* Minimum size of of a MIME part to be saved separately. */
+ uoff_t min_size;
+ /* Format to use when calculating attachment's hash. */
+ struct hash_format *hash_format;
+ /* Set this to TRUE if parent stream can be read from as long as
+ wanted. This is useful when parsing attachments, which the extractor
+ hides from read() output, so they would return a lot of 0.
+ On the other hand if you have a tee-istream, it's not a good idea
+ to let it get to "buffer full" state. */
+ bool drain_parent_input;
+
+ /* Returns TRUE if message part is wanted to be stored as separate
+ attachment. If NULL, assume we want the attachment. */
+ bool (*want_attachment)(const struct istream_attachment_header *hdr,
+ void *context);
+ /* Create a temporary file. */
+ int (*open_temp_fd)(void *context);
+ /* Create output stream for attachment */
+ int (*open_attachment_ostream)(struct istream_attachment_info *info,
+ struct ostream **output_r,
+ const char **error_r, void *context);
+ /* Finish output stream. If success==FALSE, *error contains the error
+ and the error shouldn't be replaced (other than maybe enhanced).
+ Otherwise, if close_attachment_ostream() fails and returns -1, it
+ should also set *error. */
+ int (*close_attachment_ostream)(struct ostream *output, bool success,
+ const char **error, void *context);
+};
+
+struct istream *
+i_stream_create_attachment_extractor(struct istream *input,
+ struct istream_attachment_settings *set,
+ void *context) ATTR_NULL(3);
+
+/* Returns TRUE if the last read returned 0 only because
+ drain_parent_input=FALSE and we didn't have anything to return, but
+ retrying a read from parent stream could give something the next time. */
+bool i_stream_attachment_extractor_can_retry(struct istream *input);
+
+#endif