crashanalysercmd/PerfToolsSharedLibraries/Engine/SymbolLib/Engines/ROM/ROMEngine.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.IO;
using SymbolLib.CodeSegDef;
using SymbolLib.Engines.Common;
using SymbolLib.Sources.Map.Engine;
using SymbolLib.Sources.Map.Parser;
using SymbolLib.Sources.Map.File;
using SymbolLib.Sources.Symbol.Engine;
using SymbolLib.Sources.Symbol.File;
using SymbolLib.Generics;
using SymbianUtils;
using SymbianUtils.Range;
using SymbianUtils.Tracer;

namespace SymbolLib.Engines.ROM
{
    public class ROMEngine : SymbolEngineBase
    {
        #region Constructor & destructor
        internal ROMEngine( ITracer aTracer )
            : base( aTracer )
        {
            iEngineSymbol = new SymbolFileEngine( this, SymbolFileEngine.TActivationType.EImmediate, false ); 
            iEngineSymbol.Observer += new SymbianUtils.AsyncReaderBase.Observer( SymbolEngine_Observer );
        }
        #endregion

        #region API
        public static TFileType IsSupported( string aFileName )
        {
            TFileType ret = TFileType.EFileNotSupported;
            //
            try
            {
                string extension = Path.GetExtension( aFileName ).ToLower();
                if ( extension == ".symbol" )
                {
                    SymbolFileEngine tempEngine = new SymbolFileEngine( null, SymbolFileEngine.TActivationType.EOnDemand, false );
                    SymbolsForBinary symbols = tempEngine.ReadFirstCollection( aFileName );

                    // For a valid ROFS symbol file, the first symbol should have an address of zero.
                    bool containedNonZeroFirstSymbolCollection = ( symbols != null && symbols.Count > 0 && symbols[ 0 ].Address != 0 );
                    if ( containedNonZeroFirstSymbolCollection )
                    {
                        ret = TFileType.EFileRomSymbol;
                    }
                }
            }
            catch ( Exception )
            {
            }
            //
            return ret;
        }
        #endregion

        #region Properties
        #endregion

        #region From SymbolEngineBase
        public override bool AddressInRange( long aAddress )
        {
            bool ret = iEngineSymbol.Range.Contains( aAddress );
            return ret;
        }

        public override int FileNameCount
        {
            get
            {
                return 1;
            }
        }

        public override string FileName( int aIndex )
        {
            string ret = string.Empty;
            //
            if  ( aIndex == 0 )
            {
                ret = iEngineSymbol.SymbolFileName;
            }
            //            
            return ret;
        }

        public override void LoadFromFile( string aFileName, TSynchronicity aSynchronicity )
        {
            string extn = Path.GetExtension( aFileName ).ToLower();
            if  ( extn == ".symbol" )
            {
				// ROM engine only supports loading a single symbol file
				// at once. First unload any old file, then load new one.
				UnloadAll();
                iEngineSymbol.LoadFromFile( aFileName, aSynchronicity );
            }
            else
            {
                throw new NotSupportedException();
            }
        }

        public override void UnloadAll()
        {
            Reset();
        }

        public override bool IsLoaded( CodeSegDefinition aDefinition )
        {
            bool loaded = iEngineSymbol.IsLoaded( aDefinition );
            return loaded;
        }
        #endregion

        #region From GenericSymbolEngine
        public override bool IsReady
        {
            get
            {
                return iEngineSymbol.IsReady;
            }
        }

        public override void Reset()
        {
            iEngineSymbol.Reset();
        }

        public override bool IsLoaded( string aFileName )
        {
            bool loaded = iEngineSymbol.IsLoaded( aFileName );
            return loaded;
        }

        public override GenericSymbolCollection this[ int aIndex ]
        {
            get
            {
                GenericSymbolCollection ret = iEngineSymbol[ aIndex ];
                return ret;
            }
        }

        public override AddressRange Range
        {
            get
            {
                return iEngineSymbol.Range;
            }
        }

        internal override void UnloadUntagged()
        {
            
        }
        #endregion

        #region From IGenericSymbolCollectionStatisticsInterface
        public override int NumberOfCollections
        {
            get
            {
                return iEngineSymbol.NumberOfCollections;
            }
        }
        #endregion

        #region Event handlers
        private void SymbolEngine_Observer( SymbianUtils.AsyncReaderBase.TEvent aEvent, SymbianUtils.AsyncReaderBase aSender )
        {
            switch( aEvent )
            {
                case SymbianUtils.AsyncReaderBase.TEvent.EReadingStarted:
                    OnParsingStarted( iEngineSymbol.SymbolFileName );
                    break;
                case SymbianUtils.AsyncReaderBase.TEvent.EReadingProgress:
                    OnParsingProgress( iEngineSymbol.SymbolFileName, aSender.Progress );
                    break;
                case SymbianUtils.AsyncReaderBase.TEvent.EReadingComplete:
                    OnParsingCompleted( iEngineSymbol.SymbolFileName );
                    break;
            }
        }
        #endregion

        #region Internal methods
        #endregion

        #region Data members
        private readonly SymbolFileEngine iEngineSymbol;
        #endregion
    }
}