kernel/eka/debug/crashMonitor/src/scmdatatypes.cpp
changeset 300 1d28c8722707
parent 293 0659d0e1a03c
child 301 172f33f13d7d
equal deleted inserted replaced
293:0659d0e1a03c 300:1d28c8722707
     1 // Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of the License "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // e32\debug\crashMonitor\src\scmdatatypes.cpp
       
    15 // Core dump server - Data Types for System Crash
       
    16 // 
       
    17 //
       
    18 
       
    19 /**
       
    20  @file
       
    21  @internalTechnology
       
    22 */
       
    23 #include <scmtrace.h>
       
    24 #include <scmdatatypes.h>
       
    25 #include <scmbytestreamutil.h>
       
    26 
       
    27 namespace Debug 
       
    28 	{	
       
    29 	/**
       
    30 	 * TCrashOffsetsHeader implementation
       
    31 	 * @internal technology
       
    32 	 */
       
    33 
       
    34 	/**
       
    35 	 * TCrashOffsetsHeader Constructor
       
    36 	 */
       
    37 	TCrashOffsetsHeader::TCrashOffsetsHeader():
       
    38 		iId(ESCMOffsetsHeader),	
       
    39 		iVersion(EChVersion1),	
       
    40 		iCTFullRegOffset(0),
       
    41 		iCTUsrStkOffset(0),
       
    42 		iCTSvrStkOffset(0),
       
    43 		iCPMetaOffset(0),
       
    44 		iCTMetaOffset(0),
       
    45 		iCPCodeSegOffset(0),
       
    46 		iSysUsrStkOffset(0),
       
    47 		iSysSvrStkOffset(0),
       
    48 		iSysUsrRegOffset(0),
       
    49 		iSysSvrRegOffset(0),
       
    50 		iTLstOffset(0),
       
    51 		iPLstOffset(0),	
       
    52 		iSysCodeSegOffset(0),
       
    53 		iExcStkOffset(0),		
       
    54 		iTraceOffset(0),
       
    55 		iScmLocksOffset(0),
       
    56 		iKernelHeapOffset(0),
       
    57 		iVarSpecInfOffset(0),
       
    58 		iRomInfoOffset(0),	
       
    59 		iSpare1(0),
       
    60 		iSpare2(0),
       
    61 		iSpare3(0),
       
    62 		iSpare4(0),	
       
    63 		iSpare5(0),	
       
    64 		iSpare6(0)
       
    65 		{	
       
    66 		}	
       
    67 
       
    68 	/**
       
    69 	 * Writes this class to the specified byte stream
       
    70 	 * @param aWriter Byte stream to use
       
    71 	 * @return One of the OS wide codes
       
    72 	 */
       
    73 	TInt TCrashOffsetsHeader::Serialize(TByteStreamWriter& aWriter)
       
    74 		{						
       
    75 		TInt startPos = aWriter.CurrentPosition();
       
    76 		
       
    77 		if(iId != ESCMOffsetsHeader)
       
    78 			{
       
    79 			CLTRACE("TCrashOffsetsHeader::Serialize Corrupt ID");
       
    80 			return KErrCorrupt;
       
    81 			}
       
    82 
       
    83 		// ID saved first 
       
    84 		aWriter.WriteInt(iId);		 				// 4		
       
    85 		aWriter.WriteShort((TUint16) iVersion);		// 2
       
    86 
       
    87 		if(iVersion == EChVersion1)
       
    88 			{
       
    89 			// write data v1 format	
       
    90 			aWriter.WriteInt(iCTFullRegOffset); 	// 4 
       
    91 			aWriter.WriteInt(iCTUsrStkOffset);  	// 4
       
    92 			aWriter.WriteInt(iCTSvrStkOffset);  	// 4		
       
    93 			aWriter.WriteInt(iCPMetaOffset);	   	// 4
       
    94 			aWriter.WriteInt(iCTMetaOffset);		// 4
       
    95 			aWriter.WriteInt(iCPCodeSegOffset);	// 4
       
    96 			aWriter.WriteInt(iSysUsrStkOffset);	// 4
       
    97 			aWriter.WriteInt(iSysSvrStkOffset);	// 4
       
    98 			aWriter.WriteInt(iSysUsrRegOffset);	// 4
       
    99 			aWriter.WriteInt(iSysSvrRegOffset);	// 4
       
   100 			aWriter.WriteInt(iTLstOffset);		// 4
       
   101 			aWriter.WriteInt(iPLstOffset);		// 4
       
   102 			aWriter.WriteInt(iSysCodeSegOffset);	// 4
       
   103 			aWriter.WriteInt(iExcStkOffset);		// 4
       
   104 			aWriter.WriteInt(iTraceOffset);		// 4
       
   105 			aWriter.WriteInt(iScmLocksOffset);	// 4
       
   106 			aWriter.WriteInt(iKernelHeapOffset);		// 4			
       
   107 			aWriter.WriteInt(iVarSpecInfOffset);		// 4
       
   108 			aWriter.WriteInt(iRomInfoOffset);		// 4	
       
   109 			}
       
   110 		else
       
   111 			{
       
   112 			CLTRACE("TCrashOffsetsHeader::Serialize Unsupported version");
       
   113 			}
       
   114 		
       
   115 		TInt sizeWritten = aWriter.CurrentPosition() - startPos;
       
   116 		if(sizeWritten != GetSize())
       
   117 			{
       
   118 			// error between actual size & real size in data
       
   119 			CLTRACE("TCrashOffsetsHeader serialization size error");	
       
   120 			return KErrCorrupt;
       
   121 			}
       
   122 
       
   123 		return KErrNone;
       
   124 		}
       
   125 	
       
   126 	/**
       
   127 	 * Reads the classes data from the specified byte stream
       
   128 	 * @param aReader Byte stream to use
       
   129 	 * @return One of the OS wide codes
       
   130 	 */
       
   131 	TInt TCrashOffsetsHeader::Deserialize(TByteStreamReader& aReader)	
       
   132 		{		
       
   133 		TInt startPos = aReader.CurrentPosition();
       
   134 		
       
   135 		iId = (SCMStructId)aReader.ReadInt();	// 4
       
   136 		if(iId != ESCMOffsetsHeader)
       
   137 			{
       
   138 			CLTRACE("TCrashOffsetsHeader::Deserialize Corrupt ID");
       
   139 			return KErrCorrupt;
       
   140 			}
       
   141 		
       
   142 		iVersion = (TCrashHeaderVersion)aReader.ReadShort();  //2
       
   143 		
       
   144 		if(iVersion == EChVersion1)
       
   145 			{	
       
   146 			iCTFullRegOffset = aReader.ReadInt(); // 4
       
   147 			iCTUsrStkOffset = aReader.ReadInt();	// 4
       
   148 			iCTSvrStkOffset = aReader.ReadInt();	// 4
       
   149 			iCPMetaOffset = aReader.ReadInt();	// 4		
       
   150 			iCTMetaOffset = aReader.ReadInt();	// 4
       
   151 			iCPCodeSegOffset = aReader.ReadInt();	// 4
       
   152 			iSysUsrStkOffset = aReader.ReadInt(); // 4
       
   153 			iSysSvrStkOffset = aReader.ReadInt(); // 4
       
   154 			iSysUsrRegOffset = aReader.ReadInt(); // 4
       
   155 			iSysSvrRegOffset = aReader.ReadInt(); // 4
       
   156 			iTLstOffset = aReader.ReadInt();		// 4
       
   157 			iPLstOffset = aReader.ReadInt();		// 4
       
   158 			iSysCodeSegOffset = aReader.ReadInt();// 4
       
   159 			iExcStkOffset = aReader.ReadInt();	// 4
       
   160 			iTraceOffset = aReader.ReadInt();		// 4
       
   161 			iScmLocksOffset = aReader.ReadInt();	// 4			
       
   162 			iKernelHeapOffset = aReader.ReadInt();		// 4
       
   163 			iVarSpecInfOffset = aReader.ReadInt();		// 4
       
   164 			iRomInfoOffset = aReader.ReadInt();		// 4						
       
   165 			}
       
   166 		else
       
   167 			{
       
   168 			CLTRACE("TCrashOffsetsHeader::Deserialize Unsupported version");
       
   169 			return KErrCorrupt;
       
   170 			}
       
   171 		
       
   172 		TInt endPos = aReader.CurrentPosition();
       
   173 		if( endPos - startPos != GetSize())
       
   174 			{
       
   175 			// error between actual size & real size in data
       
   176 			CLTRACE("TCrashOffsetsHeader deserialization size error");		
       
   177 			return KErrCorrupt;
       
   178 			}
       
   179 		return KErrNone;
       
   180 		}
       
   181 
       
   182 	/**
       
   183 	 * Get the externalised size of this class
       
   184 	 * @return TInt the Size
       
   185 	 */
       
   186 	TInt TCrashOffsetsHeader::GetSize() const
       
   187 		{
       
   188 		// return the size in bytes that this struct uses to serialize - deserialize itself
       
   189 		if(iVersion == EChVersion1)
       
   190 			{
       
   191 			return 82;
       
   192 			}
       
   193 		else
       
   194 			{
       
   195 			CLTRACE("TCrashOffsetsHeader::GetSize Unsupported version");			
       
   196 			return KErrNotSupported;
       
   197 			}
       
   198 		}
       
   199 	
       
   200 	TBool TCrashOffsetsHeader::operator == (const TCrashOffsetsHeader& aOther) const
       
   201 		{
       
   202 		return (iId ==  aOther.iId && 	
       
   203 				iVersion == aOther.iVersion &&	
       
   204 				iCTFullRegOffset == aOther.iCTFullRegOffset &&			
       
   205 				iCTUsrStkOffset == aOther.iCTUsrStkOffset &&
       
   206 				iCTSvrStkOffset == aOther.iCTSvrStkOffset &&
       
   207 				iCPMetaOffset == aOther.iCPMetaOffset &&
       
   208 				iCTMetaOffset == aOther.iCTMetaOffset &&		
       
   209 				iSysUsrStkOffset == aOther.iSysUsrStkOffset &&
       
   210 				iSysSvrStkOffset == aOther.iSysSvrStkOffset &&
       
   211 				iSysUsrRegOffset == aOther.iSysUsrRegOffset &&
       
   212 				iSysSvrRegOffset == aOther.iSysSvrRegOffset &&
       
   213 				iTLstOffset == aOther.iTLstOffset &&
       
   214 				iPLstOffset == aOther.iPLstOffset &&	
       
   215 				iExcStkOffset == aOther.iExcStkOffset &&	
       
   216 				iCPCodeSegOffset == aOther.iCPCodeSegOffset &&
       
   217 				iSysCodeSegOffset == aOther.iSysCodeSegOffset &&
       
   218 				iTraceOffset == aOther.iTraceOffset &&
       
   219 				iScmLocksOffset == aOther.iScmLocksOffset &&
       
   220 				iVarSpecInfOffset == aOther.iVarSpecInfOffset &&
       
   221 				iKernelHeapOffset == aOther.iKernelHeapOffset &&
       
   222 				iRomInfoOffset == aOther.iRomInfoOffset);
       
   223 		}
       
   224 	
       
   225 	
       
   226 	/**
       
   227 	 * TCrashInfoHeader implementation
       
   228 	 * @internal technology
       
   229 	 */
       
   230 	
       
   231 	/**
       
   232 	 * TCrashInfoHeader constructor
       
   233 	 */
       
   234 	TCrashInfoHeader::TCrashInfoHeader():
       
   235 		iId(ESCMTCrashInfo),
       
   236 		iVersion(ECiVersion1),
       
   237 		iLogSize(0),
       
   238 		iFlashAlign(0),
       
   239 		iCachedWriterSize(0),
       
   240 		iPid(0),
       
   241 		iTid(0),
       
   242 		iExitType(0),
       
   243 		iExitReason(0),
       
   244 		iExcCode(0),	
       
   245 		iCrashTime(0),
       
   246 		iCrashId(0),
       
   247 		iFlashBlockSize(0),
       
   248 		iFlashPartitionSize(0),
       
   249 		iCategorySize(0),
       
   250 		iSpare1(0),
       
   251 		iSpare2(0)
       
   252 		{		
       
   253 		TVersion ver(KSCMDataTypesMajorVersion, KSCMDataTypesMinorVersion, KSCMDataTypesBuildNumber);
       
   254 		iSCMDataTypesVersion = ver;
       
   255 		}
       
   256 
       
   257 	/**
       
   258 	 * Writes this classes data to the specified byte stream
       
   259 	 * @param aWriter byte stream to use
       
   260 	 * @return One of the OS wide codes
       
   261 	 */
       
   262 	TInt TCrashInfoHeader::Serialize(TByteStreamWriter& aWriter)
       
   263 		{	
       
   264 		
       
   265 		//CLTRACE("TCrashInfoHeader::Serialize");
       
   266 		TInt startPos = aWriter.CurrentPosition();
       
   267 		
       
   268 		// ID saved first 
       
   269 		aWriter.WriteInt(iId);		 				// 4		
       
   270 		if(iId != ESCMTCrashInfo)
       
   271 			{
       
   272 			CLTRACE("TCrashInfoHeader::Serialize Corrupt ID");
       
   273 			return KErrCorrupt;
       
   274 			}
       
   275 		
       
   276 		aWriter.WriteShort((TUint16) iVersion);			// 2
       
   277 
       
   278 		if(iVersion == ECiVersion1)
       
   279 			{
       
   280 			// write data v1 format
       
   281 			aWriter.WriteInt(iLogSize);					// 4
       
   282 			aWriter.WriteByte((TUint8)iFlashAlign);  	// 1
       
   283 			aWriter.WriteByte((TUint8)iCachedWriterSize);		// 1		
       
   284 			aWriter.WriteInt64(iPid);					// 8
       
   285 			aWriter.WriteInt64(iTid);					// 8
       
   286 			aWriter.WriteInt(iExitType);				// 4
       
   287 			aWriter.WriteInt(iExitReason);				// 4
       
   288 			aWriter.WriteInt(iExcCode);					// 4
       
   289 			aWriter.WriteInt64(iCrashTime);				// 8
       
   290 			aWriter.WriteInt(iCrashId);					// 4
       
   291 			aWriter.WriteInt(iFlashBlockSize);			// 4
       
   292 			aWriter.WriteInt(iFlashPartitionSize);			// 4
       
   293 			aWriter.WriteInt(iSCMDataTypesVersion.iMajor);  // 4
       
   294 			aWriter.WriteInt(iSCMDataTypesVersion.iMinor);  // 4
       
   295 			aWriter.WriteInt(iSCMDataTypesVersion.iBuild);  // 4
       
   296 			
       
   297 			if(iCategory.Ptr())
       
   298 				{
       
   299 				aWriter.WriteInt(iCategory.Length());	// 4		
       
   300 				for(TInt cnt = 0; cnt < iCategory.Length(); cnt++)
       
   301 					{
       
   302 					aWriter.WriteByte(iCategory[cnt]);  //iCategorySize bytes
       
   303 					}
       
   304 				}
       
   305 			else
       
   306 				{
       
   307 				aWriter.WriteInt(0);
       
   308 				}
       
   309 			}
       
   310 		else
       
   311 			{
       
   312 			CLTRACE("TCrashInfoHeader::Serialize Unsupported version");
       
   313 			return KErrCorrupt;
       
   314 			}
       
   315 		
       
   316 		TInt endPos = aWriter.CurrentPosition();
       
   317 		if( endPos - startPos != GetSize())
       
   318 			{
       
   319 			// error between actual size & real size in data
       
   320 			CLTRACE2("TCrashInfoHeader::Serialize serialization size error. Wrote [%d] but expected [%d]", endPos - startPos, GetSize());
       
   321 			return KErrCorrupt;
       
   322 			}
       
   323 		return KErrNone;
       
   324 		}
       
   325 	
       
   326 	/**
       
   327 	 * Reads the classes data from the specified byte stream
       
   328 	 * @param aReader Byte stream to use
       
   329 	 * @return One of the OS wide codes
       
   330 	 */
       
   331 	TInt TCrashInfoHeader::Deserialize(TByteStreamReader& aReader)	
       
   332 		{
       
   333 		TInt startPos = aReader.CurrentPosition();
       
   334 		
       
   335 		iId = (SCMStructId)aReader.ReadInt();
       
   336 		if(iId != ESCMTCrashInfo)
       
   337 			{
       
   338 			CLTRACE("TCrashInfoHeader::Deserialize Corrupt ID");
       
   339 			return KErrCorrupt;
       
   340 			}
       
   341 		
       
   342 		iVersion = (TCrashInfoHeaderVersion)aReader.ReadShort();			// 2
       
   343 
       
   344 		if(iVersion == ECiVersion1)
       
   345 			{
       
   346 			// read data v1 format
       
   347 			iLogSize = aReader.ReadInt(); 			 	    // 4
       
   348 			iFlashAlign = aReader.ReadByte();  				// 1
       
   349 			iCachedWriterSize = aReader.ReadByte();			// 1
       
   350 			iPid = aReader.ReadInt64();						// 8
       
   351 			iTid = aReader.ReadInt64();						// 8
       
   352 			iExitType = aReader.ReadInt();					// 4
       
   353 			iExitReason = aReader.ReadInt();				// 4
       
   354 			iExcCode = aReader.ReadInt();					// 4
       
   355 			iCrashTime = aReader.ReadInt64();				// 8
       
   356 			iCrashId = aReader.ReadInt();					// 4
       
   357 			iFlashBlockSize = aReader.ReadInt(); 			// 4	
       
   358 			iFlashPartitionSize = aReader.ReadInt(); 		// 4
       
   359 			iSCMDataTypesVersion.iMajor = aReader.ReadInt(); 		// 4
       
   360 			iSCMDataTypesVersion.iMinor = aReader.ReadInt(); 		// 4
       
   361 			iSCMDataTypesVersion.iBuild = aReader.ReadInt(); 		// 4			
       
   362 			
       
   363 
       
   364 			iCategorySize = aReader.ReadInt(); 				// 4
       
   365 			
       
   366 			if(iCategory.MaxLength() >= (TInt)iCategorySize)
       
   367 				{
       
   368 				iCategory.SetLength(0);
       
   369 				
       
   370 				for(TUint cnt = 0; cnt < iCategorySize; cnt++)
       
   371 					{
       
   372 					iCategory.Append(aReader.ReadByte());		//iCategorySize bytes
       
   373 					} 
       
   374 				}
       
   375 			}
       
   376 		else
       
   377 			{
       
   378 			iId = ESCMLast;	//unrecognised header
       
   379 			CLTRACE("TCrashInfoHeader::Deserialize Unsupported version");
       
   380 			return KErrCorrupt;
       
   381 			}
       
   382 		
       
   383 		TInt endPos = aReader.CurrentPosition();
       
   384 		if( endPos - startPos != GetSize())
       
   385 			{					
       
   386 			// error between actual size & real size in data
       
   387 			CLTRACE2("TCrashInfoHeader::Deserialize serialization size error. Read [%d] but expected [%d]", endPos - startPos, GetSize());			
       
   388 			iId = ESCMLast;	//unrecognised header
       
   389 			
       
   390 			return KErrCorrupt;
       
   391 			}
       
   392 		return KErrNone;
       
   393 		}
       
   394 	
       
   395 	/**
       
   396 	 * Returns the externalised size of this class
       
   397 	 * @return TInt size
       
   398 	 */
       
   399 	TInt TCrashInfoHeader::GetSize() const
       
   400 		{
       
   401 		if(iVersion == ECiVersion1)
       
   402 			{
       
   403 			return 76 + iCategory.Length();
       
   404 			}
       
   405 		else
       
   406 			{
       
   407 			CLTRACE("TCrashInfoHeader::GetSize Unsupported version");			
       
   408 			return KErrNotSupported;		
       
   409 			}
       
   410 		}
       
   411 		
       
   412 	TBool TCrashInfoHeader::operator == (const TCrashInfoHeader& aOther) const
       
   413 		{
       
   414 		return (
       
   415 			iId == aOther.iId &&
       
   416 			iVersion == aOther.iVersion &&
       
   417 			iLogSize == aOther.iLogSize &&	
       
   418 			iFlashAlign == aOther.iFlashAlign &&
       
   419 			iCachedWriterSize == aOther.iCachedWriterSize &&
       
   420 			iPid == aOther.iPid &&
       
   421 			iTid == aOther.iTid &&
       
   422 			iExitType == aOther.iExitType &&
       
   423 			iExitReason == aOther.iExitReason &&
       
   424 			iCrashTime == aOther.iCrashTime &&
       
   425 			iCategorySize == aOther.iCategorySize &&
       
   426 			iCategory == aOther.iCategory &&
       
   427 			iSCMDataTypesVersion.iMajor == aOther.iSCMDataTypesVersion.iMajor &&
       
   428 			iSCMDataTypesVersion.iMinor == aOther.iSCMDataTypesVersion.iMinor &&
       
   429 			iSCMDataTypesVersion.iBuild == aOther.iSCMDataTypesVersion.iBuild);
       
   430 		}	
       
   431 
       
   432 	/**
       
   433 	 * TThreadStack implementation
       
   434 	 * @internal technology
       
   435 	 */
       
   436 	
       
   437 	
       
   438 	/**
       
   439 	 * TThreadStack Constructor
       
   440 	 */
       
   441 	TThreadStack::TThreadStack():
       
   442 		iId(ESCMThreadStack),
       
   443 		iVersion(EStackVersion1),
       
   444 		iStackType(ELast),
       
   445 		iThreadId(0),
       
   446 		iStackSize(0),		
       
   447 		iSpare1(0),
       
   448 		iSpare2(0)
       
   449 		{		
       
   450 		}
       
   451 	
       
   452 	/**
       
   453 	 * Writes this classes data to the specified byte stream
       
   454 	 * @param aWriter byte stream to use
       
   455 	 * @return One of the OS wide codes
       
   456 	 */
       
   457 	TInt TThreadStack::Serialize(TByteStreamWriter& aWriter)
       
   458 		{
       
   459 		TInt startPos = aWriter.CurrentPosition();
       
   460 		
       
   461 		if(iId != ESCMThreadStack)
       
   462 			{
       
   463 			CLTRACE("TThreadStack::Serialize failed - corrupt ID");
       
   464 			return KErrCorrupt;
       
   465 			}
       
   466 		
       
   467 		aWriter.WriteInt(iId);							// 4		
       
   468 		aWriter.WriteShort((TUint16) iVersion);			// 2
       
   469 
       
   470 		if(iVersion == EStackVersion1)
       
   471 			{
       
   472 			// write data v1 format	
       
   473 			aWriter.WriteInt(iStackType);		 		// 4		
       
   474 			aWriter.WriteInt64(iThreadId); 			 	// 8
       
   475 			aWriter.WriteInt(iStackSize);  				// 4
       
   476 			}
       
   477 		else
       
   478 			{
       
   479 			CLTRACE("TThreadStack::Serialize Unsupported version");
       
   480 			return KErrCorrupt;
       
   481 			}
       
   482 		
       
   483 		TInt endPos = aWriter.CurrentPosition();
       
   484 		if( endPos - startPos != GetSize())
       
   485 			{
       
   486 			// error between actual size & real size in data
       
   487 			CLTRACE("TThreadStack::Serialize serialization size error");
       
   488 			return KErrCorrupt;
       
   489 			}
       
   490 		return KErrNone;
       
   491 		}
       
   492 	
       
   493 	/**
       
   494 	 * Returns the externalised size of this class
       
   495 	 * @return TInt size
       
   496 	 */
       
   497 	TInt TThreadStack::GetSize() const
       
   498 		{
       
   499 		if(iVersion == EStackVersion1)
       
   500 			{
       
   501 			return 22;
       
   502 			}
       
   503 		else
       
   504 			{
       
   505 			CLTRACE("TThreadStack::GetSize Unsupported version");			
       
   506 			return KErrNotSupported;		
       
   507 			}
       
   508 		}
       
   509 	
       
   510 	/**
       
   511 	 * Reads the classes data from the specified byte stream
       
   512 	 * @param aReader Byte stream to use
       
   513 	 * @return One of the OS wide codes
       
   514 	 */
       
   515 	TInt TThreadStack::Deserialize(TByteStreamReader& aReader)
       
   516 		{
       
   517 		TInt startPos = aReader.CurrentPosition();
       
   518 		
       
   519 		iId = (SCMStructId)aReader.ReadInt();			// 4
       
   520 		if(iId != ESCMThreadStack)
       
   521 			{
       
   522 			CLTRACE("TThreadStack::Deserialize failed Corrupt ID");
       
   523 			return KErrCorrupt;
       
   524 			}
       
   525 		
       
   526 		iVersion = (TThreadStackVersion)aReader.ReadShort();			// 2
       
   527 
       
   528 		if(iVersion == EStackVersion1)
       
   529 			{
       
   530 			// read data v1 format	
       
   531 			iStackType = (TThreadStackType)aReader.ReadInt();		// 4
       
   532 			iThreadId = aReader.ReadInt64();	// 8
       
   533 			iStackSize = aReader.ReadInt();		// 4
       
   534 
       
   535 			}
       
   536 		else
       
   537 			{
       
   538 			iId = ESCMLast;	//unrecognised header
       
   539 			CLTRACE("TThreadStack::Deserialize Unsupported version");
       
   540 			return KErrCorrupt;
       
   541 			}
       
   542 		
       
   543 		TInt endPos = aReader.CurrentPosition();
       
   544 		if( endPos - startPos != GetSize())
       
   545 			{
       
   546 			iId = ESCMLast;	//unrecognised header
       
   547 			
       
   548 			// error between actual size & real size in data
       
   549 			CLTRACE("TThreadStack::Deserialize serialization size error");	
       
   550 			return KErrCorrupt;
       
   551 			}
       
   552 		return KErrNone;
       
   553 		}
       
   554 	
       
   555 	/**
       
   556 	 * TRegisterValue implementation
       
   557 	 * @internal technology
       
   558 	 */
       
   559 	
       
   560 	/**
       
   561 	 * TRegisterValue Constructor
       
   562 	 */
       
   563 	TRegisterValue::TRegisterValue():
       
   564 		iId(ESCMRegisterValue),
       
   565 		iVersion(ERegisterValueVersion1),
       
   566 		iOwnId(0),
       
   567 		iType(0),
       
   568 		iClass(0), //core reg by default
       
   569 		iSubId(0),		
       
   570 		iSize(2) //default for core registers
       
   571 		{
       
   572 		}
       
   573 	
       
   574 	
       
   575 	/**
       
   576 	 * Returns the externalised size of this class
       
   577 	 * @return TInt size
       
   578 	 */	 
       
   579 	TInt TRegisterValue::GetSize() const
       
   580 		{
       
   581 		if(iVersion == ERegisterValueVersion1)
       
   582 			{
       
   583 			TInt baseSize = 22;
       
   584 			
       
   585 			//variant for union
       
   586 			if(iSize == 0)
       
   587 				{
       
   588 				return baseSize + 1;
       
   589 				}
       
   590 			else if(iSize == 1)
       
   591 				{
       
   592 				return baseSize + 2;
       
   593 				}
       
   594 			else if(iSize == 2)
       
   595 				{
       
   596 				return baseSize + 4;
       
   597 				}
       
   598 			else if(iSize == 3)
       
   599 				{
       
   600 				return baseSize + 8;
       
   601 				}
       
   602 			else
       
   603 				{
       
   604 				CLTRACE("TRegisterValue::GetSize() Corrupt size");
       
   605 				return 0;
       
   606 				}
       
   607 			}
       
   608 		else
       
   609 			{
       
   610 			CLTRACE("TRegisterValue::GetSize Unsupported version");			
       
   611 			return KErrNotSupported;		
       
   612 			}
       
   613 		}
       
   614 	
       
   615 	/**
       
   616 	 * Writes this classes data to the specified byte stream 
       
   617 	 * @param aWriter byte stream to use
       
   618 	 * @return One of the OS wide codes
       
   619 	 */	 
       
   620 	TInt TRegisterValue::Serialize(TByteStreamWriter& aWriter)
       
   621 		{
       
   622 		TInt startPos = aWriter.CurrentPosition();
       
   623 				
       
   624 		// ID saved first
       
   625 		if(iId != ESCMRegisterValue)
       
   626 			{
       
   627 			CLTRACE("TRegisterValue::Serialize Error - Corrupt ID");
       
   628 			return KErrCorrupt;
       
   629 			}
       
   630 		
       
   631 		aWriter.WriteInt(iId);							// 4
       
   632 		aWriter.WriteShort((TUint16) iVersion);			// 2
       
   633 
       
   634 		if(iVersion == ERegisterValueVersion1)
       
   635 			{
       
   636 			// write data v1 format	
       
   637 			aWriter.WriteInt64(iOwnId);		 				// 8
       
   638 			aWriter.WriteInt(iType);						// 4
       
   639 			aWriter.WriteByte(iClass);						// 1
       
   640 			aWriter.WriteShort(iSubId);						// 2
       
   641 			aWriter.WriteByte(iSize);						// 1
       
   642 			
       
   643 			//variant for union
       
   644 			if(iSize == 0)
       
   645 				{
       
   646 				aWriter.WriteByte(iValue8);
       
   647 				}
       
   648 			else if(iSize == 1)
       
   649 				{
       
   650 				aWriter.WriteShort(iValue16);
       
   651 				}
       
   652 			else if(iSize == 2)
       
   653 				{
       
   654 				aWriter.WriteInt(iValue32);
       
   655 				}
       
   656 			else if(iSize == 3)
       
   657 				{
       
   658 				aWriter.WriteInt64(iValue64);
       
   659 				}
       
   660 			else
       
   661 				{
       
   662 				CLTRACE("TRegisterValue::Serialize() Corrupt size");
       
   663 				return KErrCorrupt;
       
   664 				}
       
   665 			}
       
   666 		else
       
   667 			{
       
   668 			CLTRACE("TRegisterValue::Serialize Unsupported version");
       
   669 			}
       
   670 		
       
   671 		TInt endPos = aWriter.CurrentPosition();
       
   672 		if( endPos - startPos != GetSize())
       
   673 			{
       
   674 			// error between actual size & real size in data
       
   675 			CLTRACE("TRegisterValue::Serialize serialization size error");	
       
   676 			return KErrCorrupt;
       
   677 			}
       
   678 		
       
   679 		return KErrNone;
       
   680 		}
       
   681 	
       
   682 	/**
       
   683 	 * Reads the classes data from the specified byte stream
       
   684 	 * @param aReader Byte stream to use
       
   685 	 * @return One of the OS wide codes
       
   686 	 */	 
       
   687 	TInt TRegisterValue::Deserialize(TByteStreamReader& aReader)
       
   688 		{
       
   689 		TInt startPos = aReader.CurrentPosition();
       
   690 		
       
   691 		iId = (SCMStructId)aReader.ReadInt();
       
   692 		if(iId != ESCMRegisterValue)
       
   693 			{
       
   694 			CLTRACE("TRegisterValue::Deserialize() ERROR Corrupt ID");			
       
   695 			return KErrCorrupt;
       
   696 			}
       
   697 		
       
   698 		iVersion = (TRegisterValueVersion)aReader.ReadShort();			// 2
       
   699 
       
   700 		if(iVersion == ERegisterValueVersion1)
       
   701 			{
       
   702 			// read data v1 format	
       
   703 			iOwnId = aReader.ReadInt64();		 				// 8
       
   704 			iType = aReader.ReadInt();  						// 4
       
   705 			iClass = aReader.ReadByte();						// 1
       
   706 			iSubId = aReader.ReadShort();						// 2
       
   707 			iSize = aReader.ReadByte();							// 1
       
   708 			
       
   709 			//variant for union
       
   710 			if(iSize == 0)
       
   711 				{
       
   712 				iValue8 = aReader.ReadByte();				
       
   713 				}
       
   714 			else if(iSize == 1)
       
   715 				{
       
   716 				iValue16 = aReader.ReadShort();				
       
   717 				}
       
   718 			else if(iSize == 2)
       
   719 				{
       
   720 				iValue32 = aReader.ReadInt();
       
   721 				}
       
   722 			else if(iSize == 3)
       
   723 				{
       
   724 				iValue64 = aReader.ReadInt64();
       
   725 				}
       
   726 			else
       
   727 				{
       
   728 				CLTRACE("TRegisterValue::Serialize() Corrupt size");
       
   729 				return KErrCorrupt;
       
   730 				}
       
   731 			}
       
   732 		else
       
   733 			{
       
   734 			iId = ESCMLast;	//unrecognised header
       
   735 			CLTRACE("TRegisterValue::Deserialize Unsupported version");
       
   736 			return KErrCorrupt;
       
   737 			}
       
   738 		
       
   739 		TInt endPos = aReader.CurrentPosition();
       
   740 		if( endPos - startPos != GetSize())
       
   741 			{
       
   742 			iId = ESCMLast;	//unrecognised header
       
   743 			
       
   744 			// error between actual size & real size in data
       
   745 			CLTRACE("TRegisterValue::Deserialize serialization size error");	
       
   746 			return KErrCorrupt;
       
   747 			}
       
   748 		
       
   749 		return KErrNone;
       
   750 		}
       
   751 	
       
   752 	/**
       
   753 	 * TRegisterSet implementation
       
   754 	 * @internal technology
       
   755 	 */
       
   756 	
       
   757 	/**
       
   758 	 * TRegisterSet Constructor
       
   759 	 */
       
   760 	TRegisterSet::TRegisterSet():
       
   761 		iVersion(ETRegisterSetVersion1),
       
   762 		iId(ESCMRegisterSet),		
       
   763 		iNumRegisters(0)
       
   764 		{
       
   765 
       
   766 		}
       
   767 	
       
   768 	/**
       
   769 	 * Returns the externalised size of this class
       
   770 	 * @return TInt size
       
   771 	 */
       
   772 	TInt TRegisterSet::GetSize() const
       
   773 		{
       
   774 		if(iVersion == ETRegisterSetVersion1)
       
   775 			{
       
   776 			return 10;
       
   777 			}
       
   778 		else
       
   779 			{
       
   780 			CLTRACE("TRegisterSet::GetSize Unsupported version");			
       
   781 			return KErrNotSupported;		
       
   782 			}
       
   783 		}
       
   784 	
       
   785 	/**
       
   786 	 * Writes this classes data to the specified byte stream
       
   787 	 * @param aWriter byte stream to use
       
   788 	 * @return One of the OS wide codes
       
   789 	 */
       
   790 	TInt TRegisterSet::Serialize(TByteStreamWriter& aWriter)
       
   791 		{
       
   792 		TInt startPos = aWriter.CurrentPosition();
       
   793 				
       
   794 		// ID saved first
       
   795 		if(iId != ESCMRegisterSet)
       
   796 			{
       
   797 			CLTRACE("TRegisterSet::Serialize Error - Corrupt ID");
       
   798 			return KErrCorrupt;
       
   799 			}
       
   800 		
       
   801 		aWriter.WriteInt(iId);							// 4
       
   802 		aWriter.WriteShort((TUint16) iVersion);			// 2
       
   803 
       
   804 		if(iVersion == ETRegisterSetVersion1)
       
   805 			{
       
   806 			// write data v1 format
       
   807 			aWriter.WriteInt(iNumRegisters);				// 4
       
   808 			}
       
   809 		else
       
   810 			{
       
   811 			CLTRACE("TRegisterSet::Serialize Unsupported version");
       
   812 			return KErrCorrupt;
       
   813 			}
       
   814 		
       
   815 		TInt endPos = aWriter.CurrentPosition();
       
   816 		if( endPos - startPos != GetSize())
       
   817 			{
       
   818 			// error between actual size & real size in data
       
   819 			CLTRACE("TRegisterSet::Serialize serialization size error");
       
   820 			return KErrCorrupt;
       
   821 			}
       
   822 		
       
   823 		return KErrNone;
       
   824 		}
       
   825 	
       
   826 	/**
       
   827 	 * Reads the classes data from the specified byte stream
       
   828 	 * @param aReader Byte stream to use
       
   829 	 * @return One of the OS wide codes
       
   830 	 */
       
   831 	TInt TRegisterSet::Deserialize(TByteStreamReader& aReader)
       
   832 		{
       
   833 		TInt startPos = aReader.CurrentPosition();
       
   834 		
       
   835 		iId = (SCMStructId)aReader.ReadInt();
       
   836 		if(iId != ESCMRegisterSet)
       
   837 			{
       
   838 			CLTRACE("TRegisterSet::Deserialize() ERROR Corrupt ID");			
       
   839 			return KErrCorrupt;
       
   840 			}
       
   841 		
       
   842 		iVersion = (TRegisterSetVersion)aReader.ReadShort();			// 2
       
   843 
       
   844 		if(iVersion == ETRegisterSetVersion1)
       
   845 			{
       
   846 			// read data v1 format	
       
   847 			iNumRegisters = aReader.ReadInt();		 				// 8
       
   848 			}
       
   849 		else
       
   850 			{
       
   851 			iId = ESCMLast;	//unrecognised header
       
   852 			CLTRACE("TRegisterSet::Deserialize Unsupported version");
       
   853 			return KErrCorrupt;
       
   854 			}
       
   855 		
       
   856 		TInt endPos = aReader.CurrentPosition();
       
   857 		if( endPos - startPos != GetSize())
       
   858 			{
       
   859 			iId = ESCMLast;	//unrecognised header
       
   860 			
       
   861 			// error between actual size & real size in data
       
   862 			CLTRACE("TRegisterSet::Deserialize serialization size error");	
       
   863 			return KErrCorrupt;
       
   864 			}
       
   865 		return KErrNone;
       
   866 		}
       
   867 	
       
   868 	/**
       
   869 	 * TCodeSegmentSet implementation
       
   870 	 * @internal technology
       
   871 	 */
       
   872 	
       
   873 	/**
       
   874 	 * TCodeSegmentSet Constructor
       
   875 	 */
       
   876 	TCodeSegmentSet::TCodeSegmentSet():
       
   877 		iId(ESCMCodeSegSet),
       
   878 		iVersion(ETCodeSegmentSetVersion1),
       
   879 		iNumSegs(0),
       
   880 		iPid(0)		
       
   881 		{
       
   882 		}
       
   883 	
       
   884 	/**
       
   885 	 * Returns the externalised size of this class
       
   886 	 * @return TInt size
       
   887 	 */
       
   888 	TInt TCodeSegmentSet::GetSize() const
       
   889 		{
       
   890 		if(iVersion == ETCodeSegmentSetVersion1)
       
   891 			{
       
   892 			return 18;
       
   893 			}
       
   894 		else
       
   895 			{
       
   896 			CLTRACE("TCodeSegmentSet::GetSize Unsupported version");			
       
   897 			return KErrNotSupported;		
       
   898 			}
       
   899 		}
       
   900 	
       
   901 	/**
       
   902 	 * This returns the largest size this class can be
       
   903 	 */
       
   904 	TInt TCodeSegmentSet::GetMaxSize() const
       
   905 		{
       
   906 		return 18;
       
   907 		}
       
   908 	
       
   909 	/**
       
   910 	 * Writes this classes data to the specified byte stream
       
   911 	 * @param aWriter byte stream to use
       
   912 	 * @return One of the OS wide codes
       
   913 	 */
       
   914 	TInt TCodeSegmentSet::Serialize(TByteStreamWriter& aWriter)
       
   915 		{
       
   916 		TInt startPos = aWriter.CurrentPosition();
       
   917 				
       
   918 		// ID saved first
       
   919 		if(iId != ESCMCodeSegSet)
       
   920 			{
       
   921 			CLTRACE("TCodeSegmentSet::Serialize Error - Corrupt ID");
       
   922 			return KErrCorrupt;
       
   923 			}
       
   924 		
       
   925 		aWriter.WriteInt(iId);							// 4
       
   926 		if(iId != ESCMCodeSegSet)
       
   927 			{
       
   928 			CLTRACE("TCodeSegmentSet::Serialize Corrupt ID");
       
   929 			return KErrCorrupt;
       
   930 			}
       
   931 		
       
   932 		aWriter.WriteShort((TUint16) iVersion);			// 2
       
   933 
       
   934 		if(iVersion == ETCodeSegmentSetVersion1)
       
   935 			{
       
   936 			// write data v1 format
       
   937 			aWriter.WriteInt(iNumSegs);				// 4
       
   938 			aWriter.WriteInt64(iPid);				// 8
       
   939 			}
       
   940 		else
       
   941 			{
       
   942 			CLTRACE("TCodeSegmentSet::Serialize Unsupported version");
       
   943 			return KErrCorrupt;
       
   944 			}
       
   945 		
       
   946 		TInt endPos = aWriter.CurrentPosition();
       
   947 		if( endPos - startPos != GetSize())
       
   948 			{
       
   949 			// error between actual size & real size in data
       
   950 			CLTRACE("TCodeSegmentSet::Serialize serialization size error");	
       
   951 			return KErrCorrupt;
       
   952 			}
       
   953 		return KErrNone;
       
   954 		}
       
   955 	
       
   956 	/**
       
   957 	 * Reads the classes data from the specified byte stream
       
   958 	 * @param aReader Byte stream to use
       
   959 	 * @return One of the OS wide codes
       
   960 	 */
       
   961 	TInt TCodeSegmentSet::Deserialize(TByteStreamReader& aReader)
       
   962 		{
       
   963 		TInt startPos = aReader.CurrentPosition();
       
   964 		
       
   965 		iId = (SCMStructId)aReader.ReadInt();
       
   966 		if(iId != ESCMCodeSegSet)
       
   967 			{
       
   968 			CLTRACE("TCodeSegmentSet::Deserialize() ERROR Corrupt ID");			
       
   969 			return KErrCorrupt;
       
   970 			}
       
   971 		
       
   972 		iVersion = (TCodeSegmentSetVersion)aReader.ReadShort();			// 2
       
   973 
       
   974 		if(iVersion == ETCodeSegmentSetVersion1)
       
   975 			{
       
   976 			// read data v1 format	
       
   977 			iNumSegs = aReader.ReadInt();    				// 4
       
   978 			iPid = aReader.ReadInt64();		 				// 8
       
   979 			}
       
   980 		else
       
   981 			{
       
   982 			iId = ESCMLast;	//unrecognised header
       
   983 			CLTRACE("TRegisterSet::Deserialize Unsupported version");
       
   984 			return KErrCorrupt;
       
   985 			}
       
   986 		
       
   987 		TInt endPos = aReader.CurrentPosition();
       
   988 		if( endPos - startPos != GetSize())
       
   989 			{
       
   990 			iId = ESCMLast;	//unrecognised header
       
   991 			
       
   992 			// error between actual size & real size in data
       
   993 			CLTRACE("TRegisterSet::Deserialize serialization size error");	
       
   994 			return KErrCorrupt;
       
   995 			}
       
   996 		
       
   997 		return KErrNone;
       
   998 		}	
       
   999 	
       
  1000 	
       
  1001 	/**
       
  1002 	 * TCodeSegment implementation
       
  1003 	 * @internal technology
       
  1004 	 */
       
  1005 	
       
  1006 	/**
       
  1007 	 * TCodeSegment constructor
       
  1008 	 */
       
  1009 	TCodeSegment::TCodeSegment():
       
  1010 		iId(ESCMCodeSeg),
       
  1011 		iVersion(ETCodeSegmentVersion1),			
       
  1012 		iCodeSegType(EUnknownCodeSegType),		
       
  1013 		iXip(0),					
       
  1014 		iNameLength(0)		
       
  1015 		{
       
  1016 		}
       
  1017 
       
  1018 	/**
       
  1019 	 * Writes this classes data to the specified byte stream
       
  1020 	 * @param aWriter byte stream to use
       
  1021 	 * @return One of the OS wide codes
       
  1022 	 */
       
  1023 	TInt TCodeSegment::Serialize(TByteStreamWriter& aWriter)
       
  1024 		{	
       
  1025 		TInt startPos = aWriter.CurrentPosition();
       
  1026 		
       
  1027 		// ID saved first 
       
  1028 		aWriter.WriteInt(iId);		 				// 4		
       
  1029 		if(iId != ESCMCodeSeg)
       
  1030 			{
       
  1031 			CLTRACE("TCodeSegment::Serialize Error - Corrupt ID");
       
  1032 			return KErrCorrupt;
       
  1033 			}
       
  1034 		
       
  1035 		aWriter.WriteShort((TUint16) iVersion);			// 2
       
  1036 
       
  1037 		if(iVersion == ETCodeSegmentVersion1)
       
  1038 			{
       
  1039 			// write data v1 format
       
  1040 			aWriter.WriteInt(iCodeSegType);
       
  1041 			aWriter.WriteInt(iCodeSegMemInfo.iCodeBase);
       
  1042 			aWriter.WriteInt(iCodeSegMemInfo.iCodeSize);
       
  1043 			aWriter.WriteInt(iCodeSegMemInfo.iConstDataBase);
       
  1044 			aWriter.WriteInt(iCodeSegMemInfo.iConstDataSize);
       
  1045 			aWriter.WriteInt(iCodeSegMemInfo.iInitialisedDataBase);
       
  1046 			aWriter.WriteInt(iCodeSegMemInfo.iInitialisedDataSize);
       
  1047 			aWriter.WriteInt(iCodeSegMemInfo.iUninitialisedDataBase);
       
  1048 			aWriter.WriteInt(iCodeSegMemInfo.iUninitialisedDataSize);
       
  1049 			aWriter.WriteInt(iXip);
       
  1050 			
       
  1051 			if(iName.Ptr())
       
  1052 				{
       
  1053 				aWriter.WriteInt(iName.Length());	// 4		
       
  1054 				for(TInt cnt = 0; cnt < iName.Length(); cnt++)
       
  1055 					{
       
  1056 					aWriter.WriteByte(iName[cnt]);  //iCategorySize bytes
       
  1057 					}
       
  1058 				}
       
  1059 			else
       
  1060 				{
       
  1061 				aWriter.WriteInt(0);
       
  1062 				}
       
  1063 			}
       
  1064 		else
       
  1065 			{
       
  1066 			CLTRACE("TCodeSegment::Serialize Unsupported version");
       
  1067 			return KErrCorrupt;
       
  1068 			}
       
  1069 		
       
  1070 		TInt endPos = aWriter.CurrentPosition();
       
  1071 		if( endPos - startPos != GetSize())
       
  1072 			{
       
  1073 			// error between actual size & real size in data
       
  1074 			CLTRACE2("TCodeSegment::Serialize serialization size error. Wrote [%d] but expected [%d]", endPos - startPos, GetSize());
       
  1075 			return KErrCorrupt;
       
  1076 			}
       
  1077 		return KErrNone;
       
  1078 		}
       
  1079 	
       
  1080 	/**
       
  1081 	 * Reads the classes data from the specified byte stream
       
  1082 	 * @param aReader Byte stream to use
       
  1083 	 * @return One of the OS wide codes
       
  1084 	 */
       
  1085 	TInt TCodeSegment::Deserialize(TByteStreamReader& aReader)	
       
  1086 		{
       
  1087 		TInt startPos = aReader.CurrentPosition();
       
  1088 		
       
  1089 		iId = (SCMStructId)aReader.ReadInt();
       
  1090 		if(iId != ESCMCodeSeg)
       
  1091 			{
       
  1092 			CLTRACE("TCodeSegment::Deserialize Corrupt ID");
       
  1093 			return KErrCorrupt;
       
  1094 			}
       
  1095 		
       
  1096 		iVersion = (TCodeSegmentVersion)aReader.ReadShort();			// 2
       
  1097 
       
  1098 		if(iVersion == ETCodeSegmentVersion1)
       
  1099 			{
       
  1100 			// read data v1 format			
       
  1101 			iCodeSegType = (TCodeSegType)aReader.ReadInt();
       
  1102 			iCodeSegMemInfo.iCodeBase = aReader.ReadInt();
       
  1103 			iCodeSegMemInfo.iCodeSize = aReader.ReadInt();
       
  1104 			iCodeSegMemInfo.iConstDataBase = aReader.ReadInt();
       
  1105 			iCodeSegMemInfo.iConstDataSize = aReader.ReadInt();
       
  1106 			iCodeSegMemInfo.iInitialisedDataBase = aReader.ReadInt();
       
  1107 			iCodeSegMemInfo.iInitialisedDataSize = aReader.ReadInt();
       
  1108 			iCodeSegMemInfo.iUninitialisedDataBase = aReader.ReadInt();
       
  1109 			iCodeSegMemInfo.iUninitialisedDataSize = aReader.ReadInt();
       
  1110 			iXip = aReader.ReadInt();
       
  1111 			iNameLength = aReader.ReadInt(); 				// 4
       
  1112 			
       
  1113 			if(iName.Ptr() && iName.MaxLength() >= iNameLength)
       
  1114 				{
       
  1115 				iName.SetLength(0);
       
  1116 				
       
  1117 				for(TInt cnt = 0; cnt < iNameLength; cnt++)
       
  1118 					{
       
  1119 					iName.Append(aReader.ReadByte());		//iCategorySize bytes
       
  1120 					} 
       
  1121 				}
       
  1122 			}
       
  1123 		else
       
  1124 			{
       
  1125 			iId = ESCMLast;	//unrecognised header
       
  1126 			CLTRACE("TCodeSegment::Deserialize Unsupported version");
       
  1127 			return KErrCorrupt;
       
  1128 			}
       
  1129 		
       
  1130 		TInt endPos = aReader.CurrentPosition();
       
  1131 		if( endPos - startPos != GetSize())
       
  1132 			{					
       
  1133 			// error between actual size & real size in data
       
  1134 			CLTRACE2("TCodeSegment::Deserialize serialization size error. Read [%d] but expected [%d]", endPos - startPos, GetSize());			
       
  1135 			iId = ESCMLast;	//unrecognised header
       
  1136 			
       
  1137 			return KErrCorrupt;
       
  1138 			}
       
  1139 		return KErrNone;
       
  1140 		}
       
  1141 	
       
  1142 	/**
       
  1143 	 * Returns the externalised size of this class
       
  1144 	 * @return TInt size
       
  1145 	 */
       
  1146 	TInt TCodeSegment::GetSize() const
       
  1147 		{
       
  1148 		if(iVersion == ETCodeSegmentVersion1)
       
  1149 			{
       
  1150 			return 50 + iName.Length();
       
  1151 			}
       
  1152 		else
       
  1153 			{
       
  1154 			CLTRACE("TCodeSegment::GetSize Unsupported version");			
       
  1155 			return KErrNotSupported;		
       
  1156 			}
       
  1157 		}
       
  1158 	
       
  1159 	/**
       
  1160 	 * This returns the largest size this class can be
       
  1161 	 */
       
  1162 	TInt TCodeSegment::GetMaxSize() const
       
  1163 		{
       
  1164 		return 50 + KMaxSegmentNameSize;
       
  1165 		}
       
  1166 	/**
       
  1167 	 * TRawData implementation
       
  1168 	 * @internal technology
       
  1169 	 */
       
  1170 	
       
  1171 	/**
       
  1172 	 * TRawData constructor
       
  1173 	 */
       
  1174 	TRawData::TRawData():		
       
  1175 		iId(ESCMRawData),
       
  1176 		iVersion(ETRawData1),	
       
  1177 		iLength(0),
       
  1178 		iData(NULL, 0)
       
  1179 		{	
       
  1180 		}
       
  1181 
       
  1182 	/**
       
  1183 	 * Writes this classes data to the specified byte stream
       
  1184 	 * @param aWriter byte stream to use
       
  1185 	 * @return One of the OS wide codes
       
  1186 	 */
       
  1187 	TInt TRawData::Serialize(TByteStreamWriter& aWriter)
       
  1188 		{	
       
  1189 		TInt startPos = aWriter.CurrentPosition();
       
  1190 		
       
  1191 		// ID saved first 
       
  1192 		aWriter.WriteInt(iId);		 							// 4		
       
  1193 		if(iId != ESCMRawData)
       
  1194 			{
       
  1195 			CLTRACE("TRawData::Serialize Corrupt ID");
       
  1196 			return KErrCorrupt;
       
  1197 			}
       
  1198 		
       
  1199 		aWriter.WriteShort((TUint16) iVersion);					// 2
       
  1200 
       
  1201 		if(iVersion == ETRawData1)
       
  1202 			{	
       
  1203 			if(iData.Ptr())
       
  1204 				{
       
  1205 				aWriter.WriteInt(iData.Length());				// 4
       
  1206 				iLength = iData.Length();
       
  1207 				
       
  1208 				for(TInt cnt = 0; cnt < iData.Length(); cnt++)
       
  1209 					{
       
  1210 					//Kern::Printf("cnt = %d \t\t\t0x%X", cnt, cnt);
       
  1211 					aWriter.WriteByte(iData[cnt]);  			//iLength bytes
       
  1212 					}
       
  1213 				}
       
  1214 			else
       
  1215 				{
       
  1216 				aWriter.WriteInt(0);
       
  1217 				}
       
  1218 			}
       
  1219 		else
       
  1220 			{
       
  1221 			CLTRACE("TRawData::Serialize Unsupported version");
       
  1222 			return KErrCorrupt;
       
  1223 			}
       
  1224 		
       
  1225 		TInt endPos = aWriter.CurrentPosition();
       
  1226 		if( endPos - startPos != GetSize())
       
  1227 			{
       
  1228 			// error between actual size & real size in data
       
  1229 			CLTRACE2("TRawData::Serialize serialization size error. Wrote [%d] but expected [%d]", endPos - startPos, GetSize());
       
  1230 			return KErrCorrupt;
       
  1231 			}
       
  1232 		return KErrNone;
       
  1233 		}
       
  1234 	
       
  1235 	/**
       
  1236 	 * Reads the classes data from the specified byte stream
       
  1237 	 * @param aReader Byte stream to use
       
  1238 	 * @return One of the OS wide codes
       
  1239 	 */
       
  1240 	TInt TRawData::Deserialize(TByteStreamReader& aReader)	
       
  1241 		{
       
  1242 		TInt startPos = aReader.CurrentPosition();
       
  1243 		
       
  1244 		iId = (SCMStructId)aReader.ReadInt();						// 4
       
  1245 		if(iId != ESCMRawData)
       
  1246 			{
       
  1247 			CLTRACE("TRawData::Deserialize Corrupt ID");
       
  1248 			return KErrCorrupt;
       
  1249 			}
       
  1250 		
       
  1251 		iVersion = (TTRawDataVersion)aReader.ReadShort();			// 2
       
  1252 
       
  1253 		if(iVersion == ETRawData1)
       
  1254 			{
       
  1255 			iLength = aReader.ReadInt(); 							// 4			
       
  1256 			
       
  1257 			if(iData.Ptr())
       
  1258 				{
       
  1259 				//Deserialise as much as we can into this buffer - it may be that the caller doesnt want all of it
       
  1260 				iData.SetLength(0);
       
  1261 				TUint amtToRead = (iData.MaxLength() >= iLength) ? iLength : iData.MaxLength();
       
  1262 				
       
  1263 				for(TUint cnt = 0; cnt < amtToRead; cnt++)
       
  1264 					{
       
  1265 					iData.Append(aReader.ReadByte());		//iCategorySize bytes
       
  1266 					} 
       
  1267 				
       
  1268 				//move reader along what we havent read
       
  1269 				aReader.SetPosition(aReader.CurrentPosition() + (iLength - amtToRead));
       
  1270 				}
       
  1271 			else
       
  1272 				{
       
  1273 				aReader.SetPosition(aReader.CurrentPosition() + iLength);
       
  1274 				}
       
  1275 			}
       
  1276 		else
       
  1277 			{
       
  1278 			iId = ESCMLast;	//unrecognised header
       
  1279 			CLTRACE("TRawData::Deserialize Unsupported version");
       
  1280 			return KErrCorrupt;
       
  1281 			}
       
  1282 		
       
  1283 		TInt endPos = aReader.CurrentPosition();
       
  1284 		if( endPos - startPos != GetSize())
       
  1285 			{					
       
  1286 			// error between actual size & real size in data
       
  1287 			CLTRACE2("TRawData::Deserialize serialization size error. Read [%d] but expected [%d]", endPos - startPos, GetSize());			
       
  1288 			iId = ESCMLast;	//unrecognised header
       
  1289 			
       
  1290 			return KErrCorrupt;
       
  1291 			}
       
  1292 		return KErrNone;
       
  1293 		}
       
  1294 	
       
  1295 	/**
       
  1296 	 * Same as Deserialise except it only starts copying data into the buffer
       
  1297 	 * when it reaches aStartPos bytes into the data
       
  1298 	 * @param aStartPos
       
  1299 	 * @param aReader
       
  1300 	 * @return
       
  1301 	 */
       
  1302 	TInt TRawData::Deserialize(TInt aStartPos, TByteStreamReader& aReader)
       
  1303 		{
       
  1304 		TInt startPos = aReader.CurrentPosition();
       
  1305 		
       
  1306 		iId = (SCMStructId)aReader.ReadInt();						// 4
       
  1307 		if(iId != ESCMRawData)
       
  1308 			{
       
  1309 			CLTRACE("TRawData::Deserialize Corrupt ID");
       
  1310 			return KErrCorrupt;
       
  1311 			}
       
  1312 		
       
  1313 		iVersion = (TTRawDataVersion)aReader.ReadShort();			// 2
       
  1314 
       
  1315 		if(iVersion == ETRawData1)
       
  1316 			{
       
  1317 			iLength = aReader.ReadInt(); 							// 4			
       
  1318 			
       
  1319 			if(iData.Ptr())
       
  1320 				{
       
  1321 				//Deserialise as much as we can into this buffer - it may be that the caller doesnt want all of it
       
  1322 				iData.SetLength(0);
       
  1323 				aReader.SetPosition(aReader.CurrentPosition() + aStartPos);
       
  1324 				
       
  1325 				TUint amtToRead = (iData.MaxLength() >= iLength) ? iLength : iData.MaxLength();
       
  1326 				
       
  1327 				for(TUint cnt = 0; cnt < amtToRead; cnt++)
       
  1328 					{
       
  1329 					iData.Append(aReader.ReadByte());		//iCategorySize bytes
       
  1330 					} 
       
  1331 				
       
  1332 				//move reader along what we havent read
       
  1333 				aReader.SetPosition(aReader.CurrentPosition() + (iLength - (amtToRead + aStartPos)));
       
  1334 				}
       
  1335 			else
       
  1336 				{
       
  1337 				aReader.SetPosition(aReader.CurrentPosition() + iLength);
       
  1338 				}
       
  1339 			}
       
  1340 		else
       
  1341 			{
       
  1342 			iId = ESCMLast;	//unrecognised header
       
  1343 			CLTRACE("TRawData::Deserialize Unsupported version");
       
  1344 			return KErrCorrupt;
       
  1345 			}
       
  1346 		
       
  1347 		TInt endPos = aReader.CurrentPosition();
       
  1348 		if( endPos - startPos != GetSize())
       
  1349 			{					
       
  1350 			// error between actual size & real size in data
       
  1351 			CLTRACE2("TRawData::Deserialize serialization size error. Read [%d] but expected [%d]", endPos - startPos, GetSize());			
       
  1352 			iId = ESCMLast;	//unrecognised header
       
  1353 			
       
  1354 			return KErrCorrupt;
       
  1355 			}
       
  1356 		return KErrNone;
       
  1357 		}
       
  1358 	
       
  1359 	/**
       
  1360 	 * Returns the externalised size of this class
       
  1361 	 * @return TInt size
       
  1362 	 */
       
  1363 	TInt TRawData::GetSize() const
       
  1364 		{
       
  1365 		if(iVersion == ETRawData1)
       
  1366 			{
       
  1367 			return 10 + iLength;
       
  1368 			}
       
  1369 		else
       
  1370 			{
       
  1371 			CLTRACE("TRawData::GetSize Unsupported version");			
       
  1372 			return KErrNotSupported;		
       
  1373 			}
       
  1374 		}
       
  1375 	
       
  1376 	
       
  1377 	/**
       
  1378 	 * TMemoryDump implementation
       
  1379 	 * @internal technology
       
  1380 	 */
       
  1381 	
       
  1382 	/**
       
  1383 	 * TMemoryDump Constructor
       
  1384 	 */
       
  1385 	TMemoryDump::TMemoryDump():
       
  1386 		iId(ESCMMemory),
       
  1387 		iVersion(EMemDumpVersion1),		
       
  1388 		iStartAddress(0),
       
  1389 		iPid(0),
       
  1390 		iLength(0)
       
  1391 		{
       
  1392 		}
       
  1393 	
       
  1394 	/**
       
  1395 	 * Returns the externalised size of this class
       
  1396 	 * @return TInt size
       
  1397 	 */
       
  1398 	TInt TMemoryDump::GetSize() const
       
  1399 		{
       
  1400 		if(iVersion == EMemDumpVersion1)
       
  1401 			{
       
  1402 			return 22;
       
  1403 			}
       
  1404 		else
       
  1405 			{
       
  1406 			CLTRACE("TMemoryDump::GetSize Unsupported version");			
       
  1407 			return KErrNotSupported;		
       
  1408 			}
       
  1409 		}
       
  1410 	
       
  1411 	/**
       
  1412 	 * Writes this classes data to the specified byte stream
       
  1413 	 * @param aWriter byte stream to use
       
  1414 	 * @return One of the OS wide codes
       
  1415 	 */
       
  1416 	TInt TMemoryDump::Serialize(TByteStreamWriter& aWriter)
       
  1417 		{
       
  1418 		TInt startPos = aWriter.CurrentPosition();
       
  1419 				
       
  1420 		// ID saved first		
       
  1421 		aWriter.WriteInt(iId);								// 4
       
  1422 		if(iId != ESCMMemory)
       
  1423 			{
       
  1424 			CLTRACE("TMemoryDump::Serialize Error - Corrupt ID");
       
  1425 			return KErrCorrupt;
       
  1426 			}
       
  1427 		
       
  1428 		aWriter.WriteShort((TUint16) iVersion);				// 2
       
  1429 
       
  1430 		if(iVersion == EMemDumpVersion1)
       
  1431 			{
       
  1432 			// write data v1 format
       
  1433 			aWriter.WriteInt(iStartAddress);				// 4
       
  1434 			aWriter.WriteInt64(iPid);						// 8
       
  1435 			aWriter.WriteInt(iLength);						// 4
       
  1436 			}
       
  1437 		else
       
  1438 			{
       
  1439 			CLTRACE("TMemoryDump::Serialize Unsupported version");
       
  1440 			return KErrCorrupt;
       
  1441 			}
       
  1442 		
       
  1443 		TInt endPos = aWriter.CurrentPosition();
       
  1444 		if( endPos - startPos != GetSize())
       
  1445 			{
       
  1446 			// error between actual size & real size in data
       
  1447 			CLTRACE("TMemoryDump::Serialize serialization size error");	
       
  1448 			return KErrCorrupt;
       
  1449 			}
       
  1450 		return KErrNone;
       
  1451 		}
       
  1452 	
       
  1453 	/**
       
  1454 	 * Reads the classes data from the specified byte stream
       
  1455 	 * @param aReader Byte stream to use
       
  1456 	 * @return One of the OS wide codes
       
  1457 	 */
       
  1458 	TInt TMemoryDump::Deserialize(TByteStreamReader& aReader)
       
  1459 		{
       
  1460 		TInt startPos = aReader.CurrentPosition();
       
  1461 		
       
  1462 		iId = (SCMStructId)aReader.ReadInt();										// 4
       
  1463 		if(iId != ESCMMemory)
       
  1464 			{
       
  1465 			CLTRACE("TMemoryDump::Deserialize() ERROR Corrupt ID");			
       
  1466 			return KErrCorrupt;
       
  1467 			}
       
  1468 		
       
  1469 		iVersion = (TMemDumpVersionVersion)aReader.ReadShort();			// 2
       
  1470 
       
  1471 		if(iVersion == EMemDumpVersion1)
       
  1472 			{
       
  1473 			// read data v1 format	
       
  1474 			iStartAddress = aReader.ReadInt();    						// 4
       
  1475 			iPid = aReader.ReadInt64();		 							// 8
       
  1476 			iLength = aReader.ReadInt();								// 4
       
  1477 			}
       
  1478 		else
       
  1479 			{
       
  1480 			iId = ESCMLast;	//unrecognised header
       
  1481 			CLTRACE("TMemoryDump::Deserialize Unsupported version");
       
  1482 			return KErrCorrupt;
       
  1483 			}
       
  1484 		
       
  1485 		TInt endPos = aReader.CurrentPosition();
       
  1486 		if( endPos - startPos != GetSize())
       
  1487 			{
       
  1488 			iId = ESCMLast;	//unrecognised header
       
  1489 			
       
  1490 			// error between actual size & real size in data
       
  1491 			CLTRACE("TMemoryDump::Deserialize serialization size error");	
       
  1492 			return KErrCorrupt;
       
  1493 			}
       
  1494 		
       
  1495 		return KErrNone;
       
  1496 		}	
       
  1497 	
       
  1498 	/**
       
  1499 	 * TTraceDump implementation
       
  1500 	 * @internal technology
       
  1501 	 */
       
  1502 	
       
  1503 	/**
       
  1504 	 * TTraceDump Constructor
       
  1505 	 */
       
  1506 	TTraceDump::TTraceDump():
       
  1507 		iId(ESCMTraceData),
       
  1508 		iVersion(ETraceDumpVersion1),
       
  1509 		iSizeOfMemory(0),
       
  1510 		iNumberOfParts(0)
       
  1511 		{
       
  1512 		}
       
  1513 	
       
  1514 	/**
       
  1515 	 * Returns the externalised size of this class
       
  1516 	 * @return TInt size
       
  1517 	 */
       
  1518 	TInt TTraceDump::GetSize() const
       
  1519 		{
       
  1520 		if(iVersion == ETraceDumpVersion1)
       
  1521 			{
       
  1522 			return 14;
       
  1523 			}
       
  1524 		else
       
  1525 			{
       
  1526 			CLTRACE("TTraceDump::GetSize Unsupported version");			
       
  1527 			return KErrNotSupported;		
       
  1528 			}
       
  1529 		}
       
  1530 	
       
  1531 	/**
       
  1532 	 * Writes this classes data to the specified byte stream
       
  1533 	 * @param aWriter byte stream to use
       
  1534 	 * @return One of the OS wide codes
       
  1535 	 */
       
  1536 	TInt TTraceDump::Serialize(TByteStreamWriter& aWriter)
       
  1537 		{
       
  1538 		TInt startPos = aWriter.CurrentPosition();
       
  1539 				
       
  1540 		// ID saved first		
       
  1541 		aWriter.WriteInt(iId);								// 4
       
  1542 		if(iId != ESCMTraceData)
       
  1543 			{
       
  1544 			CLTRACE("TTraceDump::Serialize Error - Corrupt ID");
       
  1545 			return KErrCorrupt;
       
  1546 			}
       
  1547 		
       
  1548 		aWriter.WriteShort((TUint16) iVersion);				// 2
       
  1549 
       
  1550 		if(iVersion == ETraceDumpVersion1)
       
  1551 			{
       
  1552 			// write data v1 format
       
  1553 			aWriter.WriteInt(iSizeOfMemory);				// 4
       
  1554 			aWriter.WriteInt(iNumberOfParts);				// 4
       
  1555 			}
       
  1556 		else
       
  1557 			{
       
  1558 			CLTRACE("TTraceDump::Serialize Unsupported version");
       
  1559 			return KErrCorrupt;
       
  1560 			}
       
  1561 		
       
  1562 		TInt endPos = aWriter.CurrentPosition();
       
  1563 		if( endPos - startPos != GetSize())
       
  1564 			{
       
  1565 			// error between actual size & real size in data
       
  1566 			CLTRACE("TTraceDump::Serialize serialization size error");	
       
  1567 			return KErrCorrupt;
       
  1568 			}
       
  1569 		return KErrNone;
       
  1570 		}
       
  1571 	
       
  1572 	/**
       
  1573 	 * Reads the classes data from the specified byte stream
       
  1574 	 * @param aReader Byte stream to use
       
  1575 	 * @return One of the OS wide codes
       
  1576 	 */
       
  1577 	TInt TTraceDump::Deserialize(TByteStreamReader& aReader)
       
  1578 		{
       
  1579 		TInt startPos = aReader.CurrentPosition();
       
  1580 		
       
  1581 		iId = (SCMStructId)aReader.ReadInt();										// 4
       
  1582 		if(iId != ESCMTraceData)
       
  1583 			{
       
  1584 			CLTRACE("TTraceDump::Deserialize() Error: Corrupt ID");			
       
  1585 			return KErrCorrupt;
       
  1586 			}
       
  1587 		
       
  1588 		iVersion = (TTraceDumpVersion)aReader.ReadShort();			// 2
       
  1589 
       
  1590 		if(iVersion == ETraceDumpVersion1)
       
  1591 			{
       
  1592 			// read data v1 format	
       
  1593 			iSizeOfMemory = aReader.ReadInt();    						// 4
       
  1594 			iNumberOfParts = aReader.ReadInt();    						// 4
       
  1595 			
       
  1596 			}
       
  1597 		else
       
  1598 			{
       
  1599 			iId = ESCMLast;	//unrecognised header
       
  1600 			CLTRACE("TTraceDump::Deserialize Unsupported version");
       
  1601 			return KErrCorrupt;
       
  1602 			}
       
  1603 		
       
  1604 		TInt endPos = aReader.CurrentPosition();
       
  1605 		if( endPos - startPos != GetSize())
       
  1606 			{
       
  1607 			iId = ESCMLast;	//unrecognised header
       
  1608 			
       
  1609 			// error between actual size & real size in data
       
  1610 			CLTRACE("TTraceDump::Deserialize serialization size error");	
       
  1611 			return KErrCorrupt;
       
  1612 			}
       
  1613 		
       
  1614 		return KErrNone;
       
  1615 		}	
       
  1616 	}
       
  1617 
       
  1618 //eof