1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/os/persistentdata/persistentstorage/store/HTOOLS/PFSDUMP.H Fri Jun 15 03:10:57 2012 +0200
1.3 @@ -0,0 +1,338 @@
1.4 +// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
1.5 +// All rights reserved.
1.6 +// This component and the accompanying materials are made available
1.7 +// under the terms of "Eclipse Public License v1.0"
1.8 +// which accompanies this distribution, and is available
1.9 +// at the URL "http://www.eclipse.org/legal/epl-v10.html".
1.10 +//
1.11 +// Initial Contributors:
1.12 +// Nokia Corporation - initial contribution.
1.13 +//
1.14 +// Contributors:
1.15 +//
1.16 +// Description:
1.17 +//
1.18 +
1.19 +#ifndef __PFSDUMP_H__
1.20 +#define __PFSDUMP_H__
1.21 +
1.22 +#ifndef __MSVCDOTNET__
1.23 +#pragma warning(disable: 4710)
1.24 +#endif //__MSVCDOTNET__
1.25 +
1.26 +int const MajorVersion=1;
1.27 +int const MinorVersion=6;
1.28 +int const Build=66;
1.29 +
1.30 +#include <stdlib.h>
1.31 +#include <memory.h>
1.32 +#include <ctype.h>
1.33 +
1.34 +#ifdef __MSVCDOTNET__
1.35 +#include <strstream>
1.36 +#include <fstream>
1.37 +#include <iomanip>
1.38 +#include <iostream>
1.39 +using namespace std;
1.40 +#else //!__MSVCDOTNET__
1.41 +#include <strstrea.h>
1.42 +#include <fstream.h>
1.43 +#include <iomanip.h>
1.44 +#endif //__MSVCDOTNET__
1.45 +
1.46 +char const* const Margin=" ";
1.47 +
1.48 +template <class T> inline T min(T a,T b) {return a<b ? a : b;}
1.49 +template <class T> inline T max(T a,T b) {return a>b ? a : b;}
1.50 +
1.51 +class Handle
1.52 + {
1.53 + enum
1.54 + {
1.55 + IndexMask=0xffffff,
1.56 + GenMask=0xf000000,
1.57 + GenShift=24,
1.58 + TocBase=0x40000000,
1.59 + AvailBit=0x80000000,
1.60 + TocDelta=AvailBit
1.61 + };
1.62 +public:
1.63 + inline Handle() {}
1.64 + inline Handle(unsigned aValue) :iValue(aValue) {}
1.65 + inline bool IsNull() const {return iValue==0;}
1.66 + inline int Avail() const {return iValue&AvailBit;}
1.67 + inline int IsDelta() const {return iValue&TocDelta;}
1.68 + inline bool IsTocBase() const {return iValue==TocBase;}
1.69 + inline int Generation() const {return (iValue&GenMask)>>GenShift;}
1.70 + inline int Index() const {return iValue&IndexMask;}
1.71 + inline int operator==(Handle aHandle) const {return iValue==aHandle.iValue;}
1.72 + inline int operator!=(Handle aHandle) const {return iValue!=aHandle.iValue;}
1.73 +private:
1.74 + unsigned long iValue;
1.75 +//
1.76 + friend class StreamId;
1.77 + friend ostream& operator<<(ostream&,Handle);
1.78 + };
1.79 +
1.80 +class StreamId : public Handle
1.81 + {
1.82 + enum {Mask=0xfffffff};
1.83 +public:
1.84 + inline StreamId(Handle aHandle) :Handle(aHandle.iValue&Mask) {}
1.85 + };
1.86 +
1.87 +class FramePos
1.88 + {
1.89 +public:
1.90 + inline FramePos() {}
1.91 + inline FramePos(int aPos) :iValue(aPos) {}
1.92 + inline int Pos() const {return iValue;}
1.93 +private:
1.94 + int iValue;
1.95 +//
1.96 + friend ostream& operator<<(ostream&,FramePos);
1.97 + };
1.98 +
1.99 +class FileOffset
1.100 + {
1.101 +public:
1.102 + inline FileOffset(int anOffset) :iValue(anOffset) {}
1.103 + inline int Offset() const {return iValue;}
1.104 +// offset/pos conversion
1.105 + FileOffset(FramePos aPos);
1.106 + operator FramePos() const;
1.107 +private:
1.108 + int iValue;
1.109 +//
1.110 + friend ostream& operator<<(ostream&,FileOffset);
1.111 + };
1.112 +
1.113 +class FrameDes
1.114 + {
1.115 + enum {TypeMask=0xc000,TypeShift=14,LengthMask=0x3fff};
1.116 +public:
1.117 + enum {First=0x20,Size=2,Interval=0x4002,FullShift=14};
1.118 + enum {Free=0,Data,Toc,Continuation};
1.119 +//
1.120 + inline FrameDes() {}
1.121 + inline FrameDes(unsigned aDes) :iDes((unsigned short)aDes) {}
1.122 + inline int Type() const {return iDes>>TypeShift;}
1.123 + inline int Length() const {return iDes&LengthMask;}
1.124 +private:
1.125 + unsigned short iDes;
1.126 +//
1.127 + friend ostream& operator<<(ostream&,FrameDes);
1.128 + friend istream& operator>>(istream&,FrameDes&);
1.129 + };
1.130 +
1.131 +class Header
1.132 + {
1.133 + enum {dirty=0x1,backupshift=1};
1.134 +public:
1.135 + enum {tocoffset=-12};
1.136 +public:
1.137 + struct Reloc
1.138 + {
1.139 + Handle iHandle;
1.140 + FramePos iPos;
1.141 + };
1.142 + enum {Offset=0x10,Size=14};
1.143 +public:
1.144 + inline int Empty() const {return Toc().Pos()<0;}
1.145 + inline int Dirty() const {return iBackupToc&dirty;}
1.146 + FramePos Toc() const;
1.147 + Reloc const* GetReloc() const;
1.148 +private:
1.149 + long iBackupToc;
1.150 + union
1.151 + {
1.152 + struct
1.153 + {
1.154 + long iZero;
1.155 + long iPos;
1.156 + } iToc;
1.157 + struct
1.158 + {
1.159 + unsigned long iHandle;
1.160 + long iPos;
1.161 + } iReloc;
1.162 + };
1.163 + unsigned short iCrc;
1.164 + };
1.165 +ostream& operator<<(ostream&,Header const&);
1.166 +
1.167 +class Frames
1.168 + {
1.169 +public:
1.170 + struct Element
1.171 + {
1.172 + FramePos iPos;
1.173 + FrameDes iDes;
1.174 + };
1.175 + typedef Element const* Iterator;
1.176 +public:
1.177 + Frames();
1.178 + ~Frames();
1.179 +//
1.180 + void Add(FramePos aPos,FrameDes aDes);
1.181 + void Complete();
1.182 + Iterator Find(FramePos aPos) const;
1.183 + inline Iterator Begin() const {return iRep;}
1.184 + inline Iterator End() const {return iRep+iElements;}
1.185 +private:
1.186 + static int Compare(void const* aLeft,void const* aRight);
1.187 +private:
1.188 + int iSize;
1.189 + int iElements;
1.190 + Element* iRep;
1.191 + };
1.192 +
1.193 +class Stream
1.194 + {
1.195 +public:
1.196 + inline Stream(Frames const& aFrames,FramePos aPos) :iFrame(aFrames.Find(aPos)) {}
1.197 + inline Stream(Frames::Iterator aFrame) :iFrame(aFrame) {}
1.198 + inline int IsGood() const {return iFrame!=NULL;}
1.199 + inline int Type() const {return iFrame->iDes.Type();}
1.200 + inline Frames::Iterator Frame() const {return iFrame;}
1.201 + int Length() const;
1.202 + void* Load(istream& aStream) const;
1.203 +private:
1.204 + Frames::Iterator iFrame;
1.205 + };
1.206 +
1.207 +class Toc
1.208 + {
1.209 +public:
1.210 + struct Head
1.211 + {
1.212 + enum {Size=12};
1.213 + inline StreamId Root() const {return StreamId(iRoot);}
1.214 + inline int IsDelta() const {return iRoot.IsDelta();}
1.215 + Handle iRoot;
1.216 + Handle iAvail;
1.217 + long iCount;
1.218 + };
1.219 + struct DeltaHead
1.220 + {
1.221 + enum {Size = 7};
1.222 + long iBase;
1.223 + unsigned short iMagic;
1.224 + unsigned char iCount;
1.225 + };
1.226 + struct Entry
1.227 + {
1.228 + enum {BaseSize=5,BaseRedundant=3,DeltaSize=8};
1.229 + inline Handle Link() const {return iLink;}
1.230 + inline FramePos Pos() const {return iPos;}
1.231 + //
1.232 + Handle iHandle;
1.233 + union
1.234 + {
1.235 + unsigned long iLink;
1.236 + long iPos;
1.237 + };
1.238 + };
1.239 + typedef Entry const* Iterator;
1.240 +public:
1.241 + Toc();
1.242 + ~Toc();
1.243 +//
1.244 + void Load(istream& aStream,Frames const& aFrames,Frames::Iterator aFrame,Header::Reloc const* aReloc);
1.245 + inline Head const& Header() const {return iHeader;}
1.246 + inline Iterator Begin() const {return iRep;}
1.247 + inline Iterator End() const {return iRep+iHeader.iCount;}
1.248 + inline Entry const& operator[](int anIndex) {return iRep[anIndex-1];}
1.249 +private:
1.250 + void Base(const char* aPtr,int aCount);
1.251 +private:
1.252 + FramePos iPos;
1.253 + Head iHeader;
1.254 + DeltaHead iDelta;
1.255 + Entry* iRep;
1.256 + int iAvail;
1.257 +//
1.258 + friend ostream& operator<<(ostream&,Toc const&);
1.259 + };
1.260 +
1.261 +class HexDump
1.262 + {
1.263 + enum {HexInterval=0x10};
1.264 +public:
1.265 + HexDump();
1.266 + ~HexDump();
1.267 +//
1.268 + void Reset();
1.269 + void Dump(istream& aStream,int aBytes);
1.270 + void Flush();
1.271 +private:
1.272 + int iPos;
1.273 + int iByte;
1.274 + char* iPtr;
1.275 + char iChar[HexInterval+4];
1.276 + };
1.277 +
1.278 +class StoreFile
1.279 + {
1.280 + enum {PermanentFileStoreUid=268435536};
1.281 +public:
1.282 + StoreFile(char const* aFile);
1.283 + ~StoreFile();
1.284 +//
1.285 + inline int Empty() const {return iHeader.Empty();}
1.286 + void EmitHeader();
1.287 + void EmitFrames();
1.288 + void EmitToc();
1.289 + void EmitStreams();
1.290 +private:
1.291 + void LoadFrames();
1.292 + void LoadToc();
1.293 +public:
1.294 + static int OutWidth;
1.295 +private:
1.296 + ifstream iFile;
1.297 + int iSize;
1.298 + Header iHeader;
1.299 + Frames iFrames;
1.300 + Toc iToc;
1.301 + };
1.302 +
1.303 +class binbuf : public streambuf
1.304 + {
1.305 +public:
1.306 + binbuf();
1.307 +private:
1.308 + int overflow(int);
1.309 + int underflow();
1.310 + };
1.311 +
1.312 +class Program
1.313 + {
1.314 +public:
1.315 + enum {frame=0x1,quiet=0x2,verbose=0x4,compare=0x8};
1.316 +public:
1.317 + Program();
1.318 +//
1.319 + int ProcessCommandLine(int argc,char ** argv);
1.320 + void Information();
1.321 + void ExplainUsage();
1.322 + void Run();
1.323 + inline int Option(int type) const {return iOptions&type;}
1.324 + inline int TocRevision() const {return iTocRevision;}
1.325 +//
1.326 + static void Abort(char const* message);
1.327 + static void Corrupt(char const* message);
1.328 + static ostream& Error();
1.329 + static ostream& Warning();
1.330 +private:
1.331 + char const* iFile;
1.332 + int iOptions;
1.333 + int iTocRevision;
1.334 + binbuf iBinBuf;
1.335 + ostream iBin;
1.336 + int iErrors;
1.337 + };
1.338 +
1.339 +extern Program TheProgram;
1.340 +
1.341 +#endif