diff options
author | June McEnroe <june@causal.agency> | 2020-04-13 14:58:53 -0400 |
---|---|---|
committer | June McEnroe <june@causal.agency> | 2020-04-13 14:58:53 -0400 |
commit | 9032566beb37bc907ed21cf0446ee427a82bdcb0 (patch) | |
tree | ea42d3f62f344f696551cee811028748422116b5 | |
parent | Do not escape > in XML/HTML (diff) | |
download | bubger-9032566beb37bc907ed21cf0446ee427a82bdcb0.tar.gz bubger-9032566beb37bc907ed21cf0446ee427a82bdcb0.zip |
Export content to Atom
Temporarily disabling HTML output...
-rw-r--r-- | archive.h | 12 | ||||
-rw-r--r-- | concat.c | 15 | ||||
-rw-r--r-- | export.c | 64 |
3 files changed, 35 insertions, 56 deletions
diff --git a/archive.h b/archive.h index 9ea15f4..749ab1b 100644 --- a/archive.h +++ b/archive.h @@ -180,6 +180,13 @@ int mboxFrom(FILE *file); int mboxHeader(FILE *file, const char *header); int mboxBody(FILE *file, const char *body); +int atomEntryOpen(FILE *file, const struct Envelope *envelope); +int atomContentOpen(FILE *file); +int atomContentClose(FILE *file); +int atomEntryClose(FILE *file); +int atomFeedOpen(FILE *file, const struct Envelope *envelope); +int atomFeedClose(FILE *file); + int htmlMessageHead(FILE *file, const struct Envelope *envelope); int htmlMessageTail(FILE *file); int htmlThreadHead(FILE *file, const struct Envelope *envelope); @@ -187,8 +194,3 @@ int htmlThreadHeader(FILE *file, const struct Envelope *envelope); int htmlThreadOpen(FILE *file); int htmlThreadClose(FILE *file); int htmlThreadTail(FILE *file); - -int atomEntryOpen(FILE *file, const struct Envelope *envelope); -int atomEntryClose(FILE *file); -int atomFeedOpen(FILE *file, const struct Envelope *envelope); -int atomFeedClose(FILE *file); diff --git a/concat.c b/concat.c index abf648c..a0f451e 100644 --- a/concat.c +++ b/concat.c @@ -157,20 +157,5 @@ void concatData(struct List threads, struct List items) { if (error) err(EX_IOERR, "%s", path); } - path = pathThread(envelope.messageID, "html"); - error = stat(path, &status); - if (error || status.st_mtime < uidNewest(flat, "html")) { - FILE *file = fopen(path, "w"); - if (!file) err(EX_CANTCREAT, "%s", path); - - error = 0 - || htmlThreadHead(file, &envelope) // TODO: Include -h file. - || htmlThreadHeader(file, &envelope) - || concatHTML(file, thread) - || htmlThreadTail(file) - || fclose(file); - if (error) err(EX_IOERR, "%s", path); - } - listFree(flat); } diff --git a/export.c b/export.c index 6327d22..54178f6 100644 --- a/export.c +++ b/export.c @@ -53,31 +53,7 @@ bool exportFetch(FILE *imap, enum Atom tag, struct List threads) { return true; } -static void exportEnvelope(uint32_t uid, const struct Envelope *envelope) { - int error; - FILE *file; - const char *path; - - path = pathUID(uid, "html"); - file = fopen(path, "w"); - if (!file) err(EX_CANTCREAT, "%s", path); - error = 0 - || htmlMessageHead(file, envelope) - || htmlMessageTail(file) - || fclose(file); - if (error) err(EX_IOERR, "%s", path); - - path = pathUID(uid, "atom"); - file = fopen(path, "w"); - if (!file) err(EX_CANTCREAT, "%s", path); - error = 0 - || atomEntryOpen(file, envelope) - || atomEntryClose(file) - || fclose(file); - if (error) err(EX_IOERR, "%s", path); -} - -static void exportRaw( +static void exportMbox( uint32_t uid, const struct Envelope *envelope, const char *header, const char *body ) { @@ -97,10 +73,32 @@ static void exportRaw( if (error) err(EX_CANTCREAT, "%s", msg); } -static void exportBodyPart( - uint32_t uid, const struct BodyPart *structure, - const struct BodyPart *part, const char *content +static void exportAtom( + uint32_t uid, const struct Envelope *envelope, + const struct BodyPart *structure, const char *body ) { + const char *path = pathUID(uid, "atom"); + FILE *file = fopen(path, "w"); + if (!file) err(EX_CANTCREAT, "%s", path); + + int error = atomEntryOpen(file, envelope); + if (error) err(EX_IOERR, "%s", path); + + if ( + !structure->multipart && + !strcmp(structure->type, "TEXT") && + !strcmp(structure->subtype, "PLAIN") + ) { + // TODO: Decode content into file. + error = 0 + || atomContentOpen(file) + || escapeXML(file, body) + || atomContentClose(file); + if (error) err(EX_IOERR, "%s", path); + } + + error = atomEntryClose(file) || fclose(file); + if (error) err(EX_IOERR, "%s", path); } bool exportData(FILE *imap, enum Atom tag, struct List items) { @@ -147,14 +145,8 @@ bool exportData(FILE *imap, enum Atom tag, struct List items) { if (!header) errx(EX_PROTOCOL, "missing BODY[HEADER.FIELDS] data item"); if (!body) errx(EX_PROTOCOL, "missing BODY[TEXT] data item"); - exportRaw(uid, &envelope, header, body); - exportEnvelope(uid, &envelope); - - if (structure.multipart) { - // TODO: FETCH each body part. - } else { - exportBodyPart(uid, &structure, &structure, body); - } + exportMbox(uid, &envelope, header, body); + exportAtom(uid, &envelope, &structure, body); envelopeFree(envelope); bodyPartFree(structure); |