Loading tools/aconfig/aconfig_storage_file/src/lib.rs +1 −0 Original line number Diff line number Diff line Loading @@ -103,6 +103,7 @@ impl TryFrom<u8> for StorageFileType { } /// Flag type enum as stored by storage file /// ONLY APPEND, NEVER REMOVE FOR BACKWARD COMPATOBILITY. THE MAX IS U16. #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum StoredFlagType { ReadWriteBoolean = 0, Loading tools/aconfig/aconfig_storage_read_api/aconfig_storage_read_api.cpp +2 −1 Original line number Diff line number Diff line Loading @@ -155,7 +155,8 @@ Result<FlagOffset> get_flag_offset( if (offset_cxx.query_success) { auto offset = FlagOffset(); offset.flag_exists = offset_cxx.flag_exists; offset.flag_offset = offset_cxx.flag_offset; offset.flag_type = static_cast<StoredFlagType>(offset_cxx.flag_type); offset.flag_id = offset_cxx.flag_id; return offset; } else { return Error() << offset_cxx.error_message; Loading tools/aconfig/aconfig_storage_read_api/include/aconfig_storage/aconfig_storage_read_api.hpp +10 −2 Original line number Diff line number Diff line Loading @@ -27,10 +27,18 @@ struct PackageOffset { uint32_t boolean_offset; }; /// Flag type enum, to be consistent with the one defined in aconfig_storage_file/src/lib.rs enum StoredFlagType { ReadWriteBoolean = 0, ReadOnlyBoolean = 1, FixedReadOnlyBoolean = 2, }; /// Flag offset query result struct FlagOffset { bool flag_exists; uint16_t flag_offset; StoredFlagType flag_type; uint16_t flag_id; }; /// DO NOT USE APIS IN THE FOLLOWING NAMESPACE DIRECTLY Loading Loading @@ -83,7 +91,7 @@ android::base::Result<bool> get_boolean_flag_value( MappedStorageFile const& file, uint32_t offset); /// Flag info enum, to be consistent with the one defined in src/lib.rs /// Flag info enum, to be consistent with the one defined in aconfig_storage_file/src/lib.rs enum FlagInfoBit { IsSticky = 1<<0, IsReadWrite = 1<<1, Loading tools/aconfig/aconfig_storage_read_api/src/flag_table_query.rs +22 −13 Original line number Diff line number Diff line Loading @@ -18,11 +18,16 @@ use crate::{AconfigStorageError, FILE_VERSION}; use aconfig_storage_file::{ flag_table::FlagTableHeader, flag_table::FlagTableNode, read_u32_from_bytes, flag_table::FlagTableHeader, flag_table::FlagTableNode, read_u32_from_bytes, StoredFlagType, }; use anyhow::anyhow; pub type FlagOffset = u16; /// Flag table query return #[derive(PartialEq, Debug)] pub struct FlagOffset { pub flag_type: StoredFlagType, pub flag_id: u16, } /// Query flag within package offset pub fn find_flag_offset( Loading Loading @@ -53,7 +58,10 @@ pub fn find_flag_offset( loop { let interpreted_node = FlagTableNode::from_bytes(&buf[flag_node_offset..])?; if interpreted_node.package_id == package_id && interpreted_node.flag_name == flag { return Ok(Some(interpreted_node.flag_id)); return Ok(Some(FlagOffset { flag_type: interpreted_node.flag_type, flag_id: interpreted_node.flag_id, })); } match interpreted_node.next_offset { Some(offset) => flag_node_offset = offset as usize, Loading @@ -72,19 +80,20 @@ mod tests { fn test_flag_query() { let flag_table = create_test_flag_table().into_bytes(); let baseline = vec![ (0, "enabled_ro", 1u16), (0, "enabled_rw", 2u16), (1, "disabled_ro", 0u16), (2, "enabled_ro", 1u16), (1, "enabled_fixed_ro", 1u16), (1, "enabled_ro", 2u16), (2, "enabled_fixed_ro", 0u16), (0, "disabled_rw", 0u16), (0, "enabled_ro", StoredFlagType::ReadOnlyBoolean, 1u16), (0, "enabled_rw", StoredFlagType::ReadWriteBoolean, 2u16), (1, "disabled_ro", StoredFlagType::ReadOnlyBoolean, 0u16), (2, "enabled_ro", StoredFlagType::ReadOnlyBoolean, 1u16), (1, "enabled_fixed_ro", StoredFlagType::FixedReadOnlyBoolean, 1u16), (1, "enabled_ro", StoredFlagType::ReadOnlyBoolean, 2u16), (2, "enabled_fixed_ro", StoredFlagType::FixedReadOnlyBoolean, 0u16), (0, "disabled_rw", StoredFlagType::ReadWriteBoolean, 0u16), ]; for (package_id, flag_name, expected_offset) in baseline.into_iter() { for (package_id, flag_name, flag_type, flag_id) in baseline.into_iter() { let flag_offset = find_flag_offset(&flag_table[..], package_id, flag_name).unwrap().unwrap(); assert_eq!(flag_offset, expected_offset); assert_eq!(flag_offset.flag_type, flag_type); assert_eq!(flag_offset.flag_id, flag_id); } } Loading tools/aconfig/aconfig_storage_read_api/src/lib.rs +28 −17 Original line number Diff line number Diff line Loading @@ -187,7 +187,8 @@ mod ffi { pub query_success: bool, pub error_message: String, pub flag_exists: bool, pub flag_offset: u16, pub flag_type: u16, pub flag_id: u16, } // Flag value query return for cc interlop Loading @@ -214,7 +215,10 @@ mod ffi { pub fn get_boolean_flag_value_cxx(file: &[u8], offset: u32) -> BooleanFlagValueQueryCXX; pub fn get_boolean_flag_attribute_cxx(file: &[u8], offset: u32) -> BooleanFlagAttributeQueryCXX; pub fn get_boolean_flag_attribute_cxx( file: &[u8], offset: u32, ) -> BooleanFlagAttributeQueryCXX; } } Loading Loading @@ -258,20 +262,23 @@ impl ffi::FlagOffsetQueryCXX { query_success: true, error_message: String::from(""), flag_exists: true, flag_offset: offset, flag_type: offset.flag_type as u16, flag_id: offset.flag_id, }, None => Self { query_success: true, error_message: String::from(""), flag_exists: false, flag_offset: 0, flag_type: 0u16, flag_id: 0u16, }, }, Err(errmsg) => Self { query_success: false, error_message: format!("{:?}", errmsg), flag_exists: false, flag_offset: 0, flag_type: 0u16, flag_id: 0u16, }, } } Loading Loading @@ -344,7 +351,10 @@ pub fn get_boolean_flag_value_cxx(file: &[u8], offset: u32) -> ffi::BooleanFlagV } /// Get boolean flag attribute cc interlop pub fn get_boolean_flag_attribute_cxx(file: &[u8], offset: u32) -> ffi::BooleanFlagAttributeQueryCXX { pub fn get_boolean_flag_attribute_cxx( file: &[u8], offset: u32, ) -> ffi::BooleanFlagAttributeQueryCXX { ffi::BooleanFlagAttributeQueryCXX::new(find_boolean_flag_attribute(file, offset)) } Loading @@ -359,7 +369,7 @@ mod tests { use crate::mapped_file::get_mapped_file; use crate::test_utils::copy_to_temp_file; use aconfig_storage_file::protos::storage_record_pb::write_proto_to_temp_file; use aconfig_storage_file::FlagInfoBit; use aconfig_storage_file::{FlagInfoBit, StoredFlagType}; use tempfile::NamedTempFile; fn create_test_storage_files() -> [NamedTempFile; 5] { Loading Loading @@ -429,19 +439,20 @@ files {{ unsafe { get_mapped_file(&pb_file_path, "mockup", StorageFileType::FlagMap).unwrap() }; let baseline = vec![ (0, "enabled_ro", 1u16), (0, "enabled_rw", 2u16), (1, "disabled_ro", 0u16), (2, "enabled_ro", 1u16), (1, "enabled_fixed_ro", 1u16), (1, "enabled_ro", 2u16), (2, "enabled_fixed_ro", 0u16), (0, "disabled_rw", 0u16), (0, "enabled_ro", StoredFlagType::ReadOnlyBoolean, 1u16), (0, "enabled_rw", StoredFlagType::ReadWriteBoolean, 2u16), (1, "disabled_ro", StoredFlagType::ReadOnlyBoolean, 0u16), (2, "enabled_ro", StoredFlagType::ReadOnlyBoolean, 1u16), (1, "enabled_fixed_ro", StoredFlagType::FixedReadOnlyBoolean, 1u16), (1, "enabled_ro", StoredFlagType::ReadOnlyBoolean, 2u16), (2, "enabled_fixed_ro", StoredFlagType::FixedReadOnlyBoolean, 0u16), (0, "disabled_rw", StoredFlagType::ReadWriteBoolean, 0u16), ]; for (package_id, flag_name, expected_offset) in baseline.into_iter() { for (package_id, flag_name, flag_type, flag_id) in baseline.into_iter() { let flag_offset = get_flag_offset(&flag_mapped_file, package_id, flag_name).unwrap().unwrap(); assert_eq!(flag_offset, expected_offset); assert_eq!(flag_offset.flag_type, flag_type); assert_eq!(flag_offset.flag_id, flag_id); } } Loading Loading
tools/aconfig/aconfig_storage_file/src/lib.rs +1 −0 Original line number Diff line number Diff line Loading @@ -103,6 +103,7 @@ impl TryFrom<u8> for StorageFileType { } /// Flag type enum as stored by storage file /// ONLY APPEND, NEVER REMOVE FOR BACKWARD COMPATOBILITY. THE MAX IS U16. #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum StoredFlagType { ReadWriteBoolean = 0, Loading
tools/aconfig/aconfig_storage_read_api/aconfig_storage_read_api.cpp +2 −1 Original line number Diff line number Diff line Loading @@ -155,7 +155,8 @@ Result<FlagOffset> get_flag_offset( if (offset_cxx.query_success) { auto offset = FlagOffset(); offset.flag_exists = offset_cxx.flag_exists; offset.flag_offset = offset_cxx.flag_offset; offset.flag_type = static_cast<StoredFlagType>(offset_cxx.flag_type); offset.flag_id = offset_cxx.flag_id; return offset; } else { return Error() << offset_cxx.error_message; Loading
tools/aconfig/aconfig_storage_read_api/include/aconfig_storage/aconfig_storage_read_api.hpp +10 −2 Original line number Diff line number Diff line Loading @@ -27,10 +27,18 @@ struct PackageOffset { uint32_t boolean_offset; }; /// Flag type enum, to be consistent with the one defined in aconfig_storage_file/src/lib.rs enum StoredFlagType { ReadWriteBoolean = 0, ReadOnlyBoolean = 1, FixedReadOnlyBoolean = 2, }; /// Flag offset query result struct FlagOffset { bool flag_exists; uint16_t flag_offset; StoredFlagType flag_type; uint16_t flag_id; }; /// DO NOT USE APIS IN THE FOLLOWING NAMESPACE DIRECTLY Loading Loading @@ -83,7 +91,7 @@ android::base::Result<bool> get_boolean_flag_value( MappedStorageFile const& file, uint32_t offset); /// Flag info enum, to be consistent with the one defined in src/lib.rs /// Flag info enum, to be consistent with the one defined in aconfig_storage_file/src/lib.rs enum FlagInfoBit { IsSticky = 1<<0, IsReadWrite = 1<<1, Loading
tools/aconfig/aconfig_storage_read_api/src/flag_table_query.rs +22 −13 Original line number Diff line number Diff line Loading @@ -18,11 +18,16 @@ use crate::{AconfigStorageError, FILE_VERSION}; use aconfig_storage_file::{ flag_table::FlagTableHeader, flag_table::FlagTableNode, read_u32_from_bytes, flag_table::FlagTableHeader, flag_table::FlagTableNode, read_u32_from_bytes, StoredFlagType, }; use anyhow::anyhow; pub type FlagOffset = u16; /// Flag table query return #[derive(PartialEq, Debug)] pub struct FlagOffset { pub flag_type: StoredFlagType, pub flag_id: u16, } /// Query flag within package offset pub fn find_flag_offset( Loading Loading @@ -53,7 +58,10 @@ pub fn find_flag_offset( loop { let interpreted_node = FlagTableNode::from_bytes(&buf[flag_node_offset..])?; if interpreted_node.package_id == package_id && interpreted_node.flag_name == flag { return Ok(Some(interpreted_node.flag_id)); return Ok(Some(FlagOffset { flag_type: interpreted_node.flag_type, flag_id: interpreted_node.flag_id, })); } match interpreted_node.next_offset { Some(offset) => flag_node_offset = offset as usize, Loading @@ -72,19 +80,20 @@ mod tests { fn test_flag_query() { let flag_table = create_test_flag_table().into_bytes(); let baseline = vec![ (0, "enabled_ro", 1u16), (0, "enabled_rw", 2u16), (1, "disabled_ro", 0u16), (2, "enabled_ro", 1u16), (1, "enabled_fixed_ro", 1u16), (1, "enabled_ro", 2u16), (2, "enabled_fixed_ro", 0u16), (0, "disabled_rw", 0u16), (0, "enabled_ro", StoredFlagType::ReadOnlyBoolean, 1u16), (0, "enabled_rw", StoredFlagType::ReadWriteBoolean, 2u16), (1, "disabled_ro", StoredFlagType::ReadOnlyBoolean, 0u16), (2, "enabled_ro", StoredFlagType::ReadOnlyBoolean, 1u16), (1, "enabled_fixed_ro", StoredFlagType::FixedReadOnlyBoolean, 1u16), (1, "enabled_ro", StoredFlagType::ReadOnlyBoolean, 2u16), (2, "enabled_fixed_ro", StoredFlagType::FixedReadOnlyBoolean, 0u16), (0, "disabled_rw", StoredFlagType::ReadWriteBoolean, 0u16), ]; for (package_id, flag_name, expected_offset) in baseline.into_iter() { for (package_id, flag_name, flag_type, flag_id) in baseline.into_iter() { let flag_offset = find_flag_offset(&flag_table[..], package_id, flag_name).unwrap().unwrap(); assert_eq!(flag_offset, expected_offset); assert_eq!(flag_offset.flag_type, flag_type); assert_eq!(flag_offset.flag_id, flag_id); } } Loading
tools/aconfig/aconfig_storage_read_api/src/lib.rs +28 −17 Original line number Diff line number Diff line Loading @@ -187,7 +187,8 @@ mod ffi { pub query_success: bool, pub error_message: String, pub flag_exists: bool, pub flag_offset: u16, pub flag_type: u16, pub flag_id: u16, } // Flag value query return for cc interlop Loading @@ -214,7 +215,10 @@ mod ffi { pub fn get_boolean_flag_value_cxx(file: &[u8], offset: u32) -> BooleanFlagValueQueryCXX; pub fn get_boolean_flag_attribute_cxx(file: &[u8], offset: u32) -> BooleanFlagAttributeQueryCXX; pub fn get_boolean_flag_attribute_cxx( file: &[u8], offset: u32, ) -> BooleanFlagAttributeQueryCXX; } } Loading Loading @@ -258,20 +262,23 @@ impl ffi::FlagOffsetQueryCXX { query_success: true, error_message: String::from(""), flag_exists: true, flag_offset: offset, flag_type: offset.flag_type as u16, flag_id: offset.flag_id, }, None => Self { query_success: true, error_message: String::from(""), flag_exists: false, flag_offset: 0, flag_type: 0u16, flag_id: 0u16, }, }, Err(errmsg) => Self { query_success: false, error_message: format!("{:?}", errmsg), flag_exists: false, flag_offset: 0, flag_type: 0u16, flag_id: 0u16, }, } } Loading Loading @@ -344,7 +351,10 @@ pub fn get_boolean_flag_value_cxx(file: &[u8], offset: u32) -> ffi::BooleanFlagV } /// Get boolean flag attribute cc interlop pub fn get_boolean_flag_attribute_cxx(file: &[u8], offset: u32) -> ffi::BooleanFlagAttributeQueryCXX { pub fn get_boolean_flag_attribute_cxx( file: &[u8], offset: u32, ) -> ffi::BooleanFlagAttributeQueryCXX { ffi::BooleanFlagAttributeQueryCXX::new(find_boolean_flag_attribute(file, offset)) } Loading @@ -359,7 +369,7 @@ mod tests { use crate::mapped_file::get_mapped_file; use crate::test_utils::copy_to_temp_file; use aconfig_storage_file::protos::storage_record_pb::write_proto_to_temp_file; use aconfig_storage_file::FlagInfoBit; use aconfig_storage_file::{FlagInfoBit, StoredFlagType}; use tempfile::NamedTempFile; fn create_test_storage_files() -> [NamedTempFile; 5] { Loading Loading @@ -429,19 +439,20 @@ files {{ unsafe { get_mapped_file(&pb_file_path, "mockup", StorageFileType::FlagMap).unwrap() }; let baseline = vec![ (0, "enabled_ro", 1u16), (0, "enabled_rw", 2u16), (1, "disabled_ro", 0u16), (2, "enabled_ro", 1u16), (1, "enabled_fixed_ro", 1u16), (1, "enabled_ro", 2u16), (2, "enabled_fixed_ro", 0u16), (0, "disabled_rw", 0u16), (0, "enabled_ro", StoredFlagType::ReadOnlyBoolean, 1u16), (0, "enabled_rw", StoredFlagType::ReadWriteBoolean, 2u16), (1, "disabled_ro", StoredFlagType::ReadOnlyBoolean, 0u16), (2, "enabled_ro", StoredFlagType::ReadOnlyBoolean, 1u16), (1, "enabled_fixed_ro", StoredFlagType::FixedReadOnlyBoolean, 1u16), (1, "enabled_ro", StoredFlagType::ReadOnlyBoolean, 2u16), (2, "enabled_fixed_ro", StoredFlagType::FixedReadOnlyBoolean, 0u16), (0, "disabled_rw", StoredFlagType::ReadWriteBoolean, 0u16), ]; for (package_id, flag_name, expected_offset) in baseline.into_iter() { for (package_id, flag_name, flag_type, flag_id) in baseline.into_iter() { let flag_offset = get_flag_offset(&flag_mapped_file, package_id, flag_name).unwrap().unwrap(); assert_eq!(flag_offset, expected_offset); assert_eq!(flag_offset.flag_type, flag_type); assert_eq!(flag_offset.flag_id, flag_id); } } Loading