public static void SetDataContainer(DataContainer container) { TimetableStructure.SetData(container.TimetableStructure); App.Data.SetFromContainer(container); }
public static void LoadData(string fpath, Action <RunWorkerCompletedEventArgs> done = null, Action <RunWorkerCompletedEventArgs> onCancel = null, Action <RunWorkerCompletedEventArgs> exception = null, Window owner = null, bool save = true) { BackgroundWorker worker = new BackgroundWorker() { WorkerReportsProgress = true, WorkerSupportsCancellation = true }; worker.Dispose(); //Doesn't do anything Application.Current.Dispatcher.Invoke(() => { string newPath = null; LoadingDialog box = new LoadingDialog("Loading...") { Owner = owner }; SavingMode?mode = null; long skip = 0; MemoryStream mstream = null; BinaryReader reader = null; worker.DoWork += delegate(object sender, DoWorkEventArgs e) { if (!File.Exists(fpath)) { VisualHelpers.ShowErrorBox($"File path {fpath} does not exist.", "File not found!"); RecentFilesRemove(fpath); e.Result = new FileNotFoundException(); return; } mstream = new MemoryStream(File.ReadAllBytes(fpath)); reader = new BinaryReader(mstream); mode = (SavingMode)reader.ReadInt32(); skip = mstream.Position; if (mode == SavingMode.Backup) { if (!save) { VisualHelpers.ShowErrorBox("Backup files cannot be used for this function. Please restore it first."); e.Cancel = true; return; } newPath = SaveFileDialogHelper("Restore Backup"); if (newPath == null) { e.Cancel = true; return; } _ = reader.ReadString(); skip = mstream.Position; } e.Result = Loading.StartLoad(reader, Version.Parse(reader.ReadString()), worker, e); if (worker.CancellationPending) { e.Cancel = true; } }; worker.ProgressChanged += delegate(object sender, ProgressChangedEventArgs e) { box.pbProgressBar.Value = e.ProgressPercentage; box.tbTextBlock.Text = (string)e.UserState; }; worker.RunWorkerCompleted += delegate(object sender, RunWorkerCompletedEventArgs e) { box.Close(); mstream?.Dispose(); reader?.Dispose(); if (e.Cancelled) { onCancel?.Invoke(e); return; } if (e.Result is Exception) { exception?.Invoke(e); return; } if (e.Error != null) { VisualHelpers.ShowErrorBox($"A {e.Error.GetType().Name} error occured: {e.Error.Message}"); return; } if (save) { DataContainer data = (DataContainer)e.Result; SetDataContainer(data); App.Data.UpdateSave(); RegisterOpenFile(mode == SavingMode.Normal ? fpath : newPath); using (FileStream stream = new FileStream(fpath, FileMode.Open)) { stream.Seek(skip, SeekOrigin.Begin); if (mode == SavingMode.Backup) { RestoreBackup(stream, newPath); } } if (mode == SavingMode.Backup) { File.Delete(fpath); } } done?.Invoke(e); }; box.Show(); worker.RunWorkerAsync(); }); }