/// <summary> /// Write a sector /// </summary> /// <param name="data">The sector's data to write</param> /// <param name="mode">Sector's mode</param> /// <param name="subHeader">Subheader (if mode XA_FORM1 or XA_FORM2)</param> public void WriteSector(byte[] data, SectorMode mode, XaSubHeader subHeader = null) { try { byte[] buffer = new byte[_sectorSize]; using (var bufferStream = new CBinaryWriter(buffer)) { if (mode != SectorMode.RAW) { bufferStream.Write(SYNC); long position = SectorPosition + 150; byte[] header = new byte[4]; header[3] = (byte)(mode == SectorMode.MODE0 ? 0 : mode == SectorMode.MODE1 ? 1 : 2); header[2] = Converter.DecToBcd((byte)(position % 75)); position /= 75; header[1] = Converter.DecToBcd((byte)(position % 60)); position /= 60; header[0] = Converter.DecToBcd((byte)(position % 60)); bufferStream.Write(header); } if (mode == SectorMode.XA_FORM1 || mode == SectorMode.XA_FORM2) { if (subHeader == null) { subHeader = new XaSubHeader(); } subHeader.IsForm2 = (mode == SectorMode.XA_FORM2); bufferStream.Write(subHeader.File); bufferStream.Write(subHeader.Channel); bufferStream.Write(subHeader.SubMode); bufferStream.Write(subHeader.DataType); // Subheader is written twice bufferStream.Write(subHeader.File); bufferStream.Write(subHeader.Channel); bufferStream.Write(subHeader.SubMode); bufferStream.Write(subHeader.DataType); } bufferStream.Write(data, 0, data.Length); if (mode == SectorMode.MODE1 || mode == SectorMode.XA_FORM1 || mode == SectorMode.XA_FORM2) { EccEdc.EccEdcCompute(buffer, mode); } _stream.Write(buffer); } } catch (Exception) { throw new FrameworkException("Errow while writing sector : unable to write sector"); } }
/// <summary> /// Write a sector at the specified lba /// </summary> /// <param name="lba">Sector's LBA</param> /// <param name="sector">The sector to write</param> /// <param name="subHeader">Subheader (if mode XA_FORM1 or XA_FORM2)</param> public void WriteSector(long lba, byte[] data, XaSubHeader subHeader = null) { SeekSector(lba); WriteSector(data, _defaultSectorMode, subHeader); }
/// <summary> /// Write a sector in default mode /// </summary> /// <param name="data">The sector to write</param> /// <param name="subHeader">Subheader (if mode XA_FORM1 or XA_FORM2)</param> public void WriteSector(byte[] data, XaSubHeader subHeader = null) { WriteSector(data, _defaultSectorMode, subHeader); }
/// <summary> /// Read a sector /// </summary> /// <param name="lba">Sector's LBA to read</param> /// <param name="subHeader">Sub header container to write sub header to</param> public byte[] ReadSector(long lba, out XaSubHeader subHeader) { SeekSector(lba); return(ReadSector(_defaultSectorMode, out subHeader)); }
/// <summary> /// Read a sector's data in defaut sector mode, including sub header /// </summary> /// <param name="subHeader">Sub header container to write sub header to</param> public byte[] ReadSector(out XaSubHeader subHeader) { return(ReadSector(_defaultSectorMode, out subHeader)); }
/// <summary> /// Read a sector's data, including sub header /// </summary> /// <param name="mode">Sector's mode</param> /// <param name="subHeader">Sub header container to write sub header to</param> public byte[] ReadSector(SectorMode mode, out XaSubHeader subHeader) { try { byte[] buffer; subHeader = new XaSubHeader(); int dataSize = GetSectorDataSize(mode); buffer = new byte[dataSize]; if (mode != SectorMode.RAW) { _stream.Position += (SYNC_SIZE + HEADER_SIZE); } if (mode == SectorMode.XA_FORM1 || mode == SectorMode.XA_FORM2) { subHeader.File = _stream.ReadByte(); subHeader.Channel = _stream.ReadByte(); subHeader.SubMode = _stream.ReadByte(); subHeader.DataType = _stream.ReadByte(); _stream.Position += SUBHEADER_SIZE / 2; } _stream.Read(buffer, 0, dataSize); if (mode == SectorMode.MODE1 || mode == SectorMode.XA_FORM1) { _stream.Position += EDC_SIZE; } if (mode == SectorMode.MODE1) { _stream.Position += INTERMEDIATE_SIZE; } if (mode == SectorMode.MODE1 || mode == SectorMode.XA_FORM1) { _stream.Position += ECC_SIZE; } if (mode == SectorMode.XA_FORM2) { _stream.Position += EDC_SIZE; } return(buffer); } catch (FrameworkException ex) { throw ex; } catch (EndOfStreamException) { throw new FrameworkException("Errow while reading sector : end of file occured"); } catch (Exception) { throw new FrameworkException("Errow while reading sector : unable to read sector"); } }