]> www.fi.muni.cz Git - evince.git/blob - backend/impress/document.c
b01c0e181853e4f6f9b02301fc1b253360dbdf08
[evince.git] / backend / impress / document.c
1 /* imposter (OO.org Impress viewer)
2 ** Copyright (C) 2003-2005 Gurer Ozen
3 ** This code is free software; you can redistribute it and/or
4 ** modify it under the terms of GNU General Public License.
5 */
6
7 #include <config.h>
8 #include "common.h"
9 #include "internal.h"
10
11 static iks *
12 _imp_load_xml(ImpDoc *doc, const char *xmlfile)
13 {
14         int e;
15         iks *x;
16
17         x = zip_load_xml (doc->zfile, xmlfile, &e);
18         return x;
19 }
20
21 ImpDoc *
22 imp_open(const char *filename, int *err)
23 {
24         ImpDoc *doc;
25         int e;
26
27         doc = calloc(1, sizeof(ImpDoc));
28         if (!doc) {
29                 *err = IMP_NOMEM;
30                 return NULL;
31         }
32
33         doc->stack = iks_stack_new(sizeof(ImpPage) * 32, 0);
34         if (!doc->stack) {
35                 *err = IMP_NOMEM;
36                 imp_close(doc);
37                 return NULL;
38         }
39
40         doc->zfile = zip_open(filename, &e);
41         if (e) {
42                 *err = IMP_NOTZIP;
43                 imp_close(doc);
44                 return NULL;
45         }
46
47         doc->content = _imp_load_xml(doc, "content.xml");
48         doc->styles = _imp_load_xml(doc, "styles.xml");
49         doc->meta = _imp_load_xml(doc, "meta.xml");
50
51         if (!doc->content || !doc->styles) {
52                 *err = IMP_BADDOC;
53                 imp_close(doc);
54                 return NULL;
55         }
56
57         e = _imp_oo13_load(doc);
58         if (e && e != IMP_NOTIMP) {
59                 *err = e;
60                 imp_close(doc);
61                 return NULL;
62         }
63
64         if (e == IMP_NOTIMP) {
65                 e = _imp_oasis_load(doc);
66                 if (e) {
67                         *err = e;
68                         imp_close(doc);
69                         return NULL;
70                 }
71         }
72
73         return doc;
74 }
75
76 int
77 imp_nr_pages(ImpDoc *doc)
78 {
79         return doc->nr_pages;
80 }
81
82 ImpPage *
83 imp_get_page(ImpDoc *doc, int page_no)
84 {
85         if (page_no == IMP_LAST_PAGE) {
86                 return doc->last_page;
87         } else {
88                 ImpPage *page;
89                 if (page_no < 0 || page_no > doc->nr_pages) return NULL;
90                 for (page = doc->pages; page_no; --page_no) {
91                         page = page->next;
92                 }
93                 return page;
94         }
95 }
96
97 ImpPage *
98 imp_next_page(ImpPage *page)
99 {
100         return page->next;
101 }
102
103 ImpPage *
104 imp_prev_page(ImpPage *page)
105 {
106         return page->prev;
107 }
108
109 int
110 imp_get_page_no(ImpPage *page)
111 {
112         return page->nr;
113 }
114
115 const char *
116 imp_get_page_name(ImpPage *page)
117 {
118         return page->name;
119 }
120
121 void *
122 imp_get_xml(ImpDoc *doc, const char *filename)
123 {
124         if (strcmp(filename, "content.xml") == 0)
125                 return doc->content;
126         else if (strcmp(filename, "styles.xml") == 0)
127                 return doc->styles;
128         else if (strcmp(filename, "meta.xml") == 0)
129                 return doc->meta;
130         else
131                 return NULL;
132 }
133
134 void
135 imp_close(ImpDoc *doc)
136 {
137         if (doc->stack) iks_stack_delete(doc->stack);
138         if (doc->zfile) zip_close(doc->zfile);
139         free(doc);
140 }