/// <summary> /// Function to determine if this codec can read the font data within the stream or not. /// </summary> /// <param name="stream">The stream that is used to read the font data.</param> /// <returns><b>true</b> if the codec can read the file, <b>false</b> if not.</returns> /// <exception cref="ArgumentNullException">Thrown when the <paramref name="stream"/> parameter is <b>null</b>.</exception> /// <exception cref="IOException">Thrown when the <paramref name="stream"/> is write-only or if the stream cannot perform seek operations.</exception> /// <exception cref="EndOfStreamException">Thrown when an attempt to read beyond the end of the stream is made.</exception> /// <remarks> /// <para> /// Implementors should ensure that the stream position is restored prior to exiting this method. Failure to do so may cause problems when reading the data from the stream. /// </para> /// </remarks> public override bool IsReadable(Stream stream) { ulong fileHeaderID = FileHeader.ChunkID(); if (stream == null) { throw new ArgumentNullException(nameof(stream)); } if (!stream.CanRead) { throw new IOException(Resources.GORGFX_ERR_STREAM_WRITE_ONLY); } if (!stream.CanSeek) { throw new IOException(Resources.GORGFX_ERR_STREAM_NO_SEEK); } if (stream.Length - stream.Position < FileHeader.Length) { return(false); } long position = stream.Position; var reader = new GorgonBinaryReader(stream, true); try { ulong fileData = reader.ReadUInt64(); return(fileData == fileHeaderID); } finally { reader.Dispose(); stream.Position = position; } }