Exemplo n.º 1
0
        /// <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");
            }
        }
Exemplo n.º 2
0
 /// <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);
 }
Exemplo n.º 3
0
 /// <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);
 }
Exemplo n.º 4
0
 /// <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));
 }
Exemplo n.º 5
0
 /// <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));
 }
Exemplo n.º 6
0
        /// <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");
            }
        }