Files
AllPurposeAutoSetup/AllPurposeAutoSetup/FilePackageTransferManager.cs
2025-03-13 18:24:10 -07:00

1946 lines
91 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
using System.Diagnostics;
using System.Text.RegularExpressions;
using System.IO;
using System.Security.AccessControl;
using System.Management;
using System.Security.Principal;
using System.Runtime.InteropServices;
using Microsoft.Win32;
using System.Drawing;
using System.Xml;
using System.Xml.XPath;
using System.Net;
using CommonLib.Windows.Forms;
using CommonLib.IO;
using CommonLib.Misc;
namespace All_Purpose_Auto_Setup
{
class FilePackageTransferManager
{
public enum eFileAction
{
None
};
public enum eFileCopyStatus { FAIL, SUCCESS };
public enum eCopyType { FOLDERS, FILES };
// An event that can be raised, allowing other classes to
// subscribe to it and do what they like with the message.
public event Action<string, string, List<CommonLib.Windows.Forms.TextFormat.TextFontAndColor>> UpdateStatusDisplayAndLogEvent;
public event Action<string, int, List<CommonLib.Windows.Forms.TextFormat.TextFontAndColor>> UpdateStatusDisplayAtLine;
// event for thread to notify other threads that it has exited
private AutoResetEvent _resetEvent = new AutoResetEvent(false);
public List<ConfigFileManager.Ini_KeyValue<string>> fileTransferPackages = new List<ConfigFileManager.Ini_KeyValue<string>>();
private List<SourceFile> sourceFiles = new List<SourceFile>();
FileManip.FileDownloadProgressTracker downloadProgressTracker = new FileManip.FileDownloadProgressTracker();
int m_copyProgressLineIndex = 0;
Form m_parentForm;
bool m_filePackageProcessedSuccessful = false;
int m_fileCreatedCount = 0;
int m_fileCopyCount = 0;
public FilePackageTransferManager(Form parentForm)
{
m_parentForm = parentForm;
}
public bool manageFilePackageTransfer(string sectionName)
{
bool setupSuccessful = true;
string msg, indentation = String.Empty;
CommonLib.Windows.Forms.TextFormat.TextFontAndColor defaultTextProp = new CommonLib.Windows.Forms.TextFormat.TextFontAndColor("");
CommonLib.Windows.Forms.TextFormat.TextFontAndColor textProp = new CommonLib.Windows.Forms.TextFormat.TextFontAndColor("");
List<CommonLib.Windows.Forms.TextFormat.TextFontAndColor> textPropList = new List<CommonLib.Windows.Forms.TextFormat.TextFontAndColor>();
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Common.getSetupStepTitleColor();
textProp.wordIndex = 0;
textProp.wordCount = 100;
textPropList.Add(textProp);
DateTime dat1 = DateTime.Now;
msg = "\n\n<-------------------Date and Time: " + dat1.ToString(@"MM/dd/yyyy hh:mm:ss tt", System.Globalization.CultureInfo.InvariantCulture) + "------------------->";
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Common.getSetupStepTitleColor();
textProp.wordIndex = 0;
textProp.wordCount = 10;
// set font size
textProp.textFont = new Font(textProp.textFont.Name, 12);
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
msg = "\n-=Copying File Packages=-";
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
XPathDocument doc = null;
fileTransferPackages.Clear();
ConfigFileManager.parseConfigInfo(sectionName, fileTransferPackages);
setupSuccessful = verifyFilePackagesInfo();
if (setupSuccessful)
{
foreach (ConfigFileManager.Ini_KeyValue<string> filePackage in fileTransferPackages)
{
try
{
XmlReaderSettings readerSettings = new XmlReaderSettings();
// tells the xmlreader to ignore comment in XML file
readerSettings.IgnoreComments = true;
using (XmlReader reader = XmlReader.Create(filePackage.iniValue, readerSettings))
{
// load the XML file
doc = new XPathDocument(reader);
}
}
catch (Exception e)
{
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Common.getSetupStatusColor(Common.EXECUTION_STATUS.FAILURE);
textProp.wordIndex = 0;
textProp.wordCount = 2;
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
indentation = Common.getIndentation(1);
msg = "\n" + indentation + "- FAILED. Unable to parse file " + filePackage.iniValue + ". " + e.Message;
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
setupSuccessful = false;
}
if (setupSuccessful)
{
XPathNavigator nav = doc.CreateNavigator();
// move to root node
nav.MoveToRoot();
// move to 1st level node
if (nav.MoveToFirstChild())
{
// move to 2nd level node
if (nav.MoveToFirstChild())
{
if (!ProcessXML2ndLevelNodes(nav, Path.GetDirectoryName(filePackage.iniValue)))
{
setupSuccessful = false;
}
}
}
}
if (!setupSuccessful)
break;
}
if (setupSuccessful)
{
if (!m_filePackageProcessedSuccessful)
{
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Common.getSetupStatusColor(Common.EXECUTION_STATUS.SYSTEM_SKIP);
textProp.wordIndex = 0;
textProp.wordCount = 2;
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
indentation = Common.getIndentation(1);
msg = "\n" + indentation + "- SKIPPED. Nothing to be copied from the provided information.";
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
}
}
}
return setupSuccessful;
}
private void DownloadProgressHandler(UInt64 totalBytesCopied, UInt64 totalBytesFile)
{
string totalSizeDescription = FileManip.DescribeFileSize(totalBytesFile, FileManip.eFileSizeResolution.AUTO);
double totalPercentageReceived = ((double)totalBytesCopied / (double)totalBytesFile) * 100;
CommonLib.Windows.Forms.TextFormat.TextFontAndColor defaultTextProp = new CommonLib.Windows.Forms.TextFormat.TextFontAndColor("");
CommonLib.Windows.Forms.TextFormat.TextFontAndColor textProp = new CommonLib.Windows.Forms.TextFormat.TextFontAndColor("");
List<CommonLib.Windows.Forms.TextFormat.TextFontAndColor> textPropList = new List<CommonLib.Windows.Forms.TextFormat.TextFontAndColor>();
if (!downloadProgressTracker.stopwatchForFileDownload.IsRunning)
{
downloadProgressTracker.stopwatchForFileDownload.Start();
}
if (!downloadProgressTracker.stopwatchForUpdateInterval.IsRunning)
{
downloadProgressTracker.stopwatchForUpdateInterval.Start();
}
// when an interval is reached, update download progress
if (downloadProgressTracker.stopwatchForUpdateInterval.ElapsedMilliseconds >= downloadProgressTracker.updateIntervalInMs)
{
downloadProgressTracker.stopwatchForUpdateInterval.Reset();
if (downloadProgressTracker.averageBytesReceivedPerUpdateInterval == 0)
downloadProgressTracker.averageBytesReceivedPerUpdateInterval = totalBytesCopied - downloadProgressTracker.totalBytesReceived;
else
{
downloadProgressTracker.averageBytesReceivedPerUpdateInterval += totalBytesCopied - downloadProgressTracker.totalBytesReceived;
downloadProgressTracker.averageBytesReceivedPerUpdateInterval /= 2;
}
downloadProgressTracker.totalBytesReceived = totalBytesCopied;
downloadProgressTracker.millisecondsCount += downloadProgressTracker.updateIntervalInMs;
string receivedSizeDescription = FileManip.DescribeFileSize(totalBytesCopied, downloadProgressTracker.fileSizeResolution);
if (downloadProgressTracker.strTotalBytesReceived.Length > 0)
{
// determine what the highest resolution transfer rate change
FileManip.eFileSizeResolution res = FileManip.GetFileResolutionOfTransferRate(receivedSizeDescription, downloadProgressTracker.strTotalBytesReceived);
// increate the count for this resolution
downloadProgressTracker.unitCount[res]++;
}
// every 2 seconds, we determine which resolution change the most, and use the resolution
// that's changed the most as the update progress
if (downloadProgressTracker.millisecondsCount >= 2000)
{
FileManip.eFileSizeResolution res = downloadProgressTracker.getResolutionWithHighestCount();
if (res != FileManip.eFileSizeResolution.AUTO)
downloadProgressTracker.fileSizeResolution = res;
downloadProgressTracker.millisecondsCount = 0;
downloadProgressTracker.resetUnitCount();
}
receivedSizeDescription = FileManip.DescribeFileSize(totalBytesCopied, downloadProgressTracker.fileSizeResolution);
downloadProgressTracker.strTotalBytesReceived = receivedSizeDescription;
// shorten the size description
receivedSizeDescription = FileManip.ShortenFileSizeDescription(receivedSizeDescription);
long downloadSpeed = (long)Math.Ceiling((double)downloadProgressTracker.averageBytesReceivedPerUpdateInterval / ((double)downloadProgressTracker.updateIntervalInMs / 1000.0));
string downloadSpeedDesc = FileManip.DescribeFileSize((UInt64)downloadSpeed, FileManip.eFileSizeResolution.AUTO);
downloadSpeedDesc = Regex.Replace(downloadSpeedDesc, @"(\d+)\.\d+(.+)", "$1$2", RegexOptions.IgnoreCase);
string msg = Common.getIndentation(1) + "Progress: " + string.Format("{0:N2}%", totalPercentageReceived) +
" Speed: " + downloadSpeedDesc + "/s Copied: " + receivedSizeDescription + " Total Size: " + totalSizeDescription +
" Elapsed time: " + DateTimeManip.DescribeTimeElapsed(downloadProgressTracker.stopwatchForFileDownload.Elapsed);
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Color.FromArgb(0, 82, 204);
textProp.wordIndex = 1;
textProp.wordCount = 1;
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Color.FromArgb(0, 82, 204);
textProp.wordIndex = 3;
textProp.wordCount = 2;
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Color.FromArgb(0, 82, 204);
textProp.wordIndex = StringManip.GetPhraseWordIndexInText(msg, "copied:") + 1;
textProp.wordCount = StringManip.GetPhraseWordIndexInText(msg, "total size:") - textProp.wordIndex;
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Color.FromArgb(0, 82, 204);
textProp.wordIndex = StringManip.GetPhraseWordIndexInText(msg, "total size:") + 2;
textProp.wordCount = 2;
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Color.FromArgb(0, 82, 204);
textProp.wordIndex = StringManip.GetPhraseWordIndexInText(msg, "elapsed time:") + 2;
textProp.wordCount = 100;
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
UpdateStatusDisplayAtLine(msg, m_copyProgressLineIndex, textPropList);
}
}
bool processFilePackage()
{
bool setupSuccessful = true;
string msg = "", msg2 = "", displayMsg = "", logMsg = "", indentation = String.Empty, errMsg = "", sourcePath = "", destPath = "", tempMsg = "";
CommonLib.Windows.Forms.TextFormat.TextFontAndColor defaultTextProp = new CommonLib.Windows.Forms.TextFormat.TextFontAndColor("");
CommonLib.Windows.Forms.TextFormat.TextFontAndColor textProp = new CommonLib.Windows.Forms.TextFormat.TextFontAndColor("");
List<CommonLib.Windows.Forms.TextFormat.TextFontAndColor> textPropList = new List<CommonLib.Windows.Forms.TextFormat.TextFontAndColor>();
List<CommonLib.Windows.Forms.TextFormat.TextFontAndColor> tempTextPropList;
bool overwriteDestinationFile = false;
bool overwriteDestinationFileAlways = false;
bool promptForOverwriteConfirmation = true;
frmSetupStatusDisplay displayFrm = (frmSetupStatusDisplay)m_parentForm;
int fileCountLineIndex = displayFrm.updateStatusDisplayAndLog("\n ", "", textPropList);
int sourceFileLineIndex = displayFrm.updateStatusDisplayAndLog("\n ", "", textPropList);
int destFileLineIndex = displayFrm.updateStatusDisplayAndLog("\n ", "", textPropList);
m_copyProgressLineIndex = displayFrm.updateStatusDisplayAndLog("\n ", "", textPropList);
foreach (SourceFile file in sourceFiles)
{
indentation = Common.getIndentation(1);
msg = indentation + "Files Copied: " + m_fileCopyCount.ToString() + " Files Created: " + m_fileCreatedCount.ToString();
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Color.FromArgb(5, 112, 1);
textProp.wordIndex = 0;
textProp.wordCount = 2;
// set font style
textPropList.Add(textProp);
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Color.FromArgb(5, 112, 1);
textProp.wordIndex = 2;
textProp.wordCount = 1;
// set font style
textProp.textFont = new Font(textProp.textFont.FontFamily, 10, FontStyle.Bold);
textPropList.Add(textProp);
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Color.FromArgb(5, 112, 1);
textProp.wordIndex = StringManip.GetPhraseWordIndexInText(msg, "files created:");
textProp.wordCount = 2;
textPropList.Add(textProp);
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Color.FromArgb(5, 112, 1);
textProp.wordIndex = StringManip.GetPhraseWordIndexInText(msg, "files created:") + 2;
textProp.wordCount = 1;
// set font style
textProp.textFont = new Font(textProp.textFont.FontFamily, 10, FontStyle.Bold);
textPropList.Add(textProp);
UpdateStatusDisplayAtLine(msg, fileCountLineIndex, textPropList);
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
//textProp.textColor = Color.FromArgb(157, 150, 19);
textProp.wordIndex = 0;
textProp.wordCount = 1;
textPropList.Add(textProp);
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Color.FromArgb(255, 60, 0);
textProp.wordIndex = 1;
textProp.wordCount = 100;
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
tempTextPropList = new List<CommonLib.Windows.Forms.TextFormat.TextFontAndColor>(textPropList);
sourcePath = file.SourcePath;
destPath = file.destPath;
if (sourcePath.Length > 0 && !PathManip.PathContainsAtLeastOneFolder(sourcePath))
sourcePath = PathManip.AddTrailingSlashToPath(sourcePath);
if (!PathManip.PathContainsAtLeastOneFolder(destPath))
destPath = PathManip.AddTrailingSlashToPath(destPath);
string destFileName;
// get the actual path and filename letter casing
string sourceFilePathAndName = PathManip.GetProperFilePathCapitalization(Path.Combine(sourcePath, file.FileName));
string sourceFileName = Path.GetFileName(sourceFilePathAndName);
string sourceFilePath = Path.GetDirectoryName(sourceFilePathAndName);
// if the source file is to be save as a different at the destination
if (file.FileNameSaveAs.Length > 0)
destFileName = file.FileNameSaveAs;
else
destFileName = sourceFileName;
indentation = Common.getIndentation(1);
if (file.SourcePath.Length > 0)
{
msg = indentation + "Copying " + StringManip.ShortenStringToSize(sourceFilePathAndName, 65);
msg2 = indentation + "To " + StringManip.ShortenStringToSize(Path.Combine(destPath, destFileName), 65);
}
else
msg = indentation + "Creating " + StringManip.ShortenStringToSize(Path.Combine(destPath, destFileName), 65);
UpdateStatusDisplayAtLine(msg, sourceFileLineIndex, textPropList);
if (msg2.Length > 0)
{
textPropList = new List<CommonLib.Windows.Forms.TextFormat.TextFontAndColor>(tempTextPropList);
UpdateStatusDisplayAtLine(msg2, destFileLineIndex, textPropList);
}
if (file.individualOverwrite.Length != 0)
{
promptForOverwriteConfirmation = false;
if (String.Equals(file.individualOverwrite, "yes", StringComparison.OrdinalIgnoreCase) || String.Equals(file.individualOverwrite, "true", StringComparison.OrdinalIgnoreCase))
{
overwriteDestinationFile = true;
}
else
overwriteDestinationFile = false;
}
if (promptForOverwriteConfirmation && File.Exists(Path.Combine(destPath, destFileName)))
{
MessageBoxCustom.clsCustomButton button1 = new MessageBoxCustom.clsCustomButton("YES - This File", "YesOneTime");
MessageBoxCustom.clsCustomButton button2 = new MessageBoxCustom.clsCustomButton("NO - This File", "NoOneTime");
MessageBoxCustom.clsCustomButton button3 = new MessageBoxCustom.clsCustomButton("YES - All Files", "YesAlways");
MessageBoxCustom.clsCustomButton button4 = new MessageBoxCustom.clsCustomButton("No - All Files", "NoAlways");
List<MessageBoxCustom.clsCustomButton> options = new List<MessageBoxCustom.clsCustomButton>() { button1, button2, button3, button4 };
msg = ((frmSetupStatusDisplay)m_parentForm).displayMessageBox(MessageBoxCustom.PopUpMsgType.CUSTOMQUESTION, options,
"File " + Path.Combine(destPath, destFileName) + "\nalready exists. Would you like to overwrite?", "Warning!!!", -1);
if (String.Equals(msg, "YesOneTime", StringComparison.OrdinalIgnoreCase))
{
overwriteDestinationFile = true;
}
else if (String.Equals(msg, "YesAlways", StringComparison.OrdinalIgnoreCase))
{
overwriteDestinationFileAlways = true;
overwriteDestinationFile = true;
promptForOverwriteConfirmation = false;
}
else if (String.Equals(msg, "NoAlways", StringComparison.OrdinalIgnoreCase))
{
promptForOverwriteConfirmation = false;
}
}
if (m_fileCopyCount == 0 && m_fileCreatedCount == 0)
UpdateStatusDisplayAtLine(indentation + "Initializing. Please wait...", m_copyProgressLineIndex, textPropList);
// if the file to be created already exists
if (file.SourcePath.Length == 0 && File.Exists(Path.Combine(destPath, destFileName)))
{
logMsg = "\n" + Common.getIndentation(2) + "Create " + Path.Combine(destPath, destFileName) + " - SKIPPED. File already exists at destination";
}
else if (file.SourcePath.Length > 0 && File.Exists(Path.Combine(destPath, destFileName)) && !overwriteDestinationFile)
{
logMsg = "\n" + Common.getIndentation(2) + "Copy " + sourceFilePathAndName + " --> " + Path.Combine(destPath, destFileName) + " - SKIPPED. File already exists at destination";
}
else
{
foreach (var drive in DriveInfo.GetDrives()
.Where(d => d.DriveType == DriveType.CDRom))
{
if (Regex.IsMatch(sourceFilePathAndName, @"^" + Regex.Escape(PathManip.RemoveTrailingSlashInPath(drive.Name)) + @".*", RegexOptions.IgnoreCase))
{
while (!drive.IsReady || !File.Exists(sourceFilePathAndName))
{
Hardware.OpenCdDrive(drive.Name);
tempMsg = "Please insert a disc";
if (file.cdLabel.Length > 0)
tempMsg += " labeled \"" + file.cdLabel + "\"";
tempMsg += " into drive " + drive.Name + " that has the following file:\n" + sourceFilePathAndName + "\n\n Click OK to proceed";
msg = ((frmSetupStatusDisplay)m_parentForm).displayMessageBox(MessageBoxCustom.PopUpMsgType.OKCANCEL, null,
tempMsg, "Info", -1);
if (String.Equals(msg, "cancel", StringComparison.OrdinalIgnoreCase))
{
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Common.getSetupStatusColor(Common.EXECUTION_STATUS.FAILURE);
textProp.wordIndex = 0;
textProp.wordCount = 2;
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
indentation = Common.getIndentation(1);
logMsg = "\n" + Common.getIndentation(2) + "Copy " + sourceFilePathAndName + " --> " + Path.Combine(destPath, destFileName) + " - FAILED";
displayMsg = "\n" + indentation + "- FAILED. Unable to locate file: " + sourceFilePathAndName;
setupSuccessful = false;
break;
}
}
break;
}
}
if (setupSuccessful)
{
if (FileManip.CopyFileWithProgress(sourceFilePath, sourceFileName, file.destPath, destFileName,
true, FileAttributes.Normal,
new FileManip.FileCopyProgressChangeDelegate(DownloadProgressHandler), downloadProgressTracker))
{
indentation = Common.getIndentation(2);
if (file.SourcePath.Length > 0)
{
logMsg = "\n" + indentation + "Copy " + sourceFilePathAndName + " --> " + Path.Combine(destPath, destFileName) + " - SUCCESS";
m_fileCopyCount++;
}
else
{
logMsg = "\n" + indentation + "Create " + Path.Combine(destPath, destFileName) + " - SUCCESS";
m_fileCreatedCount++;
}
}
else
{
errMsg = downloadProgressTracker.errorMsg;
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Common.getSetupStatusColor(Common.EXECUTION_STATUS.FAILURE);
textProp.wordIndex = 0;
textProp.wordCount = 2;
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
indentation = Common.getIndentation(1);
if (file.SourcePath.Length > 0)
{
logMsg = "\n" + Common.getIndentation(2) + "Copy " + sourceFilePathAndName + " --> " + Path.Combine(destPath, destFileName) + " - FAILED";
displayMsg = "\n" + indentation + "- FAILED. Copying file failed. " + Regex.Replace(errMsg, @"\r\n", "", RegexOptions.IgnoreCase) + "\n" + indentation + "From: " + sourceFilePathAndName + "\n" + indentation + "To: " + Path.Combine(destPath, destFileName);
}
else
{
logMsg = "\n" + Common.getIndentation(2) + "Create " + Path.Combine(destPath, destFileName) + " - FAILED";
displayMsg = "\n" + indentation + "- FAILED. Creating file failed. " + Regex.Replace(errMsg, @"\r\n", "", RegexOptions.IgnoreCase) + "\n" + indentation + "File to be created: " + Path.Combine(destPath, destFileName);
}
setupSuccessful = false;
}
}
}
// blank out the line
displayFrm.removeStatusDisplayLine(fileCountLineIndex, false);
// blank out the line
displayFrm.removeStatusDisplayLine(m_copyProgressLineIndex, false);
if (!overwriteDestinationFileAlways)
overwriteDestinationFile = false;
if (!setupSuccessful)
{
break;
}
UpdateStatusDisplayAndLogEvent("", logMsg, textPropList);
}
for (int i = 1; i <= 4; i++)
{
// delete the very first line that is the start of the progress update
// all the lines below the first starting lines will get deleted too
displayFrm.removeStatusDisplayLine(fileCountLineIndex, true);
}
if (!setupSuccessful)
{
UpdateStatusDisplayAndLogEvent(displayMsg, logMsg, textPropList);
}
return setupSuccessful;
}
///===================================================================================
/// ProcessXML2ndLevelNodes
///===================================================================================
/// <summary>
/// Process the child nodes <software></software> of the 2nd level node
/// <softwarebuildstructure></softwarebuildstructure> in the XML file.
/// </summary>
/// <param name="nav">navigator object for traversing XML tree</param>
/// <param name="sourceFile"></param>
/// <param name="packageInSourceControl">info about software package in source control
/// </param>
/// <param name="fileActions">file actions associated with source files</param>
/// <param name="filesSaveAs">file name to be saved as at destination</param>
/// <param name="bgw">backgroundworker</param>
/// <param name="e">backgroundworker event arguments</param>
/// <returns>true if processing node successfully, otherwise false</returns>
///===================================================================================
private bool ProcessXML2ndLevelNodes(XPathNavigator nav, string defaultStartingSourcePath)
{
bool setupSuccessful = true;
CommonLib.Windows.Forms.TextFormat.TextFontAndColor defaultTextProp = new CommonLib.Windows.Forms.TextFormat.TextFontAndColor("");
CommonLib.Windows.Forms.TextFormat.TextFontAndColor textProp = new CommonLib.Windows.Forms.TextFormat.TextFontAndColor("");
List<CommonLib.Windows.Forms.TextFormat.TextFontAndColor> textPropList = new List<CommonLib.Windows.Forms.TextFormat.TextFontAndColor>();
string msg, indentation = String.Empty;
string startingSourcePath = "";
Match regexMatch;
if (nav == null)
setupSuccessful = false;
SourceFile sourceFile = new SourceFile("");
if (setupSuccessful)
{
do
{
string packageName = nav.GetAttribute("name", String.Empty);
if (packageName.Length == 0)
{
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Common.getSetupStatusColor(Common.EXECUTION_STATUS.FAILURE);
textProp.wordIndex = 0;
textProp.wordCount = 2;
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
indentation = Common.getIndentation(1);
msg = "\n" + indentation + "- FAILED. Attribute \"name\" not found or has invalid value in node " + nav.OuterXml.Substring(0, nav.OuterXml.IndexOf(">") + 1) + " on line " + ((IXmlLineInfo)nav).LineNumber.ToString();
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
setupSuccessful = false;
}
else
{
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Color.FromArgb(233, 31, 195);
textProp.wordIndex = 3;
textProp.wordCount = 100;
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
indentation = Common.getIndentation(1);
msg = "\n" + indentation + "Copying File Package " + packageName;
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
string customStartingSourcePath = nav.GetAttribute("startingsourcepath", string.Empty);
string startingDestPath = nav.GetAttribute("startingdestpath", string.Empty);
// match macro defined in the value of they key, macro is in the form of {xxxxx} such as {user_desktop}, {user_temp_folder}, {cd_drive}
regexMatch = Regex.Match(customStartingSourcePath, @"^\{([^\{\}]+)\}.*", RegexOptions.IgnoreCase);
// if rootpath is ., then we take the path of the XML package as the root path
if (string.Equals(customStartingSourcePath, "."))
customStartingSourcePath = defaultStartingSourcePath;
else if (regexMatch.Success)
{
if (Common.pathContainsMacro(regexMatch.Groups[0].Value))
{
string resolvedPath = Common.resolveMacroPath(regexMatch.Groups[0].Value);
if (Common.pathContainsCdDriveMacro(regexMatch.Groups[0].Value))
{
if (resolvedPath.Length == 0)
{
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Common.getSetupStatusColor(Common.EXECUTION_STATUS.FAILURE);
textProp.wordIndex = 0;
textProp.wordCount = 2;
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
indentation = Common.getIndentation(2);
msg = "\n" + indentation + "- FAILED. " + regexMatch.Groups[0].Value + " macro was defined. But no CD drive is found in the system" + ". XML node " + nav.OuterXml.Substring(0, nav.OuterXml.IndexOf(">") + 1) + " on line " + ((IXmlLineInfo)nav).LineNumber.ToString();
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
setupSuccessful = false;
break;
}
sourceFile.cdLabel = nav.GetAttribute("cdlabel", string.Empty);
}
customStartingSourcePath = resolvedPath;
}
else
{
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Common.getSetupStatusColor(Common.EXECUTION_STATUS.FAILURE);
textProp.wordIndex = 0;
textProp.wordCount = 2;
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
indentation = Common.getIndentation(2);
msg = "\n" + indentation + "- FAILED. Attribute \"startingsourcepath\" specifies an invalid macro in the path. XML node " + nav.OuterXml.Substring(0, nav.OuterXml.IndexOf(">") + 1) + " on line " + ((IXmlLineInfo)nav).LineNumber.ToString();
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
setupSuccessful = false;
break;
}
}
if (setupSuccessful && customStartingSourcePath.Length > 0)
{
// if path is not absolute path
if (!Path.IsPathRooted(customStartingSourcePath) && !Regex.IsMatch(customStartingSourcePath, @"^\{([^\{\}]+)\}", RegexOptions.IgnoreCase))
customStartingSourcePath = Path.GetFullPath(Path.Combine(defaultStartingSourcePath, customStartingSourcePath));
if (!Hardware.IsCdDrive(customStartingSourcePath) && !Directory.Exists(customStartingSourcePath))
{
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Common.getSetupStatusColor(Common.EXECUTION_STATUS.FAILURE);
textProp.wordIndex = 0;
textProp.wordCount = 2;
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
indentation = Common.getIndentation(2);
msg = "\n" + indentation + "- FAILED. Attribute \"startingsourcepath\" specifies a path that does not exist. XML node " + nav.OuterXml.Substring(0, nav.OuterXml.IndexOf(">") + 1) + " on line " + ((IXmlLineInfo)nav).LineNumber.ToString();
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
setupSuccessful = false;
break;
}
}
// match macro defined in the value of they key, macro is in the form of {xxxxx} such as {user_desktop}, {user_temp_folder}, {cd_drive}
regexMatch = Regex.Match(startingDestPath, @"^\{([^\{\}]+)\}.*", RegexOptions.IgnoreCase);
if (regexMatch.Success)
{
if (Common.pathContainsMacro(regexMatch.Groups[0].Value))
{
string resolvedPath = Common.resolveMacroPath(regexMatch.Groups[0].Value);
if (Common.pathContainsCdDriveMacro(regexMatch.Groups[0].Value))
{
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Common.getSetupStatusColor(Common.EXECUTION_STATUS.FAILURE);
textProp.wordIndex = 0;
textProp.wordCount = 2;
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
indentation = Common.getIndentation(2);
msg = "\n" + indentation + "- FAILED. " + regexMatch.Groups[0].Value + " macro is not allowed to be specified for attribute \"startingdestpath\"" + ". XML node " + nav.OuterXml.Substring(0, nav.OuterXml.IndexOf(">") + 1) + " on line " + ((IXmlLineInfo)nav).LineNumber.ToString();
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
setupSuccessful = false;
break;
}
startingDestPath = resolvedPath;
}
else
{
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Common.getSetupStatusColor(Common.EXECUTION_STATUS.FAILURE);
textProp.wordIndex = 0;
textProp.wordCount = 2;
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
indentation = Common.getIndentation(2);
msg = "\n" + indentation + "- FAILED. Attribute \"startingdestpath\" specifies an invalid macro in the path. XML node " + nav.OuterXml.Substring(0, nav.OuterXml.IndexOf(">") + 1) + " on line " + ((IXmlLineInfo)nav).LineNumber.ToString();
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
setupSuccessful = false;
break;
}
}
// if path is not absolute path
else if (startingDestPath.Length > 0 && !Path.IsPathRooted(startingDestPath))
startingDestPath = Path.GetFullPath(Path.Combine(defaultStartingSourcePath, startingDestPath));
if (!Directory.Exists(startingDestPath))
{
if (startingDestPath.Length > 0)
{
if (!PathManip.PathIsWritable(startingDestPath))
setupSuccessful = false;
}
else
setupSuccessful = false;
if (!setupSuccessful)
{
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Common.getSetupStatusColor(Common.EXECUTION_STATUS.FAILURE);
textProp.wordIndex = 0;
textProp.wordCount = 2;
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
indentation = Common.getIndentation(2);
if (startingDestPath.Length == 0)
msg = "\n" + indentation + "- FAILED. Attribute \"startingdestpath\" is missing or has no value. XML node " + nav.OuterXml.Substring(0, nav.OuterXml.IndexOf(">") + 1) + " on line " + ((IXmlLineInfo)nav).LineNumber.ToString();
else
msg = "\n" + indentation + "- FAILED. Attribute \"startingdestpath\" specifies a path that is invalid or not accessible. XML node " + nav.OuterXml.Substring(0, nav.OuterXml.IndexOf(">") + 1) + " on line " + ((IXmlLineInfo)nav).LineNumber.ToString();
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
break;
}
}
if (customStartingSourcePath.Length > 0)
startingSourcePath = customStartingSourcePath;
// move to 3rd level node
if (nav.MoveToFirstChild())
{
m_fileCreatedCount = 0;
m_fileCopyCount = 0;
if (!ProcessXML3rdLevelNodes(nav, defaultStartingSourcePath, startingSourcePath, startingDestPath, sourceFile))
setupSuccessful = false;
// move back to 2nd level node
nav.MoveToParent();
}
if (setupSuccessful)
{
if (!m_filePackageProcessedSuccessful)
m_filePackageProcessedSuccessful = true;
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Common.getSetupStatusColor(Common.EXECUTION_STATUS.SUCCESS);
textProp.wordIndex = 0;
textProp.wordCount = 2;
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
if (m_fileCreatedCount == 0 && m_fileCopyCount == 0)
{
textProp.textColor = Common.getSetupStatusColor(Common.EXECUTION_STATUS.SYSTEM_SKIP);
msg = " - SKIPPED. (Files Created: " + m_fileCreatedCount + " ) " + "(Files Copied: " + m_fileCopyCount + " ) ";
}
else
{
textProp.textColor = Common.getSetupStatusColor(Common.EXECUTION_STATUS.SUCCESS);
msg = " - SUCCESS. (Files Created: " + m_fileCreatedCount + " ) " + "(Files Copied: " + m_fileCopyCount + " ) ";
}
textPropList.Add(textProp);
UpdateStatusDisplayAndLogEvent(msg, "", textPropList);
msg = "\n" + Common.getIndentation(2) + "Total Files Created: " + m_fileCreatedCount + " | Total Files Copied: " + m_fileCopyCount;
UpdateStatusDisplayAndLogEvent("", msg, textPropList);
}
if (!setupSuccessful)
break;
}
} while (nav.MoveToNext()); // move to next software package
}
return setupSuccessful;
}
///===================================================================================
/// ProcessXML3rdLevelNodes
///===================================================================================
/// <summary>
/// Process the child nodes <dircopy></dircopy> of the 3rd level node
/// <software></software> in the XML file.
/// </summary>
/// <param name="nav">navigator object for traversing XML tree</param>
/// <param name="sourceStartingPath"></param>
/// <param name="startingDestPath"></param>
/// <param name="sourceFile"></param>
/// <returns>true if processing node successfully, otherwise false</returns>
///===================================================================================
private bool ProcessXML3rdLevelNodes(XPathNavigator nav, string defaultStartingSourcePath, string startingSourcePath, string startingDestPath, SourceFile sourceFile)
{
bool setupSuccessful = true;
CommonLib.Windows.Forms.TextFormat.TextFontAndColor defaultTextProp = new CommonLib.Windows.Forms.TextFormat.TextFontAndColor("");
CommonLib.Windows.Forms.TextFormat.TextFontAndColor textProp = new CommonLib.Windows.Forms.TextFormat.TextFontAndColor("");
List<CommonLib.Windows.Forms.TextFormat.TextFontAndColor> textPropList = new List<CommonLib.Windows.Forms.TextFormat.TextFontAndColor>();
string msg, indentation = String.Empty, errMsg = "", tempStr = "";
Match regExMatch;
eCopyType copyType = eCopyType.FILES;
do
{
sourceFiles.Clear();
sourceFile.SourcePath = "";
sourceFile.destPath = "";
if (string.Equals(nav.Name, "filescopy", StringComparison.CurrentCultureIgnoreCase))
{
copyType = eCopyType.FILES;
}
else if (string.Equals(nav.Name, "folderscopy", StringComparison.CurrentCultureIgnoreCase))
{
copyType = eCopyType.FOLDERS;
}
else
{
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Common.getSetupStatusColor(Common.EXECUTION_STATUS.FAILURE);
textProp.wordIndex = 0;
textProp.wordCount = 2;
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
indentation = Common.getIndentation(2);
msg = "\n" + indentation + "- FAILED. Invalid tag name specified. XML Node " + nav.OuterXml.Substring(0, nav.OuterXml.IndexOf(">") + 1) + " on line " + ((IXmlLineInfo)nav).LineNumber.ToString();
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
setupSuccessful = false;
break;
}
// do not force sourcedir to be specified to allow user to be able to create a new file at the destination
sourceFile.SourcePath = nav.GetAttribute("sourcedir", string.Empty);
sourceFile.SourcePath = sourceFile.SourcePath.Trim(' ');
// match macro defined in the value of they key, macro is in the form of {xxxxx} such as {user_desktop}, {user_temp_folder}, {cd_drive}
regExMatch = Regex.Match(sourceFile.SourcePath, @"^\{([^\{\}]+)\}.*", RegexOptions.IgnoreCase);
if (string.Equals(sourceFile.SourcePath, "."))
{
if (startingSourcePath.Length > 0)
sourceFile.SourcePath = startingSourcePath;
else
sourceFile.SourcePath = defaultStartingSourcePath;
}
else if (regExMatch.Success)
{
if (Common.pathContainsMacro(regExMatch.Groups[0].Value))
{
string resolvedPath = Common.resolveMacroPath(regExMatch.Groups[0].Value);
if (Common.pathContainsCdDriveMacro(regExMatch.Groups[0].Value))
{
if (resolvedPath.Length == 0)
{
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Common.getSetupStatusColor(Common.EXECUTION_STATUS.FAILURE);
textProp.wordIndex = 0;
textProp.wordCount = 2;
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
indentation = Common.getIndentation(2);
msg = "\n" + indentation + "- FAILED. " + regExMatch.Groups[0].Value + " macro was defined. But no CD drive is found in the system" + ". XML node " + nav.OuterXml.Substring(0, nav.OuterXml.IndexOf(">") + 1) + " on line " + ((IXmlLineInfo)nav).LineNumber.ToString();
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
setupSuccessful = false;
break;
}
}
sourceFile.SourcePath = resolvedPath;
}
else
{
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Common.getSetupStatusColor(Common.EXECUTION_STATUS.FAILURE);
textProp.wordIndex = 0;
textProp.wordCount = 2;
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
indentation = Common.getIndentation(2);
msg = "\n" + indentation + "- FAILED. Attribute \"sourcedir\" specifies an invalid macro in the path. XML node " + nav.OuterXml.Substring(0, nav.OuterXml.IndexOf(">") + 1) + " on line " + ((IXmlLineInfo)nav).LineNumber.ToString();
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
setupSuccessful = false;
break;
}
}
tempStr = nav.GetAttribute("cdlabel", string.Empty);
if (tempStr.Length > 0)
{
sourceFile.cdLabel = tempStr;
}
if (sourceFile.SourcePath.Length > 0)
{
// if path is not absolute path
if (!Path.IsPathRooted(sourceFile.SourcePath))
{
if (startingSourcePath.Length > 0)
{
if (!PathManip.PathContainsAtLeastOneFolder(startingSourcePath))
startingSourcePath = PathManip.AddTrailingSlashToPath(startingSourcePath);
sourceFile.SourcePath = Path.GetFullPath(Path.Combine(startingSourcePath, sourceFile.SourcePath));
}
else
{
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Common.getSetupStatusColor(Common.EXECUTION_STATUS.FAILURE);
textProp.wordIndex = 0;
textProp.wordCount = 2;
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
indentation = Common.getIndentation(2);
msg = "\n" + indentation + "- FAILED. Attribute \"sourcedir\" cannot specify a relative path here since there's no absolute path defined in the parent node. XML node " + nav.OuterXml.Substring(0, nav.OuterXml.IndexOf(">") + 1) + " on line " + ((IXmlLineInfo)nav).LineNumber.ToString();
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
setupSuccessful = false;
break;
}
}
}
if (setupSuccessful && sourceFile.SourcePath.Length > 0 && !Hardware.IsCdDrive(sourceFile.SourcePath) && !Directory.Exists(sourceFile.SourcePath))
{
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Common.getSetupStatusColor(Common.EXECUTION_STATUS.FAILURE);
textProp.wordIndex = 0;
textProp.wordCount = 2;
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
indentation = Common.getIndentation(2);
// the directory exists but the account being used by application is denied access
if (PathManip.DirectoryVisible(sourceFile.SourcePath, ref errMsg))
{
msg = "\n" + indentation + "- FAILED. " + errMsg + ".";
if (PathManip.PathIsNetworkPath(sourceFile.SourcePath))
{
msg += "\n" + indentation + "This error is caused by the fact that this application is run as an account that does not have access privileges to the network path. "
+ "\n" + indentation + "Run this application using an account that is allowed by the network path you're trying to access. XML Node " + nav.OuterXml.Substring(0, nav.OuterXml.IndexOf(">") + 1) + " on line " + ((IXmlLineInfo)nav).LineNumber.ToString();
}
}
else
{
msg = "\n" + indentation + "- FAILED. Attribute \"sourcedir\" specifies a relative/absolute path that does not exist in file system. XML Node " + nav.OuterXml.Substring(0, nav.OuterXml.IndexOf(">") + 1) + " on line " + ((IXmlLineInfo)nav).LineNumber.ToString();
}
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
setupSuccessful = false;
break;
}
sourceFile.destPath = nav.GetAttribute("destdir", string.Empty).TrimEnd('\\');
sourceFile.destPath = sourceFile.destPath.Trim(' ');
// match macro defined in the value of they key, macro is in the form of {xxxxx} such as {user_desktop}, {user_temp_folder}, {cd_drive}
regExMatch = Regex.Match(sourceFile.destPath, @"^\{([^\{\}]+)\}.*", RegexOptions.IgnoreCase);
if (regExMatch.Success)
{
if (Common.pathContainsMacro(regExMatch.Groups[0].Value))
{
string resolvedPath = Common.resolveMacroPath(regExMatch.Groups[0].Value);
if (Common.pathContainsCdDriveMacro(regExMatch.Groups[0].Value))
{
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Common.getSetupStatusColor(Common.EXECUTION_STATUS.FAILURE);
textProp.wordIndex = 0;
textProp.wordCount = 2;
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
indentation = Common.getIndentation(2);
msg = "\n" + indentation + "- FAILED. " + regExMatch.Groups[0].Value + " macro is not allowed to be specified for attribute \"destdir\"" + ". XML node " + nav.OuterXml.Substring(0, nav.OuterXml.IndexOf(">") + 1) + " on line " + ((IXmlLineInfo)nav).LineNumber.ToString();
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
setupSuccessful = false;
break;
}
sourceFile.destPath = resolvedPath;
}
else
{
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Common.getSetupStatusColor(Common.EXECUTION_STATUS.FAILURE);
textProp.wordIndex = 0;
textProp.wordCount = 2;
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
indentation = Common.getIndentation(2);
msg = "\n" + indentation + "- FAILED. Attribute \"destdir\" specifies an invalid macro in the path. XML node " + nav.OuterXml.Substring(0, nav.OuterXml.IndexOf(">") + 1) + " on line " + ((IXmlLineInfo)nav).LineNumber.ToString();
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
setupSuccessful = false;
break;
}
}
else if (string.Equals(sourceFile.destPath, "."))
{
if (startingDestPath.Length > 0)
sourceFile.destPath = startingDestPath;
else
sourceFile.destPath = defaultStartingSourcePath;
}
if (sourceFile.destPath.Length > 0)
{
// if path is not absolute path
if (!Path.IsPathRooted(sourceFile.destPath))
{
if (startingDestPath.Length > 0)
{
string absPathFiltered = sourceFile.destPath;
// remove unwated characters at beginning of relative path
regExMatch = Regex.Match(sourceFile.destPath, @"^[\\\.]+(.+)", RegexOptions.IgnoreCase);
if (regExMatch.Success)
absPathFiltered = regExMatch.Groups[1].Value;
if (!PathManip.PathContainsAtLeastOneFolder(startingDestPath))
startingDestPath = PathManip.AddTrailingSlashToPath(startingDestPath);
sourceFile.destPath = Path.Combine(startingDestPath, absPathFiltered);
}
else
{
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Common.getSetupStatusColor(Common.EXECUTION_STATUS.FAILURE);
textProp.wordIndex = 0;
textProp.wordCount = 2;
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
indentation = Common.getIndentation(2);
msg = "\n" + indentation + "- FAILED. Attribute \"destdir\" cannot specify a relative path here since there's no absolute path defined in the parent node. XML node " + nav.OuterXml.Substring(0, nav.OuterXml.IndexOf(">") + 1) + " on line " + ((IXmlLineInfo)nav).LineNumber.ToString();
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
setupSuccessful = false;
break;
}
}
}
else
{
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Common.getSetupStatusColor(Common.EXECUTION_STATUS.FAILURE);
textProp.wordIndex = 0;
textProp.wordCount = 2;
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
indentation = Common.getIndentation(2);
msg = "\n" + indentation + "- FAILED. Attribute \"destdir\" is missing or has no value in node " + nav.OuterXml.Substring(0, nav.OuterXml.IndexOf(">") + 1) + " on line " + ((IXmlLineInfo)nav).LineNumber.ToString();
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
setupSuccessful = false;
break;
}
sourceFile.masterOverwrite = nav.GetAttribute("overwriteallfiles", string.Empty).TrimEnd('\\');
sourceFile.Recursive = nav.GetAttribute("recursive", string.Empty).TrimEnd('\\');
if (!ProcessXML4thLevelNodes(nav, sourceFile, copyType))
setupSuccessful = false;
// after processing a package, perform file transfer
if (setupSuccessful && sourceFiles.Count > 0)
{
setupSuccessful = processFilePackage();
}
} while (nav.MoveToNext());
return setupSuccessful;
}
///===================================================================================
/// ProcessXML4thLevelNodes
///===================================================================================
/// <summary>
/// Process the child nodes <fileinclude></fileinclude> of the 4th level node
/// <dircopy></dircopy> in the XML file. Get all the files to be built
/// </summary>
/// <param name="nav">navigator object for traversing XML tree</param>
/// <param name="sourceFile"></param>
/// <returns>true if processing node successfully, otherwise false</returns>
///===================================================================================
private bool ProcessXML4thLevelNodes(XPathNavigator nav, SourceFile sourceFile, eCopyType copyType)
{
List<string[,]> fileActions = new List<string[,]>();
List<string[,]> filesSaveAs = new List<string[,]>();
List<string[,]> listOverwriteFiles = new List<string[,]>();
string fileInclude = "", fileExclude = "";
string[,] fileAction = new string[1, 2];
string[,] fileSaveAs = new string[1, 2];
string[,] overwriteFiles = new string[1, 2];
string msg = "", tempMsg = "";
bool setupSuccessful = true;
CommonLib.Windows.Forms.TextFormat.TextFontAndColor defaultTextProp = new CommonLib.Windows.Forms.TextFormat.TextFontAndColor("");
CommonLib.Windows.Forms.TextFormat.TextFontAndColor textProp = new CommonLib.Windows.Forms.TextFormat.TextFontAndColor("");
List<CommonLib.Windows.Forms.TextFormat.TextFontAndColor> textPropList = new List<CommonLib.Windows.Forms.TextFormat.TextFontAndColor>();
string indentation = String.Empty;
if (nav.MoveToFirstChild())
{
// extract all the files and actions for files
do
{
fileAction[0, 0] = "";
fileAction[0, 1] = "";
fileSaveAs[0, 0] = "";
fileSaveAs[0, 1] = "";
overwriteFiles[0, 0] = "";
overwriteFiles[0, 1] = "";
if (string.Equals(nav.Name, "fileinclude", StringComparison.CurrentCultureIgnoreCase))
{
if (nav.Value.Length > 0)
{
if (fileInclude == string.Empty)
fileInclude = nav.Value.Trim();
else if (nav.Value.Trim() == "*.*")
fileInclude = nav.Value.Trim();
else if (fileInclude != "*.*")
fileInclude += "," + nav.Value.Trim();
// check to see if this file needs to be renamed at the destination
overwriteFiles[0, 0] = nav.GetAttribute("overwritefile", string.Empty);
if (overwriteFiles[0, 0].Length > 0)
{
// this is the file
overwriteFiles[0, 1] = nav.Value;
}
if (overwriteFiles[0, 0] != string.Empty && overwriteFiles[0, 1] != string.Empty)
{
listOverwriteFiles.Add(new string[,] { { overwriteFiles[0, 0], overwriteFiles[0, 1] } });
}
if (fileInclude != "*.*")
{
// check to see if this file needs to be renamed at the destination
fileSaveAs[0, 0] = nav.GetAttribute("saveas", string.Empty);
if (fileSaveAs[0, 0].Length > 0)
{
// this is the file
fileSaveAs[0, 1] = nav.Value;
}
}
if (fileSaveAs[0, 0] != string.Empty && fileSaveAs[0, 1] != string.Empty && sourceFile.SourcePath.Length > 0)
filesSaveAs.Add(new string[,] { { fileSaveAs[0, 0], fileSaveAs[0, 1] } });
// as long as the file specified doesn't contain wildcard
if (!Regex.IsMatch(nav.Value, @"\*", RegexOptions.IgnoreCase))
{
// check if there are any actions specified for this file
string attr = nav.GetAttribute("actions", string.Empty);
if (attr.Length > 0)
{
string[] actions = attr.Split(',');
if (actions.Length > 0)
{
foreach (string action in actions)
fileActions.Add(new string[,] { { action, nav.Value } });
}
}
}
}
}
else if (string.Equals(nav.Name, "fileexclude", StringComparison.CurrentCultureIgnoreCase))
{
if (nav.Value.Length > 0)
{
if (fileExclude == string.Empty)
fileExclude += nav.Value;
else
fileExclude += "," + nav.Value;
}
}
} while (nav.MoveToNext());
nav.MoveToParent();
}
Match regExMatch;
string[] filesToExclude = new string[] { };
if (fileExclude.Length > 0)
{
List<string> paths = new List<string>();
string[] files = fileExclude.Split(',');
string[] files2;
foreach (string file in files)
{
regExMatch = Regex.Match(file, @"\*\.[^\*,]+");
if (regExMatch.Success)
{
foreach (var drive in DriveInfo.GetDrives()
.Where(d => d.DriveType == DriveType.CDRom))
{
if (Regex.IsMatch(sourceFile.SourcePath, @"^" + Regex.Escape(PathManip.RemoveTrailingSlashInPath(drive.Name)) + @".*", RegexOptions.IgnoreCase))
{
while (!drive.IsReady || !Directory.Exists(sourceFile.SourcePath))
{
Hardware.OpenCdDrive(drive.Name);
tempMsg = "Please insert a disc";
if (sourceFile.cdLabel.Length > 0)
tempMsg += " labeled \"" + sourceFile.cdLabel + "\"";
tempMsg += " into drive " + drive.Name + " that has the following path:\n" + sourceFile.SourcePath + "\n\n Click OK to proceed";
msg = ((frmSetupStatusDisplay)m_parentForm).displayMessageBox(MessageBoxCustom.PopUpMsgType.OKCANCEL, null,
tempMsg, "Info", -1);
if (String.Equals(msg, "cancel", StringComparison.OrdinalIgnoreCase))
{
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Common.getSetupStatusColor(Common.EXECUTION_STATUS.FAILURE);
textProp.wordIndex = 0;
textProp.wordCount = 2;
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
indentation = Common.getIndentation(2);
msg = "\n" + indentation + "- FAILED. Unable to locate path: " + sourceFile.SourcePath;
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
setupSuccessful = false;
break;
}
}
break;
}
}
if (setupSuccessful)
{
if (copyType == eCopyType.FILES)
{
if (String.Equals(sourceFile.Recursive, "yes", StringComparison.OrdinalIgnoreCase) || String.Equals(sourceFile.Recursive, "true", StringComparison.OrdinalIgnoreCase))
{
files2 = Directory.GetFiles(sourceFile.SourcePath, regExMatch.Value, SearchOption.AllDirectories);
}
else
files2 = Directory.GetFiles(sourceFile.SourcePath, regExMatch.Value, SearchOption.TopDirectoryOnly);
}
else
files2 = Directory.GetFiles(sourceFile.SourcePath, regExMatch.Value, SearchOption.AllDirectories);
paths.AddRange(files2.ToList());
}
}
else
{
paths.Add(sourceFile.SourcePath + @"\" + file);
}
}
filesToExclude = paths.ToArray();
}
string[] filesToInclude = new string[] { };
if (setupSuccessful)
{
// look for wildcard search for files
regExMatch = Regex.Match(fileInclude, @"^\*\.\*$");
// if file to be copied is defined as *.*, then we want to include all files in the source directory
if (regExMatch.Success && sourceFile.SourcePath.Length > 0)
{
foreach (var drive in DriveInfo.GetDrives()
.Where(d => d.DriveType == DriveType.CDRom))
{
if (Regex.IsMatch(sourceFile.SourcePath, @"^" + Regex.Escape(PathManip.RemoveTrailingSlashInPath(drive.Name)) + @".*", RegexOptions.IgnoreCase))
{
while (!drive.IsReady || !Directory.Exists(sourceFile.SourcePath))
{
Hardware.OpenCdDrive(drive.Name);
tempMsg = "Please insert a disc";
if (sourceFile.cdLabel.Length > 0)
tempMsg += " labeled \"" + sourceFile.cdLabel + "\"";
tempMsg += " into drive " + drive.Name + " that has the following path:\n" + sourceFile.SourcePath + "\n\n Click OK to proceed";
msg = ((frmSetupStatusDisplay)m_parentForm).displayMessageBox(MessageBoxCustom.PopUpMsgType.OKCANCEL, null,
tempMsg, "Info", -1);
if (String.Equals(msg, "cancel", StringComparison.OrdinalIgnoreCase))
{
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Common.getSetupStatusColor(Common.EXECUTION_STATUS.FAILURE);
textProp.wordIndex = 0;
textProp.wordCount = 2;
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
indentation = Common.getIndentation(2);
msg = "\n" + indentation + "- FAILED. Unable to locate path: " + sourceFile.SourcePath;
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
setupSuccessful = false;
break;
}
}
break;
}
}
if (setupSuccessful)
{
if (copyType == eCopyType.FOLDERS)
{
filesToInclude = Directory.GetFiles(sourceFile.SourcePath, fileInclude, SearchOption.AllDirectories);
}
else
{
if (String.Equals(sourceFile.Recursive, "yes", StringComparison.OrdinalIgnoreCase) || String.Equals(sourceFile.Recursive, "true", StringComparison.OrdinalIgnoreCase))
{
filesToInclude = Directory.GetFiles(sourceFile.SourcePath, fileInclude, SearchOption.AllDirectories);
}
else
filesToInclude = Directory.GetFiles(sourceFile.SourcePath, fileInclude, SearchOption.TopDirectoryOnly);
// save overwrite file flag
foreach (string[,] overwriteFlag in listOverwriteFiles)
{
// if there's an overwrite flag associated with this file
if (string.Equals(overwriteFlag[0, 1], fileInclude, StringComparison.CurrentCultureIgnoreCase))
{
sourceFile.masterOverwrite = overwriteFlag[0, 0];
break;
}
}
}
}
}
else if (fileInclude.Length > 0) // get the individual files specified in the XML file
{
List<string> paths = new List<string>();
string[] files = fileInclude.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
string[] files2;
foreach (string file in files)
{
regExMatch = Regex.Match(file, @"\*\.[^\*,]+");
if (regExMatch.Success)
{
foreach (var drive in DriveInfo.GetDrives()
.Where(d => d.DriveType == DriveType.CDRom))
{
if (Regex.IsMatch(sourceFile.SourcePath, @"^" + Regex.Escape(PathManip.RemoveTrailingSlashInPath(drive.Name)) + @".*", RegexOptions.IgnoreCase))
{
while (!drive.IsReady || !Directory.Exists(sourceFile.SourcePath))
{
Hardware.OpenCdDrive(drive.Name);
tempMsg = "Please insert a disc";
if (sourceFile.cdLabel.Length > 0)
tempMsg += " labeled \"" + sourceFile.cdLabel + "\"";
tempMsg += " into drive " + drive.Name + " that has the following path:\n" + sourceFile.SourcePath + "\n\n Click OK to proceed";
msg = ((frmSetupStatusDisplay)m_parentForm).displayMessageBox(MessageBoxCustom.PopUpMsgType.OKCANCEL, null,
tempMsg, "Info", -1);
if (String.Equals(msg, "cancel", StringComparison.OrdinalIgnoreCase))
{
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Common.getSetupStatusColor(Common.EXECUTION_STATUS.FAILURE);
textProp.wordIndex = 0;
textProp.wordCount = 2;
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
indentation = Common.getIndentation(2);
msg = "\n" + indentation + "- FAILED. Unable to locate path: " + sourceFile.SourcePath;
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
setupSuccessful = false;
break;
}
}
break;
}
}
if (setupSuccessful)
{
if (String.Equals(sourceFile.Recursive, "yes", StringComparison.OrdinalIgnoreCase) || String.Equals(sourceFile.Recursive, "true", StringComparison.OrdinalIgnoreCase))
{
files2 = Directory.GetFiles(sourceFile.SourcePath, regExMatch.Value, SearchOption.AllDirectories);
}
else
files2 = Directory.GetFiles(sourceFile.SourcePath, regExMatch.Value, SearchOption.TopDirectoryOnly);
if (files2.Length > 0)
{
string overwriteFlag = "";
// save overwrite file flag
foreach (string[,] overwriteFlag2 in listOverwriteFiles)
{
// if there's an overwrite flag associated with this file
if (string.Equals(overwriteFlag2[0, 1], file, StringComparison.CurrentCultureIgnoreCase))
{
overwriteFlag = overwriteFlag2[0, 0];
break;
}
}
if (overwriteFlag.Length > 0)
{
for (int i = 0; i < files2.Length; i++)
{
files2[i] += "," + overwriteFlag;
}
}
}
paths.AddRange(files2.ToList());
}
}
else
{
if (sourceFile.SourcePath.Length > 0)
paths.Add(sourceFile.SourcePath + @"\" + file);
else
paths.Add(file);
}
}
filesToInclude = paths.ToArray();
}
}
if (setupSuccessful)
{
if (filesToInclude.Length == 0 && copyType == eCopyType.FOLDERS)
{
foreach (var drive in DriveInfo.GetDrives()
.Where(d => d.DriveType == DriveType.CDRom))
{
if (Regex.IsMatch(sourceFile.SourcePath, @"^" + Regex.Escape(PathManip.RemoveTrailingSlashInPath(drive.Name)) + @".*", RegexOptions.IgnoreCase))
{
while (!drive.IsReady || !Directory.Exists(sourceFile.SourcePath))
{
Hardware.OpenCdDrive(drive.Name);
tempMsg = "Please insert a disc";
if (sourceFile.cdLabel.Length > 0)
tempMsg += " labeled \"" + sourceFile.cdLabel + "\"";
tempMsg += " into drive " + drive.Name + " that has the following path:\n" + sourceFile.SourcePath + "\n\n Click OK to proceed";
msg = ((frmSetupStatusDisplay)m_parentForm).displayMessageBox(MessageBoxCustom.PopUpMsgType.OKCANCEL, null,
tempMsg, "Info", -1);
if (String.Equals(msg, "cancel", StringComparison.OrdinalIgnoreCase))
{
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Common.getSetupStatusColor(Common.EXECUTION_STATUS.FAILURE);
textProp.wordIndex = 0;
textProp.wordCount = 2;
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
indentation = Common.getIndentation(2);
msg = "\n" + indentation + "- FAILED. Unable to locate path: " + sourceFile.SourcePath;
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
setupSuccessful = false;
break;
}
}
break;
}
}
if (setupSuccessful)
filesToInclude = Directory.GetFiles(sourceFile.SourcePath, "*.*", SearchOption.AllDirectories);
}
}
if (setupSuccessful)
{
// remove files that are excluded from build
if (filesToExclude.Length > 0 && filesToInclude.Length > 0 && sourceFile.SourcePath.Length > 0)
{
List<string> filesToIncludeList = filesToInclude.ToList();
List<string> filesToExcludeList = filesToExclude.ToList();
foreach (string excludePath in filesToExcludeList)
{
string pathToRemove = "";
foreach (string includePath in filesToIncludeList)
{
if (Regex.IsMatch(includePath, Regex.Escape(excludePath) + @"(,.+)*", RegexOptions.IgnoreCase))
{
pathToRemove = includePath;
break;
}
}
if (pathToRemove.Length > 0)
{
filesToIncludeList.Remove(pathToRemove);
}
}
filesToInclude = filesToIncludeList.ToArray();
}
}
string baseSourceFolder = sourceFile.SourcePath;
string baseDestFolder = sourceFile.destPath;
if (setupSuccessful)
{
// for each file to be copied, determine if there's an action associated with it
// or that it needs to be renamed, etc
foreach (string file in filesToInclude)
{
string[] fileParts = file.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
sourceFile.FileName = Path.GetFileName(fileParts[0]);
sourceFile.FileNameSaveAs = "";
sourceFile.Actions = new List<eFileAction>();
sourceFile.individualOverwrite = "";
if (sourceFile.masterOverwrite.Length > 0)
sourceFile.individualOverwrite = sourceFile.masterOverwrite;
if (fileParts.Length == 1)
{
// save overwrite file flag
foreach (string[,] overwriteFlag in listOverwriteFiles)
{
// if there's an overwrite flag associated with this file
if (string.Equals(overwriteFlag[0, 1], sourceFile.FileName, StringComparison.CurrentCultureIgnoreCase))
{
sourceFile.individualOverwrite = overwriteFlag[0, 0];
break;
}
}
}
else
{
sourceFile.individualOverwrite = fileParts[1];
}
// save all the actions needed to be perform for this file
foreach (string[,] action in fileActions)
{
// if there's an action associated with this file
if (string.Equals(action[0, 1], sourceFile.FileName, StringComparison.CurrentCultureIgnoreCase))
{
//if (string.Equals(action[0, 0], eFileAction.CreateSWBuildIDEntries.ToString(), StringComparison.CurrentCultureIgnoreCase))
// sourceFile.Actions.Add(eFileAction.CreateSWBuildIDEntries);
//else if (string.Equals(action[0, 0], eFileAction.BuildProjectUsingVS2010Compiler.ToString(), StringComparison.CurrentCultureIgnoreCase))
// sourceFile.Actions.Add(eFileAction.BuildProjectUsingVS2010Compiler);
//else if (string.Equals(action[0, 0], eFileAction.BuildProjectUsingVS2009Compiler.ToString(), StringComparison.CurrentCultureIgnoreCase))
// sourceFile.Actions.Add(eFileAction.BuildProjectUsingVS2009Compiler);
//else if (string.Equals(action[0, 0], eFileAction.BuildProjectInDebug.ToString(), StringComparison.CurrentCultureIgnoreCase))
// sourceFile.Actions.Add(eFileAction.BuildProjectInDebug);
//else if (string.Equals(action[0, 0], eFileAction.BuildProjectInRelease.ToString(), StringComparison.CurrentCultureIgnoreCase))
// sourceFile.Actions.Add(eFileAction.BuildProjectInRelease);
}
}
foreach (string[,] fileRename in filesSaveAs)
{
// if a source file is to be renamed at the destination
if (string.Equals(fileRename[0, 1], sourceFile.FileName, StringComparison.CurrentCultureIgnoreCase) && sourceFile.SourcePath.Length > 0)
{
sourceFile.FileNameSaveAs = fileRename[0, 0];
break;
}
else if (Regex.IsMatch(fileRename[0, 1], @"^\*\.\w+$", RegexOptions.IgnoreCase)) // if the file to be renamed has a wildcard in it
{
regExMatch = Regex.Match(fileRename[0, 1], @".+(\.\w+)$", RegexOptions.IgnoreCase);
if (regExMatch.Success && regExMatch.Groups.Count > 1)
{
string pattern = Regex.Escape(regExMatch.Groups[1].Value) + @"$";
if (Regex.IsMatch(sourceFile.FileName, pattern, RegexOptions.IgnoreCase))
{
sourceFile.FileNameSaveAs = fileRename[0, 0];
break;
}
}
}
}
string fileSourcePath = Path.GetDirectoryName(file);
string regexPattern = Regex.Escape(baseSourceFolder) + @"\\(.+)";
if (copyType == eCopyType.FOLDERS)
{
regExMatch = Regex.Match(fileSourcePath, regexPattern, RegexOptions.IgnoreCase);
if (regExMatch.Success)
{
sourceFile.SourcePath = fileSourcePath;
sourceFile.destPath = baseDestFolder + @"\" + regExMatch.Groups[1].Value;
}
}
else
sourceFile.SourcePath = fileSourcePath;
sourceFiles.Add(sourceFile);
}
}
return setupSuccessful;
}
bool verifyFilePackagesInfo()
{
bool setupSuccessful = true;
ConfigFileManager.Ini_KeyValue<string> iniVal = new ConfigFileManager.Ini_KeyValue<string>("");
string indentation = String.Empty;
string msg;
List<CommonLib.Windows.Forms.TextFormat.TextFontAndColor> textPropList = new List<CommonLib.Windows.Forms.TextFormat.TextFontAndColor>();
for (int i = 0; i < fileTransferPackages.Count; i++)
{
if (fileTransferPackages[i].iniValue.Length == 0)
{
indentation = Common.getIndentation(1);
msg = "\n" + indentation + "- FAILED. "
+ "\n" + indentation + "File: " + ConfigFileManager.ms_configGeneralInfo.pathAndNameOfConfigFile
+ "\n" + indentation + "Section: " + fileTransferPackages[i].iniSectionName
+ "\n" + indentation + "Key: " + fileTransferPackages[i].iniKeyName
+ "\n" + indentation + "Value: " + fileTransferPackages[i].iniValue
+ "\n" + indentation + "Error Description: The value is missing for the above section in the INI file.";
Common.formatConfigIniFailureMessage(msg, textPropList);
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
setupSuccessful = false;
break;
}
else
{
iniVal = fileTransferPackages[i];
iniVal.iniValue = Path.GetFullPath(fileTransferPackages[i].iniValue);
fileTransferPackages[i] = iniVal;
if (!File.Exists(iniVal.iniValue))
{
indentation = Common.getIndentation(1);
msg = "\n" + indentation + "- FAILED. "
+ "\n" + indentation + "File: " + ConfigFileManager.ms_configGeneralInfo.pathAndNameOfConfigFile
+ "\n" + indentation + "Section: " + fileTransferPackages[i].iniSectionName
+ "\n" + indentation + "Key: " + fileTransferPackages[i].iniKeyName
+ "\n" + indentation + "Value: " + fileTransferPackages[i].iniValue
+ "\n" + indentation + "Error Description: The value indicates an invalid path in the above section in the INI file.";
Common.formatConfigIniFailureMessage(msg, textPropList);
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
setupSuccessful = false;
break;
}
}
}
return setupSuccessful;
}
public struct SourceFile
{
public string FileName
{
get;
set;
}
public string FileNameSaveAs
{
get;
set;
}
// specify whether to include files recursively
public string Recursive
{
get;
set;
}
// specify that all files will be overwritten
public string masterOverwrite
{
get;
set;
}
// specify that a particular file will be overwritten
public string individualOverwrite
{
get;
set;
}
public string SourcePath
{
get;
set;
}
public string destPath
{
get;
set;
}
public string cdLabel
{
get;
set;
}
public string SoftwareProduct
{
get;
set;
}
public List<eFileAction> Actions
{
get;
set;
}
public SourceFile(string str)
: this()
{
FileName = "";
FileNameSaveAs = "";
SourcePath = "";
destPath = "";
cdLabel = "";
SoftwareProduct = "";
Recursive = "";
masterOverwrite = "";
individualOverwrite = "";
}
}
}
}