oxyroot/rbase/
object.rs

1use crate::rbase::consts::{K_IS_ON_HEAP, K_IS_REFERENCED};
2use crate::rbytes::rbuffer::RBuffer;
3use crate::rbytes::wbuffer::WBuffer;
4use crate::rbytes::{Marshaler, Unmarshaler};
5use crate::root::traits;
6use crate::rvers;
7
8#[derive(Debug, Clone)]
9pub(crate) struct Object {
10    id: u32,
11    bits: u32,
12}
13
14impl Object {
15    fn test_bits(&self, bits: u32) -> bool {
16        self.bits & bits != 0
17    }
18}
19impl traits::Object for Object {
20    fn class(&self) -> &'_ str {
21        "TObject"
22    }
23}
24
25impl Default for Object {
26    fn default() -> Self {
27        Object {
28            id: 0x0,
29            bits: 0x3000000,
30        }
31    }
32}
33
34impl Unmarshaler for Object {
35    fn unmarshal(&mut self, r: &mut RBuffer) -> crate::rbytes::Result<()> {
36        r.skip_version("")?;
37        self.id = r.read_u32()?;
38        self.bits = r.read_u32()?;
39
40        self.bits |= K_IS_ON_HEAP;
41
42        if self.test_bits(K_IS_REFERENCED) {
43            r.read_u16()?;
44        }
45
46        Ok(())
47    }
48}
49
50impl Marshaler for Object {
51    fn marshal(&self, w: &mut WBuffer) -> crate::rbytes::Result<i64> {
52        let n = w.pos();
53        w.write_u16(rvers::OBJECT as u16)?;
54
55        if self.test_bits(K_IS_REFERENCED) {
56            let uid = self.id & 0xffffff;
57            w.write_u32(uid)?;
58            w.write_u32(self.bits)?;
59            w.write_u16(0x0)?;
60        } else {
61            w.write_u32(self.id)?;
62            w.write_u32(self.bits)?;
63        }
64
65        // trace!(";Object.marshal.buf:{:?}", w.p());
66        Ok(w.pos() - n)
67    }
68}