/// <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> /// Constructs and initializes a new instance of <see /// cref="FilePropertiesObject" /> 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 FilePropertiesObject(File file, long position) : base(file, position) { if (!Guid.Equals(Asf.Guid.AsfFilePropertiesObject)) { throw new CorruptFileException("Object GUID incorrect."); } if (OriginalSize < 104) { throw new CorruptFileException("Object size too small."); } file_id = file.ReadGuid(); FileSize = file.ReadQWord(); creation_date = file.ReadQWord(); DataPacketsCount = file.ReadQWord(); play_duration = file.ReadQWord(); send_duration = file.ReadQWord(); Preroll = file.ReadQWord(); Flags = file.ReadDWord(); MinimumDataPacketSize = file.ReadDWord(); MaximumDataPacketSize = file.ReadDWord(); MaximumBitrate = file.ReadDWord(); }
/// <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="Object" /> 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> protected Object(File file, long position) { if (file == null) { throw new ArgumentNullException(nameof(file)); } if (position < 0 || position > file.Length - 24) { throw new ArgumentOutOfRangeException(nameof(position)); } file.Seek(position); id = file.ReadGuid(); OriginalSize = file.ReadQWord(); }