sl@0: // Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: #ifndef __PFSDUMP_H__ sl@0: #define __PFSDUMP_H__ sl@0: sl@0: #ifndef __MSVCDOTNET__ sl@0: #pragma warning(disable: 4710) sl@0: #endif //__MSVCDOTNET__ sl@0: sl@0: int const MajorVersion=1; sl@0: int const MinorVersion=6; sl@0: int const Build=66; sl@0: sl@0: #include sl@0: #include sl@0: #include sl@0: sl@0: #ifdef __MSVCDOTNET__ sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: using namespace std; sl@0: #else //!__MSVCDOTNET__ sl@0: #include sl@0: #include sl@0: #include sl@0: #endif //__MSVCDOTNET__ sl@0: sl@0: char const* const Margin=" "; sl@0: sl@0: template inline T min(T a,T b) {return a inline T max(T a,T b) {return a>b ? a : b;} sl@0: sl@0: class Handle sl@0: { sl@0: enum sl@0: { sl@0: IndexMask=0xffffff, sl@0: GenMask=0xf000000, sl@0: GenShift=24, sl@0: TocBase=0x40000000, sl@0: AvailBit=0x80000000, sl@0: TocDelta=AvailBit sl@0: }; sl@0: public: sl@0: inline Handle() {} sl@0: inline Handle(unsigned aValue) :iValue(aValue) {} sl@0: inline bool IsNull() const {return iValue==0;} sl@0: inline int Avail() const {return iValue&AvailBit;} sl@0: inline int IsDelta() const {return iValue&TocDelta;} sl@0: inline bool IsTocBase() const {return iValue==TocBase;} sl@0: inline int Generation() const {return (iValue&GenMask)>>GenShift;} sl@0: inline int Index() const {return iValue&IndexMask;} sl@0: inline int operator==(Handle aHandle) const {return iValue==aHandle.iValue;} sl@0: inline int operator!=(Handle aHandle) const {return iValue!=aHandle.iValue;} sl@0: private: sl@0: unsigned long iValue; sl@0: // sl@0: friend class StreamId; sl@0: friend ostream& operator<<(ostream&,Handle); sl@0: }; sl@0: sl@0: class StreamId : public Handle sl@0: { sl@0: enum {Mask=0xfffffff}; sl@0: public: sl@0: inline StreamId(Handle aHandle) :Handle(aHandle.iValue&Mask) {} sl@0: }; sl@0: sl@0: class FramePos sl@0: { sl@0: public: sl@0: inline FramePos() {} sl@0: inline FramePos(int aPos) :iValue(aPos) {} sl@0: inline int Pos() const {return iValue;} sl@0: private: sl@0: int iValue; sl@0: // sl@0: friend ostream& operator<<(ostream&,FramePos); sl@0: }; sl@0: sl@0: class FileOffset sl@0: { sl@0: public: sl@0: inline FileOffset(int anOffset) :iValue(anOffset) {} sl@0: inline int Offset() const {return iValue;} sl@0: // offset/pos conversion sl@0: FileOffset(FramePos aPos); sl@0: operator FramePos() const; sl@0: private: sl@0: int iValue; sl@0: // sl@0: friend ostream& operator<<(ostream&,FileOffset); sl@0: }; sl@0: sl@0: class FrameDes sl@0: { sl@0: enum {TypeMask=0xc000,TypeShift=14,LengthMask=0x3fff}; sl@0: public: sl@0: enum {First=0x20,Size=2,Interval=0x4002,FullShift=14}; sl@0: enum {Free=0,Data,Toc,Continuation}; sl@0: // sl@0: inline FrameDes() {} sl@0: inline FrameDes(unsigned aDes) :iDes((unsigned short)aDes) {} sl@0: inline int Type() const {return iDes>>TypeShift;} sl@0: inline int Length() const {return iDes&LengthMask;} sl@0: private: sl@0: unsigned short iDes; sl@0: // sl@0: friend ostream& operator<<(ostream&,FrameDes); sl@0: friend istream& operator>>(istream&,FrameDes&); sl@0: }; sl@0: sl@0: class Header sl@0: { sl@0: enum {dirty=0x1,backupshift=1}; sl@0: public: sl@0: enum {tocoffset=-12}; sl@0: public: sl@0: struct Reloc sl@0: { sl@0: Handle iHandle; sl@0: FramePos iPos; sl@0: }; sl@0: enum {Offset=0x10,Size=14}; sl@0: public: sl@0: inline int Empty() const {return Toc().Pos()<0;} sl@0: inline int Dirty() const {return iBackupToc&dirty;} sl@0: FramePos Toc() const; sl@0: Reloc const* GetReloc() const; sl@0: private: sl@0: long iBackupToc; sl@0: union sl@0: { sl@0: struct sl@0: { sl@0: long iZero; sl@0: long iPos; sl@0: } iToc; sl@0: struct sl@0: { sl@0: unsigned long iHandle; sl@0: long iPos; sl@0: } iReloc; sl@0: }; sl@0: unsigned short iCrc; sl@0: }; sl@0: ostream& operator<<(ostream&,Header const&); sl@0: sl@0: class Frames sl@0: { sl@0: public: sl@0: struct Element sl@0: { sl@0: FramePos iPos; sl@0: FrameDes iDes; sl@0: }; sl@0: typedef Element const* Iterator; sl@0: public: sl@0: Frames(); sl@0: ~Frames(); sl@0: // sl@0: void Add(FramePos aPos,FrameDes aDes); sl@0: void Complete(); sl@0: Iterator Find(FramePos aPos) const; sl@0: inline Iterator Begin() const {return iRep;} sl@0: inline Iterator End() const {return iRep+iElements;} sl@0: private: sl@0: static int Compare(void const* aLeft,void const* aRight); sl@0: private: sl@0: int iSize; sl@0: int iElements; sl@0: Element* iRep; sl@0: }; sl@0: sl@0: class Stream sl@0: { sl@0: public: sl@0: inline Stream(Frames const& aFrames,FramePos aPos) :iFrame(aFrames.Find(aPos)) {} sl@0: inline Stream(Frames::Iterator aFrame) :iFrame(aFrame) {} sl@0: inline int IsGood() const {return iFrame!=NULL;} sl@0: inline int Type() const {return iFrame->iDes.Type();} sl@0: inline Frames::Iterator Frame() const {return iFrame;} sl@0: int Length() const; sl@0: void* Load(istream& aStream) const; sl@0: private: sl@0: Frames::Iterator iFrame; sl@0: }; sl@0: sl@0: class Toc sl@0: { sl@0: public: sl@0: struct Head sl@0: { sl@0: enum {Size=12}; sl@0: inline StreamId Root() const {return StreamId(iRoot);} sl@0: inline int IsDelta() const {return iRoot.IsDelta();} sl@0: Handle iRoot; sl@0: Handle iAvail; sl@0: long iCount; sl@0: }; sl@0: struct DeltaHead sl@0: { sl@0: enum {Size = 7}; sl@0: long iBase; sl@0: unsigned short iMagic; sl@0: unsigned char iCount; sl@0: }; sl@0: struct Entry sl@0: { sl@0: enum {BaseSize=5,BaseRedundant=3,DeltaSize=8}; sl@0: inline Handle Link() const {return iLink;} sl@0: inline FramePos Pos() const {return iPos;} sl@0: // sl@0: Handle iHandle; sl@0: union sl@0: { sl@0: unsigned long iLink; sl@0: long iPos; sl@0: }; sl@0: }; sl@0: typedef Entry const* Iterator; sl@0: public: sl@0: Toc(); sl@0: ~Toc(); sl@0: // sl@0: void Load(istream& aStream,Frames const& aFrames,Frames::Iterator aFrame,Header::Reloc const* aReloc); sl@0: inline Head const& Header() const {return iHeader;} sl@0: inline Iterator Begin() const {return iRep;} sl@0: inline Iterator End() const {return iRep+iHeader.iCount;} sl@0: inline Entry const& operator[](int anIndex) {return iRep[anIndex-1];} sl@0: private: sl@0: void Base(const char* aPtr,int aCount); sl@0: private: sl@0: FramePos iPos; sl@0: Head iHeader; sl@0: DeltaHead iDelta; sl@0: Entry* iRep; sl@0: int iAvail; sl@0: // sl@0: friend ostream& operator<<(ostream&,Toc const&); sl@0: }; sl@0: sl@0: class HexDump sl@0: { sl@0: enum {HexInterval=0x10}; sl@0: public: sl@0: HexDump(); sl@0: ~HexDump(); sl@0: // sl@0: void Reset(); sl@0: void Dump(istream& aStream,int aBytes); sl@0: void Flush(); sl@0: private: sl@0: int iPos; sl@0: int iByte; sl@0: char* iPtr; sl@0: char iChar[HexInterval+4]; sl@0: }; sl@0: sl@0: class StoreFile sl@0: { sl@0: enum {PermanentFileStoreUid=268435536}; sl@0: public: sl@0: StoreFile(char const* aFile); sl@0: ~StoreFile(); sl@0: // sl@0: inline int Empty() const {return iHeader.Empty();} sl@0: void EmitHeader(); sl@0: void EmitFrames(); sl@0: void EmitToc(); sl@0: void EmitStreams(); sl@0: private: sl@0: void LoadFrames(); sl@0: void LoadToc(); sl@0: public: sl@0: static int OutWidth; sl@0: private: sl@0: ifstream iFile; sl@0: int iSize; sl@0: Header iHeader; sl@0: Frames iFrames; sl@0: Toc iToc; sl@0: }; sl@0: sl@0: class binbuf : public streambuf sl@0: { sl@0: public: sl@0: binbuf(); sl@0: private: sl@0: int overflow(int); sl@0: int underflow(); sl@0: }; sl@0: sl@0: class Program sl@0: { sl@0: public: sl@0: enum {frame=0x1,quiet=0x2,verbose=0x4,compare=0x8}; sl@0: public: sl@0: Program(); sl@0: // sl@0: int ProcessCommandLine(int argc,char ** argv); sl@0: void Information(); sl@0: void ExplainUsage(); sl@0: void Run(); sl@0: inline int Option(int type) const {return iOptions&type;} sl@0: inline int TocRevision() const {return iTocRevision;} sl@0: // sl@0: static void Abort(char const* message); sl@0: static void Corrupt(char const* message); sl@0: static ostream& Error(); sl@0: static ostream& Warning(); sl@0: private: sl@0: char const* iFile; sl@0: int iOptions; sl@0: int iTocRevision; sl@0: binbuf iBinBuf; sl@0: ostream iBin; sl@0: int iErrors; sl@0: }; sl@0: sl@0: extern Program TheProgram; sl@0: sl@0: #endif