Files
AllPurposeAutoSetup/AllPurposeAutoSetup/GutsConfigFileManager.cs

437 lines
19 KiB
C#

using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
using CommonLib.IO;
using CommonLib.Misc;
using CommonLib.Windows.Forms;
namespace All_Purpose_Auto_Setup
{
class GutsConfigFileManager
{
// 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;
// dictionary that stores key value pair for each entry in the GUTS config file
public List<ConfigFileManager.Ini_KeyValue<string>> gutsConfigEntries = new List<ConfigFileManager.Ini_KeyValue<string>>();
public ConfigFileManager.Ini_KeyValue<string> sm3seekerConfigFile = new ConfigFileManager.Ini_KeyValue<string>("");
public ConfigFileManager.Ini_KeyValue<string> gutsBinariesLocation = new ConfigFileManager.Ini_KeyValue<string>("");
Form m_parentForm;
public GutsConfigFileManager(Form parentForm)
{
m_parentForm = parentForm;
}
public bool processGutsConfigFile(string sectionName)
{
bool setupSuccessful = true;
string msg, errMsg = String.Empty, sourceFile, destFile = "";
string indentation = String.Empty;
bool performFileCopying = 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>();
// 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 = 100;
// 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-=Processing GUTS Config File=-";
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
gutsConfigEntries.Clear();
ConfigFileManager.parseConfigInfo(sectionName, gutsConfigEntries);
readGutsInfo();
setupSuccessful = verifyConfigInfo();
if (setupSuccessful)
{
destFile = PathManip.RemoveTrailingSlashInPath(gutsBinariesLocation.iniValue) + "\\Sm3Seeker.cfg";
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Color.FromArgb(233, 31, 195);
textProp.wordIndex = 1;
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 " + Path.GetFileName(sm3seekerConfigFile.iniValue);
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
performFileCopying = true;
sourceFile = sm3seekerConfigFile.iniValue;
sourceFile = PathManip.GetProperFilePathCapitalization(sourceFile);
if (!File.Exists(sourceFile))
{
msg = " - FAILED. File " + sourceFile + " not found";
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Common.getSetupStatusColor(Common.EXECUTION_STATUS.FAILURE);
textProp.wordIndex = StringManip.GetPhraseWordIndexInText(msg, "FAILED.");
textProp.wordCount = 1;
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
setupSuccessful = false;
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
}
if (File.Exists(destFile) && setupSuccessful)
{
msg = ((frmSetupStatusDisplay)m_parentForm).displayMessageBox(MessageBoxCustom.PopUpMsgType.YESNO, null, "File " + destFile + " already exists.\n\n Would you like to overwrite it?", "Info", -1);
if (String.Equals(msg, "no", StringComparison.OrdinalIgnoreCase))
{
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Common.getSetupStatusColor(Common.EXECUTION_STATUS.USER_SKIP);
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 + "- SKIPPED by user.";
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
performFileCopying = false;
}
}
if (setupSuccessful && performFileCopying)
{
indentation = Common.getIndentation(2);
msg = "\n" + indentation + "- From: " + sourceFile;
msg += "\n" + indentation + "- To: " + destFile;
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = defaultTextProp.textColor;
textProp.wordIndex = StringManip.GetPhraseWordIndexInText(msg, "From:");
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 = defaultTextProp.textColor;
textProp.wordIndex = StringManip.GetPhraseWordIndexInText(msg, "To:");
textProp.wordCount = 1;
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
setupSuccessful = FileManip.CopyFile(Path.GetDirectoryName(sourceFile), sourceFile, Path.GetDirectoryName(destFile), destFile, true, FileAttributes.Normal, ref errMsg);
if (setupSuccessful)
{
// 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);
textPropList.Add(textProp);
indentation = Common.getIndentation(2);
msg = "\n" + indentation + "- SUCCESS.";
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
// set file to read-write access
if (FileManip.SetFileAttributeToReadAndWrite(destFile, ref errMsg))
{
if (gutsConfigEntries.Count > 0)
{
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Color.FromArgb(233, 31, 195);
textProp.wordIndex = 2;
textProp.wordCount = 100;
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
indentation = Common.getIndentation(1);
msg = "\n" + indentation + "Modifying file " + destFile;
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
string delimiter = "[,]";
// first we have to determine the correct keys based on the generic key provided in the INI file
// and add these dynamic keys to the existing dictionary of all the correct keys
foreach (ConfigFileManager.Ini_KeyValue<string> configEntry in gutsConfigEntries)
{
List<string> triplet = new List<string>(configEntry.iniValue.Split(new string[] { delimiter }, StringSplitOptions.RemoveEmptyEntries));
if (triplet.Count > 0)
triplet[0] = triplet[0].Trim();
if (triplet.Count > 1)
triplet[1] = triplet[1].Trim();
if (triplet.Count > 2)
triplet[2] = triplet[2].Trim();
// section, key and value exist
if (triplet.Count == 3 && triplet[0].Length > 0 && triplet[1].Length > 0 && triplet[2].Length > 0)
{
setupSuccessful = modifyGutsConfigFile(destFile, triplet[0], triplet[1], triplet[2]);
if (!setupSuccessful)
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. " + errMsg;
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
setupSuccessful = false;
}
}
}
return setupSuccessful;
}
public bool modifyGutsConfigFile(string configFile, string configSectionName, string configKey, string configValue)
{
bool setupSuccessful = true;
string msg, errMsg = String.Empty;
string indentation = String.Empty;
Dictionary<string, string> gutsSourceFileToDestFile = new Dictionary<string, string>();
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 pattern = @"(section +" + configSectionName + @"(?:(?!\nsection).)*\n" + configKey + @" +)[^;\r\n]+";
string replacement = "${1}" + configValue;
setupSuccessful = FileManip.ReplaceTextInFile(configFile, pattern, replacement, ref errMsg);
indentation = Common.getIndentation(2);
msg = "\n" + indentation + "Setting " + configKey + "=" + configValue + " in section " + configSectionName;
if (setupSuccessful)
{
msg += " - SUCCESS.";
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Common.getSetupStatusColor(Common.EXECUTION_STATUS.SUCCESS);
textProp.wordIndex = StringManip.GetPhraseWordIndexInText(msg, "SUCCESS.");
textProp.wordCount = 1;
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
}
else
{
msg += " - FAILED.";
if (errMsg.Length > 0)
msg += " " + errMsg;
// set font to default text and color
textProp.textFont = defaultTextProp.textFont;
textProp.textColor = Common.getSetupStatusColor(Common.EXECUTION_STATUS.FAILURE);
textProp.wordIndex = StringManip.GetPhraseWordIndexInText(msg, "FAILED.");
textProp.wordCount = 1;
// set font style
textProp.textFont = new Font(textProp.textFont, FontStyle.Bold);
textPropList.Add(textProp);
setupSuccessful = false;
}
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
return setupSuccessful;
}
public void readGutsInfo()
{
string[] keyDataPair;
Dictionary<string, string> keyAndValuePair = new Dictionary<string, string>();
string sectionName;
string[] sectionData;
sectionName = ConfigFileManager.enum_INI_SECTION_NAMES.GUTS_Info.ToString();
sectionData = ConfigFileManager.ms_configGeneralInfo.iniFile.ReadSectionData(sectionName);
gutsBinariesLocation.iniKeyName = "Guts_Bin_Dir";
gutsBinariesLocation.iniSectionName = sectionName;
sm3seekerConfigFile.iniKeyName = "sm3seeker_config_file";
sm3seekerConfigFile.iniSectionName = sectionName;
foreach (string path in sectionData)
{
keyDataPair = path.Split('=');
if (String.Equals(keyDataPair[0], gutsBinariesLocation.iniKeyName, StringComparison.OrdinalIgnoreCase))
{
if (keyDataPair.Length == 2)
{
gutsBinariesLocation.iniValue = keyDataPair[1];
}
}
else if (String.Equals(keyDataPair[0], sm3seekerConfigFile.iniKeyName, StringComparison.OrdinalIgnoreCase))
{
if (keyDataPair.Length == 2 && keyDataPair[1].Length > 0)
{
sm3seekerConfigFile.iniValue = Path.GetFullPath(keyDataPair[1]);
}
}
}
}
bool verifyConfigInfo()
{
bool setupSuccessful = true;
string indentation = String.Empty;
string msg, tempPath;
List<CommonLib.Windows.Forms.TextFormat.TextFontAndColor> textPropList = new List<CommonLib.Windows.Forms.TextFormat.TextFontAndColor>();
if (gutsBinariesLocation.iniValue.Length == 0)
{
indentation = Common.getIndentation(2);
msg = "\n" + indentation + "- FAILED. "
+ "\n" + indentation + "File: " + ConfigFileManager.ms_configGeneralInfo.pathAndNameOfConfigFile
+ "\n" + indentation + "Section: " + gutsBinariesLocation.iniSectionName
+ "\n" + indentation + "Key: " + gutsBinariesLocation.iniKeyName
+ "\n" + indentation + "Value: " + gutsBinariesLocation.iniValue
+ "\n" + indentation + "Error Description: Either one or a combination of Section, Key, or Value is not defined in the INI file.";
Common.formatConfigIniFailureMessage(msg, textPropList);
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
setupSuccessful = false;
}
else if (sm3seekerConfigFile.iniValue.Length == 0)
{
indentation = Common.getIndentation(2);
msg = "\n" + indentation + "- FAILED. "
+ "\n" + indentation + "File: " + ConfigFileManager.ms_configGeneralInfo.pathAndNameOfConfigFile
+ "\n" + indentation + "Section: " + sm3seekerConfigFile.iniSectionName
+ "\n" + indentation + "Key: " + sm3seekerConfigFile.iniKeyName
+ "\n" + indentation + "Value: " + sm3seekerConfigFile.iniValue
+ "\n" + indentation + "Error Description: Either one or a combination of Section, Key, or Value is not defined in the INI file.";
Common.formatConfigIniFailureMessage(msg, textPropList);
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
setupSuccessful = false;
}
if (setupSuccessful)
{
tempPath = Path.GetFullPath(gutsBinariesLocation.iniValue);
if (!Directory.Exists(gutsBinariesLocation.iniValue))
{
indentation = Common.getIndentation(2);
msg = "\n" + indentation + "- FAILED. "
+ "\n" + indentation + "File: " + ConfigFileManager.ms_configGeneralInfo.pathAndNameOfConfigFile
+ "\n" + indentation + "Section: " + gutsBinariesLocation.iniSectionName
+ "\n" + indentation + "Key: " + gutsBinariesLocation.iniKeyName
+ "\n" + indentation + "Value: " + gutsBinariesLocation.iniValue
+ "\n" + indentation + "Error Description: The path defined in the value above is invalid. Translated path " + tempPath;
Common.formatConfigIniFailureMessage(msg, textPropList);
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
setupSuccessful = false;
}
else
gutsBinariesLocation.iniValue = tempPath;
}
if (setupSuccessful)
{
tempPath = Path.GetFullPath(sm3seekerConfigFile.iniValue); ;
if (!File.Exists(sm3seekerConfigFile.iniValue))
{
indentation = Common.getIndentation(2);
msg = "\n" + indentation + "- FAILED. "
+ "\n" + indentation + "File: " + ConfigFileManager.ms_configGeneralInfo.pathAndNameOfConfigFile
+ "\n" + indentation + "Section: " + sm3seekerConfigFile.iniSectionName
+ "\n" + indentation + "Key: " + sm3seekerConfigFile.iniKeyName
+ "\n" + indentation + "Value: " + sm3seekerConfigFile.iniValue
+ "\n" + indentation + "Error Description: The path defined in the value above is invalid. Translated path " + tempPath;
Common.formatConfigIniFailureMessage(msg, textPropList);
UpdateStatusDisplayAndLogEvent(msg, msg, textPropList);
setupSuccessful = false;
}
else
sm3seekerConfigFile.iniValue = tempPath;
}
return setupSuccessful;
}
}
}