Beispiel #1
0
 /// <summary>
 /// Writes file payload to the filesystem and mark the sectors as allocated.
 /// </summary>
 /// <param name="data">Data to write to the filesystem.</param>
 /// <param name="extents">Information about extents to write the data to.</param>
 internal void WriteFileData(byte[] data, DragonDosDirectoryEntry.Extent[] extents)
 {
     int dataOffset = 0;
     foreach (var extent in extents)
     {
         int lsn = extent.Lsn;
         int sectorCnt = extent.Length;
         while (sectorCnt-- > 0)
         {
             int length = Math.Min(SectorSize, data.Length - dataOffset);
             WriteSector(lsn, data, dataOffset, length);
             SetSectorAllocated(lsn++, true);
             dataOffset += length;
         }
     }
 }
Beispiel #2
0
        /// <summary>
        /// Create a set of directory entries for a file.
        /// </summary>
        /// <param name="filename">Filename</param>
        /// <param name="extents">Ordered list of extents containing the file payload data.</param>
        /// <param name="dirInx">Orderes list of directory entry indexes to use.</param>
        /// <returns>Orderes list of directory entries</returns>
        private DragonDosDirectoryEntry[] CreateDirectoryEntries(string filename, DragonDosDirectoryEntry.Extent[] extents, int[] dirInx, int lastSectorSize)
        {
            var dirEntries = new DragonDosDirectoryEntry[dirInx.Length];

            int maxExtents;
            int extentOffset = 0;
            for (int i = 0; i < dirInx.Length; i++ )
            {
                var dir = new DragonDosDirectoryEntry() {Flags = 0};
                if (i == 0)
                {
                    dir.Filename = filename;
                    dir.IsExtensionEntry = false;
                    maxExtents = 4;
                }
                else
                {
                    dir.IsExtensionEntry = true;
                    maxExtents = 7;
                }

                if (i == dirInx.Length-1)
                {
                    dir.LastSectorSize = lastSectorSize;
                }
                else
                {
                    dir.NextEntry = dirInx[i + 1];
                }

                dir.Extents = new DragonDosDirectoryEntry.Extent[Math.Min(maxExtents, extents.Length - extentOffset)];
                Array.Copy(extents, extentOffset, dir.Extents, 0, dir.Extents.Length);
                extentOffset += dir.Extents.Length;

                dirEntries[i] = dir;
            }

            return dirEntries;
        }
Beispiel #3
0
 /// <summary>
 /// Sets the directory entry at a given index.
 /// </summary>
 /// <param name="index"></param>
 /// <param name="entry"></param>
 private void SetDirectoryEntry(int index, DragonDosDirectoryEntry entry)
 {
     int sector = index / DirectoryEntryCount + DirectoryEntryOffset;
     int offset = index % DirectoryEntryCount * DirectoryEntrySize;
     entry.Encode(directoryTrack[sector], offset);
 }