Ejemplo n.º 1
0
        public TitleReader GetTitleReader()
        {
            MobiHeader mobi = Read();

            SetPositionToOffset(mobi.FullnameOffset);

            return(new TitleReader(_reader, mobi.FullnameLength));
        }
Ejemplo n.º 2
0
        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));
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 5
0
        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)
 {
 }
Ejemplo n.º 8
0
        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;
        }
Ejemplo n.º 9
0
 private int FindFirstTextRecordIndex(MobiHeader mobiHeader)
 {
     return(mobiHeader.FirstContentRecordOffset > 0 ? mobiHeader.FirstContentRecordOffset : 1);
 }
Ejemplo n.º 10
0
        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);
        }
Ejemplo n.º 11
0
 public Azw3File(string path)
     : base(path)
 {
     MobiHeader = new MobiHeader(GetSectionData(0));
 }