diff --git a/androscalpel_serializer/src/array.rs b/androscalpel_serializer/src/array.rs index d6772bc..ec9a327 100644 --- a/androscalpel_serializer/src/array.rs +++ b/androscalpel_serializer/src/array.rs @@ -1,18 +1,43 @@ +use crate::{EncodedValue, Uleb128}; use crate::{ReadSeek, Result, Serializable}; use std::io::Write; +/// Encoded Array: https://source.android.com/docs/core/runtime/dex-format#encoded-array #[derive(Debug, Clone, PartialEq, Eq)] -pub struct EncodedArray; +pub struct EncodedArray { + // pub size: Uleb128, + pub values: Vec, +} + +impl EncodedArray { + /// Return the size field + pub fn size(&self) -> Uleb128 { + Uleb128(self.values.len() as u32) + } +} impl Serializable for EncodedArray { - fn serialize(&self, _output: &mut dyn Write) -> Result<()> { - todo!() + fn serialize(&self, output: &mut dyn Write) -> Result<()> { + self.size().serialize(output)?; + for value in self.values { + value.serialize(output)?; + } + Ok(()) } - fn deserialize(_input: &mut dyn ReadSeek) -> Result { - todo!() + + fn deserialize(input: &mut dyn ReadSeek) -> Result { + let Uleb128(size) = Uleb128::deserialize(input)?; + let mut values = vec![]; + for _ in 0..size { + values.push(EncodedValue::deserialize(input)?); + } + Ok(Self { + // size: Uleb128(size), + values, + }) } fn size(&self) -> usize { - todo!() + self.size().size() + self.values.iter().map(|val| val.size()).sum::() } }