secureswitools/swisistools/source/sisxlibrary/fieldroot.cpp
changeset 0 ba25891c3a9e
equal deleted inserted replaced
-1:000000000000 0:ba25891c3a9e
       
     1 /*
       
     2 * Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of the License "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description: 
       
    15 * Note: This file may contain code to generate corrupt files for test purposes.
       
    16 * Such code is excluded from production builds by use of compiler defines;
       
    17 * it is recommended that such code should be removed if this code is ever published publicly.
       
    18 *
       
    19 */
       
    20 
       
    21 
       
    22 /**
       
    23  @file 
       
    24  @internalComponent
       
    25  @released
       
    26 */
       
    27 
       
    28 
       
    29 #include "fieldroot.h"
       
    30 #include "basefile.h"
       
    31 
       
    32 
       
    33 
       
    34 #include <assert.h>		// for assert
       
    35 #include "utility_interface.h"	
       
    36 
       
    37 
       
    38 CSISFieldRoot::TDbgFlag CSISFieldRoot::iDbgFlag (CSISFieldRoot::EDbgDefault);
       
    39 CSISFieldRoot::THeadOpt CSISFieldRoot::iOptions (CSISFieldRoot::EOptDefault);
       
    40 #ifdef GENERATE_ERRORS
       
    41 CSISFieldRoot::TBug CSISFieldRoot::iBug (CSISFieldRoot::EBugDefault);
       
    42 unsigned CSISFieldRoot::iBugStart (10);
       
    43 unsigned CSISFieldRoot::iBugRepeat (10);
       
    44 unsigned CSISFieldRoot::iBugRepeatCountdown (0);
       
    45 #endif // GENERATE_ERRORS
       
    46 
       
    47 
       
    48 
       
    49 // 16-bit CRC calulation lookup table
       
    50 static const WORD gCrcTab [256] =
       
    51 	{0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,0x8108,0x9129,0xa14a,
       
    52 	0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef,0x1231,0x0210,0x3273,0x2252,0x52b5,0x4294,
       
    53 	0x72f7,0x62d6,0x9339,0x8318,0xb37b,0xa35a,0xd3bd,0xc39c,0xf3ff,0xe3de,0x2462,
       
    54 	0x3443,0x0420,0x1401,0x64e6,0x74c7,0x44a4,0x5485,0xa56a,0xb54b,0x8528,0x9509,
       
    55 	0xe5ee,0xf5cf,0xc5ac,0xd58d,0x3653,0x2672,0x1611,0x0630,0x76d7,0x66f6,0x5695,
       
    56 	0x46b4,0xb75b,0xa77a,0x9719,0x8738,0xf7df,0xe7fe,0xd79d,0xc7bc,0x48c4,0x58e5,
       
    57 	0x6886,0x78a7,0x0840,0x1861,0x2802,0x3823,0xc9cc,0xd9ed,0xe98e,0xf9af,0x8948,
       
    58 	0x9969,0xa90a,0xb92b,0x5af5,0x4ad4,0x7ab7,0x6a96,0x1a71,0x0a50,0x3a33,0x2a12,
       
    59 	0xdbfd,0xcbdc,0xfbbf,0xeb9e,0x9b79,0x8b58,0xbb3b,0xab1a,0x6ca6,0x7c87,0x4ce4,
       
    60 	0x5cc5,0x2c22,0x3c03,0x0c60,0x1c41,0xedae,0xfd8f,0xcdec,0xddcd,0xad2a,0xbd0b,
       
    61 	0x8d68,0x9d49,0x7e97,0x6eb6,0x5ed5,0x4ef4,0x3e13,0x2e32,0x1e51,0x0e70,0xff9f,
       
    62 	0xefbe,0xdfdd,0xcffc,0xbf1b,0xaf3a,0x9f59,0x8f78,0x9188,0x81a9,0xb1ca,0xa1eb,
       
    63 	0xd10c,0xc12d,0xf14e,0xe16f,0x1080,0x00a1,0x30c2,0x20e3,0x5004,0x4025,0x7046,
       
    64 	0x6067,0x83b9,0x9398,0xa3fb,0xb3da,0xc33d,0xd31c,0xe37f,0xf35e,0x02b1,0x1290,
       
    65 	0x22f3,0x32d2,0x4235,0x5214,0x6277,0x7256,0xb5ea,0xa5cb,0x95a8,0x8589,0xf56e,
       
    66 	0xe54f,0xd52c,0xc50d,0x34e2,0x24c3,0x14a0,0x0481,0x7466,0x6447,0x5424,0x4405,
       
    67 	0xa7db,0xb7fa,0x8799,0x97b8,0xe75f,0xf77e,0xc71d,0xd73c,0x26d3,0x36f2,0x0691,
       
    68 	0x16b0,0x6657,0x7676,0x4615,0x5634,0xd94c,0xc96d,0xf90e,0xe92f,0x99c8,0x89e9,
       
    69 	0xb98a,0xa9ab,0x5844,0x4865,0x7806,0x6827,0x18c0,0x08e1,0x3882,0x28a3,0xcb7d,
       
    70 	0xdb5c,0xeb3f,0xfb1e,0x8bf9,0x9bd8,0xabbb,0xbb9a,0x4a75,0x5a54,0x6a37,0x7a16,
       
    71 	0x0af1,0x1ad0,0x2ab3,0x3a92,0xfd2e,0xed0f,0xdd6c,0xcd4d,0xbdaa,0xad8b,0x9de8,
       
    72 	0x8dc9,0x7c26,0x6c07,0x5c64,0x4c45,0x3ca2,0x2c83,0x1ce0,0x0cc1,0xef1f,0xff3e,
       
    73 	0xcf5d,0xdf7c,0xaf9b,0xbfba,0x8fd9,0x9ff8,0x6e17,0x7e36,0x4e55,0x5e74,0x2e93,
       
    74 	0x3eb2,0x0ed1,0x1ef0
       
    75 	};
       
    76 
       
    77 
       
    78 const TUint8 KByteAlignment = 4;
       
    79 
       
    80 CSISFieldRoot::CSISFieldRoot ()
       
    81 	{ 
       
    82 	}
       
    83 
       
    84 
       
    85 void CSISFieldRoot::DoPaddedCrc(TCRC& aCRC, const TUint8* aData, const unsigned aLen)
       
    86 	{
       
    87 	// calculate CRC of the data as normal
       
    88 	CSISFieldRoot::DoTheCrc(aCRC, aData, aLen);
       
    89 	
       
    90 	// do CRC of the padding
       
    91 	CSISFieldRoot::PaddingCrc(aCRC, aLen);
       
    92 	}
       
    93 
       
    94 void CSISFieldRoot::PaddingCrc(TCRC& aCRC, const unsigned aLength)
       
    95 	{
       
    96 	// calculate the CRC of any required padding bytes
       
    97 	TUint8 padding[KByteAlignment] = { 0, 0, 0, 0};
       
    98 	CSISFieldRoot::DoTheCrc(aCRC, padding, (KByteAlignment - (aLength % KByteAlignment)) & 0x03);
       
    99 	}
       
   100 
       
   101 void CSISFieldRoot::DoTheCrc (TCRC& aCRC, const TUint8* aData, const unsigned aLen)
       
   102 	{
       
   103 
       
   104 // There are several flavours of CRC16. This function calculates the CRC using the ZModem CRC-16
       
   105 // The parameters used to describe the ZModem CRC16 are:
       
   106 // Poly: 1021
       
   107 // Initial Value: 0000
       
   108 // Reflected Input: No
       
   109 // Reflected Output: No
       
   110 // XorOutput: 0000
       
   111 
       
   112 	/*
       
   113 	
       
   114 	  This is a test vector "123456789" which returns CRC of 0x31c3
       
   115 
       
   116 	TUint8 test[] = { 0x31, 0x32, 0x33, 0x34, 0x35,0x36, 0x37, 0x38, 0x39 };
       
   117 	unsigned length = 9;
       
   118 	for (const TUint8 *ptrdata = test; ptrdata != test + length; ptrdata++)
       
   119 		aCRC = (aCRC << 8) ^ gCrcTab[((aCRC >> 8) ^ *ptrdata) & 0xff];
       
   120 	*/
       
   121 
       
   122 	/*  USEFUL CRC DEBUGGING TRICK
       
   123 	FILE* ptr = NULL;
       
   124 	ptr = fopen("c:\\crc.dat","ab");
       
   125 	fwrite(aData, 1, aLen, ptr);
       
   126 	fclose(ptr);
       
   127 	*/
       
   128     assert (! IsBadReadPtr (aData, aLen));
       
   129 	
       
   130     for (const TUint8 *ptrdata = aData; ptrdata != aData + aLen; ptrdata++)
       
   131 		{
       
   132 		aCRC = (aCRC << 8) ^ gCrcTab[((aCRC >> 8) ^ *ptrdata) & 0xff];
       
   133 		}
       
   134   }
       
   135 
       
   136 
       
   137 TSISStream& operator >> (TSISStream& aFile, CSISFieldRoot::TFieldType& aType)
       
   138 	{
       
   139 	TUint32 value;
       
   140 	aFile >> value;
       
   141 	aType = static_cast <CSISFieldRoot::TFieldType> (value);
       
   142 	return aFile;
       
   143 	}
       
   144 
       
   145 TSISStream& operator << (TSISStream& aFile, const CSISFieldRoot::TFieldType aType)
       
   146 	{
       
   147 	TUint32 value (static_cast <TUint32> (aType));
       
   148 	aFile << value;
       
   149 	return aFile;
       
   150 	}
       
   151 
       
   152 
       
   153 
       
   154 
       
   155 
       
   156 
       
   157 CSISFieldRoot::~CSISFieldRoot () 
       
   158 	{ 
       
   159 	}
       
   160 
       
   161 
       
   162 TCRC CSISFieldRoot::Crc (const bool aIsArrayElement) const
       
   163 	{
       
   164 	TCRC crc (0);
       
   165 	CalculateCrc (crc, aIsArrayElement);
       
   166 	return crc;
       
   167 	}
       
   168 
       
   169 #ifdef GENERATE_ERRORS
       
   170 void CSISFieldRoot::AddRawDataValue (TSISStream& aFile,const unsigned aLength)
       
   171 	{
       
   172 	for(int i=0 ; i < aLength ;i++)
       
   173 		{
       
   174 		aFile << (TUint8) rand(); 				
       
   175 		}
       
   176 	}
       
   177 #endif // GENERATE_ERRORS
       
   178 
       
   179 #ifdef GENERATE_ERRORS
       
   180 bool CSISFieldRoot::IsBugToBeCreated (const TBug aBug)
       
   181 	{
       
   182 	if (IsBugSet (aBug))
       
   183 		{
       
   184 		if (iBugStart > 0)
       
   185 			{
       
   186 			return (--iBugStart == 0);
       
   187 			}
       
   188 		if (--iBugRepeatCountdown == 0)
       
   189 			{
       
   190 			iBugRepeatCountdown = iBugRepeat;
       
   191 			return true; 
       
   192 			}
       
   193 		}
       
   194 	return false;
       
   195 	}
       
   196 #endif // GENERATE_ERRORS