/* Copyright (C) 2020 C. McEnroe * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include "imap.h" struct Address { char *name; const char *mailbox; const char *host; }; static inline const char *addressName(struct Address addr) { return (addr.name ? addr.name : addr.mailbox); } struct AddressList { size_t len; struct Address *addrs; }; struct Envelope { time_t utc; struct tm date; char *subject; struct Address from, sender, replyTo; struct AddressList to, cc, bcc; const char *inReplyTo; const char *messageID; }; static inline void envelopeFree(struct Envelope envelope) { free(envelope.subject); free(envelope.from.name); free(envelope.sender.name); free(envelope.replyTo.name); for (size_t i = 0; i < envelope.to.len; ++i) { free(envelope.to.addrs[i].name); } for (size_t i = 0; i < envelope.cc.len; ++i) { free(envelope.cc.addrs[i].name); } for (size_t i = 0; i < envelope.bcc.len; ++i) { free(envelope.bcc.addrs[i].name); } free(envelope.to.addrs); free(envelope.cc.addrs); free(envelope.bcc.addrs); } void parseEnvelope(struct Envelope *envelope, struct List list); bool exportFetch(FILE *imap, enum Atom tag, struct List threads); void exportData(struct List items); void concatFetch(FILE *imap, enum Atom tag, struct List threads); void concatData(struct List threads, struct List items); #define TEMPLATE(...) #__VA_ARGS__ struct Variable { const char *name; const char *value; }; typedef int EscapeFn(FILE *file, const char *str); int escapeURL(FILE *file, const char *str); int escapeXML(FILE *file, const char *str); int templateRender( FILE *file, const char *template, const struct Variable vars[], EscapeFn *escape ); char *templateURL(const char *template, const struct Variable vars[]); #define MBOX_HEADERS \ "Date Subject From Sender Reply-To To Cc Bcc " \ "Message-Id In-Reply-To References " \ "MIME-Version Content-Type Content-Disposition Content-Transfer-Encoding" int mboxFrom(FILE *file); int mboxHeader(FILE *file, char *header); int mboxBody(FILE *file, char *body); int htmlEnvelope(FILE *file, const struct Envelope *envelope); int atomEntryHead(FILE *file, const struct Envelope *envelope); int atomEntryTail(FILE *file); int atomFeedHead(FILE *file, const struct Envelope *envelope); int atomFeedTail(FILE *file);