diff options
author | Sebastian Rasmussen <sebras@hotmail.com> | 2009-07-05 12:01:17 +0200 |
---|---|---|
committer | Sebastian Rasmussen <sebras@hotmail.com> | 2009-07-05 12:01:17 +0200 |
commit | 4ebd84900f7f5d0afda14e09c518e614d9fde60d (patch) | |
tree | 8db9f1086d0edcf313178b66f878466f9f0d2409 /apps/common | |
parent | e7dfbee9389406555bf48ed5118f3c486129a7b6 (diff) | |
download | mupdf-4ebd84900f7f5d0afda14e09c518e614d9fde60d.tar.xz |
Refactor xref opening and closing to a common file for all pdf tools.
Diffstat (limited to 'apps/common')
-rw-r--r-- | apps/common/pdftool.c | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/apps/common/pdftool.c b/apps/common/pdftool.c new file mode 100644 index 00000000..fecfac8c --- /dev/null +++ b/apps/common/pdftool.c @@ -0,0 +1,101 @@ +#include "pdftool.h" + +char *basename = nil; +pdf_xref *xref = nil; +pdf_pagetree *pagetree = nil; +void (*cleanup)(void) = nil; + +void closexref(void); + +void die(fz_error error) +{ + fz_catch(error, "aborting"); + if (cleanup) + cleanup(); + closexref(); + exit(1); +} + +void setcleanup(void (*func)(void)) +{ + cleanup = func; +} + +void openxref(char *filename, char *password, int dieonbadpass) +{ + fz_error error; + fz_obj *obj; + int okay; + + basename = strrchr(filename, '/'); + if (!basename) + basename = filename; + else + basename++; + + error = pdf_newxref(&xref); + if (error) + die(error); + + error = pdf_loadxref(xref, filename); + if (error) + { + fz_catch(error, "trying to repair"); + error = pdf_repairxref(xref, filename); + if (error) + die(error); + } + + error = pdf_decryptxref(xref); + if (error) + die(error); + + if (xref->crypt) + { + okay = pdf_setpassword(xref->crypt, password); + if (!okay && !dieonbadpass) + fz_warn("invalid password, attempting to continue."); + else if (!okay && dieonbadpass) + die(fz_throw("invalid password")); + } + + obj = fz_dictgets(xref->trailer, "Root"); + xref->root = fz_resolveindirect(obj); + if (xref->root) + fz_keepobj(xref->root); + + obj = fz_dictgets(xref->trailer, "Info"); + xref->info = fz_resolveindirect(obj); + if (xref->info) + fz_keepobj(xref->info); +} + +void closexref(void) +{ + if (cleanup) + cleanup(); + + if (pagetree) + { + pdf_droppagetree(pagetree); + pagetree = nil; + } + + if (xref) + { + pdf_closexref(xref); + xref = nil; + } + + basename = nil; +} + +void loadpagetree(void) +{ + fz_error error; + + error = pdf_loadpagetree(&pagetree, xref); + if (error) + die(error); +} + |