
- •VStepanov.CourseWork.First Common.Cs
- •VStepanov.CourseWork.First.Binary BmpInfo.Cs
- •ByteMixer.Cs
- •Relocator.Cs
- •VStepanov.CourseWork.First.Cryptography
- •XorCodec.Cs
- •VStepanov.CourseWork.First.Steganography Steganogram.Cs
- •SteganogramBmp.Cs
- •SteganogramInfo.Cs
- •SteganogramMessage.Cs
- •VStepanov.CourseWork.First.Gui AnimatedForm.Cs
- •FileAddForm.Cs
- •GuiMethods.Cs
- •PasswordRequest.Cs
- •Program.Cs
- •SplashForm.Cs
- •TextAddForm.Cs
- •TextReadForm.Cs
- •Лист регистрации изменений
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
}
}