1pub mod crypto;
30pub mod error;
31pub mod model;
32pub mod package;
33pub mod render;
34pub mod types;
35pub mod verify;
36
37use std::fs::File;
38use std::io::{Read, Seek};
39use std::path::Path;
40
41pub use error::{OfdError, Result};
42pub use model::*;
43pub use package::OfdPackage;
44pub use render::RenderOptions;
45pub use types::{StArray, StBox, StId, StLoc, StPos, StRefId, parent_dir, resolve_path};
46pub use verify::{
47 CheckMethod, CheckReport, LoadedSignature, RefStatus, SigVerdict, SignatureReport, check_path,
48 check_reader,
49};
50
51pub const ENTRY_OFD: &str = "OFD.xml";
53
54pub struct OfdReader<R> {
59 package: OfdPackage<R>,
60 ofd: Ofd,
61}
62
63impl OfdReader<File> {
64 pub fn open<P: AsRef<Path>>(path: P) -> Result<Self> {
66 Self::new(OfdPackage::open(path)?)
67 }
68}
69
70impl<R: Read + Seek> OfdReader<R> {
71 pub fn new(mut package: OfdPackage<R>) -> Result<Self> {
73 let ofd: Ofd = package.parse(ENTRY_OFD)?;
74 Ok(OfdReader { package, ofd })
75 }
76
77 pub fn ofd(&self) -> &Ofd {
79 &self.ofd
80 }
81
82 pub fn package_mut(&mut self) -> &mut OfdPackage<R> {
84 &mut self.package
85 }
86
87 pub fn load_document(&mut self, body: &DocBody) -> Result<LoadedDocument> {
92 let doc_root = body
93 .doc_root
94 .as_ref()
95 .ok_or_else(|| OfdError::Structure("DocBody is missing DocRoot".to_string()))?;
96 let path = resolve_path("", doc_root);
97 let base = parent_dir(&path).to_string();
98 let document: Document = self.package.parse(&path)?;
99 Ok(LoadedDocument { document, base })
100 }
101
102 pub fn load_page(&mut self, doc: &LoadedDocument, page: &PageRef) -> Result<PageObject> {
104 let path = resolve_path(&doc.base, &page.base_loc);
105 self.package.parse(&path)
106 }
107
108 pub fn load_template(
110 &mut self,
111 doc: &LoadedDocument,
112 template: &CtTemplatePage,
113 ) -> Result<PageObject> {
114 let path = resolve_path(&doc.base, &template.base_loc);
115 self.package.parse(&path)
116 }
117
118 pub fn load_resource(&mut self, doc: &LoadedDocument, loc: &StLoc) -> Result<Res> {
120 let path = resolve_path(&doc.base, loc);
121 self.package.parse(&path)
122 }
123}
124
125pub struct LoadedDocument {
130 pub document: Document,
132 pub base: String,
134}
135
136impl LoadedDocument {
137 pub fn pages(&self) -> &[PageRef] {
139 &self.document.pages.pages
140 }
141
142 pub fn template_pages(&self) -> &[CtTemplatePage] {
144 &self.document.common_data.template_pages
145 }
146
147 pub fn public_res(&self) -> &[StLoc] {
149 &self.document.common_data.public_res
150 }
151
152 pub fn document_res(&self) -> &[StLoc] {
154 &self.document.common_data.document_res
155 }
156}