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