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