/// <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"); } }
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); }
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; }