crashanalysercmd/Libraries/Engine/CrashDebuggerLib/Structures/Common/Capability.cs
author Matti Laitinen <matti.t.laitinen@nokia.com>
Thu, 11 Feb 2010 15:50:58 +0200
changeset 0 818e61de6cd1
permissions -rw-r--r--
Add initial version of Crash Analyser cmdline under EPL

/*
* Copyright (c) 2004-2008 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.Collections.Generic;
using System.Text;
using CrashDebuggerLib.Structures.KernelObjects;

namespace CrashDebuggerLib.Structures.Common
{
    public class Capability
    {
        #region Enumerations
        [Flags, System.ComponentModel.TypeConverter( typeof( SymbianParserLib.TypeConverters.SymbianEnumConverter ) )]
        public enum TCapability : ulong
        {
            ECapabilityNone                 = 0x00000000000,
            ECapabilityTCB                  = 0x00000000001,
            ECapabilityCommDD               = 0x00000000002,
            ECapabilityPowerMgmt            = 0x00000000004,
            ECapabilityMultimediaDD         = 0x00000000008,
            ECapabilityReadDeviceData       = 0x00000000010,
            ECapabilityWriteDeviceData      = 0x00000000020,
            ECapabilityDRM                  = 0x00000000040,
            ECapabilityTrustedUI            = 0x00000000080,
            ECapabilityProtServ             = 0x00000000100,
            ECapabilityDiskAdmin            = 0x00000000200,
            ECapabilityNetworkControl       = 0x00000000400,
            ECapabilityAllFiles             = 0x00000000800,
            ECapabilitySwEvent              = 0x00000001000,
            ECapabilityNetworkServices      = 0x00000002000,
            ECapabilityLocalServices        = 0x00000004000,
            ECapabilityReadUserData         = 0x00000008000,
            ECapabilityLocation             = 0x00000010000,
            ECapabilityWriteUserData        = 0x00000020000,
            ECapabilitySurroundingsDD       = 0x00000040000,
            ECapabilityUserEnvironment      = 0x00000080000,
        }
        #endregion

        #region Constructors
        public Capability()
            : this( TCapability.ECapabilityNone )
        {
        }

        public Capability( TCapability aCapability )
        {
            iCaps = aCapability;
        }

        public Capability( long aValue )
        {
            TCapability cap = (TCapability) aValue;
            iCaps = cap;
        }
        #endregion

        #region API
        public void Add( TCapability aCapability )
        {
            ulong addVal = (ulong) aCapability;
            ulong curVal = (ulong) iCaps;
            ulong combin = addVal | curVal;
            //
            iCaps = (TCapability) combin;
        }

        public void Remove( TCapability aCapability )
        {
            ulong remVal = (ulong) aCapability;
            ulong combin = (ulong) iCaps;
            combin &= remVal;
            //
            iCaps = (TCapability) combin;
        }

        /*
        public static string ToString( TCapability aCapability )
        {

            string ret = KCapabilityNames[ (int) aCapability ];
            return ret;
        }*/
        #endregion

        #region Properties
        public uint LowDWord
        {
            get
            {
                ulong val = (ulong) iCaps;
                ulong masked = val & 0x00000000FFFFFFFF;
                uint ret = (uint) masked;
                return ret;
            }
            set
            {
                ulong val = HighDWord | value;
                iCaps = (TCapability) val;
            }
        }

        public uint HighDWord
        {
            get
            {
                ulong val = (ulong) iCaps;
                ulong masked = val & 0xFFFFFFFF00000000;
                uint ret = (uint) ( masked >> 8 );
                return ret;
            }
            set
            {
                ulong val = ( value << 8 ) | LowDWord;
                iCaps = (TCapability) val;
            }
        }

        public ulong RawValue
        {
            get { return (ulong) iCaps; }
            set { iCaps = (TCapability) value; }
        }

        public TCapability Value
        {
            get { return iCaps; }
            set { iCaps = value; }
        }
        #endregion

        #region Internal methods
        /*private static long MakeValue( TCapability aCapability )
        {
            int shiftAmount = (int) aCapability;
            long ret = 1L << shiftAmount;
            return ret;
        }

        private static void ValidateCapability( TCapability aCapability )
        {
            if ( aCapability < 0 || aCapability >= TCapability.ECapability_Limit )
            {
                throw new ArgumentException( "Capability is out of range: " + aCapability.ToString() );
            }
        }*/
        #endregion

        #region Internal constants
        private const int KMaxBitIndex = 64;
        private static readonly string[] KCapabilityNames = new string[]
        {
	        "TCB",
	        "CommDD",
	        "PowerMgmt",
	        "MultimediaDD",
	        "ReadDeviceData",
	        "WriteDeviceData",
	        "DRM",
	        "TrustedUI",
	        "ProtServ",
	        "DiskAdmin",
	        "NetworkControl",
	        "AllFiles",
	        "SwEvent",
	        "NetworkServices",
	        "LocalServices",
	        "ReadUserData",
	        "WriteUserData",
	        "Location",
	        "SurroundingsDD",
	        "UserEnvironment",
        };
        #endregion

        #region From System.Object
        public override string ToString()
        {
            StringBuilder ret = new StringBuilder();
            //
            for( int i=0; i<KMaxBitIndex; i++ )
            {
                ulong checkVal = (ulong) 1 << i;
                if ( ( checkVal & RawValue ) == checkVal )
                {
                    string name = KCapabilityNames[ i ];
                    //
                    if ( ret.Length > 0 )
                    {
                        ret.Append( ", " );
                    }
                    //
                    ret.Append( name  );
                }

                /*
                TCapability cap = (TCapability) i;
                long mask = MakeValue( cap );
                long remainder = ( iValue & mask );
                if ( remainder != 0 )
                {
                    string name = ToString( cap );
                }
             */
            }
            //
            return ret.ToString();
        }
        #endregion

        #region Data members
        private TCapability iCaps = TCapability.ECapabilityNone;
        #endregion
    }
}