예제 #1
0
        internal CompoundDocument(Stream stream, FileHeader header)
        {
            this.FileStorage = stream;
            this.Reader = new BinaryReader(this.FileStorage);

            // added this "if" to prevent exception when file is read only
            if( this.FileStorage.CanWrite )
                this.Writer = new BinaryWriter(this.FileStorage, Encoding.Unicode);

            this.Header = header;
            this.SectorSize = (int)Math.Pow(2, Header.SectorSizeInPot);

            // prevent errors by limiting sector size to a most used value of 2^9
            // compare it to zero because this integer can overflow
            if (this.SectorSize < 0)
                this.SectorSize = 512;

            this.ShortSectorSize = (int)Math.Pow(2, Header.ShortSectorSizeInPot);

            // prevent errors by limiting sector size to a most used value of 2^6
            // compare it to zero because this integer can overflow
            if (this.ShortSectorSize < 0)
                this.ShortSectorSize = 64;

            this.TotalSectors = stream.Length == 0 ? 0
                : (int)(stream.Length - 512) / this.SectorSize;

            this.MasterSectorAllocation = new MasterSectorAllocation(this);
            this.SectorAllocation = new SectorAllocation(this);
            this.ShortSectorAllocation = new ShortSectorAllocation(this);
        }
예제 #2
0
        private byte[] GetShortStreamDataAsBytes(int StartSSID)
        {
            List <int>  chain = ShortSectorAllocation.GetSIDChain(StartSSID);
            List <byte> data  = new List <byte>();

            foreach (int sid in chain)
            {
                data.AddRange(ReadShortSectorDataAsBytes(sid));
            }
            return(data.ToArray());
        }
예제 #3
0
 internal CompoundDocument(Stream stream, FileHeader header)
 {
     this.FileStorage = stream;
     this.Reader      = new BinaryReader(this.FileStorage);
     this.Writer      = new BinaryWriter(this.FileStorage, Encoding.Unicode);
     this.Header      = header;
     checked
     {
         this.SectorSize             = (int)Math.Pow(2.0, (double)this.Header.SectorSizeInPot);
         this.ShortSectorSize        = (int)Math.Pow(2.0, (double)this.Header.ShortSectorSizeInPot);
         this.TotalSectors           = ((stream.Length == 0L) ? 0 : ((int)(stream.Length - 512L) / this.SectorSize));
         this.MasterSectorAllocation = new MasterSectorAllocation(this);
         this.SectorAllocation       = new SectorAllocation(this);
         this.ShortSectorAllocation  = new ShortSectorAllocation(this);
     }
 }
예제 #4
0
        internal CompoundDocument(Stream stream, FileHeader header)
        {
            this.FileStorage = stream;
            this.Reader = new BinaryReader(this.FileStorage);
            this.Writer = new BinaryWriter(this.FileStorage, Encoding.Unicode);

            this.Header = header;
            this.SectorSize = (int)Math.Pow(2, Header.SectorSizeInPot);
            this.ShortSectorSize = (int)Math.Pow(2, Header.ShortSectorSizeInPot);
            this.TotalSectors = stream.Length == 0 ? 0
                : (int)(stream.Length - 512) / this.SectorSize;

            this.MasterSectorAllocation = new MasterSectorAllocation(this);
            this.SectorAllocation = new SectorAllocation(this);
            this.ShortSectorAllocation = new ShortSectorAllocation(this);
        }
예제 #5
0
        internal void WriteShortStreamData(int startSID, byte[] data)
        {
            int prev_sid = SID.EOC;
            int sid      = startSID;
            int index    = 0;

            while (index < data.Length)
            {
                if (sid == SID.EOC)
                {
                    if (prev_sid == SID.EOC)
                    {
                        sid = this.ShortSectorAllocation.AllocateSector();
                    }
                    else
                    {
                        sid = this.ShortSectorAllocation.AllocateSectorAfter(prev_sid);
                    }
                }
                int offset = GetShortSectorOffset(sid);
                ShortStreamContainer.Position = offset;
                if (index + ShortSectorSize < data.Length)
                {
                    ShortStreamContainer.Write(data, index, ShortSectorSize);
                }
                else
                {
                    ShortStreamContainer.Write(data, index, data.Length - index);
                }
                index   += ShortSectorSize;
                prev_sid = sid;
                sid      = this.ShortSectorAllocation.GetNextSectorID(prev_sid);
            }
            if (sid != SID.EOC && prev_sid != SID.EOC)
            {
                ShortSectorAllocation.LinkSectorID(prev_sid, SID.EOC);
                while (sid != SID.EOC)
                {
                    int next_sid = ShortSectorAllocation.GetNextSectorID(sid);
                    ShortSectorAllocation.LinkSectorID(sid, SID.Free);
                    sid = next_sid;
                }
            }
        }
예제 #6
0
        internal CompoundDocument(Stream stream, FileHeader header)
        {
            this.FileStorage = stream;
            this.Reader      = new BinaryReader(this.FileStorage);
            if (stream.CanWrite)
            {
                this.Writer = new BinaryWriter(this.FileStorage, Encoding.Unicode);
            }

            this.Header          = header;
            this.SectorSize      = (int)Math.Pow(2, Header.SectorSizeInPot);
            this.ShortSectorSize = (int)Math.Pow(2, Header.ShortSectorSizeInPot);
            this.TotalSectors    = stream.Length == 0 ? 0
                : (int)(stream.Length - 512) / this.SectorSize;

            this.MasterSectorAllocation = new MasterSectorAllocation(this);
            this.SectorAllocation       = new SectorAllocation(this);
            this.ShortSectorAllocation  = new ShortSectorAllocation(this);
        }
예제 #7
0
        internal CompoundDocument(Stream stream, FileHeader header)
        {
            this.FileStorage = stream;
            this.Reader      = new BinaryReader(this.FileStorage);
            try
            {
                this.Writer = new BinaryWriter(this.FileStorage, Encoding.Unicode);
            }
            catch (Exception StreamNotReadable)
            {
                Console.Write("stream not readable");
            }

            this.Header          = header;
            this.SectorSize      = (int)Math.Pow(2, Header.SectorSizeInPot);
            this.ShortSectorSize = (int)Math.Pow(2, Header.ShortSectorSizeInPot);
            this.TotalSectors    = stream.Length == 0 ? 0
                : (int)(stream.Length - 512) / this.SectorSize;

            this.MasterSectorAllocation = new MasterSectorAllocation(this);
            this.SectorAllocation       = new SectorAllocation(this);
            this.ShortSectorAllocation  = new ShortSectorAllocation(this);
        }