os/persistentdata/persistentstorage/store/HTOOLS/PFSDUMP.H
changeset 0 bde4ae8d615e
     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