Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Текст программы.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
102.68 Кб
Скачать

FileAddForm.Cs

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

using VStepanov.CourseWork.First.Steganography;

namespace VStepanov.CourseWork.First.Gui

{

    /// <summary>

    /// Форма, предоставляющая интерфейс для добавления файла в контейнер.

    /// </summary>

    public partial class FileAddForm : Form

    {

        #region Поля

        private System.IO.FileInfo _fileInfo;

        /// <summary>

        /// Стеганограмма, обрабатываемая в данный момент.

        /// </summary>

        public Steganogram Steganogram { get; private set; } 

        #endregion

        #region Конструкторы

        /// <summary>

        /// Конструктор формы добавления файла.

        /// </summary>

        /// <param name="steganogram">Стеганограмма, в которую будет проводиться запись.</param>

        public FileAddForm(Steganogram steganogram)

        {

            InitializeComponent();

            Steganogram = steganogram;

            if (steganogram.Info.HasValue)

            {

                trackBarBits.Value = steganogram.Info.Value.nLastBitsUsing;

            }

            else

            {

                trackBarBits.Value = 2;

            }

            this.Text = Steganogram.ContainerFile.Name;

        } 

        #endregion

        #region Обработчики событий

        /// <summary>

        /// Обработчик нажатия на кнопку записи.

        /// </summary>

        private void buttonWrite_Click(object sender, EventArgs e)

        {

            (Program.MainForm.CurrentForm as AnimatedForm).ContainerWatcher.EnableRaisingEvents = false;

            SteganogramMessage message;

            SteganogramInfo info;

            if (textBoxPassword.Text != String.Empty)

            {

                message = SteganogramMessage.FromFile(_fileInfo, textBoxPassword.Text);

            }

            else

            {

                message = SteganogramMessage.FromFile(_fileInfo);

            }

            info = new SteganogramInfo(message, trackBarBits.Value);

            Steganogram.WriteSteganogramToFile(info, message);

            this.Hide();

            this.Close();

            MessageBox.Show("Сообщение записано в контейнер.\nОбновлённый контейнер находится по прежнему адресу.\n\nИзображение-контейнер готово для передачи.");

            (Program.MainForm.CurrentForm as AnimatedForm).ContainerWatcher.EnableRaisingEvents = true;

        }

        /// <summary>

        /// Обработчик нажатия на кнопку выбора файла.

        /// </summary>

        private void buttonChooseFile_Click(object sender, EventArgs e)

        {

            var result = openFileDialog.ShowDialog();

            if (result != System.Windows.Forms.DialogResult.OK)

            {

                buttonWrite.Enabled = false;

            }

        }

        /// <summary>

        /// Обработчик события "Файл выбран".

        /// </summary>

        private void openFileDialog_FileOk(object sender, CancelEventArgs e)

        {

            buttonWrite.Enabled = true;

            var fileInfo = new System.IO.FileInfo(openFileDialog.FileName);

            if (!IsValidFileSize(fileInfo))

            {

                MessageBox.Show("Размер выбранного файла превышает максимально возможный размер для записи!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);

                return;

            }

            SetNewFileInfo(fileInfo);

        }

        /// <summary>

        /// Обработчик изменения значения переключателя числа последних бит.

        /// </summary>

        private void trackBarBits_ValueChanged(object sender, EventArgs e)

        {

            int limit = Steganogram.GetMessageMaxLength(trackBarBits.Value);

            labelSizeLimit.Text = String.Format("Возможно записать\nфайл размером не более,\nчем {0:f2} Кб.", limit / 1024.0);

            if (_fileInfo != null)

            {

                buttonWrite.Enabled = limit > _fileInfo.Length;

            }

        }

        /// <summary>

        /// Обработка начала перетаскивания.

        /// </summary>

        private void FileAddForm_DragEnter(object sender, DragEventArgs e)

        {

            if (e.Data.GetDataPresent(DataFormats.FileDrop))

            {

                e.Effect = DragDropEffects.Copy;

            }

            else

            {

                e.Effect = DragDropEffects.None;

            }

        }

        /// <summary>

        /// Обработка "сброса" файла на форму.

        /// </summary>

        private void FileAddForm_DragDrop(object sender, DragEventArgs e)

        {

            Array files = (Array)e.Data.GetData(DataFormats.FileDrop);

            if (files != null)

            {

                System.IO.FileInfo fInfo;

                try

                {

                    fInfo = new System.IO.FileInfo(files.GetValue(0).ToString());

                }

                catch (Exception ex)

                {

                    MessageBox.Show(ex.Message, "Ошибка при выборе файла", MessageBoxButtons.OK, MessageBoxIcon.Error);

                    return;

                }

                if (!IsValidFileSize(fInfo))

                {

                    MessageBox.Show("Размер выбранного файла превышает максимально возможный размер для записи!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);

                    return;

                }

                SetNewFileInfo(fInfo);

            }

        }

        #endregion

        #region Прочие методы

        /// <summary>

        /// Устанавливает необходимого кандидата для записи и обновляет интерфейс.

        /// </summary>

        /// <param name="fileInfo">Кандидат на запись.</param>

        private void SetNewFileInfo(System.IO.FileInfo fileInfo)

        {

            if (_fileInfo == null)

            {

                this.AnimateControlSize(new Size(455, 240), TimeSpan.FromMilliseconds(200));

            }

            _fileInfo = fileInfo;

            string labelText = String.Format(

                "Вы выбрали файл {0}\nразмером {1} Кб.", _fileInfo.FullName, fileInfo.Length / 1024

            );

            labelChosenFile.Text = labelText;

        }

        /// <summary>

        /// Проверяет размер файла на допустимость.

        /// </summary>

        /// <param name="fileInfo">Файл для проверки.</param>

        /// <returns>Логическое значение, определяющее, подходит файл или нет.</returns>

        private bool IsValidFileSize(System.IO.FileInfo fileInfo)

        {

            long size = fileInfo.Length;

            return size <= Steganogram.GetMessageMaxLength(trackBarBits.Value);

        }

        #endregion

    }

}