/***************************************************************************
Copyright (c) Microsoft Corporation 2011.
This code is licensed using the Microsoft Public License (Ms-PL). The text of the license can be found here:
http://www.microsoft.com/resources/sharedsource/licensingbasics/publiclicense.mspx
***************************************************************************/
using System;
using System.Collections.Generic;
using System.Management.Automation;
using System.IO;
using System.Xml;
using System.Collections.ObjectModel;
namespace OpenXmlPowerTools.Commands
{
public class PowerToolsReadOnlyCmdlet : PSCmdlet
{
private OpenXmlPowerToolsDocument[] documents;
internal string[] fileNameReferences;
#region Parameters
///
/// Specify the Document parameter
///
[Parameter(
Mandatory = false,
ValueFromPipeline = true,
ValueFromPipelineByPropertyName = true,
HelpMessage = "Specifies the documents to be processed.")]
public OpenXmlPowerToolsDocument[] Document
{
get
{
return documents;
}
set
{
documents = value;
}
}
///
/// Specify the Path parameter
///
[Parameter(Position = 0,
Mandatory = false,
HelpMessage = "Specifies the path to the documents to be processed")]
[ValidateNotNullOrEmpty]
public string[] Path
{
set
{
fileNameReferences = value;
}
}
#endregion
internal IEnumerable AllDocuments(string action)
{
if (fileNameReferences != null)
{
foreach (var path in fileNameReferences)
{
Collection fileList;
try
{
fileList = SessionState.Path.GetResolvedPSPathFromPSPath(path);
}
catch (ItemNotFoundException e)
{
WriteError(new ErrorRecord(e, "OpenXmlPowerToolsError", ErrorCategory.OpenError, path));
continue;
}
foreach (var file in fileList)
{
OpenXmlPowerToolsDocument document;
try
{
document = OpenXmlPowerToolsDocument.FromFileName(file.Path);
}
catch (Exception e)
{
WriteError(new ErrorRecord(e, "OpenXmlPowerToolsError", ErrorCategory.OpenError, file));
continue;
}
yield return document;
}
}
}
else if (Document != null)
{
foreach (OpenXmlPowerToolsDocument document in Document)
{
OpenXmlPowerToolsDocument specificDoc;
try
{
specificDoc = OpenXmlPowerToolsDocument.FromDocument(document);
}
catch (Exception e)
{
WriteError(new ErrorRecord(e, "OpenXmlPowerToolsError", ErrorCategory.InvalidType, document));
continue;
}
yield return specificDoc;
}
}
}
}
public class PowerToolsModifierCmdlet : PSCmdlet
{
private OpenXmlPowerToolsDocument[] documents;
internal string[] fileNameReferences;
protected bool passThru = false;
private string outputFolder;
#region Parameters
[Parameter(
Mandatory = false,
ValueFromPipeline = true,
ValueFromPipelineByPropertyName = true,
HelpMessage = "Specifies the documents to be processed.")]
public OpenXmlPowerToolsDocument[] Document
{
get
{
return documents;
}
set
{
documents = value;
}
}
[Parameter(Position = 0,
Mandatory = false,
HelpMessage = "Specifies the path to the documents to be processed")]
[ValidateNotNullOrEmpty]
public string[] Path
{
set
{
fileNameReferences = value;
}
}
[Parameter(Position = 1,
Mandatory = false,
ValueFromPipeline = false,
HelpMessage = "Path of folder to store result documents")
]
public string OutputFolder
{
get
{
return outputFolder;
}
set
{
outputFolder = SessionState.Path.Combine(SessionState.Path.CurrentLocation.Path, value);
}
}
[Parameter(
Mandatory = false,
HelpMessage = "Use this switch to pipe out the processed documents.")
]
[ValidateNotNullOrEmpty]
public SwitchParameter PassThru
{
get
{
return passThru;
}
set
{
passThru = value;
}
}
#endregion
internal IEnumerable AllDocuments(string action)
{
if (fileNameReferences != null)
{
foreach (var path in fileNameReferences)
{
Collection fileList;
try
{
fileList = SessionState.Path.GetResolvedPSPathFromPSPath(path);
}
catch (ItemNotFoundException e)
{
WriteError(new ErrorRecord(e, "OpenXmlPowerToolsError", ErrorCategory.OpenError, path));
continue;
}
foreach (var file in fileList)
{
string target = file.Path;
if (OutputFolder != null)
{
FileInfo temp = new FileInfo(file.Path);
target = OutputFolder + "\\" + temp.Name;
}
if (!File.Exists(target) || ShouldProcess(target, action))
{
OpenXmlPowerToolsDocument document;
try
{
document = OpenXmlPowerToolsDocument.FromFileName(file.Path);
}
catch (Exception e)
{
WriteError(new ErrorRecord(e, "OpenXmlPowerToolsError", ErrorCategory.OpenError, file));
continue;
}
yield return document;
}
}
}
}
else if (Document != null)
{
foreach (OpenXmlPowerToolsDocument document in Document)
{
string target = document.FileName;
if (OutputFolder != null)
{
FileInfo temp = new FileInfo(document.FileName);
target = OutputFolder + "\\" + temp.Name;
}
if (!File.Exists(target) || ShouldProcess(target, action))
{
OpenXmlPowerToolsDocument specificDoc;
try
{
specificDoc = OpenXmlPowerToolsDocument.FromDocument(document);
}
catch (Exception e)
{
WriteError(new ErrorRecord(e, "OpenXmlPowerToolsError", ErrorCategory.InvalidType, document));
continue;
}
yield return specificDoc;
}
}
}
}
// Determines if and where to write the modified document
internal void OutputDocument(OpenXmlPowerToolsDocument doc)
{
if (OutputFolder != null)
{
FileInfo file = new FileInfo(doc.FileName);
string newName = OutputFolder + "\\" + file.Name;
doc.SaveAs(newName);
}
else if (!PassThru)
doc.Save();
if (PassThru)
WriteObject(doc, true);
}
}
public class PowerToolsCreateCmdlet : PSCmdlet
{
protected bool passThru = false;
#region Parameters
///
/// PassThru parameter
///
[Parameter(
Mandatory = false,
HelpMessage = "Use this switch to pipe out the processed documents.")
]
[ValidateNotNullOrEmpty]
public SwitchParameter PassThru
{
get
{
return passThru;
}
set
{
passThru = value;
}
}
#endregion
// Determines if and where to write the modified document
internal void OutputDocument(OpenXmlPowerToolsDocument doc)
{
if (PassThru)
WriteObject(doc, true);
else
doc.Save();
}
}
public static class PowerToolsExceptionHandling
{
public static ErrorRecord GetExceptionErrorRecord(Exception e, OpenXmlPowerToolsDocument doc)
{
ErrorCategory cat = ErrorCategory.NotSpecified;
if (e is ArgumentException)
cat = ErrorCategory.InvalidArgument;
else if (e is InvalidOperationException)
cat = ErrorCategory.InvalidOperation;
else if (e is PowerToolsDocumentException)
cat = ErrorCategory.OpenError;
else if (e is PowerToolsInvalidDataException || e is XmlException)
cat = ErrorCategory.InvalidData;
return new ErrorRecord(e, (cat == ErrorCategory.NotSpecified) ? "General" : "OpenXmlPowerToolsError", cat, doc);
}
}
}