crashanalysercmd/PerfToolsSharedLibraries/Engine/SymbianUtils/RawItems/RawItem.cs
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/crashanalysercmd/PerfToolsSharedLibraries/Engine/SymbianUtils/RawItems/RawItem.cs Thu Feb 11 15:50:58 2010 +0200
@@ -0,0 +1,250 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "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:
+*
+*/
+using System;
+using System.Text;
+
+namespace SymbianUtils.RawItems
+{
+ public class RawItem
+ {
+ #region Constructors
+ public RawItem()
+ : this( 0, 0, 0, "...." )
+ {
+ }
+
+ public RawItem( uint aAddress, uint aReversedData, uint aOriginalData, string aCharacterisedData )
+ {
+ iAddress = aAddress;
+ iData = aReversedData;
+ iOriginalData = aOriginalData;
+ iCharacterisedData = aCharacterisedData;
+ }
+
+ public RawItem( uint aAddress, uint aData )
+ {
+ iAddress = aAddress;
+ iData = aData;
+
+ // Reverse bytes to get the original data
+ uint[] bytes = AsBytes( aData );
+ iOriginalData = SwapEndianness( bytes );
+
+ // Get chars
+ iCharacterisedData = ConvertToCharacters( bytes );
+ }
+ #endregion
+
+ #region API
+ public int PrintableCharacterCount( bool aUnicode, ref int aDotCount )
+ {
+ int count = 0;
+ //
+ int start = ( aUnicode ) ? 1 : 0;
+ int delta = ( aUnicode ) ? 2 : 1;
+ int length = iCharacterisedData.Length;
+ //
+ for ( int i = start; i < length; i += delta )
+ {
+ char c = iCharacterisedData[ i ];
+ int charAsInt = System.Convert.ToInt32( c );
+
+ if ( c >= 32 && c < 128 || c == 0x0D || c == 0x0A || c == 0x09 )
+ {
+ ++count;
+ }
+ if ( c == '.' )
+ {
+ ++aDotCount;
+ }
+ }
+ return count;
+ }
+ #endregion
+
+ #region Properties
+ public uint Address
+ {
+ get { return iAddress; }
+ set { iAddress = value; }
+ }
+
+ public uint Data
+ {
+ get { return iData; }
+ set { iData = value; }
+ }
+
+ public byte[] DataArray
+ {
+ get
+ {
+ byte[] ret = new byte[ 4 ];
+ //
+ ret[ 0 ] = (byte) ( ( iData >> 0 ) & 0xFF );
+ ret[ 1 ] = (byte) ( ( iData >> 8 ) & 0xFF );
+ ret[ 2 ] = (byte) ( ( iData >> 16 ) & 0xFF );
+ ret[ 3 ] = (byte) ( ( iData >> 24 ) & 0xFF );
+ //
+ return ret;
+ }
+ }
+
+ public ushort[] DataArrayWords
+ {
+ get
+ {
+ ushort[] ret = new ushort[ 2 ];
+ //
+ ret[ 0 ] = (ushort) ( ( iData ) & 0x0000FFFF );
+ ret[ 1 ] = (ushort) ( ( iData >> 16 ) & 0x0000FFFF );
+ //
+ return ret;
+ }
+ }
+
+ public uint OriginalData
+ {
+ get { return iOriginalData; }
+ set { iOriginalData = value; }
+ }
+
+ public string CharacterisedData
+ {
+ get { return iCharacterisedData; }
+ set { iCharacterisedData = value; }
+ }
+
+ public string OriginalCharacterisedData
+ {
+ get
+ {
+ char[] reversedCharacterisedData = new char[ iCharacterisedData.Length ];
+ for (int i = 0; i < iCharacterisedData.Length; i+=4)
+ {
+ string bytes = iCharacterisedData.Substring(i, 4);
+ reversedCharacterisedData[i] = bytes[3];
+ reversedCharacterisedData[i+1] = bytes[2];
+ reversedCharacterisedData[i+2] = bytes[1];
+ reversedCharacterisedData[i+3] = bytes[0];
+ }
+ //
+ string characterisedData = new string(reversedCharacterisedData);
+ return characterisedData;
+ }
+ }
+
+ public string OriginalCharacterisedDataAsUnicode
+ {
+ get
+ {
+ StringBuilder text = new StringBuilder( OriginalCharacterisedData );
+ for( int i = text.Length-1; i >= 0; i-=2 )
+ {
+ text.Remove( i, 1 );
+ }
+ string ret = text.ToString();
+ return ret;
+ }
+ }
+
+ public object Tag
+ {
+ get { return iTag; }
+ set { iTag = value; }
+ }
+
+ public static uint RoundToNearestDWord( uint aValue )
+ {
+ uint dwords = aValue / KSizeOfOneRawItemInBytes;
+ uint ret = dwords * KSizeOfOneRawItemInBytes;
+ uint remainder = aValue % KSizeOfOneRawItemInBytes;
+ //
+ if ( remainder > 0 )
+ {
+ ret += KSizeOfOneRawItemInBytes;
+ }
+ //
+ return ret;
+ }
+ #endregion
+
+ #region Constants
+ public const uint KSizeOfOneRawItemInBytes = 4;
+ #endregion
+
+ #region Internal methods
+ private static uint[] AsBytes( uint aValue )
+ {
+ uint[] ret = new uint[4];
+ //
+ ret[ 0 ] = ( aValue ) & 0xFF;
+ ret[ 1 ] = ( aValue >> 8 ) & 0xFF;
+ ret[ 2 ] = ( aValue >> 16 ) & 0xFF;
+ ret[ 3 ] = ( aValue >> 24 ) & 0xFF;
+ //
+ return ret;
+ }
+
+ private static uint SwapEndianness( uint aValue )
+ {
+ uint[] bytes = AsBytes( aValue );
+ return SwapEndianness( bytes );
+ }
+
+ private static uint SwapEndianness( uint[] aBytes )
+ {
+ System.Diagnostics.Debug.Assert( aBytes.Length == KSizeOfOneRawItemInBytes );
+ uint ret = 0;
+ //
+ ret += ( aBytes[ 3 ] << 0 );
+ ret += ( aBytes[ 2 ] << 8 );
+ ret += ( aBytes[ 1 ] << 16 );
+ ret += ( aBytes[ 0 ] << 24 );
+ //
+ return ret;
+ }
+
+ private static string ConvertToCharacters( uint[] aBytes )
+ {
+ StringBuilder ret = new StringBuilder();
+ //
+ foreach ( uint val in aBytes )
+ {
+ char c = System.Convert.ToChar( val );
+ //
+ if ( c <= 0x20 || c >= 0x7f || c == '%' )
+ {
+ c = '.';
+ }
+ //
+ ret.Insert( 0, c );
+ }
+ //
+ return ret.ToString();
+ }
+ #endregion
+
+ #region Data members
+ private object iTag = null;
+ private uint iAddress;
+ private uint iData;
+ private uint iOriginalData;
+ private string iCharacterisedData = string.Empty;
+ #endregion
+ }
+}