crashanalysercmd/PerfToolsSharedLibraries/Engine/SymBuildParsingLib/Common/Objects/SymIncludeDirectory.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;
using SymBuildParsingLib.Utils;

namespace SymBuildParsingLib.Common.Objects
{
	public class SymIncludeDirectory
	{
		#region Constructors & destructor
		public SymIncludeDirectory()
		{
		}

		public SymIncludeDirectory( SymIncludeDirectory aCopy )
		{
		}
		#endregion

		#region API
		public void Add( SymIncludeDefinition aDefinition )
		{
			string location = aDefinition.Location;
			if	( location == String.Empty )
			{
				throw new ArgumentException( "Include location cannot be null when adding to include directory", aDefinition.ToString() );
			}
			
			if	( iIncludes[ location ] == null )
			{
				iIncludes.Add( location, aDefinition );
			}
		}

		public string ResolveFileName( SymIncludeDefinition aDefinition )
		{
			// First check against the specified type for an exact match...
			string location = aDefinition.Location;
			string ret = FindInSpecifiedIncludeEntries( location, aDefinition.Type );

			if  ( ret == string.Empty )
			{
				// Try the other remaining type
				SymIncludeDefinition.TType type = SymIncludeDefinition.TType.ETypeUser;

				if	( aDefinition.Type == SymIncludeDefinition.TType.ETypeUser )
				{
					type = SymIncludeDefinition.TType.ETypeSystem;
				}
				else
				{
					type = SymIncludeDefinition.TType.ETypeUser;
				}

				ret = FindInSpecifiedIncludeEntries( location, type );
			}
			//
			return ret;
		}
		#endregion

		#region Properties
		#endregion

		#region Internal methods
		private string FindInSpecifiedIncludeEntries( string aFileName, SymIncludeDefinition.TType aType )
		{
			string ret = string.Empty;
			//
			IDictionaryEnumerator enumerator = iIncludes.GetEnumerator();
			while ( enumerator.MoveNext() )
			{
				SymIncludeDefinition include = (SymIncludeDefinition) enumerator.Value;
				//
				if	( include.Type == aType )
				{
					string includePath = include.Location;
					string resolvedFileName = SymFileSystemUtils.MergePaths( includePath, aFileName );
					//
					if	( SymFileSystemUtils.FileExists( resolvedFileName ) )
					{
						ret = resolvedFileName;
						break;
					}
				}
			}
			//
			return ret;
		}
		#endregion

		#region Data members
		private Hashtable iIncludes = new Hashtable( 10 );
		#endregion
	}
}