summaryrefslogtreecommitdiff
path: root/pdf
diff options
context:
space:
mode:
authorRobin Watts <robin.watts@artifex.com>2012-04-17 00:40:43 +0100
committerRobin Watts <robin.watts@artifex.com>2012-04-17 09:25:03 +0100
commit4069e52998d2cb2b54e65e8a8b418868ffa73bee (patch)
tree423024feca20fdb07224ecb40c807dbb3fbd4644 /pdf
parent00851c1b04215f2e5688836be57e4efdb198483b (diff)
downloadmupdf-4069e52998d2cb2b54e65e8a8b418868ffa73bee.tar.xz
Add Meta interface to fz_document.
Use this to reintroduce "Document Properties..." in mupdf viewer.
Diffstat (limited to 'pdf')
-rw-r--r--pdf/pdf_xref.c76
1 files changed, 76 insertions, 0 deletions
diff --git a/pdf/pdf_xref.c b/pdf/pdf_xref.c
index ffdc435e..11cf4bf0 100644
--- a/pdf/pdf_xref.c
+++ b/pdf/pdf_xref.c
@@ -1182,6 +1182,81 @@ static void pdf_free_page_shim(fz_document *doc, fz_page *page)
pdf_free_page((pdf_document*)doc, (pdf_page*)page);
}
+static int pdf_meta(fz_document *doc_, int key, void *ptr, int size)
+{
+ pdf_document *doc = (pdf_document *)doc_;
+
+ switch(key)
+ {
+ /*
+ ptr: Pointer to block (uninitialised on entry)
+ size: Size of block (at least 64 bytes)
+ Returns: Document format as a brief text string.
+ */
+ case FZ_META_FORMAT_INFO:
+ sprintf((char *)ptr, "PDF %d.%d", doc->version/10, doc->version % 10);
+ return FZ_META_OK;
+ case FZ_META_CRYPT_INFO:
+ if (doc->crypt)
+ sprintf((char *)ptr, "Standard V%d %d-bit %s",
+ pdf_crypt_revision(doc),
+ pdf_crypt_length(doc),
+ pdf_crypt_method(doc));
+ else
+ sprintf((char *)ptr, "None");
+ return FZ_META_OK;
+ case FZ_META_HAS_PERMISSION:
+ {
+ int i;
+ switch (size)
+ {
+ case FZ_PERMISSION_PRINT:
+ i = PDF_PERM_PRINT;
+ break;
+ case FZ_PERMISSION_CHANGE:
+ i = PDF_PERM_CHANGE;
+ break;
+ case FZ_PERMISSION_COPY:
+ i = PDF_PERM_COPY;
+ break;
+ case FZ_PERMISSION_NOTES:
+ i = PDF_PERM_NOTES;
+ break;
+ default:
+ return 0;
+ }
+ return pdf_has_permission(doc, size);
+ }
+ case FZ_META_INFO:
+ {
+ pdf_obj *info = pdf_dict_gets(doc->trailer, "Info");
+ if (!info)
+ {
+ if (ptr)
+ *(char *)ptr = 0;
+ return 0;
+ }
+ info = pdf_dict_gets(info, *(char **)ptr);
+ if (!info)
+ {
+ if (ptr)
+ *(char *)ptr = 0;
+ return 0;
+ }
+ if (info && ptr && size)
+ {
+ char *utf8 = pdf_to_utf8(doc->ctx, info);
+ strncpy(ptr, utf8, size);
+ ((char *)ptr)[size-1] = 0;
+ fz_free(doc->ctx, utf8);
+ }
+ return 1;
+ }
+ default:
+ return FZ_META_UNKNOWN_KEY;
+ }
+}
+
static void
pdf_init_document(pdf_document *doc)
{
@@ -1195,4 +1270,5 @@ pdf_init_document(pdf_document *doc)
doc->super.bound_page = pdf_bound_page_shim;
doc->super.run_page = pdf_run_page_shim;
doc->super.free_page = pdf_free_page_shim;
+ doc->super.meta = pdf_meta;
}