secureswitools/swisistools/source/sisxlibrary/header.h
changeset 0 ba25891c3a9e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/secureswitools/swisistools/source/sisxlibrary/header.h	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,202 @@
+/*
+* Copyright (c) 2004-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: 
+* Note: This file may contain code to generate corrupt files for test purposes.
+* Such code is excluded from production builds by use of compiler defines;
+* it is recommended that such code should be removed if this code is ever published publicly.
+* manages type and length for SIS structures
+*
+*/
+
+
+/**
+ @file 
+ @internalComponent
+ @released
+*/
+
+#ifndef __HEADER_H__
+#define __HEADER_H__
+
+
+#include <assert.h>
+
+#include "fieldroot.h"
+#include "numeric.h"
+
+
+class CSISHeader : public CSISFieldRoot
+
+	{
+private:
+	void BigToSmalls (CSISUInt32& aSmall, CSISUInt32& aBig) const;
+	static void RawBigToSmalls (const TUint64& aSize, CSISUInt32& aSmall, CSISUInt32& aBig);
+
+protected:
+	bool IsBigHeader () const;
+
+public:
+	CSISHeader ();
+	CSISHeader (const TFieldType aType);
+	CSISHeader (const TFieldType aType, const TFieldSize aSize);
+
+public:
+	/**
+	 * Internalize the class
+	 * @param aFile File stream from where data needs to be read.
+	 * @param aContainerSize size of the content to be read.
+	 * @param aArrayType Type of the array 
+	 */
+	virtual void Read (TSISStream& aFile, const TFieldSize& aContainerSize, const CSISFieldRoot::TFieldType aArrayType = CSISFieldRoot::ESISUndefined);
+	/**
+	 * Skip the file reading for this field. Read pointer will be moved to the
+	 * next field to be read.
+	 * @param aFile stream for which the data read should be skipped.
+	 * @param aContainerSize size of the data to be skipped. 
+	 */
+	virtual void Skip (TSISStream& aFile, const TFieldSize& aContainerSize) const;
+	/**
+	 * Externalize the class
+	 * @param aFile File stream to which the data needs to be written.
+	 * @param aIsArrayElement whether the structure is part of an array or not. 
+	 */
+	virtual void Write (TSISStream& aFile, const bool aIsArrayElement) const;  
+	/**
+	 * Retrieves the size of the structure excluding the header.
+	 * @param aInsideArray - whether the structure is part of an array or not. 
+	 * @return byte count.
+	 */
+	virtual TFieldSize ByteCount (const bool aInsideArray) const;
+	/**
+	 * Dump the entire content in hex format into the stream
+	 */
+	virtual void Dump (std::ostream& aStream, const int aLevel) const;
+	/**
+	 * Calculates CRC of the content
+	 * @param aCRC CRC value of the content
+	 * @param aIsArrayElement whether the structure is part of an array or not. 
+	 */ 
+	virtual void CalculateCrc (TCRC& aCRC, const bool aIsArrayElement) const;
+
+	/**
+	 * It checks the field type and returns whether the field type is a
+	 * known type or not.
+	 */
+	bool IsKnownType () const;
+	/**
+	 * @return Data field type
+	 */
+	CSISFieldRoot::TFieldType DataType () const;
+	/**
+	 * @param data type
+	 */
+	CSISFieldRoot::TFieldSize DataSize () const;
+	/**
+	 * Reads the header and skips the data from the stream
+	 * @param aSize size of the field is returned in this variable 
+	 * @param aFile File stream.
+	 * @param aContainerSize size of the content.
+	 * @param aArrayType Type of the array 
+	 */
+	static TUint32 RawRead (TUint64& aSize, 
+							TSISStream& aFile, 
+							const TFieldSize& aContainerSize,
+							const CSISFieldRoot::TFieldType aArrayType = CSISFieldRoot::ESISUndefined);
+	/**
+	 * writes the header into the stream
+	 * @param aType field type.
+	 * @param aSize size of the field.
+	 * @param aFile File stream to which the data needs to be written.
+	 * @param aIsArrayElement whether the structure is part of an array or not. 
+	 */
+	static void RawWrite (const TUint32 aType, const TUint64& aSize, TSISStream& aFile, const bool aIsArrayElement);
+	/**
+	 * @return Number of bytes required to store the length of the field
+	 */
+	static TFieldSize RawByteCount (const TUint64& aSize, const bool aInsideArray);
+	/**
+	 * Calculates CRC of the header
+	 * @param aType field type.
+	 * @param aSize size of the field.
+	 * @param aCRC CRC value
+	 * @param aIsArrayElement whether the structure is part of an array or not. 
+	 */
+	static void RawCalculateCrc (const TUint32 aType, const TUint64& aSize, TCRC& aCRC, const bool aIsArrayElement);
+	/**
+	 * Checks whether the field length is big number (requires 8 bytes) or not (4 bytes)
+	 */
+	static bool IsBigHeader (const TUint64& aSize);
+
+	/**
+	 * Checks whether the next type is an expected type or not.
+	 */
+	static bool IsNextAsExpected (	TSISStream& aFile, CSISHeader& aHeader,
+									const CSISFieldRoot::TFieldType aExpectedType,
+									const CSISFieldRoot::TFieldType aArrayType,
+									const bool aPeek);
+
+private:
+	CSISFieldRoot::TFieldType	iDataType;
+	CSISFieldRoot::TFieldSize	iDataSize;
+
+	};
+
+
+
+
+inline CSISHeader::CSISHeader () : 
+		iDataType (CSISFieldRoot::ESISUndefined), 
+		iDataSize (0)
+	{
+	}
+
+
+inline CSISHeader::CSISHeader (const TFieldType aType) :
+		iDataType (aType), 
+		iDataSize (0)
+	{
+	}
+
+
+inline CSISHeader::CSISHeader (const TFieldType aType, const TFieldSize aSize) :
+		iDataType (aType), 
+		iDataSize (aSize)
+	{
+	}
+
+
+inline bool CSISHeader::IsKnownType () const
+	{ 
+	return	(iDataType > CSISFieldRoot::ESISUndefined) &&
+			(iDataType < CSISFieldRoot::ESISUnknown); 
+	}
+
+
+inline CSISFieldRoot::TFieldType CSISHeader::DataType () const
+	{
+	return iDataType; 
+	}
+
+
+inline CSISFieldRoot::TFieldSize CSISHeader::DataSize () const
+	{
+	return iDataSize; 
+	}
+
+inline void CSISHeader::Skip (TSISStream& aFile, const TFieldSize& aContainerSize) const
+	{
+	assert (false);	// if you skip the header, you skip the data which tells you how much to skip
+	}
+
+#endif // __HEADER_H__