|
@@ -0,0 +1,74 @@
|
|
|
|
+#include <stdio.h>
|
|
|
|
+#include <archive.h>
|
|
|
|
+#include <archive_entry.h>
|
|
|
|
+#include <string.h>
|
|
|
|
+#include "comments.h"
|
|
|
|
+#include "stopif.h"
|
|
|
|
+
|
|
|
|
+static int processComments(struct archive *archiveOut, char buf[], size_t size, const char* path) {
|
|
|
|
+ XMLBuff *comments = XMLBuffNew();
|
|
|
|
+ *comments = (XMLBuff){.data=buf, .size=size, .name=path};
|
|
|
|
+ anonymizeComments(comments);
|
|
|
|
+
|
|
|
|
+ struct archive_entry *newEntry = archive_entry_new();
|
|
|
|
+ archive_entry_set_pathname(newEntry, path);
|
|
|
|
+ archive_entry_set_size(newEntry, comments->size);
|
|
|
|
+ archive_entry_set_filetype(newEntry, AE_IFREG);
|
|
|
|
+ archive_entry_set_perm(newEntry, 0664);
|
|
|
|
+
|
|
|
|
+ Stopif(archive_write_header(archiveOut, newEntry) != ARCHIVE_OK, return -2, "Can't write entry header (comments)!\n");
|
|
|
|
+ Stopif(archive_write_data(archiveOut, comments->data, comments->size) != comments->size, return -3, "Can't write data (comments)!\n");
|
|
|
|
+ archive_entry_free(newEntry);
|
|
|
|
+ XMLBuffFree(comments);
|
|
|
|
+ return 1;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int rewriteZIP(struct archive *archiveIn, struct archive *archiveOut) {
|
|
|
|
+ const char *commentsFile = "word/comments.xml";
|
|
|
|
+ struct archive_entry *entryIn;
|
|
|
|
+
|
|
|
|
+ while (archive_read_next_header(archiveIn, &entryIn) == ARCHIVE_OK) {
|
|
|
|
+ const char* path = archive_entry_pathname(entryIn);
|
|
|
|
+ size_t size = archive_entry_size(entryIn);
|
|
|
|
+ char buf[size];
|
|
|
|
+ Stopif(archive_read_data(archiveIn, buf, size) != size, return -2, "Archive entry has no size (%s)!\n", path);
|
|
|
|
+
|
|
|
|
+ if (strcmp(commentsFile, path) == 0){
|
|
|
|
+ Stopif(!processComments(archiveOut, buf, size, path), return -1, "Can't process comments!\n");
|
|
|
|
+ } else {
|
|
|
|
+ Stopif(archive_write_header(archiveOut, entryIn) != ARCHIVE_OK, return -2, "Can't write entry header!\n");
|
|
|
|
+ Stopif(archive_write_data(archiveOut, buf, size) != size, return -3, "Can't write data!\n");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return 1;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int processDOCX(char const *infile, char const *outfile) {
|
|
|
|
+ struct archive *archiveIn;
|
|
|
|
+ struct archive *archiveOut;
|
|
|
|
+
|
|
|
|
+ archiveIn = archive_read_new();
|
|
|
|
+ archive_read_support_format_zip(archiveIn);
|
|
|
|
+ Stopif(archive_read_open_filename(archiveIn, infile, 10240), return -1, "Can't read file %s\n!", infile);
|
|
|
|
+
|
|
|
|
+ archiveOut = archive_write_new();
|
|
|
|
+ archive_write_set_format_zip(archiveOut);
|
|
|
|
+
|
|
|
|
+ Stopif(archive_write_open_filename(archiveOut, outfile) != ARCHIVE_OK, return -1, "Can't create new archive %s\n", outfile);
|
|
|
|
+
|
|
|
|
+ Stopif(!rewriteZIP(archiveIn, archiveOut), return -1, "Problems rewriting zip!\n");
|
|
|
|
+ Stopif(archive_read_free(archiveIn) != ARCHIVE_OK, return -1, "Can't free %s!\n", infile);
|
|
|
|
+ Stopif(archive_write_free(archiveOut) != ARCHIVE_OK, return -1, "Can't free %s!\n", outfile);
|
|
|
|
+ return 1;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+int process(char const *infile, char *outfile) {
|
|
|
|
+ if (!outfile || strcmp(infile, outfile) == 0){
|
|
|
|
+ const char *outfile = "tmpFile.docx";
|
|
|
|
+ processDOCX(infile, outfile);
|
|
|
|
+ rename(outfile, infile);
|
|
|
|
+ } else {
|
|
|
|
+ processDOCX(infile, outfile);
|
|
|
|
+ }
|
|
|
|
+ return 1;
|
|
|
|
+}
|