diff -r 000000000000 -r ba25891c3a9e secureswitools/swisistools/source/sisxlibrary/header.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/secureswitools/swisistools/source/sisxlibrary/header.cpp Thu Dec 17 08:51:10 2009 +0200 @@ -0,0 +1,234 @@ +/* +* 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. +* +*/ + + +/** + @file + @internalComponent + @released +*/ + +#include "header.h" +#include "utility.h" + + + +static const TUint32 KBigBit = 0x80000000; +static const TUint32 KSmallMask = ~KBigBit; +static const unsigned short KSizeShift = 31; +static const TUint32 KHalfMask = 0xFFFFFFFF; + + +void CSISHeader::BigToSmalls (CSISUInt32& aSmall, CSISUInt32& aBig) const + { +#ifdef GENERATE_ERRORS + assert (IsBigHeader () || CSISFieldRoot::IsBugSet (CSISFieldRoot::EBug32As64)); +#else // GENERATE_ERRORS + assert (IsBigHeader ()); +#endif // GENERATE_ERRORS + + RawBigToSmalls (iDataSize, aSmall, aBig); + } + + +bool CSISHeader::IsBigHeader () const + { + return (iDataSize >= KBigBit); + } + +bool CSISHeader::IsBigHeader (const TUint64& aSize) + { + return (aSize >= KBigBit); + } + +void CSISHeader::Read (TSISStream& aFile, const TFieldSize& aContainerSize, const CSISFieldRoot::TFieldType aArrayType) + { + iDataType = static_cast ( + RawRead (iDataSize, aFile, aContainerSize, aArrayType)); + } + +void CSISHeader::Write (TSISStream& aFile, const bool aIsArrayElement) const + { + RawWrite (static_cast (iDataType), iDataSize, aFile, aIsArrayElement); + } + +CSISHeader::TFieldSize CSISHeader::ByteCount (const bool aInsideArray) const + { + return RawByteCount (iDataSize, aInsideArray); + } + +void CSISHeader::Dump (std::ostream& aStream, const int aLevel) const + { + aStream << "|" << iDataType << "," << iDataSize << "|"; + } + +void CSISHeader::CalculateCrc (TCRC& aCRC, const bool aIsArrayElement) const + { + RawCalculateCrc (iDataType, iDataSize, aCRC, aIsArrayElement); + } + + +void CSISHeader::RawBigToSmalls (const TUint64& aSize, CSISUInt32& aSmall, CSISUInt32& aBig) + { +#ifdef GENERATE_ERRORS + assert ((aSize >= KBigBit) || CSISFieldRoot::IsBugSet (CSISFieldRoot::EBug32As64)); +#else + assert (aSize >= KBigBit); +#endif + // this isn't a big number + aSmall = static_cast ((aSize & KSmallMask) | KBigBit); + aBig = static_cast ((aSize >> KSizeShift) & KHalfMask); + } + + +TUint32 CSISHeader::RawRead ( TUint64& aSize, + TSISStream& aFile, + const TFieldSize& aContainerSize, + const CSISFieldRoot::TFieldType aArrayType) + { + TUint32 type = static_cast (aArrayType); + for (;;) + { + ReadFiller (aFile); + if (aArrayType == CSISFieldRoot::ESISUndefined) + { + aFile >> type; + } + CSISUInt32 smaller; + smaller.Read (aFile, aContainerSize, aArrayType); + if ((smaller & KBigBit) == 0) + { + aSize = smaller; + } + else + { + smaller = smaller & KSmallMask; + CSISUInt32 bigger; + bigger.Read (aFile, aContainerSize, aArrayType); + aSize = smaller + (bigger << KSizeShift); + } + if (type < CSISFieldRoot::ESISUnknown) + { + return type; + } + aFile.seek (aSize, std::ios_base::cur); + } + } + +void CSISHeader::RawWrite (const TUint32 aType, const TUint64& aSize, TSISStream& aFile, const bool aIsArrayElement) + { + WriteFiller (aFile); + if (! aIsArrayElement) + { +#ifdef GENERATE_ERRORS + if (CSISFieldRoot::IsBugToBeCreated (CSISFieldRoot::EBugDuffFieldType)) + { + aFile << static_cast (rand ()); + } + else +#endif // GENERATE_ERRORS + { + aFile << aType; + } + } + CSISUInt32 smaller; +#ifdef GENERATE_ERRORS + if ((aSize < KBigBit) && ! CSISFieldRoot::IsBugToBeCreated (CSISFieldRoot::EBug32As64)) +#else // GENERATE_ERRORS + if (aSize < KBigBit) +#endif // GENERATE_ERRORS + { +#ifdef GENERATE_ERRORS + if (CSISFieldRoot::IsBugToBeCreated (CSISFieldRoot::EBugInvalidLength)) + { + smaller = static_cast (rand () & KSmallMask); + } + else + if (CSISFieldRoot::IsBugToBeCreated (CSISFieldRoot::EBugNegativeLength)) + { + smaller = KSmallMask; + } + else +#endif // GENERATE_ERRORS + { + smaller = static_cast (aSize & KSmallMask); + } + smaller.Write (aFile, false); + } + else + { + CSISUInt32 bigger; + RawBigToSmalls (aSize, smaller, bigger); + smaller.Write (aFile, false); + bigger.Write (aFile, false); + } + } + +CSISHeader::TFieldSize CSISHeader::RawByteCount (const TUint64& aSize, const bool aInsideArray) + { + CSISHeader::TFieldSize size (aInsideArray ? 0 : CSISFieldRoot::SizeOfFieldType ()); + if (aSize >= KBigBit) + { + size += sizeof (TUint32) * 2; + } + else + { + size += sizeof (TUint32); + } + return size; + } + +void CSISHeader::RawCalculateCrc (const TUint32 aType, const TUint64& aSize, TCRC& aCRC, const bool aIsArrayElement) + { + if (! aIsArrayElement) + { + CSISUInt32 (aType).CalculateCrc (aCRC, false); + } + if (aSize < KBigBit) + { + CSISUInt32 (static_cast (aSize & KSmallMask)).CalculateCrc (aCRC, false); + } + else + { + CSISUInt32 smaller; + CSISUInt32 bigger; + RawBigToSmalls (aSize, smaller, bigger); + smaller.CalculateCrc (aCRC, false); + bigger.CalculateCrc (aCRC, false); + } + } + + +bool CSISHeader::IsNextAsExpected ( TSISStream& aFile, CSISHeader& aHeader, + const CSISFieldRoot::TFieldType aExpectedType, + const CSISFieldRoot::TFieldType aArrayType, + const bool aPeek) + { + TSISStream::pos_type pos = aFile.tell (); + ReadFiller (aFile); + aHeader.Read (aFile, sizeof (CSISHeader), aArrayType); + bool reply = (aHeader.DataType () == aExpectedType); + if (aPeek || ! reply) + { + aFile.seek (pos); + } + return reply; + } +