Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/windirstat/ntfs.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/attribute.rs')
-rw-r--r--src/attribute.rs52
1 files changed, 18 insertions, 34 deletions
diff --git a/src/attribute.rs b/src/attribute.rs
index 8de17b6..567acd1 100644
--- a/src/attribute.rs
+++ b/src/attribute.rs
@@ -5,8 +5,8 @@ use crate::error::{NtfsError, Result};
use crate::file::NtfsFile;
use crate::string::NtfsString;
use crate::structured_values::{
- NtfsAttributeList, NtfsAttributeListEntries, NtfsStructuredValueFromNonResidentAttributeValue,
- NtfsStructuredValueFromSlice,
+ NtfsAttributeList, NtfsAttributeListEntries, NtfsStructuredValue,
+ NtfsStructuredValueFromResidentAttributeValue,
};
use crate::types::Vcn;
use crate::value::attribute_list_non_resident_attribute::NtfsAttributeListNonResidentAttributeValue;
@@ -206,28 +206,6 @@ impl<'n, 'f> NtfsAttribute<'n, 'f> {
name_length_in_characters as usize * mem::size_of::<u16>()
}
- pub fn non_resident_structured_value<T, S>(&self, fs: &mut T) -> Result<S>
- where
- T: Read + Seek,
- S: NtfsStructuredValueFromNonResidentAttributeValue<'n, 'f>,
- {
- let ty = self.ty()?;
- if ty != S::TY {
- return Err(NtfsError::StructuredValueOfDifferentType {
- position: self.position(),
- ty,
- });
- }
-
- if self.is_resident() {
- return Err(NtfsError::UnexpectedResidentAttribute {
- position: self.position(),
- });
- }
-
- S::from_non_resident_attribute_value(fs, self.non_resident_value()?)
- }
-
pub(crate) fn non_resident_value(&self) -> Result<NtfsNonResidentAttributeValue<'n, 'f>> {
let (data, position) = self.non_resident_value_data_and_position();
@@ -272,13 +250,14 @@ impl<'n, 'f> NtfsAttribute<'n, 'f> {
pub fn resident_structured_value<S>(&self) -> Result<S>
where
- S: NtfsStructuredValueFromSlice<'f>,
+ S: NtfsStructuredValueFromResidentAttributeValue<'n, 'f>,
{
let ty = self.ty()?;
if ty != S::TY {
- return Err(NtfsError::StructuredValueOfDifferentType {
+ return Err(NtfsError::AttributeOfDifferentType {
position: self.position(),
- ty,
+ expected: S::TY,
+ actual: ty,
});
}
@@ -289,7 +268,7 @@ impl<'n, 'f> NtfsAttribute<'n, 'f> {
}
let resident_value = self.resident_value()?;
- S::from_slice(resident_value.data(), self.position())
+ S::from_resident_attribute_value(resident_value)
}
pub(crate) fn resident_value(&self) -> Result<NtfsSliceValue<'f>> {
@@ -318,14 +297,18 @@ impl<'n, 'f> NtfsAttribute<'n, 'f> {
pub fn structured_value<T, S>(&self, fs: &mut T) -> Result<S>
where
T: Read + Seek,
- S: NtfsStructuredValueFromSlice<'f>
- + NtfsStructuredValueFromNonResidentAttributeValue<'n, 'f>,
+ S: NtfsStructuredValue<'n, 'f>,
{
- if self.is_resident() {
- self.resident_structured_value()
- } else {
- self.non_resident_structured_value(fs)
+ let ty = self.ty()?;
+ if ty != S::TY {
+ return Err(NtfsError::AttributeOfDifferentType {
+ position: self.position(),
+ expected: S::TY,
+ actual: ty,
+ });
}
+
+ S::from_value(fs, self.value()?)
}
/// Returns the type of this NTFS attribute, or [`NtfsError::UnsupportedAttributeType`]
@@ -514,6 +497,7 @@ impl<'n, 'f> NtfsAttributes<'n, 'f> {
}
}
+#[derive(Clone, Debug)]
pub struct NtfsAttributeItem<'n, 'f> {
attribute_file: &'f NtfsFile<'n>,
attribute_value_file: Option<NtfsFile<'n>>,