umya_spreadsheet/structs/
ole_objects.rs

1// oleObjects
2use super::OleObject;
3use crate::reader::driver::*;
4use crate::structs::raw::RawRelationships;
5use crate::writer::driver::*;
6use quick_xml::events::{BytesStart, Event};
7use quick_xml::Reader;
8use quick_xml::Writer;
9use std::io::Cursor;
10use thin_vec::ThinVec;
11
12#[derive(Clone, Default, Debug)]
13pub struct OleObjects {
14    ole_object: ThinVec<OleObject>,
15}
16
17impl OleObjects {
18    #[inline]
19    pub fn get_ole_object(&self) -> &[OleObject] {
20        &self.ole_object
21    }
22
23    #[inline]
24    pub fn get_ole_object_mut(&mut self) -> &mut ThinVec<OleObject> {
25        &mut self.ole_object
26    }
27
28    #[inline]
29    pub fn set_ole_object(&mut self, value: OleObject) -> &mut Self {
30        self.ole_object.push(value);
31        self
32    }
33
34    pub(crate) fn set_attributes<R: std::io::BufRead>(
35        &mut self,
36        reader: &mut Reader<R>,
37        _e: &BytesStart,
38        relationships: &RawRelationships,
39    ) {
40        xml_read_loop!(
41            reader,
42            Event::Start(ref e) => {
43                if e.name().into_inner() == b"mc:AlternateContent" {
44                    let mut obj = OleObject::default();
45                    obj.set_attributes(reader, e, relationships);
46                    self.set_ole_object(obj);
47                }
48            },
49            Event::End(ref e) => {
50                if e.name().into_inner() == b"oleObjects" {
51                    return
52                }
53            },
54            Event::Eof => panic!("Error: Could not find {} end element", "oleObjects")
55        );
56    }
57
58    pub(crate) fn write_to(
59        &self,
60        writer: &mut Writer<Cursor<Vec<u8>>>,
61        r_id: &usize,
62        ole_id: &usize,
63    ) {
64        if !self.ole_object.is_empty() {
65            // oleObjects
66            write_start_tag(writer, "oleObjects", vec![], false);
67
68            // mc:AlternateContent
69            let mut r = *r_id;
70            let mut o = *ole_id;
71            for obj in &self.ole_object {
72                obj.write_to(writer, &r, &o);
73                r += 2;
74                o += 1;
75            }
76
77            write_end_tag(writer, "oleObjects");
78        }
79    }
80}