| Index: experimental/visual_studio_plugin/third_party/Microsoft.VisualStudio.Project/ComReferenceNode.cs
|
| diff --git a/experimental/visual_studio_plugin/third_party/Microsoft.VisualStudio.Project/ComReferenceNode.cs b/experimental/visual_studio_plugin/third_party/Microsoft.VisualStudio.Project/ComReferenceNode.cs
|
| deleted file mode 100644
|
| index aa7cb30bf861ed31da2d01ef82cb82d358771b57..0000000000000000000000000000000000000000
|
| --- a/experimental/visual_studio_plugin/third_party/Microsoft.VisualStudio.Project/ComReferenceNode.cs
|
| +++ /dev/null
|
| @@ -1,317 +0,0 @@
|
| -/// Copyright (c) Microsoft Corporation. All rights reserved.
|
| -
|
| -using System;
|
| -using System.Diagnostics;
|
| -using System.Diagnostics.CodeAnalysis;
|
| -using System.Globalization;
|
| -using System.IO;
|
| -using System.Runtime.InteropServices;
|
| -using Microsoft.VisualStudio;
|
| -using Microsoft.VisualStudio.Shell.Interop;
|
| -using Microsoft.Win32;
|
| -
|
| -namespace Microsoft.VisualStudio.Project
|
| -{
|
| - /// <summary>
|
| - /// This type of node is used for references to COM components.
|
| - /// </summary>
|
| - [CLSCompliant(false)]
|
| - [ComVisible(true)]
|
| - public class ComReferenceNode : ReferenceNode
|
| - {
|
| - #region fields
|
| - private string typeName;
|
| - private Guid typeGuid;
|
| - private string projectRelativeFilePath;
|
| - private string installedFilePath;
|
| - private string minorVersionNumber;
|
| - private string majorVersionNumber;
|
| - private string lcid;
|
| - #endregion
|
| -
|
| - #region properties
|
| - public override string Caption
|
| - {
|
| - get { return this.typeName; }
|
| - }
|
| -
|
| - public override string Url
|
| - {
|
| - get
|
| - {
|
| - return this.projectRelativeFilePath;
|
| - }
|
| - }
|
| -
|
| - /// <summary>
|
| - /// Returns the Guid of the COM object.
|
| - /// </summary>
|
| - public Guid TypeGuid
|
| - {
|
| - get { return this.typeGuid; }
|
| - }
|
| -
|
| - /// <summary>
|
| - /// Returns the path where the COM object is installed.
|
| - /// </summary>
|
| - public string InstalledFilePath
|
| - {
|
| - get { return this.installedFilePath; }
|
| - }
|
| -
|
| - [SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", MessageId = "LCID")]
|
| - public string LCID
|
| - {
|
| - get { return lcid; }
|
| - }
|
| -
|
| - public int MajorVersionNumber
|
| - {
|
| - get
|
| - {
|
| - if(string.IsNullOrEmpty(majorVersionNumber))
|
| - {
|
| - return 0;
|
| - }
|
| - return int.Parse(majorVersionNumber, CultureInfo.CurrentCulture);
|
| - }
|
| - }
|
| - public int MinorVersionNumber
|
| - {
|
| - get
|
| - {
|
| - if(string.IsNullOrEmpty(minorVersionNumber))
|
| - {
|
| - return 0;
|
| - }
|
| - return int.Parse(minorVersionNumber, CultureInfo.CurrentCulture);
|
| - }
|
| - }
|
| - private Automation.OAComReference comReference;
|
| - internal override object Object
|
| - {
|
| - get
|
| - {
|
| - if(null == comReference)
|
| - {
|
| - comReference = new Automation.OAComReference(this);
|
| - }
|
| - return comReference;
|
| - }
|
| - }
|
| - #endregion
|
| -
|
| - #region ctors
|
| - /// <summary>
|
| - /// Constructor for the ComReferenceNode.
|
| - /// </summary>
|
| - public ComReferenceNode(ProjectNode root, ProjectElement element)
|
| - : base(root, element)
|
| - {
|
| - this.typeName = this.ItemNode.GetMetadata(ProjectFileConstants.Include);
|
| - string typeGuidAsString = this.ItemNode.GetMetadata(ProjectFileConstants.Guid);
|
| - if(typeGuidAsString != null)
|
| - {
|
| - this.typeGuid = new Guid(typeGuidAsString);
|
| - }
|
| -
|
| - this.majorVersionNumber = this.ItemNode.GetMetadata(ProjectFileConstants.VersionMajor);
|
| - this.minorVersionNumber = this.ItemNode.GetMetadata(ProjectFileConstants.VersionMinor);
|
| - this.lcid = this.ItemNode.GetMetadata(ProjectFileConstants.Lcid);
|
| - this.SetProjectItemsThatRelyOnReferencesToBeResolved(false);
|
| - this.SetInstalledFilePath();
|
| - }
|
| -
|
| - /// <summary>
|
| - /// Overloaded constructor for creating a ComReferenceNode from selector data
|
| - /// </summary>
|
| - /// <param name="root">The Project node</param>
|
| - /// <param name="selectorData">The component selctor data.</param>
|
| - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2201:DoNotRaiseReservedExceptionTypes")]
|
| - public ComReferenceNode(ProjectNode root, VSCOMPONENTSELECTORDATA selectorData)
|
| - : base(root)
|
| - {
|
| - if(root == null)
|
| - {
|
| - throw new ArgumentNullException("root");
|
| - }
|
| - if(selectorData.type == VSCOMPONENTTYPE.VSCOMPONENTTYPE_Project
|
| - || selectorData.type == VSCOMPONENTTYPE.VSCOMPONENTTYPE_ComPlus)
|
| - {
|
| - throw new ArgumentException("SelectorData cannot be of type VSCOMPONENTTYPE.VSCOMPONENTTYPE_Project or VSCOMPONENTTYPE.VSCOMPONENTTYPE_ComPlus", "selectorData");
|
| - }
|
| -
|
| - // Initialize private state
|
| - this.typeName = selectorData.bstrTitle;
|
| - this.typeGuid = selectorData.guidTypeLibrary;
|
| - this.majorVersionNumber = selectorData.wTypeLibraryMajorVersion.ToString(CultureInfo.InvariantCulture);
|
| - this.minorVersionNumber = selectorData.wTypeLibraryMinorVersion.ToString(CultureInfo.InvariantCulture);
|
| - this.lcid = selectorData.lcidTypeLibrary.ToString(CultureInfo.InvariantCulture);
|
| -
|
| - // Check to see if the COM object actually exists.
|
| - this.SetInstalledFilePath();
|
| - // If the value cannot be set throw.
|
| - if(String.IsNullOrEmpty(this.installedFilePath))
|
| - {
|
| - throw new NullReferenceException("The InstalledFilePath is null");
|
| - }
|
| - }
|
| - #endregion
|
| -
|
| - #region methods
|
| - /// <summary>
|
| - /// Links a reference node to the project and hierarchy.
|
| - /// </summary>
|
| - protected override void BindReferenceData()
|
| - {
|
| - Debug.Assert(this.ItemNode != null, "The AssemblyName field has not been initialized");
|
| -
|
| - // We need to create the project element at this point if it has not been created.
|
| - // We cannot do that from the ctor if input comes from a component selector data, since had we been doing that we would have added a project element to the project file.
|
| - // The problem with that approach is that we would need to remove the project element if the item cannot be added to the hierachy (E.g. It already exists).
|
| - // It is just safer to update the project file now. This is the intent of this method.
|
| - // Call MSBuild to build the target ResolveComReferences
|
| - if(this.ItemNode == null || this.ItemNode.Item == null)
|
| - {
|
| - this.ItemNode = this.GetProjectElementBasedOnInputFromComponentSelectorData();
|
| - }
|
| -
|
| - this.SetProjectItemsThatRelyOnReferencesToBeResolved(true);
|
| - }
|
| -
|
| - /// <summary>
|
| - /// Checks if a reference is already added. The method parses all references and compares the the FinalItemSpec and the Guid.
|
| - /// </summary>
|
| - /// <returns>true if the assembly has already been added.</returns>
|
| - protected override bool IsAlreadyAdded()
|
| - {
|
| - ReferenceContainerNode referencesFolder = this.ProjectMgr.FindChild(ReferenceContainerNode.ReferencesNodeVirtualName) as ReferenceContainerNode;
|
| - Debug.Assert(referencesFolder != null, "Could not find the References node");
|
| -
|
| - for(HierarchyNode n = referencesFolder.FirstChild; n != null; n = n.NextSibling)
|
| - {
|
| - ComReferenceNode refererenceNode = n as ComReferenceNode;
|
| -
|
| - if(refererenceNode != null)
|
| - {
|
| - // We check if the name and guids are the same
|
| - if(refererenceNode.TypeGuid == this.TypeGuid && String.Compare(refererenceNode.Caption, this.Caption, StringComparison.OrdinalIgnoreCase) == 0)
|
| - {
|
| - return true;
|
| - }
|
| - }
|
| - }
|
| -
|
| - return false;
|
| - }
|
| -
|
| - /// <summary>
|
| - /// Determines if this is node a valid node for painting the default reference icon.
|
| - /// </summary>
|
| - /// <returns></returns>
|
| - protected override bool CanShowDefaultIcon()
|
| - {
|
| - return !String.IsNullOrEmpty(this.installedFilePath);
|
| - }
|
| -
|
| - /// <summary>
|
| - /// This is an helper method to convert the VSCOMPONENTSELECTORDATA recieved by the
|
| - /// implementer of IVsComponentUser into a ProjectElement that can be used to create
|
| - /// an instance of this class.
|
| - /// This should not be called for project reference or reference to managed assemblies.
|
| - /// </summary>
|
| - /// <returns>ProjectElement corresponding to the COM component passed in</returns>
|
| - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1308:NormalizeStringsToUppercase")]
|
| - private ProjectElement GetProjectElementBasedOnInputFromComponentSelectorData()
|
| - {
|
| -
|
| - ProjectElement element = new ProjectElement(this.ProjectMgr, this.typeName, ProjectFileConstants.COMReference);
|
| -
|
| - // Set the basic information regarding this COM component
|
| - element.SetMetadata(ProjectFileConstants.Guid, this.typeGuid.ToString("B"));
|
| - element.SetMetadata(ProjectFileConstants.VersionMajor, this.majorVersionNumber);
|
| - element.SetMetadata(ProjectFileConstants.VersionMinor, this.minorVersionNumber);
|
| - element.SetMetadata(ProjectFileConstants.Lcid, this.lcid);
|
| - element.SetMetadata(ProjectFileConstants.Isolated, false.ToString());
|
| -
|
| - // See if a PIA exist for this component
|
| - TypeLibConverter typelib = new TypeLibConverter();
|
| - string assemblyName;
|
| - string assemblyCodeBase;
|
| - if(typelib.GetPrimaryInteropAssembly(this.typeGuid, Int32.Parse(this.majorVersionNumber, CultureInfo.InvariantCulture), Int32.Parse(this.minorVersionNumber, CultureInfo.InvariantCulture), Int32.Parse(this.lcid, CultureInfo.InvariantCulture), out assemblyName, out assemblyCodeBase))
|
| - {
|
| - element.SetMetadata(ProjectFileConstants.WrapperTool, WrapperToolAttributeValue.Primary.ToString().ToLowerInvariant());
|
| - }
|
| - else
|
| - {
|
| - // MSBuild will have to generate an interop assembly
|
| - element.SetMetadata(ProjectFileConstants.WrapperTool, WrapperToolAttributeValue.TlbImp.ToString().ToLowerInvariant());
|
| - element.SetMetadata(ProjectFileConstants.Private, true.ToString());
|
| - }
|
| - return element;
|
| - }
|
| -
|
| - private void SetProjectItemsThatRelyOnReferencesToBeResolved(bool renameItemNode)
|
| - {
|
| - // Call MSBuild to build the target ResolveComReferences
|
| - bool success;
|
| - ErrorHandler.ThrowOnFailure(this.ProjectMgr.BuildTarget(MsBuildTarget.ResolveComReferences, out success));
|
| - if(!success)
|
| - throw new InvalidOperationException();
|
| -
|
| - // Now loop through the generated COM References to find the corresponding one
|
| - Microsoft.Build.BuildEngine.BuildItemGroup comReferences = this.ProjectMgr.BuildProject.GetEvaluatedItemsByName(MsBuildGeneratedItemType.ComReferenceWrappers);
|
| - foreach(Microsoft.Build.BuildEngine.BuildItem reference in comReferences)
|
| - {
|
| - if(String.Compare(reference.GetMetadata(ProjectFileConstants.Guid), this.typeGuid.ToString("B"), StringComparison.OrdinalIgnoreCase) == 0
|
| - && String.Compare(reference.GetMetadata(ProjectFileConstants.VersionMajor), this.majorVersionNumber, StringComparison.OrdinalIgnoreCase) == 0
|
| - && String.Compare(reference.GetMetadata(ProjectFileConstants.VersionMinor), this.minorVersionNumber, StringComparison.OrdinalIgnoreCase) == 0
|
| - && String.Compare(reference.GetMetadata(ProjectFileConstants.Lcid), this.lcid, StringComparison.OrdinalIgnoreCase) == 0)
|
| - {
|
| - string name = reference.FinalItemSpec;
|
| - if(Path.IsPathRooted(name))
|
| - {
|
| - this.projectRelativeFilePath = name;
|
| - }
|
| - else
|
| - {
|
| - this.projectRelativeFilePath = Path.Combine(this.ProjectMgr.ProjectFolder, name);
|
| - }
|
| -
|
| - if(renameItemNode)
|
| - {
|
| - this.ItemNode.Rename(Path.GetFileNameWithoutExtension(name));
|
| - }
|
| - break;
|
| - }
|
| - }
|
| - }
|
| -
|
| - /// <summary>
|
| - /// Verify that the TypeLib is registered and set the the installed file path of the com reference.
|
| - /// </summary>
|
| - /// <returns></returns>
|
| - private void SetInstalledFilePath()
|
| - {
|
| - string registryPath = string.Format(CultureInfo.InvariantCulture, @"TYPELIB\{0}\{1}.{2}", this.typeGuid.ToString("B"), this.majorVersionNumber, this.minorVersionNumber);
|
| - using(RegistryKey typeLib = Registry.ClassesRoot.OpenSubKey(registryPath))
|
| - {
|
| - if(typeLib != null)
|
| - {
|
| - // Check if we need to set the name for this type.
|
| - if(string.IsNullOrEmpty(this.typeName))
|
| - {
|
| - this.typeName = typeLib.GetValue(string.Empty) as string;
|
| - }
|
| - // Now get the path to the file that contains this type library.
|
| - using(RegistryKey installKey = typeLib.OpenSubKey(@"0\win32"))
|
| - {
|
| - this.installedFilePath = installKey.GetValue(String.Empty) as String;
|
| - }
|
| - }
|
| - }
|
| - }
|
| -
|
| - #endregion
|
| - }
|
| -}
|
|
|