crashanalysercmd/PerfToolsSharedLibraries/Engine/SymbianDebugLib/PluginAPI/Symbol/DbgViewSymbol.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) 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.Collections.Generic;
using System.Text;
using SymbianStructuresLib.CodeSegments;
using SymbianStructuresLib.Debug.Symbols;
using SymbianStructuresLib.Debug.Common.FileName;

namespace SymbianDebugLib.PluginAPI.Types.Symbol
{
    public abstract class DbgViewSymbol : DbgPluginView, IEnumerable<SymbolCollection>
    {
        #region Constructors
        protected DbgViewSymbol( string aName, DbgPluginEngine aEngine )
            : base( aName, aEngine )
        {
            iPlainTextAPI = new DbgSymbolViewText( this );
        }
        #endregion

        #region Framework API
        public abstract SymbianStructuresLib.Debug.Symbols.Symbol Lookup( uint aAddress, out SymbolCollection aCollection );

        public abstract SymbolCollection CollectionByAddress( uint aAddress );

        public abstract SymbolCollection ActivateAndGetCollection( CodeSegDefinition aCodeSegment );

        public abstract SymbolCollection this[ CodeSegDefinition aCodeSeg ]
        {
            get;
        }

        public abstract SymbolCollection this[ PlatformFileName aFileName ]
        {
            get;
        }

        protected abstract IEnumerator<SymbolCollection> GetEnumeratorSymbolCollection();
        #endregion

        #region Properties
        public SymbianStructuresLib.Debug.Symbols.Symbol this[ uint aAddress ]
        {
            get
            {
                SymbolCollection col = null;
                return Lookup( aAddress, out col );
            }
        }

        public DbgSymbolViewText PlainText
        {
            get { return iPlainTextAPI; }
        }
        #endregion

        #region Internal methods
        #endregion

        #region From IEnumerable<SymbolCollection>
        public IEnumerator<SymbolCollection> GetEnumerator()
        {
            return GetEnumeratorSymbolCollection();
        }

        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
        {
            return GetEnumeratorSymbolCollection();
        }
        #endregion

        #region Data members
        private readonly DbgSymbolViewText iPlainTextAPI;
        #endregion
    }

    #region Plain Text API helper
    public sealed class DbgSymbolViewText
    {
        #region Constructors
        internal DbgSymbolViewText( DbgViewSymbol aView )
        {
            iView = aView;
        }
        #endregion

        #region API
        public bool Lookup( uint aAddress, out uint aStartingAddress, out string aSymbolName )
        {
            uint addrEnd = 0;
            bool found = Lookup( aAddress, out aStartingAddress, out addrEnd, out aSymbolName );
            return found;
        }

        public bool Lookup( uint aAddress, out uint aStartingAddress, out uint aEndingAddress, out string aSymbolName )
        {
            aStartingAddress = 0;
            aEndingAddress = 0;
            aSymbolName = string.Empty;
            //
            SymbianStructuresLib.Debug.Symbols.Symbol sym = iView[ aAddress ];
            //
            if ( sym != null )
            {
                aStartingAddress = sym.Address;
                aEndingAddress = sym.EndAddress;
                aSymbolName = sym.Name;
            }
            //
            return ( sym != null );
        }
        #endregion

        #region Properties
        public string this[ uint aAddress ]
        {
            get
            {
                uint addrStart = 0;
                string symName = string.Empty;
                bool found = Lookup( aAddress, out addrStart, out symName );
                return symName;
            }
        }
        #endregion

        #region Data members
        private readonly DbgViewSymbol iView;
        #endregion
    }
    #endregion
}