--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/secureswitools/swisistools/source/sisxlibrary/container.h Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,364 @@
+/*
+* Copyright (c) 2007-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.
+* common functionality for containers in SIS files
+*
+*/
+
+
+/**
+ @file
+ @internalComponent
+ @released
+*/
+
+#ifndef __CONTAINER_H__
+#define __CONTAINER_H__
+
+#include "field.h"
+#include <vector>
+
+template<class T, CSISFieldRoot::TFieldType FieldType> class CContainer : public CSISField <FieldType>
+ {
+public:
+ typedef std::vector <T*> TMem;
+ typedef typename TMem::iterator TMemIter;
+ typedef typename TMem::const_iterator TMemConIter;
+ typedef typename TMem::size_type TMemSize;
+
+public:
+ /**
+ * Default constructor
+ */
+ CContainer ();
+ /**
+ * Explicit parameterized constructor
+ */
+ explicit CContainer (const bool aRequired);
+ /**
+ * Copy Constructor
+ */
+ CContainer (const CContainer <T, FieldType>& c);
+ /**
+ * Constructor. It also reserves space.
+ */
+ CContainer (const CContainer <T, FieldType>& c, const TMemSize aReserve);
+
+ /**
+ * Retrieves the size of the structure.
+ * @param aInsideArray - whether the structure is part of an array or not.
+ * @return byte count.
+ */
+ virtual CSISFieldRoot::TFieldSize ByteCount (const bool aIsArray) const;
+ /**
+ * Sets the size of the structure.
+ * @param size - size of the structure.
+ */
+ virtual void SetByteCount (const CSISFieldRoot::TFieldSize size);
+ /**
+ * This function verifies the structure
+ * @param aLanguage - 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 ();
+ /**
+ * 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;
+#ifdef GENERATE_ERRORS
+ virtual void CreateDefects ();
+#endif // GENERATE_ERRORS
+
+ /**
+ * @return Item count
+ */
+ TMemSize size () const
+ {
+ return iMem.size ();
+ }
+ /**
+ * Assign new items to the container.
+ * @param aBegin iterator start
+ * @param aEnd iterator end
+ */
+ void assign (TMemConIter aBegin, TMemConIter aEnd);
+ /**
+ * Clear the items
+ */
+ void clear ();
+
+ /**
+ * Iterator functionality
+ * @return iterator pointing to the begining of the item list
+ */
+ TMemConIter begin () const
+ {
+ return iMem.begin ();
+ }
+ /**
+ * Iterator functionality
+ * @return iterator pointing to the end of the item list
+ */
+ TMemConIter end () const
+ {
+ return iMem.end ();
+ }
+ /**
+ * Iterator functionality
+ * @return iterator pointing to the begining of the item list
+ */
+ TMemIter begin ()
+ {
+ return iMem.begin ();
+ }
+ /**
+ * Iterator functionality
+ * @return iterator pointing to the end of the item list
+ */
+ TMemIter end ()
+ {
+ return iMem.end ();
+ }
+
+ /**
+ * Retrieve the most recent item from the container and delete it from
+ * the container list.
+ */
+ void Pop ();
+
+protected:
+ const T& operator [] (const TMemSize& aIndex) const;
+ T& operator [] (const TMemSize& aIndex);
+ void Push (T* aData);
+ const T& Last () const;
+ T& Last ();
+
+protected:
+ TMem iMem;
+ CSISFieldRoot::TFieldSize iSize;
+ };
+
+// macros for accessing template member variable and type
+#define ContainerMemSize(aType, aFieldType) typename CContainer<aType, aFieldType>::TMemSize
+#define ContainerMem(aType,aFieldType) CContainer<aType, aFieldType>::iMem
+#define ContainerIter(aType) typename CContainer<aType, FieldType>::TMemConIter
+
+
+template <class T, CSISFieldRoot::TFieldType FieldType> inline
+ CContainer <T, FieldType>::CContainer () :
+ iSize (0)
+ {
+ }
+
+template <class T, CSISFieldRoot::TFieldType FieldType> inline
+ CContainer <T, FieldType>::CContainer (const bool aRequired) :
+ iSize (0),
+ CSISField <FieldType> (aRequired)
+ {
+ }
+
+template <class T, CSISFieldRoot::TFieldType FieldType> inline
+ CContainer <T, FieldType>::CContainer (const CContainer <T, FieldType>& c) :
+ CSISField <FieldType> (c),
+ iMem (c.iMem),
+ iSize (c.iSize)
+ {
+ }
+
+template <class T, CSISFieldRoot::TFieldType FieldType> inline
+ CContainer <T, FieldType>::CContainer (const CContainer <T, FieldType>& c, const TMemSize aReserve) :
+ CSISField <FieldType> (c),
+ iMem (aReserve),
+ iSize (0)
+ {
+ }
+
+
+template <class T, CSISFieldRoot::TFieldType FieldType>
+ void CContainer <T, FieldType>::clear ()
+ {
+ iMem.clear ();
+ }
+
+template <class T, CSISFieldRoot::TFieldType FieldType> inline
+ void CContainer <T, FieldType>::assign (TMemConIter aBegin, TMemConIter aEnd)
+ {
+ iMem.assign (aBegin, aEnd);
+ }
+
+
+template <class T, CSISFieldRoot::TFieldType FieldType>
+ void CContainer <T, FieldType>::Verify (const TUint32 aLanguages) const
+ {
+ for (TMemConIter iterMemb = iMem.begin (); iterMemb != iMem.end (); iterMemb++)
+ {
+ assert (*iterMemb != NULL);
+ (*iterMemb) -> Verify (aLanguages);
+ }
+ }
+
+template <class T, CSISFieldRoot::TFieldType FieldType>
+ void CContainer <T, FieldType>::MakeNeat ()
+ {
+ for (TMemIter iterMemb = iMem.begin (); iterMemb != iMem.end (); iterMemb++)
+ {
+ assert (*iterMemb != NULL);
+ (*iterMemb) -> MakeNeat ();
+ }
+ }
+
+template <class T, CSISFieldRoot::TFieldType FieldType>
+ void CContainer <T, FieldType>::Dump (std::ostream& aStream, const int aLevel) const
+ {
+ for (TMemSize index = 0; index < size (); index++)
+ {
+ if (index > 0)
+ {
+ aStream << std::string (aLevel, ' ');
+ }
+ if (iMem [index] -> Name ().empty ())
+ {
+ aStream << " ";
+ }
+ else
+ {
+ aStream << iMem [index] -> Name ();
+ if (FieldType == CSISFieldRoot::ESISArray)
+ {
+ aStream << " [" << index << "]";
+ }
+ aStream << iMem [index] -> NoteIfOptional ();
+ aStream << std::endl << std::string (aLevel + 2, ' ');
+ }
+ iMem [index] -> Dump (aStream, aLevel + 2);
+ if (index + 1 < size ())
+ {
+ aStream << std::endl;
+ }
+ }
+ }
+
+
+template <class T, CSISFieldRoot::TFieldType FieldType>
+ CSISFieldRoot::TFieldSize CContainer <T, FieldType>::ByteCount (const bool aIsArray) const
+ {
+ if (WasteOfSpace ())
+ {
+ return 0;
+ }
+ CSISFieldRoot::TFieldSize size = 0;
+ for (TMemConIter iterMemb = iMem.begin (); iterMemb != iMem.end (); iterMemb++)
+ {
+ assert (*iterMemb != NULL);
+ size += (*iterMemb) -> ByteCountWithHeader (aIsArray);
+ }
+ return size;
+ }
+
+template <class T, CSISFieldRoot::TFieldType FieldType> inline
+ void CContainer <T, FieldType>::SetByteCount (const CSISFieldRoot::TFieldSize aSize)
+ {
+ iSize = aSize;
+ }
+
+
+template <class T, CSISFieldRoot::TFieldType FieldType>
+ void CContainer <T, FieldType>::CalculateCrc (TCRC& aCRC, const bool aIsArrayElement) const
+ {
+ if(!WasteOfSpace())
+ {
+ for (TMemConIter iterMemb = iMem.begin (); iterMemb != iMem.end (); iterMemb++)
+ {
+ assert (*iterMemb != NULL);
+ (*iterMemb) -> CalculateCrc (aCRC, aIsArrayElement);
+ }
+ CSISFieldRoot::PaddingCrc(aCRC, ByteCount(false));
+ }
+ }
+
+#ifdef GENERATE_ERRORS
+template <class T, CSISFieldRoot::TFieldType FieldType>
+ void CContainer <T, FieldType>::CreateDefects ()
+ {
+ for (TMemConIter iterMemb = iMem.begin (); iterMemb != iMem.end (); iterMemb++)
+ {
+ assert (*iterMemb != NULL);
+ (*iterMemb) -> CreateDefects ();
+ }
+ }
+#endif // GENERATE_ERRORS
+
+
+template <class T, CSISFieldRoot::TFieldType FieldType>
+ const T& CContainer <T, FieldType>::operator [] (const TMemSize& aIndex) const
+ {
+ assert (aIndex < size ());
+ assert (iMem [aIndex] != NULL);
+ return (*iMem [aIndex]);
+ }
+
+template <class T, CSISFieldRoot::TFieldType FieldType>
+ T& CContainer <T, FieldType>::operator [] (const TMemSize& aIndex)
+ {
+ assert (aIndex < size ());
+ assert (iMem [aIndex] != NULL);
+ return (*iMem [aIndex]);
+ }
+
+template <class T, CSISFieldRoot::TFieldType FieldType> inline
+ void CContainer <T, FieldType>::Push (T* aData)
+ {
+ iMem.push_back (aData);
+ }
+
+template <class T, CSISFieldRoot::TFieldType FieldType> inline
+ const T& CContainer <T, FieldType>::Last () const
+ {
+ assert (size () > 0);
+ assert (iMem [iMem.size () - 1] != NULL);
+ return * (iMem [iMem.size () - 1]);
+ }
+
+template <class T, CSISFieldRoot::TFieldType FieldType> inline
+ T& CContainer <T, FieldType>::Last ()
+ {
+ assert (size () > 0);
+ assert (iMem [iMem.size () - 1] != NULL);
+ return * (iMem [iMem.size () - 1]);
+ }
+
+template <class T, CSISFieldRoot::TFieldType FieldType> inline
+ void CContainer <T, FieldType>::Pop ()
+ {
+ assert (size () > 0);
+ assert (iMem [iMem.size () - 1] != NULL);
+ T* ptr = iMem [iMem.size () - 1];
+ iMem.pop_back ();
+ delete ptr;
+ }
+
+#endif // __SISXTYPE_H__
+