Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
99 commits
Select commit Hold shift + click to select a range
955e5de
GpScanner 2.0
goksenpasli Apr 2, 2023
5294ff0
GpScanner 2.0
goksenpasli Apr 2, 2023
bf62ed6
GpScanner 2.0
goksenpasli Apr 3, 2023
e7fade4
GpScanner 2.0
goksenpasli Apr 4, 2023
ad54551
GpScanner 2.0
goksenpasli Apr 6, 2023
c3eb318
GpScanner 2.0
goksenpasli Apr 7, 2023
8533f45
GpScanner 2.0
goksenpasli Apr 7, 2023
96408e9
GpScanner 2.0
goksenpasli Apr 8, 2023
251b42c
GpScanner 2.0
goksenpasli Apr 9, 2023
f38a128
GpScanner 2.0
goksenpasli Apr 9, 2023
455bbe3
GpScanner 2.0
goksenpasli Apr 10, 2023
25ff202
GpScanner 2.0
goksenpasli Apr 11, 2023
fe9b766
GpScanner 2.0
goksenpasli Apr 11, 2023
503b971
GpScanner 2.0
goksenpasli Apr 11, 2023
f8b2dbc
GpScanner 2.0
goksenpasli Apr 13, 2023
efb91dd
GpScanner 2.0
goksenpasli Apr 14, 2023
6b1904d
GpScanner 2.0
goksenpasli Apr 14, 2023
5a42475
GpScanner 2.0
goksenpasli Apr 15, 2023
f741b89
GpScanner 2.0
goksenpasli Apr 15, 2023
024b605
GpScanner 2.0
goksenpasli Apr 15, 2023
9908ea7
GpScanner 2.0
goksenpasli Apr 16, 2023
96cd206
GpScanner 2.0
goksenpasli Apr 16, 2023
d130086
GpScanner 2.0
goksenpasli Apr 16, 2023
4b6ed20
GpScanner 2.0
goksenpasli Apr 16, 2023
63aea1e
GpScanner 2.0
goksenpasli Apr 17, 2023
f7c5e9d
GpScanner 2.0
goksenpasli Apr 17, 2023
4c13601
GpScanner 2.0
goksenpasli Apr 17, 2023
456b763
GpScanner 2.0
goksenpasli Apr 17, 2023
831e347
GpScanner 2.0
goksenpasli Apr 18, 2023
d37f160
GpScanner 2.0
goksenpasli Apr 18, 2023
17e06cc
GpScanner 2.0
goksenpasli Apr 19, 2023
09a36f0
GpScanner 2.0
goksenpasli Apr 19, 2023
bd7eea3
GpScanner 2.0
goksenpasli Apr 20, 2023
d4077fc
GpScanner 2.0
goksenpasli Apr 21, 2023
00a7170
GpScanner 2.0
goksenpasli Apr 21, 2023
3c629e3
GpScanner 2.0
goksenpasli Apr 22, 2023
f96e985
GpScanner 2.0
goksenpasli Apr 23, 2023
e8dc0d4
GpScanner 2.0
goksenpasli Apr 23, 2023
b8c4c0d
GpScanner 2.0
goksenpasli Apr 23, 2023
0e964ac
GpScanner 2.0
goksenpasli Apr 23, 2023
d9189cb
GpScanner 2.0
goksenpasli Apr 24, 2023
f981793
GpScanner 2.0
goksenpasli Apr 25, 2023
6280b23
GpScanner 2.0
goksenpasli Apr 27, 2023
2ffdcfb
GpScanner 2.0
goksenpasli Apr 28, 2023
f832e1c
GpScanner 2.0
goksenpasli Apr 28, 2023
3aeb2d4
GpScanner 2.0
goksenpasli Apr 29, 2023
4dcf056
GpScanner 2.0
goksenpasli Apr 29, 2023
2afac82
GpScanner 2.0
goksenpasli Apr 30, 2023
93629cc
GpScanner 2.0
goksenpasli Apr 30, 2023
f6e611a
GpScanner 2.0
goksenpasli May 1, 2023
acc5903
GpScanner 2.0
goksenpasli May 1, 2023
6dd48fb
GpScanner 2.0
goksenpasli May 1, 2023
419c99e
GpScanner 2.0
goksenpasli May 2, 2023
d3f9733
GpScanner 2.0
goksenpasli May 3, 2023
76f2d50
GpScanner 2.0
goksenpasli May 3, 2023
372c65c
GpScanner 2.0
goksenpasli May 3, 2023
c6e1fb2
GpScanner 2.0
goksenpasli May 4, 2023
c70b853
GpScanner 2.0
goksenpasli May 5, 2023
a9c910a
GpScanner 2.0
goksenpasli May 5, 2023
1b48fdb
GpScanner 2.0
goksenpasli May 6, 2023
2e9c005
GpScanner 2.0
goksenpasli May 7, 2023
6766a77
GpScanner 2.0
goksenpasli May 7, 2023
93d4e9a
GpScanner 2.0
goksenpasli May 8, 2023
da4cb6d
GpScanner 2.0
goksenpasli May 8, 2023
f799acf
GpScanner 2.0
goksenpasli May 9, 2023
525ef8d
GpScanner 2.0
goksenpasli May 10, 2023
de55cb2
GpScanner 2.0
goksenpasli May 12, 2023
971da70
GpScanner 2.0
goksenpasli May 12, 2023
fc4aab9
GpScanner 2.0
goksenpasli May 13, 2023
3f92de8
GpScanner 2.0
goksenpasli May 13, 2023
5e5df47
GpScanner 2.0
goksenpasli May 14, 2023
e1719ff
GpScanner 2.0
goksenpasli May 14, 2023
5ef9269
GpScanner 2.0
goksenpasli May 15, 2023
bc37775
GpScanner 2.0
goksenpasli May 16, 2023
001bd65
GpScanner 2.0
goksenpasli May 17, 2023
1d7e943
GpScanner 2.0
goksenpasli May 17, 2023
604f77b
GpScanner 2.0
goksenpasli May 18, 2023
80d8f51
GpScanner 2.0
goksenpasli May 19, 2023
39b0ebc
GpScanner 2.0
goksenpasli May 19, 2023
d0c2144
GpScanner 2.0
goksenpasli May 19, 2023
500ae0f
GpScanner 2.0
goksenpasli May 19, 2023
67ddb91
GpScanner 2.0
goksenpasli May 19, 2023
417833b
GpScanner 2.0
goksenpasli May 20, 2023
b475a12
GpScanner 2.0
goksenpasli May 21, 2023
1f9807c
GpScanner 2.0
goksenpasli May 21, 2023
7c86543
GpScanner 2.0
goksenpasli May 21, 2023
35c161b
GpScanner 2.0
goksenpasli May 22, 2023
9d1e8b2
GpScanner 2.0
goksenpasli May 22, 2023
079ef54
GpScanner 2.0
goksenpasli May 22, 2023
5d476d4
GpScanner 2.0
goksenpasli May 23, 2023
85f659e
GpScanner 2.0
goksenpasli May 24, 2023
32067da
GpScanner 2.0
goksenpasli May 24, 2023
d5eb75c
GpScanner 2.0
goksenpasli May 25, 2023
f8b846e
GpScanner 2.0
goksenpasli May 26, 2023
e6a6b86
GpScanner 2.0
goksenpasli May 27, 2023
16b79c9
GpScanner 2.0
goksenpasli May 27, 2023
7c2e4e9
GpScanner 2.0
goksenpasli May 27, 2023
01aab47
GpScanner 2.0
goksenpasli May 27, 2023
8915196
GpScanner 2.0
goksenpasli May 27, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
310 changes: 310 additions & 0 deletions DvdBurner/Burner.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,310 @@
using Extensions;
using IMAPI2;
using IMAPI2FS;
using System;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Forms;
using Application = System.Windows.Application;
using Control = System.Windows.Controls.Control;
using MessageBox = System.Windows.MessageBox;

namespace DvdBurner
{
public class Burner : Control, INotifyPropertyChanged
{
public static readonly DependencyProperty BurnDirectoryProperty = DependencyProperty.Register(
"BurnDirectory",
typeof(string),
typeof(Burner),
new PropertyMetadata(string.Empty));

static Burner() { DefaultStyleKeyProperty.OverrideMetadata(typeof(Burner), new FrameworkPropertyMetadata(typeof(Burner))); }

public Burner()
{
BurnDvd = new RelayCommand<object>(
parameter =>
{
if(Burntask?.IsCompleted == false || Erasetask?.IsCompleted == false)
{
_ = MessageBox.Show(WarnText);
return;
}

dynamic Index;
dynamic recorder = null;
dynamic FolderPath;
dynamic Stream;
Index = 0;
FolderPath = BurnDirectory;
Burntask = Task.Run(
() =>
{
try
{
dynamic g_DiscMaster = new MsftDiscMaster2();
if(g_DiscMaster.Count > 0)
{
dynamic uniqueId;
recorder = new MsftDiscRecorder2();
uniqueId = g_DiscMaster.Item(Index);
recorder.InitializeDiscRecorder(uniqueId);

dynamic FSI;
dynamic Dir;
dynamic dataWriter;

FSI = new MsftFileSystemImage();
Dir = FSI.Root;

dataWriter = new MsftDiscFormat2Data();
dataWriter.Recorder = recorder;
dataWriter.ClientName = AppName;
FSI.VolumeName = CdLabel;
FSI.ChooseImageDefaults(recorder);
dataWriter.Update += new DDiscFormat2DataEvents_UpdateEventHandler(DataWriter_Update);
Dir?.AddTree(FolderPath, false);
dynamic result = FSI.CreateResultImage();
Stream = result?.ImageStream;
dataWriter.ForceOverwrite = true;
dataWriter.Write(Stream);
}
} catch(Exception ex)
{
ActionText = ex.Message;
} finally
{
if(Eject)
{
recorder?.EjectMedia();
}
}
});
},
parameter => Directory.Exists(BurnDirectory) && !string.IsNullOrWhiteSpace(CdLabel) && Directory.EnumerateFiles(BurnDirectory)?.Any() == true);

SelectBurnDir = new RelayCommand<object>(
parameter =>
{
FolderBrowserDialog dialog = new FolderBrowserDialog { Description = "Yazılacak Klasörü Seçin." };
if(dialog.ShowDialog() == DialogResult.OK)
{
BurnDirectory = dialog.SelectedPath;
}
},
parameter => true);

EraseDvd = new RelayCommand<object>(
parameter =>
{
if(Burntask?.IsCompleted == false || Erasetask?.IsCompleted == false)
{
_ = MessageBox.Show(WarnText);
return;
}

Erasetask = Task.Run(
() =>
{
MsftDiscRecorder2 recorder = null;
try
{
dynamic g_DiscMaster = new MsftDiscMaster2();
dynamic uniqueId;
dynamic Index = 0;
MsftDiscFormat2Erase discFormatErase = null;
if(g_DiscMaster.Count > 0)
{
recorder = new MsftDiscRecorder2();
uniqueId = g_DiscMaster.Item(Index);
recorder.InitializeDiscRecorder(uniqueId);
discFormatErase = new MsftDiscFormat2Erase { Recorder = recorder, ClientName = AppName, FullErase = false };
discFormatErase.EraseMedia();
}
} catch(Exception ex)
{
ActionText = ex.Message;
} finally
{
if(Eject)
{
recorder?.EjectMedia();
}
}
});
},
parameter => true);
}

public event PropertyChangedEventHandler PropertyChanged;

public string ActionText
{
get => actionText;

set
{
if(actionText != value)
{
actionText = value;
OnPropertyChanged(nameof(ActionText));
}
}
}

public string BurnDirectory { get => (string)GetValue(BurnDirectoryProperty); set => SetValue(BurnDirectoryProperty, value); }

public RelayCommand<object> BurnDvd { get; }

public string CdLabel
{
get => cdLabel;

set
{
if(cdLabel != value)
{
cdLabel = value;
OnPropertyChanged(nameof(CdLabel));
}
}
}

public bool Eject
{
get => eject;

set
{
if(eject != value)
{
eject = value;
OnPropertyChanged(nameof(Eject));
}
}
}

public RelayCommand<object> EraseDvd { get; }

public bool ProgressIndeterminate
{
get => progressIndeterminate;

set
{
if(progressIndeterminate != value)
{
progressIndeterminate = value;
OnPropertyChanged(nameof(ProgressIndeterminate));
}
}
}

public double ProgressValue
{
get => progressValue;

set
{
if(progressValue != value)
{
progressValue = value;
OnPropertyChanged(nameof(ProgressValue));
}
}
}

public RelayCommand<object> SelectBurnDir { get; }

protected virtual void OnPropertyChanged(string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); }

private const string WarnText = "İşlem Sürüyor. Bitmesini Bekleyin.";

private static Task Burntask;

private static Task Erasetask;

private readonly string AppName = Application.Current?.MainWindow?.Title;

private string actionText;

private string cdLabel = DateTime.Now.ToString();

private bool eject = true;

private bool progressIndeterminate;

private double progressValue;

private void DataWriter_Update(dynamic @object, dynamic progress)
{
try
{
switch((int)progress.CurrentAction)
{
case (int)IMAPI_FORMAT2_DATA_WRITE_ACTION.IMAPI_FORMAT2_DATA_WRITE_ACTION_CALIBRATING_POWER:
ActionText = "Kalibrasyon Gücü (OPC).";
break;

case (int)IMAPI_FORMAT2_DATA_WRITE_ACTION.IMAPI_FORMAT2_DATA_WRITE_ACTION_COMPLETED:
ActionText = "Bitti.";
ProgressIndeterminate = false;
break;

case (int)IMAPI_FORMAT2_DATA_WRITE_ACTION.IMAPI_FORMAT2_DATA_WRITE_ACTION_FINALIZATION:
ProgressIndeterminate = true;
ActionText = "Sonlandırılıyor.";
break;

case (int)IMAPI_FORMAT2_DATA_WRITE_ACTION.IMAPI_FORMAT2_DATA_WRITE_ACTION_FORMATTING_MEDIA:
ActionText = "Medya Biçimlendiriliyor.";
break;

case (int)IMAPI_FORMAT2_DATA_WRITE_ACTION.IMAPI_FORMAT2_DATA_WRITE_ACTION_INITIALIZING_HARDWARE:
ActionText = "Başlatılıyor.";
break;

case (int)IMAPI_FORMAT2_DATA_WRITE_ACTION.IMAPI_FORMAT2_DATA_WRITE_ACTION_VALIDATING_MEDIA:
ActionText = "Medya Doğrulanıyor.";
break;

case (int)IMAPI_FORMAT2_DATA_WRITE_ACTION.IMAPI_FORMAT2_DATA_WRITE_ACTION_VERIFYING:
ActionText = "Veri Doğrulanıyor.";
break;

case (int)IMAPI_FORMAT2_DATA_WRITE_ACTION.IMAPI_FORMAT2_DATA_WRITE_ACTION_WRITING_DATA:
dynamic totalSectors;
dynamic writtenSectors;
dynamic startLba;
dynamic lastWrittenLba;
dynamic percentDone;
totalSectors = progress.SectorCount;
startLba = progress.StartLba;
lastWrittenLba = progress.LastWrittenLba;
writtenSectors = lastWrittenLba - startLba;
percentDone =
FormatPercent(Convert.ToDecimal(writtenSectors) / Convert.ToDecimal(totalSectors));
ActionText = percentDone;
break;

default:
ActionText = "Bilinmeyen İşlem." + progress?.CurrentAction.ToString();
break;
}
} catch(Exception ex)
{
ActionText = $"Hata{ex.Message}";
}
}

private dynamic FormatPercent(dynamic d)
{
ProgressValue = (double)d;
return d.ToString("0%");
}
}
}
Loading