in src/Tasks/BootstrapperUtil/BootstrapperBuilder.cs [1373:1564]
private bool BuildPackages(BuildSettings settings, XmlElement configElement, ResourceUpdater resourceUpdater, ArrayList filesCopied, Hashtable eulas)
{
bool fSucceeded = true;
foreach (ProductBuilder builder in settings.ProductBuilders)
{
if (Validate && !builder.Product.ValidationPassed)
{
if (_results != null)
{
_results.AddMessage(BuildMessage.CreateMessage(BuildMessageSeverity.Warning, "GenerateBootstrapper.ProductValidation", builder.Name, builder.Product.ValidationResults.FilePath));
foreach (string validationMessage in builder.Product.ValidationResults.ValidationErrors)
{
_results.AddMessage(BuildMessage.CreateMessage(BuildMessageSeverity.Warning, "GenerateBootstrapper.ValidationError", builder.Product.ValidationResults.FilePath, validationMessage));
}
foreach (string validationMessage in builder.Product.ValidationResults.ValidationWarnings)
{
_results.AddMessage(BuildMessage.CreateMessage(BuildMessageSeverity.Warning, "GenerateBootstrapper.ValidationWarning", builder.Product.ValidationResults.FilePath, validationMessage));
}
}
}
Package package = GetPackageForSettings(settings, builder, _results);
if (package == null)
{
// GetPackage should have already added the correct message info
continue;
}
if (Validate && !package.ValidationPassed)
{
if (_results != null)
{
_results.AddMessage(BuildMessage.CreateMessage(BuildMessageSeverity.Warning, "GenerateBootstrapper.PackageValidation", builder.Name, package.ValidationResults.FilePath));
foreach (string validationMessage in package.ValidationResults.ValidationErrors)
{
_results.AddMessage(BuildMessage.CreateMessage(BuildMessageSeverity.Warning, "GenerateBootstrapper.ValidationError", package.ValidationResults.FilePath, validationMessage));
}
foreach (string validationMessage in package.ValidationResults.ValidationWarnings)
{
_results.AddMessage(BuildMessage.CreateMessage(BuildMessageSeverity.Warning, "GenerateBootstrapper.ValidationWarning", package.ValidationResults.FilePath, validationMessage));
}
}
}
XmlNode node = package.Node;
// Copy the files for this package to the output directory
XmlAttribute eulaAttribute = node.Attributes[EULA_ATTRIBUTE];
XmlNodeList packageFileNodes = node.SelectNodes(BOOTSTRAPPER_PREFIX + ":PackageFiles/" + BOOTSTRAPPER_PREFIX + ":PackageFile", _xmlNamespaceManager);
XmlNode installChecksNode = node.SelectSingleNode(BOOTSTRAPPER_PREFIX + ":InstallChecks", _xmlNamespaceManager);
foreach (XmlNode packageFileNode in packageFileNodes)
{
XmlAttribute packageFileSource = (XmlAttribute)(packageFileNode.Attributes.GetNamedItem("SourcePath"));
XmlAttribute packageFileDestination = (XmlAttribute)(packageFileNode.Attributes.GetNamedItem("TargetPath"));
XmlAttribute packageFileName = (XmlAttribute)(packageFileNode.Attributes.GetNamedItem("Name"));
XmlAttribute packageFileCopy = (XmlAttribute)(packageFileNode.Attributes.GetNamedItem("CopyOnBuild"));
if (packageFileSource != null && eulaAttribute != null && !String.IsNullOrEmpty(eulaAttribute.Value) && packageFileSource.Value == eulaAttribute.Value)
{
// need to remove EULA from the package file list
XmlNode packageFilesNode = node.SelectSingleNode(BOOTSTRAPPER_PREFIX + ":PackageFiles", _xmlNamespaceManager);
packageFilesNode.RemoveChild(packageFileNode);
continue;
}
if ((packageFileSource != null) && (packageFileDestination != null))
{
// Calculate the hash of this file and add it to the PackageFileNode
if (!AddVerificationInformation(packageFileNode, packageFileSource.Value, packageFileName.Value, builder, settings, _results))
fSucceeded = false;
}
if ((packageFileSource != null) && (packageFileDestination != null) &&
((packageFileCopy == null) || (String.Compare(packageFileCopy.Value, "False", StringComparison.InvariantCulture) != 0)))
{
// if this is the key for an external check, we will add it to the Resource Updater instead of copying the file
XmlNode subNode = null;
if ((installChecksNode != null) && (packageFileName != null))
{
subNode = QueryForSubNode(installChecksNode, "PackageFile", packageFileName.Value);
}
if (subNode != null)
{
if (resourceUpdater != null)
{
if (!File.Exists(packageFileSource.Value))
{
if (_results != null)
_results.AddMessage(BuildMessage.CreateMessage(BuildMessageSeverity.Error, "GenerateBootstrapper.PackageResourceFileNotFound", packageFileSource.Value, builder.Name));
fSucceeded = false;
continue;
}
resourceUpdater.AddFileResource(packageFileSource.Value, packageFileDestination.Value);
}
}
else
{
if (settings.ComponentsLocation != ComponentsLocation.HomeSite || !VerifyHomeSiteInformation(packageFileNode, builder, settings, _results))
{
if (settings.CopyComponents)
{
string strDestinationFileName = System.IO.Path.Combine(settings.OutputPath, packageFileDestination.Value);
try
{
if (!File.Exists(packageFileSource.Value))
{
if (_results != null)
_results.AddMessage(BuildMessage.CreateMessage(BuildMessageSeverity.Error, "GenerateBootstrapper.PackageFileNotFound", packageFileDestination.Value, builder.Name));
fSucceeded = false;
continue;
}
EnsureFolderExists(System.IO.Path.GetDirectoryName(strDestinationFileName));
File.Copy(packageFileSource.Value, strDestinationFileName, true);
ClearReadOnlyAttribute(strDestinationFileName);
}
catch (UnauthorizedAccessException ex)
{
if (_results != null)
_results.AddMessage(BuildMessage.CreateMessage(BuildMessageSeverity.Error, "GenerateBootstrapper.CopyPackageError", packageFileSource.Value, builder.Name, ex.Message));
fSucceeded = false;
continue;
}
catch (IOException ex)
{
if (_results != null)
_results.AddMessage(BuildMessage.CreateMessage(BuildMessageSeverity.Error, "GenerateBootstrapper.CopyPackageError", packageFileSource.Value, builder.Name, ex.Message));
fSucceeded = false;
continue;
}
catch (ArgumentException ex)
{
if (_results != null)
_results.AddMessage(BuildMessage.CreateMessage(BuildMessageSeverity.Error, "GenerateBootstrapper.CopyPackageError", packageFileSource.Value, builder.Name, ex.Message));
fSucceeded = false;
continue;
}
catch (NotSupportedException ex)
{
if (_results != null)
_results.AddMessage(BuildMessage.CreateMessage(BuildMessageSeverity.Error, "GenerateBootstrapper.CopyPackageError", packageFileSource.Value, builder.Name, ex.Message));
fSucceeded = false;
continue;
}
filesCopied.Add(strDestinationFileName);
}
else
{
filesCopied.Add(packageFileSource.Value);
}
// Add the file size to the PackageFileNode
XmlAttribute sizeAttribute = packageFileNode.OwnerDocument.CreateAttribute("Size");
FileInfo fi = new FileInfo(packageFileSource.Value);
sizeAttribute.Value = "" + (fi.Length.ToString(CultureInfo.InvariantCulture));
MergeAttribute(packageFileNode, sizeAttribute);
}
}
}
}
// Add the Eula attribute correctly
if (eulas != null && eulaAttribute != null && !String.IsNullOrEmpty(eulaAttribute.Value))
{
if (File.Exists(eulaAttribute.Value))
{
// eulas[GetFileHash(eulaAttribute.Value)] = eulaAttribute.Value;
string key = GetFileHash(eulaAttribute.Value);
if (eulas.ContainsKey(key))
eulaAttribute.Value = ((DictionaryEntry)eulas[key]).Key.ToString();
else
{
string configFileKey = string.Format(CultureInfo.InvariantCulture, "EULA{0}", eulas.Count);
DictionaryEntry de = new DictionaryEntry(configFileKey, eulaAttribute.Value);
eulas[key] = de;
eulaAttribute.Value = configFileKey;
}
}
else
{
if (_results != null)
_results.AddMessage(BuildMessage.CreateMessage(BuildMessageSeverity.Error, "GenerateBootstrapper.PackageResourceFileNotFound", eulaAttribute.Value, builder.Name));
fSucceeded = false;
continue;
}
}
// Write the package node
if (configElement != null)
{
configElement.AppendChild(configElement.OwnerDocument.ImportNode(node, true));
DumpXmlToFile(node, string.Format(CultureInfo.CurrentCulture, "{0}.{1}.xml", package.Product.ProductCode, package.Culture));
}
}
return fSucceeded;
}