Exemple #1
0
        private FileBackedDiskPack(DiskGeometry geometry, string path, bool load)
        {
            _packName = path;
            _geometry = geometry;

            if (load)
            {
                //
                // Attempt to open an existing stream for read/write access.
                //
                _diskStream = new FileStream(path, FileMode.Open, FileAccess.ReadWrite);

                //
                // Quick sanity check that the disk image is the right size.
                //
                if (_diskStream.Length != geometry.GetDiskSizeBytes())
                {
                    _diskStream.Close();
                    _diskStream = null;
                    throw new InvalidOperationException("Image size is invalid.");
                }
            }
            else
            {
                //
                // Attempt to initialize a new stream with read/write access.
                //
                _diskStream = new FileStream(path, FileMode.Create, FileAccess.ReadWrite);

                //
                // And set the size of the stream.
                //
                _diskStream.SetLength(geometry.GetDiskSizeBytes());
            }
        }
Exemple #2
0
 public DiabloPack(DiabloDiskType type)
 {
     _diskType = type;
     _packName = null;
     _geometry = new DiskGeometry(type == DiabloDiskType.Diablo31 ? 203 : 406, 2, 12);
     _sectors  = new DiabloDiskSector[_geometry.Cylinders, _geometry.Tracks, _geometry.Sectors];
 }
Exemple #3
0
        public void NewPack(string path, DiskGeometry geometry)
        {
            if (_pack != null)
            {
                UpdateTrackCache();
                _pack.Dispose();
            }

            _pack = FileBackedDiskPack.CreateEmpty(geometry, path);
            Reset();
        }
Exemple #4
0
        private InMemoryDiskPack(DiskGeometry geometry, string path, bool load)
        {
            _packName = path;
            _geometry = geometry;
            _sectors  = new DiskSector[_geometry.Cylinders, _geometry.Heads, _geometry.Sectors];

            if (load)
            {
                //
                // Attempt to load in the specified image file.
                //
                using (FileStream imageStream = new FileStream(_packName, FileMode.Open, FileAccess.Read))
                {
                    try
                    {
                        for (int cylinder = 0; cylinder < _geometry.Cylinders; cylinder++)
                        {
                            for (int head = 0; head < _geometry.Heads; head++)
                            {
                                for (int sector = 0; sector < _geometry.Sectors; sector++)
                                {
                                    _sectors[cylinder, head, sector] = new DiskSector(_geometry.SectorGeometry, imageStream, cylinder, head, sector);
                                }
                            }
                        }

                        if (imageStream.Position != imageStream.Length)
                        {
                            throw new InvalidOperationException("Extra data at end of image file.");
                        }
                    }
                    finally
                    {
                        imageStream.Close();
                    }
                }
            }
            else
            {
                //
                // Just initialize a new, empty disk.
                //
                for (int cylinder = 0; cylinder < _geometry.Cylinders; cylinder++)
                {
                    for (int head = 0; head < _geometry.Heads; head++)
                    {
                        for (int sector = 0; sector < _geometry.Sectors; sector++)
                        {
                            _sectors[cylinder, head, sector] = new DiskSector(_geometry.SectorGeometry, cylinder, head, sector);
                        }
                    }
                }
            }
        }
Exemple #5
0
 /// <summary>
 /// Loads an existing image.
 /// </summary>
 /// <param name="geometry"></param>
 /// <param name="path"></param>
 /// <returns></returns>
 public static FileBackedDiskPack Load(DiskGeometry geometry, string path)
 {
     return(new FileBackedDiskPack(geometry, path, true));
 }
Exemple #6
0
 /// <summary>
 /// Creates a new, empty disk pack with the specified geometry.
 /// </summary>
 /// <param name="geometry"></param>
 /// <param name="path"></param>
 public static FileBackedDiskPack CreateEmpty(DiskGeometry geometry, string path)
 {
     return(new FileBackedDiskPack(geometry, path, false));
 }
Exemple #7
0
 /// <summary>
 /// Loads an existing disk pack image.
 /// </summary>
 /// <param name="geometry"></param>
 /// <param name="path"></param>
 /// <returns></returns>
 public static InMemoryDiskPack Load(DiskGeometry geometry, string path)
 {
     return(new InMemoryDiskPack(geometry, path, true));
 }
Exemple #8
0
 /// <summary>
 /// Creates a new, empty disk pack with the specified geometry.
 /// </summary>
 /// <param name="geometry"></param>
 /// <param name="path"></param>
 public static InMemoryDiskPack CreateEmpty(DiskGeometry geometry, string path)
 {
     return(new InMemoryDiskPack(geometry, path, false));
 }