Horizon – Rev 27

Subversion Repositories:
Rev:
using System;
using System.Security.Policy;
using System.Threading;
using System.Windows.Forms;
using System.Windows.Markup;
using Be.Windows.Forms;
using Horizon.Database;
using Horizon.Utilities;
using Serilog;

namespace Horizon.Snapshots
{
    public partial class HexViewForm : Form
    {
        #region Public Events & Delegates

        public event EventHandler<SaveDataEventArgs> SaveData;

        #endregion

        #region Public Methods

        public void UpdateData(byte[] data)
        {
            hexBox1.InvokeIfRequired(hexBox =>
            {
                _originalData = (byte[])data.Clone();

                _dynamicByteProvider = new DynamicByteProvider(data);
                hexBox.ByteProvider = _dynamicByteProvider;
                hexBox.Refresh();
            });
        }

        #endregion

        #region Private Delegates, Events, Enums, Properties, Indexers and Fields

        private readonly SnapshotDatabase _snapshotDatabase;

        private DynamicByteProvider _dynamicByteProvider;
        private byte[] _originalData;
        private string _hash;
        private readonly CancellationToken _cancellationToken;

        #endregion

        #region Constructors, Destructors and Finalizers

        public HexViewForm()
        {
            InitializeComponent();
        }

        public HexViewForm(string hash, SnapshotDatabase snapshotDatabase, CancellationToken cancellationToken) : this()
        {
            _hash = hash;
            _snapshotDatabase = snapshotDatabase;
            _snapshotDatabase.SnapshotDataUpdate += SnapshotDatabaseSnapshotDataUpdate;
            _cancellationToken = cancellationToken;
        }

        /// <summary>
        ///     Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && components != null)
            {
                components.Dispose();
            }

            _snapshotDatabase.SnapshotDataUpdate -= SnapshotDatabaseSnapshotDataUpdate;

            base.Dispose(disposing);
        }

        #endregion

        #region Event Handlers
        private async void HexViewForm_Load(object sender, EventArgs e)
        {
            Utilities.WindowState.FormTracker.Track(this);

            try
            {
                using var memoryStream = await _snapshotDatabase.RetrieveFileStreamAsync(_hash, _cancellationToken);

                if (memoryStream == null)
                {
                    return;
                }

                var data = memoryStream.ToArray();

                _originalData = (byte[])data.Clone();

                _dynamicByteProvider = new DynamicByteProvider(data);
                hexBox1.ByteProvider = _dynamicByteProvider;
            }
            catch (Exception exception)
            {
                Log.Error(exception, "Could not retrieve snapshot data.");
            }
        }
        private void SnapshotDatabaseSnapshotDataUpdate(object sender, SnapshotDataUpdateEventArgs e)
        {
            switch (e)
            {
                case SnapshotDataUpdateSuccessEventArgs snapshotDataUpdateSuccessEventArgs:
                    _hash = snapshotDataUpdateSuccessEventArgs.NewHash;

                    statusStrip1.InvokeIfRequired(statusStrip =>
                    {
                        toolStripProgressBar1.Value = toolStripProgressBar1.Maximum;
                        toolStripStatusLabel1.Text = "Data saved.";
                    });
                    break;
                case SnapshotDataUpdateFailureEventArgs _:
                    statusStrip1.InvokeIfRequired(statusStrip =>
                    {
                        toolStripProgressBar1.Value = toolStripProgressBar1.Minimum;
                        toolStripStatusLabel1.Text = "Could not save data.";
                    });
                    break;
            }
        }

        private void SaveToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (_dynamicByteProvider.HasChanges())
            {
                _dynamicByteProvider.ApplyChanges();

                statusStrip1.InvokeIfRequired(statusStrip =>
                {
                    toolStripProgressBar1.Value = toolStripProgressBar1.Minimum;
                    toolStripStatusLabel1.Text = "Saving.";
                });

                SaveData?.Invoke(this, new SaveDataEventArgs(_hash, _dynamicByteProvider.Bytes.ToArray()));
            }
        }

        private void ReloadToolStripMenuItem_Click(object sender, EventArgs e)
        {
            hexBox1.InvokeIfRequired(hexBox =>
            {
                _dynamicByteProvider = new DynamicByteProvider(_originalData);
                hexBox.ByteProvider = _dynamicByteProvider;
                hexBox.Refresh();
            });
        }

        #endregion


    }
}

Generated by GNU Enscript 1.6.5.90.