secureswitools/swianalysistoolkit/source/dumpswicertstoretool/pfsdump.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 14 Sep 2010 21:31:28 +0300
branchRCL_3
changeset 70 e8965914fac7
parent 0 ba25891c3a9e
permissions -rw-r--r--
Revision: 201033 Kit: 201035

/*
* Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description: 
* Copy of a part of pfsdump.h from syslibs code (syslibs/development/common/syslibs/store/HTOOLS/).
* Added CheckFileValidity() method.
*
*/


/**
 @file 
 @internalComponent 
*/

#ifndef __PFSDUMP_H__
#define __PFSDUMP_H__

#include "DumpSwicertstoreTool.h"
#include "options.h"
#include <stdlib.h>
#include <memory.h>
#include <ctype.h>
#include <string>
#include <iostream>
#include <fstream>

class Options;
char const* const Margin="  ";
     
class Handle
{
enum
	{
	IndexMask=0xffffff,
	GenMask=0xf000000,
	GenShift=24,
	TocBase=0x40000000,
	AvailBit=0x80000000,
	TocDelta=AvailBit
	};

public:
	inline Handle() {}
	inline Handle(unsigned aValue) :iValue(aValue) {}
	inline bool IsNull() const {return iValue==0;}
	inline int Avail() const {return iValue&AvailBit;}
	inline int IsDelta() const {return iValue&TocDelta;}
	inline bool IsTocBase() const {return iValue==TocBase;}
	inline int Generation() const {return (iValue&GenMask)>>GenShift;}
	inline int Index() const {return iValue&IndexMask;}
	inline int operator==(Handle aHandle) const {return iValue==aHandle.iValue;}
	inline int operator!=(Handle aHandle) const {return iValue!=aHandle.iValue;}
	
private:
	unsigned long iValue;
	friend class StreamId;
	friend ostream& operator<<(ostream&,Handle);
};

class StreamId : public Handle
{
enum {Mask=0xfffffff};

public:
	inline StreamId(Handle aHandle) :Handle(aHandle.iValue&Mask) {}
};

class FramePos
{
public:
	inline FramePos() {}
	inline FramePos(int aPos) :iValue(aPos) {}
	inline int Pos() const {return iValue;}

private:
	int iValue;
	friend ostream& operator<<(ostream&,FramePos);
};

class FileOffset
{
public:
	inline FileOffset(int anOffset) :iValue(anOffset) {}
	inline int Offset() const {return iValue;}
	FileOffset(FramePos aPos);
	operator FramePos() const;

private:
	int iValue;
	friend ostream& operator<<(ostream&,FileOffset);
};

class FrameDes
{
enum {TypeMask=0xc000,TypeShift=14,LengthMask=0x3fff};

public:
	enum {First=0x20,Size=2,Interval=0x4002,FullShift=14};
	enum {Free=0,Data,Toc,Continuation};

	inline FrameDes() {}
	inline FrameDes(unsigned aDes) :iDes((unsigned short)aDes) {}
	inline int Type() const {return iDes>>TypeShift;}
	inline int Length() const {return iDes&LengthMask;}

private:
	unsigned short iDes;
	friend ostream& operator<<(ostream&,FrameDes);
	friend istream& operator>>(istream&,FrameDes&);
};

class Header
{
enum {dirty=0x1,backupshift=1};

public:
	enum {tocoffset=-12};

public:
	struct Reloc
		{
		Handle iHandle;
		FramePos iPos;
		};
enum {Offset=0x10,Size=14};

public:
	inline int Empty() const {return Toc().Pos()<0;}
	inline int Dirty() const {return iBackupToc&dirty;}
	FramePos Toc() const;
	Reloc const* GetReloc() const;

private:
	long iBackupToc;
	union
		{
		struct
			{
			long iZero;
			long iPos;
			} iToc;
		struct
			{
			unsigned long iHandle;
			long iPos;
			} iReloc;
		};
	unsigned short iCrc;
};

ostream& operator<<(ostream&,Header const&);

class Frames
{
public:
	struct Element
		{
		FramePos iPos;
		FrameDes iDes;
		};
typedef Element const* Iterator;

public:
	Frames();
	~Frames();
	void Add(FramePos aPos,FrameDes aDes);
	void Complete();
	Iterator Find(FramePos aPos) const;
	inline Iterator Begin() const {return iRep;}
	inline Iterator End() const {return iRep+iElements;}

private:
	static int Compare(void const* aLeft,void const* aRight);

private:
	int iSize;
	int iElements;
	Element* iRep;
};

class Stream
{
public:
	inline Stream(Frames const& aFrames,FramePos aPos)	:iFrame(aFrames.Find(aPos)) {}
	inline Stream(Frames::Iterator aFrame) :iFrame(aFrame) {}
	inline int IsGood() const {return iFrame!=NULL;}
	inline int Type() const {return iFrame->iDes.Type();}
	inline Frames::Iterator Frame() const {return iFrame;}
	int Length() const;
	void* Load(istream& aStream) const;

private:
	Frames::Iterator iFrame;
};

class Toc
{
public:
	struct Head
		{
		enum {Size=12};
		inline StreamId Root() const {return StreamId(iRoot);}
		inline int IsDelta() const {return iRoot.IsDelta();}
		Handle iRoot;
		Handle iAvail;
		long iCount;
		};
	struct DeltaHead
		{
		enum {Size = 7};
		long iBase;
		unsigned short iMagic;
		unsigned char iCount;
		};
	struct Entry
		{
		enum {BaseSize=5,BaseRedundant=3,DeltaSize=8};
		inline Handle Link() const {return iLink;}
		inline FramePos Pos() const {return iPos;}
		Handle iHandle;
	union
		{
		unsigned long iLink;
		long iPos;
		};
		};

typedef Entry const* Iterator;

public:
	Toc();
	~Toc();
	void Load(istream& aStream,Frames const& aFrames,Frames::Iterator aFrame,Header::Reloc const* aReloc);
	inline Head const& Header() const {return iHeader;}
	inline Iterator Begin() const {return iRep;}
	inline Iterator End() const {return iRep+iHeader.iCount;}
	inline Entry const& operator[](int anIndex) {return iRep[anIndex-1];}

private:
	void Base(const char* aPtr,int aCount);

private:
	FramePos iPos;
	Head iHeader;
	DeltaHead iDelta;
	Entry* iRep;
	int iAvail;
	friend ostream& operator<<(ostream&,Toc const&);
};

class StoreFile
{
enum {PermanentFileStoreUid=268435536};

public:
	StoreFile();
	bool CheckFileValidity(char const* aFile,const Options& aOptions);
	~StoreFile();

	inline int Empty() const {return iHeader.Empty();}
	Stream RootStream();
	Stream FindStream(Handle& aHandle);
	ifstream& File() ;
	
private:
	void LoadFrames();
	void LoadToc();

public:
	static int OutWidth;

private:

	ifstream iFile;
	int iSize;
	Header iHeader;
	Frames iFrames;
	Toc iToc;
};

#endif