summaryrefslogtreecommitdiff
path: root/backend/impress/document.c
diff options
context:
space:
mode:
Diffstat (limited to 'backend/impress/document.c')
-rw-r--r--backend/impress/document.c140
1 files changed, 140 insertions, 0 deletions
diff --git a/backend/impress/document.c b/backend/impress/document.c
new file mode 100644
index 00000000..b01c0e18
--- /dev/null
+++ b/backend/impress/document.c
@@ -0,0 +1,140 @@
+/* imposter (OO.org Impress viewer)
+** Copyright (C) 2003-2005 Gurer Ozen
+** This code is free software; you can redistribute it and/or
+** modify it under the terms of GNU General Public License.
+*/
+
+#include <config.h>
+#include "common.h"
+#include "internal.h"
+
+static iks *
+_imp_load_xml(ImpDoc *doc, const char *xmlfile)
+{
+ int e;
+ iks *x;
+
+ x = zip_load_xml (doc->zfile, xmlfile, &e);
+ return x;
+}
+
+ImpDoc *
+imp_open(const char *filename, int *err)
+{
+ ImpDoc *doc;
+ int e;
+
+ doc = calloc(1, sizeof(ImpDoc));
+ if (!doc) {
+ *err = IMP_NOMEM;
+ return NULL;
+ }
+
+ doc->stack = iks_stack_new(sizeof(ImpPage) * 32, 0);
+ if (!doc->stack) {
+ *err = IMP_NOMEM;
+ imp_close(doc);
+ return NULL;
+ }
+
+ doc->zfile = zip_open(filename, &e);
+ if (e) {
+ *err = IMP_NOTZIP;
+ imp_close(doc);
+ return NULL;
+ }
+
+ doc->content = _imp_load_xml(doc, "content.xml");
+ doc->styles = _imp_load_xml(doc, "styles.xml");
+ doc->meta = _imp_load_xml(doc, "meta.xml");
+
+ if (!doc->content || !doc->styles) {
+ *err = IMP_BADDOC;
+ imp_close(doc);
+ return NULL;
+ }
+
+ e = _imp_oo13_load(doc);
+ if (e && e != IMP_NOTIMP) {
+ *err = e;
+ imp_close(doc);
+ return NULL;
+ }
+
+ if (e == IMP_NOTIMP) {
+ e = _imp_oasis_load(doc);
+ if (e) {
+ *err = e;
+ imp_close(doc);
+ return NULL;
+ }
+ }
+
+ return doc;
+}
+
+int
+imp_nr_pages(ImpDoc *doc)
+{
+ return doc->nr_pages;
+}
+
+ImpPage *
+imp_get_page(ImpDoc *doc, int page_no)
+{
+ if (page_no == IMP_LAST_PAGE) {
+ return doc->last_page;
+ } else {
+ ImpPage *page;
+ if (page_no < 0 || page_no > doc->nr_pages) return NULL;
+ for (page = doc->pages; page_no; --page_no) {
+ page = page->next;
+ }
+ return page;
+ }
+}
+
+ImpPage *
+imp_next_page(ImpPage *page)
+{
+ return page->next;
+}
+
+ImpPage *
+imp_prev_page(ImpPage *page)
+{
+ return page->prev;
+}
+
+int
+imp_get_page_no(ImpPage *page)
+{
+ return page->nr;
+}
+
+const char *
+imp_get_page_name(ImpPage *page)
+{
+ return page->name;
+}
+
+void *
+imp_get_xml(ImpDoc *doc, const char *filename)
+{
+ if (strcmp(filename, "content.xml") == 0)
+ return doc->content;
+ else if (strcmp(filename, "styles.xml") == 0)
+ return doc->styles;
+ else if (strcmp(filename, "meta.xml") == 0)
+ return doc->meta;
+ else
+ return NULL;
+}
+
+void
+imp_close(ImpDoc *doc)
+{
+ if (doc->stack) iks_stack_delete(doc->stack);
+ if (doc->zfile) zip_close(doc->zfile);
+ free(doc);
+}