public TitleReader GetTitleReader() { MobiHeader mobi = Read(); SetPositionToOffset(mobi.FullnameOffset); return(new TitleReader(_reader, mobi.FullnameLength)); }
public ExthHeaderReader GetExthHeaderReader() { MobiHeader mobi = Read(); if (!mobi.ExthExists) { return(null); } long newpos = _originalPosition + (long)mobi.HeaderLength + PALM_DOC_HEADER_LENGTH; _reader.BaseStream.Position = newpos; return(new ExthHeaderReader(_reader)); }
private long FindFirstNonTextRecordIndex(MobiHeader mobiHeader) { long result; if (mobiHeader.FirstNonBookIndex != MobiHeaderEngine.UnavailableIndex && mobiHeader.FirstNonBookIndex < this._palmDBRecordList.Count) { result = mobiHeader.FirstNonBookIndex; } else { result = Math.Min(mobiHeader.LastContentRecordOffset, mobiHeader.INDXRecordOffset); result = Math.Min(result, mobiHeader.FLISRecordOffset); result = Math.Min(result, mobiHeader.FCISRecordOffset); result = Math.Min(result, this._palmDBRecordList.Count); } return(result); }
public static bool TryRead(Stream stream, long offset, out MobiHeader mobiHeader) { bool result = false; mobiHeader = null; stream.Seek(offset, SeekOrigin.Begin); if (stream.CheckStart(4, Identifier)) { mobiHeader = Read(stream, offset); result = true; } if (!result) { stream.Seek(offset, SeekOrigin.Begin); } return(result); }
private HuffCdicCompression CreateHuffCdicCompression(MobiHeader mobiHeader) { HuffCdicCompression result = null; if (mobiHeader.HuffmanRecordOffset != MobiHeaderEngine.UnavailableIndex && mobiHeader.HuffmanRecordOffset < this._palmDBRecordList.Count) { var huff = this.ReadPalmDBRecord(this._palmDBRecordList[(int)mobiHeader.HuffmanRecordOffset]); var cdicList = new List <byte[]>(); for (int i = 1; i < mobiHeader.HuffmanRecordCount; i++) { var recordBytes = this.ReadPalmDBRecord(this._palmDBRecordList[(int)mobiHeader.HuffmanRecordOffset + i]); cdicList.Add(recordBytes); } result = new HuffCdicCompression(huff, cdicList) { ExtraFlags = mobiHeader.ExtraRecordDataFlags }; } return(result); }
public static MobiHeader Read(Stream stream, long offset) { MobiHeader result = new MobiHeader(); stream.Seek(offset, SeekOrigin.Begin); if (stream.TryReadString(4, out string identifier)) { result.Identifier = identifier; } if (stream.TryReadUint(out uint length)) { result.Length = length; } if (stream.TryReadUint(out uint mobiType)) { result.MobiType = (MobiType)mobiType; } if (stream.TryReadUint(out uint textEncoding)) { result.TextEncoding = (TextEncoding)textEncoding; } if (stream.TryReadUint(out uint uniqueId)) { result.UniqueId = uniqueId; } if (stream.TryReadUint(out uint fileVersion)) { result.FileVersion = fileVersion; } if (stream.TryReadUint(out uint ortographicIndex)) { result.OrtographicIndex = ortographicIndex; } if (stream.TryReadUint(out uint inflectionIndex)) { result.InflectionIndex = inflectionIndex; } if (stream.TryReadUint(out uint indexNames)) { result.IndexNames = indexNames; } if (stream.TryReadUint(out uint indexKeys)) { result.IndexKeys = indexKeys; } if (stream.TryReadUint(out uint extraIndex0)) { result.ExtraIndex0 = extraIndex0; } if (stream.TryReadUint(out uint extraIndex1)) { result.ExtraIndex1 = extraIndex1; } if (stream.TryReadUint(out uint extraIndex2)) { result.ExtraIndex2 = extraIndex2; } if (stream.TryReadUint(out uint extraIndex3)) { result.ExtraIndex3 = extraIndex3; } if (stream.TryReadUint(out uint extraIndex4)) { result.ExtraIndex4 = extraIndex4; } if (stream.TryReadUint(out uint extraIndex5)) { result.ExtraIndex5 = extraIndex5; } if (stream.TryReadUint(out uint firstNonBookIndex)) { result.FirstNonBookIndex = firstNonBookIndex; } if (stream.TryReadUint(out uint fullNameOffset)) { result.FullNameOffset = fullNameOffset; } if (stream.TryReadUint(out uint fullNameLength)) { result.FullNameLength = fullNameLength; } if (stream.TryReadUint(out uint locale)) { result.Locale = locale; } if (stream.TryReadString(4, out string inputLanguage)) { result.InputLanguage = inputLanguage; } if (stream.TryReadString(4, out string outputLanguage)) { result.OutputLanguage = outputLanguage; } if (stream.TryReadUint(out uint minVersion)) { result.MinVersion = minVersion; } if (stream.TryReadUint(out uint firstImageIndex)) { result.FirstImageIndex = firstImageIndex; } if (stream.TryReadUint(out uint huffmanRecordOffset)) { result.HuffmanRecordOffset = huffmanRecordOffset; } if (stream.TryReadUint(out uint huffmanRecordCount)) { result.HuffmanRecordCount = huffmanRecordCount; } if (stream.TryReadUint(out uint huffmanTableOffset)) { result.HuffmanTableOffset = huffmanTableOffset; } if (stream.TryReadUint(out uint huffmanTableLength)) { result.HuffmanTableLength = huffmanTableLength; } if (stream.TryReadUint(out uint exthFlags)) { result.EXTHFlags = exthFlags; } stream.Seek(32 + 4, SeekOrigin.Current); //skip 32 unknown bytes and 0xFFFFFFFF. if (stream.TryReadUint(out uint drmOffset)) { result.DRMOffset = drmOffset; } if (stream.TryReadUint(out uint drmCount)) { result.DRMCount = drmCount; } if (stream.TryReadUint(out uint drmSize)) { result.DRMSize = drmSize; } if (stream.TryReadUint(out uint drmFlags)) { result.DRMFlags = drmFlags; } stream.Seek(8, SeekOrigin.Current); //skip 8 bytes, Bytes to the end of the MOBI header, including the following if the header length >= 228 (244 from start of record). Use 0x0000000000000000. if (stream.TryReadUshort(out ushort firstContentRecordOffset)) { result.FirstContentRecordOffset = firstContentRecordOffset; } if (stream.TryReadUshort(out ushort lastContentRecordOffset)) { result.LastContentRecordOffset = lastContentRecordOffset; } stream.Seek(4, SeekOrigin.Current); //skip 4 bytes, 0x00000001. if (stream.TryReadUint(out uint fcisRecordOffset)) { result.FCISRecordOffset = fcisRecordOffset; } stream.Seek(4, SeekOrigin.Current); //skip 4 bytes, 0x00000001. if (stream.TryReadUint(out uint flisRecordOffset)) { result.FLISRecordOffset = flisRecordOffset; } stream.Seek(28, SeekOrigin.Current); //skip 0x00000001, 0x0000000000000000, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, if (stream.TryReadUint(out uint extraRecordDataFlags)) { result.ExtraRecordDataFlags = extraRecordDataFlags; } if (stream.TryReadUint(out uint iNDXRecordOffset)) { result.INDXRecordOffset = iNDXRecordOffset; } stream.Seek(offset + length, SeekOrigin.Begin); //skip to end. return(result); }
public static void Write(MobiHeader file, Stream stream) { }
public MobiHeader Read() { SetPositionToOriginal(); //long recordStart = _reader.BaseStream.Position; int compression = ReadInt16(_reader); int unused = ReadInt16(_reader); int textLength = ReadInt32(_reader); int recordCount = ReadInt16(_reader); int recordSize = ReadInt16(_reader); // always 4096 int encType = ReadInt16(_reader); int unused2 = ReadInt16(_reader); //Console.WriteLine("PalmDoc compression={0};", compression); string identifier = ReadString(_reader, 4); // = MOBI int headerLength = ReadInt32(_reader); int mobiType = ReadInt32(_reader); // 2 = Mobipocket Book int encoding = ReadInt32(_reader); // 1252 = CP1252 (WinLatin1); 65001 = UTF-8 int unique = ReadInt32(_reader); int fileVersion = ReadInt32(_reader); int ortographicIndex = ReadInt32(_reader); int inflectionIndex = ReadInt32(_reader); int indexNames = ReadInt32(_reader); int indexKeys = ReadInt32(_reader); int index0 = ReadInt32(_reader); int index1 = ReadInt32(_reader); int index2 = ReadInt32(_reader); int index3 = ReadInt32(_reader); int index4 = ReadInt32(_reader); int index5 = ReadInt32(_reader); int firstNonBookIndex = ReadInt32(_reader); int fullNameOffset = ReadInt32(_reader); int fullNameLength = ReadInt32(_reader); int locale = ReadInt32(_reader); // Low byte is main language 09= English, next byte is dialect, 08 = British, 04 = US. Thus US English is 1033, UK English is 2057. int inputLang = ReadInt32(_reader); int outputLang = ReadInt32(_reader); int minVersion = ReadInt32(_reader); int firstImageIndex = ReadInt32(_reader); int huffmandRecordOffset = ReadInt32(_reader); int huffmanRecordCount = ReadInt32(_reader); int huffmanTableOffset = ReadInt32(_reader); int huffmanTableLength = ReadInt32(_reader); int exthFlags = ReadInt32(_reader); _reader.ReadBytes(32); int drm1 = ReadInt32(_reader); int drm2 = ReadInt32(_reader); int drm3 = ReadInt32(_reader); int drm4 = ReadInt32(_reader); byte[] toend = _reader.ReadBytes(8); bool exthExists = (exthFlags & 64) == 64; //Console.WriteLine("MobiHdr identifier={0}, headerLength={1}, mobiType={2}, encoding={3}, exthExists={4};", identifier, headerLength, mobiType, encoding, exthExists); var header = new MobiHeader { Encoding = encoding, ExthExists = exthExists, HeaderLength = headerLength, Identifier = identifier, MobiType = mobiType, FirstImageIndex = firstImageIndex, FullnameLength = fullNameLength, FullnameOffset = fullNameOffset }; return header; }
private int FindFirstTextRecordIndex(MobiHeader mobiHeader) { return(mobiHeader.FirstContentRecordOffset > 0 ? mobiHeader.FirstContentRecordOffset : 1); }
public MobiHeader Read() { SetPositionToOriginal(); //long recordStart = _reader.BaseStream.Position; int compression = ReadInt16(_reader); int unused = ReadInt16(_reader); int textLength = ReadInt32(_reader); int recordCount = ReadInt16(_reader); int recordSize = ReadInt16(_reader); // always 4096 int encType = ReadInt16(_reader); int unused2 = ReadInt16(_reader); //Console.WriteLine("PalmDoc compression={0};", compression); string identifier = ReadString(_reader, 4); // = MOBI int headerLength = ReadInt32(_reader); int mobiType = ReadInt32(_reader); // 2 = Mobipocket Book int encoding = ReadInt32(_reader); // 1252 = CP1252 (WinLatin1); 65001 = UTF-8 int unique = ReadInt32(_reader); int fileVersion = ReadInt32(_reader); int ortographicIndex = ReadInt32(_reader); int inflectionIndex = ReadInt32(_reader); int indexNames = ReadInt32(_reader); int indexKeys = ReadInt32(_reader); int index0 = ReadInt32(_reader); int index1 = ReadInt32(_reader); int index2 = ReadInt32(_reader); int index3 = ReadInt32(_reader); int index4 = ReadInt32(_reader); int index5 = ReadInt32(_reader); int firstNonBookIndex = ReadInt32(_reader); int fullNameOffset = ReadInt32(_reader); int fullNameLength = ReadInt32(_reader); int locale = ReadInt32(_reader); // Low byte is main language 09= English, next byte is dialect, 08 = British, 04 = US. Thus US English is 1033, UK English is 2057. int inputLang = ReadInt32(_reader); int outputLang = ReadInt32(_reader); int minVersion = ReadInt32(_reader); int firstImageIndex = ReadInt32(_reader); int huffmandRecordOffset = ReadInt32(_reader); int huffmanRecordCount = ReadInt32(_reader); int huffmanTableOffset = ReadInt32(_reader); int huffmanTableLength = ReadInt32(_reader); int exthFlags = ReadInt32(_reader); _reader.ReadBytes(32); int drm1 = ReadInt32(_reader); int drm2 = ReadInt32(_reader); int drm3 = ReadInt32(_reader); int drm4 = ReadInt32(_reader); byte[] toend = _reader.ReadBytes(8); bool exthExists = (exthFlags & 64) == 64; //Console.WriteLine("MobiHdr identifier={0}, headerLength={1}, mobiType={2}, encoding={3}, exthExists={4};", identifier, headerLength, mobiType, encoding, exthExists); var header = new MobiHeader { Encoding = encoding, ExthExists = exthExists, HeaderLength = headerLength, Identifier = identifier, MobiType = mobiType, FirstImageIndex = firstImageIndex, FullnameLength = fullNameLength, FullnameOffset = fullNameOffset }; return(header); }
public Azw3File(string path) : base(path) { MobiHeader = new MobiHeader(GetSectionData(0)); }