secureswitools/swianalysistoolkit/source/dumpswicertstoretool/pfsdump.h
changeset 0 ba25891c3a9e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/secureswitools/swianalysistoolkit/source/dumpswicertstoretool/pfsdump.h	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,292 @@
+/*
+* 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
\ No newline at end of file