From a8a1e0d6f99c2b902a8f81d3d7f3503c506e8171 Mon Sep 17 00:00:00 2001 From: Rob Mensching Date: Tue, 4 May 2021 22:50:56 -0700 Subject: Move VisualStudio.wixext into ext --- src/ext/VisualStudio/CSharp.Build.props | 11 + src/ext/VisualStudio/Cpp.Build.props | 86 +++ src/ext/VisualStudio/Directory.Build.props | 27 + src/ext/VisualStudio/Directory.Build.targets | 51 ++ src/ext/VisualStudio/Directory.csproj.props | 13 + src/ext/VisualStudio/Directory.csproj.targets | 26 + src/ext/VisualStudio/Directory.vcxproj.props | 111 +++ src/ext/VisualStudio/README.md | 2 + src/ext/VisualStudio/VisualStudio.wixext.sln | 73 ++ src/ext/VisualStudio/appveyor.cmd | 19 + src/ext/VisualStudio/appveyor.yml | 42 ++ src/ext/VisualStudio/ca/dllmain.cpp | 26 + src/ext/VisualStudio/ca/precomp.h | 13 + src/ext/VisualStudio/ca/vsca.cpp | 510 +++++++++++++ src/ext/VisualStudio/ca/vsca.def | 7 + src/ext/VisualStudio/ca/vsca.vcxproj | 58 ++ src/ext/VisualStudio/nuget.config | 17 + .../TestData/UsingVsixPackage/Package.en-us.wxl | 11 + .../TestData/UsingVsixPackage/Package.wxs | 17 + .../UsingVsixPackage/PackageComponents.wxs | 14 + .../TestData/UsingVsixPackage/example.txt | 1 + .../VisualStudioExtensionFixture.cs | 45 ++ .../WixToolsetTest.VisualStudio.csproj | 38 + .../WixToolsetTest.VisualStudio.v3.ncrunchproject | 5 + src/ext/VisualStudio/wix.snk | Bin 0 -> 596 bytes .../VisualStudio/wixext/Symbols/HelpFileSymbol.cs | 95 +++ .../wixext/Symbols/HelpFileToNamespaceSymbol.cs | 55 ++ .../wixext/Symbols/HelpFilterSymbol.cs | 55 ++ .../wixext/Symbols/HelpFilterToNamespaceSymbol.cs | 55 ++ .../wixext/Symbols/HelpNamespaceSymbol.cs | 63 ++ .../wixext/Symbols/HelpPluginSymbol.cs | 79 ++ .../wixext/Symbols/VSSymbolDefinitions.cs | 59 ++ src/ext/VisualStudio/wixext/VSCompiler.cs | 828 +++++++++++++++++++++ src/ext/VisualStudio/wixext/VSDecompiler.cs | 298 ++++++++ src/ext/VisualStudio/wixext/VSExtensionData.cs | 27 + src/ext/VisualStudio/wixext/VSExtensionFactory.cs | 18 + src/ext/VisualStudio/wixext/VSTableDefinitions.cs | 97 +++ .../VSWindowsInstallerBackendBinderExtension.cs | 13 + .../wixext/WixToolset.VisualStudio.wixext.csproj | 30 + .../wixext/WixToolset.VisualStudio.wixext.nuspec | 23 + .../wixext/WixToolset.VisualStudio.wixext.targets | 8 + ...ixToolset.VisualStudio.wixext.v3.ncrunchproject | 7 + .../wixlib/HTML_Help_Registration__RTL_X86.wxs | 67 ++ .../VisualStudio/wixlib/Redist/BIN_File_107602.dll | Bin 0 -> 866816 bytes .../VisualStudio/wixlib/Redist/BIN_File_46001.dll | Bin 0 -> 129536 bytes .../VisualStudio/wixlib/Redist/BIN_File_46002.dll | Bin 0 -> 108544 bytes src/ext/VisualStudio/wixlib/VS11.wxs | 205 +++++ src/ext/VisualStudio/wixlib/VS14.wxs | 186 +++++ src/ext/VisualStudio/wixlib/VS2003.wxs | 27 + src/ext/VisualStudio/wixlib/VS2005.wxs | 369 +++++++++ src/ext/VisualStudio/wixlib/VS2008.wxs | 299 ++++++++ src/ext/VisualStudio/wixlib/VS2010.wxs | 312 ++++++++ src/ext/VisualStudio/wixlib/VS2012.wxs | 255 +++++++ src/ext/VisualStudio/wixlib/VS2013.wxs | 252 +++++++ src/ext/VisualStudio/wixlib/VS2015.wxs | 186 +++++ src/ext/VisualStudio/wixlib/VS2017.wxs | 142 ++++ src/ext/VisualStudio/wixlib/VS2019.wxs | 142 ++++ .../VisualStudio/wixlib/VSExtension_Platform.wxi | 17 + src/ext/VisualStudio/wixlib/VSExtension_x86.wxs | 8 + src/ext/VisualStudio/wixlib/VsixPackage.wxs | 60 ++ src/ext/VisualStudio/wixlib/caSuffix.wxi | 28 + src/ext/VisualStudio/wixlib/vs.v3.ncrunchproject | 5 + src/ext/VisualStudio/wixlib/vs.wixproj | 19 + .../vs2005/VS2005_VSIPCC_Collection_Files_RTL.wxs | 63 ++ .../wixlib/vs2005/redist/BIN_File_60377.dll | Bin 0 -> 45056 bytes .../wixlib/vs2005/redist/vsipCCSamples.HxK | 14 + .../VisualStudio/wixlib/vs2005/redist/vsipcc.hxc | 33 + .../VisualStudio/wixlib/vs2005/redist/vsipcc.hxt | 15 + .../wixlib/vs2005/redist/vsipccALinks.hxk | 13 + .../wixlib/vs2005/redist/vsipccBLinks.hxk | 13 + .../wixlib/vs2005/redist/vsipccFLinks.hxk | 14 + .../wixlib/vs2005/redist/vsipccKLinks.hxk | 13 + .../wixlib/vs2005/redist/vsipccNamedURLs.hxk | 13 + .../wixlib/vs2005/redist/vsipccSlinks.hxk | 14 + .../wixlib/vs2005/redist/vsipcc_reg.hxs | Bin 0 -> 18400 bytes .../vs2008/VS2008_VSIPCC_Collection_Files_RTL.wxs | 60 ++ .../wixlib/vs2008/redist/BIN_435439_x86_enu.dll | Bin 0 -> 103944 bytes .../VisualStudio/wixlib/vs2008/redist/_ALinks.hxk | 10 + .../VisualStudio/wixlib/vs2008/redist/_BLinks.hxk | 10 + .../VisualStudio/wixlib/vs2008/redist/_CLinks.hxk | 13 + .../VisualStudio/wixlib/vs2008/redist/_FLinks.hxk | 10 + .../VisualStudio/wixlib/vs2008/redist/_KLinks.hxk | 10 + .../VisualStudio/wixlib/vs2008/redist/_SLinks.hxk | 13 + .../wixlib/vs2008/redist/_vsipcc90.hxc | 33 + .../wixlib/vs2008/redist/_vsipcc90.hxt | 15 + .../wixlib/vs2008/redist/_vsipcc_namedUrls.hxk | 13 + .../wixlib/vs2008/redist/_vsipcc_samples.HxK | 14 + .../wixlib/vs2008/redist/vsipcc_reg.hxs | Bin 0 -> 18488 bytes src/ext/global.json | 5 + 89 files changed, 6023 insertions(+) create mode 100644 src/ext/VisualStudio/CSharp.Build.props create mode 100644 src/ext/VisualStudio/Cpp.Build.props create mode 100644 src/ext/VisualStudio/Directory.Build.props create mode 100644 src/ext/VisualStudio/Directory.Build.targets create mode 100644 src/ext/VisualStudio/Directory.csproj.props create mode 100644 src/ext/VisualStudio/Directory.csproj.targets create mode 100644 src/ext/VisualStudio/Directory.vcxproj.props create mode 100644 src/ext/VisualStudio/README.md create mode 100644 src/ext/VisualStudio/VisualStudio.wixext.sln create mode 100644 src/ext/VisualStudio/appveyor.cmd create mode 100644 src/ext/VisualStudio/appveyor.yml create mode 100644 src/ext/VisualStudio/ca/dllmain.cpp create mode 100644 src/ext/VisualStudio/ca/precomp.h create mode 100644 src/ext/VisualStudio/ca/vsca.cpp create mode 100644 src/ext/VisualStudio/ca/vsca.def create mode 100644 src/ext/VisualStudio/ca/vsca.vcxproj create mode 100644 src/ext/VisualStudio/nuget.config create mode 100644 src/ext/VisualStudio/test/WixToolsetTest.VisualStudio/TestData/UsingVsixPackage/Package.en-us.wxl create mode 100644 src/ext/VisualStudio/test/WixToolsetTest.VisualStudio/TestData/UsingVsixPackage/Package.wxs create mode 100644 src/ext/VisualStudio/test/WixToolsetTest.VisualStudio/TestData/UsingVsixPackage/PackageComponents.wxs create mode 100644 src/ext/VisualStudio/test/WixToolsetTest.VisualStudio/TestData/UsingVsixPackage/example.txt create mode 100644 src/ext/VisualStudio/test/WixToolsetTest.VisualStudio/VisualStudioExtensionFixture.cs create mode 100644 src/ext/VisualStudio/test/WixToolsetTest.VisualStudio/WixToolsetTest.VisualStudio.csproj create mode 100644 src/ext/VisualStudio/test/WixToolsetTest.VisualStudio/WixToolsetTest.VisualStudio.v3.ncrunchproject create mode 100644 src/ext/VisualStudio/wix.snk create mode 100644 src/ext/VisualStudio/wixext/Symbols/HelpFileSymbol.cs create mode 100644 src/ext/VisualStudio/wixext/Symbols/HelpFileToNamespaceSymbol.cs create mode 100644 src/ext/VisualStudio/wixext/Symbols/HelpFilterSymbol.cs create mode 100644 src/ext/VisualStudio/wixext/Symbols/HelpFilterToNamespaceSymbol.cs create mode 100644 src/ext/VisualStudio/wixext/Symbols/HelpNamespaceSymbol.cs create mode 100644 src/ext/VisualStudio/wixext/Symbols/HelpPluginSymbol.cs create mode 100644 src/ext/VisualStudio/wixext/Symbols/VSSymbolDefinitions.cs create mode 100644 src/ext/VisualStudio/wixext/VSCompiler.cs create mode 100644 src/ext/VisualStudio/wixext/VSDecompiler.cs create mode 100644 src/ext/VisualStudio/wixext/VSExtensionData.cs create mode 100644 src/ext/VisualStudio/wixext/VSExtensionFactory.cs create mode 100644 src/ext/VisualStudio/wixext/VSTableDefinitions.cs create mode 100644 src/ext/VisualStudio/wixext/VSWindowsInstallerBackendBinderExtension.cs create mode 100644 src/ext/VisualStudio/wixext/WixToolset.VisualStudio.wixext.csproj create mode 100644 src/ext/VisualStudio/wixext/WixToolset.VisualStudio.wixext.nuspec create mode 100644 src/ext/VisualStudio/wixext/WixToolset.VisualStudio.wixext.targets create mode 100644 src/ext/VisualStudio/wixext/WixToolset.VisualStudio.wixext.v3.ncrunchproject create mode 100644 src/ext/VisualStudio/wixlib/HTML_Help_Registration__RTL_X86.wxs create mode 100644 src/ext/VisualStudio/wixlib/Redist/BIN_File_107602.dll create mode 100644 src/ext/VisualStudio/wixlib/Redist/BIN_File_46001.dll create mode 100644 src/ext/VisualStudio/wixlib/Redist/BIN_File_46002.dll create mode 100644 src/ext/VisualStudio/wixlib/VS11.wxs create mode 100644 src/ext/VisualStudio/wixlib/VS14.wxs create mode 100644 src/ext/VisualStudio/wixlib/VS2003.wxs create mode 100644 src/ext/VisualStudio/wixlib/VS2005.wxs create mode 100644 src/ext/VisualStudio/wixlib/VS2008.wxs create mode 100644 src/ext/VisualStudio/wixlib/VS2010.wxs create mode 100644 src/ext/VisualStudio/wixlib/VS2012.wxs create mode 100644 src/ext/VisualStudio/wixlib/VS2013.wxs create mode 100644 src/ext/VisualStudio/wixlib/VS2015.wxs create mode 100644 src/ext/VisualStudio/wixlib/VS2017.wxs create mode 100644 src/ext/VisualStudio/wixlib/VS2019.wxs create mode 100644 src/ext/VisualStudio/wixlib/VSExtension_Platform.wxi create mode 100644 src/ext/VisualStudio/wixlib/VSExtension_x86.wxs create mode 100644 src/ext/VisualStudio/wixlib/VsixPackage.wxs create mode 100644 src/ext/VisualStudio/wixlib/caSuffix.wxi create mode 100644 src/ext/VisualStudio/wixlib/vs.v3.ncrunchproject create mode 100644 src/ext/VisualStudio/wixlib/vs.wixproj create mode 100644 src/ext/VisualStudio/wixlib/vs2005/VS2005_VSIPCC_Collection_Files_RTL.wxs create mode 100644 src/ext/VisualStudio/wixlib/vs2005/redist/BIN_File_60377.dll create mode 100644 src/ext/VisualStudio/wixlib/vs2005/redist/vsipCCSamples.HxK create mode 100644 src/ext/VisualStudio/wixlib/vs2005/redist/vsipcc.hxc create mode 100644 src/ext/VisualStudio/wixlib/vs2005/redist/vsipcc.hxt create mode 100644 src/ext/VisualStudio/wixlib/vs2005/redist/vsipccALinks.hxk create mode 100644 src/ext/VisualStudio/wixlib/vs2005/redist/vsipccBLinks.hxk create mode 100644 src/ext/VisualStudio/wixlib/vs2005/redist/vsipccFLinks.hxk create mode 100644 src/ext/VisualStudio/wixlib/vs2005/redist/vsipccKLinks.hxk create mode 100644 src/ext/VisualStudio/wixlib/vs2005/redist/vsipccNamedURLs.hxk create mode 100644 src/ext/VisualStudio/wixlib/vs2005/redist/vsipccSlinks.hxk create mode 100644 src/ext/VisualStudio/wixlib/vs2005/redist/vsipcc_reg.hxs create mode 100644 src/ext/VisualStudio/wixlib/vs2008/VS2008_VSIPCC_Collection_Files_RTL.wxs create mode 100644 src/ext/VisualStudio/wixlib/vs2008/redist/BIN_435439_x86_enu.dll create mode 100644 src/ext/VisualStudio/wixlib/vs2008/redist/_ALinks.hxk create mode 100644 src/ext/VisualStudio/wixlib/vs2008/redist/_BLinks.hxk create mode 100644 src/ext/VisualStudio/wixlib/vs2008/redist/_CLinks.hxk create mode 100644 src/ext/VisualStudio/wixlib/vs2008/redist/_FLinks.hxk create mode 100644 src/ext/VisualStudio/wixlib/vs2008/redist/_KLinks.hxk create mode 100644 src/ext/VisualStudio/wixlib/vs2008/redist/_SLinks.hxk create mode 100644 src/ext/VisualStudio/wixlib/vs2008/redist/_vsipcc90.hxc create mode 100644 src/ext/VisualStudio/wixlib/vs2008/redist/_vsipcc90.hxt create mode 100644 src/ext/VisualStudio/wixlib/vs2008/redist/_vsipcc_namedUrls.hxk create mode 100644 src/ext/VisualStudio/wixlib/vs2008/redist/_vsipcc_samples.HxK create mode 100644 src/ext/VisualStudio/wixlib/vs2008/redist/vsipcc_reg.hxs create mode 100644 src/ext/global.json (limited to 'src/ext') diff --git a/src/ext/VisualStudio/CSharp.Build.props b/src/ext/VisualStudio/CSharp.Build.props new file mode 100644 index 00000000..b12f4c6e --- /dev/null +++ b/src/ext/VisualStudio/CSharp.Build.props @@ -0,0 +1,11 @@ + + + + + true + $([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)wix.snk)) + + diff --git a/src/ext/VisualStudio/Cpp.Build.props b/src/ext/VisualStudio/Cpp.Build.props new file mode 100644 index 00000000..9b7a1bb5 --- /dev/null +++ b/src/ext/VisualStudio/Cpp.Build.props @@ -0,0 +1,86 @@ + + + + + + Win32 + $(BaseIntermediateOutputPath)$(Configuration)\$(Platform)\ + $(OutputPath)$(Platform)\ + + + + $([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0')) + + + + + $(DisableSpecificCompilerWarnings) + Level4 + $(ProjectDir)inc;$(MSBuildProjectDirectory);$(IntDir);$(SqlCESdkIncludePath);$(ProjectAdditionalIncludeDirectories);%(AdditionalIncludeDirectories) + WIN32;_WINDOWS;_WIN32_MSI=500;_WIN32_WINNT=0x0501;$(ArmPreprocessorDefinitions);$(UnicodePreprocessorDefinitions);_CRT_STDIO_LEGACY_WIDE_SPECIFIERS;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) + Use + precomp.h + StdCall + true + false + -YlprecompDefine + /Zc:threadSafeInit- %(AdditionalOptions) + true + + + $(ArmPreprocessorDefinitions);%(PreprocessorDefinitions) + $(ProjectAdditionalResourceIncludeDirectories);%(AdditionalIncludeDirectories) + + + $(OutDir);$(AdditionalMultiTargetLibraryPath);$(ProjectAdditionalLibraryDirectories);%(AdditionalLibraryDirectories) + + + $(ProjectSubSystem) + $(ProjectModuleDefinitionFile) + $(ResourceOnlyDll) + true + $(ProjectAdditionalLinkLibraries);advapi32.lib;comdlg32.lib;user32.lib;oleaut32.lib;gdi32.lib;shell32.lib;ole32.lib;version.lib;%(AdditionalDependencies) + $(OutDir);$(AdditionalMultiTargetLibraryPath);$(ArmLibraryDirectories);$(ProjectAdditionalLinkLibraryDirectories);%(AdditionalLibraryDirectories) + /IGNORE:4099 %(AdditionalOptions) + + + + + + NoExtensions + + + + + CDecl + + + + + OldStyle + true + true + + + + + Disabled + EnableFastChecks + _DEBUG;DEBUG;%(PreprocessorDefinitions) + MultiThreadedDebug + + + + + MinSpace + NDEBUG;%(PreprocessorDefinitions) + true + true + MultiThreaded + + + true + true + + + diff --git a/src/ext/VisualStudio/Directory.Build.props b/src/ext/VisualStudio/Directory.Build.props new file mode 100644 index 00000000..b3c6287c --- /dev/null +++ b/src/ext/VisualStudio/Directory.Build.props @@ -0,0 +1,27 @@ + + + + + + Debug + false + MSB3246 + + $(MSBuildProjectName) + $([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)..\build\)) + $(BaseOutputPath)obj\$(ProjectName)\ + $(BaseOutputPath)$(Configuration)\ + + WiX Toolset Team + WiX Toolset + Copyright (c) .NET Foundation and contributors. All rights reserved. + MS-RL + WiX Toolset + + + + + diff --git a/src/ext/VisualStudio/Directory.Build.targets b/src/ext/VisualStudio/Directory.Build.targets new file mode 100644 index 00000000..2fcc765a --- /dev/null +++ b/src/ext/VisualStudio/Directory.Build.targets @@ -0,0 +1,51 @@ + + + + + + + true + $(SolutionPath) + $(NCrunchOriginalSolutionPath) + + + + + + + $([System.IO.File]::ReadAllText($(TheSolutionPath))) + $([System.IO.Path]::GetDirectoryName( $(TheSolutionPath) )) + (?<="[PackageName]", ")(.*)(?=", ") + + + + + + %(Identity) + $(SolutionFileContent.Contains('\%(Identity).csproj')) + + + + + $(RegexPattern.Replace('[PackageName]','%(PackageName)') ) + $([System.Text.RegularExpressions.Regex]::Match('$(SolutionFileContent)', '%(Pattern)')) + + + + + + + + + + + + + + diff --git a/src/ext/VisualStudio/Directory.csproj.props b/src/ext/VisualStudio/Directory.csproj.props new file mode 100644 index 00000000..81d24ad1 --- /dev/null +++ b/src/ext/VisualStudio/Directory.csproj.props @@ -0,0 +1,13 @@ + + + + + true + true + $([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)wix.snk)) + false + + diff --git a/src/ext/VisualStudio/Directory.csproj.targets b/src/ext/VisualStudio/Directory.csproj.targets new file mode 100644 index 00000000..c3270426 --- /dev/null +++ b/src/ext/VisualStudio/Directory.csproj.targets @@ -0,0 +1,26 @@ + + + + + false + $(OutputPath)\$(AssemblyName).xml + + + + + $(PrivateRepositoryUrl.Replace('.git','')) + + $(MSBuildProjectName).nuspec + $(OutputPath)..\ + $(NuspecProperties);Id=$(PackageId);Authors=$(Authors);Copyright=$(Copyright);Description=$(Description);Title=$(Title) + $(NuspecProperties);Version=$(PackageVersion);RepositoryCommit=$(SourceRevisionId);RepositoryType=$(RepositoryType);RepositoryUrl=$(PrivateRepositoryUrl);ProjectFolder=$(MSBuildProjectDirectory)\;ProjectUrl=$(ProjectUrl) + true + snupkg + + + + diff --git a/src/ext/VisualStudio/Directory.vcxproj.props b/src/ext/VisualStudio/Directory.vcxproj.props new file mode 100644 index 00000000..bcf26c57 --- /dev/null +++ b/src/ext/VisualStudio/Directory.vcxproj.props @@ -0,0 +1,111 @@ + + + + + + Win32 + $(BaseIntermediateOutputPath)$(Configuration)\$(Platform)\ + $(OutputPath)$(Platform)\ + + + $(Company) + $(Copyright) + + win-x86;win-x64;win-arm64 + native,Version=v0.0 + + + + $([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0')) + + + + + $(DisableSpecificCompilerWarnings) + Level4 + $(ProjectDir)inc;$(MSBuildProjectDirectory);$(IntDir);$(SqlCESdkIncludePath);$(ProjectAdditionalIncludeDirectories);%(AdditionalIncludeDirectories) + WIN32;_WINDOWS;_WIN32_MSI=500;_WIN32_WINNT=0x0501;$(ArmPreprocessorDefinitions);$(UnicodePreprocessorDefinitions);_CRT_STDIO_LEGACY_WIDE_SPECIFIERS;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions) + Use + precomp.h + StdCall + true + false + -YlprecompDefine + /Zc:threadSafeInit- %(AdditionalOptions) + true + + + $(ArmPreprocessorDefinitions);%(PreprocessorDefinitions) + $(ProjectAdditionalResourceIncludeDirectories);%(AdditionalIncludeDirectories) + + + $(OutDir);$(AdditionalMultiTargetLibraryPath);$(ProjectAdditionalLibraryDirectories);%(AdditionalLibraryDirectories) + + + $(ProjectSubSystem) + $(ProjectModuleDefinitionFile) + $(ResourceOnlyDll) + true + $(ProjectAdditionalLinkLibraries);advapi32.lib;comdlg32.lib;user32.lib;oleaut32.lib;gdi32.lib;shell32.lib;ole32.lib;version.lib;%(AdditionalDependencies) + $(OutDir);$(AdditionalMultiTargetLibraryPath);$(ArmLibraryDirectories);$(ProjectAdditionalLinkLibraryDirectories);%(AdditionalLibraryDirectories) + /IGNORE:4099 %(AdditionalOptions) + + + + + + NoExtensions + + + + + CDecl + + + + + OldStyle + true + true + + + + + Disabled + EnableFastChecks + _DEBUG;DEBUG;%(PreprocessorDefinitions) + MultiThreadedDebug + + + + + + MultiThreadedDebugDll + + + + + MinSpace + NDEBUG;%(PreprocessorDefinitions) + true + true + MultiThreaded + + + true + true + + + + + + MultiThreadedDll + + + + + $(LinkKeyFile) + $(LinkDelaySign) + + + diff --git a/src/ext/VisualStudio/README.md b/src/ext/VisualStudio/README.md new file mode 100644 index 00000000..76fbd4ce --- /dev/null +++ b/src/ext/VisualStudio/README.md @@ -0,0 +1,2 @@ +# VisualStudio.wixext +WixToolset.VisualStudio.wixext - Visual Studio WiX Toolset Extension diff --git a/src/ext/VisualStudio/VisualStudio.wixext.sln b/src/ext/VisualStudio/VisualStudio.wixext.sln new file mode 100644 index 00000000..9d6a8356 --- /dev/null +++ b/src/ext/VisualStudio/VisualStudio.wixext.sln @@ -0,0 +1,73 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30611.23 +MinimumVisualStudioVersion = 15.0.26124.0 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vsca", "src\ca\vsca.vcxproj", "{45308B85-0628-4978-8FC8-6AD9E1AD5949}" +EndProject +Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "vs", "src\wixlib\vs.wixproj", "{14345C9D-8AF8-435A-BB1B-E067CE7EB321}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolset.VisualStudio.wixext", "src\wixext\WixToolset.VisualStudio.wixext.csproj", "{61BFD377-9DE1-48B4-8687-560DF68D6F3B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolsetTest.VisualStudio", "src\test\WixToolsetTest.VisualStudio\WixToolsetTest.VisualStudio.csproj", "{DD2BD0F7-1E4A-4D11-954C-3505323C4E1B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {45308B85-0628-4978-8FC8-6AD9E1AD5949}.Debug|Any CPU.ActiveCfg = Debug|Win32 + {45308B85-0628-4978-8FC8-6AD9E1AD5949}.Debug|Any CPU.Build.0 = Debug|Win32 + {45308B85-0628-4978-8FC8-6AD9E1AD5949}.Debug|x64.ActiveCfg = Debug|Win32 + {45308B85-0628-4978-8FC8-6AD9E1AD5949}.Debug|x86.ActiveCfg = Debug|Win32 + {45308B85-0628-4978-8FC8-6AD9E1AD5949}.Debug|x86.Build.0 = Debug|Win32 + {45308B85-0628-4978-8FC8-6AD9E1AD5949}.Release|Any CPU.ActiveCfg = Release|Win32 + {45308B85-0628-4978-8FC8-6AD9E1AD5949}.Release|x64.ActiveCfg = Release|Win32 + {45308B85-0628-4978-8FC8-6AD9E1AD5949}.Release|x86.ActiveCfg = Release|Win32 + {45308B85-0628-4978-8FC8-6AD9E1AD5949}.Release|x86.Build.0 = Release|Win32 + {61BFD377-9DE1-48B4-8687-560DF68D6F3B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {61BFD377-9DE1-48B4-8687-560DF68D6F3B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {61BFD377-9DE1-48B4-8687-560DF68D6F3B}.Debug|x64.ActiveCfg = Debug|Any CPU + {61BFD377-9DE1-48B4-8687-560DF68D6F3B}.Debug|x64.Build.0 = Debug|Any CPU + {61BFD377-9DE1-48B4-8687-560DF68D6F3B}.Debug|x86.ActiveCfg = Debug|Any CPU + {61BFD377-9DE1-48B4-8687-560DF68D6F3B}.Debug|x86.Build.0 = Debug|Any CPU + {61BFD377-9DE1-48B4-8687-560DF68D6F3B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {61BFD377-9DE1-48B4-8687-560DF68D6F3B}.Release|Any CPU.Build.0 = Release|Any CPU + {61BFD377-9DE1-48B4-8687-560DF68D6F3B}.Release|x64.ActiveCfg = Release|Any CPU + {61BFD377-9DE1-48B4-8687-560DF68D6F3B}.Release|x64.Build.0 = Release|Any CPU + {61BFD377-9DE1-48B4-8687-560DF68D6F3B}.Release|x86.ActiveCfg = Release|Any CPU + {61BFD377-9DE1-48B4-8687-560DF68D6F3B}.Release|x86.Build.0 = Release|Any CPU + {14345C9D-8AF8-435A-BB1B-E067CE7EB321}.Debug|Any CPU.ActiveCfg = Debug|x86 + {14345C9D-8AF8-435A-BB1B-E067CE7EB321}.Debug|Any CPU.Build.0 = Debug|x86 + {14345C9D-8AF8-435A-BB1B-E067CE7EB321}.Debug|x64.ActiveCfg = Debug|x86 + {14345C9D-8AF8-435A-BB1B-E067CE7EB321}.Debug|x86.ActiveCfg = Debug|x86 + {14345C9D-8AF8-435A-BB1B-E067CE7EB321}.Debug|x86.Build.0 = Debug|x86 + {14345C9D-8AF8-435A-BB1B-E067CE7EB321}.Release|Any CPU.ActiveCfg = Release|x86 + {14345C9D-8AF8-435A-BB1B-E067CE7EB321}.Release|x64.ActiveCfg = Release|x86 + {14345C9D-8AF8-435A-BB1B-E067CE7EB321}.Release|x86.ActiveCfg = Release|x86 + {14345C9D-8AF8-435A-BB1B-E067CE7EB321}.Release|x86.Build.0 = Release|x86 + {DD2BD0F7-1E4A-4D11-954C-3505323C4E1B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DD2BD0F7-1E4A-4D11-954C-3505323C4E1B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DD2BD0F7-1E4A-4D11-954C-3505323C4E1B}.Debug|x64.ActiveCfg = Debug|Any CPU + {DD2BD0F7-1E4A-4D11-954C-3505323C4E1B}.Debug|x64.Build.0 = Debug|Any CPU + {DD2BD0F7-1E4A-4D11-954C-3505323C4E1B}.Debug|x86.ActiveCfg = Debug|Any CPU + {DD2BD0F7-1E4A-4D11-954C-3505323C4E1B}.Debug|x86.Build.0 = Debug|Any CPU + {DD2BD0F7-1E4A-4D11-954C-3505323C4E1B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DD2BD0F7-1E4A-4D11-954C-3505323C4E1B}.Release|Any CPU.Build.0 = Release|Any CPU + {DD2BD0F7-1E4A-4D11-954C-3505323C4E1B}.Release|x64.ActiveCfg = Release|Any CPU + {DD2BD0F7-1E4A-4D11-954C-3505323C4E1B}.Release|x64.Build.0 = Release|Any CPU + {DD2BD0F7-1E4A-4D11-954C-3505323C4E1B}.Release|x86.ActiveCfg = Release|Any CPU + {DD2BD0F7-1E4A-4D11-954C-3505323C4E1B}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {E4566A6B-47D0-4EA0-989A-D763AC39105D} + EndGlobalSection +EndGlobal diff --git a/src/ext/VisualStudio/appveyor.cmd b/src/ext/VisualStudio/appveyor.cmd new file mode 100644 index 00000000..847809c3 --- /dev/null +++ b/src/ext/VisualStudio/appveyor.cmd @@ -0,0 +1,19 @@ +@setlocal +@pushd %~dp0 +@set _C=Release +@if /i "%1"=="debug" set _C=Debug + +:: Restore +msbuild -p:Configuration=%_C% -t:Restore || exit /b + +:: Build +msbuild -p:Configuration=%_C% src\test\WixToolsetTest.VisualStudio\WixToolsetTest.VisualStudio.csproj || exit /b + +:: Test +dotnet test -c %_C% --no-build src\test\WixToolsetTest.VisualStudio || exit /b + +:: Pack +msbuild -p:Configuration=%_C% -p:NoBuild=true -t:Pack src\wixext\WixToolset.VisualStudio.wixext.csproj || exit /b + +@popd +@endlocal diff --git a/src/ext/VisualStudio/appveyor.yml b/src/ext/VisualStudio/appveyor.yml new file mode 100644 index 00000000..c53cc9cc --- /dev/null +++ b/src/ext/VisualStudio/appveyor.yml @@ -0,0 +1,42 @@ +# Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. +# +# Do NOT modify this file. Update the canonical version in Home\repo-template\src\appveyor.yml +# then update all of the repos. + +branches: + only: + - master + - develop + +image: Visual Studio 2019 + +version: 0.0.0.{build} +configuration: Release + +environment: + DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true + DOTNET_CLI_TELEMETRY_OPTOUT: 1 + NUGET_XMLDOC_MODE: skip + +build_script: + - appveyor.cmd + +pull_requests: + do_not_increment_build_number: true + +nuget: + disable_publish_on_pr: true + +skip_branch_with_pr: true +skip_tags: true + +artifacts: +- path: build\Release\**\*.nupkg + name: nuget +- path: build\Release\**\*.snupkg + name: snupkg + +notifications: +- provider: Slack + incoming_webhook: + secure: p5xuu+4x2JHfwGDMDe5KcG1k7gZxqYc4jWVwvyNZv5cvkubPD2waJs5yXMAXZNN7Z63/3PWHb7q4KoY/99AjauYa1nZ4c5qYqRPFRBKTHfA= diff --git a/src/ext/VisualStudio/ca/dllmain.cpp b/src/ext/VisualStudio/ca/dllmain.cpp new file mode 100644 index 00000000..35ae6d1c --- /dev/null +++ b/src/ext/VisualStudio/ca/dllmain.cpp @@ -0,0 +1,26 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. + +#include "precomp.h" + +/******************************************************************** +DllMain - standard entry point for all WiX custom actions + +********************************************************************/ +extern "C" BOOL WINAPI DllMain( + IN HINSTANCE hInst, + IN ULONG ulReason, + IN LPVOID) +{ + switch(ulReason) + { + case DLL_PROCESS_ATTACH: + WcaGlobalInitialize(hInst); + break; + + case DLL_PROCESS_DETACH: + WcaGlobalFinalize(); + break; + } + + return TRUE; +} diff --git a/src/ext/VisualStudio/ca/precomp.h b/src/ext/VisualStudio/ca/precomp.h new file mode 100644 index 00000000..3edad7ed --- /dev/null +++ b/src/ext/VisualStudio/ca/precomp.h @@ -0,0 +1,13 @@ +#pragma once +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. + + +#include +#include + +#define MAXUINT USHRT_MAX +#include + +#include "wcautil.h" +#include "fileutil.h" +#include "strutil.h" diff --git a/src/ext/VisualStudio/ca/vsca.cpp b/src/ext/VisualStudio/ca/vsca.cpp new file mode 100644 index 00000000..54a54a34 --- /dev/null +++ b/src/ext/VisualStudio/ca/vsca.cpp @@ -0,0 +1,510 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. + +#include "precomp.h" + +typedef HRESULT (WINAPI *PFN_PROCESS_INSTANCE)( + __in_opt ISetupInstance* pInstance, + __in DWORD64 qwVersion, + __in BOOL fComplete + ); + +struct VS_INSTANCE +{ + DWORD64 qwMinVersion; + DWORD64 qwMaxVersion; + PFN_PROCESS_INSTANCE pfnProcessInstance; +}; + +struct VS_COMPONENT_PROPERTY +{ + LPCWSTR pwzComponent; + LPCWSTR pwzProperty; +}; + +static HRESULT InstanceInProducts( + __in ISetupInstance* pInstance, + __in DWORD cProducts, + __in LPCWSTR* rgwzProducts + ); + +static HRESULT InstanceIsGreater( + __in_opt ISetupInstance* pPreviousInstance, + __in DWORD64 qwPreviousVersion, + __in ISetupInstance* pCurrentInstance, + __in DWORD64 qwCurrentVersion + ); + +static HRESULT ProcessInstance( + __in ISetupInstance* pInstance, + __in LPCWSTR wzProperty, + __in DWORD cComponents, + __in VS_COMPONENT_PROPERTY* rgComponents + ); + +static HRESULT ProcessVS2017( + __in_opt ISetupInstance* pInstance, + __in DWORD64 qwVersion, + __in BOOL fComplete + ); + +static HRESULT ProcessVS2019( + __in_opt ISetupInstance* pInstance, + __in DWORD64 qwVersion, + __in BOOL fComplete + ); + +static HRESULT SetPropertyForComponent( + __in DWORD cComponents, + __in VS_COMPONENT_PROPERTY* rgComponents, + __in LPCWSTR wzComponent + ); + +static VS_INSTANCE vrgInstances[] = +{ + { FILEMAKEVERSION(15, 0, 0, 0), FILEMAKEVERSION(15, 0xffff, 0xffff, 0xffff), ProcessVS2017 }, + { FILEMAKEVERSION(16, 0, 0, 0), FILEMAKEVERSION(16, 0xffff, 0xffff, 0xffff), ProcessVS2019 }, +}; + +/****************************************************************** + FindInstances - entry point for VS custom action to find instances + +*******************************************************************/ +extern "C" UINT __stdcall FindInstances( + __in MSIHANDLE hInstall + ) +{ + HRESULT hr = S_OK; + UINT er = ERROR_SUCCESS; + BOOL fComInitialized = FALSE; + ISetupConfiguration* pConfiguration = NULL; + ISetupHelper* pHelper = NULL; + IEnumSetupInstances* pEnumInstances = NULL; + ISetupInstance* rgpInstances[1] = {}; + ISetupInstance* pInstance = NULL; + ULONG cInstancesFetched = 0; + BSTR bstrVersion = NULL; + DWORD64 qwVersion = 0; + + hr = WcaInitialize(hInstall, "VSFindInstances"); + ExitOnFailure(hr, "Failed to initialize custom action."); + + hr = ::CoInitialize(NULL); + ExitOnFailure(hr, "Failed to initialize COM."); + + fComInitialized = TRUE; + + hr = ::CoCreateInstance(__uuidof(SetupConfiguration), NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pConfiguration)); + if (REGDB_E_CLASSNOTREG != hr) + { + ExitOnFailure(hr, "Failed to initialize setup configuration class."); + } + else + { + WcaLog(LOGMSG_VERBOSE, "Setup configuration not registered; assuming no instances installed."); + + hr = S_OK; + ExitFunction(); + } + + hr = pConfiguration->QueryInterface(IID_PPV_ARGS(&pHelper)); + if (FAILED(hr)) + { + WcaLog(LOGMSG_VERBOSE, "Setup configuration helpers not implemented; assuming Visual Studio 2017."); + + qwVersion = FILEMAKEVERSION(15, 0, 0, 0); + hr = S_OK; + } + + hr = pConfiguration->EnumInstances(&pEnumInstances); + ExitOnFailure(hr, "Failed to get instance enumerator."); + + do + { + hr = pEnumInstances->Next(1, rgpInstances, &cInstancesFetched); + if (SUCCEEDED(hr) && cInstancesFetched) + { + pInstance = rgpInstances[0]; + if (pInstance) + { + if (pHelper) + { + hr = pInstance->GetInstallationVersion(&bstrVersion); + ExitOnFailure(hr, "Failed to get installation version."); + + hr = pHelper->ParseVersion(bstrVersion, &qwVersion); + ExitOnFailure(hr, "Failed to parse installation version."); + } + + for (DWORD i = 0; i < countof(vrgInstances); ++i) + { + const VS_INSTANCE* pElem = &vrgInstances[i]; + + if (pElem->qwMinVersion <= qwVersion && qwVersion <= pElem->qwMaxVersion) + { + hr = pElem->pfnProcessInstance(pInstance, qwVersion, FALSE); + ExitOnFailure(hr, "Failed to process instance."); + } + } + } + + ReleaseNullBSTR(bstrVersion); + ReleaseNullObject(pInstance); + } + } while (SUCCEEDED(hr) && cInstancesFetched); + + // Complete all registered processing functions. + for (DWORD i = 0; i < countof(vrgInstances); ++i) + { + const VS_INSTANCE* pElem = &vrgInstances[i]; + + hr = pElem->pfnProcessInstance(NULL, 0, TRUE); + ExitOnFailure(hr, "Failed to process latest instance."); + } + +LExit: + ReleaseBSTR(bstrVersion); + ReleaseObject(pInstance); + ReleaseObject(pEnumInstances); + ReleaseObject(pHelper); + ReleaseObject(pConfiguration); + + if (fComInitialized) + { + ::CoUninitialize(); + } + + if (FAILED(hr)) + { + er = ERROR_INSTALL_FAILURE; + } + + return WcaFinalize(er); +} + +static HRESULT InstanceInProducts( + __in ISetupInstance* pInstance, + __in DWORD cProducts, + __in LPCWSTR* rgwzProducts + ) +{ + HRESULT hr = S_OK; + ISetupInstance2* pInstance2 = NULL; + ISetupPackageReference* pProduct = NULL; + BSTR bstrId = NULL; + + hr = pInstance->QueryInterface(IID_PPV_ARGS(&pInstance2)); + if (FAILED(hr)) + { + // Older implementations shipped when only VS SKUs were supported. + WcaLog(LOGMSG_VERBOSE, "Could not query instance for product information; assuming supported product."); + + hr = S_OK; + ExitFunction(); + } + + hr = pInstance2->GetProduct(&pProduct); + ExitOnFailure(hr, "Failed to get product package reference."); + + hr = pProduct->GetId(&bstrId); + ExitOnFailure(hr, "Failed to get product package ID."); + + for (DWORD i = 0; i < cProducts; ++i) + { + const LPCWSTR wzProduct = rgwzProducts[i]; + + if (CSTR_EQUAL == ::CompareStringW(LOCALE_NEUTRAL, NORM_IGNORECASE, bstrId, -1, wzProduct, -1)) + { + hr = S_OK; + ExitFunction(); + } + } + + hr = S_FALSE; + +LExit: + ReleaseBSTR(bstrId); + ReleaseObject(pProduct); + ReleaseObject(pInstance2); + + return hr; +} + +static HRESULT InstanceIsGreater( + __in_opt ISetupInstance* pPreviousInstance, + __in DWORD64 qwPreviousVersion, + __in ISetupInstance* pCurrentInstance, + __in DWORD64 qwCurrentVersion + ) +{ + HRESULT hr = S_OK; + FILETIME ftPreviousInstance = {}; + FILETIME ftCurrentInstance = {}; + + if (qwPreviousVersion != qwCurrentVersion) + { + return qwPreviousVersion < qwCurrentVersion ? S_OK : S_FALSE; + } + + hr = pPreviousInstance->GetInstallDate(&ftPreviousInstance); + ExitOnFailure(hr, "Failed to get previous install date."); + + hr = pCurrentInstance->GetInstallDate(&ftCurrentInstance); + ExitOnFailure(hr, "Failed to get current install date."); + + return 0 > ::CompareFileTime(&ftPreviousInstance, &ftCurrentInstance) ? S_OK : S_FALSE; + +LExit: + return hr; +} + +static HRESULT ProcessInstance( + __in ISetupInstance* pInstance, + __in LPCWSTR wzProperty, + __in DWORD cComponents, + __in VS_COMPONENT_PROPERTY* rgComponents + ) +{ + HRESULT hr = S_OK; + ISetupInstance2* pInstance2 = NULL; + BSTR bstrPath = NULL; + LPSAFEARRAY psaPackages = NULL; + LONG lPackageIndex = 0; + LONG clMaxPackages = 0; + ISetupPackageReference** rgpPackages = NULL; + ISetupPackageReference* pPackage = NULL; + BSTR bstrPackageId = NULL; + + hr = pInstance->GetInstallationPath(&bstrPath); + ExitOnFailure(hr, "Failed to get installation path."); + + hr = WcaSetProperty(wzProperty, bstrPath); + ExitOnFailure(hr, "Failed to set installation path property: %ls", wzProperty); + + hr = pInstance->QueryInterface(IID_PPV_ARGS(&pInstance2)); + if (FAILED(hr)) + { + // Older implementation did not expose installed components. + hr = S_OK; + ExitFunction(); + } + + hr = pInstance2->GetPackages(&psaPackages); + ExitOnFailure(hr, "Failed to get packages from instance."); + + hr = ::SafeArrayGetLBound(psaPackages, 1, &lPackageIndex); + ExitOnFailure(hr, "Failed to get lower bound of packages array."); + + hr = ::SafeArrayGetUBound(psaPackages, 1, &clMaxPackages); + ExitOnFailure(hr, "Failed to get upper bound of packages array."); + + // Faster access to single dimension SAFEARRAY elements. + hr = ::SafeArrayAccessData(psaPackages, reinterpret_cast(&rgpPackages)); + ExitOnFailure(hr, "Failed to access packages array.") + + for (; lPackageIndex <= clMaxPackages; ++lPackageIndex) + { + pPackage = rgpPackages[lPackageIndex]; + + if (pPackage) + { + hr = pPackage->GetId(&bstrPackageId); + ExitOnFailure(hr, "Failed to get package ID."); + + hr = SetPropertyForComponent(cComponents, rgComponents, bstrPackageId); + ExitOnFailure(hr, "Failed to set property for component: %ls", bstrPackageId); + + ReleaseNullBSTR(bstrPackageId); + } + } + +LExit: + ReleaseBSTR(bstrPackageId); + + if (rgpPackages) + { + ::SafeArrayUnaccessData(psaPackages); + } + + if (psaPackages) + { + // This will Release() all objects in the array. + ::SafeArrayDestroy(psaPackages); + } + + ReleaseObject(pInstance2); + ReleaseBSTR(bstrPath); + + return hr; +} + +static HRESULT ProcessVS2017( + __in_opt ISetupInstance* pInstance, + __in DWORD64 qwVersion, + __in BOOL fComplete + ) +{ + static ISetupInstance* pLatest = NULL; + static DWORD64 qwLatest = 0; + + static LPCWSTR rgwzProducts[] = + { + L"Microsoft.VisualStudio.Product.Community", + L"Microsoft.VisualStudio.Product.Professional", + L"Microsoft.VisualStudio.Product.Enterprise", + }; + + // TODO: Consider making table-driven with these defaults per-version for easy customization. + static VS_COMPONENT_PROPERTY rgComponents[] = + { + { L"Microsoft.VisualStudio.Component.FSharp", L"VS2017_IDE_FSHARP_PROJECTSYSTEM_INSTALLED" }, + { L"Microsoft.VisualStudio.Component.Roslyn.LanguageServices", L"VS2017_IDE_VB_PROJECTSYSTEM_INSTALLED" }, + { L"Microsoft.VisualStudio.Component.Roslyn.LanguageServices", L"VS2017_IDE_VCSHARP_PROJECTSYSTEM_INSTALLED" }, + { L"Microsoft.VisualStudio.Component.TestTools.Core", L"VS2017_IDE_VSTS_TESTSYSTEM_INSTALLED" }, + { L"Microsoft.VisualStudio.Component.VC.CoreIde", L"VS2017_IDE_VC_PROJECTSYSTEM_INSTALLED" }, + { L"Microsoft.VisualStudio.Component.Web", L"VS2017_IDE_VWD_PROJECTSYSTEM_INSTALLED" }, + { L"Microsoft.VisualStudio.PackageGroup.DslRuntime", L"VS2017_IDE_MODELING_PROJECTSYSTEM_INSTALLED" }, + }; + + HRESULT hr = S_OK; + + if (fComplete) + { + if (pLatest) + { + hr = ProcessInstance(pLatest, L"VS2017_ROOT_FOLDER", countof(rgComponents), rgComponents); + ExitOnFailure(hr, "Failed to process VS2017 instance."); + } + } + else if (pInstance) + { + hr = InstanceInProducts(pInstance, countof(rgwzProducts), rgwzProducts); + ExitOnFailure(hr, "Failed to compare product IDs."); + + if (S_FALSE == hr) + { + ExitFunction(); + } + + hr = InstanceIsGreater(pLatest, qwLatest, pInstance, qwVersion); + ExitOnFailure(hr, "Failed to compare instances."); + + if (S_FALSE == hr) + { + ExitFunction(); + } + + ReleaseNullObject(pLatest); + + pLatest = pInstance; + qwLatest = qwVersion; + + // Caller will do a final Release() otherwise. + pLatest->AddRef(); + } + +LExit: + if (fComplete) + { + ReleaseObject(pLatest); + } + + return hr; +} + +static HRESULT ProcessVS2019( + __in_opt ISetupInstance* pInstance, + __in DWORD64 qwVersion, + __in BOOL fComplete + ) +{ + static ISetupInstance* pLatest = NULL; + static DWORD64 qwLatest = 0; + + static LPCWSTR rgwzProducts[] = + { + L"Microsoft.VisualStudio.Product.Community", + L"Microsoft.VisualStudio.Product.Professional", + L"Microsoft.VisualStudio.Product.Enterprise", + }; + + // TODO: Consider making table-driven with these defaults per-version for easy customization. + static VS_COMPONENT_PROPERTY rgComponents[] = + { + { L"Microsoft.VisualStudio.Component.FSharp", L"VS2019_IDE_FSHARP_PROJECTSYSTEM_INSTALLED" }, + { L"Microsoft.VisualStudio.Component.Roslyn.LanguageServices", L"VS2019_IDE_VB_PROJECTSYSTEM_INSTALLED" }, + { L"Microsoft.VisualStudio.Component.Roslyn.LanguageServices", L"VS2019_IDE_VCSHARP_PROJECTSYSTEM_INSTALLED" }, + { L"Microsoft.VisualStudio.PackageGroup.TestTools.Core", L"VS2019_IDE_VSTS_TESTSYSTEM_INSTALLED" }, + { L"Microsoft.VisualStudio.Component.VC.CoreIde", L"VS2019_IDE_VC_PROJECTSYSTEM_INSTALLED" }, + { L"Microsoft.VisualStudio.Component.Web", L"VS2019_IDE_VWD_PROJECTSYSTEM_INSTALLED" }, + { L"Microsoft.VisualStudio.PackageGroup.DslRuntime", L"VS2019_IDE_MODELING_PROJECTSYSTEM_INSTALLED" }, + }; + + HRESULT hr = S_OK; + + if (fComplete) + { + if (pLatest) + { + hr = ProcessInstance(pLatest, L"VS2019_ROOT_FOLDER", countof(rgComponents), rgComponents); + ExitOnFailure(hr, "Failed to process VS2019 instance."); + } + } + else if (pInstance) + { + hr = InstanceInProducts(pInstance, countof(rgwzProducts), rgwzProducts); + ExitOnFailure(hr, "Failed to compare product IDs."); + + if (S_FALSE == hr) + { + ExitFunction(); + } + + hr = InstanceIsGreater(pLatest, qwLatest, pInstance, qwVersion); + ExitOnFailure(hr, "Failed to compare instances."); + + if (S_FALSE == hr) + { + ExitFunction(); + } + + ReleaseNullObject(pLatest); + + pLatest = pInstance; + qwLatest = qwVersion; + + // Caller will do a final Release() otherwise. + pLatest->AddRef(); + } + +LExit: + if (fComplete) + { + ReleaseObject(pLatest); + } + + return hr; +} + +static HRESULT SetPropertyForComponent( + __in DWORD cComponents, + __in VS_COMPONENT_PROPERTY* rgComponents, + __in LPCWSTR wzComponent + ) +{ + HRESULT hr = S_OK; + + // For small arrays, faster looping through than hashing. There may also be duplicates like with VS2017. + for (DWORD i = 0; i < cComponents; ++i) + { + const VS_COMPONENT_PROPERTY* pComponent = &rgComponents[i]; + + if (CSTR_EQUAL == ::CompareStringW(LOCALE_NEUTRAL, NORM_IGNORECASE, pComponent->pwzComponent, -1, wzComponent, -1)) + { + hr = WcaSetIntProperty(pComponent->pwzProperty, 1); + ExitOnFailure(hr, "Failed to set property: %ls", pComponent->pwzProperty); + } + } + +LExit: + return hr; +} diff --git a/src/ext/VisualStudio/ca/vsca.def b/src/ext/VisualStudio/ca/vsca.def new file mode 100644 index 00000000..fd2db98e --- /dev/null +++ b/src/ext/VisualStudio/ca/vsca.def @@ -0,0 +1,7 @@ +; Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. + + +LIBRARY "vsca" + +EXPORTS + FindInstances diff --git a/src/ext/VisualStudio/ca/vsca.vcxproj b/src/ext/VisualStudio/ca/vsca.vcxproj new file mode 100644 index 00000000..f4fbcc46 --- /dev/null +++ b/src/ext/VisualStudio/ca/vsca.vcxproj @@ -0,0 +1,58 @@ + + + + + + + Debug + Win32 + + + Release + Win32 + + + + + {45308B85-0628-4978-8FC8-6AD9E1AD5949} + DynamicLibrary + vsca + v142 + Unicode + vsca.def + WiX Toolset VS CustomAction + 10.0 + + + + + + + msi.lib + + + + + Create + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ext/VisualStudio/nuget.config b/src/ext/VisualStudio/nuget.config new file mode 100644 index 00000000..6fb99260 --- /dev/null +++ b/src/ext/VisualStudio/nuget.config @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/ext/VisualStudio/test/WixToolsetTest.VisualStudio/TestData/UsingVsixPackage/Package.en-us.wxl b/src/ext/VisualStudio/test/WixToolsetTest.VisualStudio/TestData/UsingVsixPackage/Package.en-us.wxl new file mode 100644 index 00000000..38c12ac1 --- /dev/null +++ b/src/ext/VisualStudio/test/WixToolsetTest.VisualStudio/TestData/UsingVsixPackage/Package.en-us.wxl @@ -0,0 +1,11 @@ + + + + + + A newer version of [ProductName] is already installed. + MsiPackage + + diff --git a/src/ext/VisualStudio/test/WixToolsetTest.VisualStudio/TestData/UsingVsixPackage/Package.wxs b/src/ext/VisualStudio/test/WixToolsetTest.VisualStudio/TestData/UsingVsixPackage/Package.wxs new file mode 100644 index 00000000..c2196807 --- /dev/null +++ b/src/ext/VisualStudio/test/WixToolsetTest.VisualStudio/TestData/UsingVsixPackage/Package.wxs @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/src/ext/VisualStudio/test/WixToolsetTest.VisualStudio/TestData/UsingVsixPackage/PackageComponents.wxs b/src/ext/VisualStudio/test/WixToolsetTest.VisualStudio/TestData/UsingVsixPackage/PackageComponents.wxs new file mode 100644 index 00000000..c8c72cc0 --- /dev/null +++ b/src/ext/VisualStudio/test/WixToolsetTest.VisualStudio/TestData/UsingVsixPackage/PackageComponents.wxs @@ -0,0 +1,14 @@ + + + + + + + + + + + + + diff --git a/src/ext/VisualStudio/test/WixToolsetTest.VisualStudio/TestData/UsingVsixPackage/example.txt b/src/ext/VisualStudio/test/WixToolsetTest.VisualStudio/TestData/UsingVsixPackage/example.txt new file mode 100644 index 00000000..1b4ffe8a --- /dev/null +++ b/src/ext/VisualStudio/test/WixToolsetTest.VisualStudio/TestData/UsingVsixPackage/example.txt @@ -0,0 +1 @@ +This is example.txt. \ No newline at end of file diff --git a/src/ext/VisualStudio/test/WixToolsetTest.VisualStudio/VisualStudioExtensionFixture.cs b/src/ext/VisualStudio/test/WixToolsetTest.VisualStudio/VisualStudioExtensionFixture.cs new file mode 100644 index 00000000..306962e3 --- /dev/null +++ b/src/ext/VisualStudio/test/WixToolsetTest.VisualStudio/VisualStudioExtensionFixture.cs @@ -0,0 +1,45 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. + +namespace WixToolsetTest.VisualStudio +{ + using System.Linq; + using WixBuildTools.TestSupport; + using WixToolset.Core.TestPackage; + using WixToolset.VisualStudio; + using Xunit; + + public class VisualStudioExtensionFixture + { + [Fact] + public void CanBuildUsingVsixPackage() + { + var folder = TestData.Get(@"TestData\UsingVsixPackage"); + var build = new Builder(folder, typeof(VSExtensionFactory), new[] { folder }); + + var results = build.BuildAndQuery(Build, "CustomAction"); + Assert.Equal(new[] + { + "CustomAction:SetVS2010Vsix\t51\tVS_VSIX_INSTALLER_PATH\t[VS2010_VSIX_INSTALLER_PATH]\t", + "CustomAction:SetVS2012Vsix\t51\tVS_VSIX_INSTALLER_PATH\t[VS2012_VSIX_INSTALLER_PATH]\t", + "CustomAction:SetVS2013Vsix\t51\tVS_VSIX_INSTALLER_PATH\t[VS2013_VSIX_INSTALLER_PATH]\t", + "CustomAction:SetVS2015Vsix\t51\tVS_VSIX_INSTALLER_PATH\t[VS2015_VSIX_INSTALLER_PATH]\t", + "CustomAction:vimLa9TyFoAVwf8JmA0_ZJHA69J2fo\t3122\tVS_VSIX_INSTALLER_PATH\t/q \"[#filzi8nwT8Ta133xcfp7qSIdGdRiC0]\" /admin\t", + "CustomAction:viuMpl8IvFSDAzTulrmpAzBwAmCRTQ\t1074\tVS_VSIX_INSTALLER_PATH\t/q \"[#filzi8nwT8Ta133xcfp7qSIdGdRiC0]\"\t", + "CustomAction:vrmLa9TyFoAVwf8JmA0_ZJHA69J2fo\t3442\tVS_VSIX_INSTALLER_PATH\t/q /u:\"ExampleVsix\" /admin\t", + "CustomAction:vruMpl8IvFSDAzTulrmpAzBwAmCRTQ\t1394\tVS_VSIX_INSTALLER_PATH\t/q /u:\"ExampleVsix\"\t", + "CustomAction:VSFindInstances\t257\tVSCA\tFindInstances\t", + "CustomAction:vumLa9TyFoAVwf8JmA0_ZJHA69J2fo\t3186\tVS_VSIX_INSTALLER_PATH\t/q /u:\"ExampleVsix\" /admin\t", + "CustomAction:vuuMpl8IvFSDAzTulrmpAzBwAmCRTQ\t1138\tVS_VSIX_INSTALLER_PATH\t/q /u:\"ExampleVsix\"\t", + "CustomAction:Vwd2012VsixWhenVSAbsent\t51\tVS_VSIX_INSTALLER_PATH\t[VWD2012_VSIX_INSTALL_ROOT]\\Common7\\IDE\\VSIXInstaller.exe\t", + "CustomAction:Vwd2013VsixWhenVSAbsent\t51\tVS_VSIX_INSTALLER_PATH\t[VWD2013_VSIX_INSTALL_ROOT]\\Common7\\IDE\\VSIXInstaller.exe\t", + "CustomAction:Vwd2015VsixWhenVSAbsent\t51\tVS_VSIX_INSTALLER_PATH\t[VWD2015_VSIX_INSTALL_ROOT]\\Common7\\IDE\\VSIXInstaller.exe\t", + }, results); + } + + private static void Build(string[] args) + { + var result = WixRunner.Execute(args) + .AssertSuccess(); + } + } +} diff --git a/src/ext/VisualStudio/test/WixToolsetTest.VisualStudio/WixToolsetTest.VisualStudio.csproj b/src/ext/VisualStudio/test/WixToolsetTest.VisualStudio/WixToolsetTest.VisualStudio.csproj new file mode 100644 index 00000000..9172569f --- /dev/null +++ b/src/ext/VisualStudio/test/WixToolsetTest.VisualStudio/WixToolsetTest.VisualStudio.csproj @@ -0,0 +1,38 @@ + + + + + + netcoreapp3.1 + false + + + + NU1701 + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ext/VisualStudio/test/WixToolsetTest.VisualStudio/WixToolsetTest.VisualStudio.v3.ncrunchproject b/src/ext/VisualStudio/test/WixToolsetTest.VisualStudio/WixToolsetTest.VisualStudio.v3.ncrunchproject new file mode 100644 index 00000000..7b5b2139 --- /dev/null +++ b/src/ext/VisualStudio/test/WixToolsetTest.VisualStudio/WixToolsetTest.VisualStudio.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/src/ext/VisualStudio/wix.snk b/src/ext/VisualStudio/wix.snk new file mode 100644 index 00000000..3908a66a Binary files /dev/null and b/src/ext/VisualStudio/wix.snk differ diff --git a/src/ext/VisualStudio/wixext/Symbols/HelpFileSymbol.cs b/src/ext/VisualStudio/wixext/Symbols/HelpFileSymbol.cs new file mode 100644 index 00000000..8078f4ab --- /dev/null +++ b/src/ext/VisualStudio/wixext/Symbols/HelpFileSymbol.cs @@ -0,0 +1,95 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. + +namespace WixToolset.VisualStudio +{ + using WixToolset.Data; + using WixToolset.VisualStudio.Symbols; + + public static partial class VSSymbolDefinitions + { + public static readonly IntermediateSymbolDefinition HelpFile = new IntermediateSymbolDefinition( + VSSymbolDefinitionType.HelpFile.ToString(), + new[] + { + new IntermediateFieldDefinition(nameof(HelpFileSymbolFields.HelpFileName), IntermediateFieldType.String), + new IntermediateFieldDefinition(nameof(HelpFileSymbolFields.LangID), IntermediateFieldType.Number), + new IntermediateFieldDefinition(nameof(HelpFileSymbolFields.HxSFileRef), IntermediateFieldType.String), + new IntermediateFieldDefinition(nameof(HelpFileSymbolFields.HxIFileRef), IntermediateFieldType.String), + new IntermediateFieldDefinition(nameof(HelpFileSymbolFields.HxQFileRef), IntermediateFieldType.String), + new IntermediateFieldDefinition(nameof(HelpFileSymbolFields.HxRFileRef), IntermediateFieldType.String), + new IntermediateFieldDefinition(nameof(HelpFileSymbolFields.SamplesFileRef), IntermediateFieldType.String), + }, + typeof(HelpFileSymbol)); + } +} + +namespace WixToolset.VisualStudio.Symbols +{ + using WixToolset.Data; + + public enum HelpFileSymbolFields + { + HelpFileName, + LangID, + HxSFileRef, + HxIFileRef, + HxQFileRef, + HxRFileRef, + SamplesFileRef, + } + + public class HelpFileSymbol : IntermediateSymbol + { + public HelpFileSymbol() : base(VSSymbolDefinitions.HelpFile, null, null) + { + } + + public HelpFileSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(VSSymbolDefinitions.HelpFile, sourceLineNumber, id) + { + } + + public IntermediateField this[HelpFileSymbolFields index] => this.Fields[(int)index]; + + public string HelpFileName + { + get => this.Fields[(int)HelpFileSymbolFields.HelpFileName].AsString(); + set => this.Set((int)HelpFileSymbolFields.HelpFileName, value); + } + + public int? LangID + { + get => this.Fields[(int)HelpFileSymbolFields.LangID].AsNullableNumber(); + set => this.Set((int)HelpFileSymbolFields.LangID, value); + } + + public string HxSFileRef + { + get => this.Fields[(int)HelpFileSymbolFields.HxSFileRef].AsString(); + set => this.Set((int)HelpFileSymbolFields.HxSFileRef, value); + } + + public string HxIFileRef + { + get => this.Fields[(int)HelpFileSymbolFields.HxIFileRef].AsString(); + set => this.Set((int)HelpFileSymbolFields.HxIFileRef, value); + } + + public string HxQFileRef + { + get => this.Fields[(int)HelpFileSymbolFields.HxQFileRef].AsString(); + set => this.Set((int)HelpFileSymbolFields.HxQFileRef, value); + } + + public string HxRFileRef + { + get => this.Fields[(int)HelpFileSymbolFields.HxRFileRef].AsString(); + set => this.Set((int)HelpFileSymbolFields.HxRFileRef, value); + } + + public string SamplesFileRef + { + get => this.Fields[(int)HelpFileSymbolFields.SamplesFileRef].AsString(); + set => this.Set((int)HelpFileSymbolFields.SamplesFileRef, value); + } + } +} \ No newline at end of file diff --git a/src/ext/VisualStudio/wixext/Symbols/HelpFileToNamespaceSymbol.cs b/src/ext/VisualStudio/wixext/Symbols/HelpFileToNamespaceSymbol.cs new file mode 100644 index 00000000..f18d6701 --- /dev/null +++ b/src/ext/VisualStudio/wixext/Symbols/HelpFileToNamespaceSymbol.cs @@ -0,0 +1,55 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. + +namespace WixToolset.VisualStudio +{ + using WixToolset.Data; + using WixToolset.VisualStudio.Symbols; + + public static partial class VSSymbolDefinitions + { + public static readonly IntermediateSymbolDefinition HelpFileToNamespace = new IntermediateSymbolDefinition( + VSSymbolDefinitionType.HelpFileToNamespace.ToString(), + new[] + { + new IntermediateFieldDefinition(nameof(HelpFileToNamespaceSymbolFields.HelpFileRef), IntermediateFieldType.String), + new IntermediateFieldDefinition(nameof(HelpFileToNamespaceSymbolFields.HelpNamespaceRef), IntermediateFieldType.String), + }, + typeof(HelpFileToNamespaceSymbol)); + } +} + +namespace WixToolset.VisualStudio.Symbols +{ + using WixToolset.Data; + + public enum HelpFileToNamespaceSymbolFields + { + HelpFileRef, + HelpNamespaceRef, + } + + public class HelpFileToNamespaceSymbol : IntermediateSymbol + { + public HelpFileToNamespaceSymbol() : base(VSSymbolDefinitions.HelpFileToNamespace, null, null) + { + } + + public HelpFileToNamespaceSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(VSSymbolDefinitions.HelpFileToNamespace, sourceLineNumber, id) + { + } + + public IntermediateField this[HelpFileToNamespaceSymbolFields index] => this.Fields[(int)index]; + + public string HelpFileRef + { + get => this.Fields[(int)HelpFileToNamespaceSymbolFields.HelpFileRef].AsString(); + set => this.Set((int)HelpFileToNamespaceSymbolFields.HelpFileRef, value); + } + + public string HelpNamespaceRef + { + get => this.Fields[(int)HelpFileToNamespaceSymbolFields.HelpNamespaceRef].AsString(); + set => this.Set((int)HelpFileToNamespaceSymbolFields.HelpNamespaceRef, value); + } + } +} \ No newline at end of file diff --git a/src/ext/VisualStudio/wixext/Symbols/HelpFilterSymbol.cs b/src/ext/VisualStudio/wixext/Symbols/HelpFilterSymbol.cs new file mode 100644 index 00000000..9deb47d0 --- /dev/null +++ b/src/ext/VisualStudio/wixext/Symbols/HelpFilterSymbol.cs @@ -0,0 +1,55 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. + +namespace WixToolset.VisualStudio +{ + using WixToolset.Data; + using WixToolset.VisualStudio.Symbols; + + public static partial class VSSymbolDefinitions + { + public static readonly IntermediateSymbolDefinition HelpFilter = new IntermediateSymbolDefinition( + VSSymbolDefinitionType.HelpFilter.ToString(), + new[] + { + new IntermediateFieldDefinition(nameof(HelpFilterSymbolFields.Description), IntermediateFieldType.String), + new IntermediateFieldDefinition(nameof(HelpFilterSymbolFields.QueryString), IntermediateFieldType.String), + }, + typeof(HelpFilterSymbol)); + } +} + +namespace WixToolset.VisualStudio.Symbols +{ + using WixToolset.Data; + + public enum HelpFilterSymbolFields + { + Description, + QueryString, + } + + public class HelpFilterSymbol : IntermediateSymbol + { + public HelpFilterSymbol() : base(VSSymbolDefinitions.HelpFilter, null, null) + { + } + + public HelpFilterSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(VSSymbolDefinitions.HelpFilter, sourceLineNumber, id) + { + } + + public IntermediateField this[HelpFilterSymbolFields index] => this.Fields[(int)index]; + + public string Description + { + get => this.Fields[(int)HelpFilterSymbolFields.Description].AsString(); + set => this.Set((int)HelpFilterSymbolFields.Description, value); + } + + public string QueryString + { + get => this.Fields[(int)HelpFilterSymbolFields.QueryString].AsString(); + set => this.Set((int)HelpFilterSymbolFields.QueryString, value); + } + } +} \ No newline at end of file diff --git a/src/ext/VisualStudio/wixext/Symbols/HelpFilterToNamespaceSymbol.cs b/src/ext/VisualStudio/wixext/Symbols/HelpFilterToNamespaceSymbol.cs new file mode 100644 index 00000000..f3d21289 --- /dev/null +++ b/src/ext/VisualStudio/wixext/Symbols/HelpFilterToNamespaceSymbol.cs @@ -0,0 +1,55 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. + +namespace WixToolset.VisualStudio +{ + using WixToolset.Data; + using WixToolset.VisualStudio.Symbols; + + public static partial class VSSymbolDefinitions + { + public static readonly IntermediateSymbolDefinition HelpFilterToNamespace = new IntermediateSymbolDefinition( + VSSymbolDefinitionType.HelpFilterToNamespace.ToString(), + new[] + { + new IntermediateFieldDefinition(nameof(HelpFilterToNamespaceSymbolFields.HelpFilterRef), IntermediateFieldType.String), + new IntermediateFieldDefinition(nameof(HelpFilterToNamespaceSymbolFields.HelpNamespaceRef), IntermediateFieldType.String), + }, + typeof(HelpFilterToNamespaceSymbol)); + } +} + +namespace WixToolset.VisualStudio.Symbols +{ + using WixToolset.Data; + + public enum HelpFilterToNamespaceSymbolFields + { + HelpFilterRef, + HelpNamespaceRef, + } + + public class HelpFilterToNamespaceSymbol : IntermediateSymbol + { + public HelpFilterToNamespaceSymbol() : base(VSSymbolDefinitions.HelpFilterToNamespace, null, null) + { + } + + public HelpFilterToNamespaceSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(VSSymbolDefinitions.HelpFilterToNamespace, sourceLineNumber, id) + { + } + + public IntermediateField this[HelpFilterToNamespaceSymbolFields index] => this.Fields[(int)index]; + + public string HelpFilterRef + { + get => this.Fields[(int)HelpFilterToNamespaceSymbolFields.HelpFilterRef].AsString(); + set => this.Set((int)HelpFilterToNamespaceSymbolFields.HelpFilterRef, value); + } + + public string HelpNamespaceRef + { + get => this.Fields[(int)HelpFilterToNamespaceSymbolFields.HelpNamespaceRef].AsString(); + set => this.Set((int)HelpFilterToNamespaceSymbolFields.HelpNamespaceRef, value); + } + } +} \ No newline at end of file diff --git a/src/ext/VisualStudio/wixext/Symbols/HelpNamespaceSymbol.cs b/src/ext/VisualStudio/wixext/Symbols/HelpNamespaceSymbol.cs new file mode 100644 index 00000000..8d2c2f80 --- /dev/null +++ b/src/ext/VisualStudio/wixext/Symbols/HelpNamespaceSymbol.cs @@ -0,0 +1,63 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. + +namespace WixToolset.VisualStudio +{ + using WixToolset.Data; + using WixToolset.VisualStudio.Symbols; + + public static partial class VSSymbolDefinitions + { + public static readonly IntermediateSymbolDefinition HelpNamespace = new IntermediateSymbolDefinition( + VSSymbolDefinitionType.HelpNamespace.ToString(), + new[] + { + new IntermediateFieldDefinition(nameof(HelpNamespaceSymbolFields.NamespaceName), IntermediateFieldType.String), + new IntermediateFieldDefinition(nameof(HelpNamespaceSymbolFields.CollectionFileRef), IntermediateFieldType.String), + new IntermediateFieldDefinition(nameof(HelpNamespaceSymbolFields.Description), IntermediateFieldType.String), + }, + typeof(HelpNamespaceSymbol)); + } +} + +namespace WixToolset.VisualStudio.Symbols +{ + using WixToolset.Data; + + public enum HelpNamespaceSymbolFields + { + NamespaceName, + CollectionFileRef, + Description, + } + + public class HelpNamespaceSymbol : IntermediateSymbol + { + public HelpNamespaceSymbol() : base(VSSymbolDefinitions.HelpNamespace, null, null) + { + } + + public HelpNamespaceSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(VSSymbolDefinitions.HelpNamespace, sourceLineNumber, id) + { + } + + public IntermediateField this[HelpNamespaceSymbolFields index] => this.Fields[(int)index]; + + public string NamespaceName + { + get => this.Fields[(int)HelpNamespaceSymbolFields.NamespaceName].AsString(); + set => this.Set((int)HelpNamespaceSymbolFields.NamespaceName, value); + } + + public string CollectionFileRef + { + get => this.Fields[(int)HelpNamespaceSymbolFields.CollectionFileRef].AsString(); + set => this.Set((int)HelpNamespaceSymbolFields.CollectionFileRef, value); + } + + public string Description + { + get => this.Fields[(int)HelpNamespaceSymbolFields.Description].AsString(); + set => this.Set((int)HelpNamespaceSymbolFields.Description, value); + } + } +} \ No newline at end of file diff --git a/src/ext/VisualStudio/wixext/Symbols/HelpPluginSymbol.cs b/src/ext/VisualStudio/wixext/Symbols/HelpPluginSymbol.cs new file mode 100644 index 00000000..a452fbd5 --- /dev/null +++ b/src/ext/VisualStudio/wixext/Symbols/HelpPluginSymbol.cs @@ -0,0 +1,79 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. + +namespace WixToolset.VisualStudio +{ + using WixToolset.Data; + using WixToolset.VisualStudio.Symbols; + + public static partial class VSSymbolDefinitions + { + public static readonly IntermediateSymbolDefinition HelpPlugin = new IntermediateSymbolDefinition( + VSSymbolDefinitionType.HelpPlugin.ToString(), + new[] + { + new IntermediateFieldDefinition(nameof(HelpPluginSymbolFields.HelpNamespaceRef), IntermediateFieldType.String), + new IntermediateFieldDefinition(nameof(HelpPluginSymbolFields.ParentHelpNamespaceRef), IntermediateFieldType.String), + new IntermediateFieldDefinition(nameof(HelpPluginSymbolFields.HxTFileRef), IntermediateFieldType.String), + new IntermediateFieldDefinition(nameof(HelpPluginSymbolFields.HxAFileRef), IntermediateFieldType.String), + new IntermediateFieldDefinition(nameof(HelpPluginSymbolFields.ParentHxTFileRef), IntermediateFieldType.String), + }, + typeof(HelpPluginSymbol)); + } +} + +namespace WixToolset.VisualStudio.Symbols +{ + using WixToolset.Data; + + public enum HelpPluginSymbolFields + { + HelpNamespaceRef, + ParentHelpNamespaceRef, + HxTFileRef, + HxAFileRef, + ParentHxTFileRef, + } + + public class HelpPluginSymbol : IntermediateSymbol + { + public HelpPluginSymbol() : base(VSSymbolDefinitions.HelpPlugin, null, null) + { + } + + public HelpPluginSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(VSSymbolDefinitions.HelpPlugin, sourceLineNumber, id) + { + } + + public IntermediateField this[HelpPluginSymbolFields index] => this.Fields[(int)index]; + + public string HelpNamespaceRef + { + get => this.Fields[(int)HelpPluginSymbolFields.HelpNamespaceRef].AsString(); + set => this.Set((int)HelpPluginSymbolFields.HelpNamespaceRef, value); + } + + public string ParentHelpNamespaceRef + { + get => this.Fields[(int)HelpPluginSymbolFields.ParentHelpNamespaceRef].AsString(); + set => this.Set((int)HelpPluginSymbolFields.ParentHelpNamespaceRef, value); + } + + public string HxTFileRef + { + get => this.Fields[(int)HelpPluginSymbolFields.HxTFileRef].AsString(); + set => this.Set((int)HelpPluginSymbolFields.HxTFileRef, value); + } + + public string HxAFileRef + { + get => this.Fields[(int)HelpPluginSymbolFields.HxAFileRef].AsString(); + set => this.Set((int)HelpPluginSymbolFields.HxAFileRef, value); + } + + public string ParentHxTFileRef + { + get => this.Fields[(int)HelpPluginSymbolFields.ParentHxTFileRef].AsString(); + set => this.Set((int)HelpPluginSymbolFields.ParentHxTFileRef, value); + } + } +} \ No newline at end of file diff --git a/src/ext/VisualStudio/wixext/Symbols/VSSymbolDefinitions.cs b/src/ext/VisualStudio/wixext/Symbols/VSSymbolDefinitions.cs new file mode 100644 index 00000000..cea6a2b6 --- /dev/null +++ b/src/ext/VisualStudio/wixext/Symbols/VSSymbolDefinitions.cs @@ -0,0 +1,59 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. + +namespace WixToolset.VisualStudio +{ + using System; + using WixToolset.Data; + + public enum VSSymbolDefinitionType + { + HelpFile, + HelpFileToNamespace, + HelpFilter, + HelpFilterToNamespace, + HelpNamespace, + HelpPlugin, + } + + public static partial class VSSymbolDefinitions + { + public static readonly Version Version = new Version("4.0.0"); + + public static IntermediateSymbolDefinition ByName(string name) + { + if (!Enum.TryParse(name, out VSSymbolDefinitionType type)) + { + return null; + } + + return ByType(type); + } + + public static IntermediateSymbolDefinition ByType(VSSymbolDefinitionType type) + { + switch (type) + { + case VSSymbolDefinitionType.HelpFile: + return VSSymbolDefinitions.HelpFile; + + case VSSymbolDefinitionType.HelpFileToNamespace: + return VSSymbolDefinitions.HelpFileToNamespace; + + case VSSymbolDefinitionType.HelpFilter: + return VSSymbolDefinitions.HelpFilter; + + case VSSymbolDefinitionType.HelpFilterToNamespace: + return VSSymbolDefinitions.HelpFilterToNamespace; + + case VSSymbolDefinitionType.HelpNamespace: + return VSSymbolDefinitions.HelpNamespace; + + case VSSymbolDefinitionType.HelpPlugin: + return VSSymbolDefinitions.HelpPlugin; + + default: + throw new ArgumentOutOfRangeException(nameof(type)); + } + } + } +} diff --git a/src/ext/VisualStudio/wixext/VSCompiler.cs b/src/ext/VisualStudio/wixext/VSCompiler.cs new file mode 100644 index 00000000..65f0f97d --- /dev/null +++ b/src/ext/VisualStudio/wixext/VSCompiler.cs @@ -0,0 +1,828 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. + +namespace WixToolset.VisualStudio +{ + using System; + using System.Collections.Generic; + using System.Globalization; + using System.Xml.Linq; + using WixToolset.Data; + using WixToolset.Data.Symbols; + using WixToolset.Data.WindowsInstaller; + using WixToolset.Extensibility; + using WixToolset.VisualStudio.Symbols; + + /// + /// The compiler for the WiX Toolset Visual Studio Extension. + /// + public sealed class VSCompiler : BaseCompilerExtension + { + internal const int MsidbCustomActionTypeExe = 0x00000002; // Target = command line args + internal const int MsidbCustomActionTypeProperty = 0x00000030; // Source = full path to executable + internal const int MsidbCustomActionTypeContinue = 0x00000040; // ignore action return status; continue running + internal const int MsidbCustomActionTypeRollback = 0x00000100; // in conjunction with InScript: queue in Rollback script + internal const int MsidbCustomActionTypeInScript = 0x00000400; // queue for execution within script + internal const int MsidbCustomActionTypeNoImpersonate = 0x00000800; // queue for not impersonating + + public override XNamespace Namespace => "http://wixtoolset.org/schemas/v4/wxs/vs"; + + public override void ParseElement(Intermediate intermediate, IntermediateSection section, XElement parentElement, XElement element, IDictionary context) + { + switch (parentElement.Name.LocalName) + { + case "Component": + switch (element.Name.LocalName) + { + case "VsixPackage": + this.ParseVsixPackageElement(intermediate, section, element, context["ComponentId"], null); + break; + default: + this.ParseHelper.UnexpectedElement(parentElement, element); + break; + } + break; + case "File": + switch (element.Name.LocalName) + { + case "HelpCollection": + this.ParseHelpCollectionElement(intermediate, section, element, context["FileId"]); + break; + case "HelpFile": + this.ParseHelpFileElement(intermediate, section, element, context["FileId"]); + break; + case "VsixPackage": + this.ParseVsixPackageElement(intermediate, section, element, context["ComponentId"], context["FileId"]); + break; + default: + this.ParseHelper.UnexpectedElement(parentElement, element); + break; + } + break; + case "Fragment": + case "Module": + case "Package": + switch (element.Name.LocalName) + { + case "HelpCollectionRef": + this.ParseHelpCollectionRefElement(intermediate, section, element); + break; + case "HelpFilter": + this.ParseHelpFilterElement(intermediate, section, element); + break; + default: + this.ParseHelper.UnexpectedElement(parentElement, element); + break; + } + break; + default: + this.ParseHelper.UnexpectedElement(parentElement, element); + break; + } + } + + private void ParseHelpCollectionRefElement(Intermediate intermediate, IntermediateSection section, XElement element) + { + var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element); + Identifier id = null; + + foreach (var attrib in element.Attributes()) + { + if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) + { + switch (attrib.Name.LocalName) + { + case "Id": + id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib); + this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, VSSymbolDefinitions.HelpNamespace, id.Id); + break; + default: + this.ParseHelper.UnexpectedAttribute(element, attrib); + break; + } + } + else + { + this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib); + } + } + + if (null == id) + { + this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Id")); + } + + foreach (var child in element.Elements()) + { + if (this.Namespace == child.Name.Namespace) + { + switch (child.Name.LocalName) + { + case "HelpFileRef": + this.ParseHelpFileRefElement(intermediate, section, child, id); + break; + default: + this.ParseHelper.UnexpectedElement(element, child); + break; + } + } + else + { + this.ParseHelper.ParseExtensionElement(this.Context.Extensions, intermediate, section, element, child); + } + } + } + + private void ParseHelpCollectionElement(Intermediate intermediate, IntermediateSection section, XElement element, string fileId) + { + var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element); + Identifier id = null; + string description = null; + string name = null; + var suppressCAs = YesNoType.No; + + foreach (var attrib in element.Attributes()) + { + if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) + { + switch (attrib.Name.LocalName) + { + case "Id": + id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib); + break; + case "Description": + description = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); + break; + case "Name": + name = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); + break; + case "SuppressCustomActions": + suppressCAs = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib); + break; + default: + this.ParseHelper.UnexpectedAttribute(element, attrib); + break; + } + } + else + { + this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib); + } + } + + if (null == id) + { + id = this.ParseHelper.CreateIdentifier("vshc", fileId, description, name); + } + + if (null == description) + { + this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Description")); + } + + if (null == name) + { + this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Name")); + } + + foreach (var child in element.Elements()) + { + if (this.Namespace == child.Name.Namespace) + { + switch (child.Name.LocalName) + { + case "HelpFileRef": + this.ParseHelpFileRefElement(intermediate, section, child, id); + break; + case "HelpFilterRef": + this.ParseHelpFilterRefElement(intermediate, section, child, id); + break; + case "PlugCollectionInto": + this.ParsePlugCollectionIntoElement(intermediate, section, child, id); + break; + default: + this.ParseHelper.UnexpectedElement(element, child); + break; + } + } + else + { + this.ParseHelper.ParseExtensionElement(this.Context.Extensions, intermediate, section, element, child); + } + } + + if (!this.Messaging.EncounteredError) + { + section.AddSymbol(new HelpNamespaceSymbol(sourceLineNumbers, id) + { + NamespaceName = name, + CollectionFileRef = fileId, + Description = description, + }); + + if (YesNoType.No == suppressCAs) + { + this.AddReferenceToRegisterMicrosoftHelp(section, sourceLineNumbers); + } + } + } + + private void ParseHelpFileElement(Intermediate intermediate, IntermediateSection section, XElement element, string fileId) + { + var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element); + Identifier id = null; + string name = null; + var language = CompilerConstants.IntegerNotSet; + string hxi = null; + string hxq = null; + string hxr = null; + string samples = null; + var suppressCAs = YesNoType.No; + + foreach (var attrib in element.Attributes()) + { + if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) + { + switch (attrib.Name.LocalName) + { + case "Id": + id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib); + break; + case "AttributeIndex": + hxr = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib); + this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, SymbolDefinitions.File, hxr); + break; + case "Index": + hxi = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib); + this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, SymbolDefinitions.File, hxi); + break; + case "Language": + language = this.ParseHelper.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, short.MaxValue); + break; + case "Name": + name = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); + break; + case "SampleLocation": + samples = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib); + this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, SymbolDefinitions.File, samples); + break; + case "Search": + hxq = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib); + this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, SymbolDefinitions.File, hxq); + break; + case "SuppressCustomActions": + suppressCAs = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib); + break; + default: + this.ParseHelper.UnexpectedAttribute(element, attrib); + break; + } + } + else + { + this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib); + } + } + + if (null == id) + { + id = this.ParseHelper.CreateIdentifier("vshf", fileId, name, language.ToString(CultureInfo.InvariantCulture.NumberFormat)); + } + + if (null == name) + { + this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Name")); + } + + // Uninstall will always fail silently, leaving file registered, if Language is not set + if (CompilerConstants.IntegerNotSet == language) + { + this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Language")); + } + + this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element); + + if (!this.Messaging.EncounteredError) + { + section.AddSymbol(new HelpFileSymbol(sourceLineNumbers, id) + { + HelpFileName = name, + LangID = language, + HxSFileRef = fileId, + HxIFileRef = hxi, + HxQFileRef = hxq, + HxRFileRef = hxr, + SamplesFileRef = samples, + }); + + if (YesNoType.No == suppressCAs) + { + this.AddReferenceToRegisterMicrosoftHelp(section, sourceLineNumbers); + } + } + } + + private void ParseHelpFileRefElement(Intermediate intermediate, IntermediateSection section, XElement element, Identifier collectionId) + { + var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element); + Identifier id = null; + + foreach (var attrib in element.Attributes()) + { + if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) + { + switch (attrib.Name.LocalName) + { + case "Id": + id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib); + this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, VSSymbolDefinitions.HelpFile, id.Id); + break; + default: + this.ParseHelper.UnexpectedAttribute(element, attrib); + break; + } + } + else + { + this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib); + } + } + + if (null == id) + { + this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Id")); + } + + this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element); + + if (!this.Messaging.EncounteredError) + { + section.AddSymbol(new HelpFileToNamespaceSymbol(sourceLineNumbers, id) + { + HelpFileRef = id.Id, + HelpNamespaceRef = collectionId.Id, + }); + } + } + + private void ParseHelpFilterElement(Intermediate intermediate, IntermediateSection section, XElement element) + { + var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element); + Identifier id = null; + string filterDefinition = null; + string name = null; + var suppressCAs = YesNoType.No; + + foreach (var attrib in element.Attributes()) + { + if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) + { + switch (attrib.Name.LocalName) + { + case "Id": + id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib); + break; + case "FilterDefinition": + filterDefinition = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); + break; + case "Name": + name = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); + break; + case "SuppressCustomActions": + suppressCAs = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib); + break; + default: + this.ParseHelper.UnexpectedAttribute(element, attrib); + break; + } + } + else + { + this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib); + } + } + + if (null == id) + { + id = this.ParseHelper.CreateIdentifier("hfl", name, filterDefinition); + } + + if (null == name) + { + this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Name")); + } + + this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element); + + if (!this.Messaging.EncounteredError) + { + section.AddSymbol(new HelpFilterSymbol(sourceLineNumbers, id) + { + Description = name, + QueryString = filterDefinition, + }); + + if (YesNoType.No == suppressCAs) + { + this.AddReferenceToRegisterMicrosoftHelp(section, sourceLineNumbers); + } + } + } + + private void ParseHelpFilterRefElement(Intermediate intermediate, IntermediateSection section, XElement element, Identifier collectionId) + { + var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element); + Identifier id = null; + + foreach (var attrib in element.Attributes()) + { + if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) + { + switch (attrib.Name.LocalName) + { + case "Id": + id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib); + this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, VSSymbolDefinitions.HelpFilter, id.Id); + break; + default: + this.ParseHelper.UnexpectedAttribute(element, attrib); + break; + } + } + else + { + this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib); + } + } + + if (null == id) + { + this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Id")); + } + + this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element); + + if (!this.Messaging.EncounteredError) + { + section.AddSymbol(new HelpFilterToNamespaceSymbol(sourceLineNumbers, id) + { + HelpFilterRef = id.Id, + HelpNamespaceRef = collectionId.Id, + }); + } + } + + private void ParsePlugCollectionIntoElement(Intermediate intermediate, IntermediateSection section, XElement element, Identifier parentId) + { + var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element); + string hxa = null; + string hxt = null; + string hxtParent = null; + string namespaceParent = null; + string feature = null; + var suppressExternalNamespaces = YesNoType.No; + + foreach (var attrib in element.Attributes()) + { + if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) + { + switch (attrib.Name.LocalName) + { + case "Attributes": + hxa = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib); + break; + case "TableOfContents": + hxt = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib); + break; + case "TargetCollection": + namespaceParent = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib); + break; + case "TargetTableOfContents": + hxtParent = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib); + break; + case "TargetFeature": + feature = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib); + break; + case "SuppressExternalNamespaces": + suppressExternalNamespaces = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib); + break; + default: + this.ParseHelper.UnexpectedAttribute(element, attrib); + break; + } + } + else + { + this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib); + } + } + + var pluginVS05 = namespaceParent.Equals("MS_VSIPCC_v80", StringComparison.Ordinal); + var pluginVS08 = namespaceParent.Equals("MS.VSIPCC.v90", StringComparison.Ordinal); + + if (null == namespaceParent) + { + this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "TargetCollection")); + } + + if (null == feature && (pluginVS05 || pluginVS08) && YesNoType.No == suppressExternalNamespaces) + { + this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "TargetFeature")); + } + + this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element); + + if (!this.Messaging.EncounteredError) + { + section.AddSymbol(new HelpPluginSymbol(sourceLineNumbers, parentId) + { + HelpNamespaceRef = parentId.Id, + ParentHelpNamespaceRef = namespaceParent, + HxTFileRef = hxt, + HxAFileRef = hxa, + ParentHxTFileRef = hxtParent, + }); + + if (pluginVS05) + { + if (YesNoType.No == suppressExternalNamespaces) + { + // Bring in the help 2 base namespace components for VS 2005 + this.ParseHelper.CreateComplexReference(section, sourceLineNumbers, ComplexReferenceParentType.Feature, feature, String.Empty, + ComplexReferenceChildType.ComponentGroup, "Help2_VS2005_Namespace_Components", false); + // Reference CustomAction since nothing will happen without it + this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, SymbolDefinitions.CustomAction, "CA_HxMerge_VSIPCC_VSCC"); + } + } + else if (pluginVS08) + { + if (YesNoType.No == suppressExternalNamespaces) + { + // Bring in the help 2 base namespace components for VS 2008 + this.ParseHelper.CreateComplexReference(section, sourceLineNumbers, ComplexReferenceParentType.Feature, feature, String.Empty, + ComplexReferenceChildType.ComponentGroup, "Help2_VS2008_Namespace_Components", false); + // Reference CustomAction since nothing will happen without it + this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, SymbolDefinitions.CustomAction, "CA_ScheduleExtHelpPlugin_VSCC_VSIPCC"); + } + } + else + { + // Reference the parent namespace to enforce the foreign key relationship + this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, VSSymbolDefinitions.HelpNamespace, namespaceParent); + } + } + } + + private void ParseVsixPackageElement(Intermediate intermediate, IntermediateSection section, XElement element, string componentId, string fileId) + { + var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element); + var propertyId = "VS_VSIX_INSTALLER_PATH"; + string packageId = null; + var permanent = YesNoType.NotSet; + string target = null; + string targetVersion = null; + var vital = YesNoType.NotSet; + + foreach (var attrib in element.Attributes()) + { + if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) + { + switch (attrib.Name.LocalName) + { + case "File": + if (String.IsNullOrEmpty(fileId)) + { + fileId = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib); + } + else + { + this.Messaging.Write(ErrorMessages.IllegalAttributeWhenNested(sourceLineNumbers, element.Name.LocalName, "File", "File")); + } + break; + case "PackageId": + packageId = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); + break; + case "Permanent": + permanent = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib); + break; + case "Target": + target = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); + switch (target.ToLowerInvariant()) + { + case "integrated": + case "integratedshell": + target = "IntegratedShell"; + break; + case "professional": + target = "Pro"; + break; + case "premium": + target = "Premium"; + break; + case "ultimate": + target = "Ultimate"; + break; + case "vbexpress": + target = "VBExpress"; + break; + case "vcexpress": + target = "VCExpress"; + break; + case "vcsexpress": + target = "VCSExpress"; + break; + case "vwdexpress": + target = "VWDExpress"; + break; + } + break; + case "TargetVersion": + targetVersion = this.ParseHelper.GetAttributeVersionValue(sourceLineNumbers, attrib); + break; + case "Vital": + vital = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib); + break; + case "VsixInstallerPathProperty": + propertyId = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib); + break; + default: + this.ParseHelper.UnexpectedAttribute(element, attrib); + break; + } + } + else + { + this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib); + } + } + + if (String.IsNullOrEmpty(fileId)) + { + this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "File")); + } + + if (String.IsNullOrEmpty(packageId)) + { + this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "PackageId")); + } + + if (!String.IsNullOrEmpty(target) && String.IsNullOrEmpty(targetVersion)) + { + this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "TargetVersion", "Target")); + } + else if (String.IsNullOrEmpty(target) && !String.IsNullOrEmpty(targetVersion)) + { + this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Target", "TargetVersion")); + } + + this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element); + + if (!this.Messaging.EncounteredError) + { + // Ensure there is a reference to the AppSearch Property that will find the VsixInstaller.exe. + this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, SymbolDefinitions.Property, propertyId); + + // Ensure there is a reference to the package file (even if we are a child under it). + this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, SymbolDefinitions.File, fileId); + + var cmdlinePrefix = "/q "; + + if (!String.IsNullOrEmpty(target)) + { + cmdlinePrefix = String.Format("{0} /skuName:{1} /skuVersion:{2}", cmdlinePrefix, target, targetVersion); + } + + var installAfter = "WriteRegistryValues"; // by default, come after the registry key registration. + + var installNamePerUser = this.ParseHelper.CreateIdentifier("viu", componentId, fileId, "per-user", target, targetVersion); + var installNamePerMachine = this.ParseHelper.CreateIdentifier("vim", componentId, fileId, "per-machine", target, targetVersion); + var installCmdLinePerUser = String.Format("{0} \"[#{1}]\"", cmdlinePrefix, fileId); + var installCmdLinePerMachine = String.Concat(installCmdLinePerUser, " /admin"); + var installConditionPerUser = String.Format("NOT ALLUSERS AND ${0}=3", componentId); // only execute if the Component being installed. + var installConditionPerMachine = String.Format("ALLUSERS AND ${0}=3", componentId); // only execute if the Component being installed. + var installPerUserCA = new CustomActionSymbol(sourceLineNumbers, installNamePerUser) + { + ExecutionType = CustomActionExecutionType.Deferred, + Impersonate = true, + }; + var installPerMachineCA = new CustomActionSymbol(sourceLineNumbers, installNamePerMachine) + { + ExecutionType = CustomActionExecutionType.Deferred, + Impersonate = false, + }; + + // If the package is not vital, mark the install action as continue. + if (vital == YesNoType.No) + { + installPerUserCA.IgnoreResult = true; + installPerMachineCA.IgnoreResult = true; + } + else // the package is vital so ensure there is a rollback action scheduled. + { + var rollbackNamePerUser = this.ParseHelper.CreateIdentifier("vru", componentId, fileId, "per-user", target, targetVersion); + var rollbackNamePerMachine = this.ParseHelper.CreateIdentifier("vrm", componentId, fileId, "per-machine", target, targetVersion); + var rollbackCmdLinePerUser = String.Concat(cmdlinePrefix, " /u:\"", packageId, "\""); + var rollbackCmdLinePerMachine = String.Concat(rollbackCmdLinePerUser, " /admin"); + var rollbackConditionPerUser = String.Format("NOT ALLUSERS AND NOT Installed AND ${0}=2 AND ?{0}>2", componentId); // NOT Installed && Component being installed but not installed already. + var rollbackConditionPerMachine = String.Format("ALLUSERS AND NOT Installed AND ${0}=2 AND ?{0}>2", componentId); // NOT Installed && Component being installed but not installed already. + var rollbackPerUserCA = new CustomActionSymbol(sourceLineNumbers, rollbackNamePerUser) + { + ExecutionType = CustomActionExecutionType.Rollback, + IgnoreResult = true, + Impersonate = true, + }; + var rollbackPerMachineCA = new CustomActionSymbol(sourceLineNumbers, rollbackNamePerMachine) + { + ExecutionType = CustomActionExecutionType.Rollback, + IgnoreResult = true, + Impersonate = false, + }; + + this.SchedulePropertyExeAction(section, sourceLineNumbers, rollbackNamePerUser, propertyId, rollbackCmdLinePerUser, rollbackPerUserCA, rollbackConditionPerUser, null, installAfter); + this.SchedulePropertyExeAction(section, sourceLineNumbers, rollbackNamePerMachine, propertyId, rollbackCmdLinePerMachine, rollbackPerMachineCA, rollbackConditionPerMachine, null, rollbackNamePerUser.Id); + + installAfter = rollbackNamePerMachine.Id; + } + + this.SchedulePropertyExeAction(section, sourceLineNumbers, installNamePerUser, propertyId, installCmdLinePerUser, installPerUserCA, installConditionPerUser, null, installAfter); + this.SchedulePropertyExeAction(section, sourceLineNumbers, installNamePerMachine, propertyId, installCmdLinePerMachine, installPerMachineCA, installConditionPerMachine, null, installNamePerUser.Id); + + // If not permanent, schedule the uninstall custom action. + if (permanent != YesNoType.Yes) + { + var uninstallNamePerUser = this.ParseHelper.CreateIdentifier("vuu", componentId, fileId, "per-user", target ?? String.Empty, targetVersion ?? String.Empty); + var uninstallNamePerMachine = this.ParseHelper.CreateIdentifier("vum", componentId, fileId, "per-machine", target ?? String.Empty, targetVersion ?? String.Empty); + var uninstallCmdLinePerUser = String.Concat(cmdlinePrefix, " /u:\"", packageId, "\""); + var uninstallCmdLinePerMachine = String.Concat(uninstallCmdLinePerUser, " /admin"); + var uninstallConditionPerUser = String.Format("NOT ALLUSERS AND ${0}=2 AND ?{0}>2", componentId); // Only execute if component is being uninstalled. + var uninstallConditionPerMachine = String.Format("ALLUSERS AND ${0}=2 AND ?{0}>2", componentId); // Only execute if component is being uninstalled. + var uninstallPerUserCA = new CustomActionSymbol(sourceLineNumbers, uninstallNamePerUser) + { + ExecutionType = CustomActionExecutionType.Deferred, + IgnoreResult = true, + Impersonate = true, + }; + var uninstallPerMachineCA = new CustomActionSymbol(sourceLineNumbers, uninstallNamePerMachine) + { + ExecutionType = CustomActionExecutionType.Deferred, + IgnoreResult = true, + Impersonate = false, + }; + + this.SchedulePropertyExeAction(section, sourceLineNumbers, uninstallNamePerUser, propertyId, uninstallCmdLinePerUser, uninstallPerUserCA, uninstallConditionPerUser, "InstallFinalize", null); + this.SchedulePropertyExeAction(section, sourceLineNumbers, uninstallNamePerMachine, propertyId, uninstallCmdLinePerMachine, uninstallPerMachineCA, uninstallConditionPerMachine, "InstallFinalize", null); + } + } + } + + private void SchedulePropertyExeAction(IntermediateSection section, SourceLineNumber sourceLineNumbers, Identifier name, string source, string cmdline, CustomActionSymbol caTemplate, string condition, string beforeAction, string afterAction) + { + const SequenceTable sequence = SequenceTable.InstallExecuteSequence; + + caTemplate.SourceType = CustomActionSourceType.Property; + caTemplate.Source = source; + caTemplate.TargetType = CustomActionTargetType.Exe; + caTemplate.Target = cmdline; + section.AddSymbol(caTemplate); + + section.AddSymbol(new WixActionSymbol(sourceLineNumbers, new Identifier(name.Access, sequence, name.Id)) + { + SequenceTable = SequenceTable.InstallExecuteSequence, + Action = name.Id, + Condition = condition, + // no explicit sequence + Before = beforeAction, + After = afterAction, + Overridable = false, + }); + + if (null != beforeAction) + { + if (WindowsInstallerStandard.IsStandardAction(beforeAction)) + { + this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, SymbolDefinitions.WixAction, sequence.ToString(), beforeAction); + } + else + { + this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, SymbolDefinitions.CustomAction, beforeAction); + } + } + + if (null != afterAction) + { + if (WindowsInstallerStandard.IsStandardAction(afterAction)) + { + this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, SymbolDefinitions.WixAction, sequence.ToString(), afterAction); + } + else + { + this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, SymbolDefinitions.CustomAction, afterAction); + } + } + } + + private void AddReferenceToRegisterMicrosoftHelp(IntermediateSection section, SourceLineNumber sourceLineNumbers) + { + this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, SymbolDefinitions.CustomAction, "CA_RegisterMicrosoftHelp.3643236F_FC70_11D3_A536_0090278A1BB8"); + } + } +} diff --git a/src/ext/VisualStudio/wixext/VSDecompiler.cs b/src/ext/VisualStudio/wixext/VSDecompiler.cs new file mode 100644 index 00000000..08dc364a --- /dev/null +++ b/src/ext/VisualStudio/wixext/VSDecompiler.cs @@ -0,0 +1,298 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. + +namespace WixToolset.VisualStudio +{ +#if TODO_CONSIDER_DECOMPILER + using System; + using System.Collections; + using System.Diagnostics; + using System.Globalization; + using WixToolset.Data; + using WixToolset.Extensibility; + using VS = WixToolset.Extensions.Serialize.VS; + using Wix = WixToolset.Data.Serialize; + + /// + /// The decompiler for the WiX Toolset Visual Studio Extension. + /// + public sealed class VSDecompiler : DecompilerExtension + { + /// + /// Creates a decompiler for VS Extension. + /// + public VSDecompiler() + { + this.TableDefinitions = VSExtensionData.GetExtensionTableDefinitions(); + } + + /// + /// Get the extensions library to be removed. + /// + /// Table definitions for library. + /// Library to remove from decompiled output. + public override Library GetLibraryToRemove(TableDefinitionCollection tableDefinitions) + { + return VSExtensionData.GetExtensionLibrary(tableDefinitions); + } + + /// + /// Decompiles an extension table. + /// + /// The table to decompile. + public override void DecompileTable(Table table) + { + switch (table.Name) + { + case "HelpFile": + this.DecompileHelpFileTable(table); + break; + case "HelpFileToNamespace": + this.DecompileHelpFileToNamespaceTable(table); + break; + case "HelpFilter": + this.DecompileHelpFilterTable(table); + break; + case "HelpFilterToNamespace": + this.DecompileHelpFilterToNamespaceTable(table); + break; + case "HelpNamespace": + this.DecompileHelpNamespaceTable(table); + break; + case "HelpPlugin": + this.DecompileHelpPluginTable(table); + break; + default: + base.DecompileTable(table); + break; + } + } + + /// + /// Decompile the HelpFile table. + /// + /// The table to decompile. + private void DecompileHelpFileTable(Table table) + { + foreach (Row row in table.Rows) + { + VS.HelpFile helpFile = new VS.HelpFile(); + + helpFile.Id = (string)row[0]; + + helpFile.Name = (string)row[1]; + + if (null != row[2]) + { + helpFile.Language = (int)row[2]; + } + + if (null != row[4]) + { + helpFile.Index = (string)row[4]; + } + + if (null != row[5]) + { + helpFile.Search = (string)row[5]; + } + + if (null != row[6]) + { + helpFile.AttributeIndex = (string)row[6]; + } + + if (null != row[7]) + { + helpFile.SampleLocation = (string)row[7]; + } + + if (this.Core.RootElement is Wix.Module) + { + helpFile.SuppressCustomActions = VS.YesNoType.yes; + } + + Wix.File file = (Wix.File)this.Core.GetIndexedElement("File", (string)row[3]); + if (null != file) + { + file.AddChild(helpFile); + } + else + { + this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "File_HxS", (string)row[3], "File")); + } + } + } + + /// + /// Decompile the HelpFileToNamespace table. + /// + /// The table to decompile. + private void DecompileHelpFileToNamespaceTable(Table table) + { + foreach (Row row in table.Rows) + { + VS.HelpFileRef helpFileRef = new VS.HelpFileRef(); + + helpFileRef.Id = (string)row[0]; + + VS.HelpCollection helpCollection = (VS.HelpCollection)this.Core.GetIndexedElement("HelpNamespace", (string)row[1]); + if (null != helpCollection) + { + helpCollection.AddChild(helpFileRef); + } + else + { + this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "HelpNamespace_", (string)row[1], "HelpNamespace")); + } + } + } + + /// + /// Decompile the HelpFilter table. + /// + /// The table to decompile. + private void DecompileHelpFilterTable(Table table) + { + foreach (Row row in table.Rows) + { + VS.HelpFilter helpFilter = new VS.HelpFilter(); + + helpFilter.Id = (string)row[0]; + + helpFilter.Name = (string)row[1]; + + if (null != row[2]) + { + helpFilter.FilterDefinition = (string)row[2]; + } + + if (this.Core.RootElement is Wix.Module) + { + helpFilter.SuppressCustomActions = VS.YesNoType.yes; + } + + this.Core.RootElement.AddChild(helpFilter); + } + } + + /// + /// Decompile the HelpFilterToNamespace table. + /// + /// The table to decompile. + private void DecompileHelpFilterToNamespaceTable(Table table) + { + foreach (Row row in table.Rows) + { + VS.HelpFilterRef helpFilterRef = new VS.HelpFilterRef(); + + helpFilterRef.Id = (string)row[0]; + + VS.HelpCollection helpCollection = (VS.HelpCollection)this.Core.GetIndexedElement("HelpNamespace", (string)row[1]); + if (null != helpCollection) + { + helpCollection.AddChild(helpFilterRef); + } + else + { + this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "HelpNamespace_", (string)row[1], "HelpNamespace")); + } + } + } + + /// + /// Decompile the HelpNamespace table. + /// + /// The table to decompile. + private void DecompileHelpNamespaceTable(Table table) + { + foreach (Row row in table.Rows) + { + VS.HelpCollection helpCollection = new VS.HelpCollection(); + + helpCollection.Id = (string)row[0]; + + helpCollection.Name = (string)row[1]; + + if (null != row[3]) + { + helpCollection.Description = (string)row[3]; + } + + if (this.Core.RootElement is Wix.Module) + { + helpCollection.SuppressCustomActions = VS.YesNoType.yes; + } + + Wix.File file = (Wix.File)this.Core.GetIndexedElement("File", (string)row[2]); + if (null != file) + { + file.AddChild(helpCollection); + } + else if (0 != String.Compare(helpCollection.Id, "MS_VSIPCC_v80", StringComparison.Ordinal) && + 0 != String.Compare(helpCollection.Id, "MS.VSIPCC.v90", StringComparison.Ordinal)) + { + this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "File_Collection", (string)row[2], "File")); + } + this.Core.IndexElement(row, helpCollection); + } + } + + /// + /// Decompile the HelpPlugin table. + /// + /// The table to decompile. + private void DecompileHelpPluginTable(Table table) + { + foreach (Row row in table.Rows) + { + VS.PlugCollectionInto plugCollectionInto = new VS.PlugCollectionInto(); + + plugCollectionInto.TargetCollection = (string)row[1]; + + if (null != row[2]) + { + plugCollectionInto.TableOfContents = (string)row[2]; + } + + if (null != row[3]) + { + plugCollectionInto.Attributes = (string)row[3]; + } + + if (null != row[4]) + { + plugCollectionInto.TargetTableOfContents = (string)row[4]; + } + + if (this.Core.RootElement is Wix.Module) + { + plugCollectionInto.SuppressExternalNamespaces = VS.YesNoType.yes; + } + + //we cannot do this work because we cannot get the FeatureComponent table + //plugCollectionInto.TargetFeature = DecompileHelpComponents(); + + VS.HelpCollection helpCollection = (VS.HelpCollection)this.Core.GetIndexedElement("HelpNamespace", (string)row[0]); + if (null != helpCollection) + { + helpCollection.AddChild(plugCollectionInto); + } + else + { + this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "HelpNamespace_", (string)row[0], "HelpNamespace")); + } + } + } + //private string DecompileHelpComponents() + //{ + // throw new NotImplementedException(); + // //Find both known compontents from FeatureComponents table and build feature list + + // //remove components from FeatureComponents + + // //return a space delimited list of features that mapped to our help components + // return String.Empty; + //} + } +#endif +} diff --git a/src/ext/VisualStudio/wixext/VSExtensionData.cs b/src/ext/VisualStudio/wixext/VSExtensionData.cs new file mode 100644 index 00000000..51199d2c --- /dev/null +++ b/src/ext/VisualStudio/wixext/VSExtensionData.cs @@ -0,0 +1,27 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. + +namespace WixToolset.VisualStudio +{ + using WixToolset.Data; + using WixToolset.Extensibility; + + public sealed class VSExtensionData : BaseExtensionData + { + /// + /// Gets the default culture. + /// + /// The default culture. + public override string DefaultCulture => "en-US"; + + public override bool TryGetSymbolDefinitionByName(string name, out IntermediateSymbolDefinition symbolDefinition) + { + symbolDefinition = VSSymbolDefinitions.ByName(name); + return symbolDefinition != null; + } + + public override Intermediate GetLibrary(ISymbolDefinitionCreator symbolDefinitions) + { + return Intermediate.Load(typeof(VSExtensionData).Assembly, "WixToolset.VisualStudio.vs.wixlib", symbolDefinitions); + } + } +} diff --git a/src/ext/VisualStudio/wixext/VSExtensionFactory.cs b/src/ext/VisualStudio/wixext/VSExtensionFactory.cs new file mode 100644 index 00000000..c6e0cc31 --- /dev/null +++ b/src/ext/VisualStudio/wixext/VSExtensionFactory.cs @@ -0,0 +1,18 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. + +namespace WixToolset.VisualStudio +{ + using System; + using System.Collections.Generic; + using WixToolset.Extensibility; + + public class VSExtensionFactory : BaseExtensionFactory + { + protected override IReadOnlyCollection ExtensionTypes => new[] + { + typeof(VSCompiler), + typeof(VSExtensionData), + typeof(VSWindowsInstallerBackendBinderExtension), + }; + } +} diff --git a/src/ext/VisualStudio/wixext/VSTableDefinitions.cs b/src/ext/VisualStudio/wixext/VSTableDefinitions.cs new file mode 100644 index 00000000..0c3ca907 --- /dev/null +++ b/src/ext/VisualStudio/wixext/VSTableDefinitions.cs @@ -0,0 +1,97 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. + +namespace WixToolset.VisualStudio +{ + using WixToolset.Data.WindowsInstaller; + + public static class VSTableDefinitions + { + public static readonly TableDefinition HelpFile = new TableDefinition( + "HelpFile", + VSSymbolDefinitions.HelpFile, + new[] + { + new ColumnDefinition("HelpFileKey", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, description: "Primary Key for HelpFile Table (required).", modularizeType: ColumnModularizeType.Column), + new ColumnDefinition("HelpFileName", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Text, description: "Internal Microsoft Help ID for this HelpFile (required)."), + new ColumnDefinition("LangID", ColumnType.Number, 2, primaryKey: false, nullable: true, ColumnCategory.Language, description: "Language ID for content file (optional)."), + new ColumnDefinition("File_HxS", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "File", keyColumn: 1, description: "Key for HxS (Title) file (required).", modularizeType: ColumnModularizeType.Column), + new ColumnDefinition("File_HxI", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Identifier, keyTable: "File", keyColumn: 1, description: "Key for HxI (Index) file (optional).", modularizeType: ColumnModularizeType.Column), + new ColumnDefinition("File_HxQ", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Identifier, keyTable: "File", keyColumn: 1, description: "Key for HxQ (Query) file (optional).", modularizeType: ColumnModularizeType.Column), + new ColumnDefinition("File_HxR", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Identifier, keyTable: "File", keyColumn: 1, description: "Key for HxR (Attributes) file (optional).", modularizeType: ColumnModularizeType.Column), + new ColumnDefinition("File_Samples", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Identifier, keyTable: "File", keyColumn: 1, description: "Key for a file that is in the 'root' of the samples directory for this HelpFile (optional).", modularizeType: ColumnModularizeType.Column), + }, + symbolIdIsPrimaryKey: true + ); + + public static readonly TableDefinition HelpFileToNamespace = new TableDefinition( + "HelpFileToNamespace", + VSSymbolDefinitions.HelpFileToNamespace, + new[] + { + new ColumnDefinition("HelpFile_", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, keyTable: "HelpFile", keyColumn: 1, description: "Foreign key into HelpFile table (required).", modularizeType: ColumnModularizeType.Column), + new ColumnDefinition("HelpNamespace_", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, keyTable: "HelpNamespace", keyColumn: 1, description: "Foreign key into HelpNamespace table (required)."), + }, + symbolIdIsPrimaryKey: false + ); + + public static readonly TableDefinition HelpFilter = new TableDefinition( + "HelpFilter", + VSSymbolDefinitions.HelpFilter, + new[] + { + new ColumnDefinition("FilterKey", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, description: "Primary Key for HelpFilter (required).", modularizeType: ColumnModularizeType.Column), + new ColumnDefinition("Description", ColumnType.Localized, 0, primaryKey: false, nullable: false, ColumnCategory.Text, description: "Friendly name for Filter (required)."), + new ColumnDefinition("QueryString", ColumnType.String, 0, primaryKey: false, nullable: true, ColumnCategory.Text, description: "Query String for Help Filter (optional)."), + }, + symbolIdIsPrimaryKey: true + ); + + public static readonly TableDefinition HelpFilterToNamespace = new TableDefinition( + "HelpFilterToNamespace", + VSSymbolDefinitions.HelpFilterToNamespace, + new[] + { + new ColumnDefinition("HelpFilter_", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, keyTable: "HelpFilter", keyColumn: 1, description: "Foreign key into HelpFilter table (required).", modularizeType: ColumnModularizeType.Column), + new ColumnDefinition("HelpNamespace_", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, keyTable: "HelpNamespace", keyColumn: 1, description: "Foreign key into HelpNamespace table (required)."), + }, + symbolIdIsPrimaryKey: false + ); + + public static readonly TableDefinition HelpNamespace = new TableDefinition( + "HelpNamespace", + VSSymbolDefinitions.HelpNamespace, + new[] + { + new ColumnDefinition("NamespaceKey", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, description: "Primary Key for HelpNamespace (required)."), + new ColumnDefinition("NamespaceName", ColumnType.String, 0, primaryKey: false, nullable: false, ColumnCategory.Text, description: "Internal Microsoft Help ID for this Namespace (required)."), + new ColumnDefinition("File_Collection", ColumnType.String, 72, primaryKey: false, nullable: false, ColumnCategory.Identifier, keyTable: "File", keyColumn: 1, description: "Key for HxC (Collection) file (required).", modularizeType: ColumnModularizeType.Column), + new ColumnDefinition("Description", ColumnType.Localized, 0, primaryKey: false, nullable: true, ColumnCategory.Text, description: "Friendly name for Namespace (optional)."), + }, + symbolIdIsPrimaryKey: true + ); + + public static readonly TableDefinition HelpPlugin = new TableDefinition( + "HelpPlugin", + VSSymbolDefinitions.HelpPlugin, + new[] + { + new ColumnDefinition("HelpNamespace_", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, keyTable: "HelpNamespace", keyColumn: 1, description: "Foreign key into HelpNamespace table for the child namespace that will be plugged into the parent namespace (required)."), + new ColumnDefinition("HelpNamespace_Parent", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, keyTable: "HelpNamespace", keyColumn: 1, description: "Foreign key into HelpNamespace table for the parent namespace into which the child will be inserted (required)."), + new ColumnDefinition("File_HxT", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Identifier, keyTable: "File", keyColumn: 1, description: "Key for HxT file of child namespace (optional).", modularizeType: ColumnModularizeType.Column), + new ColumnDefinition("File_HxA", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Identifier, keyTable: "File", keyColumn: 1, description: "Key for HxA (Attributes) file of child namespace (optional).", modularizeType: ColumnModularizeType.Column), + new ColumnDefinition("File_ParentHxT", ColumnType.String, 72, primaryKey: false, nullable: true, ColumnCategory.Identifier, keyTable: "File", keyColumn: 1, description: "Key for HxT file of parent namespace that now includes the new child namespace (optional).", modularizeType: ColumnModularizeType.Column), + }, + symbolIdIsPrimaryKey: false + ); + + public static readonly TableDefinition[] All = new[] + { + HelpFile, + HelpFileToNamespace, + HelpFilter, + HelpFilterToNamespace, + HelpNamespace, + HelpPlugin, + }; + } +} diff --git a/src/ext/VisualStudio/wixext/VSWindowsInstallerBackendBinderExtension.cs b/src/ext/VisualStudio/wixext/VSWindowsInstallerBackendBinderExtension.cs new file mode 100644 index 00000000..d0d8648c --- /dev/null +++ b/src/ext/VisualStudio/wixext/VSWindowsInstallerBackendBinderExtension.cs @@ -0,0 +1,13 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. + +namespace WixToolset.VisualStudio +{ + using System.Collections.Generic; + using WixToolset.Data.WindowsInstaller; + using WixToolset.Extensibility; + + public class VSWindowsInstallerBackendBinderExtension : BaseWindowsInstallerBackendBinderExtension + { + public override IReadOnlyCollection TableDefinitions => VSTableDefinitions.All; + } +} diff --git a/src/ext/VisualStudio/wixext/WixToolset.VisualStudio.wixext.csproj b/src/ext/VisualStudio/wixext/WixToolset.VisualStudio.wixext.csproj new file mode 100644 index 00000000..20282720 --- /dev/null +++ b/src/ext/VisualStudio/wixext/WixToolset.VisualStudio.wixext.csproj @@ -0,0 +1,30 @@ + + + + + + netstandard2.0 + WixToolset.VisualStudio + WiX Toolset Visual Studio Extension + WiX Toolset VS Extension + true + true + + + + + + + + + + + + + + + + + + + diff --git a/src/ext/VisualStudio/wixext/WixToolset.VisualStudio.wixext.nuspec b/src/ext/VisualStudio/wixext/WixToolset.VisualStudio.wixext.nuspec new file mode 100644 index 00000000..51c9708e --- /dev/null +++ b/src/ext/VisualStudio/wixext/WixToolset.VisualStudio.wixext.nuspec @@ -0,0 +1,23 @@ + + + + $id$ + $version$ + $title$ + $description$ + $authors$ + MS-RL + false + $copyright$ + $projectUrl$ + + + + + + + + + + + diff --git a/src/ext/VisualStudio/wixext/WixToolset.VisualStudio.wixext.targets b/src/ext/VisualStudio/wixext/WixToolset.VisualStudio.wixext.targets new file mode 100644 index 00000000..4542375f --- /dev/null +++ b/src/ext/VisualStudio/wixext/WixToolset.VisualStudio.wixext.targets @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/ext/VisualStudio/wixext/WixToolset.VisualStudio.wixext.v3.ncrunchproject b/src/ext/VisualStudio/wixext/WixToolset.VisualStudio.wixext.v3.ncrunchproject new file mode 100644 index 00000000..56556a9f --- /dev/null +++ b/src/ext/VisualStudio/wixext/WixToolset.VisualStudio.wixext.v3.ncrunchproject @@ -0,0 +1,7 @@ + + + + ..\..\build\Debug\vs.wixlib + + + \ No newline at end of file diff --git a/src/ext/VisualStudio/wixlib/HTML_Help_Registration__RTL_X86.wxs b/src/ext/VisualStudio/wixlib/HTML_Help_Registration__RTL_X86.wxs new file mode 100644 index 00000000..2bdb810a --- /dev/null +++ b/src/ext/VisualStudio/wixlib/HTML_Help_Registration__RTL_X86.wxs @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ext/VisualStudio/wixlib/Redist/BIN_File_107602.dll b/src/ext/VisualStudio/wixlib/Redist/BIN_File_107602.dll new file mode 100644 index 00000000..aef2cf29 Binary files /dev/null and b/src/ext/VisualStudio/wixlib/Redist/BIN_File_107602.dll differ diff --git a/src/ext/VisualStudio/wixlib/Redist/BIN_File_46001.dll b/src/ext/VisualStudio/wixlib/Redist/BIN_File_46001.dll new file mode 100644 index 00000000..9e470267 Binary files /dev/null and b/src/ext/VisualStudio/wixlib/Redist/BIN_File_46001.dll differ diff --git a/src/ext/VisualStudio/wixlib/Redist/BIN_File_46002.dll b/src/ext/VisualStudio/wixlib/Redist/BIN_File_46002.dll new file mode 100644 index 00000000..ae9c30dd Binary files /dev/null and b/src/ext/VisualStudio/wixlib/Redist/BIN_File_46002.dll differ diff --git a/src/ext/VisualStudio/wixlib/VS11.wxs b/src/ext/VisualStudio/wixlib/VS11.wxs new file mode 100644 index 00000000..d3f31843 --- /dev/null +++ b/src/ext/VisualStudio/wixlib/VS11.wxs @@ -0,0 +1,205 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ext/VisualStudio/wixlib/VS14.wxs b/src/ext/VisualStudio/wixlib/VS14.wxs new file mode 100644 index 00000000..83449802 --- /dev/null +++ b/src/ext/VisualStudio/wixlib/VS14.wxs @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ext/VisualStudio/wixlib/VS2003.wxs b/src/ext/VisualStudio/wixlib/VS2003.wxs new file mode 100644 index 00000000..1e5d36d9 --- /dev/null +++ b/src/ext/VisualStudio/wixlib/VS2003.wxs @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ext/VisualStudio/wixlib/VS2005.wxs b/src/ext/VisualStudio/wixlib/VS2005.wxs new file mode 100644 index 00000000..ef538099 --- /dev/null +++ b/src/ext/VisualStudio/wixlib/VS2005.wxs @@ -0,0 +1,369 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ext/VisualStudio/wixlib/VS2008.wxs b/src/ext/VisualStudio/wixlib/VS2008.wxs new file mode 100644 index 00000000..43bf1d1e --- /dev/null +++ b/src/ext/VisualStudio/wixlib/VS2008.wxs @@ -0,0 +1,299 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ext/VisualStudio/wixlib/VS2010.wxs b/src/ext/VisualStudio/wixlib/VS2010.wxs new file mode 100644 index 00000000..6c940b86 --- /dev/null +++ b/src/ext/VisualStudio/wixlib/VS2010.wxs @@ -0,0 +1,312 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ext/VisualStudio/wixlib/VS2012.wxs b/src/ext/VisualStudio/wixlib/VS2012.wxs new file mode 100644 index 00000000..513d8684 --- /dev/null +++ b/src/ext/VisualStudio/wixlib/VS2012.wxs @@ -0,0 +1,255 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ext/VisualStudio/wixlib/VS2013.wxs b/src/ext/VisualStudio/wixlib/VS2013.wxs new file mode 100644 index 00000000..6681b43f --- /dev/null +++ b/src/ext/VisualStudio/wixlib/VS2013.wxs @@ -0,0 +1,252 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ext/VisualStudio/wixlib/VS2015.wxs b/src/ext/VisualStudio/wixlib/VS2015.wxs new file mode 100644 index 00000000..f14802e2 --- /dev/null +++ b/src/ext/VisualStudio/wixlib/VS2015.wxs @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ext/VisualStudio/wixlib/VS2017.wxs b/src/ext/VisualStudio/wixlib/VS2017.wxs new file mode 100644 index 00000000..5524361d --- /dev/null +++ b/src/ext/VisualStudio/wixlib/VS2017.wxs @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ext/VisualStudio/wixlib/VS2019.wxs b/src/ext/VisualStudio/wixlib/VS2019.wxs new file mode 100644 index 00000000..0be63dec --- /dev/null +++ b/src/ext/VisualStudio/wixlib/VS2019.wxs @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ext/VisualStudio/wixlib/VSExtension_Platform.wxi b/src/ext/VisualStudio/wixlib/VSExtension_Platform.wxi new file mode 100644 index 00000000..f9cd96f4 --- /dev/null +++ b/src/ext/VisualStudio/wixlib/VSExtension_Platform.wxi @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/src/ext/VisualStudio/wixlib/VSExtension_x86.wxs b/src/ext/VisualStudio/wixlib/VSExtension_x86.wxs new file mode 100644 index 00000000..288cf687 --- /dev/null +++ b/src/ext/VisualStudio/wixlib/VSExtension_x86.wxs @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/ext/VisualStudio/wixlib/VsixPackage.wxs b/src/ext/VisualStudio/wixlib/VsixPackage.wxs new file mode 100644 index 00000000..5937177b --- /dev/null +++ b/src/ext/VisualStudio/wixlib/VsixPackage.wxs @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ext/VisualStudio/wixlib/caSuffix.wxi b/src/ext/VisualStudio/wixlib/caSuffix.wxi new file mode 100644 index 00000000..a56a2393 --- /dev/null +++ b/src/ext/VisualStudio/wixlib/caSuffix.wxi @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ext/VisualStudio/wixlib/vs.v3.ncrunchproject b/src/ext/VisualStudio/wixlib/vs.v3.ncrunchproject new file mode 100644 index 00000000..319cd523 --- /dev/null +++ b/src/ext/VisualStudio/wixlib/vs.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/src/ext/VisualStudio/wixlib/vs.wixproj b/src/ext/VisualStudio/wixlib/vs.wixproj new file mode 100644 index 00000000..db3e2cff --- /dev/null +++ b/src/ext/VisualStudio/wixlib/vs.wixproj @@ -0,0 +1,19 @@ + + + + + + + Library + true + en-us + + + + + + + + + + diff --git a/src/ext/VisualStudio/wixlib/vs2005/VS2005_VSIPCC_Collection_Files_RTL.wxs b/src/ext/VisualStudio/wixlib/vs2005/VS2005_VSIPCC_Collection_Files_RTL.wxs new file mode 100644 index 00000000..66757349 --- /dev/null +++ b/src/ext/VisualStudio/wixlib/vs2005/VS2005_VSIPCC_Collection_Files_RTL.wxs @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ext/VisualStudio/wixlib/vs2005/redist/BIN_File_60377.dll b/src/ext/VisualStudio/wixlib/vs2005/redist/BIN_File_60377.dll new file mode 100644 index 00000000..dfdddf66 Binary files /dev/null and b/src/ext/VisualStudio/wixlib/vs2005/redist/BIN_File_60377.dll differ diff --git a/src/ext/VisualStudio/wixlib/vs2005/redist/vsipCCSamples.HxK b/src/ext/VisualStudio/wixlib/vs2005/redist/vsipCCSamples.HxK new file mode 100644 index 00000000..00db745c --- /dev/null +++ b/src/ext/VisualStudio/wixlib/vs2005/redist/vsipCCSamples.HxK @@ -0,0 +1,14 @@ + + + + \ No newline at end of file diff --git a/src/ext/VisualStudio/wixlib/vs2005/redist/vsipcc.hxc b/src/ext/VisualStudio/wixlib/vs2005/redist/vsipcc.hxc new file mode 100644 index 00000000..406e7f2b --- /dev/null +++ b/src/ext/VisualStudio/wixlib/vs2005/redist/vsipcc.hxc @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ext/VisualStudio/wixlib/vs2005/redist/vsipcc.hxt b/src/ext/VisualStudio/wixlib/vs2005/redist/vsipcc.hxt new file mode 100644 index 00000000..613dcfbb --- /dev/null +++ b/src/ext/VisualStudio/wixlib/vs2005/redist/vsipcc.hxt @@ -0,0 +1,15 @@ + + + + + + + + diff --git a/src/ext/VisualStudio/wixlib/vs2005/redist/vsipccALinks.hxk b/src/ext/VisualStudio/wixlib/vs2005/redist/vsipccALinks.hxk new file mode 100644 index 00000000..27017f76 --- /dev/null +++ b/src/ext/VisualStudio/wixlib/vs2005/redist/vsipccALinks.hxk @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/src/ext/VisualStudio/wixlib/vs2005/redist/vsipccBLinks.hxk b/src/ext/VisualStudio/wixlib/vs2005/redist/vsipccBLinks.hxk new file mode 100644 index 00000000..b37d2e18 --- /dev/null +++ b/src/ext/VisualStudio/wixlib/vs2005/redist/vsipccBLinks.hxk @@ -0,0 +1,13 @@ + + + + diff --git a/src/ext/VisualStudio/wixlib/vs2005/redist/vsipccFLinks.hxk b/src/ext/VisualStudio/wixlib/vs2005/redist/vsipccFLinks.hxk new file mode 100644 index 00000000..2d37efbf --- /dev/null +++ b/src/ext/VisualStudio/wixlib/vs2005/redist/vsipccFLinks.hxk @@ -0,0 +1,14 @@ + + + + \ No newline at end of file diff --git a/src/ext/VisualStudio/wixlib/vs2005/redist/vsipccKLinks.hxk b/src/ext/VisualStudio/wixlib/vs2005/redist/vsipccKLinks.hxk new file mode 100644 index 00000000..2938eff3 --- /dev/null +++ b/src/ext/VisualStudio/wixlib/vs2005/redist/vsipccKLinks.hxk @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/src/ext/VisualStudio/wixlib/vs2005/redist/vsipccNamedURLs.hxk b/src/ext/VisualStudio/wixlib/vs2005/redist/vsipccNamedURLs.hxk new file mode 100644 index 00000000..8691c54c --- /dev/null +++ b/src/ext/VisualStudio/wixlib/vs2005/redist/vsipccNamedURLs.hxk @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/src/ext/VisualStudio/wixlib/vs2005/redist/vsipccSlinks.hxk b/src/ext/VisualStudio/wixlib/vs2005/redist/vsipccSlinks.hxk new file mode 100644 index 00000000..9d193521 --- /dev/null +++ b/src/ext/VisualStudio/wixlib/vs2005/redist/vsipccSlinks.hxk @@ -0,0 +1,14 @@ + + + + + diff --git a/src/ext/VisualStudio/wixlib/vs2005/redist/vsipcc_reg.hxs b/src/ext/VisualStudio/wixlib/vs2005/redist/vsipcc_reg.hxs new file mode 100644 index 00000000..3f2905c4 Binary files /dev/null and b/src/ext/VisualStudio/wixlib/vs2005/redist/vsipcc_reg.hxs differ diff --git a/src/ext/VisualStudio/wixlib/vs2008/VS2008_VSIPCC_Collection_Files_RTL.wxs b/src/ext/VisualStudio/wixlib/vs2008/VS2008_VSIPCC_Collection_Files_RTL.wxs new file mode 100644 index 00000000..9fb1a0e5 --- /dev/null +++ b/src/ext/VisualStudio/wixlib/vs2008/VS2008_VSIPCC_Collection_Files_RTL.wxs @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ext/VisualStudio/wixlib/vs2008/redist/BIN_435439_x86_enu.dll b/src/ext/VisualStudio/wixlib/vs2008/redist/BIN_435439_x86_enu.dll new file mode 100644 index 00000000..7f5e9436 Binary files /dev/null and b/src/ext/VisualStudio/wixlib/vs2008/redist/BIN_435439_x86_enu.dll differ diff --git a/src/ext/VisualStudio/wixlib/vs2008/redist/_ALinks.hxk b/src/ext/VisualStudio/wixlib/vs2008/redist/_ALinks.hxk new file mode 100644 index 00000000..dd6df168 --- /dev/null +++ b/src/ext/VisualStudio/wixlib/vs2008/redist/_ALinks.hxk @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/src/ext/VisualStudio/wixlib/vs2008/redist/_BLinks.hxk b/src/ext/VisualStudio/wixlib/vs2008/redist/_BLinks.hxk new file mode 100644 index 00000000..a2288162 --- /dev/null +++ b/src/ext/VisualStudio/wixlib/vs2008/redist/_BLinks.hxk @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/src/ext/VisualStudio/wixlib/vs2008/redist/_CLinks.hxk b/src/ext/VisualStudio/wixlib/vs2008/redist/_CLinks.hxk new file mode 100644 index 00000000..da0df730 --- /dev/null +++ b/src/ext/VisualStudio/wixlib/vs2008/redist/_CLinks.hxk @@ -0,0 +1,13 @@ + + + + diff --git a/src/ext/VisualStudio/wixlib/vs2008/redist/_FLinks.hxk b/src/ext/VisualStudio/wixlib/vs2008/redist/_FLinks.hxk new file mode 100644 index 00000000..37dfda34 --- /dev/null +++ b/src/ext/VisualStudio/wixlib/vs2008/redist/_FLinks.hxk @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/src/ext/VisualStudio/wixlib/vs2008/redist/_KLinks.hxk b/src/ext/VisualStudio/wixlib/vs2008/redist/_KLinks.hxk new file mode 100644 index 00000000..2303ed0c --- /dev/null +++ b/src/ext/VisualStudio/wixlib/vs2008/redist/_KLinks.hxk @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/src/ext/VisualStudio/wixlib/vs2008/redist/_SLinks.hxk b/src/ext/VisualStudio/wixlib/vs2008/redist/_SLinks.hxk new file mode 100644 index 00000000..9f65eca3 --- /dev/null +++ b/src/ext/VisualStudio/wixlib/vs2008/redist/_SLinks.hxk @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/src/ext/VisualStudio/wixlib/vs2008/redist/_vsipcc90.hxc b/src/ext/VisualStudio/wixlib/vs2008/redist/_vsipcc90.hxc new file mode 100644 index 00000000..9ad6869e --- /dev/null +++ b/src/ext/VisualStudio/wixlib/vs2008/redist/_vsipcc90.hxc @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ext/VisualStudio/wixlib/vs2008/redist/_vsipcc90.hxt b/src/ext/VisualStudio/wixlib/vs2008/redist/_vsipcc90.hxt new file mode 100644 index 00000000..3ac4d5d6 --- /dev/null +++ b/src/ext/VisualStudio/wixlib/vs2008/redist/_vsipcc90.hxt @@ -0,0 +1,15 @@ + + + + + + + + diff --git a/src/ext/VisualStudio/wixlib/vs2008/redist/_vsipcc_namedUrls.hxk b/src/ext/VisualStudio/wixlib/vs2008/redist/_vsipcc_namedUrls.hxk new file mode 100644 index 00000000..aaa79158 --- /dev/null +++ b/src/ext/VisualStudio/wixlib/vs2008/redist/_vsipcc_namedUrls.hxk @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/src/ext/VisualStudio/wixlib/vs2008/redist/_vsipcc_samples.HxK b/src/ext/VisualStudio/wixlib/vs2008/redist/_vsipcc_samples.HxK new file mode 100644 index 00000000..00db745c --- /dev/null +++ b/src/ext/VisualStudio/wixlib/vs2008/redist/_vsipcc_samples.HxK @@ -0,0 +1,14 @@ + + + + \ No newline at end of file diff --git a/src/ext/VisualStudio/wixlib/vs2008/redist/vsipcc_reg.hxs b/src/ext/VisualStudio/wixlib/vs2008/redist/vsipcc_reg.hxs new file mode 100644 index 00000000..f6446867 Binary files /dev/null and b/src/ext/VisualStudio/wixlib/vs2008/redist/vsipcc_reg.hxs differ diff --git a/src/ext/global.json b/src/ext/global.json new file mode 100644 index 00000000..23dd3fa6 --- /dev/null +++ b/src/ext/global.json @@ -0,0 +1,5 @@ +{ + "msbuild-sdks": { + "WixToolset.Sdk": "4.0.0-build-0211" + } +} -- cgit v1.2.3-55-g6feb