imap-fetch.h revision 704a96fa677763eef7ae62466e14e83a2f535427
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen#ifndef IMAP_FETCH_H
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen#define IMAP_FETCH_H
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainenstruct imap_fetch_context;
d9076f5939edf5d20a261494b1a861dcbb0d32e2Timo Sirainen
d9fdacd5fb3e07997e5c389739d2054f0c8441d8Timo Sirainenenum imap_fetch_handler_flags {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen IMAP_FETCH_HANDLER_FLAG_BUFFERED = 0x01,
5666a3d6a7ea89362b8d9e8b39b15424cd9d6388Timo Sirainen IMAP_FETCH_HANDLER_FLAG_WANT_DEINIT = 0x02
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen};
146f9076cd456ea1e9b3f8536456d9d3c962fadbStephan Bosch
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen/* Returns 1 = ok, 0 = client output buffer full, call again, -1 = error.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen mail = NULL for deinit. */
8c909e451d14075c05d90382cf8eebc4e354f569Timo Sirainentypedef int imap_fetch_handler_t(struct imap_fetch_context *ctx,
8c909e451d14075c05d90382cf8eebc4e354f569Timo Sirainen struct mail *mail, void *context);
8c909e451d14075c05d90382cf8eebc4e354f569Timo Sirainen
573f0491a5733fe21fa062a455acb4790b4e0499Timo Sirainenstruct imap_fetch_init_context {
573f0491a5733fe21fa062a455acb4790b4e0499Timo Sirainen struct imap_fetch_context *fetch_ctx;
573f0491a5733fe21fa062a455acb4790b4e0499Timo Sirainen pool_t pool;
3ed2d0f6b5e67e2663d44489d9da3176823789a8Timo Sirainen
65f8fb656051f1059f7b5a2da9c5555adcc30439Timo Sirainen const char *name;
1a5573ebc32fae2fe576ec544e1781323c1db609Timo Sirainen const struct imap_arg *args;
1a5573ebc32fae2fe576ec544e1781323c1db609Timo Sirainen
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen const char *error;
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen};
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainenstruct imap_fetch_handler {
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen const char *name;
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen /* Returns FALSE and sets ctx->error if arg is invalid */
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen bool (*init)(struct imap_fetch_init_context *ctx);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen};
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenstruct imap_fetch_context_handler {
f7539a17ea306191b53b8f5e752e228937df9ec3Timo Sirainen imap_fetch_handler_t *handler;
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen void *context;
2dd39e478269d6fb0bb26d12b394aa30ee965e38Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen const char *name;
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen const char *nil_reply;
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen bool buffered:1;
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen bool want_deinit:1;
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen};
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainenstruct imap_fetch_qresync_args {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen const ARRAY_TYPE(uint32_t) *qresync_sample_seqset;
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen const ARRAY_TYPE(uint32_t) *qresync_sample_uidset;
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen};
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainenstruct imap_fetch_state {
3e564425db51f3921ce4de11859777135fdedd15Timo Sirainen struct mailbox_transaction_context *trans;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct mail_search_context *search_ctx;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen struct mail *cur_mail;
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen unsigned int cur_handler;
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen const char *cur_human_name;
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen uoff_t cur_size;
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen enum mail_fetch_field cur_size_field;
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen string_t *cur_str;
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen struct istream *cur_input;
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen bool skip_cr;
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen int (*cont_handler)(struct imap_fetch_context *ctx);
e5fd6dfd0a492e4708d4dbb7971d7fc5d7b8fd85Timo Sirainen uint64_t *cur_stats_sizep;
e5fd6dfd0a492e4708d4dbb7971d7fc5d7b8fd85Timo Sirainen
4ba9a1d3facc515b3feb5238a16bcf91f76fac61Timo Sirainen bool fetching:1;
4ba9a1d3facc515b3feb5238a16bcf91f76fac61Timo Sirainen bool seen_flags_changed:1;
dfaefeabae939803ceb8c503101e86b5496541d1Timo Sirainen bool cur_first:1;
dfaefeabae939803ceb8c503101e86b5496541d1Timo Sirainen bool cur_flushed:1;
e15b305e90c9834734ccf35ed78f0ad29d570ee9Timo Sirainen bool line_partial:1;
e15b305e90c9834734ccf35ed78f0ad29d570ee9Timo Sirainen bool line_finished:1;
8b31f966d9688e07672ef1958dcbdb7686523c04Timo Sirainen bool skipped_expunged_msgs:1;
8b31f966d9688e07672ef1958dcbdb7686523c04Timo Sirainen bool failed:1;
9847ec56efa15fa063eea9988eee2d4ed9ec7d58Timo Sirainen};
9847ec56efa15fa063eea9988eee2d4ed9ec7d58Timo Sirainen
9847ec56efa15fa063eea9988eee2d4ed9ec7d58Timo Sirainenstruct imap_fetch_context {
d46a1e3f999dda802dc5137e883adcd7a6629cd3Timo Sirainen struct client *client;
d46a1e3f999dda802dc5137e883adcd7a6629cd3Timo Sirainen pool_t ctx_pool;
d46a1e3f999dda802dc5137e883adcd7a6629cd3Timo Sirainen
d1e843e77f4760e303c53d9fce10123fc8d230a1Timo Sirainen enum mail_fetch_field fetch_data;
d1e843e77f4760e303c53d9fce10123fc8d230a1Timo Sirainen ARRAY_TYPE(const_string) all_headers;
d1e843e77f4760e303c53d9fce10123fc8d230a1Timo Sirainen
291ce16fffca75e8598a8c9dceb08613413dcb07Timo Sirainen ARRAY(struct imap_fetch_context_handler) handlers;
291ce16fffca75e8598a8c9dceb08613413dcb07Timo Sirainen unsigned int buffered_handlers_count;
291ce16fffca75e8598a8c9dceb08613413dcb07Timo Sirainen
08e9fd42eb8007e1f9db62c088eef74f906114a5Josef 'Jeff' Sipek ARRAY_TYPE(keywords) tmp_keywords;
08e9fd42eb8007e1f9db62c088eef74f906114a5Josef 'Jeff' Sipek
08e9fd42eb8007e1f9db62c088eef74f906114a5Josef 'Jeff' Sipek struct imap_fetch_state state;
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen ARRAY_TYPE(seq_range) fetch_failed_uids;
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen
306b3f41b05da642d87e7ca7a1496efce9f5902fTimo Sirainen bool initialized:1;
306b3f41b05da642d87e7ca7a1496efce9f5902fTimo Sirainen bool failures:1;
306b3f41b05da642d87e7ca7a1496efce9f5902fTimo Sirainen bool flags_have_handler:1;
306b3f41b05da642d87e7ca7a1496efce9f5902fTimo Sirainen bool flags_update_seen:1;
306b3f41b05da642d87e7ca7a1496efce9f5902fTimo Sirainen bool flags_show_only_seen_changes:1;
306b3f41b05da642d87e7ca7a1496efce9f5902fTimo Sirainen};
306b3f41b05da642d87e7ca7a1496efce9f5902fTimo Sirainen
306b3f41b05da642d87e7ca7a1496efce9f5902fTimo Sirainenvoid imap_fetch_handlers_register(const struct imap_fetch_handler *handlers,
306b3f41b05da642d87e7ca7a1496efce9f5902fTimo Sirainen size_t count);
306b3f41b05da642d87e7ca7a1496efce9f5902fTimo Sirainen
306b3f41b05da642d87e7ca7a1496efce9f5902fTimo Sirainenvoid imap_fetch_add_handler(struct imap_fetch_init_context *ctx,
97ae33602db7d5bc8eede82512a965d49ab8853bTimo Sirainen enum imap_fetch_handler_flags flags,
97ae33602db7d5bc8eede82512a965d49ab8853bTimo Sirainen const char *nil_reply,
97ae33602db7d5bc8eede82512a965d49ab8853bTimo Sirainen imap_fetch_handler_t *handler, void *context)
97ae33602db7d5bc8eede82512a965d49ab8853bTimo Sirainen ATTR_NULL(3, 5);
97ae33602db7d5bc8eede82512a965d49ab8853bTimo Sirainen#define imap_fetch_add_handler(ctx, flags, nil_reply, handler, context) \
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen imap_fetch_add_handler(ctx, flags, nil_reply + \
57a8c6a95e4bce3eeaba36985adb81c07dd683ffTimo Sirainen CALLBACK_TYPECHECK(handler, int (*)( \
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen struct imap_fetch_context *, struct mail *, \
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen typeof(context))), \
539977f9257bd8985be5a8093658da266ae9cd19Timo Sirainen (imap_fetch_handler_t *)handler, context)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenint imap_fetch_att_list_parse(struct client *client, pool_t pool,
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen const struct imap_arg *list,
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen struct imap_fetch_context **fetch_ctx_r,
420040a5930a2b497e79ff0b5f59ba4b764a5b39Timo Sirainen const char **error_r);
420040a5930a2b497e79ff0b5f59ba4b764a5b39Timo Sirainen
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainenstruct imap_fetch_context *
420040a5930a2b497e79ff0b5f59ba4b764a5b39Timo Sirainenimap_fetch_alloc(struct client *client, pool_t pool);
420040a5930a2b497e79ff0b5f59ba4b764a5b39Timo Sirainenvoid imap_fetch_free(struct imap_fetch_context **ctx);
420040a5930a2b497e79ff0b5f59ba4b764a5b39Timo Sirainenbool imap_fetch_init_handler(struct imap_fetch_init_context *init_ctx);
eecb235c14b49c01774134ea593c266f2d2c2be1Timo Sirainenvoid imap_fetch_init_nofail_handler(struct imap_fetch_context *ctx,
eecb235c14b49c01774134ea593c266f2d2c2be1Timo Sirainen bool (*init)(struct imap_fetch_init_context *));
7900eb30bac4a46b259522c58362884661483d7cJosef 'Jeff' Sipek
7900eb30bac4a46b259522c58362884661483d7cJosef 'Jeff' Sipekvoid imap_fetch_begin(struct imap_fetch_context *ctx, struct mailbox *box,
563273bdac80393af63b9520cbf4d24cc0efd028Timo Sirainen struct mail_search_args *search_args);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainenint imap_fetch_send_vanished(struct client *client, struct mailbox *box,
ff7056842f14fd3b30a2d327dfab165b9d15dd30Timo Sirainen const struct mail_search_args *search_args,
ff7056842f14fd3b30a2d327dfab165b9d15dd30Timo Sirainen const struct imap_fetch_qresync_args *qresync_args);
97ae33602db7d5bc8eede82512a965d49ab8853bTimo Sirainen/* Returns 1 if finished, 0 if more data is needed, -1 if error.
ff7056842f14fd3b30a2d327dfab165b9d15dd30Timo Sirainen When 0 is returned, line_partial=TRUE if literal is open and must be
f1743785713e7632459d623d5df2108f4b93accbTimo Sirainen finished before anything else to client. */
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainenint imap_fetch_more(struct imap_fetch_context *ctx,
70ead6466f9baa8294e71fc2fba0a4f54f488b5eTimo Sirainen struct client_command_context *cmd);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen/* Like imap_fetch_more(), but don't check/update output_lock.
ccc895c0358108d2304239063e940b7d75f364abTimo Sirainen The caller must handle this itself. */
8d630c15a8ed6f85553467c3a231a273defca5f6Timo Sirainenint imap_fetch_more_no_lock_update(struct imap_fetch_context *ctx);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenint imap_fetch_end(struct imap_fetch_context *ctx);
ee116df08d0fdab703483e18fe8076b2ef9fd9d7Timo Sirainenint imap_fetch_more(struct imap_fetch_context *ctx,
c5ab90cfad9cc3e33bcb1baeb30ffc82a7b7053aTimo Sirainen struct client_command_context *cmd);
c5ab90cfad9cc3e33bcb1baeb30ffc82a7b7053aTimo Sirainen
306b3f41b05da642d87e7ca7a1496efce9f5902fTimo Sirainenbool imap_fetch_flags_init(struct imap_fetch_init_context *ctx);
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainenbool imap_fetch_modseq_init(struct imap_fetch_init_context *ctx);
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainenbool imap_fetch_uid_init(struct imap_fetch_init_context *ctx);
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainen
306b3f41b05da642d87e7ca7a1496efce9f5902fTimo Sirainenbool imap_fetch_body_section_init(struct imap_fetch_init_context *ctx);
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainenbool imap_fetch_rfc822_init(struct imap_fetch_init_context *ctx);
4ee00532a265bdfb38539d811fcd12d51210ac35Timo Sirainenbool imap_fetch_binary_init(struct imap_fetch_init_context *ctx);
c6afd726060aae56b6622c6c52aec10231c4bf1cTimo Sirainen
9fd2181788a61500641c66aec0f8c746b19bf830Timo Sirainenvoid imap_fetch_handlers_init(void);
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainenvoid imap_fetch_handlers_deinit(void);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#endif
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen