private bool ValidateDirectory(Installation.Directory directory, string directory_path) { if (Directory.Exists(directory_path)) { // process directory present event Installation.Message on_present_message = directory.OnPresentMessage; if (on_present_message != null) { switch (on_present_message.Type) { case ValidationEventEnum.Warn: // add warning WarningMessages.Add(on_present_message.MessageValue); return(true); case ValidationEventEnum.Error: //add error ErrorMessages.Add(on_present_message.MessageValue); return(false); } } // validate known subdirectories foreach (var sub_directory in directory.SubDirectories) { string sub_directory_path = Path.Combine(directory_path, sub_directory.Name); if (!ValidateDirectory(sub_directory, sub_directory_path)) { return(false); } } // validate known files foreach (var file in directory.Files) { string file_path = Path.Combine(directory_path, file.Name); if (!ValidateFile(file, file_path)) { return(false); } } } else { // process diretory missing event Installation.Message on_missing_message = directory.OnMissingMessage; if (on_missing_message != null) { switch (on_missing_message.Type) { case ValidationEventEnum.Warn: // add warning WarningMessages.Add(on_missing_message.MessageValue); break; case ValidationEventEnum.Error: //add error ErrorMessages.Add(on_missing_message.MessageValue); return(false); } } } return(true); }
private bool ValidateFile(Installation.File file, string file_path) { if (File.Exists(file_path)) { // process the file present event Installation.Message on_present_message = file.OnPresentMessage; if (on_present_message != null) { switch (on_present_message.Type) { case ValidationEventEnum.Warn: // add warning WarningMessages.Add(on_present_message.MessageValue); return(true); case ValidationEventEnum.Error: //add error ErrorMessages.Add(on_present_message.MessageValue); return(false); default: throw new Exception("Unknown event type"); } } // open the file and generate an MD5 hash for it string local_md5 = ""; using (FileStream opened_file = File.OpenRead(file_path)) { // error if file could not be opened if ((opened_file == null) || !opened_file.CanRead) { ErrorMessages.Add(String.Format("Failed to open {0} for reading, close all programs before attempting to install", file.Name)); return(false); } local_md5 = MD5Stream(opened_file); if (local_md5 == null) { ErrorMessages.Add(String.Format("Failed to create an MD5 checksum for {0}. Inform the developers of this.", file.Name)); return(false); } } // compare the MD5 hash with all known version foreach (var version in file.Versions) { if (String.Equals(version.MD5, local_md5, StringComparison.CurrentCultureIgnoreCase)) { // process file matches version event Installation.Message on_match_message = version.OnMatchMessage; if (on_match_message != null) { switch (on_match_message.Type) { case ValidationEventEnum.Warn: // add warning WarningMessages.Add(on_match_message.MessageValue); return(true); case ValidationEventEnum.Error: //add error ErrorMessages.Add(on_match_message.MessageValue); return(false); } } } else { // process file differs from version event Installation.Message on_diff_message = version.OnDiffMessage; if (on_diff_message != null) { switch (on_diff_message.Type) { case ValidationEventEnum.Warn: // add warning WarningMessages.Add(on_diff_message.MessageValue); return(true); case ValidationEventEnum.Error: //add error ErrorMessages.Add(on_diff_message.MessageValue); return(false); } } } } } else { // process file missing event Installation.Message on_missing_message = file.OnMissingMessage; if (on_missing_message != null) { switch (on_missing_message.Type) { case ValidationEventEnum.Warn: // add warning WarningMessages.Add(on_missing_message.MessageValue); break; case ValidationEventEnum.Error: //add error ErrorMessages.Add(on_missing_message.MessageValue); return(false); } } } return(true); }