Пример #1
0
        public PalmFile(Stream stream, bool leaveOpen = false)
        {
            EndiannessAwareBinaryReader r = null;
            var baseDate = new DateTime(1904, 1, 1);

            try
            {
                r = new EndiannessAwareBinaryReader(stream, EndiannessAwareBinaryReader.Endianness.Big);

                Name             = new string(r.ReadChars(32));
                Attributes       = r.ReadUInt16();
                Version          = r.ReadUInt16();
                CreationDate     = baseDate + new TimeSpan(0, (int)(r.ReadUInt32() / 60), 0);
                ModificationDate = baseDate + new TimeSpan(0, (int)(r.ReadUInt32() / 60), 0);
                LastBackupDate   = baseDate + new TimeSpan(0, (int)(r.ReadUInt32() / 60), 0);

                ModificationNumber = r.ReadUInt32();
                AppInfoID          = r.ReadUInt32();
                SortInfoID         = r.ReadUInt32();

                Type    = new string(r.ReadChars(4));
                Creator = new string(r.ReadChars(4));

                UniqueIDSeed     = r.ReadUInt32();
                NextRecordListID = r.ReadUInt32();

                var numberOfRecords = r.ReadUInt16();
                RecordInfos = new PalmRecordInfo[numberOfRecords];
                Records     = new PalmRecord[numberOfRecords];

                for (var i = 0; i < numberOfRecords; i++)
                {
                    RecordInfos[i].DataOffset = r.ReadUInt32();

                    var info = r.ReadBytes(4);
                    RecordInfos[i].Attributes = info[0];
                    info[0] = 0;
                    RecordInfos[i].UniqueID = BytesToUint(info);
                }

                r.ReadUInt16(); // Unknown value

                for (var i = 0; i < numberOfRecords; i++)
                {
                    var start  = RecordInfos[i].DataOffset;
                    var end    = i < numberOfRecords - 1 ? RecordInfos[i + 1].DataOffset : r.BaseStream.Length;
                    var length = ((int)(end - start));
                    Records[i].Data = r.ReadBytes(length);
                }

                var header = new EndiannessAwareBinaryReader(new MemoryStream(Records[0].Data), EndiannessAwareBinaryReader.Endianness.Big);

                Compression = header.ReadUInt16();
                header.ReadUInt16(); // Unknown value
                TextLength      = header.ReadUInt32();
                TextRecordCount = header.ReadUInt16();
                TextRecordSize  = header.ReadUInt16();
                CurrentPosition = header.ReadUInt16();
            }
            finally
            {
                if (!leaveOpen)
                {
                    r?.Close();
                    r?.Dispose();
                    stream?.Close();
                    stream?.Dispose();
                }
            }
        }