public LaunchManager() {
//the following is needed on linux... the current directory must be the Mono executable, which is bad.
Environment.CurrentDirectory = Path.GetDirectoryName (Assembly.GetExecutingAssembly ().Location);
try {
FormIcon = Icon.FromHandle(Resources.IconSmall.GetHicon());
if (File.Exists(_pathLogFile)) {
File.Delete(_pathLogFile);
}
XmlPreferences prefs = new XmlPreferences();
try {
prefs = _prefsSerializer.Deserialize(_pathPrefsFile, new XmlPreferences());
}
catch (Exception ex) {
Command_Display_Error("Read preferences file", _pathPrefsFile, ex, "Special preferences will be reset");
}
Preferences = prefs;
Logger =
new LoggerConfiguration().WriteTo.File(_pathLogFile, LogEventLevel.Verbose).MinimumLevel.Is(Preferences.MinimumEventLevel).CreateLogger();
AppInfoFactory gameInfoFactory;
gameInfoFactory = !File.Exists(_pathGameInfoAssembly) ? null : PatchingHelper.LoadAppInfoFactory(_pathGameInfoAssembly);
var settings = new XmlSettings();
var history = new XmlHistory();
;
try {
history = _historySerializer.Deserialize(_pathHistoryXml, new XmlHistory());
}
catch (Exception ex) {
Command_Display_Error("Load patching history", _pathHistoryXml, ex,
"If the launcher was terminated unexpectedly last time, it may not be able to recover.");
}
try {
settings = _settingsSerializer.Deserialize(_pathSettings, new XmlSettings());
}
catch (Exception ex) {
Command_Display_Error("Read settings file", _pathSettings, ex, "Patch list and other settings will be reset.");
}
string folderDialogReason = null;
if (settings.BaseFolder == null) {
folderDialogReason = "(no game folder has been specified)";
} else if (!Directory.Exists(settings.BaseFolder)) {
folderDialogReason = "(the previous game folder does not exist)";
}
if (folderDialogReason != null) {
if (!Command_SetGameFolder_Dialog(folderDialogReason)) {
Command_ExitApplication();
}
} else {
BaseFolder = settings.BaseFolder;
}
_home = new guiHome(this) {
Icon = FormIcon
};
var defaultAppInfo = new AppInfo() {
AppName = "No AppInfo.dll",
};
AppInfo = gameInfoFactory?.CreateInfo(new DirectoryInfo(BaseFolder)) ?? defaultAppInfo;
AppInfo.AppVersion = AppInfo.AppVersion ?? "version??";
var icon = TryOpenIcon(AppInfo.IconLocation) ?? _home.Icon.ToBitmap();
ProgramIcon = icon;
Instructions = new DisposingBindingList<PatchInstruction>();
var instructions = new List<XmlInstruction>();
foreach (var xmlPatch in settings.Instructions) {
try {
Command_Direct_AddPatch(xmlPatch.PatchPath, xmlPatch.IsEnabled);
}
catch {
instructions.Add(xmlPatch);
}
}
var patchList = instructions.Select(x => x.PatchPath).Join(Environment.NewLine);
if (patchList.Length > 0) {
Command_Display_Error("Load patches on startup.", patchList);
}
try {
PatchingHelper.RestorePatchedFiles(AppInfo, history.Files);
}
catch (Exception ex) {
Command_Display_Error("Restore files", ex: ex);
}
//File.Delete(_pathHistoryXml);
_home.Closed += (sender, args) => Command_ExitApplication();
_icon = new NotifyIcon {
Icon = FormIcon,
Visible = false,
Text = "Patchwork Launcher",
ContextMenu = new ContextMenu {
MenuItems = {
new MenuItem("Quit", (o, e) => Command_ExitApplication())
}
}
};
File.Delete(_pathHistoryXml);
}
catch (Exception ex) {
Command_Display_Error("Launch the application", ex: ex, message: "The application will now exit.");
Command_ExitApplication();
}
}