/// <summary> /// Constructs and initializes a new instance of <see /// cref="ContentDescriptionObject" /> by reading the /// contents from a specified position in a specified file. /// </summary> /// <param name="file"> /// A <see cref="Asf.File" /> object containing the file from /// which the contents of the new instance are to be read. /// </param> /// <param name="position"> /// A <see cref="long" /> value specify at what position to /// read the object. /// </param> /// <exception cref="ArgumentNullException"> /// <paramref name="file" /> is <see langword="null" />. /// </exception> /// <exception cref="ArgumentOutOfRangeException"> /// <paramref name="position" /> is less than zero or greater /// than the size of the file. /// </exception> /// <exception cref="CorruptFileException"> /// The object read from disk does not have the correct GUID /// or smaller than the minimum size. /// </exception> public ContentDescriptionObject(File file, long position) : base(file, position) { if (Guid != Asf.Guid.AsfContentDescriptionObject) { throw new CorruptFileException("Object GUID incorrect."); } if (OriginalSize < 34) { throw new CorruptFileException("Object size too small."); } ushort title_length = file.ReadWord(); ushort author_length = file.ReadWord(); ushort copyright_length = file.ReadWord(); ushort description_length = file.ReadWord(); ushort rating_length = file.ReadWord(); title = file.ReadUnicode(title_length); author = file.ReadUnicode(author_length); copyright = file.ReadUnicode(copyright_length); description = file.ReadUnicode(description_length); rating = file.ReadUnicode(rating_length); }
/// <summary> /// Populates the current instance by reading in the contents /// from a file. /// </summary> /// <param name="file"> /// A <see cref="Asf.File" /> object to read the raw ASF /// Description Record from. /// </param> /// <returns> /// <see langword="true" /> if the data was read correctly. /// Otherwise <see langword="false" />. /// </returns> protected bool Parse(File file) { // Field name Field type Size (bits) // Language List Index WORD 16 // Stream Number WORD 16 // Name Length WORD 16 // Data Type WORD 16 // Data Length DWORD 32 // Name WCHAR varies // Data See below varies LanguageListIndex = file.ReadWord(); StreamNumber = file.ReadWord(); ushort name_length = file.ReadWord(); Type = (DataType)file.ReadWord(); int data_length = (int)file.ReadDWord(); Name = file.ReadUnicode(name_length); switch (Type) { case DataType.Word: longValue = file.ReadWord(); break; case DataType.Bool: case DataType.DWord: longValue = file.ReadDWord(); break; case DataType.QWord: longValue = file.ReadQWord(); break; case DataType.Unicode: strValue = file.ReadUnicode(data_length); break; case DataType.Bytes: byteValue = file.ReadBlock(data_length); break; case DataType.Guid: guidValue = file.ReadGuid(); break; default: return(false); } return(true); }
/// <summary> /// Constructs and initializes a new instance of <see /// cref="PaddingObject" /> by reading the contents from a /// specified position in a specified file. /// </summary> /// <param name="file"> /// A <see cref="Asf.File" /> object containing the file from /// which the contents of the new instance are to be read. /// </param> /// <param name="position"> /// A <see cref="long" /> value specify at what position to /// read the object. /// </param> /// <exception cref="ArgumentNullException"> /// <paramref name="file" /> is <see langword="null" />. /// </exception> /// <exception cref="ArgumentOutOfRangeException"> /// <paramref name="position" /> is less than zero or greater /// than the size of the file. /// </exception> /// <exception cref="CorruptFileException"> /// The object read from disk does not have the correct GUID /// or smaller than the minimum size. /// </exception> public StreamPropertiesObject(File file, long position) : base(file, position) { if (!Guid.Equals(Asf.Guid.AsfStreamPropertiesObject)) { throw new CorruptFileException("Object GUID incorrect."); } if (OriginalSize < 78) { throw new CorruptFileException("Object size too small."); } StreamType = file.ReadGuid(); ErrorCorrectionType = file.ReadGuid(); time_offset = file.ReadQWord(); int type_specific_data_length = (int)file.ReadDWord(); int error_correction_data_length = (int)file.ReadDWord(); Flags = file.ReadWord(); reserved = file.ReadDWord(); TypeSpecificData = file.ReadBlock(type_specific_data_length); ErrorCorrectionData = file.ReadBlock(error_correction_data_length); }
/// <summary> /// Constructs and initializes a new instance of <see /// cref="HeaderExtensionObject" /> by reading the contents /// from a specified position in a specified file. /// </summary> /// <param name="file"> /// A <see cref="Asf.File" /> object containing the file from /// which the contents of the new instance are to be read. /// </param> /// <param name="position"> /// A <see cref="long" /> value specify at what position to /// read the object. /// </param> /// <exception cref="ArgumentNullException"> /// <paramref name="file" /> is <see langword="null" />. /// </exception> /// <exception cref="ArgumentOutOfRangeException"> /// <paramref name="position" /> is less than zero or greater /// than the size of the file. /// </exception> /// <exception cref="CorruptFileException"> /// The object read from disk does not have the correct GUID /// or contents. /// </exception> public HeaderExtensionObject(File file, long position) : base(file, position) { if (!Guid.Equals(Asf.Guid.AsfHeaderExtensionObject)) { throw new CorruptFileException("Object GUID incorrect."); } if (file.ReadGuid() != Asf.Guid.AsfReserved1) { throw new CorruptFileException("Reserved1 GUID expected."); } if (file.ReadWord() != 6) { throw new CorruptFileException("Invalid reserved WORD. Expected '6'."); } uint size_remaining = file.ReadDWord(); position += 0x170 / 8; while (size_remaining > 0) { Object obj = file.ReadObject(position); position += (long)obj.OriginalSize; size_remaining -= (uint)obj.OriginalSize; children.Add(obj); } }
/// <summary> /// Populates the current instance by reading in the contents /// from a file. /// </summary> /// <param name="file"> /// A <see cref="Asf.File" /> object to read the raw ASF /// Content Descriptor from. /// </param> /// <returns> /// <see langword="true" /> if the data was read correctly. /// Otherwise <see langword="false" />. /// </returns> protected bool Parse(File file) { int name_count = file.ReadWord(); Name = file.ReadUnicode(name_count); Type = (DataType)file.ReadWord(); int value_count = file.ReadWord(); switch (Type) { case DataType.Word: longValue = file.ReadWord(); break; case DataType.Bool: longValue = file.ReadDWord(); break; case DataType.DWord: longValue = file.ReadDWord(); break; case DataType.QWord: longValue = file.ReadQWord(); break; case DataType.Unicode: strValue = file.ReadUnicode(value_count); break; case DataType.Bytes: byteValue = file.ReadBlock(value_count); break; default: return(false); } return(true); }
/// <summary> /// Constructs and initializes a new instance of <see /// cref="ExtendedContentDescriptionObject" /> by reading the /// contents from a specified position in a specified file. /// </summary> /// <param name="file"> /// A <see cref="Asf.File" /> object containing the file from /// which the contents of the new instance are to be read. /// </param> /// <param name="position"> /// A <see cref="long" /> value specify at what position to /// read the object. /// </param> /// <exception cref="ArgumentNullException"> /// <paramref name="file" /> is <see langword="null" />. /// </exception> /// <exception cref="ArgumentOutOfRangeException"> /// <paramref name="position" /> is less than zero or greater /// than the size of the file. /// </exception> /// <exception cref="CorruptFileException"> /// The object read from disk does not have the correct GUID /// or smaller than the minimum size. /// </exception> public ExtendedContentDescriptionObject(File file, long position) : base(file, position) { if (!Guid.Equals(Asf.Guid.AsfExtendedContentDescriptionObject)) { throw new CorruptFileException("Object GUID incorrect."); } if (OriginalSize < 26) { throw new CorruptFileException("Object size too small."); } ushort count = file.ReadWord(); for (ushort i = 0; i < count; i++) { AddDescriptor(new ContentDescriptor(file)); } }
/// <summary> /// Constructs and initializes a new instance of <see /// cref="MetadataLibraryObject" /> by reading the contents /// from a specified position in a specified file. /// </summary> /// <param name="file"> /// A <see cref="Asf.File" /> object containing the file from /// which the contents of the new instance are to be read. /// </param> /// <param name="position"> /// A <see cref="long" /> value specify at what position to /// read the object. /// </param> /// <exception cref="ArgumentNullException"> /// <paramref name="file" /> is <see langword="null" />. /// </exception> /// <exception cref="ArgumentOutOfRangeException"> /// <paramref name="position" /> is less than zero or greater /// than the size of the file. /// </exception> /// <exception cref="CorruptFileException"> /// The object read from disk does not have the correct GUID /// or smaller than the minimum size. /// </exception> public MetadataLibraryObject(File file, long position) : base(file, position) { if (!Guid.Equals(Asf.Guid.AsfMetadataLibraryObject)) { throw new CorruptFileException("Object GUID incorrect."); } if (OriginalSize < 26) { throw new CorruptFileException("Object size too small."); } ushort count = file.ReadWord(); for (ushort i = 0; i < count; i++) { var rec = new DescriptionRecord(file); AddRecord(rec); } }