예제 #1
0
 public static void SetDataContainer(DataContainer container)
 {
     TimetableStructure.SetData(container.TimetableStructure);
     App.Data.SetFromContainer(container);
 }
예제 #2
0
        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();
            });
        }