// // Author: // Natalia Portillo claunia@claunia.com // // Copyright (c) 2017, © Claunia.com // // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in // the documentation and/or other materials provided with the distribution. // * Neither the name of the [ORGANIZATION] nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Threading; using Eto.Forms; using Eto.Serialization.Xaml; using osrepodbmgr.Core; using Schemas; namespace osrepodbmgr.Eto { public class dlgMetadata : Dialog { public CICMMetadataType Metadata; ObservableCollection lstKeywords; ObservableCollection lstBarcodes; ObservableCollection lstCategories; ObservableCollection lstSubcategories; ObservableCollection lstLanguages; ObservableCollection lstSystems; ObservableCollection lstArchitectures; ObservableCollection lstDiscs; ObservableCollection lstDisks; ObservableCollection lstBarcodeTypes; ObservableCollection lstLanguageTypes; ObservableCollection lstArchitecturesTypes; ObservableCollection lstFilesForMedia; Thread thdDisc; Thread thdDisk; bool stopped; // TODO: Add the options to edit these fields MagazineType[] magazines; BookType[] books; RequiredOperatingSystemType[] requiredOses; UserManualType[] usermanuals; AdvertisementType[] adverts; LinearMediaType[] linearmedias; PCIType[] pcis; AudioMediaType[] audiomedias; #region XAML UI elements #pragma warning disable 0649 TabPage tabGeneral; TextBox txtDeveloper; TextBox txtPublisher; TextBox txtAuthor; TextBox txtPerformer; TextBox txtName; TextBox txtVersion; StackLayout stkReleaseType; CheckBox chkKnownReleaseType; EnumDropDown cmbReleaseType; DateTimePicker cldReleaseDate; CheckBox chkReleaseDate; TextBox txtPartNumber; TextBox txtSerialNumber; TabPage tabKeywords; TextBox txtNewKeyword; GridView treeKeywords; TabPage tabBarcodes; TextBox txtNewBarcode; ComboBox cmbBarcodes; GridView treeBarcodes; TabPage tabCategories; TextBox txtNewCategory; GridView treeCategories; TextBox txtNewSubcategory; GridView treeSubcategories; TabPage tabLanguages; ComboBox cmbLanguages; GridView treeLanguages; TabPage tabSystems; TextBox txtNewSystem; GridView treeSystems; TabPage tabArchitectures; ComboBox cmbArchitectures; GridView treeArchitectures; TabPage tabDiscs; ComboBox cmbFilesForNewDisc; Button btnAddDisc; GridView treeDiscs; Button btnStopAddDisc; Button btnEditDisc; Button btnClearDiscs; Button btnRemoveDisc; Label lblAddDisc1; ProgressBar prgAddDisc1; Label lblAddDisc2; ProgressBar prgAddDisc2; TabPage tabDisks; ComboBox cmbFilesForNewDisk; Button btnAddDisk; GridView treeDisks; Button btnStopAddDisk; Button btnEditDisk; Button btnClearDisks; Button btnRemoveDisk; Label lblAddDisk1; ProgressBar prgAddDisk1; Label lblAddDisk2; ProgressBar prgAddDisk2; Button btnCancel; Button btnOK; #pragma warning restore 0649 #endregion XAML UI elements public bool Modified; public dlgMetadata() { XamlReader.Load(this); Modified = false; cmbReleaseType = new EnumDropDown(); stkReleaseType.Items.Add(new StackLayoutItem { Control = cmbReleaseType, Expand = true }); lstKeywords = new ObservableCollection(); lstBarcodes = new ObservableCollection(); lstCategories = new ObservableCollection(); lstSubcategories = new ObservableCollection(); lstLanguages = new ObservableCollection(); lstSystems = new ObservableCollection(); lstArchitectures = new ObservableCollection(); lstDiscs = new ObservableCollection(); lstDisks = new ObservableCollection(); treeKeywords.Columns.Add(new GridColumn { DataCell = new TextBoxCell { Binding = Binding.Property(r => r.str) }, HeaderText = "Keyword" }); treeBarcodes.Columns.Add(new GridColumn { DataCell = new TextBoxCell { Binding = Binding.Property(r => r.code) }, HeaderText = "Barcode" }); treeBarcodes.Columns.Add(new GridColumn { DataCell = new TextBoxCell { Binding = Binding.Property(r => r.type).Convert(v => v.ToString()) }, HeaderText = "Type" }); treeCategories.Columns.Add(new GridColumn { DataCell = new TextBoxCell { Binding = Binding.Property(r => r.str) }, HeaderText = "Category" }); treeSubcategories.Columns.Add(new GridColumn { DataCell = new TextBoxCell { Binding = Binding.Property(r => r.str) }, HeaderText = "Subcategory" }); treeLanguages.Columns.Add(new GridColumn { DataCell = new TextBoxCell { Binding = Binding.Property(r => r.str) }, HeaderText = "Language" }); treeSystems.Columns.Add(new GridColumn { DataCell = new TextBoxCell { Binding = Binding.Property(r => r.str) }, HeaderText = "System" }); treeArchitectures.Columns.Add(new GridColumn { DataCell = new TextBoxCell { Binding = Binding.Property(r => r.str) }, HeaderText = "Architecture" }); treeDiscs.Columns.Add(new GridColumn { DataCell = new TextBoxCell { Binding = Binding.Property(r => r.path) }, HeaderText = "File" }); treeDisks.Columns.Add(new GridColumn { DataCell = new TextBoxCell { Binding = Binding.Property(r => r.path) }, HeaderText = "File" }); treeKeywords.DataStore = lstKeywords; treeBarcodes.DataStore = lstBarcodes; treeCategories.DataStore = lstCategories; treeSubcategories.DataStore = lstSubcategories; treeLanguages.DataStore = lstLanguages; treeSystems.DataStore = lstSystems; treeArchitectures.DataStore = lstArchitectures; treeDiscs.DataStore = lstDiscs; treeDisks.DataStore = lstDisks; treeKeywords.AllowMultipleSelection = false; treeBarcodes.AllowMultipleSelection = false; treeCategories.AllowMultipleSelection = false; treeSubcategories.AllowMultipleSelection = false; treeLanguages.AllowMultipleSelection = false; treeSystems.AllowMultipleSelection = false; treeArchitectures.AllowMultipleSelection = false; treeDiscs.AllowMultipleSelection = false; treeDisks.AllowMultipleSelection = false; lstBarcodeTypes = new ObservableCollection(); lstLanguageTypes = new ObservableCollection(); lstArchitecturesTypes = new ObservableCollection(); lstFilesForMedia = new ObservableCollection(); //cmbBarcodes.ItemTextBinding = Binding.Property(r => r.str); cmbBarcodes.DataStore = lstBarcodeTypes; cmbLanguages.DataStore = lstLanguageTypes; cmbArchitectures.DataStore = lstArchitecturesTypes; cmbFilesForNewDisc.DataStore = lstFilesForMedia; cmbFilesForNewDisk.DataStore = lstFilesForMedia; FillBarcodeCombo(); FillLanguagesCombo(); FillArchitecturesCombo(); FillFilesCombos(); } void FillBarcodeCombo() { lstBarcodeTypes.Clear(); foreach(BarcodeTypeType type in Enum.GetValues(typeof(BarcodeTypeType))) lstBarcodeTypes.Add(type.ToString()); } void FillLanguagesCombo() { lstLanguageTypes.Clear(); foreach(LanguagesTypeLanguage type in Enum.GetValues(typeof(LanguagesTypeLanguage))) lstLanguageTypes.Add(type.ToString()); } void FillArchitecturesCombo() { lstArchitecturesTypes.Clear(); foreach(ArchitecturesTypeArchitecture type in Enum.GetValues(typeof(ArchitecturesTypeArchitecture))) lstArchitecturesTypes.Add(type.ToString()); } void FillFilesCombos() { foreach(KeyValuePair files in Context.hashes) lstFilesForMedia.Add(files.Key); } public void FillFields() { if(Metadata == null) return; if(Metadata.Developer != null) { foreach(string developer in Metadata.Developer) { if(!string.IsNullOrWhiteSpace(txtDeveloper.Text)) txtDeveloper.Text += ","; txtDeveloper.Text += developer; } } if(Metadata.Publisher != null) { foreach(string publisher in Metadata.Publisher) { if(!string.IsNullOrWhiteSpace(txtPublisher.Text)) txtPublisher.Text += ","; txtPublisher.Text += publisher; } } if(Metadata.Author != null) { foreach(string author in Metadata.Author) { if(!string.IsNullOrWhiteSpace(txtPublisher.Text)) txtPublisher.Text += ","; txtPublisher.Text += author; } } if(Metadata.Performer != null) { foreach(string performer in Metadata.Performer) { if(!string.IsNullOrWhiteSpace(txtPublisher.Text)) txtPublisher.Text += ","; txtPublisher.Text += performer; } } txtName.Text = Metadata.Name; txtVersion.Text = Metadata.Version; txtPartNumber.Text = Metadata.PartNumber; txtSerialNumber.Text = Metadata.SerialNumber; if(Metadata.ReleaseTypeSpecified) { chkKnownReleaseType.Checked = true; cmbReleaseType.Enabled = true; cmbReleaseType.SelectedValue = Metadata.ReleaseType; } if(Metadata.ReleaseDateSpecified) { chkReleaseDate.Checked = false; cldReleaseDate.Enabled = true; cldReleaseDate.Value = Metadata.ReleaseDate; } if(Metadata.Keywords != null) { foreach(string keyword in Metadata.Keywords) lstKeywords.Add(new StringEntry { str = keyword }); } if(Metadata.Categories != null) { foreach(string category in Metadata.Categories) lstCategories.Add(new StringEntry { str = category }); } if(Metadata.Subcategories != null) { foreach(string subcategory in Metadata.Subcategories) lstSubcategories.Add(new StringEntry { str = subcategory }); } if(Metadata.Languages != null) { foreach(LanguagesTypeLanguage language in Metadata.Languages) { lstLanguages.Add(new StringEntry { str = language.ToString() }); lstLanguageTypes.Remove(language.ToString()); } } if(Metadata.Systems != null) { foreach(string system in Metadata.Systems) lstSystems.Add(new StringEntry { str = system }); } if(Metadata.Architectures != null) { foreach(ArchitecturesTypeArchitecture architecture in Metadata.Architectures) { lstArchitectures.Add(new StringEntry { str = architecture.ToString() }); lstArchitecturesTypes.Remove(architecture.ToString()); } } if(Metadata.OpticalDisc != null) { foreach(OpticalDiscType disc in Metadata.OpticalDisc) { lstDiscs.Add(new DiscEntry { path = disc.Image.Value, disc = disc }); List files = new List(); files.Add(disc.Image.Value); if(disc.ADIP != null) files.Add(disc.ADIP.Image); if(disc.ATIP != null) files.Add(disc.ATIP.Image); if(disc.BCA != null) files.Add(disc.BCA.Image); if(disc.CMI != null) files.Add(disc.CMI.Image); if(disc.DCB != null) files.Add(disc.DCB.Image); if(disc.DDS != null) files.Add(disc.DDS.Image); if(disc.DMI != null) files.Add(disc.DMI.Image); if(disc.LastRMD != null) files.Add(disc.LastRMD.Image); if(disc.LeadIn != null) { foreach(Schemas.BorderType border in disc.LeadIn) files.Add(border.Image); } if(disc.LeadInCdText != null) files.Add(disc.LeadInCdText.Image); if(disc.LeadOut != null) { foreach(Schemas.BorderType border in disc.LeadOut) files.Add(border.Image); } if(disc.MediaID != null) files.Add(disc.MediaID.Image); if(disc.PAC != null) files.Add(disc.PAC.Image); if(disc.PFI != null) files.Add(disc.PFI.Image); if(disc.PFIR != null) files.Add(disc.PFIR.Image); if(disc.PMA != null) files.Add(disc.PMA.Image); if(disc.PRI != null) files.Add(disc.PRI.Image); if(disc.SAI != null) files.Add(disc.SAI.Image); if(disc.TOC != null) files.Add(disc.TOC.Image); if(disc.Track != null) { foreach(TrackType track in disc.Track) files.Add(track.Image.Value); } foreach(string file in files) { if(lstFilesForMedia.Contains(file)) lstFilesForMedia.Remove(file); } } } if(Metadata.BlockMedia != null) { foreach(BlockMediaType disk in Metadata.BlockMedia) { lstDisks.Add(new DiskEntry { path = disk.Image.Value, disk = disk }); List files = new List(); files.Add(disk.Image.Value); if(disk.ATA != null && disk.ATA.Identify != null) files.Add(disk.ATA.Identify.Image); if(disk.MAM != null) files.Add(disk.MAM.Image); if(disk.PCI != null && disk.PCI.ExpansionROM != null) files.Add(disk.PCI.ExpansionROM.Image.Value); if(disk.PCMCIA != null && disk.PCMCIA.CIS != null) files.Add(disk.PCMCIA.CIS.Image); if(disk.SCSI != null) { if(disk.SCSI.Inquiry != null) files.Add(disk.SCSI.Inquiry.Image); if(disk.SCSI.LogSense != null) files.Add(disk.SCSI.LogSense.Image); if(disk.SCSI.ModeSense != null) files.Add(disk.SCSI.ModeSense.Image); if(disk.SCSI.ModeSense10 != null) files.Add(disk.SCSI.ModeSense10.Image); if(disk.SCSI.EVPD != null) { foreach(EVPDType evpd in disk.SCSI.EVPD) files.Add(evpd.Image); } } if(disk.SecureDigital != null) { if(disk.SecureDigital.CID != null) files.Add(disk.SecureDigital.CID.Image); if(disk.SecureDigital.CSD != null) files.Add(disk.SecureDigital.CSD.Image); if(disk.MultiMediaCard.ExtendedCSD != null) files.Add(disk.MultiMediaCard.ExtendedCSD.Image); } if(disk.TapeInformation != null) { foreach(TapePartitionType tapePart in disk.TapeInformation) files.Add(tapePart.Image.Value); } if(disk.Track != null) { foreach(BlockTrackType track in disk.Track) files.Add(track.Image.Value); } if(disk.USB != null && disk.USB.Descriptors != null) files.Add(disk.USB.Descriptors.Image); foreach(string file in files) { if(lstFilesForMedia.Contains(file)) lstFilesForMedia.Remove(file); } } } magazines = Metadata.Magazine; books = Metadata.Book; requiredOses = Metadata.RequiredOperatingSystems; usermanuals = Metadata.UserManual; adverts = Metadata.Advertisement; linearmedias = Metadata.LinearMedia; pcis = Metadata.PCICard; audiomedias = Metadata.AudioMedia; } protected void OnChkKnownReleaseTypeToggled(object sender, EventArgs e) { cmbReleaseType.Enabled = chkKnownReleaseType.Checked.Value; } protected void OnChkReleaseDateToggled(object sender, EventArgs e) { cldReleaseDate.Enabled = !chkReleaseDate.Checked.Value; } protected void OnBtnAddKeywordClicked(object sender, EventArgs e) { lstKeywords.Add(new StringEntry { str = txtNewKeyword.Text }); txtNewKeyword.Text = ""; } protected void OnBtnRemoveKeywordClicked(object sender, EventArgs e) { if(treeKeywords.SelectedItem != null) lstKeywords.Remove((StringEntry)treeKeywords.SelectedItem); } protected void OnBtnClearKeywordsClicked(object sender, EventArgs e) { lstKeywords.Clear(); } protected void OnBtnAddBarcodeClicked(object sender, EventArgs e) { if(!string.IsNullOrEmpty(cmbBarcodes.Text)) { lstBarcodes.Add(new BarcodeEntry { code = txtNewBarcode.Text, type = (BarcodeTypeType)Enum.Parse(typeof(BarcodeTypeType), cmbBarcodes.Text) }); txtNewBarcode.Text = ""; } } protected void OnBtnClearBarcodesClicked(object sender, EventArgs e) { lstBarcodes.Clear(); } protected void OnBtnRemoveBarcodeClicked(object sender, EventArgs e) { if(treeBarcodes.SelectedItem != null) lstBarcodes.Remove((BarcodeEntry)treeBarcodes.SelectedItem); } protected void OnBtnAddCategoryClicked(object sender, EventArgs e) { lstCategories.Add(new StringEntry { str = txtNewCategory.Text }); txtNewCategory.Text = ""; } protected void OnBtnAddSubcategoryClicked(object sender, EventArgs e) { lstSubcategories.Add(new StringEntry { str = txtNewSubcategory.Text }); txtNewSubcategory.Text = ""; } protected void OnBtnRemoveSubcategoryClicked(object sender, EventArgs e) { if(treeSubcategories.SelectedItem != null) lstSubcategories.Remove((StringEntry)treeSubcategories.SelectedItem); } protected void OnBtnClearSubcategoriesClicked(object sender, EventArgs e) { lstSubcategories.Clear(); } protected void OnBtnRemoveCategoryClicked(object sender, EventArgs e) { if(treeCategories.SelectedItem != null) lstCategories.Remove((StringEntry)treeCategories.SelectedItem); } protected void OnBtnClearCategoriesClicked(object sender, EventArgs e) { lstCategories.Clear(); } protected void OnBtnAddLanguageClicked(object sender, EventArgs e) { if(!string.IsNullOrWhiteSpace(cmbLanguages.Text)) { lstLanguages.Add(new StringEntry { str = cmbLanguages.Text }); lstLanguageTypes.Remove(cmbLanguages.Text); } } protected void OnBtnRemoveLanguageClicked(object sender, EventArgs e) { if(treeLanguages.SelectedItem != null) { lstLanguageTypes.Add(((StringEntry)treeLanguages.SelectedItem).str); lstLanguages.Remove((StringEntry)treeLanguages.SelectedItem); } } protected void OnBtnClearLanguagesClicked(object sender, EventArgs e) { lstLanguages.Clear(); FillLanguagesCombo(); } protected void OnBtnAddSystemClicked(object sender, EventArgs e) { lstSystems.Add(new StringEntry { str = txtNewSystem.Text }); txtNewSystem.Text = ""; } protected void OnBtnClearSystemsClicked(object sender, EventArgs e) { lstSystems.Clear(); } protected void OnBtnRemoveSystemClicked(object sender, EventArgs e) { if(treeSystems.SelectedItem != null) lstSystems.Remove((StringEntry)treeSystems.SelectedItem); } protected void OnBtnAddArchitectureClicked(object sender, EventArgs e) { if(!string.IsNullOrWhiteSpace(cmbArchitectures.Text)) { lstArchitectures.Add(new StringEntry { str = cmbArchitectures.Text }); lstArchitecturesTypes.Remove(cmbArchitectures.Text); } } protected void OnBtnClearArchitecturesClicked(object sender, EventArgs e) { lstArchitectures.Clear(); FillArchitecturesCombo(); } protected void OnBtnRemoveArchitectureClicked(object sender, EventArgs e) { if(treeArchitectures.SelectedItem != null) { lstArchitecturesTypes.Add(((StringEntry)treeArchitectures.SelectedItem).str); lstArchitectures.Remove((StringEntry)treeArchitectures.SelectedItem); } } protected void OnBtnAddDiscClicked(object sender, EventArgs e) { Context.selectedFile = cmbFilesForNewDisc.Text; tabGeneral.Visible = false; tabKeywords.Visible = false; tabBarcodes.Visible = false; tabCategories.Visible = false; tabLanguages.Visible = false; tabSystems.Visible = false; tabArchitectures.Visible = false; tabDisks.Visible = false; prgAddDisc1.Visible = true; prgAddDisc2.Visible = true; lblAddDisc1.Visible = true; lblAddDisc2.Visible = true; btnCancel.Visible = false; btnOK.Visible = false; btnEditDisc.Visible = false; btnClearDiscs.Visible = false; Workers.Failed += OnDiscAddFailed; Workers.Finished += OnDiscAddFinished; Workers.UpdateProgress += UpdateDiscProgress1; Workers.UpdateProgress2 += UpdateDiscProgress2; Context.workingDisc = null; btnStopAddDisc.Visible = true; btnAddDisc.Visible = false; btnRemoveDisc.Visible = false; thdDisc = new Thread(Workers.AddMedia); thdDisc.Start(); } protected void OnBtnStopAddDiscClicked(object sender, EventArgs e) { if(thdDisc != null) thdDisc.Abort(); stopped = true; OnDiscAddFailed(null); } public void UpdateDiscProgress1(string text, string inner, long current, long maximum) { Application.Instance.Invoke(delegate { if(!string.IsNullOrWhiteSpace(inner)) lblAddDisc1.Text = inner; else lblAddDisc1.Text = text; if(maximum > 0) { if(current < int.MinValue || current > int.MaxValue || maximum < int.MinValue || maximum > int.MaxValue) { current /= 100; maximum /= 100; } prgAddDisc1.Indeterminate = false; prgAddDisc1.MinValue = 0; prgAddDisc1.MaxValue = (int)maximum; prgAddDisc1.Value = (int)current; } else prgAddDisc1.Indeterminate = true; }); } public void UpdateDiscProgress2(string text, string inner, long current, long maximum) { Application.Instance.Invoke(delegate { if(!string.IsNullOrWhiteSpace(inner)) lblAddDisc2.Text = inner; else lblAddDisc2.Text = text; if(maximum > 0) { if(current < int.MinValue || current > int.MaxValue || maximum < int.MinValue || maximum > int.MaxValue) { current /= 100; maximum /= 100; } prgAddDisc2.Indeterminate = false; prgAddDisc2.MinValue = 0; prgAddDisc2.MaxValue = (int)maximum; prgAddDisc2.Value = (int)current; } else prgAddDisc2.Indeterminate = true; }); } void OnDiscAddFailed(string text) { Application.Instance.Invoke(delegate { if(!stopped) MessageBox.Show(text, MessageBoxType.Error); Context.selectedFile = ""; tabGeneral.Visible = true; tabKeywords.Visible = true; tabBarcodes.Visible = true; tabCategories.Visible = true; tabLanguages.Visible = true; tabSystems.Visible = true; tabArchitectures.Visible = true; tabDisks.Visible = true; prgAddDisc1.Visible = false; prgAddDisc2.Visible = false; lblAddDisc1.Visible = false; lblAddDisc2.Visible = false; btnCancel.Visible = true; btnOK.Visible = true; btnEditDisc.Visible = true; btnClearDiscs.Visible = true; Workers.Failed -= OnDiscAddFailed; Workers.Finished -= OnDiscAddFinished; Workers.UpdateProgress -= UpdateDiscProgress1; Workers.UpdateProgress2 -= UpdateDiscProgress2; Context.workingDisc = null; btnStopAddDisc.Visible = false; btnAddDisc.Visible = true; btnRemoveDisc.Visible = true; thdDisc = null; }); } void OnDiscAddFinished() { Application.Instance.Invoke(delegate { if(Context.workingDisc == null) return; OpticalDiscType disc = Context.workingDisc; lstDiscs.Add(new DiscEntry { path = Context.selectedFile, disc = disc }); List files = new List(); files.Add(disc.Image.Value); if(disc.ADIP != null) files.Add(disc.ADIP.Image); if(disc.ATIP != null) files.Add(disc.ATIP.Image); if(disc.BCA != null) files.Add(disc.BCA.Image); if(disc.CMI != null) files.Add(disc.CMI.Image); if(disc.DCB != null) files.Add(disc.DCB.Image); if(disc.DDS != null) files.Add(disc.DDS.Image); if(disc.DMI != null) files.Add(disc.DMI.Image); if(disc.LastRMD != null) files.Add(disc.LastRMD.Image); if(disc.LeadIn != null) { foreach(Schemas.BorderType border in disc.LeadIn) files.Add(border.Image); } if(disc.LeadInCdText != null) files.Add(disc.LeadInCdText.Image); if(disc.LeadOut != null) { foreach(Schemas.BorderType border in disc.LeadOut) files.Add(border.Image); } if(disc.MediaID != null) files.Add(disc.MediaID.Image); if(disc.PAC != null) files.Add(disc.PAC.Image); if(disc.PFI != null) files.Add(disc.PFI.Image); if(disc.PFIR != null) files.Add(disc.PFIR.Image); if(disc.PMA != null) files.Add(disc.PMA.Image); if(disc.PRI != null) files.Add(disc.PRI.Image); if(disc.SAI != null) files.Add(disc.SAI.Image); if(disc.TOC != null) files.Add(disc.TOC.Image); if(disc.Track != null) { foreach(TrackType track in disc.Track) files.Add(track.Image.Value); } foreach(string file in files) lstFilesForMedia.Remove(file); Context.selectedFile = ""; tabGeneral.Visible = true; tabKeywords.Visible = true; tabBarcodes.Visible = true; tabCategories.Visible = true; tabLanguages.Visible = true; tabSystems.Visible = true; tabArchitectures.Visible = true; tabDisks.Visible = true; prgAddDisc1.Visible = false; prgAddDisc2.Visible = false; lblAddDisc1.Visible = false; lblAddDisc2.Visible = false; btnCancel.Visible = true; btnOK.Visible = true; btnEditDisc.Visible = true; btnClearDiscs.Visible = true; Workers.Failed -= OnDiscAddFailed; Workers.Finished -= OnDiscAddFinished; Workers.UpdateProgress -= UpdateDiscProgress1; Workers.UpdateProgress2 -= UpdateDiscProgress2; Context.workingDisc = null; btnStopAddDisc.Visible = false; btnAddDisc.Visible = true; btnRemoveDisc.Visible = true; thdDisc = null; }); } protected void OnBtnClearDiscsClicked(object sender, EventArgs e) { lstDiscs.Clear(); // TODO: Don't add files that are in disks FillFilesCombos(); } protected void OnBtnRemoveDiscClicked(object sender, EventArgs e) { if(treeDiscs.SelectedItem != null) { lstFilesForMedia.Add(((DiscEntry)treeDiscs.SelectedItem).path); lstDiscs.Remove((DiscEntry)treeDiscs.SelectedItem); } } protected void OnBtnAddDiskClicked(object sender, EventArgs e) { Context.selectedFile = cmbFilesForNewDisk.Text; tabGeneral.Visible = false; tabKeywords.Visible = false; tabBarcodes.Visible = false; tabCategories.Visible = false; tabLanguages.Visible = false; tabSystems.Visible = false; tabArchitectures.Visible = false; tabDiscs.Visible = false; prgAddDisk1.Visible = true; prgAddDisk2.Visible = true; lblAddDisk1.Visible = true; lblAddDisk2.Visible = true; btnCancel.Visible = false; btnOK.Visible = false; btnEditDisk.Visible = false; btnClearDisks.Visible = false; Workers.Failed += OnDiskAddFailed; Workers.Finished += OnDiskAddFinished; Workers.UpdateProgress += UpdateDiskProgress1; Workers.UpdateProgress2 += UpdateDiskProgress2; Context.workingDisk = null; btnStopAddDisk.Visible = true; btnAddDisk.Visible = false; btnRemoveDisk.Visible = false; thdDisk = new Thread(Workers.AddMedia); thdDisk.Start(); } protected void OnBtnStopAddDiskClicked(object sender, EventArgs e) { if(thdDisk != null) thdDisk.Abort(); stopped = true; OnDiskAddFailed(null); } public void UpdateDiskProgress1(string text, string inner, long current, long maximum) { Application.Instance.Invoke(delegate { if(!string.IsNullOrWhiteSpace(inner)) lblAddDisk1.Text = inner; else lblAddDisk1.Text = text; if(maximum > 0) { if(current < int.MinValue || current > int.MaxValue || maximum < int.MinValue || maximum > int.MaxValue) { current /= 100; maximum /= 100; } prgAddDisk1.Indeterminate = false; prgAddDisk1.MinValue = 0; prgAddDisk1.MaxValue = (int)maximum; prgAddDisk1.Value = (int)current; } else prgAddDisk1.Indeterminate = true; }); } public void UpdateDiskProgress2(string text, string inner, long current, long maximum) { Application.Instance.Invoke(delegate { if(!string.IsNullOrWhiteSpace(inner)) lblAddDisk2.Text = inner; else lblAddDisk2.Text = text; if(maximum > 0) { if(current < int.MinValue || current > int.MaxValue || maximum < int.MinValue || maximum > int.MaxValue) { current /= 100; maximum /= 100; } prgAddDisk2.Indeterminate = false; prgAddDisk2.MinValue = 0; prgAddDisk2.MaxValue = (int)maximum; prgAddDisk2.Value = (int)current; } else prgAddDisk2.Indeterminate = true; }); } void OnDiskAddFailed(string text) { Application.Instance.Invoke(delegate { if(!stopped) MessageBox.Show(text, MessageBoxType.Error); Context.selectedFile = ""; tabGeneral.Visible = true; tabKeywords.Visible = true; tabBarcodes.Visible = true; tabCategories.Visible = true; tabLanguages.Visible = true; tabSystems.Visible = true; tabArchitectures.Visible = true; tabDiscs.Visible = true; prgAddDisk1.Visible = false; prgAddDisk2.Visible = false; lblAddDisk1.Visible = false; lblAddDisk2.Visible = false; btnCancel.Visible = true; btnOK.Visible = true; btnEditDisk.Visible = true; btnClearDisks.Visible = true; Workers.Failed -= OnDiskAddFailed; Workers.Finished -= OnDiskAddFinished; Workers.UpdateProgress -= UpdateDiskProgress1; Workers.UpdateProgress2 -= UpdateDiskProgress2; Context.workingDisk = null; btnStopAddDisk.Visible = false; btnAddDisk.Visible = true; btnRemoveDisk.Visible = true; thdDisk = null; }); } void OnDiskAddFinished() { Application.Instance.Invoke(delegate { if(Context.workingDisk == null) return; BlockMediaType disk = Context.workingDisk; lstDisks.Add(new DiskEntry { path = disk.Image.Value, disk = disk }); List files = new List(); files.Add(disk.Image.Value); if(disk.ATA != null && disk.ATA.Identify != null) files.Add(disk.ATA.Identify.Image); if(disk.MAM != null) files.Add(disk.MAM.Image); if(disk.PCI != null && disk.PCI.ExpansionROM != null) files.Add(disk.PCI.ExpansionROM.Image.Value); if(disk.PCMCIA != null && disk.PCMCIA.CIS != null) files.Add(disk.PCMCIA.CIS.Image); if(disk.SCSI != null) { if(disk.SCSI.Inquiry != null) files.Add(disk.SCSI.Inquiry.Image); if(disk.SCSI.LogSense != null) files.Add(disk.SCSI.LogSense.Image); if(disk.SCSI.ModeSense != null) files.Add(disk.SCSI.ModeSense.Image); if(disk.SCSI.ModeSense10 != null) files.Add(disk.SCSI.ModeSense10.Image); if(disk.SCSI.EVPD != null) { foreach(EVPDType evpd in disk.SCSI.EVPD) files.Add(evpd.Image); } } if(disk.SecureDigital != null) { if(disk.SecureDigital.CID != null) files.Add(disk.SecureDigital.CID.Image); if(disk.SecureDigital.CSD != null) files.Add(disk.SecureDigital.CSD.Image); if(disk.MultiMediaCard.ExtendedCSD != null) files.Add(disk.MultiMediaCard.ExtendedCSD.Image); } if(disk.TapeInformation != null) { foreach(TapePartitionType tapePart in disk.TapeInformation) files.Add(tapePart.Image.Value); } if(disk.Track != null) { foreach(BlockTrackType track in disk.Track) files.Add(track.Image.Value); } if(disk.USB != null && disk.USB.Descriptors != null) files.Add(disk.USB.Descriptors.Image); foreach(string file in files) lstFilesForMedia.Remove(file); Context.selectedFile = ""; tabGeneral.Visible = true; tabKeywords.Visible = true; tabBarcodes.Visible = true; tabCategories.Visible = true; tabLanguages.Visible = true; tabSystems.Visible = true; tabArchitectures.Visible = true; tabDiscs.Visible = true; prgAddDisk1.Visible = false; prgAddDisk2.Visible = false; lblAddDisk1.Visible = false; lblAddDisk2.Visible = false; btnCancel.Visible = true; btnOK.Visible = true; btnEditDisk.Visible = true; btnClearDisks.Visible = true; Workers.Failed -= OnDiskAddFailed; Workers.Finished -= OnDiskAddFinished; Workers.UpdateProgress -= UpdateDiskProgress1; Workers.UpdateProgress2 -= UpdateDiskProgress2; Context.workingDisk = null; btnStopAddDisk.Visible = false; btnAddDisk.Visible = true; btnRemoveDisk.Visible = true; thdDisk = null; }); } protected void OnBtnClearDisksClicked(object sender, EventArgs e) { lstDisks.Clear(); // TODO: Don't add files that are discs FillFilesCombos(); } protected void OnBtnRemoveDiskClicked(object sender, EventArgs e) { if(treeDisks.SelectedItem != null) { lstFilesForMedia.Add(((DiskEntry)treeDisks.SelectedItem).path); lstDisks.Remove((DiskEntry)treeDisks.SelectedItem); } } protected void OnBtnCancelClicked(object sender, EventArgs e) { Modified = false; Close(); } protected void OnBtnOKClicked(object sender, EventArgs e) { Metadata = new CICMMetadataType(); List architectures = new List(); List barcodes = new List(); List disks = new List(); List categories = new List(); List keywords = new List(); List languages = new List(); List discs = new List(); List subcategories = new List(); List systems = new List(); if(!string.IsNullOrEmpty(txtAuthor.Text)) Metadata.Author = txtAuthor.Text.Split(','); if(!string.IsNullOrEmpty(txtDeveloper.Text)) Metadata.Developer = txtDeveloper.Text.Split(','); if(!string.IsNullOrEmpty(txtName.Text)) Metadata.Name = txtName.Text; if(!string.IsNullOrEmpty(txtPartNumber.Text)) Metadata.PartNumber = txtPartNumber.Text; if(!string.IsNullOrEmpty(txtPerformer.Text)) Metadata.Performer = txtPerformer.Text.Split(','); if(!string.IsNullOrEmpty(txtPublisher.Text)) Metadata.Publisher = txtPublisher.Text.Split(','); if(!string.IsNullOrEmpty(txtSerialNumber.Text)) Metadata.SerialNumber = txtSerialNumber.Text; if(!string.IsNullOrEmpty(txtVersion.Text)) Metadata.Version = txtVersion.Text; if(!chkReleaseDate.Checked.Value) { Metadata.ReleaseDate = cldReleaseDate.Value.Value; Metadata.ReleaseDateSpecified = true; } if(chkKnownReleaseType.Checked.Value) { Metadata.ReleaseType = cmbReleaseType.SelectedValue; Metadata.ReleaseTypeSpecified = true; } foreach(StringEntry entry in lstArchitectures) architectures.Add((ArchitecturesTypeArchitecture)Enum.Parse(typeof(ArchitecturesTypeArchitecture), entry.str)); foreach(BarcodeEntry entry in lstBarcodes) { BarcodeType barcode = new BarcodeType(); barcode.type = entry.type; barcode.Value = entry.code; barcodes.Add(barcode); } foreach(DiskEntry entry in lstDisks) disks.Add(entry.disk); foreach(StringEntry entry in lstCategories) categories.Add(entry.str); foreach(StringEntry entry in lstKeywords) keywords.Add(entry.str); foreach(StringEntry entry in lstLanguages) languages.Add((LanguagesTypeLanguage)Enum.Parse(typeof(LanguagesTypeLanguage), entry.str)); foreach(DiscEntry entry in lstDiscs) discs.Add(entry.disc); foreach(StringEntry entry in lstSubcategories) subcategories.Add(entry.str); foreach(StringEntry entry in lstSystems) systems.Add(entry.str); if(architectures.Count > 0) Metadata.Architectures = architectures.ToArray(); if(barcodes.Count > 0) Metadata.Barcodes = barcodes.ToArray(); if(disks.Count > 0) Metadata.BlockMedia = disks.ToArray(); if(categories.Count > 0) Metadata.Categories = categories.ToArray(); if(keywords.Count > 0) Metadata.Keywords = keywords.ToArray(); if(languages.Count > 0) Metadata.Languages = languages.ToArray(); if(discs.Count > 0) Metadata.OpticalDisc = discs.ToArray(); if(subcategories.Count > 0) Metadata.Subcategories = subcategories.ToArray(); if(systems.Count > 0) Metadata.Systems = systems.ToArray(); Metadata.Magazine = magazines; Metadata.Book = books; Metadata.RequiredOperatingSystems = requiredOses; Metadata.UserManual = usermanuals; Metadata.Advertisement = adverts; Metadata.LinearMedia = linearmedias; Metadata.PCICard = pcis; Metadata.AudioMedia = audiomedias; Modified = true; Close(); } protected void OnBtnEditDiscClicked(object sender, EventArgs e) { if(treeDiscs.SelectedItem == null) return; dlgOpticalDisc _dlgOpticalDisc = new dlgOpticalDisc(); _dlgOpticalDisc.Title = string.Format("Editing disc metadata for {0}", ((DiscEntry)treeDiscs.SelectedItem).path); _dlgOpticalDisc.Metadata = ((DiscEntry)treeDiscs.SelectedItem).disc; _dlgOpticalDisc.FillFields(); _dlgOpticalDisc.ShowModal(this); if(_dlgOpticalDisc.Modified) { lstDiscs.Remove((DiscEntry)treeDiscs.SelectedItem); lstDiscs.Add(new DiscEntry { path = _dlgOpticalDisc.Metadata.Image.Value, disc = _dlgOpticalDisc.Metadata }); } } protected void OnBtnEditDiskClicked(object sender, EventArgs e) { if(treeDisks.SelectedItem == null) return; dlgBlockMedia _dlgBlockMedia = new dlgBlockMedia(); _dlgBlockMedia.Title = string.Format("Editing disk metadata for {0}", ((DiskEntry)treeDisks.SelectedItem).path); _dlgBlockMedia.Metadata = ((DiskEntry)treeDisks.SelectedItem).disk; _dlgBlockMedia.FillFields(); _dlgBlockMedia.ShowModal(this); if(_dlgBlockMedia.Modified) { lstDisks.Remove((DiskEntry)treeDisks.SelectedItem); lstDisks.Add(new DiskEntry { path = _dlgBlockMedia.Metadata.Image.Value, disk = _dlgBlockMedia.Metadata }); } } } }