CreateDiskImageForm.cs 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. using DiskAccessLibrary;
  2. using ISCSIConsole.Mods;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.IO;
  6. using System.Threading;
  7. using System.Windows.Forms;
  8. using static DiskAccessLibrary.Mod.Consts;
  9. namespace ISCSIConsole
  10. {
  11. public partial class CreateDiskImageForm : BaseForm
  12. {
  13. private bool m_isWorking;
  14. private FileDialog _imageFileDialog;
  15. private FileDialog _snapshotFileDialog;
  16. public DiskImage DiskImage { get; private set; }
  17. private bool SnapshotControlEnabled
  18. {
  19. set
  20. {
  21. SnapshotLabel.Enabled = value;
  22. SnapshotTextBox.Enabled = value;
  23. SnapshotButton.Enabled = value;
  24. BlockSizeUpDown.Enabled = value;
  25. KbLabel.Enabled = value;
  26. AheadLabel.Enabled = value;
  27. ImageSizeUpDown.Enabled = !value;
  28. }
  29. }
  30. private bool NoBaseImageControlEnable
  31. {
  32. set
  33. {
  34. ImageFileLabel.Enabled = !value;
  35. ImageFileTextBox.Enabled = !value;
  36. ImageFileButton.Enabled = !value;
  37. ImageSizeUpDown.Enabled = value;
  38. }
  39. }
  40. public CreateDiskImageForm()
  41. {
  42. InitializeComponent();
  43. }
  44. private void CreateDiskImageForm_Shown(object sender, EventArgs e)
  45. {
  46. FormatComboBox.DataSource = Enum.GetValues(typeof(DiskImageFormat));
  47. }
  48. private void FormatComboBox_SelectedIndexChanged(object sender, EventArgs e)
  49. {
  50. var items = new List<DiskImageType>();
  51. switch ((DiskImageFormat)FormatComboBox.SelectedValue)
  52. {
  53. case DiskImageFormat.BlockDifferencingDiskImage:
  54. items.Add(DiskImageType.Differencing);
  55. items.Add(DiskImageType.Dynamic);
  56. SnapshotControlEnabled = true;
  57. _imageFileDialog = new OpenFileDialog
  58. {
  59. CheckFileExists = true,
  60. Filter = "Raw Disk Image (*.img)|*.img"
  61. };
  62. _snapshotFileDialog = new SaveFileDialog
  63. {
  64. Filter = "Block Differencing Disk Image (*.bdd)|*.bdd"
  65. };
  66. break;
  67. case DiskImageFormat.RawDiskImage:
  68. items.Add(DiskImageType.Fixed);
  69. SnapshotControlEnabled = false;
  70. _imageFileDialog = new SaveFileDialog
  71. {
  72. Filter = "Raw Disk Image (*.img)|*.img"
  73. };
  74. break;
  75. case DiskImageFormat.VirtualHardDisk:
  76. items.Add(DiskImageType.Dynamic);
  77. items.Add(DiskImageType.Fixed);
  78. SnapshotControlEnabled = false;
  79. _imageFileDialog = new SaveFileDialog
  80. {
  81. Filter = "VirtualHardDisk File (*.vhd)|*.vhd"
  82. };
  83. break;
  84. default:
  85. throw new ArgumentOutOfRangeException();
  86. }
  87. TypeComboBox.DataSource = items;
  88. }
  89. private void TypeComboBox_SelectedIndexChanged(object sender, EventArgs e)
  90. {
  91. var format = (DiskImageFormat)FormatComboBox.SelectedValue;
  92. if (format == DiskImageFormat.BlockDifferencingDiskImage)
  93. {
  94. switch ((DiskImageType)TypeComboBox.SelectedValue)
  95. {
  96. case DiskImageType.Dynamic:
  97. NoBaseImageControlEnable = true;
  98. break;
  99. default:
  100. NoBaseImageControlEnable = false;
  101. break;
  102. }
  103. }
  104. }
  105. private void ImageFileButton_Click(object sender, EventArgs e)
  106. {
  107. if (_imageFileDialog.ShowDialog() == DialogResult.OK)
  108. {
  109. ImageFileTextBox.Text = _imageFileDialog.FileName;
  110. if ((DiskImageFormat)FormatComboBox.SelectedValue == DiskImageFormat.BlockDifferencingDiskImage)
  111. {
  112. var info = new FileInfo(_imageFileDialog.FileName);
  113. // ReSharper disable once PossibleLossOfFraction
  114. ImageSizeUpDown.Value = info.Length / MegaByte;
  115. BlockSizeUpDown_SelectedItemChanged(null, null);
  116. }
  117. }
  118. }
  119. private void SnapshotButton_Click(object sender, EventArgs e)
  120. {
  121. if (_snapshotFileDialog.ShowDialog() == DialogResult.OK)
  122. {
  123. SnapshotTextBox.Text = _snapshotFileDialog.FileName;
  124. }
  125. }
  126. private void ImageSizeUpDown_ValueChanged(object sender, EventArgs e)
  127. {
  128. UpdateSnapshotInfo();
  129. }
  130. private void BlockSizeUpDown_SelectedItemChanged(object sender, EventArgs e)
  131. {
  132. UpdateSnapshotInfo();
  133. }
  134. private void UpdateSnapshotInfo()
  135. {
  136. var format = (DiskImageFormat)FormatComboBox.SelectedValue;
  137. var type = (DiskImageType)TypeComboBox.SelectedValue;
  138. var blockSize = int.Parse(BlockSizeUpDown.Text) * KiloByte;
  139. if (format == DiskImageFormat.BlockDifferencingDiskImage && type == DiskImageType.Dynamic)
  140. {
  141. AheadLabel.Text =
  142. $"Init Size:{BddInfo.CalcHeaderSize((long)(ImageSizeUpDown.Value * MegaByte), blockSize, out var blocks) / KiloByte:N0} KB" +
  143. $", {blocks:N0} Blocks.";
  144. }
  145. else
  146. {
  147. AheadLabel.Text =
  148. $"Init Size:{BddInfo.CalcHeaderSize(ImageFileTextBox.Text, blockSize, out var blocks) / KiloByte:N0} KB" +
  149. $", {blocks:N0} Blocks.";
  150. }
  151. }
  152. private void btnOK_Click(object sender, EventArgs e)
  153. {
  154. var format = (DiskImageFormat)FormatComboBox.SelectedValue;
  155. var type = (DiskImageType)TypeComboBox.SelectedValue;
  156. var imgPath = ImageFileTextBox.Text;
  157. var imgSize = (long)ImageSizeUpDown.Value * MegaByte;
  158. var snapshotPath = SnapshotTextBox.Text;
  159. var blkSize = int.Parse(BlockSizeUpDown.Text) * KiloByte;
  160. if ((format != DiskImageFormat.BlockDifferencingDiskImage && type != DiskImageType.Dynamic) && imgPath == string.Empty)
  161. {
  162. MessageBox.Show("Please choose image file location", "Error");
  163. return;
  164. }
  165. if (format == DiskImageFormat.BlockDifferencingDiskImage
  166. && string.IsNullOrWhiteSpace(SnapshotTextBox.Text))
  167. {
  168. MessageBox.Show("Please choose snapshot file location", "Error");
  169. return;
  170. }
  171. m_isWorking = true;
  172. new Thread(delegate ()
  173. {
  174. DiskImage diskImage;
  175. try
  176. {
  177. diskImage = DiskImageCreator.CreateImage(format, type, imgPath, imgSize, snapshotPath, blkSize);
  178. }
  179. catch (Exception ex)
  180. {
  181. Invoke((MethodInvoker)delegate
  182. {
  183. MessageBox.Show("Failed to create the disk: " + ex.Message, "Error");
  184. ImageFileTextBox.Enabled = true;
  185. ImageFileButton.Enabled = true;
  186. ImageSizeUpDown.Enabled = true;
  187. btnOK.Enabled = true;
  188. btnCancel.Enabled = true;
  189. });
  190. m_isWorking = false;
  191. return;
  192. }
  193. var isLocked = diskImage.ExclusiveLock();
  194. if (!isLocked)
  195. {
  196. Invoke((MethodInvoker)delegate
  197. {
  198. MessageBox.Show("Cannot lock the disk image for exclusive access", "Error");
  199. ImageFileTextBox.Enabled = true;
  200. ImageFileButton.Enabled = true;
  201. ImageSizeUpDown.Enabled = true;
  202. btnOK.Enabled = true;
  203. btnCancel.Enabled = true;
  204. m_isWorking = false;
  205. });
  206. return;
  207. }
  208. DiskImage = diskImage;
  209. Invoke((MethodInvoker)delegate
  210. {
  211. m_isWorking = false;
  212. DialogResult = DialogResult.OK;
  213. Close();
  214. });
  215. }).Start();
  216. ImageFileTextBox.Enabled = false;
  217. ImageFileButton.Enabled = false;
  218. ImageSizeUpDown.Enabled = false;
  219. btnOK.Enabled = false;
  220. btnCancel.Enabled = false;
  221. }
  222. private void btnCancel_Click(object sender, EventArgs e)
  223. {
  224. DialogResult = DialogResult.Cancel;
  225. Close();
  226. }
  227. private void CreateDiskImageForm_FormClosing(object sender, FormClosingEventArgs e)
  228. {
  229. if (m_isWorking)
  230. {
  231. e.Cancel = true;
  232. MessageBox.Show("Please wait until the creation of the disk image is completed.", "Error");
  233. }
  234. }
  235. }
  236. }