crashanalysercmd/PerfToolsSharedLibraries/Engine/SymbianUtils/RawItems/RawItem.cs
changeset 0 818e61de6cd1
--- /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
+	}
+}