discohawk gui lives!!!

This commit is contained in:
zeromus 2011-08-07 03:21:03 +00:00
parent fdacd090db
commit c575c41f23
11 changed files with 1126 additions and 6 deletions

View File

@ -13,6 +13,16 @@ namespace BizHawk.DiscSystem
} }
} }
public class ProgressReport
{
public string Message;
public double ProgressEstimate;
public double ProgressCurrent;
public int TaskCount;
public int TaskCurrent;
public bool CancelSignal;
}
public class DiscHopper public class DiscHopper
{ {
public Disc CurrentDisc; public Disc CurrentDisc;

View File

@ -1,4 +1,5 @@
using System; using System;
using System.Linq;
using System.Text; using System.Text;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System.IO; using System.IO;
@ -7,6 +8,8 @@ using System.Collections.Generic;
//http://www.pctechguide.com/iso-9660-data-format-for-cds-cd-roms-cd-rs-and-cd-rws //http://www.pctechguide.com/iso-9660-data-format-for-cds-cd-roms-cd-rs-and-cd-rws
//http://linux.die.net/man/1/cue2toc //http://linux.die.net/man/1/cue2toc
//http://cdemu.sourceforge.net/project.php#sf
//apparently cdrdao is the ultimate linux tool for doing this stuff but it doesnt support DAO96 (or other DAO modes) that would be necessary to extract P-Q subchannels //apparently cdrdao is the ultimate linux tool for doing this stuff but it doesnt support DAO96 (or other DAO modes) that would be necessary to extract P-Q subchannels
//(cdrdao only supports R-W) //(cdrdao only supports R-W)
@ -312,7 +315,7 @@ namespace BizHawk.DiscSystem
ret.baseName = baseName; ret.baseName = baseName;
ret.disc = this; ret.disc = this;
if (!prefs.OneBinPerTrack) if (!prefs.OneBlobPerTrack)
{ {
//this is the preferred mode of dumping things. we will always write full sectors. //this is the preferred mode of dumping things. we will always write full sectors.
string cue = TOC.GenerateCUE_OneBin(prefs); string cue = TOC.GenerateCUE_OneBin(prefs);
@ -418,9 +421,9 @@ namespace BizHawk.DiscSystem
public class CueBinPrefs public class CueBinPrefs
{ {
/// <summary> /// <summary>
/// Controls general operations: should the output be split into several bins, or just use one? /// Controls general operations: should the output be split into several blobs, or just use one?
/// </summary> /// </summary>
public bool OneBinPerTrack; public bool OneBlobPerTrack;
/// <summary> /// <summary>
/// NOT SUPPORTED YET (just here as a reminder) If choosing OneBinPerTrack, you may wish to write wave files for audio tracks. /// NOT SUPPORTED YET (just here as a reminder) If choosing OneBinPerTrack, you may wish to write wave files for audio tracks.
@ -523,8 +526,22 @@ namespace BizHawk.DiscSystem
public void Dump(string directory, CueBinPrefs prefs) public void Dump(string directory, CueBinPrefs prefs)
{ {
ProgressReport pr = new ProgressReport();
Dump(directory, prefs, pr);
}
public void Dump(string directory, CueBinPrefs prefs, ProgressReport progress)
{
progress.TaskCount = 2;
progress.Message = "Generating Cue";
string cuePath = Path.Combine(directory, baseName + ".cue"); string cuePath = Path.Combine(directory, baseName + ".cue");
File.WriteAllText(cuePath, cue); File.WriteAllText(cuePath, cue);
progress.Message = "Writing bin(s)";
progress.TaskCurrent = 1;
progress.ProgressEstimate = bins.Sum((bfd) => bfd.lbas.Count);
progress.ProgressCurrent = 0;
if(prefs.ReallyDumpBin) if(prefs.ReallyDumpBin)
foreach (var bfd in bins) foreach (var bfd in bins)
{ {
@ -537,6 +554,9 @@ namespace BizHawk.DiscSystem
{ {
for(int i=0;i<bfd.lbas.Count;i++) for(int i=0;i<bfd.lbas.Count;i++)
{ {
if (progress.CancelSignal) return;
progress.ProgressCurrent++;
int lba = bfd.lbas[i]; int lba = bfd.lbas[i];
if (bfd.lba_zeros[i]) if (bfd.lba_zeros[i])
{ {

View File

@ -42,7 +42,7 @@ namespace BizHawk.DiscSystem
public string GenerateCUE_OneBin(CueBinPrefs prefs) public string GenerateCUE_OneBin(CueBinPrefs prefs)
{ {
if (prefs.OneBinPerTrack) throw new InvalidOperationException("OneBinPerTrack passed to GenerateCUE_OneBin"); if (prefs.OneBlobPerTrack) throw new InvalidOperationException("OneBinPerTrack passed to GenerateCUE_OneBin");
//this generates a single-file cue!!!!!!! dont expect it to generate bin-per-track! //this generates a single-file cue!!!!!!! dont expect it to generate bin-per-track!
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
@ -94,6 +94,12 @@ namespace BizHawk.DiscSystem
public List<Session> Sessions = new List<Session>(); public List<Session> Sessions = new List<Session>();
public int length_lba; public int length_lba;
public Cue.CueTimestamp FriendlyLength { get { return new Cue.CueTimestamp(length_lba); } }
public long BinarySize
{
get { return length_lba*2352; }
}
public void AnalyzeLengthsFromIndexLengths() public void AnalyzeLengthsFromIndexLengths()
{ {

View File

@ -17,6 +17,7 @@ namespace BizHawk
{ {
class DiscoHawk class DiscoHawk
{ {
[STAThread]
static void Main(string[] args) static void Main(string[] args)
{ {
new DiscoHawk().Run(args); new DiscoHawk().Run(args);
@ -24,6 +25,19 @@ namespace BizHawk
void Run(string[] args) void Run(string[] args)
{ {
bool gui = false;
foreach (var arg in args)
{
if (arg.ToUpper() == "GUI") gui = true;
}
if (gui)
{
var dialog = new DiscoHawkDialog();
dialog.ShowDialog();
}
return;
//string exedir = BizHawk.MultiClient.PathManager.GetExeDirectoryAbsolute(); //string exedir = BizHawk.MultiClient.PathManager.GetExeDirectoryAbsolute();
//ffMpeg.Converter._ffExe = Path.Combine(exedir, "ffmpeg.exe"); //ffMpeg.Converter._ffExe = Path.Combine(exedir, "ffmpeg.exe");
@ -46,7 +60,6 @@ namespace BizHawk
//prefs.ReallyDumpBin = true; //prefs.ReallyDumpBin = true;
//prefs.AnnotateCue = false; //prefs.AnnotateCue = false;
//prefs.OneBinPerTrack = true; //prefs.OneBinPerTrack = true;
//prefs.PreferPregapCommand = false;
//munged = disc.DumpCueBin("test", prefs); //munged = disc.DumpCueBin("test", prefs);
//munged.Dump("d:\\test", prefs); //munged.Dump("d:\\test", prefs);
//File.WriteAllText("d:\\test\\redump.txt", munged.CreateRedumpReport()); //File.WriteAllText("d:\\test\\redump.txt", munged.CreateRedumpReport());
@ -55,7 +68,6 @@ namespace BizHawk
//disc = Disc.Disc.FromCuePath("d:\\test\\test.cue"); //disc = Disc.Disc.FromCuePath("d:\\test\\test.cue");
//prefs.ReallyDumpBin = false; //prefs.ReallyDumpBin = false;
//prefs.OneBinPerTrack = false; //prefs.OneBinPerTrack = false;
//prefs.PreferPregapCommand = true;
//munged = disc.DumpCueBin("one", prefs); //munged = disc.DumpCueBin("one", prefs);
//munged.Dump("d:\\test", prefs); //munged.Dump("d:\\test", prefs);
@ -82,6 +94,18 @@ namespace BizHawk
// } // }
//} //}
//notes: daemon tools does not like INDEX 00 00:00:00 / INDEX 01 00:00:00 in track 1 (audio track)
//obviously, this is because the lead-in is supposed to be specified. we need to write that out
//DiscSystem.Disc disc = DiscSystem.Disc.FromCuePath("D:\\discs\\Bomberman_'94_Taikenban_(SCD)(JPN)_-_wav'd\\Bomberman '94 Taikenban (SCD)(JPN).cue");
//DiscSystem.Disc disc = DiscSystem.Disc.FromCuePath("D:\\discs\\Syd Mead's Terra Forming [U][CD.SCD][TGXCD1040][Syd Mead][1993][PCE][rigg].cue");
//var prefs = new DiscSystem.CueBinPrefs();
//prefs.AnnotateCue = false;
//prefs.OneBlobPerTrack = true;
//prefs.ReallyDumpBin = true;
//prefs.OmitRedundantIndex0 = true;
//prefs.SingleSession = true;
//var cueBin = disc.DumpCueBin("testroundtrip", prefs);
//cueBin.Dump("d:\\", prefs);
} }
} }

View File

@ -56,5 +56,35 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="DiscoHawk.cs" /> <Compile Include="DiscoHawk.cs" />
<Compile Include="DiscoHawkDialog.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="DiscoHawkDialog.Designer.cs">
<DependentUpon>DiscoHawkDialog.cs</DependentUpon>
</Compile>
<Compile Include="ProgressDialog.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="ProgressDialog.Designer.cs">
<DependentUpon>ProgressDialog.cs</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Data" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="DiscoHawkDialog.resx">
<DependentUpon>DiscoHawkDialog.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="ProgressDialog.resx">
<DependentUpon>ProgressDialog.cs</DependentUpon>
</EmbeddedResource>
</ItemGroup> </ItemGroup>
</Project> </Project>

494
DiscoHawk/DiscoHawkDialog.Designer.cs generated Normal file
View File

@ -0,0 +1,494 @@
namespace BizHawk
{
partial class DiscoHawkDialog
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DiscoHawkDialog));
this.btnAddDisc = new System.Windows.Forms.Button();
this.lvDiscs = new System.Windows.Forms.ListView();
this.columnHeader1 = new System.Windows.Forms.ColumnHeader();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.lblSize = new System.Windows.Forms.Label();
this.lblTracks = new System.Windows.Forms.Label();
this.lblSessions = new System.Windows.Forms.Label();
this.lblSectors = new System.Windows.Forms.Label();
this.label3 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.label1 = new System.Windows.Forms.Label();
this.label4 = new System.Windows.Forms.Label();
this.txtCuePreview = new System.Windows.Forms.TextBox();
this.label5 = new System.Windows.Forms.Label();
this.checkCueProp_OneBlobPerTrack = new System.Windows.Forms.CheckBox();
this.label6 = new System.Windows.Forms.Label();
this.panel1 = new System.Windows.Forms.Panel();
this.panel2 = new System.Windows.Forms.Panel();
this.label7 = new System.Windows.Forms.Label();
this.checkCueProp_Annotations = new System.Windows.Forms.CheckBox();
this.panel3 = new System.Windows.Forms.Panel();
this.label8 = new System.Windows.Forms.Label();
this.checkCueProp_OmitRedundantIndex0 = new System.Windows.Forms.CheckBox();
this.btnPresetCanonical = new System.Windows.Forms.Button();
this.btnPresetDaemonTools = new System.Windows.Forms.Button();
this.groupBox2 = new System.Windows.Forms.GroupBox();
this.label9 = new System.Windows.Forms.Label();
this.treeView1 = new System.Windows.Forms.TreeView();
this.label10 = new System.Windows.Forms.Label();
this.btnExportCue = new System.Windows.Forms.Button();
this.label11 = new System.Windows.Forms.Label();
this.label12 = new System.Windows.Forms.Label();
this.label13 = new System.Windows.Forms.Label();
this.groupBox1.SuspendLayout();
this.tableLayoutPanel1.SuspendLayout();
this.panel1.SuspendLayout();
this.panel2.SuspendLayout();
this.panel3.SuspendLayout();
this.groupBox2.SuspendLayout();
this.SuspendLayout();
//
// btnAddDisc
//
this.btnAddDisc.Location = new System.Drawing.Point(12, 46);
this.btnAddDisc.Name = "btnAddDisc";
this.btnAddDisc.Size = new System.Drawing.Size(75, 23);
this.btnAddDisc.TabIndex = 0;
this.btnAddDisc.Text = "Add Disc";
this.btnAddDisc.UseVisualStyleBackColor = true;
this.btnAddDisc.Click += new System.EventHandler(this.btnAddDisc_Click);
//
// lvDiscs
//
this.lvDiscs.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.columnHeader1});
this.lvDiscs.GridLines = true;
this.lvDiscs.HideSelection = false;
this.lvDiscs.Location = new System.Drawing.Point(12, 80);
this.lvDiscs.Name = "lvDiscs";
this.lvDiscs.Size = new System.Drawing.Size(248, 165);
this.lvDiscs.TabIndex = 1;
this.lvDiscs.UseCompatibleStateImageBehavior = false;
this.lvDiscs.View = System.Windows.Forms.View.Details;
this.lvDiscs.SelectedIndexChanged += new System.EventHandler(this.lvDiscs_SelectedIndexChanged);
//
// columnHeader1
//
this.columnHeader1.Text = "Name";
this.columnHeader1.Width = 240;
//
// groupBox1
//
this.groupBox1.Controls.Add(this.tableLayoutPanel1);
this.groupBox1.Location = new System.Drawing.Point(21, 251);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Padding = new System.Windows.Forms.Padding(3, 3, 3, 0);
this.groupBox1.Size = new System.Drawing.Size(203, 107);
this.groupBox1.TabIndex = 2;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "Quick Info";
//
// tableLayoutPanel1
//
this.tableLayoutPanel1.ColumnCount = 2;
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel1.Controls.Add(this.lblSize, 0, 3);
this.tableLayoutPanel1.Controls.Add(this.lblTracks, 1, 1);
this.tableLayoutPanel1.Controls.Add(this.lblSessions, 1, 0);
this.tableLayoutPanel1.Controls.Add(this.lblSectors, 1, 2);
this.tableLayoutPanel1.Controls.Add(this.label3, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.label2, 0, 2);
this.tableLayoutPanel1.Controls.Add(this.label1, 0, 1);
this.tableLayoutPanel1.Controls.Add(this.label4, 0, 3);
this.tableLayoutPanel1.Location = new System.Drawing.Point(6, 19);
this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(3, 3, 3, 0);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 5;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tableLayoutPanel1.Size = new System.Drawing.Size(184, 79);
this.tableLayoutPanel1.TabIndex = 3;
//
// lblSize
//
this.lblSize.AutoSize = true;
this.lblSize.Location = new System.Drawing.Point(61, 39);
this.lblSize.Name = "lblSize";
this.lblSize.Size = new System.Drawing.Size(30, 13);
this.lblSize.TabIndex = 7;
this.lblSize.Text = "Size:";
//
// lblTracks
//
this.lblTracks.AutoSize = true;
this.lblTracks.Location = new System.Drawing.Point(61, 13);
this.lblTracks.Name = "lblTracks";
this.lblTracks.Size = new System.Drawing.Size(30, 13);
this.lblTracks.TabIndex = 6;
this.lblTracks.Text = "Size:";
//
// lblSessions
//
this.lblSessions.AutoSize = true;
this.lblSessions.Location = new System.Drawing.Point(61, 0);
this.lblSessions.Name = "lblSessions";
this.lblSessions.Size = new System.Drawing.Size(30, 13);
this.lblSessions.TabIndex = 5;
this.lblSessions.Text = "Size:";
//
// lblSectors
//
this.lblSectors.AutoSize = true;
this.lblSectors.Location = new System.Drawing.Point(61, 26);
this.lblSectors.Name = "lblSectors";
this.lblSectors.Size = new System.Drawing.Size(30, 13);
this.lblSectors.TabIndex = 4;
this.lblSectors.Text = "Size:";
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(3, 0);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(52, 13);
this.label3.TabIndex = 2;
this.label3.Text = "Sessions:";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(3, 26);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(46, 13);
this.label2.TabIndex = 1;
this.label2.Text = "Sectors:";
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(3, 13);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(43, 13);
this.label1.TabIndex = 0;
this.label1.Text = "Tracks:";
//
// label4
//
this.label4.AutoSize = true;
this.label4.Location = new System.Drawing.Point(3, 39);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(30, 13);
this.label4.TabIndex = 3;
this.label4.Text = "Size:";
//
// txtCuePreview
//
this.txtCuePreview.Font = new System.Drawing.Font("Courier New", 8F);
this.txtCuePreview.Location = new System.Drawing.Point(284, 25);
this.txtCuePreview.Multiline = true;
this.txtCuePreview.Name = "txtCuePreview";
this.txtCuePreview.ReadOnly = true;
this.txtCuePreview.ScrollBars = System.Windows.Forms.ScrollBars.Both;
this.txtCuePreview.Size = new System.Drawing.Size(375, 571);
this.txtCuePreview.TabIndex = 3;
this.txtCuePreview.WordWrap = false;
//
// label5
//
this.label5.AutoSize = true;
this.label5.Location = new System.Drawing.Point(281, 6);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(102, 13);
this.label5.TabIndex = 4;
this.label5.Text = "Output Cue Preview";
//
// checkCueProp_OneBlobPerTrack
//
this.checkCueProp_OneBlobPerTrack.AutoSize = true;
this.checkCueProp_OneBlobPerTrack.Location = new System.Drawing.Point(7, 6);
this.checkCueProp_OneBlobPerTrack.Name = "checkCueProp_OneBlobPerTrack";
this.checkCueProp_OneBlobPerTrack.Size = new System.Drawing.Size(111, 17);
this.checkCueProp_OneBlobPerTrack.TabIndex = 5;
this.checkCueProp_OneBlobPerTrack.Text = "OneBlobPerTrack";
this.checkCueProp_OneBlobPerTrack.UseVisualStyleBackColor = true;
this.checkCueProp_OneBlobPerTrack.CheckedChanged += new System.EventHandler(this.checkCueProp_CheckedChanged);
//
// label6
//
this.label6.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label6.Location = new System.Drawing.Point(4, 26);
this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(196, 42);
this.label6.TabIndex = 6;
this.label6.Text = "Should the output be split into several blobs, or just use one?";
//
// panel1
//
this.panel1.AutoSize = true;
this.panel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
this.panel1.Controls.Add(this.label6);
this.panel1.Controls.Add(this.checkCueProp_OneBlobPerTrack);
this.panel1.Location = new System.Drawing.Point(15, 19);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(203, 68);
this.panel1.TabIndex = 9;
//
// panel2
//
this.panel2.AutoSize = true;
this.panel2.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
this.panel2.Controls.Add(this.label7);
this.panel2.Controls.Add(this.checkCueProp_Annotations);
this.panel2.Location = new System.Drawing.Point(224, 19);
this.panel2.Name = "panel2";
this.panel2.Size = new System.Drawing.Size(154, 68);
this.panel2.TabIndex = 10;
//
// label7
//
this.label7.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label7.Location = new System.Drawing.Point(4, 26);
this.label7.Name = "label7";
this.label7.Size = new System.Drawing.Size(147, 42);
this.label7.TabIndex = 6;
this.label7.Text = "Annotate cue with non-standard comments";
//
// checkCueProp_Annotations
//
this.checkCueProp_Annotations.AutoSize = true;
this.checkCueProp_Annotations.Location = new System.Drawing.Point(7, 6);
this.checkCueProp_Annotations.Name = "checkCueProp_Annotations";
this.checkCueProp_Annotations.Size = new System.Drawing.Size(82, 17);
this.checkCueProp_Annotations.TabIndex = 5;
this.checkCueProp_Annotations.Text = "Annotations";
this.checkCueProp_Annotations.UseVisualStyleBackColor = true;
this.checkCueProp_Annotations.CheckedChanged += new System.EventHandler(this.checkCueProp_CheckedChanged);
//
// panel3
//
this.panel3.AutoSize = true;
this.panel3.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
this.panel3.Controls.Add(this.label8);
this.panel3.Controls.Add(this.checkCueProp_OmitRedundantIndex0);
this.panel3.Location = new System.Drawing.Point(15, 94);
this.panel3.Name = "panel3";
this.panel3.Size = new System.Drawing.Size(203, 68);
this.panel3.TabIndex = 10;
//
// label8
//
this.label8.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label8.Location = new System.Drawing.Point(4, 26);
this.label8.Name = "label8";
this.label8.Size = new System.Drawing.Size(196, 42);
this.label8.TabIndex = 6;
this.label8.Text = "Should the output be split into several blobs, or just use one?";
//
// checkCueProp_OmitRedundantIndex0
//
this.checkCueProp_OmitRedundantIndex0.AutoSize = true;
this.checkCueProp_OmitRedundantIndex0.Location = new System.Drawing.Point(7, 6);
this.checkCueProp_OmitRedundantIndex0.Name = "checkCueProp_OmitRedundantIndex0";
this.checkCueProp_OmitRedundantIndex0.Size = new System.Drawing.Size(132, 17);
this.checkCueProp_OmitRedundantIndex0.TabIndex = 5;
this.checkCueProp_OmitRedundantIndex0.Text = "OmitRedundantIndex0";
this.checkCueProp_OmitRedundantIndex0.UseVisualStyleBackColor = true;
this.checkCueProp_OmitRedundantIndex0.CheckedChanged += new System.EventHandler(this.checkCueProp_CheckedChanged);
//
// btnPresetCanonical
//
this.btnPresetCanonical.Location = new System.Drawing.Point(720, 210);
this.btnPresetCanonical.Name = "btnPresetCanonical";
this.btnPresetCanonical.Size = new System.Drawing.Size(114, 23);
this.btnPresetCanonical.TabIndex = 11;
this.btnPresetCanonical.Text = "BizHawk Canonical";
this.btnPresetCanonical.UseVisualStyleBackColor = true;
this.btnPresetCanonical.Click += new System.EventHandler(this.btnPresetCanonical_Click);
//
// btnPresetDaemonTools
//
this.btnPresetDaemonTools.Location = new System.Drawing.Point(840, 210);
this.btnPresetDaemonTools.Name = "btnPresetDaemonTools";
this.btnPresetDaemonTools.Size = new System.Drawing.Size(115, 23);
this.btnPresetDaemonTools.TabIndex = 12;
this.btnPresetDaemonTools.Text = "Daemon Tools";
this.btnPresetDaemonTools.UseVisualStyleBackColor = true;
this.btnPresetDaemonTools.Click += new System.EventHandler(this.btnPresetDaemonTools_Click);
//
// groupBox2
//
this.groupBox2.Controls.Add(this.panel1);
this.groupBox2.Controls.Add(this.panel2);
this.groupBox2.Controls.Add(this.panel3);
this.groupBox2.Location = new System.Drawing.Point(665, 25);
this.groupBox2.Name = "groupBox2";
this.groupBox2.Size = new System.Drawing.Size(394, 179);
this.groupBox2.TabIndex = 13;
this.groupBox2.TabStop = false;
this.groupBox2.Text = "Cue Export Properties";
//
// label9
//
this.label9.AutoSize = true;
this.label9.Location = new System.Drawing.Point(672, 214);
this.label9.Name = "label9";
this.label9.Size = new System.Drawing.Size(42, 13);
this.label9.TabIndex = 14;
this.label9.Text = "Presets";
//
// treeView1
//
this.treeView1.Location = new System.Drawing.Point(12, 384);
this.treeView1.Name = "treeView1";
this.treeView1.Size = new System.Drawing.Size(239, 225);
this.treeView1.TabIndex = 15;
//
// label10
//
this.label10.AutoSize = true;
this.label10.Location = new System.Drawing.Point(18, 364);
this.label10.Name = "label10";
this.label10.Size = new System.Drawing.Size(137, 13);
this.label10.TabIndex = 16;
this.label10.Text = "tree/list like isobuster (TBD)";
//
// btnExportCue
//
this.btnExportCue.Location = new System.Drawing.Point(665, 335);
this.btnExportCue.Name = "btnExportCue";
this.btnExportCue.Size = new System.Drawing.Size(101, 23);
this.btnExportCue.TabIndex = 17;
this.btnExportCue.Text = "Export Cue+XXX";
this.btnExportCue.UseVisualStyleBackColor = true;
this.btnExportCue.Click += new System.EventHandler(this.btnExportCue_Click);
//
// label11
//
this.label11.Location = new System.Drawing.Point(677, 251);
this.label11.Name = "label11";
this.label11.Size = new System.Drawing.Size(297, 81);
this.label11.TabIndex = 18;
this.label11.Text = resources.GetString("label11.Text");
//
// label12
//
this.label12.Location = new System.Drawing.Point(93, 5);
this.label12.Name = "label12";
this.label12.Size = new System.Drawing.Size(167, 67);
this.label12.TabIndex = 19;
this.label12.Text = "Why is this a list? Not sure. I thought we might want to make multi-disc archive" +
" format of our own one day. Also disc hopper demo";
//
// label13
//
this.label13.AutoSize = true;
this.label13.Location = new System.Drawing.Point(21, 620);
this.label13.Name = "label13";
this.label13.Size = new System.Drawing.Size(522, 13);
this.label13.TabIndex = 20;
this.label13.Text = "Wouldnt it be cool if you could edit the disc by deleting and moving and adding t" +
"racks and such .. yeahhhhhh";
//
// DiscoHawkDialog
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1151, 645);
this.Controls.Add(this.label13);
this.Controls.Add(this.label12);
this.Controls.Add(this.label11);
this.Controls.Add(this.btnExportCue);
this.Controls.Add(this.label10);
this.Controls.Add(this.treeView1);
this.Controls.Add(this.label9);
this.Controls.Add(this.groupBox2);
this.Controls.Add(this.btnPresetDaemonTools);
this.Controls.Add(this.btnPresetCanonical);
this.Controls.Add(this.label5);
this.Controls.Add(this.txtCuePreview);
this.Controls.Add(this.groupBox1);
this.Controls.Add(this.lvDiscs);
this.Controls.Add(this.btnAddDisc);
this.Name = "DiscoHawkDialog";
this.Text = "DiscoHawkDialog";
this.groupBox1.ResumeLayout(false);
this.tableLayoutPanel1.ResumeLayout(false);
this.tableLayoutPanel1.PerformLayout();
this.panel1.ResumeLayout(false);
this.panel1.PerformLayout();
this.panel2.ResumeLayout(false);
this.panel2.PerformLayout();
this.panel3.ResumeLayout(false);
this.panel3.PerformLayout();
this.groupBox2.ResumeLayout(false);
this.groupBox2.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Button btnAddDisc;
private System.Windows.Forms.ListView lvDiscs;
private System.Windows.Forms.ColumnHeader columnHeader1;
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.Label lblSectors;
private System.Windows.Forms.Label lblSize;
private System.Windows.Forms.Label lblTracks;
private System.Windows.Forms.Label lblSessions;
private System.Windows.Forms.TextBox txtCuePreview;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.CheckBox checkCueProp_OneBlobPerTrack;
private System.Windows.Forms.Label label6;
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.Panel panel2;
private System.Windows.Forms.Label label7;
private System.Windows.Forms.CheckBox checkCueProp_Annotations;
private System.Windows.Forms.Panel panel3;
private System.Windows.Forms.Label label8;
private System.Windows.Forms.CheckBox checkCueProp_OmitRedundantIndex0;
private System.Windows.Forms.Button btnPresetCanonical;
private System.Windows.Forms.Button btnPresetDaemonTools;
private System.Windows.Forms.GroupBox groupBox2;
private System.Windows.Forms.Label label9;
private System.Windows.Forms.TreeView treeView1;
private System.Windows.Forms.Label label10;
private System.Windows.Forms.Button btnExportCue;
private System.Windows.Forms.Label label11;
private System.Windows.Forms.Label label12;
private System.Windows.Forms.Label label13;
}
}

View File

@ -0,0 +1,172 @@
using System;
using System.Threading;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.IO;
using System.Windows.Forms;
using BizHawk.DiscSystem;
namespace BizHawk
{
public partial class DiscoHawkDialog : Form
{
public DiscoHawkDialog()
{
InitializeComponent();
PresetCanonical();
}
private class DiscRecord
{
public Disc Disc;
public string BaseName;
}
private void btnAddDisc_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "CUE files (*.cue)|*.cue|ISO files (*.iso)|*.iso";
ofd.CheckFileExists = true;
ofd.CheckPathExists = true;
ofd.Multiselect = false;
if (ofd.ShowDialog() != DialogResult.OK)
return;
Disc disc = DiscSystem.Disc.FromCuePath(ofd.FileName);
string baseName = Path.GetFileName(ofd.FileName);
ListViewItem lvi = new ListViewItem(baseName);
DiscRecord dr = new DiscRecord();
dr.Disc = disc;
dr.BaseName = baseName;
lvi.Tag = dr;
lvDiscs.SelectedIndices.Clear();
lvDiscs.Items.Add(lvi);
lvDiscs.Items[lvDiscs.Items.Count-1].Selected = true;
}
private void lvDiscs_SelectedIndexChanged(object sender, EventArgs e)
{
UnbindDisc();
if (lvDiscs.SelectedIndices.Count != 0)
{
DiscRecord dr = (DiscRecord) lvDiscs.SelectedItems[0].Tag;
BindDisc(dr);
}
}
void UnbindDisc()
{
btnExportCue.Enabled = false;
lblSessions.Text = "";
lblTracks.Text = "";
lblSectors.Text = "";
lblSize.Text = "";
}
Disc boundDisc;
DiscRecord boundDiscRecord;
void BindDisc(DiscRecord discRecord)
{
Disc disc = discRecord.Disc;
boundDiscRecord = discRecord;
DiscTOC toc = disc.ReadTOC();
boundDisc = disc;
lblSessions.Text = toc.Sessions.Count.ToString();
lblTracks.Text = toc.Sessions.Sum((ses) => ses.Tracks.Count).ToString();
lblSectors.Text = string.Format("{0} ({1})", toc.length_lba, toc.FriendlyLength.Value);
lblSize.Text = string.Format("{0:0.00} MB", toc.BinarySize / 1024.0 / 1024.0);
btnExportCue.Enabled = true;
UpdateCue();
}
void UpdateCue()
{
if (boundDisc == null)
{
txtCuePreview.Text = "";
return;
}
var cueBin = boundDisc.DumpCueBin(boundDiscRecord.BaseName, GetCuePrefs());
txtCuePreview.Text = cueBin.cue.Replace("\n", "\r\n"); ;
}
CueBinPrefs GetCuePrefs()
{
var prefs = new DiscSystem.CueBinPrefs();
prefs.AnnotateCue = checkCueProp_Annotations.Checked;
prefs.OneBlobPerTrack = checkCueProp_OneBlobPerTrack.Checked;
prefs.ReallyDumpBin = false;
prefs.OmitRedundantIndex0 = checkCueProp_OmitRedundantIndex0.Checked;
prefs.SingleSession = true;
return prefs;
}
private void btnPresetCanonical_Click(object sender, EventArgs e)
{
PresetCanonical();
}
void PresetCanonical()
{
checkCueProp_Annotations.Checked = true;
checkCueProp_OmitRedundantIndex0.Checked = false;
checkCueProp_OneBlobPerTrack.Checked = false;
}
private void btnPresetDaemonTools_Click(object sender, EventArgs e)
{
PresetDaemonTools();
}
void PresetDaemonTools()
{
checkCueProp_Annotations.Checked = false;
checkCueProp_OmitRedundantIndex0.Checked = true;
}
private void checkCueProp_CheckedChanged(object sender, EventArgs e)
{
UpdateCue();
}
private void btnExportCue_Click(object sender, EventArgs e)
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "CUE files (*.cue)|*.cue";
sfd.OverwritePrompt = true;
if (sfd.ShowDialog() != DialogResult.OK)
return;
string baseName = Path.GetFileNameWithoutExtension(sfd.FileName);
var prefs = GetCuePrefs();
prefs.ReallyDumpBin = true;
var cueBin = boundDisc.DumpCueBin(baseName, prefs);
ProgressReport pr = new ProgressReport();
Thread workThread = new Thread(() =>
{
cueBin.Dump(Path.GetDirectoryName(sfd.FileName), prefs, pr);
});
ProgressDialog pd = new ProgressDialog(pr);
pd.Show(this);
this.Enabled = false;
workThread.Start();
for (; ; )
{
Application.DoEvents();
Thread.Sleep(10);
if (workThread.ThreadState != ThreadState.Running)
break;
pd.Update();
}
this.Enabled = true;
pd.Dispose();
}
}
}

View File

@ -0,0 +1,123 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="label11.Text" xml:space="preserve">
<value>This stuff is front and center because it is a primary way of visualizing the data. But maybe not later (later it would be tree-and-list). Maybe then all these options and 'output cue preview' will move into another window that pops up when you chooes Export Cue+XXX</value>
</data>
</root>

84
DiscoHawk/ProgressDialog.Designer.cs generated Normal file
View File

@ -0,0 +1,84 @@
namespace BizHawk
{
partial class ProgressDialog
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.progressBar1 = new System.Windows.Forms.ProgressBar();
this.btnCancel = new System.Windows.Forms.Button();
this.lblMessage = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// progressBar1
//
this.progressBar1.Location = new System.Drawing.Point(12, 18);
this.progressBar1.Name = "progressBar1";
this.progressBar1.Size = new System.Drawing.Size(353, 23);
this.progressBar1.TabIndex = 0;
//
// btnCancel
//
this.btnCancel.Location = new System.Drawing.Point(290, 63);
this.btnCancel.Name = "btnCancel";
this.btnCancel.Size = new System.Drawing.Size(75, 23);
this.btnCancel.TabIndex = 1;
this.btnCancel.Text = "Cancel";
this.btnCancel.UseVisualStyleBackColor = true;
this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
//
// lblMessage
//
this.lblMessage.AutoSize = true;
this.lblMessage.Location = new System.Drawing.Point(12, 63);
this.lblMessage.Name = "lblMessage";
this.lblMessage.Size = new System.Drawing.Size(31, 13);
this.lblMessage.TabIndex = 2;
this.lblMessage.Text = "Task";
//
// ProgressDialog
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(377, 98);
this.ControlBox = false;
this.Controls.Add(this.lblMessage);
this.Controls.Add(this.btnCancel);
this.Controls.Add(this.progressBar1);
this.Name = "ProgressDialog";
this.Text = "Progress";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.ProgressBar progressBar1;
private System.Windows.Forms.Button btnCancel;
private System.Windows.Forms.Label lblMessage;
}
}

View File

@ -0,0 +1,37 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace BizHawk
{
public partial class ProgressDialog : Form
{
public ProgressDialog(DiscSystem.ProgressReport pr)
{
InitializeComponent();
this.pr = pr;
}
DiscSystem.ProgressReport pr;
private void btnCancel_Click(object sender, EventArgs e)
{
btnCancel.Enabled = false;
pr.CancelSignal = true;
}
public void Update()
{
double curr = pr.ProgressCurrent;
double max = pr.ProgressEstimate;
double value = curr / max * 100;
progressBar1.Value = (int)value;
lblMessage.Text = pr.Message;
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>