Ejemplo n.º 1
0
        /// <summary>
        /// Parses all text record
        /// </summary>
        private IEnumerable <MobipocketRecord> ParseTextMobipocketRecords()
        {
            int bytesUsed = 0;

            var parser = new TrailingEntryParser(Header.TrailingEntries);
            int previousOverlapSize = 0;

            //skip first record as header, and process all text records
            for (int recordIndex = 0; recordIndex < Header.TextRecordCount; recordIndex++)
            {
                //get current record
                var record = _pdb.Records[recordIndex + 1];

                //read record
                var mobiRecord = MobipocketRecord.FromBinary(record.Data, true, parser);

                //uncompress text
                mobiRecord.Text = GetRecordText(mobiRecord, previousOverlapSize, ref bytesUsed);

                //yield record
                yield return(mobiRecord);

                //save trailing entries
                previousOverlapSize = mobiRecord.TrailingEntries.IsMultibyteCharacterOverlapping ?
                                      mobiRecord.TrailingEntries.MultibyteCharacterOverlap.Length : 0;
            }

            if (bytesUsed != Header.TotalTextLength)
            {
                throw new Exception("text length doesn't match used characters");
            }
        }
Ejemplo n.º 2
0
        public static MobipocketRecord FromBinary(byte[] data, bool isTextRecord, TrailingEntryParser parser)
        {
            if (data == null)
            {
                throw new ArgumentNullException("data");
            }

            if (isTextRecord && parser == null)
            {
                throw new ArgumentException("parser cannot be null if isTextRecord is true");
            }

            var record = new MobipocketRecord {
                Data = data, IsTextRecord = isTextRecord
            };

            if (isTextRecord)
            {
                try
                {
                    record.TrailingEntries = parser.Parse(data);
                }
                catch (Exception e)
                {
                    throw new Exception("cannot parse trailing entries for record", e);
                }
            }

            return(record);
        }
Ejemplo n.º 3
0
        public static MobipocketRecord FromBinary(byte[] data, bool isTextRecord, TrailingEntryParser parser)
        {
            if (data == null)
                throw new ArgumentNullException("data");

            if (isTextRecord && parser == null)
                throw new ArgumentException("parser cannot be null if isTextRecord is true");

            var record = new MobipocketRecord { Data = data, IsTextRecord = isTextRecord };

            if (isTextRecord)
            {
                try
                {
                    record.TrailingEntries = parser.Parse(data);
                }
                catch (Exception e)
                {
                    throw new Exception("cannot parse trailing entries for record", e);
                }
            }

            return record;
        }