// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved. using System; using Collections = System.Collections; using System.Collections.Generic; using System.Linq; using VCProjectDll = Microsoft.VisualStudio.VCProject; using VCProjectEngineDll = Microsoft.VisualStudio.VCProjectEngine; using EnvDTE; namespace UnrealVS { public enum DebuggerFlavor { Local, Remote } public enum ConfigType { Application, Generic, Other } public class VCProjectConfig { public string Name { get; set; } public ConfigType ConfigType { get; set; } public bool DebugAttach { get; set; } public DebuggerFlavor DebugFlavor { get; set; } public string DebugRemoteCommand { get; set; } public string DebugCommand { get; set; } public string NMakeToolOutput { get; set; } } public class VCProject { /// /// Create a VCProject helper from a DTE Project. /// /// DTE Project to extract VC project settings from. /// (Optional) Config name to return settings for. Leave null or empty to return all configs. public VCProject(Project Project, string ConfigNameFilter) { VCProjectEngineDll.VCProject VCProject = Project.Object as VCProjectEngineDll.VCProject; if (VCProject == null) return; List ConfigList = new List(); foreach (VCProjectEngineDll.VCConfiguration VCConfig in (Collections.IEnumerable)VCProject.Configurations) { if (ConfigNameFilter == null || ConfigNameFilter.Length == 0 || VCConfig.Name == ConfigNameFilter) { VCProjectEngineDll.VCNMakeTool NMakeTool = VCConfig.Tools.Item("VCNMakeTool"); var DTEConfigs = (from Configuration DTEConfig in Project.ConfigurationManager select DTEConfig).ToArray(); var DTEConfigMatch = DTEConfigs.FirstOrDefault( delegate(Configuration DTEConfig) { string ConfigName = string.Format( "{0}|{1}", DTEConfig.ConfigurationName, DTEConfig.PlatformName); return ConfigName == VCConfig.Name; }); ConfigType ConfigType = ConfigType.Other; if (DTEConfigMatch != null) { Property ConfigTypeProp = DTEConfigMatch.Properties.Item("ConfigurationType"); if (ConfigTypeProp != null) { VCProjectDll.ConfigurationTypes ConfigTypeVal = (VCProjectDll.ConfigurationTypes)ConfigTypeProp.Value; if (ConfigTypeVal == VCProjectDll.ConfigurationTypes.typeApplication) { ConfigType = ConfigType.Application; } else if (ConfigTypeVal == VCProjectDll.ConfigurationTypes.typeGeneric || ConfigTypeVal == VCProjectDll.ConfigurationTypes.typeUnknown) { ConfigType = ConfigType.Generic; } } } DebuggerFlavor Flavor = DebuggerFlavor.Local; if (VCConfig.DebugSettings.DebuggerFlavor == VCProjectEngineDll.eDebuggerTypes.eRemoteDebugger) { Flavor = DebuggerFlavor.Remote; } string NMakeToolOutput = NMakeTool != null ? NMakeTool.Output : string.Empty; ConfigList.Add(new VCProjectConfig { Name = VCConfig.Name, ConfigType = ConfigType, DebugAttach = VCConfig.DebugSettings.Attach, DebugFlavor = Flavor, DebugRemoteCommand = VCConfig.DebugSettings.RemoteCommand, DebugCommand = VCConfig.DebugSettings.Command, NMakeToolOutput = NMakeToolOutput }); } } _Configurations = ConfigList.ToArray(); } public IEnumerable Configurations { get { return _Configurations; } } private readonly VCProjectConfig[] _Configurations; } }