umya_spreadsheet/structs/
workbook_protection.rs1use super::BooleanValue;
3use super::StringValue;
4use super::UInt32Value;
5use crate::helper::crypt::*;
6use crate::reader::driver::*;
7use crate::writer::driver::*;
8use md5::Digest;
9use quick_xml::events::{BytesStart, Event};
10use quick_xml::Reader;
11use quick_xml::Writer;
12use std::io::Cursor;
13
14#[derive(Default, Debug, Clone, PartialEq, PartialOrd)]
15pub struct WorkbookProtection {
16 workbook_algorithm_name: StringValue,
17 workbook_hash_value: StringValue,
18 workbook_salt_value: StringValue,
19 workbook_spin_count: UInt32Value,
20 workbook_password: StringValue,
21 revisions_algorithm_name: StringValue,
22 revisions_hash_value: StringValue,
23 revisions_salt_value: StringValue,
24 revisions_spin_count: UInt32Value,
25 revisions_password: StringValue,
26 lock_revision: BooleanValue,
27 lock_structure: BooleanValue,
28 lock_windows: BooleanValue,
29}
30impl WorkbookProtection {
31 #[inline]
32 pub fn get_workbook_algorithm_name(&self) -> &str {
33 self.workbook_algorithm_name.get_value_str()
34 }
35
36 #[inline]
37 pub fn set_workbook_algorithm_name<S: Into<String>>(&mut self, value: S) -> &mut Self {
38 self.workbook_algorithm_name.set_value(value);
39 self
40 }
41
42 #[inline]
43 pub fn get_workbook_hash_value(&self) -> &str {
44 self.workbook_hash_value.get_value_str()
45 }
46
47 #[inline]
48 pub fn set_workbook_hash_value<S: Into<String>>(&mut self, value: S) -> &mut Self {
49 self.workbook_hash_value.set_value(value);
50 self
51 }
52
53 #[inline]
54 pub fn get_workbook_salt_value(&self) -> &str {
55 self.workbook_salt_value.get_value_str()
56 }
57
58 #[inline]
59 pub fn set_workbook_salt_value<S: Into<String>>(&mut self, value: S) -> &mut Self {
60 self.workbook_salt_value.set_value(value);
61 self
62 }
63
64 #[inline]
65 pub fn get_workbook_spin_count(&self) -> &u32 {
66 self.workbook_spin_count.get_value()
67 }
68
69 #[inline]
70 pub fn set_workbook_spin_count(&mut self, value: u32) -> &mut Self {
71 self.workbook_spin_count.set_value(value);
72 self
73 }
74
75 #[inline]
76 pub fn get_workbook_password_raw(&self) -> &str {
77 self.workbook_password.get_value_str()
78 }
79
80 #[inline]
81 pub fn set_workbook_password_raw<S: Into<String>>(&mut self, value: S) -> &mut Self {
82 self.workbook_password.set_value(value);
83 self
84 }
85
86 #[inline]
87 pub fn remove_workbook_password_raw(&mut self) -> &mut Self {
88 self.workbook_password.remove_value();
89 self
90 }
91
92 #[inline]
93 pub fn get_revisions_algorithm_name(&self) -> &str {
94 self.revisions_algorithm_name.get_value_str()
95 }
96
97 #[inline]
98 pub fn set_revisions_algorithm_name<S: Into<String>>(&mut self, value: S) -> &mut Self {
99 self.revisions_algorithm_name.set_value(value);
100 self
101 }
102
103 #[inline]
104 pub fn get_revisions_hash_value(&self) -> &str {
105 self.revisions_hash_value.get_value_str()
106 }
107
108 #[inline]
109 pub fn set_revisions_hash_value<S: Into<String>>(&mut self, value: S) -> &mut Self {
110 self.revisions_hash_value.set_value(value);
111 self
112 }
113
114 #[inline]
115 pub fn get_revisions_salt_value(&self) -> &str {
116 self.revisions_salt_value.get_value_str()
117 }
118
119 #[inline]
120 pub fn set_revisions_salt_value<S: Into<String>>(&mut self, value: S) -> &mut Self {
121 self.revisions_salt_value.set_value(value);
122 self
123 }
124
125 #[inline]
126 pub fn get_revisions_spin_count(&self) -> &u32 {
127 self.revisions_spin_count.get_value()
128 }
129
130 #[inline]
131 pub fn set_revisions_spin_count(&mut self, value: u32) -> &mut Self {
132 self.revisions_spin_count.set_value(value);
133 self
134 }
135
136 #[inline]
137 pub fn get_revisions_password_raw(&self) -> &str {
138 self.revisions_password.get_value_str()
139 }
140
141 #[inline]
142 pub fn set_revisions_password_raw<S: Into<String>>(&mut self, value: S) -> &mut Self {
143 self.revisions_password.set_value(value);
144 self
145 }
146
147 #[inline]
148 pub fn remove_revisions_password_raw(&mut self) -> &mut Self {
149 self.revisions_password.remove_value();
150 self
151 }
152
153 #[inline]
154 pub fn get_lock_revision(&self) -> &bool {
155 self.lock_revision.get_value()
156 }
157
158 #[inline]
159 pub fn set_lock_revision(&mut self, value: bool) -> &mut Self {
160 self.lock_revision.set_value(value);
161 self
162 }
163
164 #[inline]
165 pub fn get_lock_structure(&self) -> &bool {
166 self.lock_structure.get_value()
167 }
168
169 #[inline]
170 pub fn set_lock_structure(&mut self, value: bool) -> &mut Self {
171 self.lock_structure.set_value(value);
172 self
173 }
174
175 #[inline]
176 pub fn get_lock_windows(&self) -> &bool {
177 self.lock_windows.get_value()
178 }
179
180 #[inline]
181 pub fn set_lock_windows(&mut self, value: bool) -> &mut Self {
182 self.lock_windows.set_value(value);
183 self
184 }
185
186 #[inline]
187 pub fn set_workbook_password(&mut self, password: &str) -> &mut Self {
188 encrypt_workbook_protection(password, self);
189 self
190 }
191
192 #[inline]
193 pub fn set_revisions_password(&mut self, password: &str) -> &mut Self {
194 encrypt_revisions_protection(password, self);
195 self
196 }
197
198 pub(crate) fn set_attributes<R: std::io::BufRead>(
199 &mut self,
200 _reader: &mut Reader<R>,
201 e: &BytesStart,
202 ) {
203 set_string_from_xml!(self, e, workbook_algorithm_name, "workbookAlgorithmName");
204 set_string_from_xml!(self, e, workbook_hash_value, "workbookHashValue");
205 set_string_from_xml!(self, e, workbook_salt_value, "workbookSaltValue");
206 set_string_from_xml!(self, e, workbook_spin_count, "workbookSpinCount");
207 set_string_from_xml!(self, e, workbook_password, "workbookPassword");
208 set_string_from_xml!(self, e, revisions_algorithm_name, "revisionsAlgorithmName");
209 set_string_from_xml!(self, e, revisions_hash_value, "revisionsHashValue");
210 set_string_from_xml!(self, e, revisions_salt_value, "revisionsSaltValue");
211 set_string_from_xml!(self, e, revisions_spin_count, "revisionsSpinCount");
212 set_string_from_xml!(self, e, revisions_password, "revisionsPassword");
213 set_string_from_xml!(self, e, lock_revision, "lockRevision");
214 set_string_from_xml!(self, e, lock_structure, "lockStructure");
215 set_string_from_xml!(self, e, lock_windows, "lockWindows");
216 }
217
218 pub(crate) fn write_to(&self, writer: &mut Writer<Cursor<Vec<u8>>>) {
219 let mut attributes: Vec<(&str, &str)> = Vec::new();
221 if self.workbook_algorithm_name.has_value() {
222 attributes.push((
223 "workbookAlgorithmName",
224 self.workbook_algorithm_name.get_value_str(),
225 ));
226 }
227 if self.workbook_hash_value.has_value() {
228 attributes.push((
229 "workbookHashValue",
230 self.workbook_hash_value.get_value_str(),
231 ));
232 }
233 if self.workbook_salt_value.has_value() {
234 attributes.push((
235 "workbookSaltValue",
236 self.workbook_salt_value.get_value_str(),
237 ));
238 }
239 let workbook_spin_count = self.workbook_spin_count.get_value_string();
240 if self.workbook_spin_count.has_value() {
241 attributes.push(("workbookSpinCount", &workbook_spin_count));
242 }
243 if self.workbook_password.has_value() {
244 attributes.push(("workbookPassword", self.workbook_password.get_value_str()));
245 }
246 if self.revisions_algorithm_name.has_value() {
247 attributes.push((
248 "revisionsAlgorithmName",
249 self.revisions_algorithm_name.get_value_str(),
250 ));
251 }
252 if self.revisions_hash_value.has_value() {
253 attributes.push((
254 "revisionsHashValue",
255 self.revisions_hash_value.get_value_str(),
256 ));
257 }
258 if self.revisions_salt_value.has_value() {
259 attributes.push((
260 "revisionsSaltValue",
261 self.revisions_salt_value.get_value_str(),
262 ));
263 }
264 let revisions_spin_count = self.revisions_spin_count.get_value_string();
265 if self.revisions_spin_count.has_value() {
266 attributes.push(("revisionsSpinCount", &revisions_spin_count));
267 }
268 if self.revisions_password.has_value() {
269 attributes.push(("revisionsPassword", self.revisions_password.get_value_str()));
270 }
271 if self.lock_revision.has_value() {
272 attributes.push(("lockRevision", self.lock_revision.get_value_string()));
273 }
274 if self.lock_structure.has_value() {
275 attributes.push(("lockStructure", self.lock_structure.get_value_string()));
276 }
277 if self.lock_windows.has_value() {
278 attributes.push(("lockWindows", self.lock_windows.get_value_string()));
279 }
280
281 write_start_tag(writer, "workbookProtection", attributes, true);
282 }
283}