(ExtractImage): check for source file format by contents, not by filename extension.

(GarExtract): file list is passed as an argument to progress dialog
worker.
This commit is contained in:
morkt
2015-06-02 22:56:37 +04:00
parent 7f4b01b7ca
commit 5d81b33582

View File

@@ -106,7 +106,6 @@ namespace GARbro.GUI
private bool m_skip_audio = false; private bool m_skip_audio = false;
private bool m_convert_audio; private bool m_convert_audio;
private ImageFormat m_image_format; private ImageFormat m_image_format;
private IEnumerable<Entry> m_file_list;
private int m_extract_count; private int m_extract_count;
private bool m_extract_in_progress = false; private bool m_extract_in_progress = false;
private ProgressDialog m_progress_dialog; private ProgressDialog m_progress_dialog;
@@ -243,7 +242,7 @@ namespace GARbro.GUI
m_main.SetStatusText (string.Format ("{1}: {0}", guiStrings.MsgNoFiles, m_arc_name)); m_main.SetStatusText (string.Format ("{1}: {0}", guiStrings.MsgNoFiles, m_arc_name));
return; return;
} }
m_file_list = file_list.OrderBy (e => e.Offset); file_list = file_list.OrderBy (e => e.Offset);
m_progress_dialog = new ProgressDialog () m_progress_dialog = new ProgressDialog ()
{ {
WindowTitle = guiStrings.TextTitle, WindowTitle = guiStrings.TextTitle,
@@ -251,26 +250,26 @@ namespace GARbro.GUI
Description = "", Description = "",
MinimizeBox = true, MinimizeBox = true,
}; };
if (!m_file_list.Skip (1).Any()) // 1 == m_file_list.Count() if (!file_list.Skip (1).Any()) // 1 == file_list.Count()
{ {
m_progress_dialog.Description = m_file_list.First().Name; m_progress_dialog.Description = file_list.First().Name;
m_progress_dialog.ProgressBarStyle = ProgressBarStyle.MarqueeProgressBar; m_progress_dialog.ProgressBarStyle = ProgressBarStyle.MarqueeProgressBar;
} }
m_convert_audio = !m_skip_audio && Settings.Default.appConvertAudio; m_convert_audio = !m_skip_audio && Settings.Default.appConvertAudio;
m_extract_count = 0; m_extract_count = 0;
m_pending_error = null; m_pending_error = null;
m_progress_dialog.DoWork += ExtractWorker; m_progress_dialog.DoWork += (s, e) => ExtractWorker (file_list);
m_progress_dialog.RunWorkerCompleted += OnExtractComplete; m_progress_dialog.RunWorkerCompleted += OnExtractComplete;
m_progress_dialog.ShowDialog (m_main); m_progress_dialog.ShowDialog (m_main);
m_extract_in_progress = true; m_extract_in_progress = true;
} }
void ExtractWorker (object sender, DoWorkEventArgs e) void ExtractWorker (IEnumerable<Entry> file_list)
{ {
try try
{ {
int total = m_file_list.Count(); int total = file_list.Count();
foreach (var entry in m_file_list) foreach (var entry in file_list)
{ {
if (m_progress_dialog.CancellationPending) if (m_progress_dialog.CancellationPending)
break; break;
@@ -293,21 +292,22 @@ namespace GARbro.GUI
static void ExtractImage (ArcFile arc, Entry entry, ImageFormat target_format) static void ExtractImage (ArcFile arc, Entry entry, ImageFormat target_format)
{ {
using (var file = arc.OpenEntry (entry)) using (var file = arc.OpenSeekableEntry (entry))
{ {
string source_ext = Path.GetExtension (entry.Name).TrimStart ('.').ToLowerInvariant(); var src_format = ImageFormat.FindFormat (file);
if (target_format.Extensions.Any (ext => ext == source_ext)) if (null == src_format)
throw new InvalidFormatException (string.Format ("{1}: {0}", guiStrings.MsgUnableInterpret, entry.Name));
file.Position = 0;
string target_ext = target_format.Extensions.First();
string outname = Path.ChangeExtension (entry.Name, target_ext);
if (src_format.Item1 == target_format)
{ {
// source extension matches target image format, copy file as is // source format is the same as a target, copy file as is
using (var output = arc.CreateFile (entry)) using (var output = ArchiveFormat.CreateFile (outname))
file.CopyTo (output); file.CopyTo (output);
return; return;
} }
ImageData image = ImageFormat.Read (file); ImageData image = src_format.Item1.Read (file, src_format.Item2);
if (null == image)
throw new InvalidFormatException (string.Format ("{1}: {0}", guiStrings.MsgUnableInterpret, entry.Name));
string target_ext = target_format.Extensions.First();
string outname = Path.ChangeExtension (entry.Name, target_ext);
Trace.WriteLine (string.Format ("{0} => {1}", entry.Name, outname), "ExtractImage"); Trace.WriteLine (string.Format ("{0} => {1}", entry.Name, outname), "ExtractImage");
using (var outfile = ArchiveFormat.CreateFile (outname)) using (var outfile = ArchiveFormat.CreateFile (outname))
{ {
@@ -341,7 +341,7 @@ namespace GARbro.GUI
} }
else else
{ {
var wav_format = FormatCatalog.Instance.AudioFormats.Where (f => f.Tag == "WAV").First(); var wav_format = FormatCatalog.Instance.AudioFormats.First (f => f.Tag == "WAV");
string output_name = Path.ChangeExtension (entry_name, "wav"); string output_name = Path.ChangeExtension (entry_name, "wav");
using (var output = ArchiveFormat.CreateFile (output_name)) using (var output = ArchiveFormat.CreateFile (output_name))
wav_format.Write (input, output); wav_format.Write (input, output);