diff --git a/CUERipper/CUERipper.csproj b/CUERipper/CUERipper.csproj index 3c51530..b4fec35 100644 --- a/CUERipper/CUERipper.csproj +++ b/CUERipper/CUERipper.csproj @@ -79,6 +79,7 @@ + Form diff --git a/CUERipper/CUERipperConfig.cs b/CUERipper/CUERipperConfig.cs new file mode 100644 index 0000000..2987c45 --- /dev/null +++ b/CUERipper/CUERipperConfig.cs @@ -0,0 +1,103 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Text; +using System.Xml.Serialization; + +namespace CUERipper +{ + [XmlRoot("dictionary")] + public class SerializableDictionary + : Dictionary, IXmlSerializable + { + #region IXmlSerializable Members + public System.Xml.Schema.XmlSchema GetSchema() + { + return null; + } + + public void ReadXml(System.Xml.XmlReader reader) + { + XmlSerializer keySerializer = new XmlSerializer(typeof(TKey)); + XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue)); + + bool wasEmpty = reader.IsEmptyElement; + reader.Read(); + + if (wasEmpty) + return; + + while (reader.NodeType != System.Xml.XmlNodeType.EndElement) + { + reader.ReadStartElement("item"); + + reader.ReadStartElement("key"); + TKey key = (TKey)keySerializer.Deserialize(reader); + reader.ReadEndElement(); + + reader.ReadStartElement("value"); + TValue value = (TValue)valueSerializer.Deserialize(reader); + reader.ReadEndElement(); + + this.Add(key, value); + + reader.ReadEndElement(); + reader.MoveToContent(); + } + reader.ReadEndElement(); + } + + public void WriteXml(System.Xml.XmlWriter writer) + { + XmlSerializer keySerializer = new XmlSerializer(typeof(TKey)); + XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue)); + + foreach (TKey key in this.Keys) + { + writer.WriteStartElement("item"); + + writer.WriteStartElement("key"); + keySerializer.Serialize(writer, key); + writer.WriteEndElement(); + + writer.WriteStartElement("value"); + TValue value = this[key]; + valueSerializer.Serialize(writer, value); + writer.WriteEndElement(); + + writer.WriteEndElement(); + } + } + #endregion + } + + [Serializable] + public class CUERipperConfig + { + public CUERipperConfig() + { + // Iterate through each property and call ResetValue() + foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(this)) + { + property.ResetValue(this); + } + + this.DriveOffsets = new SerializableDictionary(); + } + + internal static XmlSerializer serializer = new XmlSerializer(typeof(CUERipperConfig)); + + [DefaultValue("flac")] + public string DefaultLosslessFormat { get; set; } + + [DefaultValue("mp3")] + public string DefaultLossyFormat { get; set; } + + [DefaultValue("lossy.flac")] + public string DefaultHybridFormat { get; set; } + + public string DefaultDrive { get; set; } + + public SerializableDictionary DriveOffsets { get; set; } + } +} diff --git a/CUERipper/frmCUERipper.Designer.cs b/CUERipper/frmCUERipper.Designer.cs index 4785dd6..bdd1853 100644 --- a/CUERipper/frmCUERipper.Designer.cs +++ b/CUERipper/frmCUERipper.Designer.cs @@ -274,6 +274,7 @@ namespace CUERipper 0, -2147483648}); this.numericWriteOffset.Name = "numericWriteOffset"; + this.numericWriteOffset.ValueChanged += new System.EventHandler(this.numericWriteOffset_ValueChanged); // // lblWriteOffset // diff --git a/CUERipper/frmCUERipper.cs b/CUERipper/frmCUERipper.cs index 194772e..604d66a 100644 --- a/CUERipper/frmCUERipper.cs +++ b/CUERipper/frmCUERipper.cs @@ -15,6 +15,8 @@ using CUETools.Processor.Settings; using CUETools.Ripper; using Freedb; using CUETools.Codecs; +using System.Xml; +using System.Xml.Serialization; namespace CUERipper { @@ -23,21 +25,23 @@ namespace CUERipper private Thread _workThread = null; private StartStop _startStop; private CUEConfig _config; + private CUERipperConfig cueRipperConfig; private CUESheet cueSheet; private DriveInfo selectedDriveInfo; private string _pathOut; - string _defaultLosslessFormat, _defaultLossyFormat, _defaultHybridFormat; private CUEControls.ShellIconMgr m_icon_mgr; - private string defaultDrive; private bool testAndCopy = false; internal CUERipperData data = new CUERipperData(); + public readonly static XmlSerializerNamespaces xmlEmptyNamespaces = new XmlSerializerNamespaces(new XmlQualifiedName[] { XmlQualifiedName.Empty }); + public readonly static XmlWriterSettings xmlEmptySettings = new XmlWriterSettings { Indent = true, OmitXmlDeclaration = true }; public frmCUERipper() { InitializeComponent(); _config = new CUEConfig(); _startStop = new StartStop(); - m_icon_mgr = new CUEControls.ShellIconMgr(); + cueRipperConfig = new CUERipperConfig(); + m_icon_mgr = new CUEControls.ShellIconMgr(); m_icon_mgr.SetExtensionIcon(".flac", Properties.Resources.flac); m_icon_mgr.SetExtensionIcon(".wv", Properties.Resources.wv); m_icon_mgr.SetExtensionIcon(".ape", Properties.Resources.ape); @@ -141,9 +145,6 @@ namespace CUERipper SettingsReader sr = new SettingsReader("CUERipper", "settings.txt", Application.ExecutablePath); _config.Load(sr); - _defaultLosslessFormat = sr.Load("DefaultLosslessFormat") ?? "flac"; - _defaultLossyFormat = sr.Load("DefaultLossyFormat") ?? "mp3"; - _defaultHybridFormat = sr.Load("DefaultHybridFormat") ?? "lossy.flac"; //_config.createEACLOG = sr.LoadBoolean("CreateEACLOG") ?? true; //_config.preserveHTOA = sr.LoadBoolean("PreserveHTOA") ?? false; //_config.createM3U = sr.LoadBoolean("CreateM3U") ?? true; @@ -151,7 +152,19 @@ namespace CUERipper bindingSourceCR.DataSource = data; bnComboBoxDrives.ImageList = m_icon_mgr.ImageList; bnComboBoxFormat.ImageList = m_icon_mgr.ImageList; - SetupControls(); + + try + { + using (TextReader reader = new StringReader(sr.Load("CUERipper"))) + cueRipperConfig = CUERipperConfig.serializer.Deserialize(reader) as CUERipperConfig; + } + catch (Exception ex) + { + System.Diagnostics.Trace.WriteLine(ex.Message); + } + + + SetupControls(); int iFormat, nFormats = sr.LoadInt32("OutputPathUseTemplates", 0, 10) ?? 0; for (iFormat = 0; iFormat < OutputPathUseTemplates.Length; iFormat++) @@ -164,7 +177,6 @@ namespace CUERipper bnComboBoxImage.SelectedIndex = sr.LoadInt32("ComboImage", 0, bnComboBoxImage.Items.Count - 1) ?? 0; trackBarSecureMode.Value = sr.LoadInt32("SecureMode", 0, trackBarSecureMode.Maximum - 1) ?? 1; trackBarSecureMode_Scroll(this, new EventArgs()); - defaultDrive = sr.Load("DefaultDrive"); this.checkBoxTestAndCopy.Checked = this.testAndCopy = sr.LoadBoolean("TestAndCopy") ?? this.testAndCopy; Size SizeIncrement = new Size(sr.LoadInt32("WidthIncrement", 0, null) ?? 0, sr.LoadInt32("HeightIncrement", 0, null) ?? 0); @@ -228,8 +240,10 @@ namespace CUERipper reader.Close(); if (reader.ARName != null) { - int driveOffset; - if (AccurateRipVerify.FindDriveReadOffset(reader.ARName, out driveOffset)) + int driveOffset; + if (cueRipperConfig.DriveOffsets.ContainsKey(reader.ARName)) + reader.DriveOffset = cueRipperConfig.DriveOffsets[reader.ARName]; + else if (AccurateRipVerify.FindDriveReadOffset(reader.ARName, out driveOffset)) reader.DriveOffset = driveOffset; else reader.DriveOffset = 0; @@ -241,7 +255,7 @@ namespace CUERipper data.Drives.RaiseListChangedEvents = true; data.Drives.ResetBindings(); for(int i = 0; i < bnComboBoxDrives.Items.Count; i++) - if ((bnComboBoxDrives.Items[i] as DriveInfo).Path == defaultDrive) + if ((bnComboBoxDrives.Items[i] as DriveInfo).Path == cueRipperConfig.DefaultDrive) bnComboBoxDrives.SelectedIndex = i; _workThread = null; SetupControls(); @@ -824,7 +838,7 @@ namespace CUERipper selectedDriveInfo.drive.Close(); selectedDriveInfo = bnComboBoxDrives.SelectedItem as DriveInfo; - defaultDrive = selectedDriveInfo.Path; + cueRipperConfig.DefaultDrive = selectedDriveInfo.Path; toolStripStatusAr.Enabled = false; toolStripStatusAr.Text = ""; @@ -851,7 +865,8 @@ namespace CUERipper cueSheet.Close(); cueSheet = null; } - numericWriteOffset.Value = selectedDriveInfo.drive.DriveOffset; + + numericWriteOffset.Value = selectedDriveInfo.drive.DriveOffset; try { selectedDriveInfo.drive.Open(selectedDriveInfo.drive.Path[0]); @@ -907,9 +922,6 @@ namespace CUERipper { SettingsWriter sw = new SettingsWriter("CUERipper", "settings.txt", Application.ExecutablePath); _config.Save(sw); - sw.Save("DefaultLosslessFormat", _defaultLosslessFormat); - sw.Save("DefaultLossyFormat", _defaultLossyFormat); - sw.Save("DefaultHybridFormat", _defaultHybridFormat); //sw.Save("CreateEACLOG", _config.createEACLOG); //sw.Save("PreserveHTOA", _config.preserveHTOA); //sw.Save("CreateM3U", _config.createM3U); @@ -925,8 +937,13 @@ namespace CUERipper for (int iFormat = bnComboBoxOutputFormat.Items.Count - 1; iFormat >= OutputPathUseTemplates.Length; iFormat--) sw.Save(string.Format("OutputPathUseTemplate{0}", iFormat - OutputPathUseTemplates.Length), bnComboBoxOutputFormat.Items[iFormat].ToString()); - if (defaultDrive != null) - sw.Save("DefaultDrive", defaultDrive); + using (TextWriter tw = new StringWriter()) + using (XmlWriter xw = XmlTextWriter.Create(tw, xmlEmptySettings)) + { + CUERipperConfig.serializer.Serialize(xw, cueRipperConfig, xmlEmptyNamespaces); + sw.SaveText("CUERipper", tw.ToString()); + } + sw.Close(); } @@ -1084,13 +1101,13 @@ namespace CUERipper switch (SelectedOutputAudioType) { case AudioEncoderType.Lossless: - _defaultLosslessFormat = SelectedOutputAudioFormat; + cueRipperConfig.DefaultLosslessFormat = SelectedOutputAudioFormat; break; case AudioEncoderType.Lossy: - _defaultLossyFormat = SelectedOutputAudioFormat; + cueRipperConfig.DefaultLossyFormat = SelectedOutputAudioFormat; break; case AudioEncoderType.Hybrid: - _defaultHybridFormat = SelectedOutputAudioFormat; + cueRipperConfig.DefaultHybridFormat = SelectedOutputAudioFormat; break; } @@ -1150,13 +1167,13 @@ namespace CUERipper switch (SelectedOutputAudioType) { case AudioEncoderType.Lossless: - select = _defaultLosslessFormat; + select = cueRipperConfig.DefaultLosslessFormat; break; case AudioEncoderType.Lossy: - select = _defaultLossyFormat; + select = cueRipperConfig.DefaultLossyFormat; break; case AudioEncoderType.Hybrid: - select = _defaultHybridFormat; + select = cueRipperConfig.DefaultHybridFormat; break; } data.Formats.RaiseListChangedEvents = true; @@ -1563,6 +1580,14 @@ namespace CUERipper ResizeList(listTracks, Title); ResizeList(listMetadata, columnHeaderValue); } + + private void numericWriteOffset_ValueChanged(object sender, EventArgs e) + { + if (selectedDriveInfo != null && selectedDriveInfo.drive.ARName != null) + { + cueRipperConfig.DriveOffsets[selectedDriveInfo.drive.ARName] = (int)numericWriteOffset.Value; + } + } } internal class BackgroundWorkerArtworkArgs diff --git a/CUERipper/frmCUERipper.resx b/CUERipper/frmCUERipper.resx index f896baf..db2af26 100644 --- a/CUERipper/frmCUERipper.resx +++ b/CUERipper/frmCUERipper.resx @@ -789,7 +789,7 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABy - CQAAAk1TRnQBSQFMAgEBBAEAAdQBAQHUAQEBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo + CQAAAk1TRnQBSQFMAgEBBAEAAdwBAQHcAQEBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo AwABQAMAASADAAEBAQABCAYAAQgYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA @@ -939,7 +939,7 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAY - EgAAAk1TRnQBSQFMAgEBCwEAAdQBAQHUAQEBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo + EgAAAk1TRnQBSQFMAgEBCwEAAdwBAQHcAQEBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo AwABQAMAATADAAEBAQABCAYAAQwYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA