CreateDiskImageForm.cs 9.7 KB

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