// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
namespace WixToolset.Harvesters
{
using System;
using System.IO;
using WixToolset.Data;
using WixToolset.Harvesters.Data;
using WixToolset.Harvesters.Extensibility;
using Wix = WixToolset.Harvesters.Serialize;
///
/// Harvest WiX authoring for a file from the file system.
///
public sealed class FileHarvester : BaseHarvesterExtension
{
private string rootedDirectoryRef;
private bool setUniqueIdentifiers;
private bool suppressRootDirectory;
private static readonly string ComponentPrefix = "cmp";
private static readonly string DirectoryPrefix = "dir";
private static readonly string FilePrefix = "fil";
///
/// Instantiate a new FileHarvester.
///
public FileHarvester()
{
this.setUniqueIdentifiers = true;
this.suppressRootDirectory = false;
}
///
/// Gets or sets the rooted DirectoryRef Id if the user has supplied it.
///
/// The DirectoryRef Id to use as the root.
public string RootedDirectoryRef
{
get { return this.rootedDirectoryRef; }
set { this.rootedDirectoryRef = value; }
}
///
/// Gets of sets the option to set unique identifiers.
///
/// The option to set unique identifiers.
public bool SetUniqueIdentifiers
{
get { return this.setUniqueIdentifiers; }
set { this.setUniqueIdentifiers = value; }
}
///
/// Gets or sets the option to suppress including the root directory as an element.
///
/// The option to suppress including the root directory as an element.
public bool SuppressRootDirectory
{
get { return this.suppressRootDirectory; }
set { this.suppressRootDirectory = value; }
}
///
/// Harvest a file.
///
/// The path of the file.
/// A harvested file.
public override Wix.Fragment[] Harvest(string argument)
{
if (null == argument)
{
throw new ArgumentNullException("argument");
}
if (null == this.rootedDirectoryRef)
{
this.rootedDirectoryRef = "TARGETDIR";
}
string fullPath = Path.GetFullPath(argument);
var directoryRef = DirectoryHelper.CreateDirectoryReference(this.rootedDirectoryRef);
Wix.File file = this.HarvestFile(fullPath);
if (!this.suppressRootDirectory)
{
file.Source = String.Concat("SourceDir\\", Path.GetFileName(Path.GetDirectoryName(fullPath)), "\\", Path.GetFileName(fullPath));
}
Wix.Component component = new Wix.Component();
component.AddChild(file);
Wix.Directory directory = new Wix.Directory();
if (this.suppressRootDirectory)
{
directoryRef.AddChild(component);
}
else
{
string directoryPath = Path.GetDirectoryName(Path.GetFullPath(argument));
directory.Name = Path.GetFileName(directoryPath);
if (this.setUniqueIdentifiers)
{
directory.Id = this.Core.GenerateIdentifier(DirectoryPrefix, directoryRef.Id, directory.Name);
}
directory.AddChild(component);
directoryRef.AddChild(directory);
}
if (this.setUniqueIdentifiers)
{
file.Id = this.Core.GenerateIdentifier(FilePrefix, (this.suppressRootDirectory) ? directoryRef.Id : directory.Id, Path.GetFileName(file.Source));
component.Id = this.Core.GenerateIdentifier(ComponentPrefix, (this.suppressRootDirectory) ? directoryRef.Id : directory.Id, file.Id);
}
Wix.Fragment fragment = new Wix.Fragment();
fragment.AddChild(directoryRef);
return new Wix.Fragment[] { fragment };
}
///
/// Harvest a file.
///
/// The path of the file.
/// A harvested file.
public Wix.File HarvestFile(string path)
{
if (null == path)
{
throw new ArgumentNullException("path");
}
if (!File.Exists(path))
{
throw new WixException(HarvesterErrors.FileNotFound(path));
}
Wix.File file = new Wix.File();
// use absolute paths
path = Path.GetFullPath(path);
file.KeyPath = Wix.YesNoType.yes;
file.Source = String.Concat("SourceDir\\", Path.GetFileName(path));
return file;
}
}
}