aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Mensching <rob@firegiant.com>2017-12-29 04:55:28 -0800
committerRob Mensching <rob@firegiant.com>2017-12-29 04:56:13 -0800
commitcba9d16b54cd4ba5b8750ee97ed5aa36cf1fc382 (patch)
tree682423fc77e7f80cf727a91e9e6f3be7118be503
parente2d15ce225cbd9cd3e815cb9999f8896f8c610bf (diff)
downloadwix-cba9d16b54cd4ba5b8750ee97ed5aa36cf1fc382.tar.gz
wix-cba9d16b54cd4ba5b8750ee97ed5aa36cf1fc382.tar.bz2
wix-cba9d16b54cd4ba5b8750ee97ed5aa36cf1fc382.zip
Update to latest changes from Core and send build notifications to Slack
-rw-r--r--VisualStudio.wixext.sln20
-rw-r--r--appveyor.cmd4
-rw-r--r--appveyor.yml5
-rw-r--r--src/FindLocalWix.props2
-rw-r--r--src/test/WixToolsetTest.VisualStudio/TestData/UsingVsixPackage/Package.en-us.wxl11
-rw-r--r--src/test/WixToolsetTest.VisualStudio/TestData/UsingVsixPackage/Package.wxs24
-rw-r--r--src/test/WixToolsetTest.VisualStudio/TestData/UsingVsixPackage/PackageComponents.wxs14
-rw-r--r--src/test/WixToolsetTest.VisualStudio/TestData/UsingVsixPackage/example.txt1
-rw-r--r--src/test/WixToolsetTest.VisualStudio/VisualStudioExtensionFixture.cs46
-rw-r--r--src/test/WixToolsetTest.VisualStudio/WixToolsetTest.VisualStudio.csproj40
-rw-r--r--src/wixext/Data/messages.xml133
-rw-r--r--src/wixext/Data/tables.xml66
-rw-r--r--src/wixext/VSCompiler.cs469
-rw-r--r--src/wixext/VSDecompiler.cs8
-rw-r--r--src/wixext/VSExtensionData.cs48
-rw-r--r--src/wixext/VSExtensionFactory.cs18
-rw-r--r--src/wixext/VSWindowsInstallerBackendExtension.cs75
-rw-r--r--src/wixext/WixToolset.VisualStudio.wixext.csproj45
-rw-r--r--src/wixext/vs.xsd (renamed from src/wixext/xsd/vs.xsd)0
-rw-r--r--src/wixlib/packages.config4
-rw-r--r--src/wixlib/vs.wixproj18
21 files changed, 479 insertions, 572 deletions
diff --git a/VisualStudio.wixext.sln b/VisualStudio.wixext.sln
index ca8aac82..d787afa2 100644
--- a/VisualStudio.wixext.sln
+++ b/VisualStudio.wixext.sln
@@ -1,13 +1,15 @@
1 1
2Microsoft Visual Studio Solution File, Format Version 12.00 2Microsoft Visual Studio Solution File, Format Version 12.00
3# Visual Studio 15 3# Visual Studio 15
4VisualStudioVersion = 15.0.26730.16 4VisualStudioVersion = 15.0.27130.2003
5MinimumVisualStudioVersion = 15.0.26124.0 5MinimumVisualStudioVersion = 15.0.26124.0
6Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ca", "src\ca\vsca.vcxproj", "{45308B85-0628-4978-8FC8-6AD9E1AD5949}" 6Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vsca", "src\ca\vsca.vcxproj", "{45308B85-0628-4978-8FC8-6AD9E1AD5949}"
7EndProject 7EndProject
8Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolset.VisualStudio.wixext", "src\wixext\WixToolset.VisualStudio.wixext.csproj", "{61BFD377-9DE1-48B4-8687-560DF68D6F3B}" 8Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolset.VisualStudio.wixext", "src\wixext\WixToolset.VisualStudio.wixext.csproj", "{61BFD377-9DE1-48B4-8687-560DF68D6F3B}"
9EndProject 9EndProject
10Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "wixlib", "src\wixlib\vs.wixproj", "{14345C9D-8AF8-435A-BB1B-E067CE7EB321}" 10Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "vs", "src\wixlib\vs.wixproj", "{14345C9D-8AF8-435A-BB1B-E067CE7EB321}"
11EndProject
12Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolsetTest.VisualStudio", "src\test\WixToolsetTest.VisualStudio\WixToolsetTest.VisualStudio.csproj", "{DD2BD0F7-1E4A-4D11-954C-3505323C4E1B}"
11EndProject 13EndProject
12Global 14Global
13 GlobalSection(SolutionConfigurationPlatforms) = preSolution 15 GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -49,6 +51,18 @@ Global
49 {14345C9D-8AF8-435A-BB1B-E067CE7EB321}.Release|x64.Build.0 = Release|x64 51 {14345C9D-8AF8-435A-BB1B-E067CE7EB321}.Release|x64.Build.0 = Release|x64
50 {14345C9D-8AF8-435A-BB1B-E067CE7EB321}.Release|x86.ActiveCfg = Release|x86 52 {14345C9D-8AF8-435A-BB1B-E067CE7EB321}.Release|x86.ActiveCfg = Release|x86
51 {14345C9D-8AF8-435A-BB1B-E067CE7EB321}.Release|x86.Build.0 = Release|x86 53 {14345C9D-8AF8-435A-BB1B-E067CE7EB321}.Release|x86.Build.0 = Release|x86
54 {DD2BD0F7-1E4A-4D11-954C-3505323C4E1B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
55 {DD2BD0F7-1E4A-4D11-954C-3505323C4E1B}.Debug|Any CPU.Build.0 = Debug|Any CPU
56 {DD2BD0F7-1E4A-4D11-954C-3505323C4E1B}.Debug|x64.ActiveCfg = Debug|Any CPU
57 {DD2BD0F7-1E4A-4D11-954C-3505323C4E1B}.Debug|x64.Build.0 = Debug|Any CPU
58 {DD2BD0F7-1E4A-4D11-954C-3505323C4E1B}.Debug|x86.ActiveCfg = Debug|Any CPU
59 {DD2BD0F7-1E4A-4D11-954C-3505323C4E1B}.Debug|x86.Build.0 = Debug|Any CPU
60 {DD2BD0F7-1E4A-4D11-954C-3505323C4E1B}.Release|Any CPU.ActiveCfg = Release|Any CPU
61 {DD2BD0F7-1E4A-4D11-954C-3505323C4E1B}.Release|Any CPU.Build.0 = Release|Any CPU
62 {DD2BD0F7-1E4A-4D11-954C-3505323C4E1B}.Release|x64.ActiveCfg = Release|Any CPU
63 {DD2BD0F7-1E4A-4D11-954C-3505323C4E1B}.Release|x64.Build.0 = Release|Any CPU
64 {DD2BD0F7-1E4A-4D11-954C-3505323C4E1B}.Release|x86.ActiveCfg = Release|Any CPU
65 {DD2BD0F7-1E4A-4D11-954C-3505323C4E1B}.Release|x86.Build.0 = Release|Any CPU
52 EndGlobalSection 66 EndGlobalSection
53 GlobalSection(SolutionProperties) = preSolution 67 GlobalSection(SolutionProperties) = preSolution
54 HideSolutionNode = FALSE 68 HideSolutionNode = FALSE
diff --git a/appveyor.cmd b/appveyor.cmd
index a4f49085..4621592d 100644
--- a/appveyor.cmd
+++ b/appveyor.cmd
@@ -5,7 +5,9 @@ nuget restore
5 5
6msbuild -p:Configuration=Release -t:Restore 6msbuild -p:Configuration=Release -t:Restore
7 7
8msbuild -p:Configuration=Release -t:Pack .\src\wixext\WixToolset.VisualStudio.wixext.csproj 8msbuild -p:Configuration=Release src\test\WixToolsetTest.VisualStudio\WixToolsetTest.VisualStudio.csproj
9
10msbuild -p:Configuration=Release -t:Pack src\wixext\WixToolset.VisualStudio.wixext.csproj
9 11
10@popd 12@popd
11@endlocal \ No newline at end of file 13@endlocal \ No newline at end of file
diff --git a/appveyor.yml b/appveyor.yml
index d9da1df5..0c74d54b 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -22,3 +22,8 @@ skip_tags: true
22artifacts: 22artifacts:
23- path: build\Release\**\*.nupkg 23- path: build\Release\**\*.nupkg
24 name: nuget 24 name: nuget
25
26notifications:
27- provider: Slack
28 incoming_webhook:
29 secure: p5xuu+4x2JHfwGDMDe5KcG1k7gZxqYc4jWVwvyNZv5cvkubPD2waJs5yXMAXZNN7Z63/3PWHb7q4KoY/99AjauYa1nZ4c5qYqRPFRBKTHfA=
diff --git a/src/FindLocalWix.props b/src/FindLocalWix.props
index e77fb386..016dac77 100644
--- a/src/FindLocalWix.props
+++ b/src/FindLocalWix.props
@@ -3,6 +3,6 @@
3 3
4<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 4<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
5 <PropertyGroup> 5 <PropertyGroup>
6 <WixTargetsPath Condition=" '$(Configuration)' != 'Release' And Exists('$(MSBuildThisFileDirectory)..\..\Core\build\Release\publish\wix.targets') ">$(MSBuildThisFileDirectory)..\..\Core\build\Release\publish\wix.targets</WixTargetsPath> 6 <WixTargetsPath Condition=" '$(Configuration)' != 'Release' And Exists('$(MSBuildThisFileDirectory)..\..\Core\build\Release\publish\net461\wix.targets') ">$(MSBuildThisFileDirectory)..\..\Core\build\Release\publish\net461\wix.targets</WixTargetsPath>
7 </PropertyGroup> 7 </PropertyGroup>
8</Project> 8</Project>
diff --git a/src/test/WixToolsetTest.VisualStudio/TestData/UsingVsixPackage/Package.en-us.wxl b/src/test/WixToolsetTest.VisualStudio/TestData/UsingVsixPackage/Package.en-us.wxl
new file mode 100644
index 00000000..38c12ac1
--- /dev/null
+++ b/src/test/WixToolsetTest.VisualStudio/TestData/UsingVsixPackage/Package.en-us.wxl
@@ -0,0 +1,11 @@
1<?xml version="1.0" encoding="utf-8"?>
2
3<!--
4This file contains the declaration of all the localizable strings.
5-->
6<WixLocalization xmlns="http://wixtoolset.org/schemas/v4/wxl" Culture="en-US">
7
8 <String Id="DowngradeError">A newer version of [ProductName] is already installed.</String>
9 <String Id="FeatureTitle">MsiPackage</String>
10
11</WixLocalization>
diff --git a/src/test/WixToolsetTest.VisualStudio/TestData/UsingVsixPackage/Package.wxs b/src/test/WixToolsetTest.VisualStudio/TestData/UsingVsixPackage/Package.wxs
new file mode 100644
index 00000000..07e6ba3d
--- /dev/null
+++ b/src/test/WixToolsetTest.VisualStudio/TestData/UsingVsixPackage/Package.wxs
@@ -0,0 +1,24 @@
1<?xml version="1.0" encoding="utf-8"?>
2<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3 <Product Id="*" Name="MsiPackage" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a">
4 <Package InstallerVersion="200" Compressed="no" InstallScope="perMachine" />
5
6 <MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" />
7 <MediaTemplate />
8
9 <PropertyRef Id="VS2017DEVENV" />
10
11 <Feature Id="ProductFeature" Title="!(loc.FeatureTitle)">
12 <ComponentGroupRef Id="ProductComponents" />
13 </Feature>
14
15 </Product>
16
17 <Fragment>
18 <Directory Id="TARGETDIR" Name="SourceDir">
19 <Directory Id="ProgramFilesFolder">
20 <Directory Id="INSTALLFOLDER" Name="MsiPackage" />
21 </Directory>
22 </Directory>
23 </Fragment>
24</Wix>
diff --git a/src/test/WixToolsetTest.VisualStudio/TestData/UsingVsixPackage/PackageComponents.wxs b/src/test/WixToolsetTest.VisualStudio/TestData/UsingVsixPackage/PackageComponents.wxs
new file mode 100644
index 00000000..c8c72cc0
--- /dev/null
+++ b/src/test/WixToolsetTest.VisualStudio/TestData/UsingVsixPackage/PackageComponents.wxs
@@ -0,0 +1,14 @@
1<?xml version="1.0" encoding="utf-8"?>
2<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"
3 xmlns:vs="http://wixtoolset.org/schemas/v4/wxs/vs">
4 <Fragment>
5 <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
6 <Component>
7 <File Name="fake.vsix" Source="example.txt">
8 <vs:VsixPackage PackageId="ExampleVsix" />
9 </File>
10
11 </Component>
12 </ComponentGroup>
13 </Fragment>
14</Wix>
diff --git a/src/test/WixToolsetTest.VisualStudio/TestData/UsingVsixPackage/example.txt b/src/test/WixToolsetTest.VisualStudio/TestData/UsingVsixPackage/example.txt
new file mode 100644
index 00000000..1b4ffe8a
--- /dev/null
+++ b/src/test/WixToolsetTest.VisualStudio/TestData/UsingVsixPackage/example.txt
@@ -0,0 +1 @@
This is example.txt. \ No newline at end of file
diff --git a/src/test/WixToolsetTest.VisualStudio/VisualStudioExtensionFixture.cs b/src/test/WixToolsetTest.VisualStudio/VisualStudioExtensionFixture.cs
new file mode 100644
index 00000000..5bcc4391
--- /dev/null
+++ b/src/test/WixToolsetTest.VisualStudio/VisualStudioExtensionFixture.cs
@@ -0,0 +1,46 @@
1// 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.
2
3namespace WixToolsetTest.VisualStudio
4{
5 using System.Linq;
6 using WixBuildTools.TestSupport;
7 using WixToolset.Core.TestPackage;
8 using WixToolset.VisualStudio;
9 using Xunit;
10
11 public class VisualStudioExtensionFixture
12 {
13 [Fact]
14 public void CanBuildUsingVsixPackage()
15 {
16 var folder = TestData.Get(@"TestData\UsingVsixPackage");
17 var build = new Builder(folder, typeof(VSExtensionFactory), new[] { folder });
18
19 var results = build.BuildAndQuery(Build, "CustomAction");
20 Assert.Equal(new[]
21 {
22 "CustomAction:SetVS2010Vsix\t51\tVS_VSIX_INSTALLER_PATH\t[VS2010_VSIX_INSTALLER_PATH]\t0",
23 "CustomAction:SetVS2012Vsix\t51\tVS_VSIX_INSTALLER_PATH\t[VS2012_VSIX_INSTALLER_PATH]\t0",
24 "CustomAction:SetVS2013Vsix\t51\tVS_VSIX_INSTALLER_PATH\t[VS2013_VSIX_INSTALLER_PATH]\t0",
25 "CustomAction:SetVS2015Vsix\t51\tVS_VSIX_INSTALLER_PATH\t[VS2015_VSIX_INSTALLER_PATH]\t0",
26 "CustomAction:vimyrEjb_CFhXi3TTLayKNM2w7rvr4\t3122\tVS_VSIX_INSTALLER_PATH\t/q \"[#filzi8nwT8Ta133xcfp7qSIdGdRiC0]\" /admin\t0",
27 "CustomAction:viuFqqe3R3R3Fh7P05ubFRhqQlCBdQ\t1074\tVS_VSIX_INSTALLER_PATH\t/q \"[#filzi8nwT8Ta133xcfp7qSIdGdRiC0]\"\t0",
28 "CustomAction:vrmyrEjb_CFhXi3TTLayKNM2w7rvr4\t3442\tVS_VSIX_INSTALLER_PATH\t/q /u:\"ExampleVsix\" /admin\t0",
29 "CustomAction:vruFqqe3R3R3Fh7P05ubFRhqQlCBdQ\t1394\tVS_VSIX_INSTALLER_PATH\t/q /u:\"ExampleVsix\"\t0",
30 "CustomAction:VSFindInstances\t257\tVSCA\tFindInstances\t0",
31 "CustomAction:vumyrEjb_CFhXi3TTLayKNM2w7rvr4\t3186\tVS_VSIX_INSTALLER_PATH\t/q /u:\"ExampleVsix\" /admin\t0",
32 "CustomAction:vuuFqqe3R3R3Fh7P05ubFRhqQlCBdQ\t1138\tVS_VSIX_INSTALLER_PATH\t/q /u:\"ExampleVsix\"\t0",
33 "CustomAction:Vwd2012VsixWhenVSAbsent\t51\tVS_VSIX_INSTALLER_PATH\t[VWD2012_VSIX_INSTALL_ROOT]\\Common7\\IDE\\VSIXInstaller.exe\t0",
34 "CustomAction:Vwd2013VsixWhenVSAbsent\t51\tVS_VSIX_INSTALLER_PATH\t[VWD2013_VSIX_INSTALL_ROOT]\\Common7\\IDE\\VSIXInstaller.exe\t0",
35 "CustomAction:Vwd2015VsixWhenVSAbsent\t51\tVS_VSIX_INSTALLER_PATH\t[VWD2015_VSIX_INSTALL_ROOT]\\Common7\\IDE\\VSIXInstaller.exe\t0",
36 }, results.OrderBy(s => s).ToArray());
37 }
38
39 private static void Build(string[] args)
40 {
41 var result = WixRunner.Execute(args, out var messages);
42 Assert.Equal(0, result);
43 Assert.Empty(messages);
44 }
45 }
46}
diff --git a/src/test/WixToolsetTest.VisualStudio/WixToolsetTest.VisualStudio.csproj b/src/test/WixToolsetTest.VisualStudio/WixToolsetTest.VisualStudio.csproj
new file mode 100644
index 00000000..621ce70b
--- /dev/null
+++ b/src/test/WixToolsetTest.VisualStudio/WixToolsetTest.VisualStudio.csproj
@@ -0,0 +1,40 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- 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. -->
3
4<Project Sdk="Microsoft.NET.Sdk">
5 <PropertyGroup>
6 <TargetFramework>netcoreapp2.0</TargetFramework>
7 <IsPackable>false</IsPackable>
8 </PropertyGroup>
9
10 <PropertyGroup>
11 <NoWarn>NU1701</NoWarn>
12 </PropertyGroup>
13
14 <ItemGroup>
15 <Content Include="TestData\UsingVsixPackage\example.txt" CopyToOutputDirectory="PreserveNewest" />
16 <Content Include="TestData\UsingVsixPackage\Package.en-us.wxl" CopyToOutputDirectory="PreserveNewest" />
17 <Content Include="TestData\UsingVsixPackage\Package.wxs" CopyToOutputDirectory="PreserveNewest" />
18 <Content Include="TestData\UsingVsixPackage\PackageComponents.wxs" CopyToOutputDirectory="PreserveNewest" />
19 </ItemGroup>
20
21 <ItemGroup>
22 <ProjectReference Include="..\..\wixext\WixToolset.VisualStudio.wixext.csproj" />
23 </ItemGroup>
24
25 <ItemGroup>
26 <ProjectReference Include="$(WixToolsetRootFolder)\Core\src\WixToolset.Core.TestPackage\WixToolset.Core.TestPackage.csproj" Condition=" '$(Configuration)' == 'Debug' And Exists('$(WixToolsetRootFolder)\Core\src\WixToolset.Core.TestPackage\WixToolset.Core.TestPackage.csproj') " />
27 <ProjectReference Include="$(WixToolsetRootFolder)\Core\src\wix\wix.csproj" Condition=" '$(Configuration)' == 'Debug' And Exists('$(WixToolsetRootFolder)\Core\src\wix\wix.csproj') " />
28 <PackageReference Include="WixToolset.Core.TestPackage" Version="4.0.*" Condition=" '$(Configuration)' == 'Release' Or !Exists('$(WixToolsetRootFolder)\Core\src\WixToolset.Core.TestPackage\WixToolset.Core.TestPackage.csproj') " PrivateAssets="all" />
29 </ItemGroup>
30
31 <ItemGroup>
32 <PackageReference Include="WixBuildTools.TestSupport" Version="4.0.*" />
33 </ItemGroup>
34
35 <ItemGroup>
36 <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0-preview-20170628-02" />
37 <PackageReference Include="xunit" Version="2.2.0" />
38 <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
39 </ItemGroup>
40</Project>
diff --git a/src/wixext/Data/messages.xml b/src/wixext/Data/messages.xml
deleted file mode 100644
index d1c85301..00000000
--- a/src/wixext/Data/messages.xml
+++ /dev/null
@@ -1,133 +0,0 @@
1<?xml version='1.0' encoding='utf-8'?>
2<!-- 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. -->
3
4
5<Messages Namespace="WixToolset.Extensions" Resources="Data.Messages" xmlns="http://schemas.microsoft.com/genmsgs/2004/07/messages">
6 <Class Name="VSErrors" ContainerName="VSErrorEventArgs" BaseContainerName="MessageEventArgs">
7 <Message Id="InvalidOutputGroup" Number="5301" SourceLineNumbers="no">
8 <Instance>
9 Invalid project output group: {0}.
10 <Parameter Type="System.String" Name="outputGroup" />
11 </Instance>
12 </Message>
13 <Message Id="NoOutputGroupSpecified" Number="5302" SourceLineNumbers="no">
14 <Instance>
15 No project output group specified.
16 </Instance>
17 </Message>
18 <Message Id="CannotLoadMSBuildAssembly" Number="5303" SourceLineNumbers="no">
19 <Instance>
20 Failed to load MSBuild assembly: {0}
21 <Parameter Type="System.String" Name="innerExceptionMessage" />
22 </Instance>
23 </Message>
24 <Message Id="CannotLoadMSBuildEngine" Number="5304" SourceLineNumbers="no">
25 <Instance>
26 Failed to load MSBuild engine: {0}
27 <Parameter Type="System.String" Name="innerExceptionMessage" />
28 </Instance>
29 </Message>
30 <Message Id="CannotLoadProject" Number="5305" SourceLineNumbers="no">
31 <Instance>
32 Failed to load project {0}: {1}
33 <Parameter Type="System.String" Name="projectFile" />
34 <Parameter Type="System.String" Name="innerExceptionMessage" />
35 </Instance>
36 </Message>
37 <Message Id="CannotBuildProject" Number="5306" SourceLineNumbers="no">
38 <Instance>
39 Failed to build project {0}: {1}
40 <Parameter Type="System.String" Name="projectFile" />
41 <Parameter Type="System.String" Name="innerExceptionMessage" />
42 </Instance>
43 </Message>
44 <Message Id="BuildFailed" Number="5307" SourceLineNumbers="no">
45 <Instance>
46 Build failed.
47 </Instance>
48 </Message>
49 <Message Id="MissingProjectOutputGroup" Number="5308" SourceLineNumbers="no">
50 <Instance>
51 Missing project output group '{1}' in project {0}.
52 <Parameter Type="System.String" Name="projectFile" />
53 <Parameter Type="System.String" Name="outputGroup" />
54 </Instance>
55 </Message>
56 <Message Id="DirectoryAttributeAccessorBadType" Number="5309" SourceLineNumbers="no">
57 <Instance>
58 DirectoryAttributeAccessor tried to access an invalid element type for attribute '{0'}.
59 <Parameter Type="System.String" Name="attributeName" />
60 </Instance>
61 </Message>
62 <Message Id="InvalidOutputType" Number="5310" SourceLineNumbers="no">
63 <Instance>
64 Invalid generated type: {0}. Must be one of: components, container, payloadgroup, layout.
65 <Parameter Type="System.String" Name="generateType" />
66 </Instance>
67 </Message>
68 <Message Id="InvalidDirectoryId" Number="5311" SourceLineNumbers="no">
69 <Instance>
70 Invalid directory ID: {0}. Check that it doesn't start with a hyphen or slash.
71 <Parameter Type="System.String" Name="generateType" />
72 </Instance>
73 </Message>
74 <Message Id="InvalidProjectName" Number="5312" SourceLineNumbers="no">
75 <Instance>
76 Invalid project name: {0}. Check that it doesn't start with a hyphen or slash.
77 <Parameter Type="System.String" Name="generateType" />
78 </Instance>
79 </Message>
80 <Message Id="BuildErrorDuringHarvesting" Number="5313" SourceLineNumbers="no">
81 <Instance>
82 Build error during harvesting: {0}
83 <Parameter Type="System.String" Name="buildError" />
84 </Instance>
85 </Message>
86 <Message Id="CannotLoadMSBuildWrapperAssembly" Number="5314" SourceLineNumbers="no">
87 <Instance>
88 Failed to load MSBuild wrapper assembly: {0}
89 <Parameter Type="System.String" Name="innerExceptionMessage" />
90 </Instance>
91 </Message>
92 <Message Id="CannotLoadMSBuildWrapperType" Number="5315" SourceLineNumbers="no">
93 <Instance>
94 Failed to load MSBuild wrapper type: {0}
95 <Parameter Type="System.String" Name="innerExceptionMessage" />
96 </Instance>
97 </Message>
98 <Message Id="CannotLoadMSBuildWrapperObject" Number="5316" SourceLineNumbers="no">
99 <Instance>
100 Failed to load MSBuild wrapper object: {0}
101 <Parameter Type="System.String" Name="innerExceptionMessage" />
102 </Instance>
103 </Message>
104 </Class>
105 <Class Name="VSWarnings" ContainerName="VSWarningEventArgs" BaseContainerName="MessageEventArgs">
106 <Message Id="NoLogger" Number="5399" SourceLineNumbers="no">
107 <Instance>
108 Failed to set loggers: {0}
109 <Parameter Type="System.String" Name="exceptionMessage" />
110 </Instance>
111 </Message>
112 <Message Id="NoProjectConfiguration" Number="5398" SourceLineNumbers="no">
113 <Instance>
114 Failed to set project configuration and platform: {0}
115 <Parameter Type="System.String" Name="exceptionMessage" />
116 </Instance>
117 </Message>
118 </Class>
119 <Class Name="VSVerboses" ContainerName="VSVerboseEventArgs" BaseContainerName="MessageEventArgs">
120 <Message Id="FoundToolsVersion" Number="5379" SourceLineNumbers="no">
121 <Instance>
122 Found ToolsVersion {0} inside project file.
123 <Parameter Type="System.String" Name="toolsVersion" />
124 </Instance>
125 </Message>
126 <Message Id="LoadingProject" Number="5378" SourceLineNumbers="no">
127 <Instance>
128 Loading project using MSBuild version {0}.
129 <Parameter Type="System.String" Name="msbuildVersion" />
130 </Instance>
131 </Message>
132 </Class>
133</Messages>
diff --git a/src/wixext/Data/tables.xml b/src/wixext/Data/tables.xml
deleted file mode 100644
index e9c86097..00000000
--- a/src/wixext/Data/tables.xml
+++ /dev/null
@@ -1,66 +0,0 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!-- 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. -->
3
4
5<tableDefinitions xmlns="http://wixtoolset.org/schemas/v4/wi/tables">
6 <tableDefinition name="HelpFile" createSymbols="yes">
7 <columnDefinition name="HelpFileKey" type="string" length="72" primaryKey="yes" modularize="column"
8 category="identifier" description="Primary Key for HelpFile Table (required)."/>
9 <columnDefinition name="HelpFileName" type="string" length="72"
10 category="text" description="Internal Microsoft Help ID for this HelpFile (required)."/>
11 <columnDefinition name="LangID" type="number" length="2" nullable="yes"
12 category="language" description="Language ID for content file (optional)."/>
13 <columnDefinition name="File_HxS" type="string" length="72" modularize="column"
14 keyTable="File" keyColumn="1" category="identifier" description="Key for HxS (Title) file (required)."/>
15 <columnDefinition name="File_HxI" type="string" length="72" nullable="yes" modularize="column"
16 keyTable="File" keyColumn="1" category="identifier" description="Key for HxI (Index) file (optional)."/>
17 <columnDefinition name="File_HxQ" type="string" length="72" nullable="yes" modularize="column"
18 keyTable="File" keyColumn="1" category="identifier" description="Key for HxQ (Query) file (optional)."/>
19 <columnDefinition name="File_HxR" type="string" length="72" nullable="yes" modularize="column"
20 keyTable="File" keyColumn="1" category="identifier" description="Key for HxR (Attributes) file (optional)."/>
21 <columnDefinition name="File_Samples" type="string" length="72" nullable="yes" modularize="column"
22 keyTable="File" keyColumn="1" category="identifier" description="Key for a file that is in the 'root' of the samples directory for this HelpFile (optional)."/>
23 </tableDefinition>
24 <tableDefinition name="HelpFileToNamespace">
25 <columnDefinition name="HelpFile_" type="string" length="72" primaryKey="yes" modularize="column"
26 keyTable="HelpFile" keyColumn="1" category="identifier" description="Foreign key into HelpFile table (required)."/>
27 <columnDefinition name="HelpNamespace_" type="string" length="72" primaryKey="yes"
28 keyTable="HelpNamespace" keyColumn="1" category="identifier" description="Foreign key into HelpNamespace table (required)."/>
29 </tableDefinition>
30 <tableDefinition name="HelpFilter" createSymbols="yes">
31 <columnDefinition name="FilterKey" type="string" length="72" primaryKey="yes" modularize="column"
32 category="identifier" description="Primary Key for HelpFilter (required)."/>
33 <columnDefinition name="Description" type="localized" length="0"
34 category="text" description="Friendly name for Filter (required)."/>
35 <columnDefinition name="QueryString" type="string" length="0" nullable="yes"
36 category="text" description="Query String for Help Filter (optional)."/>
37 </tableDefinition>
38 <tableDefinition name="HelpFilterToNamespace">
39 <columnDefinition name="HelpFilter_" type="string" length="72" primaryKey="yes" modularize="column"
40 keyTable="HelpFilter" keyColumn="1" category="identifier" description="Foreign key into HelpFilter table (required)."/>
41 <columnDefinition name="HelpNamespace_" type="string" length="72" primaryKey="yes"
42 keyTable="HelpNamespace" keyColumn="1" category="identifier" description="Foreign key into HelpNamespace table (required)."/>
43 </tableDefinition>
44 <tableDefinition name="HelpNamespace" createSymbols="yes">
45 <columnDefinition name="NamespaceKey" type="string" length="72" primaryKey="yes"
46 category="identifier" description="Primary Key for HelpNamespace (required)."/>
47 <columnDefinition name="NamespaceName" type="string" length="0"
48 category="text" description="Internal Microsoft Help ID for this Namespace (required)."/>
49 <columnDefinition name="File_Collection" type="string" length="72" modularize="column"
50 keyTable="File" keyColumn="1" category="text" description="Key for HxC (Collection) file (required)."/>
51 <columnDefinition name="Description" type="localized" length="0" nullable="yes"
52 category="text" description="Friendly name for Namespace (optional)."/>
53 </tableDefinition>
54 <tableDefinition name="HelpPlugin">
55 <columnDefinition name="HelpNamespace_" type="string" length="72" primaryKey="yes"
56 keyTable="HelpNamespace" keyColumn="1" category="identifier" description="Forein Key into HelpNamespace table for the child namespace that will be plugged into the parent namespace (required)."/>
57 <columnDefinition name="HelpNamespace_Parent" type="string" length="72" primaryKey="yes"
58 category="identifier" description="Forein Key into HelpNamespace table for the parent namespace into which the child will be inserted (required)."/>
59 <columnDefinition name="File_HxT" type="string" length="72" nullable="yes" modularize="column"
60 keyTable="File" keyColumn="1" category="identifier" description="Key for HxT file of child namespace (optional)."/>
61 <columnDefinition name="File_HxA" type="string" length="72" nullable="yes" modularize="column"
62 keyTable="File" keyColumn="1" category="identifier" description="Key for HxA (Attributes) file of child namespace (optional)."/>
63 <columnDefinition name="File_ParentHxT" type="string" length="72" nullable="yes" modularize="column"
64 keyTable="File" keyColumn="1" category="identifier" description="Key for HxT file of parent namespace that now includes the new child namespace (optional)."/>
65 </tableDefinition>
66</tableDefinitions>
diff --git a/src/wixext/VSCompiler.cs b/src/wixext/VSCompiler.cs
index cf6226dd..8c01cb5b 100644
--- a/src/wixext/VSCompiler.cs
+++ b/src/wixext/VSCompiler.cs
@@ -1,6 +1,6 @@
1// 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. 1// 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.
2 2
3namespace WixToolset.Extensions 3namespace WixToolset.VisualStudio
4{ 4{
5 using System; 5 using System;
6 using System.Collections.Generic; 6 using System.Collections.Generic;
@@ -11,7 +11,7 @@ namespace WixToolset.Extensions
11 /// <summary> 11 /// <summary>
12 /// The compiler for the WiX Toolset Visual Studio Extension. 12 /// The compiler for the WiX Toolset Visual Studio Extension.
13 /// </summary> 13 /// </summary>
14 public sealed class VSCompiler : CompilerExtension 14 public sealed class VSCompiler : BaseCompilerExtension
15 { 15 {
16 internal const int MsidbCustomActionTypeExe = 0x00000002; // Target = command line args 16 internal const int MsidbCustomActionTypeExe = 0x00000002; // Target = command line args
17 internal const int MsidbCustomActionTypeProperty = 0x00000030; // Source = full path to executable 17 internal const int MsidbCustomActionTypeProperty = 0x00000030; // Source = full path to executable
@@ -20,22 +20,9 @@ namespace WixToolset.Extensions
20 internal const int MsidbCustomActionTypeInScript = 0x00000400; // queue for execution within script 20 internal const int MsidbCustomActionTypeInScript = 0x00000400; // queue for execution within script
21 internal const int MsidbCustomActionTypeNoImpersonate = 0x00000800; // queue for not impersonating 21 internal const int MsidbCustomActionTypeNoImpersonate = 0x00000800; // queue for not impersonating
22 22
23 /// <summary> 23 public override XNamespace Namespace => "http://wixtoolset.org/schemas/v4/wxs/vs";
24 /// Instantiate a new HelpCompiler.
25 /// </summary>
26 public VSCompiler()
27 {
28 this.Namespace = "http://wixtoolset.org/schemas/v4/wxs/vs";
29 }
30 24
31 /// <summary> 25 public override void ParseElement(Intermediate intermediate, IntermediateSection section, XElement parentElement, XElement element, IDictionary<string, string> context)
32 /// Processes an element for the Compiler.
33 /// </summary>
34 /// <param name="sourceLineNumbers">Source line number for the parent element.</param>
35 /// <param name="parentElement">Parent element of element to process.</param>
36 /// <param name="element">Element to process.</param>
37 /// <param name="contextValues">Extra information about the context in which this element is being parsed.</param>
38 public override void ParseElement(XElement parentElement, XElement element, IDictionary<string, string> context)
39 { 26 {
40 switch (parentElement.Name.LocalName) 27 switch (parentElement.Name.LocalName)
41 { 28 {
@@ -43,10 +30,10 @@ namespace WixToolset.Extensions
43 switch (element.Name.LocalName) 30 switch (element.Name.LocalName)
44 { 31 {
45 case "VsixPackage": 32 case "VsixPackage":
46 this.ParseVsixPackageElement(element, context["ComponentId"], null); 33 this.ParseVsixPackageElement(intermediate, section, element, context["ComponentId"], null);
47 break; 34 break;
48 default: 35 default:
49 this.Core.UnexpectedElement(parentElement, element); 36 this.ParseHelper.UnexpectedElement(parentElement, element);
50 break; 37 break;
51 } 38 }
52 break; 39 break;
@@ -54,16 +41,16 @@ namespace WixToolset.Extensions
54 switch (element.Name.LocalName) 41 switch (element.Name.LocalName)
55 { 42 {
56 case "HelpCollection": 43 case "HelpCollection":
57 this.ParseHelpCollectionElement(element, context["FileId"]); 44 this.ParseHelpCollectionElement(intermediate, section, element, context["FileId"]);
58 break; 45 break;
59 case "HelpFile": 46 case "HelpFile":
60 this.ParseHelpFileElement(element, context["FileId"]); 47 this.ParseHelpFileElement(intermediate, section, element, context["FileId"]);
61 break; 48 break;
62 case "VsixPackage": 49 case "VsixPackage":
63 this.ParseVsixPackageElement(element, context["ComponentId"], context["FileId"]); 50 this.ParseVsixPackageElement(intermediate, section, element, context["ComponentId"], context["FileId"]);
64 break; 51 break;
65 default: 52 default:
66 this.Core.UnexpectedElement(parentElement, element); 53 this.ParseHelper.UnexpectedElement(parentElement, element);
67 break; 54 break;
68 } 55 }
69 break; 56 break;
@@ -73,186 +60,171 @@ namespace WixToolset.Extensions
73 switch (element.Name.LocalName) 60 switch (element.Name.LocalName)
74 { 61 {
75 case "HelpCollectionRef": 62 case "HelpCollectionRef":
76 this.ParseHelpCollectionRefElement(element); 63 this.ParseHelpCollectionRefElement(intermediate, section, element);
77 break; 64 break;
78 case "HelpFilter": 65 case "HelpFilter":
79 this.ParseHelpFilterElement(element); 66 this.ParseHelpFilterElement(intermediate, section, element);
80 break; 67 break;
81 default: 68 default:
82 this.Core.UnexpectedElement(parentElement, element); 69 this.ParseHelper.UnexpectedElement(parentElement, element);
83 break; 70 break;
84 } 71 }
85 break; 72 break;
86 default: 73 default:
87 this.Core.UnexpectedElement(parentElement, element); 74 this.ParseHelper.UnexpectedElement(parentElement, element);
88 break; 75 break;
89 } 76 }
90 } 77 }
91 78
92 /// <summary> 79 private void ParseHelpCollectionRefElement(Intermediate intermediate, IntermediateSection section, XElement element)
93 /// Parses a HelpCollectionRef element.
94 /// </summary>
95 /// <param name="node">Element to process.</param>
96 private void ParseHelpCollectionRefElement(XElement node)
97 { 80 {
98 SourceLineNumber sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node); 81 SourceLineNumber sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
99 string id = null; 82 Identifier id = null;
100 83
101 foreach (XAttribute attrib in node.Attributes()) 84 foreach (XAttribute attrib in element.Attributes())
102 { 85 {
103 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) 86 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
104 { 87 {
105 switch (attrib.Name.LocalName) 88 switch (attrib.Name.LocalName)
106 { 89 {
107 case "Id": 90 case "Id":
108 id = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 91 id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
109 this.Core.CreateSimpleReference(sourceLineNumbers, "HelpNamespace", id); 92 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "HelpNamespace", id.Id);
110 break; 93 break;
111 default: 94 default:
112 this.Core.UnexpectedAttribute(node, attrib); 95 this.ParseHelper.UnexpectedAttribute(element, attrib);
113 break; 96 break;
114 } 97 }
115 } 98 }
116 else 99 else
117 { 100 {
118 this.Core.ParseExtensionAttribute(node, attrib); 101 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
119 } 102 }
120 } 103 }
121 104
122 if (null == id) 105 if (null == id)
123 { 106 {
124 this.Core.OnMessage(WixErrors.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Id")); 107 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Id"));
125 } 108 }
126 109
127 foreach (XElement child in node.Elements()) 110 foreach (XElement child in element.Elements())
128 { 111 {
129 if (this.Namespace == child.Name.Namespace) 112 if (this.Namespace == child.Name.Namespace)
130 { 113 {
131 SourceLineNumber childSourceLineNumbers = Preprocessor.GetSourceLineNumbers(child); 114 SourceLineNumber childSourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(child);
132 switch (child.Name.LocalName) 115 switch (child.Name.LocalName)
133 { 116 {
134 case "HelpFileRef": 117 case "HelpFileRef":
135 this.ParseHelpFileRefElement(child, id); 118 this.ParseHelpFileRefElement(intermediate, section, child, id);
136 break; 119 break;
137 default: 120 default:
138 this.Core.UnexpectedElement(node, child); 121 this.ParseHelper.UnexpectedElement(element, child);
139 break; 122 break;
140 } 123 }
141 } 124 }
142 else 125 else
143 { 126 {
144 this.Core.ParseExtensionElement(node, child); 127 this.ParseHelper.ParseExtensionElement(this.Context.Extensions, intermediate, section, element, child);
145 } 128 }
146 } 129 }
147 } 130 }
148 131
149 /// <summary> 132 private void ParseHelpCollectionElement(Intermediate intermediate, IntermediateSection section, XElement element, string fileId)
150 /// Parses a HelpCollection element.
151 /// </summary>
152 /// <param name="node">Element to process.</param>
153 /// <param name="fileId">Identifier of the parent File element.</param>
154 private void ParseHelpCollectionElement(XElement node, string fileId)
155 { 133 {
156 SourceLineNumber sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node); 134 SourceLineNumber sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
157 string id = null; 135 Identifier id = null;
158 string description = null; 136 string description = null;
159 string name = null; 137 string name = null;
160 YesNoType suppressCAs = YesNoType.No; 138 YesNoType suppressCAs = YesNoType.No;
161 139
162 foreach (XAttribute attrib in node.Attributes()) 140 foreach (XAttribute attrib in element.Attributes())
163 { 141 {
164 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) 142 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
165 { 143 {
166 switch (attrib.Name.LocalName) 144 switch (attrib.Name.LocalName)
167 { 145 {
168 case "Id": 146 case "Id":
169 id = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 147 id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
170 break; 148 break;
171 case "Description": 149 case "Description":
172 description = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 150 description = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
173 break; 151 break;
174 case "Name": 152 case "Name":
175 name = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 153 name = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
176 break; 154 break;
177 case "SuppressCustomActions": 155 case "SuppressCustomActions":
178 suppressCAs = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); 156 suppressCAs = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib);
179 break; 157 break;
180 default: 158 default:
181 this.Core.UnexpectedAttribute(node, attrib); 159 this.ParseHelper.UnexpectedAttribute(element, attrib);
182 break; 160 break;
183 } 161 }
184 } 162 }
185 else 163 else
186 { 164 {
187 this.Core.ParseExtensionAttribute(node, attrib); 165 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
188 } 166 }
189 } 167 }
190 168
191 if (null == id) 169 if (null == id)
192 { 170 {
193 this.Core.OnMessage(WixErrors.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Id")); 171 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Id"));
194 } 172 }
195 173
196 if (null == description) 174 if (null == description)
197 { 175 {
198 this.Core.OnMessage(WixErrors.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Description")); 176 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Description"));
199 } 177 }
200 178
201 if (null == name) 179 if (null == name)
202 { 180 {
203 this.Core.OnMessage(WixErrors.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Name")); 181 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Name"));
204 } 182 }
205 183
206 foreach (XElement child in node.Elements()) 184 foreach (XElement child in element.Elements())
207 { 185 {
208 if (this.Namespace == child.Name.Namespace) 186 if (this.Namespace == child.Name.Namespace)
209 { 187 {
210 switch (child.Name.LocalName) 188 switch (child.Name.LocalName)
211 { 189 {
212 case "HelpFileRef": 190 case "HelpFileRef":
213 this.ParseHelpFileRefElement(child, id); 191 this.ParseHelpFileRefElement(intermediate, section, child, id);
214 break; 192 break;
215 case "HelpFilterRef": 193 case "HelpFilterRef":
216 this.ParseHelpFilterRefElement(child, id); 194 this.ParseHelpFilterRefElement(intermediate, section, child, id);
217 break; 195 break;
218 case "PlugCollectionInto": 196 case "PlugCollectionInto":
219 this.ParsePlugCollectionIntoElement(child, id); 197 this.ParsePlugCollectionIntoElement(intermediate, section, child, id);
220 break; 198 break;
221 default: 199 default:
222 this.Core.UnexpectedElement(node, child); 200 this.ParseHelper.UnexpectedElement(element, child);
223 break; 201 break;
224 } 202 }
225 } 203 }
226 else 204 else
227 { 205 {
228 this.Core.ParseExtensionElement(node, child); 206 this.ParseHelper.ParseExtensionElement(this.Context.Extensions, intermediate, section, element, child);
229 } 207 }
230 } 208 }
231 209
232 if (!this.Core.EncounteredError) 210 if (!this.Messaging.EncounteredError)
233 { 211 {
234 Row row = this.Core.CreateRow(sourceLineNumbers, "HelpNamespace"); 212 var row = this.ParseHelper.CreateRow(section, sourceLineNumbers, "HelpNamespace", id);
235 row[0] = id; 213 row.Set(1, name);
236 row[1] = name; 214 row.Set(2, fileId);
237 row[2] = fileId; 215 row.Set(3, description);
238 row[3] = description;
239 216
240 if (YesNoType.No == suppressCAs) 217 if (YesNoType.No == suppressCAs)
241 { 218 {
242 this.Core.CreateSimpleReference(sourceLineNumbers, "CustomAction", "CA_RegisterMicrosoftHelp.3643236F_FC70_11D3_A536_0090278A1BB8"); 219 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "CustomAction", "CA_RegisterMicrosoftHelp.3643236F_FC70_11D3_A536_0090278A1BB8");
243 } 220 }
244 } 221 }
245 } 222 }
246 223
247 /// <summary> 224 private void ParseHelpFileElement(Intermediate intermediate, IntermediateSection section, XElement element, string fileId)
248 /// Parses a HelpFile element.
249 /// </summary>
250 /// <param name="node">Element to process.</param>
251 /// <param name="fileId">Identifier of the parent file element.</param>
252 private void ParseHelpFileElement(XElement node, string fileId)
253 { 225 {
254 SourceLineNumber sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node); 226 SourceLineNumber sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
255 string id = null; 227 Identifier id = null;
256 string name = null; 228 string name = null;
257 int language = CompilerConstants.IntegerNotSet; 229 int language = CompilerConstants.IntegerNotSet;
258 string hxi = null; 230 string hxi = null;
@@ -261,255 +233,232 @@ namespace WixToolset.Extensions
261 string samples = null; 233 string samples = null;
262 YesNoType suppressCAs = YesNoType.No; 234 YesNoType suppressCAs = YesNoType.No;
263 235
264 foreach (XAttribute attrib in node.Attributes()) 236 foreach (XAttribute attrib in element.Attributes())
265 { 237 {
266 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) 238 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
267 { 239 {
268 switch (attrib.Name.LocalName) 240 switch (attrib.Name.LocalName)
269 { 241 {
270 case "Id": 242 case "Id":
271 id = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 243 id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
272 break; 244 break;
273 case "AttributeIndex": 245 case "AttributeIndex":
274 hxr = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 246 hxr = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
275 this.Core.CreateSimpleReference(sourceLineNumbers, "File", hxr); 247 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "File", hxr);
276 break; 248 break;
277 case "Index": 249 case "Index":
278 hxi = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 250 hxi = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
279 this.Core.CreateSimpleReference(sourceLineNumbers, "File", hxi); 251 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "File", hxi);
280 break; 252 break;
281 case "Language": 253 case "Language":
282 language = this.Core.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, short.MaxValue); 254 language = this.ParseHelper.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, short.MaxValue);
283 break; 255 break;
284 case "Name": 256 case "Name":
285 name = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 257 name = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
286 break; 258 break;
287 case "SampleLocation": 259 case "SampleLocation":
288 samples = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 260 samples = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
289 this.Core.CreateSimpleReference(sourceLineNumbers, "File", samples); 261 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "File", samples);
290 break; 262 break;
291 case "Search": 263 case "Search":
292 hxq = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 264 hxq = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
293 this.Core.CreateSimpleReference(sourceLineNumbers, "File", hxq); 265 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "File", hxq);
294 break; 266 break;
295 case "SuppressCustomActions": 267 case "SuppressCustomActions":
296 suppressCAs = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); 268 suppressCAs = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib);
297 break; 269 break;
298 default: 270 default:
299 this.Core.UnexpectedAttribute(node, attrib); 271 this.ParseHelper.UnexpectedAttribute(element, attrib);
300 break; 272 break;
301 } 273 }
302 } 274 }
303 else 275 else
304 { 276 {
305 this.Core.ParseExtensionAttribute(node, attrib); 277 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
306 } 278 }
307 } 279 }
308 280
309 if (null == id) 281 if (null == id)
310 { 282 {
311 this.Core.OnMessage(WixErrors.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Id")); 283 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Id"));
312 } 284 }
313 285
314 if (null == name) 286 if (null == name)
315 { 287 {
316 this.Core.OnMessage(WixErrors.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Name")); 288 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Name"));
317 } 289 }
318 290
319 //uninstall will always fail silently, leaving file registered, if Language is not set 291 // Uninstall will always fail silently, leaving file registered, if Language is not set
320 if (CompilerConstants.IntegerNotSet == language) 292 if (CompilerConstants.IntegerNotSet == language)
321 { 293 {
322 this.Core.OnMessage(WixErrors.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Language")); 294 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Language"));
323 } 295 }
324 296
325 this.Core.ParseForExtensionElements(node); 297 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
326 298
327 if (!this.Core.EncounteredError) 299 if (!this.Messaging.EncounteredError)
328 { 300 {
329 Row row = this.Core.CreateRow(sourceLineNumbers, "HelpFile"); 301 var row = this.ParseHelper.CreateRow(section, sourceLineNumbers, "HelpFile", id);
330 row[0] = id; 302 row.Set(1, name);
331 row[1] = name; 303 row.Set(2, language);
332 row[2] = language; 304 row.Set(3, fileId);
333 row[3] = fileId; 305 row.Set(4, hxi);
334 row[4] = hxi; 306 row.Set(5, hxq);
335 row[5] = hxq; 307 row.Set(6, hxr);
336 row[6] = hxr; 308 row.Set(7, samples);
337 row[7] = samples;
338 309
339 if (YesNoType.No == suppressCAs) 310 if (YesNoType.No == suppressCAs)
340 { 311 {
341 this.Core.CreateSimpleReference(sourceLineNumbers, "CustomAction", "CA_RegisterMicrosoftHelp.3643236F_FC70_11D3_A536_0090278A1BB8"); 312 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "CustomAction", "CA_RegisterMicrosoftHelp.3643236F_FC70_11D3_A536_0090278A1BB8");
342 } 313 }
343 } 314 }
344 } 315 }
345 316
346 /// <summary> 317 private void ParseHelpFileRefElement(Intermediate intermediate, IntermediateSection section, XElement element, Identifier collectionId)
347 /// Parses a HelpFileRef element.
348 /// </summary>
349 /// <param name="node">Element to process.</param>
350 /// <param name="collectionId">Identifier of the parent help collection.</param>
351 private void ParseHelpFileRefElement(XElement node, string collectionId)
352 { 318 {
353 SourceLineNumber sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node); 319 SourceLineNumber sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
354 string id = null; 320 Identifier id = null;
355 321
356 foreach (XAttribute attrib in node.Attributes()) 322 foreach (XAttribute attrib in element.Attributes())
357 { 323 {
358 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) 324 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
359 { 325 {
360 switch (attrib.Name.LocalName) 326 switch (attrib.Name.LocalName)
361 { 327 {
362 case "Id": 328 case "Id":
363 id = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 329 id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
364 this.Core.CreateSimpleReference(sourceLineNumbers, "HelpFile", id); 330 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "HelpFile", id.Id);
365 break; 331 break;
366 default: 332 default:
367 this.Core.UnexpectedAttribute(node, attrib); 333 this.ParseHelper.UnexpectedAttribute(element, attrib);
368 break; 334 break;
369 } 335 }
370 } 336 }
371 else 337 else
372 { 338 {
373 this.Core.ParseExtensionAttribute(node, attrib); 339 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
374 } 340 }
375 } 341 }
376 342
377 if (null == id) 343 if (null == id)
378 { 344 {
379 this.Core.OnMessage(WixErrors.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Id")); 345 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Id"));
380 } 346 }
381 347
382 this.Core.ParseForExtensionElements(node); 348 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
383 349
384 if (!this.Core.EncounteredError) 350 if (!this.Messaging.EncounteredError)
385 { 351 {
386 Row row = this.Core.CreateRow(sourceLineNumbers, "HelpFileToNamespace"); 352 var row = this.ParseHelper.CreateRow(section, sourceLineNumbers, "HelpFileToNamespace", id);
387 row[0] = id; 353 row.Set(1, collectionId);
388 row[1] = collectionId;
389 } 354 }
390 } 355 }
391 356
392 /// <summary> 357 private void ParseHelpFilterElement(Intermediate intermediate, IntermediateSection section, XElement element)
393 /// Parses a HelpFilter element.
394 /// </summary>
395 /// <param name="node">Element to process.</param>
396 private void ParseHelpFilterElement(XElement node)
397 { 358 {
398 SourceLineNumber sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node); 359 SourceLineNumber sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
399 string id = null; 360 Identifier id = null;
400 string filterDefinition = null; 361 string filterDefinition = null;
401 string name = null; 362 string name = null;
402 YesNoType suppressCAs = YesNoType.No; 363 YesNoType suppressCAs = YesNoType.No;
403 364
404 foreach (XAttribute attrib in node.Attributes()) 365 foreach (XAttribute attrib in element.Attributes())
405 { 366 {
406 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) 367 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
407 { 368 {
408 switch (attrib.Name.LocalName) 369 switch (attrib.Name.LocalName)
409 { 370 {
410 case "Id": 371 case "Id":
411 id = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 372 id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
412 break; 373 break;
413 case "FilterDefinition": 374 case "FilterDefinition":
414 filterDefinition = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 375 filterDefinition = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
415 break; 376 break;
416 case "Name": 377 case "Name":
417 name = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 378 name = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
418 break; 379 break;
419 case "SuppressCustomActions": 380 case "SuppressCustomActions":
420 suppressCAs = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); 381 suppressCAs = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib);
421 break; 382 break;
422 default: 383 default:
423 this.Core.UnexpectedAttribute(node, attrib); 384 this.ParseHelper.UnexpectedAttribute(element, attrib);
424 break; 385 break;
425 } 386 }
426 } 387 }
427 else 388 else
428 { 389 {
429 this.Core.ParseExtensionAttribute(node, attrib); 390 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
430 } 391 }
431 } 392 }
432 393
433 if (null == id) 394 if (null == id)
434 { 395 {
435 this.Core.OnMessage(WixErrors.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Id")); 396 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Id"));
436 } 397 }
437 398
438 if (null == name) 399 if (null == name)
439 { 400 {
440 this.Core.OnMessage(WixErrors.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Name")); 401 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Name"));
441 } 402 }
442 403
443 this.Core.ParseForExtensionElements(node); 404 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
444 405
445 if (!this.Core.EncounteredError) 406 if (!this.Messaging.EncounteredError)
446 { 407 {
447 Row row = this.Core.CreateRow(sourceLineNumbers, "HelpFilter"); 408 var row = this.ParseHelper.CreateRow(section, sourceLineNumbers, "HelpFilter", id);
448 row[0] = id; 409 row.Set(1, name);
449 row[1] = name; 410 row.Set(2, filterDefinition);
450 row[2] = filterDefinition;
451 411
452 if (YesNoType.No == suppressCAs) 412 if (YesNoType.No == suppressCAs)
453 { 413 {
454 this.Core.CreateSimpleReference(sourceLineNumbers, "CustomAction", "CA_RegisterMicrosoftHelp.3643236F_FC70_11D3_A536_0090278A1BB8"); 414 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "CustomAction", "CA_RegisterMicrosoftHelp.3643236F_FC70_11D3_A536_0090278A1BB8");
455 } 415 }
456 } 416 }
457 } 417 }
458 418
459 /// <summary> 419 private void ParseHelpFilterRefElement(Intermediate intermediate, IntermediateSection section, XElement element, Identifier collectionId)
460 /// Parses a HelpFilterRef element.
461 /// </summary>
462 /// <param name="node">Element to process.</param>
463 /// <param name="collectionId">Identifier of the parent help collection.</param>
464 private void ParseHelpFilterRefElement(XElement node, string collectionId)
465 { 420 {
466 SourceLineNumber sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node); 421 SourceLineNumber sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
467 string id = null; 422 Identifier id = null;
468 423
469 foreach (XAttribute attrib in node.Attributes()) 424 foreach (XAttribute attrib in element.Attributes())
470 { 425 {
471 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) 426 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
472 { 427 {
473 switch (attrib.Name.LocalName) 428 switch (attrib.Name.LocalName)
474 { 429 {
475 case "Id": 430 case "Id":
476 id = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 431 id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
477 this.Core.CreateSimpleReference(sourceLineNumbers, "HelpFilter", id); 432 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "HelpFilter", id.Id);
478 break; 433 break;
479 default: 434 default:
480 this.Core.UnexpectedAttribute(node, attrib); 435 this.ParseHelper.UnexpectedAttribute(element, attrib);
481 break; 436 break;
482 } 437 }
483 } 438 }
484 else 439 else
485 { 440 {
486 this.Core.ParseExtensionAttribute(node, attrib); 441 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
487 } 442 }
488 } 443 }
489 444
490 if (null == id) 445 if (null == id)
491 { 446 {
492 this.Core.OnMessage(WixErrors.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Id")); 447 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Id"));
493 } 448 }
494 449
495 this.Core.ParseForExtensionElements(node); 450 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
496 451
497 if (!this.Core.EncounteredError) 452 if (!this.Messaging.EncounteredError)
498 { 453 {
499 Row row = this.Core.CreateRow(sourceLineNumbers, "HelpFilterToNamespace"); 454 var row = this.ParseHelper.CreateRow(section, sourceLineNumbers, "HelpFilterToNamespace", id);
500 row[0] = id; 455 row.Set(1, collectionId.Id);
501 row[1] = collectionId;
502 } 456 }
503 } 457 }
504 458
505 /// <summary> 459 private void ParsePlugCollectionIntoElement(Intermediate intermediate, IntermediateSection section, XElement element, Identifier parentId)
506 /// Parses a PlugCollectionInto element.
507 /// </summary>
508 /// <param name="node">Element to process.</param>
509 /// <param name="parentId">Identifier of the parent help collection.</param>
510 private void ParsePlugCollectionIntoElement(XElement node, string parentId)
511 { 460 {
512 SourceLineNumber sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node); 461 SourceLineNumber sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
513 string hxa = null; 462 string hxa = null;
514 string hxt = null; 463 string hxt = null;
515 string hxtParent = null; 464 string hxtParent = null;
@@ -519,38 +468,38 @@ namespace WixToolset.Extensions
519 bool pluginVS05 = false; 468 bool pluginVS05 = false;
520 bool pluginVS08 = false; 469 bool pluginVS08 = false;
521 470
522 foreach (XAttribute attrib in node.Attributes()) 471 foreach (XAttribute attrib in element.Attributes())
523 { 472 {
524 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) 473 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
525 { 474 {
526 switch (attrib.Name.LocalName) 475 switch (attrib.Name.LocalName)
527 { 476 {
528 case "Attributes": 477 case "Attributes":
529 hxa = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 478 hxa = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
530 break; 479 break;
531 case "TableOfContents": 480 case "TableOfContents":
532 hxt = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 481 hxt = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
533 break; 482 break;
534 case "TargetCollection": 483 case "TargetCollection":
535 namespaceParent = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 484 namespaceParent = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
536 break; 485 break;
537 case "TargetTableOfContents": 486 case "TargetTableOfContents":
538 hxtParent = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 487 hxtParent = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
539 break; 488 break;
540 case "TargetFeature": 489 case "TargetFeature":
541 feature = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 490 feature = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
542 break; 491 break;
543 case "SuppressExternalNamespaces": 492 case "SuppressExternalNamespaces":
544 suppressExternalNamespaces = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); 493 suppressExternalNamespaces = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib);
545 break; 494 break;
546 default: 495 default:
547 this.Core.UnexpectedAttribute(node, attrib); 496 this.ParseHelper.UnexpectedAttribute(element, attrib);
548 break; 497 break;
549 } 498 }
550 } 499 }
551 else 500 else
552 { 501 {
553 this.Core.ParseExtensionAttribute(node, attrib); 502 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
554 } 503 }
555 } 504 }
556 505
@@ -559,35 +508,33 @@ namespace WixToolset.Extensions
559 508
560 if (null == namespaceParent) 509 if (null == namespaceParent)
561 { 510 {
562 this.Core.OnMessage(WixErrors.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "TargetCollection")); 511 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "TargetCollection"));
563 } 512 }
564 513
565 if (null == feature && (pluginVS05 || pluginVS08) && YesNoType.No == suppressExternalNamespaces) 514 if (null == feature && (pluginVS05 || pluginVS08) && YesNoType.No == suppressExternalNamespaces)
566 { 515 {
567 this.Core.OnMessage(WixErrors.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "TargetFeature")); 516 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "TargetFeature"));
568 } 517 }
569 518
570 this.Core.ParseForExtensionElements(node); 519 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
571 520
572 if (!this.Core.EncounteredError) 521 if (!this.Messaging.EncounteredError)
573 { 522 {
574 Row row = this.Core.CreateRow(sourceLineNumbers, "HelpPlugin"); 523 var row = this.ParseHelper.CreateRow(section, sourceLineNumbers, "HelpPlugin", parentId);
575 row[0] = parentId; 524 row.Set(1, namespaceParent);
576 row[1] = namespaceParent; 525 row.Set(2, hxt);
577 row[2] = hxt; 526 row.Set(3, hxa);
578 row[3] = hxa; 527 row.Set(4, hxtParent);
579 row[4] = hxtParent;
580 528
581 if (pluginVS05) 529 if (pluginVS05)
582 { 530 {
583 if (YesNoType.No == suppressExternalNamespaces) 531 if (YesNoType.No == suppressExternalNamespaces)
584 { 532 {
585 // Bring in the help 2 base namespace components for VS 2005 533 // Bring in the help 2 base namespace components for VS 2005
586 this.Core.CreateComplexReference(sourceLineNumbers, ComplexReferenceParentType.Feature, feature, String.Empty, 534 this.ParseHelper.CreateComplexReference(section, sourceLineNumbers, ComplexReferenceParentType.Feature, feature, String.Empty,
587 ComplexReferenceChildType.ComponentGroup, "Help2_VS2005_Namespace_Components", false); 535 ComplexReferenceChildType.ComponentGroup, "Help2_VS2005_Namespace_Components", false);
588 // Reference CustomAction since nothing will happen without it 536 // Reference CustomAction since nothing will happen without it
589 this.Core.CreateSimpleReference(sourceLineNumbers, "CustomAction", 537 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "CustomAction", "CA_HxMerge_VSIPCC_VSCC");
590 "CA_HxMerge_VSIPCC_VSCC");
591 } 538 }
592 } 539 }
593 else if (pluginVS08) 540 else if (pluginVS08)
@@ -595,31 +542,23 @@ namespace WixToolset.Extensions
595 if (YesNoType.No == suppressExternalNamespaces) 542 if (YesNoType.No == suppressExternalNamespaces)
596 { 543 {
597 // Bring in the help 2 base namespace components for VS 2008 544 // Bring in the help 2 base namespace components for VS 2008
598 this.Core.CreateComplexReference(sourceLineNumbers, ComplexReferenceParentType.Feature, feature, String.Empty, 545 this.ParseHelper.CreateComplexReference(section, sourceLineNumbers, ComplexReferenceParentType.Feature, feature, String.Empty,
599 ComplexReferenceChildType.ComponentGroup, "Help2_VS2008_Namespace_Components", false); 546 ComplexReferenceChildType.ComponentGroup, "Help2_VS2008_Namespace_Components", false);
600 // Reference CustomAction since nothing will happen without it 547 // Reference CustomAction since nothing will happen without it
601 this.Core.CreateSimpleReference(sourceLineNumbers, "CustomAction", 548 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "CustomAction", "CA_ScheduleExtHelpPlugin_VSCC_VSIPCC");
602 "CA_ScheduleExtHelpPlugin_VSCC_VSIPCC");
603 } 549 }
604 } 550 }
605 else 551 else
606 { 552 {
607 // Reference the parent namespace to enforce the foreign key relationship 553 // Reference the parent namespace to enforce the foreign key relationship
608 this.Core.CreateSimpleReference(sourceLineNumbers, "HelpNamespace", 554 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "HelpNamespace", namespaceParent);
609 namespaceParent);
610 } 555 }
611 } 556 }
612 } 557 }
613 558
614 /// <summary> 559 private void ParseVsixPackageElement(Intermediate intermediate, IntermediateSection section, XElement element, string componentId, string fileId)
615 /// Parses a VsixPackage element.
616 /// </summary>
617 /// <param name="node">Element to process.</param>
618 /// <param name="componentId">Identifier of the parent Component element.</param>
619 /// <param name="fileId">Identifier of the parent File element.</param>
620 private void ParseVsixPackageElement(XElement node, string componentId, string fileId)
621 { 560 {
622 SourceLineNumber sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node); 561 SourceLineNumber sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
623 string propertyId = "VS_VSIX_INSTALLER_PATH"; 562 string propertyId = "VS_VSIX_INSTALLER_PATH";
624 string packageId = null; 563 string packageId = null;
625 YesNoType permanent = YesNoType.NotSet; 564 YesNoType permanent = YesNoType.NotSet;
@@ -627,7 +566,7 @@ namespace WixToolset.Extensions
627 string targetVersion = null; 566 string targetVersion = null;
628 YesNoType vital = YesNoType.NotSet; 567 YesNoType vital = YesNoType.NotSet;
629 568
630 foreach (XAttribute attrib in node.Attributes()) 569 foreach (XAttribute attrib in element.Attributes())
631 { 570 {
632 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) 571 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
633 { 572 {
@@ -636,21 +575,21 @@ namespace WixToolset.Extensions
636 case "File": 575 case "File":
637 if (String.IsNullOrEmpty(fileId)) 576 if (String.IsNullOrEmpty(fileId))
638 { 577 {
639 fileId = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 578 fileId = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
640 } 579 }
641 else 580 else
642 { 581 {
643 this.Core.OnMessage(WixErrors.IllegalAttributeWhenNested(sourceLineNumbers, node.Name.LocalName, "File", "File")); 582 this.Messaging.Write(ErrorMessages.IllegalAttributeWhenNested(sourceLineNumbers, element.Name.LocalName, "File", "File"));
644 } 583 }
645 break; 584 break;
646 case "PackageId": 585 case "PackageId":
647 packageId = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 586 packageId = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
648 break; 587 break;
649 case "Permanent": 588 case "Permanent":
650 permanent = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); 589 permanent = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib);
651 break; 590 break;
652 case "Target": 591 case "Target":
653 target = this.Core.GetAttributeValue(sourceLineNumbers, attrib); 592 target = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
654 switch (target.ToLowerInvariant()) 593 switch (target.ToLowerInvariant())
655 { 594 {
656 case "integrated": 595 case "integrated":
@@ -681,53 +620,53 @@ namespace WixToolset.Extensions
681 } 620 }
682 break; 621 break;
683 case "TargetVersion": 622 case "TargetVersion":
684 targetVersion = this.Core.GetAttributeVersionValue(sourceLineNumbers, attrib); 623 targetVersion = this.ParseHelper.GetAttributeVersionValue(sourceLineNumbers, attrib);
685 break; 624 break;
686 case "Vital": 625 case "Vital":
687 vital = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); 626 vital = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib);
688 break; 627 break;
689 case "VsixInstallerPathProperty": 628 case "VsixInstallerPathProperty":
690 propertyId = this.Core.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 629 propertyId = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
691 break; 630 break;
692 default: 631 default:
693 this.Core.UnexpectedAttribute(node, attrib); 632 this.ParseHelper.UnexpectedAttribute(element, attrib);
694 break; 633 break;
695 } 634 }
696 } 635 }
697 else 636 else
698 { 637 {
699 this.Core.ParseExtensionAttribute(node, attrib); 638 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
700 } 639 }
701 } 640 }
702 641
703 if (String.IsNullOrEmpty(fileId)) 642 if (String.IsNullOrEmpty(fileId))
704 { 643 {
705 this.Core.OnMessage(WixErrors.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "File")); 644 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "File"));
706 } 645 }
707 646
708 if (String.IsNullOrEmpty(packageId)) 647 if (String.IsNullOrEmpty(packageId))
709 { 648 {
710 this.Core.OnMessage(WixErrors.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "PackageId")); 649 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "PackageId"));
711 } 650 }
712 651
713 if (!String.IsNullOrEmpty(target) && String.IsNullOrEmpty(targetVersion)) 652 if (!String.IsNullOrEmpty(target) && String.IsNullOrEmpty(targetVersion))
714 { 653 {
715 this.Core.OnMessage(WixErrors.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "TargetVersion", "Target")); 654 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "TargetVersion", "Target"));
716 } 655 }
717 else if (String.IsNullOrEmpty(target) && !String.IsNullOrEmpty(targetVersion)) 656 else if (String.IsNullOrEmpty(target) && !String.IsNullOrEmpty(targetVersion))
718 { 657 {
719 this.Core.OnMessage(WixErrors.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Target", "TargetVersion")); 658 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Target", "TargetVersion"));
720 } 659 }
721 660
722 this.Core.ParseForExtensionElements(node); 661 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
723 662
724 if (!this.Core.EncounteredError) 663 if (!this.Messaging.EncounteredError)
725 { 664 {
726 // Ensure there is a reference to the AppSearch Property that will find the VsixInstaller.exe. 665 // Ensure there is a reference to the AppSearch Property that will find the VsixInstaller.exe.
727 this.Core.CreateSimpleReference(sourceLineNumbers, "Property", propertyId); 666 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "Property", propertyId);
728 667
729 // Ensure there is a reference to the package file (even if we are a child under it). 668 // Ensure there is a reference to the package file (even if we are a child under it).
730 this.Core.CreateSimpleReference(sourceLineNumbers, "File", fileId); 669 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "File", fileId);
731 670
732 string cmdlinePrefix = "/q "; 671 string cmdlinePrefix = "/q ";
733 672
@@ -746,8 +685,8 @@ namespace WixToolset.Extensions
746 } 685 }
747 else // the package is vital so ensure there is a rollback action scheduled. 686 else // the package is vital so ensure there is a rollback action scheduled.
748 { 687 {
749 Identifier rollbackNamePerUser = this.Core.CreateIdentifier("vru", componentId, fileId, "per-user", target ?? String.Empty, targetVersion ?? String.Empty); 688 Identifier rollbackNamePerUser = this.ParseHelper.CreateIdentifier("vru", componentId, fileId, "per-user", target ?? String.Empty, targetVersion ?? String.Empty);
750 Identifier rollbackNamePerMachine = this.Core.CreateIdentifier("vrm", componentId, fileId, "per-machine", target ?? String.Empty, targetVersion ?? String.Empty); 689 Identifier rollbackNamePerMachine = this.ParseHelper.CreateIdentifier("vrm", componentId, fileId, "per-machine", target ?? String.Empty, targetVersion ?? String.Empty);
751 string rollbackCmdLinePerUser = String.Concat(cmdlinePrefix, " /u:\"", packageId, "\""); 690 string rollbackCmdLinePerUser = String.Concat(cmdlinePrefix, " /u:\"", packageId, "\"");
752 string rollbackCmdLinePerMachine = String.Concat(rollbackCmdLinePerUser, " /admin"); 691 string rollbackCmdLinePerMachine = String.Concat(rollbackCmdLinePerUser, " /admin");
753 int rollbackExtraBitsPerUser = VSCompiler.MsidbCustomActionTypeContinue | VSCompiler.MsidbCustomActionTypeRollback | VSCompiler.MsidbCustomActionTypeInScript; 692 int rollbackExtraBitsPerUser = VSCompiler.MsidbCustomActionTypeContinue | VSCompiler.MsidbCustomActionTypeRollback | VSCompiler.MsidbCustomActionTypeInScript;
@@ -755,27 +694,27 @@ namespace WixToolset.Extensions
755 string rollbackConditionPerUser = String.Format("NOT ALLUSERS AND NOT Installed AND ${0}=2 AND ?{0}>2", componentId); // NOT Installed && Component being installed but not installed already. 694 string rollbackConditionPerUser = String.Format("NOT ALLUSERS AND NOT Installed AND ${0}=2 AND ?{0}>2", componentId); // NOT Installed && Component being installed but not installed already.
756 string rollbackConditionPerMachine = String.Format("ALLUSERS AND NOT Installed AND ${0}=2 AND ?{0}>2", componentId); // NOT Installed && Component being installed but not installed already. 695 string rollbackConditionPerMachine = String.Format("ALLUSERS AND NOT Installed AND ${0}=2 AND ?{0}>2", componentId); // NOT Installed && Component being installed but not installed already.
757 696
758 this.SchedulePropertyExeAction(sourceLineNumbers, rollbackNamePerUser, propertyId, rollbackCmdLinePerUser, rollbackExtraBitsPerUser, rollbackConditionPerUser, null, installAfter); 697 this.SchedulePropertyExeAction(section, sourceLineNumbers, rollbackNamePerUser, propertyId, rollbackCmdLinePerUser, rollbackExtraBitsPerUser, rollbackConditionPerUser, null, installAfter);
759 this.SchedulePropertyExeAction(sourceLineNumbers, rollbackNamePerMachine, propertyId, rollbackCmdLinePerMachine, rollbackExtraBitsPerMachine, rollbackConditionPerMachine, null, rollbackNamePerUser.Id); 698 this.SchedulePropertyExeAction(section, sourceLineNumbers, rollbackNamePerMachine, propertyId, rollbackCmdLinePerMachine, rollbackExtraBitsPerMachine, rollbackConditionPerMachine, null, rollbackNamePerUser.Id);
760 699
761 installAfter = rollbackNamePerMachine.Id; 700 installAfter = rollbackNamePerMachine.Id;
762 } 701 }
763 702
764 Identifier installNamePerUser = this.Core.CreateIdentifier("viu", componentId, fileId, "per-user", target ?? String.Empty, targetVersion ?? String.Empty); 703 Identifier installNamePerUser = this.ParseHelper.CreateIdentifier("viu", componentId, fileId, "per-user", target ?? String.Empty, targetVersion ?? String.Empty);
765 Identifier installNamePerMachine = this.Core.CreateIdentifier("vim", componentId, fileId, "per-machine", target ?? String.Empty, targetVersion ?? String.Empty); 704 Identifier installNamePerMachine = this.ParseHelper.CreateIdentifier("vim", componentId, fileId, "per-machine", target ?? String.Empty, targetVersion ?? String.Empty);
766 string installCmdLinePerUser = String.Format("{0} \"[#{1}]\"", cmdlinePrefix, fileId); 705 string installCmdLinePerUser = String.Format("{0} \"[#{1}]\"", cmdlinePrefix, fileId);
767 string installCmdLinePerMachine = String.Concat(installCmdLinePerUser, " /admin"); 706 string installCmdLinePerMachine = String.Concat(installCmdLinePerUser, " /admin");
768 string installConditionPerUser = String.Format("NOT ALLUSERS AND ${0}=3", componentId); // only execute if the Component being installed. 707 string installConditionPerUser = String.Format("NOT ALLUSERS AND ${0}=3", componentId); // only execute if the Component being installed.
769 string installConditionPerMachine = String.Format("ALLUSERS AND ${0}=3", componentId); // only execute if the Component being installed. 708 string installConditionPerMachine = String.Format("ALLUSERS AND ${0}=3", componentId); // only execute if the Component being installed.
770 709
771 this.SchedulePropertyExeAction(sourceLineNumbers, installNamePerUser, propertyId, installCmdLinePerUser, installExtraBits, installConditionPerUser, null, installAfter); 710 this.SchedulePropertyExeAction(section, sourceLineNumbers, installNamePerUser, propertyId, installCmdLinePerUser, installExtraBits, installConditionPerUser, null, installAfter);
772 this.SchedulePropertyExeAction(sourceLineNumbers, installNamePerMachine, propertyId, installCmdLinePerMachine, installExtraBits | VSCompiler.MsidbCustomActionTypeNoImpersonate, installConditionPerMachine, null, installNamePerUser.Id); 711 this.SchedulePropertyExeAction(section, sourceLineNumbers, installNamePerMachine, propertyId, installCmdLinePerMachine, installExtraBits | VSCompiler.MsidbCustomActionTypeNoImpersonate, installConditionPerMachine, null, installNamePerUser.Id);
773 712
774 // If not permanent, schedule the uninstall custom action. 713 // If not permanent, schedule the uninstall custom action.
775 if (permanent != YesNoType.Yes) 714 if (permanent != YesNoType.Yes)
776 { 715 {
777 Identifier uninstallNamePerUser = this.Core.CreateIdentifier("vuu", componentId, fileId, "per-user", target ?? String.Empty, targetVersion ?? String.Empty); 716 Identifier uninstallNamePerUser = this.ParseHelper.CreateIdentifier("vuu", componentId, fileId, "per-user", target ?? String.Empty, targetVersion ?? String.Empty);
778 Identifier uninstallNamePerMachine = this.Core.CreateIdentifier("vum", componentId, fileId, "per-machine", target ?? String.Empty, targetVersion ?? String.Empty); 717 Identifier uninstallNamePerMachine = this.ParseHelper.CreateIdentifier("vum", componentId, fileId, "per-machine", target ?? String.Empty, targetVersion ?? String.Empty);
779 string uninstallCmdLinePerUser = String.Concat(cmdlinePrefix, " /u:\"", packageId, "\""); 718 string uninstallCmdLinePerUser = String.Concat(cmdlinePrefix, " /u:\"", packageId, "\"");
780 string uninstallCmdLinePerMachine = String.Concat(uninstallCmdLinePerUser, " /admin"); 719 string uninstallCmdLinePerMachine = String.Concat(uninstallCmdLinePerUser, " /admin");
781 int uninstallExtraBitsPerUser = VSCompiler.MsidbCustomActionTypeContinue | VSCompiler.MsidbCustomActionTypeInScript; 720 int uninstallExtraBitsPerUser = VSCompiler.MsidbCustomActionTypeContinue | VSCompiler.MsidbCustomActionTypeInScript;
@@ -783,39 +722,39 @@ namespace WixToolset.Extensions
783 string uninstallConditionPerUser = String.Format("NOT ALLUSERS AND ${0}=2 AND ?{0}>2", componentId); // Only execute if component is being uninstalled. 722 string uninstallConditionPerUser = String.Format("NOT ALLUSERS AND ${0}=2 AND ?{0}>2", componentId); // Only execute if component is being uninstalled.
784 string uninstallConditionPerMachine = String.Format("ALLUSERS AND ${0}=2 AND ?{0}>2", componentId); // Only execute if component is being uninstalled. 723 string uninstallConditionPerMachine = String.Format("ALLUSERS AND ${0}=2 AND ?{0}>2", componentId); // Only execute if component is being uninstalled.
785 724
786 this.SchedulePropertyExeAction(sourceLineNumbers, uninstallNamePerUser, propertyId, uninstallCmdLinePerUser, uninstallExtraBitsPerUser, uninstallConditionPerUser, "InstallFinalize", null); 725 this.SchedulePropertyExeAction(section, sourceLineNumbers, uninstallNamePerUser, propertyId, uninstallCmdLinePerUser, uninstallExtraBitsPerUser, uninstallConditionPerUser, "InstallFinalize", null);
787 this.SchedulePropertyExeAction(sourceLineNumbers, uninstallNamePerMachine, propertyId, uninstallCmdLinePerMachine, uninstallExtraBitsPerMachine, uninstallConditionPerMachine, "InstallFinalize", null); 726 this.SchedulePropertyExeAction(section, sourceLineNumbers, uninstallNamePerMachine, propertyId, uninstallCmdLinePerMachine, uninstallExtraBitsPerMachine, uninstallConditionPerMachine, "InstallFinalize", null);
788 } 727 }
789 } 728 }
790 } 729 }
791 730
792 private void SchedulePropertyExeAction(SourceLineNumber sourceLineNumbers, Identifier name, string source, string cmdline, int extraBits, string condition, string beforeAction, string afterAction) 731 private void SchedulePropertyExeAction(IntermediateSection section, SourceLineNumber sourceLineNumbers, Identifier name, string source, string cmdline, int extraBits, string condition, string beforeAction, string afterAction)
793 { 732 {
794 const string sequence = "InstallExecuteSequence"; 733 const string sequence = "InstallExecuteSequence";
795 734
796 Row actionRow = this.Core.CreateRow(sourceLineNumbers, "CustomAction", name); 735 var actionRow = this.ParseHelper.CreateRow(section, sourceLineNumbers, "CustomAction", name);
797 actionRow[1] = VSCompiler.MsidbCustomActionTypeProperty | VSCompiler.MsidbCustomActionTypeExe | extraBits; 736 actionRow.Set(1, VSCompiler.MsidbCustomActionTypeProperty | VSCompiler.MsidbCustomActionTypeExe | extraBits);
798 actionRow[2] = source; 737 actionRow.Set(2, source);
799 actionRow[3] = cmdline; 738 actionRow.Set(3, cmdline);
800 739
801 Row sequenceRow = this.Core.CreateRow(sourceLineNumbers, "WixAction"); 740 var sequenceRow = this.ParseHelper.CreateRow(section, sourceLineNumbers, "WixAction", new Identifier(name.Access, sequence, name.Id));
802 sequenceRow[0] = sequence; 741 sequenceRow.Set(0, sequence);
803 sequenceRow[1] = name.Id; 742 sequenceRow.Set(1, name.Id);
804 sequenceRow[2] = condition; 743 sequenceRow.Set(2, condition);
805 // no explicit sequence 744 // no explicit sequence
806 sequenceRow[4] = beforeAction; 745 sequenceRow.Set(4, beforeAction);
807 sequenceRow[5] = afterAction; 746 sequenceRow.Set(5, afterAction);
808 sequenceRow[6] = 0; // not overridable 747 sequenceRow.Set(6, 0); // not overridable
809 748
810 if (null != beforeAction) 749 if (null != beforeAction)
811 { 750 {
812 if (WindowsInstallerStandard.IsStandardAction(beforeAction)) 751 if (WindowsInstallerStandard.IsStandardAction(beforeAction))
813 { 752 {
814 this.Core.CreateSimpleReference(sourceLineNumbers, "WixAction", sequence, beforeAction); 753 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "WixAction", sequence, beforeAction);
815 } 754 }
816 else 755 else
817 { 756 {
818 this.Core.CreateSimpleReference(sourceLineNumbers, "CustomAction", beforeAction); 757 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "CustomAction", beforeAction);
819 } 758 }
820 } 759 }
821 760
@@ -823,11 +762,11 @@ namespace WixToolset.Extensions
823 { 762 {
824 if (WindowsInstallerStandard.IsStandardAction(afterAction)) 763 if (WindowsInstallerStandard.IsStandardAction(afterAction))
825 { 764 {
826 this.Core.CreateSimpleReference(sourceLineNumbers, "WixAction", sequence, afterAction); 765 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "WixAction", sequence, afterAction);
827 } 766 }
828 else 767 else
829 { 768 {
830 this.Core.CreateSimpleReference(sourceLineNumbers, "CustomAction", afterAction); 769 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "CustomAction", afterAction);
831 } 770 }
832 } 771 }
833 } 772 }
diff --git a/src/wixext/VSDecompiler.cs b/src/wixext/VSDecompiler.cs
index bfa0670c..08dc364a 100644
--- a/src/wixext/VSDecompiler.cs
+++ b/src/wixext/VSDecompiler.cs
@@ -1,7 +1,8 @@
1// 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. 1// 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.
2 2
3namespace WixToolset.Extensions 3namespace WixToolset.VisualStudio
4{ 4{
5#if TODO_CONSIDER_DECOMPILER
5 using System; 6 using System;
6 using System.Collections; 7 using System.Collections;
7 using System.Diagnostics; 8 using System.Diagnostics;
@@ -104,7 +105,7 @@ namespace WixToolset.Extensions
104 { 105 {
105 helpFile.SampleLocation = (string)row[7]; 106 helpFile.SampleLocation = (string)row[7];
106 } 107 }
107 108
108 if (this.Core.RootElement is Wix.Module) 109 if (this.Core.RootElement is Wix.Module)
109 { 110 {
110 helpFile.SuppressCustomActions = VS.YesNoType.yes; 111 helpFile.SuppressCustomActions = VS.YesNoType.yes;
@@ -270,7 +271,7 @@ namespace WixToolset.Extensions
270 271
271 //we cannot do this work because we cannot get the FeatureComponent table 272 //we cannot do this work because we cannot get the FeatureComponent table
272 //plugCollectionInto.TargetFeature = DecompileHelpComponents(); 273 //plugCollectionInto.TargetFeature = DecompileHelpComponents();
273 274
274 VS.HelpCollection helpCollection = (VS.HelpCollection)this.Core.GetIndexedElement("HelpNamespace", (string)row[0]); 275 VS.HelpCollection helpCollection = (VS.HelpCollection)this.Core.GetIndexedElement("HelpNamespace", (string)row[0]);
275 if (null != helpCollection) 276 if (null != helpCollection)
276 { 277 {
@@ -293,4 +294,5 @@ namespace WixToolset.Extensions
293 // return String.Empty; 294 // return String.Empty;
294 //} 295 //}
295 } 296 }
297#endif
296} 298}
diff --git a/src/wixext/VSExtensionData.cs b/src/wixext/VSExtensionData.cs
index edb1fd42..bc846af0 100644
--- a/src/wixext/VSExtensionData.cs
+++ b/src/wixext/VSExtensionData.cs
@@ -1,55 +1,15 @@
1// 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. 1// 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.
2 2
3namespace WixToolset.Extensions 3namespace WixToolset.VisualStudio
4{ 4{
5 using System;
6 using System.Reflection;
7 using WixToolset.Data; 5 using WixToolset.Data;
8 using WixToolset.Extensibility; 6 using WixToolset.Extensibility;
9 7
10 /// <summary> 8 public sealed class VSExtensionData : BaseExtensionData
11 /// The WiX Toolset Visual Studio Extension.
12 /// </summary>
13 public sealed class VSExtensionData : ExtensionData
14 { 9 {
15 /// <summary> 10 public override Intermediate GetLibrary(ITupleDefinitionCreator tupleDefinitions)
16 /// Gets the optional table definitions for this extension.
17 /// </summary>
18 /// <value>The optional table definitions for this extension.</value>
19 public override TableDefinitionCollection TableDefinitions
20 { 11 {
21 get 12 return Intermediate.Load(typeof(VSExtensionData).Assembly, "WixToolset.VisualStudio.vs.wixlib", tupleDefinitions);
22 {
23 return VSExtensionData.GetExtensionTableDefinitions();
24 }
25 }
26
27 /// <summary>
28 /// Gets the library associated with this extension.
29 /// </summary>
30 /// <param name="tableDefinitions">The table definitions to use while loading the library.</param>
31 /// <returns>The loaded library.</returns>
32 public override Library GetLibrary(TableDefinitionCollection tableDefinitions)
33 {
34 return VSExtensionData.GetExtensionLibrary(tableDefinitions);
35 }
36
37 /// <summary>
38 /// Internal mechanism to access the extension's table definitions.
39 /// </summary>
40 /// <returns>Extension's table definitions.</returns>
41 internal static TableDefinitionCollection GetExtensionTableDefinitions()
42 {
43 return ExtensionData.LoadTableDefinitionHelper(Assembly.GetExecutingAssembly(), "WixToolset.Extensions.Data.tables.xml");
44 }
45
46 /// <summary>
47 /// Internal mechanism to access the extension's library.
48 /// </summary>
49 /// <returns>Extension's library.</returns>
50 internal static Library GetExtensionLibrary(TableDefinitionCollection tableDefinitions)
51 {
52 return ExtensionData.LoadLibraryHelper(Assembly.GetExecutingAssembly(), "WixToolset.Extensions.Data.vs.wixlib", tableDefinitions);
53 } 13 }
54 } 14 }
55} 15}
diff --git a/src/wixext/VSExtensionFactory.cs b/src/wixext/VSExtensionFactory.cs
new file mode 100644
index 00000000..650cbe04
--- /dev/null
+++ b/src/wixext/VSExtensionFactory.cs
@@ -0,0 +1,18 @@
1// 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.
2
3namespace WixToolset.VisualStudio
4{
5 using System;
6 using System.Collections.Generic;
7 using WixToolset.Extensibility;
8
9 public class VSExtensionFactory : BaseExtensionFactory
10 {
11 protected override IEnumerable<Type> ExtensionTypes => new[]
12 {
13 typeof(VSCompiler),
14 typeof(VSExtensionData),
15 typeof(VSWindowsInstallerBackendExtension),
16 };
17 }
18}
diff --git a/src/wixext/VSWindowsInstallerBackendExtension.cs b/src/wixext/VSWindowsInstallerBackendExtension.cs
new file mode 100644
index 00000000..16ed008a
--- /dev/null
+++ b/src/wixext/VSWindowsInstallerBackendExtension.cs
@@ -0,0 +1,75 @@
1// 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.
2
3namespace WixToolset.VisualStudio
4{
5 using WixToolset.Data.WindowsInstaller;
6 using WixToolset.Extensibility;
7
8 public class VSWindowsInstallerBackendExtension : BaseWindowsInstallerBackendExtension
9 {
10 private static readonly TableDefinition[] Tables = new[] {
11 new TableDefinition(
12 "HelpFile",
13 new[]
14 {
15 new ColumnDefinition("HelpFileKey", ColumnType.String, 72, true, false, ColumnCategory.Identifier, description: "Primary Key for HelpFile Table (required)."),
16 new ColumnDefinition("HelpFileName", ColumnType.String, 0, false, false, ColumnCategory.Text, description: "Internal Microsoft Help ID for this HelpFile (required)."),
17 new ColumnDefinition("LangID", ColumnType.Number, 2, false, true, ColumnCategory.Language, description: "Language ID for content file (optional)."),
18 new ColumnDefinition("File_HxS", ColumnType.String, 72, false, true, ColumnCategory.Identifier, keyTable:"File", keyColumn: 1, description: "Key for HxS (Title) file (required)."),
19 new ColumnDefinition("File_HxI", ColumnType.String, 72, false, true, ColumnCategory.Identifier, keyTable:"File", keyColumn: 1, description: "Key for HxI (Index) file (required)."),
20 new ColumnDefinition("File_HxQ", ColumnType.String, 72, false, true, ColumnCategory.Identifier, keyTable:"File", keyColumn: 1, description: "Key for HxQ (Query) file (required)."),
21 new ColumnDefinition("File_HxR", ColumnType.String, 72, false, true, ColumnCategory.Identifier, keyTable:"File", keyColumn: 1, description: "Key for HxR (Attributes) file (required)."),
22 new ColumnDefinition("File_Samples", ColumnType.String, 72, false, 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)."),
23 }
24 ),
25 new TableDefinition(
26 "HelpFileToNamespace",
27 new[]
28 {
29 new ColumnDefinition("HelpFile_", ColumnType.String, 72, true, false, ColumnCategory.Identifier, keyTable: "HelpFile", keyColumn: 1, description: "Foreign key into HelpFile table (required)."),
30 new ColumnDefinition("HelpNamespace_", ColumnType.String, 72, true, false, ColumnCategory.Identifier, keyTable: "HelpNamespace", keyColumn: 1, description: "Foreign key into HelpNamespace table (required)."),
31 }
32 ),
33 new TableDefinition(
34 "HelpFilter",
35 new[]
36 {
37 new ColumnDefinition("FilterKey", ColumnType.String, 72, true, false, ColumnCategory.Identifier, description: "Primary Key for HelpFilter (required)."),
38 new ColumnDefinition("Description", ColumnType.Localized, 0, false, false, ColumnCategory.Text, description: "Friendly name for Filter (required)."),
39 new ColumnDefinition("QueryString", ColumnType.String, 0, false, true, ColumnCategory.Text, description: "Query String for Help Filter (optional)."),
40 }
41 ),
42 new TableDefinition(
43 "HelpFilterToNamespace",
44 new[]
45 {
46 new ColumnDefinition("HelpFilter_", ColumnType.String, 72, true, false, ColumnCategory.Identifier, keyTable: "HelpFilter", keyColumn: 1, description: "Foreign key into HelpFilter table (required)."),
47 new ColumnDefinition("HelpNamespace_", ColumnType.String, 72, true, false, ColumnCategory.Identifier, keyTable: "HelpNamespace", keyColumn: 1, description: "Foreign key into HelpNamespace table (required)."),
48 }
49 ),
50 new TableDefinition(
51 "HelpNamespace",
52 new[]
53 {
54 new ColumnDefinition("NamespaceKey", ColumnType.String, 72, true, false, ColumnCategory.Identifier, description: "Primary Key for HelpNamespace (required)."),
55 new ColumnDefinition("NamespaceName", ColumnType.String, 0, false, false, ColumnCategory.Text, description: "Internal Microsoft Help ID for this Namespace (required)."),
56 new ColumnDefinition("File_Collection", ColumnType.String, 72, false, false, ColumnCategory.Identifier, keyTable:"File", keyColumn: 1, description: "Key for HxC (Collection) file (required)."),
57 new ColumnDefinition("Description", ColumnType.Localized, 0, false, true, ColumnCategory.Text, description: "Friendly name for Namespace (optional)."),
58 }
59 ),
60 new TableDefinition(
61 "HelpPlugin",
62 new[]
63 {
64 new ColumnDefinition("HelpNamespace_", ColumnType.String, 72, true, 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)."),
65 new ColumnDefinition("HelpNamespace_Parent", ColumnType.String, 72, true, 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)."),
66 new ColumnDefinition("File_HxT", ColumnType.String, 72, false, true, ColumnCategory.Identifier, keyTable:"File", keyColumn: 1, description: "Key for HxT file of child namespace (optional)."),
67 new ColumnDefinition("File_HxA", ColumnType.String, 72, false, true, ColumnCategory.Identifier, keyTable:"File", keyColumn: 1, description: "Key for HxA (Attributes) file of child namespace (optional)."),
68 new ColumnDefinition("File_ParentHxT", ColumnType.String, 72, false, true, ColumnCategory.Identifier, keyTable:"File", keyColumn: 1, description: "Key for HxT file of parent namespace that now includes the new child namespace (optional)."),
69 }
70 ),
71 };
72
73 protected override TableDefinition[] TableDefinitionsForTuples => Tables;
74 }
75}
diff --git a/src/wixext/WixToolset.VisualStudio.wixext.csproj b/src/wixext/WixToolset.VisualStudio.wixext.csproj
index 0b092662..e0c4a983 100644
--- a/src/wixext/WixToolset.VisualStudio.wixext.csproj
+++ b/src/wixext/WixToolset.VisualStudio.wixext.csproj
@@ -4,66 +4,29 @@
4<Project Sdk="Microsoft.NET.Sdk"> 4<Project Sdk="Microsoft.NET.Sdk">
5 <PropertyGroup> 5 <PropertyGroup>
6 <TargetFramework>netstandard2.0</TargetFramework> 6 <TargetFramework>netstandard2.0</TargetFramework>
7 <RootNamespace>WixToolset.Extensions</RootNamespace> 7 <RootNamespace>WixToolset.VisualStudio</RootNamespace>
8 <Description>WiX Toolset Visual Studio Extension</Description> 8 <Description>WiX Toolset Visual Studio Extension</Description>
9 <Title>WiX Toolset VS Extension</Title> 9 <Title>WiX Toolset VS Extension</Title>
10 <IsTool>true</IsTool> 10 <IsTool>true</IsTool>
11 <ContentTargetFolders>build</ContentTargetFolders> 11 <ContentTargetFolders>build</ContentTargetFolders>
12 </PropertyGroup> 12 </PropertyGroup>
13 13
14 <PropertyGroup>
15 <NoWarn>NU1701</NoWarn>
16 </PropertyGroup>
17
18 <ItemGroup>
19 <EmbeddedResource Include="Data\tables.xml">
20 <LogicalName>$(RootNamespace).Data.tables.xml</LogicalName>
21 </EmbeddedResource>
22
23 <MsgGenSource Include="Data\messages.xml">
24 <ResourcesLogicalName>$(RootNamespace).Data.Messages.resources</ResourcesLogicalName>
25 </MsgGenSource>
26
27 <EmbeddedResource Include="Xsd\vs.xsd">
28 <LogicalName>$(RootNamespace).Xsd.vs.xsd</LogicalName>
29 <Pack>true</Pack>
30 <PackagePath>tools</PackagePath>
31 </EmbeddedResource>
32
33 <XsdGenSource Include="Xsd\vs.xsd">
34 <CommonNamespace>WixToolset.Data.Serialize</CommonNamespace>
35 <Namespace>WixToolset.Extensions.Serialize.VS</Namespace>
36 </XsdGenSource>
37
38 <EmbeddedResource Include="$(OutputPath)..\vs.wixlib">
39 <Link>Data\vs.wixlib</Link>
40 </EmbeddedResource>
41 </ItemGroup>
42
43 <ItemGroup> 14 <ItemGroup>
44 <Content Include="$(MSBuildThisFileName).targets" /> 15 <Content Include="$(MSBuildThisFileName).targets" />
16 <Content Include="vs.xsd" PackagePath="tools" />
17 <EmbeddedResource Include="$(OutputPath)..\vs.wixlib" />
45 </ItemGroup> 18 </ItemGroup>
46 19
47 <ItemGroup> 20 <ItemGroup>
48 <ProjectReference Include="$(WixToolsetRootFolder)\Data\src\WixToolset.Data\WixToolset.Data.csproj" Condition=" '$(Configuration)' == 'Debug' And Exists('$(WixToolsetRootFolder)\Data\src\WixToolset.Data\WixToolset.Data.csproj') " />
49 <PackageReference Include="WixToolset.Data" Version="4.0.*" Condition=" '$(Configuration)' == 'Release' Or !Exists('$(WixToolsetRootFolder)\Data\src\WixToolset.Data\WixToolset.Data.csproj') " PrivateAssets="all" />
50
51 <ProjectReference Include="$(WixToolsetRootFolder)\Extensibility\src\WixToolset.Extensibility\WixToolset.Extensibility.csproj" Condition=" '$(Configuration)' == 'Debug' And Exists('$(WixToolsetRootFolder)\Extensibility\src\WixToolset.Extensibility\WixToolset.Extensibility.csproj') " /> 21 <ProjectReference Include="$(WixToolsetRootFolder)\Extensibility\src\WixToolset.Extensibility\WixToolset.Extensibility.csproj" Condition=" '$(Configuration)' == 'Debug' And Exists('$(WixToolsetRootFolder)\Extensibility\src\WixToolset.Extensibility\WixToolset.Extensibility.csproj') " />
52 <PackageReference Include="WixToolset.Extensibility" Version="4.0.*" Condition=" '$(Configuration)' == 'Release' Or !Exists('$(WixToolsetRootFolder)\Extensibility\src\WixToolset.Extensibility\WixToolset.Extensibility.csproj') " PrivateAssets="all" /> 22 <PackageReference Include="WixToolset.Extensibility" Version="4.0.*" Condition=" '$(Configuration)' == 'Release' Or !Exists('$(WixToolsetRootFolder)\Extensibility\src\WixToolset.Extensibility\WixToolset.Extensibility.csproj') " PrivateAssets="all" />
53
54 <ProjectReference Include="$(WixToolsetRootFolder)\Core\src\WixToolset.Core\WixToolset.Core.csproj" Condition=" '$(Configuration)' == 'Debug' And Exists('$(WixToolsetRootFolder)\Core\src\WixToolset.Core\WixToolset.Core.csproj') " />
55 <PackageReference Include="WixToolset.Core" Version="4.0.*" Condition=" '$(Configuration)' == 'Release' Or !Exists('$(WixToolsetRootFolder)\Core\src\WixToolset.Core\WixToolset.Core.csproj') " PrivateAssets="all" />
56 </ItemGroup> 23 </ItemGroup>
57 24
58 <ItemGroup> 25 <ItemGroup>
59 <ProjectReference Include="..\wixlib\vs.wixproj"> 26 <ProjectReference Include="..\wixlib\vs.wixproj" ReferenceOutputAssembly="false" />
60 <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
61 </ProjectReference>
62 </ItemGroup> 27 </ItemGroup>
63 28
64 <ItemGroup> 29 <ItemGroup>
65 <PackageReference Include="Nerdbank.GitVersioning" Version="2.0.41" PrivateAssets="all" /> 30 <PackageReference Include="Nerdbank.GitVersioning" Version="2.0.41" PrivateAssets="all" />
66 <PackageReference Include="WixBuildTools.MsgGen" Version="4.0.*" PrivateAssets="all" />
67 <PackageReference Include="WixBuildTools.XsdGen" Version="4.0.*" PrivateAssets="all" />
68 </ItemGroup> 31 </ItemGroup>
69</Project> 32</Project>
diff --git a/src/wixext/xsd/vs.xsd b/src/wixext/vs.xsd
index 51172920..51172920 100644
--- a/src/wixext/xsd/vs.xsd
+++ b/src/wixext/vs.xsd
diff --git a/src/wixlib/packages.config b/src/wixlib/packages.config
index 7120dc24..09c3a290 100644
--- a/src/wixlib/packages.config
+++ b/src/wixlib/packages.config
@@ -1,5 +1,5 @@
1<?xml version="1.0" encoding="utf-8"?> 1<?xml version="1.0" encoding="utf-8"?>
2<packages> 2<packages>
3 <package id="Nerdbank.GitVersioning" version="2.0.41" developmentDependency="true" /> 3 <package id="Nerdbank.GitVersioning" version="2.1.7" developmentDependency="true" targetFramework="net40" />
4 <package id="WixToolset.Core.InternalPackage" version="4.0.15" targetFramework="net40" developmentDependency="true" /> 4 <package id="WixToolset.Core.InternalPackage" version="4.0.57" targetFramework="net40" developmentDependency="true" />
5</packages> \ No newline at end of file 5</packages> \ No newline at end of file
diff --git a/src/wixlib/vs.wixproj b/src/wixlib/vs.wixproj
index 15dd5092..c5613bb4 100644
--- a/src/wixlib/vs.wixproj
+++ b/src/wixlib/vs.wixproj
@@ -1,10 +1,8 @@
1<?xml version="1.0" encoding="utf-8"?> 1<?xml version="1.0" encoding="utf-8"?>
2<!-- 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. --> 2<!-- 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. -->
3
4<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="15.0"> 3<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="15.0">
5 <Import Project="..\..\packages\WixToolset.Core.InternalPackage.4.0.15\build\WixToolset.Core.InternalPackage.props" Condition="Exists('..\..\packages\WixToolset.Core.InternalPackage.4.0.15\build\WixToolset.Core.InternalPackage.props')" /> 4 <Import Project="..\..\packages\WixToolset.Core.InternalPackage.4.0.57\build\WixToolset.Core.InternalPackage.props" Condition="Exists('..\..\packages\WixToolset.Core.InternalPackage.4.0.57\build\WixToolset.Core.InternalPackage.props')" />
6 <Import Project="..\FindLocalWix.props" /> 5 <Import Project="..\FindLocalWix.props" />
7
8 <PropertyGroup> 6 <PropertyGroup>
9 <ProjectGuid>{14345C9D-8AF8-435A-BB1B-E067CE7EB321}</ProjectGuid> 7 <ProjectGuid>{14345C9D-8AF8-435A-BB1B-E067CE7EB321}</ProjectGuid>
10 <OutputName>vs</OutputName> 8 <OutputName>vs</OutputName>
@@ -13,7 +11,6 @@
13 <Pedantic>true</Pedantic> 11 <Pedantic>true</Pedantic>
14 <Cultures>en-us</Cultures> 12 <Cultures>en-us</Cultures>
15 </PropertyGroup> 13 </PropertyGroup>
16
17 <ItemGroup> 14 <ItemGroup>
18 <Compile Include="HTML_Help_Registration__RTL_X86.wxs" /> 15 <Compile Include="HTML_Help_Registration__RTL_X86.wxs" />
19 <Compile Include="Vs2003.wxs" /> 16 <Compile Include="Vs2003.wxs" />
@@ -31,35 +28,30 @@
31 <Compile Include="vs2005\vs2005_VSIPCC_Collection_Files_RTL.wxs" /> 28 <Compile Include="vs2005\vs2005_VSIPCC_Collection_Files_RTL.wxs" />
32 <Compile Include="vs2008\vs2008_VSIPCC_Collection_Files_RTL.wxs" /> 29 <Compile Include="vs2008\vs2008_VSIPCC_Collection_Files_RTL.wxs" />
33 </ItemGroup> 30 </ItemGroup>
34
35 <ItemGroup> 31 <ItemGroup>
36 <Folder Include="vs2005\" /> 32 <Folder Include="vs2005\" />
37 <Folder Include="vs2008\" /> 33 <Folder Include="vs2008\" />
38 </ItemGroup> 34 </ItemGroup>
39
40 <ItemGroup> 35 <ItemGroup>
41 <None Include="packages.config" /> 36 <None Include="packages.config" />
42 </ItemGroup> 37 </ItemGroup>
43
44 <ItemGroup> 38 <ItemGroup>
45 <ProjectReference Include="..\ca\vsca.vcxproj"> 39 <ProjectReference Include="..\ca\vsca.vcxproj">
46 <Name>vsca</Name> 40 <Name>vsca</Name>
47 <Project>{45308b85-0628-4978-8fc8-6ad9e1ad5949}</Project> 41 <Project>{45308b85-0628-4978-8fc8-6ad9e1ad5949}</Project>
48 </ProjectReference> 42 </ProjectReference>
49 </ItemGroup> 43 </ItemGroup>
50
51 <Import Project="$(WixTargetsPath)" Condition=" '$(WixTargetsPath)' != '' AND Exists('$(WixTargetsPath)') " /> 44 <Import Project="$(WixTargetsPath)" Condition=" '$(WixTargetsPath)' != '' AND Exists('$(WixTargetsPath)') " />
52 <Import Project="$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\wix.targets" Condition=" '$(WixTargetsPath)' == '' AND Exists('$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\wix.targets') " /> 45 <Import Project="$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\wix.targets" Condition=" '$(WixTargetsPath)' == '' AND Exists('$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\wix.targets') " />
53 <Target Name="EnsureWixToolsetInstalled" Condition=" '$(WixTargetsImported)' != 'true' "> 46 <Target Name="EnsureWixToolsetInstalled" Condition=" '$(WixTargetsImported)' != 'true' ">
54 <Error Text="FG-WiX or WiX Toolset build tools (v3.11 or later) must be installed to build this project. To download FG-WiX, go to https://www.firegiant.com/downloads/. To download the WiX Toolset, go to http://wixtoolset.org/releases/." /> 47 <Error Text="FG-WiX or WiX Toolset build tools (v3.11 or later) must be installed to build this project. To download FG-WiX, go to https://www.firegiant.com/downloads/. To download the WiX Toolset, go to http://wixtoolset.org/releases/." />
55 </Target> 48 </Target>
56
57 <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> 49 <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
58 <PropertyGroup> 50 <PropertyGroup>
59 <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText> 51 <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
60 </PropertyGroup> 52 </PropertyGroup>
61 <Error Condition="!Exists('..\..\packages\Nerdbank.GitVersioning.2.0.41\build\Nerdbank.GitVersioning.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Nerdbank.GitVersioning.2.0.41\build\Nerdbank.GitVersioning.targets'))" /> 53 <Error Condition="!Exists('..\..\packages\Nerdbank.GitVersioning.2.1.7\build\Nerdbank.GitVersioning.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Nerdbank.GitVersioning.2.1.7\build\Nerdbank.GitVersioning.targets'))" />
62 <Error Condition="!Exists('..\..\packages\WixToolset.Core.InternalPackage.4.0.15\build\WixToolset.Core.InternalPackage.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.Core.InternalPackage.4.0.15\build\WixToolset.Core.InternalPackage.props'))" /> 54 <Error Condition="!Exists('..\..\packages\WixToolset.Core.InternalPackage.4.0.57\build\WixToolset.Core.InternalPackage.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.Core.InternalPackage.4.0.57\build\WixToolset.Core.InternalPackage.props'))" />
63 </Target> 55 </Target>
64 <Import Project="..\..\packages\Nerdbank.GitVersioning.2.0.41\build\Nerdbank.GitVersioning.targets" Condition="Exists('..\..\packages\Nerdbank.GitVersioning.2.0.41\build\Nerdbank.GitVersioning.targets')" /> 56 <Import Project="..\..\packages\Nerdbank.GitVersioning.2.1.7\build\Nerdbank.GitVersioning.targets" Condition="Exists('..\..\packages\Nerdbank.GitVersioning.2.1.7\build\Nerdbank.GitVersioning.targets')" />
65</Project> 57</Project> \ No newline at end of file