--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/secureswitools/swisistools/source/sisxlibrary/fieldroot.h Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,433 @@
+/*
+* 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.
+* base class for all types found in sis files. Defines all virtual functions.
+* fieldroot <- field <- container <- [array, sequence, structure] <- most SIS types
+* fieldroot <- field <- [string, compressed, blob]
+* fieldroot <- numeric
+* fieldroot <- header
+*
+*/
+
+
+/**
+ @file
+ @internalComponent
+ @released
+*/
+
+
+#ifndef __FIELDROOT_H__
+#define __FIELDROOT_H__
+
+#include <assert.h>
+#include "basefile.h"
+
+
+#ifdef GENERATE_ERRORS
+#ifndef _DEBUG
+#error GENERATE_ERRORS requires _DEBUG
+ // or change the code to rewrite TLV sizes in array and structure
+#endif
+#endif
+
+class CSISFieldRoot
+
+ {
+public:
+ typedef TUint64 TFieldSize; // in BYTES
+
+ typedef enum
+ {
+ ESISUndefined,
+ ESISString,
+ ESISArray,
+ ESISCompressed,
+ ESISVersion,
+ ESISVersionRange,
+ ESISDate,
+ ESISTime,
+ ESISDateTime,
+ ESISUid,
+ ESISUnused1,
+ ESISLanguage,
+ ESISContents,
+ ESISController,
+ ESISInfo,
+ ESISSupportedLanguages,
+ ESISSupportedOptions,
+ ESISPrerequisites,
+ ESISDependency,
+ ESISProperties,
+ ESISProperty,
+ ESISSignatures,
+ ESISCertificateChain,
+ ESISLogo,
+ ESISFileDescription,
+ ESISHash,
+ ESISIf,
+ ESISElseIf,
+ ESISInstallBlock,
+ ESISExpression,
+ ESISData,
+ ESISDataUnit,
+ ESISFileData,
+ ESISSupportedOption,
+ ESISControllerChecksum,
+ ESISDataChecksum,
+ ESISSignature,
+ ESISBlob,
+ ESISSignatureAlgorithm,
+ ESISSignatureCertificateChain,
+ ESISDataIndex,
+ ESISCapabilities,
+ // insert new fields here
+ ESISUnknown
+ } TFieldType;
+
+ typedef enum
+ {
+ EDbgDefault = 0,
+ EDbgDataChecksum = 0x01,
+ EDbgControllerChecksum = 0x02,
+ EDbgCompress = 0x04,
+ EDbgNoCompress = 0x08,
+ } TDbgFlag;
+
+#ifdef GENERATE_ERRORS
+ typedef enum
+ {
+ EBugDefault = 0,
+ EBugCRCError = 0x0001,
+ EBugInvalidLength = 0x0002,
+ EBugMissingField = 0x0004,
+ EBugUnexpectedField = 0x0008,
+ EBugBigEndian = 0x0010,
+ EBugDuffFieldType = 0x0020,
+ EBugInvalidValues = 0x0040,
+ EBugHashError = 0x0080,
+ EBugNegativeLength = 0x0100,
+ EBugInsaneString = 0x0200,
+ EBugInsaneBlob = 0x0400,
+ EBugArrayCount = 0x0800,
+ EBug32As64 = 0x1000,
+ EBugUnknownField = 0x2000,
+ EBugEmptyCaps = 0x4000,
+ EBugUnknownData = 0x8000,
+ } TBug;
+#endif // GENERATE_ERRORS
+
+ typedef enum
+ {
+ EOptDefault = 0,
+ EOptIsUnicode = 1<<0,
+ EOptIsDistributable = 1<<1,
+ EOptIsCompareToMajor = 1<<2,
+ EOptNoCompress = 1<<3,
+ EOptShutdownApps = 1<<4,
+ EOptNonRemovable = 1<<5,
+ EOptROMUpgrade = 1<<6,
+ } THeadOpt;
+
+
+public:
+ CSISFieldRoot ();
+ virtual ~CSISFieldRoot ();
+
+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 TFieldType aArrayType = ESISUndefined) = 0;
+ /**
+ * 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 = 0;
+ /**
+ * 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 = 0;
+
+ /**
+ * This function verifies the structure. If verification of object fails, throw an exception
+ * aLanguages >= 1
+ * @param aLanguages - language
+ */
+ virtual void Verify (const TUint32 aLanguages) const;
+ /**
+ * if object not acceptable, modify it. Assumes, once modified, will not need modifying again
+ */
+ virtual void MakeNeat ();
+ /**
+ * @return if true, don't bother writing this record to disc
+ * if false, when reading, it'd better be there
+ */
+ virtual bool WasteOfSpace () 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 = 0;
+ /**
+ * Retrieves the in-stream size of data in BYTES of the structure with the header.
+ * @param aInsideArray - whether the structure is part of an array or not.
+ * @return byte count.
+ */
+ virtual TFieldSize ByteCountWithHeader (const bool aInsideArray) const;
+ /**
+ * Sets the size of the structure.
+ * either a) set variable size field, or
+ * b) ensure fixed size field is expected size
+ * @param size - size of the structure.
+ */
+ virtual void SetByteCount (const TFieldSize aSize);
+ /**
+ * Dump the entire content in hex format into the stream
+ */
+ virtual void Dump (std::ostream& aStream, const int aLevel) const = 0;
+ /**
+ * Adds the write the package details into the stream.
+ * @param aStream - Stream in which the package entries need to be written.
+ * @param aVerbose - If this option is set then detail description of pkg
+ * will be written into the stream.
+ */
+ virtual void AddPackageEntry(std::wostream& aStream, bool aVerbose) const;
+ /**
+ * Class name
+ */
+ virtual std::string Name () 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 = 0 ;
+#ifdef GENERATE_ERRORS
+ virtual void CreateDefects ();
+#endif // GENERATE_ERRORS
+ virtual void SkipOldWriteNew (TSISStream& aFile) const;
+ /**
+ * stream offset before the header
+ */
+ virtual TSISStream::pos_type PreHeaderPos () const;
+ /**
+ * stream offset after the header
+ */
+ virtual TSISStream::pos_type PostHeaderPos () const;
+ /**
+ * Calculates CRC of the content
+ * @param aIsArrayElement whether the structure is part of an array or not.
+ * @return CRC value of the content
+ */
+ TCRC Crc (const bool aIsArrayElement = false) const;
+ std::string NoteIfOptional () const;
+
+ /**
+ * Set Debug options
+ */
+ static void SetDebugOption (const TDbgFlag aDbgFlag);
+ /**
+ * Check if a particular debug option is set or not.
+ */
+ static bool IsDebugOptionSet (const TDbgFlag aDbgFlag);
+ /**
+ * Set file header option
+ */
+ static void SetHeaderOption (const THeadOpt aHeaderOption);
+ /**
+ * Check if a particular file header option is set or not.
+ */
+ static bool IsHeaderOptionSet (const THeadOpt aHeaderOption);
+
+#ifdef GENERATE_ERRORS
+ static void SetBug (const TBug aBug);
+ static bool IsBugSet (const TBug aBug);
+ static bool IsAnyBugSet ();
+ static void SetBugStart (const unsigned aStart);
+ static void SetBugRepeat (const unsigned aRepeat);
+ static bool IsBugToBeCreated (const TBug aBug);
+ static void AddRawDataValue (TSISStream& aFile,const unsigned aLength);
+#endif // GENERATE_ERRORS
+
+ /**
+ * Initialize the instance.
+ */
+ static void InitInstance ();
+
+protected:
+ // calculates the CRC of the given data
+ static void DoTheCrc (TCRC& aCRC, const TUint8* aData, const unsigned aLen);
+
+ // calculates CRC on the given data and the padding bytes that will be required
+ static void DoPaddedCrc(TCRC& aCRC, const TUint8* aData, const unsigned aLen);
+
+ // calculate the CRC of just the padding for the given data length
+ static void PaddingCrc(TCRC& aCRC, const unsigned aLength);
+
+ static unsigned SizeOfFieldType ();
+
+protected:
+ static TDbgFlag iDbgFlag;
+ static THeadOpt iOptions;
+
+#ifdef GENERATE_ERRORS
+ static TBug iBug;
+ static unsigned iBugStart;
+ static unsigned iBugRepeat;
+ static unsigned iBugRepeatCountdown;
+#endif // GENERATE_ERRORS
+ };
+
+
+inline void CSISFieldRoot::AddPackageEntry(std::wostream& aStream, bool aVerbose) const
+ {
+ (void)aStream;
+ (void)aVerbose;
+ }
+
+inline void CSISFieldRoot::InitInstance ()
+ {
+ srand (1);
+ // Please consult the VC6 documentation to understand the supplied parameter value.
+ }
+
+
+inline void CSISFieldRoot::SetDebugOption (const TDbgFlag aDbgFlag)
+ {
+ iDbgFlag = static_cast <TDbgFlag> (static_cast <unsigned int> (iDbgFlag) + static_cast <unsigned int> (aDbgFlag));
+ }
+
+inline bool CSISFieldRoot::IsDebugOptionSet (const TDbgFlag aDbgFlag)
+ {
+ return (static_cast <unsigned int> (iDbgFlag) & static_cast <unsigned int> (aDbgFlag)) != 0;
+ }
+
+inline void CSISFieldRoot::SetHeaderOption (const THeadOpt aOptions)
+ {
+ iOptions = static_cast <THeadOpt> (static_cast <unsigned int> (iOptions) + static_cast <unsigned int> (aOptions));
+ }
+
+inline bool CSISFieldRoot::IsHeaderOptionSet (const THeadOpt aOptions)
+ {
+ return (static_cast <unsigned int> (iOptions) & static_cast <unsigned int> (aOptions)) != 0;
+ }
+
+#ifdef GENERATE_ERRORS
+inline void CSISFieldRoot::SetBug (const TBug aBug)
+ {
+ iBug = static_cast <TBug> (static_cast <unsigned int> (iBug) + static_cast <unsigned int> (aBug));
+ }
+
+inline bool CSISFieldRoot::IsBugSet (const TBug aBug)
+ {
+ return (static_cast <unsigned int> (iBug) & static_cast <unsigned int> (aBug)) != 0;
+ }
+
+inline bool CSISFieldRoot::IsAnyBugSet ()
+ {
+ return iBug != EBugDefault;
+ }
+
+inline void CSISFieldRoot::SetBugStart (const unsigned aStart)
+ {
+ iBugStart = aStart;
+ }
+
+inline void CSISFieldRoot::SetBugRepeat (const unsigned aRepeat)
+ {
+ iBugRepeat = aRepeat;
+ iBugRepeatCountdown = aRepeat;
+ }
+
+inline void CSISFieldRoot::CreateDefects ()
+ {
+ }
+#endif // GENERATE_ERRORS
+
+inline std::string CSISFieldRoot::NoteIfOptional () const
+ {
+ return WasteOfSpace () ? " (Dropped)" : std::string ();
+ }
+
+
+inline void CSISFieldRoot::Verify (const TUint32 aLanguages) const
+ {
+ }
+
+
+inline bool CSISFieldRoot::WasteOfSpace () const
+ {
+ return false;
+ }
+
+
+inline CSISFieldRoot::TFieldSize CSISFieldRoot::ByteCountWithHeader (const bool aInsideArray) const
+ {
+ return ByteCount (aInsideArray);
+ }
+
+
+inline void CSISFieldRoot::SetByteCount (const TFieldSize aSize)
+ {
+ assert (aSize == ByteCount (false));
+ }
+
+
+inline void CSISFieldRoot::MakeNeat ()
+ {
+ }
+
+
+inline std::string CSISFieldRoot::Name () const
+ {
+ return std::string ();
+ }
+
+
+inline unsigned CSISFieldRoot::SizeOfFieldType ()
+ {
+ return sizeof (TUint32);
+ }
+
+inline void CSISFieldRoot::SkipOldWriteNew (TSISStream& aFile) const
+ {
+ }
+
+inline TSISStream::pos_type CSISFieldRoot::PreHeaderPos () const
+ {
+ return 0;
+ }
+
+inline TSISStream::pos_type CSISFieldRoot::PostHeaderPos () const
+ {
+ return 0;
+ }
+
+TSISStream& operator >> (TSISStream& aFile, CSISFieldRoot::TFieldType& aType);
+TSISStream& operator << (TSISStream& aFile, const CSISFieldRoot::TFieldType aType);
+
+#endif // __FIELDROOT_H__
+