From 5d7aa9544571d092514e65df99d7f4a1f156ca78 Mon Sep 17 00:00:00 2001 From: gjefferyes Date: Thu, 9 Oct 2014 18:29:50 -0500 Subject: [PATCH 01/28] added LICENSE --- LICENSE | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..74b0fec --- /dev/null +++ b/LICENSE @@ -0,0 +1,24 @@ + Released under the respect the work of the original author license. + ------------------------------------------------------------------- + +The source code for RomVault has been released for the benefit of the emulation community. +This means you should ask yourself if you make a change/improvement/branch of this code, does your changes +also benefit the emulation community? If so then please give back to the community in a respectful way. + +What does giving back to the community in a respectful way mean: + Ideally it means contribute your changes back to the author of the source, so that your changes can be worked into the main build. + If you make a reasonably large change that you think others will benefit from put out your own branches for other people to try, + and then maybe this can also be worked into the main code. + + It means DO NOT make a small change/fix, re-brand the program and claim you are the greatest developer ever for releasing 'your' software. + This type of behaviour is disrespectful to the original author and the emulation community, and is against the nature of this license. + +If you want to use large parts of this code (such as the DAT reader or torrentZip library) in your own project go right ahead, +I hope you can do something cool with this code to add to or improve your new and existing projects. Please let the author know how you +are using it, it would be cool to hear about other things this is being used for. + +DO NOT sell this software or any derivative works from this software without permission from the author. +I have put 100's of hours of development into this code and only ever asked for donations to support this project. +So if you go and grab this code and start selling it or derivative works, that is disrespecting the nature of this license, +and so not permitted without permission. + From 891f53ef343635ffda950ee738d1f2b0250198c5 Mon Sep 17 00:00:00 2001 From: Jim Westfall Date: Sat, 18 Oct 2014 16:36:00 -0700 Subject: [PATCH 02/28] Standardize the case of file names and how they are referenced in ROMVault2.csproj so its possible to compile on a case sensitive filesystem (ie mono on linux) --- ...t.Designer.cs => FrmHelpAbout.Designer.cs} | 0 .../{frmHelpAbout.cs => FrmHelpAbout.cs} | 0 .../{frmHelpAbout.resx => FrmHelpAbout.resx} | 0 ...{frmKey.Designer.cs => FrmKey.Designer.cs} | 0 ROMVault2/{frmKey.cs => FrmKey.cs} | 0 ROMVault2/{frmKey.resx => FrmKey.resx} | 0 ...rmMain.Designer.cs => FrmMain.Designer.cs} | 0 ROMVault2/{frmMain.cs => FrmMain.cs} | 0 ROMVault2/{frmMain.resx => FrmMain.resx} | 0 ...er.cs => FrmProgressWindowFix.Designer.cs} | 0 ...tDir.Designer.cs => FrmSetDir.Designer.cs} | 0 ROMVault2/{frmSetDir.cs => FrmSetDir.cs} | 0 ...gs.Designer.cs => FrmSettings.Designer.cs} | 0 ROMVault2/{frmSettings.cs => FrmSettings.cs} | 0 .../{frmSettings.resx => FrmSettings.resx} | 0 ...r.Designer.cs => FrmShowError.Designer.cs} | 0 .../{frmShowError.cs => FrmShowError.cs} | 0 .../{frmShowError.resx => FrmShowError.resx} | 0 ...esigner.cs => FrmSplashScreen.Designer.cs} | 0 ...{frmSplashScreen.cs => FrmSplashScreen.cs} | 0 ...SplashScreen.resx => FrmSplashScreen.resx} | 0 ROMVault2/ROMVault2.csproj | 60 +++++++++---------- 22 files changed, 30 insertions(+), 30 deletions(-) rename ROMVault2/{frmHelpAbout.Designer.cs => FrmHelpAbout.Designer.cs} (100%) rename ROMVault2/{frmHelpAbout.cs => FrmHelpAbout.cs} (100%) rename ROMVault2/{frmHelpAbout.resx => FrmHelpAbout.resx} (100%) rename ROMVault2/{frmKey.Designer.cs => FrmKey.Designer.cs} (100%) rename ROMVault2/{frmKey.cs => FrmKey.cs} (100%) rename ROMVault2/{frmKey.resx => FrmKey.resx} (100%) rename ROMVault2/{frmMain.Designer.cs => FrmMain.Designer.cs} (100%) rename ROMVault2/{frmMain.cs => FrmMain.cs} (100%) rename ROMVault2/{frmMain.resx => FrmMain.resx} (100%) rename ROMVault2/{FrmProgressWindowFix.designer.cs => FrmProgressWindowFix.Designer.cs} (100%) rename ROMVault2/{frmSetDir.Designer.cs => FrmSetDir.Designer.cs} (100%) rename ROMVault2/{frmSetDir.cs => FrmSetDir.cs} (100%) rename ROMVault2/{frmSettings.Designer.cs => FrmSettings.Designer.cs} (100%) rename ROMVault2/{frmSettings.cs => FrmSettings.cs} (100%) rename ROMVault2/{frmSettings.resx => FrmSettings.resx} (100%) rename ROMVault2/{frmShowError.Designer.cs => FrmShowError.Designer.cs} (100%) rename ROMVault2/{frmShowError.cs => FrmShowError.cs} (100%) rename ROMVault2/{frmShowError.resx => FrmShowError.resx} (100%) rename ROMVault2/{frmSplashScreen.Designer.cs => FrmSplashScreen.Designer.cs} (100%) rename ROMVault2/{frmSplashScreen.cs => FrmSplashScreen.cs} (100%) rename ROMVault2/{frmSplashScreen.resx => FrmSplashScreen.resx} (100%) diff --git a/ROMVault2/frmHelpAbout.Designer.cs b/ROMVault2/FrmHelpAbout.Designer.cs similarity index 100% rename from ROMVault2/frmHelpAbout.Designer.cs rename to ROMVault2/FrmHelpAbout.Designer.cs diff --git a/ROMVault2/frmHelpAbout.cs b/ROMVault2/FrmHelpAbout.cs similarity index 100% rename from ROMVault2/frmHelpAbout.cs rename to ROMVault2/FrmHelpAbout.cs diff --git a/ROMVault2/frmHelpAbout.resx b/ROMVault2/FrmHelpAbout.resx similarity index 100% rename from ROMVault2/frmHelpAbout.resx rename to ROMVault2/FrmHelpAbout.resx diff --git a/ROMVault2/frmKey.Designer.cs b/ROMVault2/FrmKey.Designer.cs similarity index 100% rename from ROMVault2/frmKey.Designer.cs rename to ROMVault2/FrmKey.Designer.cs diff --git a/ROMVault2/frmKey.cs b/ROMVault2/FrmKey.cs similarity index 100% rename from ROMVault2/frmKey.cs rename to ROMVault2/FrmKey.cs diff --git a/ROMVault2/frmKey.resx b/ROMVault2/FrmKey.resx similarity index 100% rename from ROMVault2/frmKey.resx rename to ROMVault2/FrmKey.resx diff --git a/ROMVault2/frmMain.Designer.cs b/ROMVault2/FrmMain.Designer.cs similarity index 100% rename from ROMVault2/frmMain.Designer.cs rename to ROMVault2/FrmMain.Designer.cs diff --git a/ROMVault2/frmMain.cs b/ROMVault2/FrmMain.cs similarity index 100% rename from ROMVault2/frmMain.cs rename to ROMVault2/FrmMain.cs diff --git a/ROMVault2/frmMain.resx b/ROMVault2/FrmMain.resx similarity index 100% rename from ROMVault2/frmMain.resx rename to ROMVault2/FrmMain.resx diff --git a/ROMVault2/FrmProgressWindowFix.designer.cs b/ROMVault2/FrmProgressWindowFix.Designer.cs similarity index 100% rename from ROMVault2/FrmProgressWindowFix.designer.cs rename to ROMVault2/FrmProgressWindowFix.Designer.cs diff --git a/ROMVault2/frmSetDir.Designer.cs b/ROMVault2/FrmSetDir.Designer.cs similarity index 100% rename from ROMVault2/frmSetDir.Designer.cs rename to ROMVault2/FrmSetDir.Designer.cs diff --git a/ROMVault2/frmSetDir.cs b/ROMVault2/FrmSetDir.cs similarity index 100% rename from ROMVault2/frmSetDir.cs rename to ROMVault2/FrmSetDir.cs diff --git a/ROMVault2/frmSettings.Designer.cs b/ROMVault2/FrmSettings.Designer.cs similarity index 100% rename from ROMVault2/frmSettings.Designer.cs rename to ROMVault2/FrmSettings.Designer.cs diff --git a/ROMVault2/frmSettings.cs b/ROMVault2/FrmSettings.cs similarity index 100% rename from ROMVault2/frmSettings.cs rename to ROMVault2/FrmSettings.cs diff --git a/ROMVault2/frmSettings.resx b/ROMVault2/FrmSettings.resx similarity index 100% rename from ROMVault2/frmSettings.resx rename to ROMVault2/FrmSettings.resx diff --git a/ROMVault2/frmShowError.Designer.cs b/ROMVault2/FrmShowError.Designer.cs similarity index 100% rename from ROMVault2/frmShowError.Designer.cs rename to ROMVault2/FrmShowError.Designer.cs diff --git a/ROMVault2/frmShowError.cs b/ROMVault2/FrmShowError.cs similarity index 100% rename from ROMVault2/frmShowError.cs rename to ROMVault2/FrmShowError.cs diff --git a/ROMVault2/frmShowError.resx b/ROMVault2/FrmShowError.resx similarity index 100% rename from ROMVault2/frmShowError.resx rename to ROMVault2/FrmShowError.resx diff --git a/ROMVault2/frmSplashScreen.Designer.cs b/ROMVault2/FrmSplashScreen.Designer.cs similarity index 100% rename from ROMVault2/frmSplashScreen.Designer.cs rename to ROMVault2/FrmSplashScreen.Designer.cs diff --git a/ROMVault2/frmSplashScreen.cs b/ROMVault2/FrmSplashScreen.cs similarity index 100% rename from ROMVault2/frmSplashScreen.cs rename to ROMVault2/FrmSplashScreen.cs diff --git a/ROMVault2/frmSplashScreen.resx b/ROMVault2/FrmSplashScreen.resx similarity index 100% rename from ROMVault2/frmSplashScreen.resx rename to ROMVault2/FrmSplashScreen.resx diff --git a/ROMVault2/ROMVault2.csproj b/ROMVault2/ROMVault2.csproj index 8e5df65..7f5db03 100644 --- a/ROMVault2/ROMVault2.csproj +++ b/ROMVault2/ROMVault2.csproj @@ -107,7 +107,7 @@ Form - + FrmProgressWindowFix.cs @@ -128,17 +128,17 @@ - + Form - - frmHelpAbout.cs + + FrmHelpAbout.cs - + Form - - frmKey.cs + + FrmKey.cs Form @@ -152,30 +152,30 @@ FrmRegistration.cs - + Form - - frmSetDir.cs + + FrmSetDir.cs - + Form - - frmSettings.cs + + FrmSettings.cs - + Form - - frmShowError.cs + + FrmShowError.cs - + Form - - frmSplashScreen.cs + + FrmSplashScreen.cs @@ -225,11 +225,11 @@ - - frmHelpAbout.cs + + FrmHelpAbout.cs - - frmKey.cs + + FrmKey.cs Designer @@ -244,15 +244,15 @@ FrmRegistration.cs - - frmSettings.cs + + FrmSettings.cs Designer - - frmShowError.cs + + FrmShowError.cs - - frmSplashScreen.cs + + FrmSplashScreen.cs ResXFileCodeGenerator @@ -334,4 +334,4 @@ --> - \ No newline at end of file + From 9121f65a1fad5f21f8d54ff53f7f275407f8660e Mon Sep 17 00:00:00 2001 From: Jim Westfall Date: Sat, 18 Oct 2014 20:34:06 -0700 Subject: [PATCH 03/28] should be semi-colon separated list, not comma. Remove unneeded System.Deployment include (mono doesnt support it). --- ROMVault2/ROMVault2.csproj | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/ROMVault2/ROMVault2.csproj b/ROMVault2/ROMVault2.csproj index 7f5db03..2b63bc4 100644 --- a/ROMVault2/ROMVault2.csproj +++ b/ROMVault2/ROMVault2.csproj @@ -36,7 +36,7 @@ full false .\ - TRACE;DEBUG;UNMANAGED, COMPRESS, LZMA_STREAM, DOTNET20 + TRACE;DEBUG;UNMANAGED;COMPRESS;LZMA_STREAM;DOTNET20 prompt 4 false @@ -55,7 +55,7 @@ true ..\..\Stage\ - TRACE;DEBUG;UNMANAGED, COMPRESS, LZMA_STREAM, DOTNET20 + TRACE;DEBUG;UNMANAGED;COMPRESS;LZMA_STREAM;DOTNET20 full x86 ..\..\Stage2\ROMVault2.exe.CodeAnalysisLog.xml @@ -70,7 +70,7 @@ ..\..\Stage\ - TRACE;UNMANAGED, COMPRESS, LZMA_STREAM, DOTNET20 + TRACE;UNMANAGED;COMPRESS;LZMA_STREAM;DOTNET20 true pdbonly AnyCPU @@ -89,7 +89,6 @@ - From 3c6ca00d4ada318e5944501b9aff748e6a42566e Mon Sep 17 00:00:00 2001 From: gjefferyes Date: Wed, 22 Oct 2014 10:37:47 -0500 Subject: [PATCH 04/28] re-added .NET File IO support, to try and get closer to RomVault working on Linux/Mono. --- ROMVault2/IO/RVIO.cs | 171 +++++++++++++++++++++++++++++++++---- ROMVault2/ROMVault2.csproj | 4 +- ROMVault2/Settings.cs | 15 +++- 3 files changed, 167 insertions(+), 23 deletions(-) diff --git a/ROMVault2/IO/RVIO.cs b/ROMVault2/IO/RVIO.cs index 0d90862..c7fc15e 100644 --- a/ROMVault2/IO/RVIO.cs +++ b/ROMVault2/IO/RVIO.cs @@ -47,12 +47,7 @@ namespace ROMVault2.IO public string FullName; public long LastWriteTime; public long Length; - public int fileAttributes; - public bool isHidden - { - get { return (fileAttributes & Win32Native.FILE_ATTRIBUTE_HIDDEN) != 0; } - } public FileInfo() { } @@ -62,6 +57,14 @@ namespace ROMVault2.IO FullName = path; Name = Path.GetFileName(path); + if (Settings.MonoFileIO) + { + System.IO.FileInfo fi = new System.IO.FileInfo(path); + Length = fi.Length; + LastWriteTime = fi.LastWriteTimeUtc.Ticks; + return; + } + string fileName = NameFix.AddLongPathPrefix(path); Win32Native.WIN32_FILE_ATTRIBUTE_DATA wIn32FileAttributeData = new Win32Native.WIN32_FILE_ATTRIBUTE_DATA(); @@ -71,7 +74,6 @@ namespace ROMVault2.IO Length = Convert.Length(wIn32FileAttributeData.fileSizeHigh, wIn32FileAttributeData.fileSizeLow); LastWriteTime = Convert.Time(wIn32FileAttributeData.ftLastWriteTimeHigh, wIn32FileAttributeData.ftLastWriteTimeLow); - fileAttributes = wIn32FileAttributeData.fileAttributes; } } @@ -81,13 +83,7 @@ namespace ROMVault2.IO public string Name; public string FullName; public long LastWriteTime; - public int fileAttributes; - - public bool isHidden - { - get { return (fileAttributes & Win32Native.FILE_ATTRIBUTE_HIDDEN) != 0; } - } - + public DirectoryInfo() { } public DirectoryInfo(string path) @@ -95,6 +91,13 @@ namespace ROMVault2.IO FullName = path; Name = Path.GetFileName(path); + if (Settings.MonoFileIO) + { + System.IO.DirectoryInfo fi = new System.IO.DirectoryInfo(path); + LastWriteTime = fi.LastWriteTimeUtc.Ticks; + return; + } + string fileName = NameFix.AddLongPathPrefix(path); Win32Native.WIN32_FILE_ATTRIBUTE_DATA wIn32FileAttributeData = new Win32Native.WIN32_FILE_ATTRIBUTE_DATA(); @@ -102,7 +105,6 @@ namespace ROMVault2.IO if (!b || (wIn32FileAttributeData.fileAttributes & Win32Native.FILE_ATTRIBUTE_DIRECTORY) == 0) return; LastWriteTime = Convert.Time(wIn32FileAttributeData.ftLastWriteTimeHigh, wIn32FileAttributeData.ftLastWriteTimeLow); - fileAttributes = wIn32FileAttributeData.fileAttributes; } @@ -115,6 +117,25 @@ namespace ROMVault2.IO { List dirs = new List(); + if (Settings.MonoFileIO) + { + System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(FullName); + System.IO.DirectoryInfo[] arrDi = di.GetDirectories(SearchPattern); + foreach (System.IO.DirectoryInfo tDi in arrDi) + { + DirectoryInfo lDi = new DirectoryInfo + { + Name = tDi.Name, + FullName = Path.Combine(FullName, tDi.Name), + LastWriteTime = tDi.LastWriteTimeUtc.Ticks + }; + dirs.Add(lDi); + } + return dirs.ToArray(); + } + + + string dirName = NameFix.AddLongPathPrefix(FullName); Win32Native.WIN32_FIND_DATA findData = new Win32Native.WIN32_FIND_DATA(); @@ -135,8 +156,7 @@ namespace ROMVault2.IO { Name = currentFileName, FullName = Path.Combine(FullName, currentFileName), - LastWriteTime = Convert.Time(findData.ftLastWriteTimeHigh, findData.ftLastWriteTimeLow), - fileAttributes = findData.dwFileAttributes + LastWriteTime = Convert.Time(findData.ftLastWriteTimeHigh, findData.ftLastWriteTimeLow) }; dirs.Add(di); } @@ -157,6 +177,23 @@ namespace ROMVault2.IO { List files = new List(); + if (Settings.MonoFileIO) + { + System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(FullName); + System.IO.FileInfo[] arrDi = di.GetFiles(SearchPattern); + foreach (System.IO.FileInfo tDi in arrDi) + { + FileInfo lDi = new FileInfo + { + Name = tDi.Name, + FullName = Path.Combine(FullName, tDi.Name), + LastWriteTime = tDi.LastWriteTimeUtc.Ticks + }; + files.Add(lDi); + } + return files.ToArray(); + } + string dirName = NameFix.AddLongPathPrefix(FullName); Win32Native.WIN32_FIND_DATA findData = new Win32Native.WIN32_FIND_DATA(); @@ -177,8 +214,7 @@ namespace ROMVault2.IO Name = currentFileName, FullName = Path.Combine(FullName, currentFileName), Length = Convert.Length(findData.nFileSizeHigh, findData.nFileSizeLow), - LastWriteTime = Convert.Time(findData.ftLastWriteTimeHigh, findData.ftLastWriteTimeLow), - fileAttributes = findData.dwFileAttributes + LastWriteTime = Convert.Time(findData.ftLastWriteTimeHigh, findData.ftLastWriteTimeLow) }; files.Add(fi); } @@ -196,6 +232,10 @@ namespace ROMVault2.IO { public static bool Exists(string path) { + if (Settings.MonoFileIO) + return System.IO.Directory.Exists(path); + + string fixPath = NameFix.AddLongPathPrefix(path); Win32Native.WIN32_FILE_ATTRIBUTE_DATA wIn32FileAttributeData = new Win32Native.WIN32_FILE_ATTRIBUTE_DATA(); @@ -205,6 +245,13 @@ namespace ROMVault2.IO } public static void Move(String sourceDirName, String destDirName) { + if (Settings.MonoFileIO) + { + System.IO.Directory.Move(sourceDirName, destDirName); + return; + } + + if (sourceDirName == null) throw new ArgumentNullException("sourceDirName"); if (sourceDirName.Length == 0) @@ -234,6 +281,12 @@ namespace ROMVault2.IO } public static void Delete(String path) { + if (Settings.MonoFileIO) + { + System.IO.Directory.Delete(path); + return; + } + String fullPath = NameFix.AddLongPathPrefix(path); Win32Native.RemoveDirectory(fullPath); @@ -241,6 +294,13 @@ namespace ROMVault2.IO public static void CreateDirectory(String path) { + if (Settings.MonoFileIO) + { + System.IO.Directory.CreateDirectory(path); + return; + } + + if (path == null) throw new ArgumentNullException("path"); if (path.Length == 0) @@ -256,6 +316,10 @@ namespace ROMVault2.IO { public static bool Exists(string path) { + if (Settings.MonoFileIO) + return System.IO.File.Exists(path); + + string fixPath = NameFix.AddLongPathPrefix(path); Win32Native.WIN32_FILE_ATTRIBUTE_DATA wIn32FileAttributeData = new Win32Native.WIN32_FILE_ATTRIBUTE_DATA(); @@ -269,6 +333,12 @@ namespace ROMVault2.IO } public static void Copy(String sourceFileName, String destFileName, bool overwrite) { + if (Settings.MonoFileIO) + { + System.IO.File.Copy(sourceFileName, destFileName, overwrite); + return; + } + if (sourceFileName == null || destFileName == null) throw new ArgumentNullException((sourceFileName == null ? "sourceFileName" : "destFileName"), "ArgumentNull_FileName"); if (sourceFileName.Length == 0 || destFileName.Length == 0) @@ -310,6 +380,12 @@ namespace ROMVault2.IO } public static void Move(String sourceFileName, String destFileName) { + if (Settings.MonoFileIO) + { + System.IO.File.Move(sourceFileName, destFileName); + return; + } + if (sourceFileName == null || destFileName == null) throw new ArgumentNullException((sourceFileName == null ? "sourceFileName" : "destFileName"), "ArgumentNull_FileName"); if (sourceFileName.Length == 0 || destFileName.Length == 0) @@ -329,6 +405,13 @@ namespace ROMVault2.IO } public static void Delete(String path) { + if (Settings.MonoFileIO) + { + System.IO.File.Delete(path); + return; + } + + string fixPath = NameFix.AddLongPathPrefix(path); if (!Win32Native.DeleteFile(fixPath)) @@ -341,6 +424,20 @@ namespace ROMVault2.IO public static bool SetAttributes(String path, FileAttributes fileAttributes) { + if (Settings.MonoFileIO) + { + try + { + System.IO.File.SetAttributes(path, (System.IO.FileAttributes) fileAttributes); + return true; + } + catch (Exception) + { + return false; + } + } + + String fullPath = NameFix.AddLongPathPrefix(path); return Win32Native.SetFileAttributes(fullPath, (int)fileAttributes); } @@ -362,6 +459,9 @@ namespace ROMVault2.IO } public static string Combine(string path1, string path2) { + if (Settings.MonoFileIO) + return System.IO.Path.Combine(path1, path2); + if (path1 == null || path2 == null) throw new ArgumentNullException((path1 == null) ? "path1" : "path2"); //CheckInvalidPathChars(path1); @@ -431,6 +531,10 @@ namespace ROMVault2.IO } public static String GetDirectoryName(String path) { + if (Settings.MonoFileIO) + return System.IO.Path.GetDirectoryName(path); + + if (path != null) { int root = GetRootLength(path); @@ -489,6 +593,19 @@ namespace ROMVault2.IO public static int OpenFileRead(string path, out System.IO.Stream stream) { + if (Settings.MonoFileIO) + { + try + { + stream=new System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Read); + return 0; + } + catch (Exception) + { + stream = null; + return Marshal.GetLastWin32Error(); + } + } string filename = NameFix.AddLongPathPrefix(path); SafeFileHandle hFile = Win32Native.CreateFile(filename, @@ -510,6 +627,21 @@ namespace ROMVault2.IO public static int OpenFileWrite(string path, out System.IO.Stream stream) { + if (Settings.MonoFileIO) + { + try + { + stream = new System.IO.FileStream(path, System.IO.FileMode.Create, System.IO.FileAccess.Write); + return 0; + } + catch (Exception) + { + stream = null; + return Marshal.GetLastWin32Error(); + } + } + + string filename = NameFix.AddLongPathPrefix(path); SafeFileHandle hFile = Win32Native.CreateFile(filename, GENERIC_WRITE, @@ -536,6 +668,9 @@ namespace ROMVault2.IO { public static string GetShortPath(string path) { + if (Settings.MonoFileIO) + return path; + int remove = 0; string retPath; if (path.StartsWith(@"\\")) diff --git a/ROMVault2/ROMVault2.csproj b/ROMVault2/ROMVault2.csproj index 2b63bc4..e08d2ef 100644 --- a/ROMVault2/ROMVault2.csproj +++ b/ROMVault2/ROMVault2.csproj @@ -35,7 +35,7 @@ true full false - .\ + Stage\ TRACE;DEBUG;UNMANAGED;COMPRESS;LZMA_STREAM;DOTNET20 prompt 4 @@ -333,4 +333,4 @@ --> - + \ No newline at end of file diff --git a/ROMVault2/Settings.cs b/ROMVault2/Settings.cs index a5b726b..4efbc9a 100644 --- a/ROMVault2/Settings.cs +++ b/ROMVault2/Settings.cs @@ -48,6 +48,15 @@ namespace ROMVault2 public static bool CacheSaveTimerEnabled = true; public static int CacheSaveTimePeriod = 10; + public static bool MonoFileIO + { + get + { + int p = (int)Environment.OSVersion.Platform; + return ((p == 4) || (p == 6) || (p == 128)); + } + } + public static string EMail { get @@ -88,7 +97,7 @@ namespace ROMVault2 public static void SetDefaults() { - CacheFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "RomVault2_"+DBVersion.Version+".Cache"); + CacheFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "RomVault2_" + DBVersion.Version + ".Cache"); //DatRoot = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DatRoot"); DatRoot = "DatRoot"; @@ -135,10 +144,10 @@ namespace ROMVault2 bw.Write(ver); //int bw.Write(DatRoot); //string - bw.Write((Int32)ScanLevel); + bw.Write((Int32)ScanLevel); bw.Write((Int32)FixLevel); bw.Write(DebugLogsEnabled); //bool - + bw.Write(IgnoreFiles.Count); //int foreach (string t in IgnoreFiles) { From be346c3485c910a36a3fb13e9665eea562d57048 Mon Sep 17 00:00:00 2001 From: gjefferyes Date: Wed, 22 Oct 2014 10:50:41 -0500 Subject: [PATCH 05/28] Fix bug: DatMaker truncates filenames containing periods --- ROMVault2/DatMaker.cs | 4 ++-- ROMVault2/Program.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ROMVault2/DatMaker.cs b/ROMVault2/DatMaker.cs index e86175c..90820e2 100644 --- a/ROMVault2/DatMaker.cs +++ b/ROMVault2/DatMaker.cs @@ -76,8 +76,8 @@ namespace ROMVault2 RvDir game = dir.Child(i) as RvDir; if (game != null && game.FileType == FileType.Zip) { - WriteLine(d + ""); - WriteLine(d + " " + clean(Path.GetFileNameWithoutExtension(game.Name)) + ""); + WriteLine(d + ""); + WriteLine(d + " " + clean(game.Name) + ""); for (int j = 0; j < game.ChildCount; j++) diff --git a/ROMVault2/Program.cs b/ROMVault2/Program.cs index b7f9035..95e594e 100644 --- a/ROMVault2/Program.cs +++ b/ROMVault2/Program.cs @@ -15,7 +15,7 @@ namespace ROMVault2 //public static UsernamePassword Up; public static readonly Encoding Enc = Encoding.GetEncoding(28591); public const string Version = "2.1"; - public const int SubVersion = 25; + public const int SubVersion = 26; public static string ErrorMessage; public static string URL; From 9a6bc0a165d8d7a851fabdd05a67b27482afc801 Mon Sep 17 00:00:00 2001 From: Jim Westfall Date: Wed, 22 Oct 2014 17:56:46 -0700 Subject: [PATCH 06/28] Don't attempt to read Length/LastWriteTimeUtc if the file/dir doesn't exist --- ROMVault2/IO/RVIO.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ROMVault2/IO/RVIO.cs b/ROMVault2/IO/RVIO.cs index c7fc15e..6361ce1 100644 --- a/ROMVault2/IO/RVIO.cs +++ b/ROMVault2/IO/RVIO.cs @@ -60,6 +60,9 @@ namespace ROMVault2.IO if (Settings.MonoFileIO) { System.IO.FileInfo fi = new System.IO.FileInfo(path); + + if(!fi.Exists) return; + Length = fi.Length; LastWriteTime = fi.LastWriteTimeUtc.Ticks; return; @@ -94,6 +97,9 @@ namespace ROMVault2.IO if (Settings.MonoFileIO) { System.IO.DirectoryInfo fi = new System.IO.DirectoryInfo(path); + + if(!fi.Exists) return; + LastWriteTime = fi.LastWriteTimeUtc.Ticks; return; } From f436495aa2b227571087696f30acd0f7979ee139 Mon Sep 17 00:00:00 2001 From: Jim Westfall Date: Thu, 23 Oct 2014 21:59:09 -0700 Subject: [PATCH 07/28] Fix classes to match up with recent file renames --- ROMVault2/FrmHelpAbout.Designer.cs | 10 +++++----- ROMVault2/FrmHelpAbout.cs | 4 ++-- ROMVault2/FrmKey.Designer.cs | 12 ++++++------ ROMVault2/FrmKey.cs | 6 +++--- ROMVault2/FrmMain.cs | 10 +++++----- ROMVault2/FrmShowError.Designer.cs | 10 +++++----- ROMVault2/FrmShowError.cs | 4 ++-- ROMVault2/FrmSplashScreen.Designer.cs | 4 ++-- ROMVault2/ReportError.cs | 8 ++++---- 9 files changed, 34 insertions(+), 34 deletions(-) diff --git a/ROMVault2/FrmHelpAbout.Designer.cs b/ROMVault2/FrmHelpAbout.Designer.cs index 0d5280d..0bf9571 100644 --- a/ROMVault2/FrmHelpAbout.Designer.cs +++ b/ROMVault2/FrmHelpAbout.Designer.cs @@ -1,6 +1,6 @@ namespace ROMVault2 { - partial class frmHelpAbout + partial class FrmHelpAbout { /// /// Required designer variable. @@ -67,7 +67,7 @@ this.label2.Text = "support@romvault.com"; this.label2.Click += new System.EventHandler(this.label2_Click); // - // frmHelpAbout + // FrmHelpAbout // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; @@ -79,10 +79,10 @@ this.Controls.Add(this.lblVersion); this.DoubleBuffered = true; this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; - this.Name = "frmHelpAbout"; + this.Name = "FrmHelpAbout"; this.ShowInTaskbar = false; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "frmHelpAbout"; + this.Text = "FrmHelpAbout"; this.ResumeLayout(false); this.PerformLayout(); @@ -94,4 +94,4 @@ private System.Windows.Forms.Label label1; private System.Windows.Forms.Label label2; } -} \ No newline at end of file +} diff --git a/ROMVault2/FrmHelpAbout.cs b/ROMVault2/FrmHelpAbout.cs index d03e933..1456503 100644 --- a/ROMVault2/FrmHelpAbout.cs +++ b/ROMVault2/FrmHelpAbout.cs @@ -9,9 +9,9 @@ using System.Windows.Forms; namespace ROMVault2 { - public partial class frmHelpAbout : Form + public partial class FrmHelpAbout : Form { - public frmHelpAbout() + public FrmHelpAbout() { InitializeComponent(); diff --git a/ROMVault2/FrmKey.Designer.cs b/ROMVault2/FrmKey.Designer.cs index b2f0c2c..81679fb 100644 --- a/ROMVault2/FrmKey.Designer.cs +++ b/ROMVault2/FrmKey.Designer.cs @@ -1,6 +1,6 @@ namespace ROMVault2 { - partial class frmKey + partial class FrmKey { /// /// Required designer variable. @@ -28,10 +28,10 @@ /// private void InitializeComponent() { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmKey)); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmKey)); this.SuspendLayout(); // - // frmKey + // FrmKey // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; @@ -39,10 +39,10 @@ this.ClientSize = new System.Drawing.Size(600, 532); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.Name = "frmKey"; + this.Name = "FrmKey"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; this.Text = "Color Key to ROM Status"; - this.Load += new System.EventHandler(this.frmKey_Load); + this.Load += new System.EventHandler(this.FrmKey_Load); this.ResumeLayout(false); } @@ -52,4 +52,4 @@ } -} \ No newline at end of file +} diff --git a/ROMVault2/FrmKey.cs b/ROMVault2/FrmKey.cs index 55e5b06..9806604 100644 --- a/ROMVault2/FrmKey.cs +++ b/ROMVault2/FrmKey.cs @@ -11,14 +11,14 @@ using System.Windows.Forms; namespace ROMVault2 { - public partial class frmKey : Form + public partial class FrmKey : Form { - public frmKey() + public FrmKey() { InitializeComponent(); } - private void frmKey_Load(object sender, EventArgs e) + private void FrmKey_Load(object sender, EventArgs e) { List displayList= new List { diff --git a/ROMVault2/FrmMain.cs b/ROMVault2/FrmMain.cs index c55d983..884be82 100644 --- a/ROMVault2/FrmMain.cs +++ b/ROMVault2/FrmMain.cs @@ -1,4 +1,4 @@ -/****************************************************** +/****************************************************** * ROMVault2 is written by Gordon J. * * Contact gordon@romvault.com * * Copyright 2010 * @@ -40,7 +40,7 @@ namespace ROMVault2 public static int[] GameGridColumnXPositions; - private frmKey _fk; + private FrmKey _fk; private Single _scaleFactorX = 1; private Single _scaleFactorY = 1; @@ -1201,7 +1201,7 @@ namespace ROMVault2 { if (_fk == null || _fk.IsDisposed) - _fk = new frmKey(); + _fk = new FrmKey(); _fk.Show(); } @@ -1215,7 +1215,7 @@ namespace ROMVault2 private void BtnReportClick(object sender, EventArgs e) { Report.MakeFixFiles(); - //frmReport newreporter = new frmReport(); + //FrmReport newreporter = new FrmReport(); //newreporter.ShowDialog(); //newreporter.Dispose(); } @@ -1236,7 +1236,7 @@ namespace ROMVault2 private void AboutRomVaultToolStripMenuItemClick(object sender, EventArgs e) { - frmHelpAbout fha = new frmHelpAbout(); + FrmHelpAbout fha = new FrmHelpAbout(); fha.ShowDialog(this); fha.Dispose(); } diff --git a/ROMVault2/FrmShowError.Designer.cs b/ROMVault2/FrmShowError.Designer.cs index 71d830b..6e8fa58 100644 --- a/ROMVault2/FrmShowError.Designer.cs +++ b/ROMVault2/FrmShowError.Designer.cs @@ -1,6 +1,6 @@ namespace ROMVault2 { - partial class frmShowError + partial class FrmShowError { /// /// Required designer variable. @@ -28,7 +28,7 @@ /// private void InitializeComponent() { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmShowError)); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmShowError)); this.textBox1 = new System.Windows.Forms.TextBox(); this.button1 = new System.Windows.Forms.Button(); this.label1 = new System.Windows.Forms.Label(); @@ -62,7 +62,7 @@ this.label1.TabIndex = 2; this.label1.Text = "Sending Error Message to RomVault.Com"; // - // frmShowError + // FrmShowError // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; @@ -72,7 +72,7 @@ this.Controls.Add(this.textBox1); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D; this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.Name = "frmShowError"; + this.Name = "FrmShowError"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; this.Text = "RomVault Error report"; this.ResumeLayout(false); @@ -86,4 +86,4 @@ private System.Windows.Forms.Button button1; private System.Windows.Forms.Label label1; } -} \ No newline at end of file +} diff --git a/ROMVault2/FrmShowError.cs b/ROMVault2/FrmShowError.cs index 6e12bec..b1202bc 100644 --- a/ROMVault2/FrmShowError.cs +++ b/ROMVault2/FrmShowError.cs @@ -9,9 +9,9 @@ using System.Windows.Forms; namespace ROMVault2 { - public partial class frmShowError : Form + public partial class FrmShowError : Form { - public frmShowError() + public FrmShowError() { InitializeComponent(); } diff --git a/ROMVault2/FrmSplashScreen.Designer.cs b/ROMVault2/FrmSplashScreen.Designer.cs index 9003df2..04ae6d7 100644 --- a/ROMVault2/FrmSplashScreen.Designer.cs +++ b/ROMVault2/FrmSplashScreen.Designer.cs @@ -100,7 +100,7 @@ this.Name = "FrmSplashScreen"; this.ShowInTaskbar = false; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; - this.Text = "frmSplashScreen"; + this.Text = "FrmSplashScreen"; this.Shown += new System.EventHandler(this.FrmSplashScreenShown); this.ResumeLayout(false); this.PerformLayout(); @@ -116,4 +116,4 @@ private System.ComponentModel.BackgroundWorker bgWork; private System.Windows.Forms.Label label1; } -} \ No newline at end of file +} diff --git a/ROMVault2/ReportError.cs b/ROMVault2/ReportError.cs index 6abeefd..f1e54db 100644 --- a/ROMVault2/ReportError.cs +++ b/ROMVault2/ReportError.cs @@ -34,7 +34,7 @@ namespace ROMVault2 SendErrorMessage(message); - frmShowError fshow = new frmShowError(); + FrmShowError fshow = new FrmShowError(); fshow.settype(message); fshow.ShowDialog(); @@ -60,7 +60,7 @@ namespace ROMVault2 SendErrorMessage(message); - frmShowError fshow = new frmShowError(); + FrmShowError fshow = new FrmShowError(); fshow.settype(message); fshow.ShowDialog(); @@ -82,7 +82,7 @@ namespace ROMVault2 SendErrorMessage(message); - frmShowError fshow = new frmShowError(); + FrmShowError fshow = new FrmShowError(); fshow.settype(message); fshow.ShowDialog(); @@ -225,4 +225,4 @@ namespace ROMVault2 sw.Close(); } } -} \ No newline at end of file +} From 47bf98faf0adb5a82c8c504ac52210d47418056e Mon Sep 17 00:00:00 2001 From: Jim Westfall Date: Thu, 23 Oct 2014 22:04:01 -0700 Subject: [PATCH 08/28] remove needless Console.ReadLine(), causes ui to stall waiting for input on console/tty --- ROMVault2/DatMaker.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/ROMVault2/DatMaker.cs b/ROMVault2/DatMaker.cs index 90820e2..06c1a14 100644 --- a/ROMVault2/DatMaker.cs +++ b/ROMVault2/DatMaker.cs @@ -27,7 +27,6 @@ namespace ROMVault2 _sw.Close(); Console.WriteLine("Dat creation complete"); - Console.ReadLine(); } private static void WriteDatFile(RvDir dir) From bbfa9156360bb49605450a1e1df9422b042597e4 Mon Sep 17 00:00:00 2001 From: Jim Westfall Date: Sun, 26 Oct 2014 19:07:05 -0700 Subject: [PATCH 09/28] Replace *CellDraw classes with CellFormatting functions. This fixes rendering and crashing issues in (Rom|Game)Grid with mono. --- ROMVault2/DirCellDraw.cs | 146 ---------------------------------- ROMVault2/FrmMain.Designer.cs | 2 + ROMVault2/FrmMain.cs | 129 ++++++++++++++++++++++++++---- ROMVault2/ROMVault2.csproj | 3 +- 4 files changed, 115 insertions(+), 165 deletions(-) delete mode 100644 ROMVault2/DirCellDraw.cs diff --git a/ROMVault2/DirCellDraw.cs b/ROMVault2/DirCellDraw.cs deleted file mode 100644 index 66de677..0000000 --- a/ROMVault2/DirCellDraw.cs +++ /dev/null @@ -1,146 +0,0 @@ -/****************************************************** - * ROMVault2 is written by Gordon J. * - * Contact gordon@romvault.com * - * Copyright 2014 * - ******************************************************/ - -using System.Diagnostics; -using System.Drawing; -using System.Globalization; -using System.Windows.Forms; -using ROMVault2.RvDB; -using ROMVault2.SupportedFiles; - -namespace ROMVault2 -{ - - public class RomCellDraw : DataGridViewImageCell - { - private readonly Color _bgCol; - private readonly string _bitmapName; - - public RomCellDraw(string name,Color bgCol) - { - _bitmapName = name; - _bgCol = bgCol; - - } - - protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, DataGridViewElementStates elementState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts) - { - graphics.FillRectangle(new SolidBrush(_bgCol), cellBounds); - - Bitmap bm= rvImages.GetBitmap(_bitmapName); - - if (bm != null) - { - graphics.DrawImage(bm, cellBounds.Left, cellBounds.Top, bm.Width,bm.Height); - bm.Dispose(); - } - - - else - Debug.WriteLine("Missing Graphic for " + _bitmapName); - } - - } - - public class DirCellDraw : DataGridViewImageCell - { - private readonly Color _bgCol; - private readonly RvDir _cellDir; - - public DirCellDraw(RvDir cellDir, Color bgCol) - { - _cellDir = cellDir; - _bgCol = bgCol; - } - - protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, DataGridViewElementStates elementState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts) - { - - graphics.FillRectangle(new SolidBrush(_bgCol), cellBounds); - - string bitmapName; - - switch (_cellDir.FileType) - { - case FileType.Zip: - if (_cellDir.RepStatus == RepStatus.DirCorrect && _cellDir.ZipStatus==ZipStatus.TrrntZip) - bitmapName = "ZipTZ"; - else - bitmapName = "Zip" + _cellDir.RepStatus; - break; - default: - bitmapName = "Dir" + _cellDir.RepStatus; - break; - } - - Bitmap bm = rvImages.GetBitmap(bitmapName); - - if (bm != null) - { - graphics.DrawImage(bm, cellBounds.Left + 10, cellBounds.Top, 21, 17); - bm.Dispose(); - } - else - Debug.WriteLine("Missing Graphic for " + bitmapName); - } - } - - public class DirCellStatusDraw : DataGridViewImageCell - { - private readonly RvDir _dir; - public DirCellStatusDraw(RvDir dir) - { - _dir = dir; - } - - protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, DataGridViewElementStates elementState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts) - { - Font drawFont = new Font("Arial", 9); - SolidBrush drawBrushBlack = new SolidBrush(Color.Black); - SolidBrush drawBrushWhite = new SolidBrush(Color.White); - - graphics.FillRectangle(drawBrushWhite, cellBounds); - - int gOff; - int columnIndex = 0; - for (int l = 0; l < RepairStatus.DisplayOrder.Length; l++) - { - if (l >= 13) columnIndex = l; - - if (_dir.DirStatus.Get(RepairStatus.DisplayOrder[l]) <= 0) continue; - - gOff = cellBounds.Left + FrmMain.GameGridColumnXPositions[columnIndex]; - Bitmap bm = rvImages.GetBitmap(@"G_" + RepairStatus.DisplayOrder[l]); - if (bm != null) - { - graphics.DrawImage(bm, gOff, cellBounds.Top, 21, 18); - bm.Dispose(); - } - else - Debug.WriteLine("Missing Graphics for " + "G_" + RepairStatus.DisplayOrder[l]); - - columnIndex++; - } - - columnIndex = 0; - for (int l = 0; l < RepairStatus.DisplayOrder.Length; l++) - { - if (l >= 13) - columnIndex = l; - - if (_dir.DirStatus.Get(RepairStatus.DisplayOrder[l]) > 0) - { - gOff = cellBounds.Left + FrmMain.GameGridColumnXPositions[columnIndex]; - graphics.DrawString(_dir.DirStatus.Get(RepairStatus.DisplayOrder[l]).ToString(CultureInfo.InvariantCulture), drawFont, drawBrushBlack, new PointF(gOff + 20, cellBounds.Top + 3)); - columnIndex++; - } - } - drawBrushBlack.Dispose(); - drawBrushWhite.Dispose(); - drawFont.Dispose(); - } - } -} \ No newline at end of file diff --git a/ROMVault2/FrmMain.Designer.cs b/ROMVault2/FrmMain.Designer.cs index 2bbf160..71507f0 100644 --- a/ROMVault2/FrmMain.Designer.cs +++ b/ROMVault2/FrmMain.Designer.cs @@ -654,6 +654,7 @@ this.GameGrid.ShowRowErrors = false; this.GameGrid.Size = new System.Drawing.Size(697, 267); this.GameGrid.TabIndex = 4; + this.GameGrid.CellFormatting += new System.Windows.Forms.DataGridViewCellFormattingEventHandler(this.GameGrid_CellFormatting); this.GameGrid.SelectionChanged += new System.EventHandler(this.GameGridSelectionChanged); this.GameGrid.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.GameGridMouseDoubleClick); this.GameGrid.MouseUp += new System.Windows.Forms.MouseEventHandler(this.GameGrid_MouseUp); @@ -746,6 +747,7 @@ this.RomGrid.ShowRowErrors = false; this.RomGrid.Size = new System.Drawing.Size(697, 315); this.RomGrid.TabIndex = 21; + this.RomGrid.CellFormatting += new System.Windows.Forms.DataGridViewCellFormattingEventHandler(this.RomGrid_CellFormatting); this.RomGrid.SelectionChanged += new System.EventHandler(this.RomGridSelectionChanged); this.RomGrid.MouseUp += new System.Windows.Forms.MouseEventHandler(this.RomGridMouseUp); // diff --git a/ROMVault2/FrmMain.cs b/ROMVault2/FrmMain.cs index 884be82..800fa24 100644 --- a/ROMVault2/FrmMain.cs +++ b/ROMVault2/FrmMain.cs @@ -13,6 +13,7 @@ using ROMVault2.Properties; using ROMVault2.RVRef; using ROMVault2.RvDB; using ROMVault2.Utils; +using ROMVault2.SupportedFiles; namespace ROMVault2 { @@ -477,6 +478,108 @@ namespace ROMVault2 DatMaker.MakeDatFromDir(thisDir); } + private void GameGrid_CellFormatting(object sender, System.Windows.Forms.DataGridViewCellFormattingEventArgs e) + { + + Rectangle cellBounds = GameGrid.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true); + RvDir tRvDir = (ROMVault2.RvDB.RvDir)GameGrid.Rows[e.RowIndex].Tag; + + if (GameGrid.Columns[e.ColumnIndex].Name == "Type") + { + Bitmap bmp = new Bitmap(cellBounds.Width, cellBounds.Height); + Graphics g = Graphics.FromImage(bmp); + + string bitmapName; + switch (tRvDir.FileType) + { + case FileType.Zip: + if (tRvDir.RepStatus == RepStatus.DirCorrect && tRvDir.ZipStatus == ZipStatus.TrrntZip) + bitmapName = "ZipTZ"; + else + bitmapName = "Zip" + tRvDir.RepStatus; + break; + default: + // hack because DirDirInToSort image doesnt exist. + if (tRvDir.RepStatus == RepStatus.DirInToSort) + bitmapName = "Dir" + RepStatus.DirUnknown; + else + bitmapName = "Dir" + tRvDir.RepStatus; + + break; + } + + Bitmap bm = rvImages.GetBitmap(bitmapName); + if (bm != null) + { + g.DrawImage(bm, (cellBounds.Width - cellBounds.Height) / 2, 0, 18, 18); + bm.Dispose(); + } + else + Debug.WriteLine("Missing Graphic for " + bitmapName); + + e.Value = bmp; + + } else if (GameGrid.Columns[e.ColumnIndex].Name == "CCorrect") { + Bitmap bmp = new Bitmap(cellBounds.Width, cellBounds.Height); + Graphics g = Graphics.FromImage(bmp); + Font drawFont = new Font("Arial", 9); + SolidBrush drawBrushBlack = new SolidBrush(Color.Black); + + int gOff; + int columnIndex = 0; + for (int l = 0; l < RepairStatus.DisplayOrder.Length; l++) + { + if (l >= 13) columnIndex = l; + + if (tRvDir.DirStatus.Get(RepairStatus.DisplayOrder[l]) <= 0) continue; + + gOff = FrmMain.GameGridColumnXPositions[columnIndex]; + Bitmap bm = rvImages.GetBitmap(@"G_" + RepairStatus.DisplayOrder[l]); + if (bm != null) + { + g.DrawImage(bm, gOff, 0, 21, 18); + bm.Dispose(); + } + else + Debug.WriteLine("Missing Graphics for " + "G_" + RepairStatus.DisplayOrder[l]); + + columnIndex++; + } + + columnIndex = 0; + for (int l = 0; l < RepairStatus.DisplayOrder.Length; l++) + { + if (l >= 13) + columnIndex = l; + + if (tRvDir.DirStatus.Get(RepairStatus.DisplayOrder[l]) > 0) + { + gOff = FrmMain.GameGridColumnXPositions[columnIndex]; + g.DrawString(tRvDir.DirStatus.Get(RepairStatus.DisplayOrder[l]).ToString(CultureInfo.InvariantCulture), drawFont, drawBrushBlack, new PointF(gOff + 20, 3)); + columnIndex++; + } + } + drawBrushBlack.Dispose(); + drawFont.Dispose(); + e.Value = bmp; + } + } + + private void RomGrid_CellFormatting(object sender, System.Windows.Forms.DataGridViewCellFormattingEventArgs e) + { + Rectangle cellBounds = RomGrid.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true); + RvFile tRvFile = (ROMVault2.RvDB.RvFile)RomGrid.Rows[e.RowIndex].Tag; + + if (RomGrid.Columns[e.ColumnIndex].Name == "CGot") + { + Bitmap bmp = new Bitmap(cellBounds.Width, cellBounds.Height); + Graphics g = Graphics.FromImage(bmp); + string bitmapName = "R_" + tRvFile.DatStatus + "_" + tRvFile.RepStatus; + g.DrawImage(rvImages.GetBitmap(bitmapName), 0, 0, 54, 18); + e.Value = bmp; + } + } + private void splitContainer3_Panel1_Resize(object sender, EventArgs e) { gbDatInfo.Width = splitContainer3.Panel1.Width - (gbDatInfo.Left * 2); @@ -670,23 +773,19 @@ namespace ROMVault2 GameGrid.Rows[iRow].Selected = false; GameGrid.Rows[iRow].Tag = tChildDir; - GameGrid.Rows[iRow].Cells[0].Style.BackColor = bgCol; - GameGrid.Rows[iRow].Cells[1].Style.BackColor = bgCol; - GameGrid.Rows[iRow].Cells[2].Style.BackColor = bgCol; + GameGrid.Rows[iRow].Cells["Type"].Style.BackColor = bgCol; + GameGrid.Rows[iRow].Cells["Type"].Style.SelectionBackColor = bgCol; + GameGrid.Rows[iRow].Cells["CGame"].Style.BackColor = bgCol; + GameGrid.Rows[iRow].Cells["CDescription"].Style.BackColor = bgCol; + GameGrid.Rows[iRow].Cells["CCorrect"].Style.SelectionBackColor = Color.White; if (String.IsNullOrEmpty(tChildDir.FileName)) - GameGrid.Rows[iRow].Cells[1].Value = tChildDir.Name; + GameGrid.Rows[iRow].Cells["CGame"].Value = tChildDir.Name; else - GameGrid.Rows[iRow].Cells[1].Value = tChildDir.Name + " (Found: " + tChildDir.FileName + ")"; + GameGrid.Rows[iRow].Cells["CGame"].Value = tChildDir.Name + " (Found: " + tChildDir.FileName + ")"; if (tChildDir.Game != null) - GameGrid.Rows[iRow].Cells[2].Value = tChildDir.Game.GetData(RvGame.GameData.Description); - - DirCellDraw tDirCellDraw = new DirCellDraw(tChildDir, bgCol); - GameGrid.Rows[iRow].Cells[0] = tDirCellDraw; - - DirCellStatusDraw tCellStatusDraw = new DirCellStatusDraw(tChildDir); - GameGrid.Rows[iRow].Cells[3] = tCellStatusDraw; + GameGrid.Rows[iRow].Cells["CDescription"].Value = tChildDir.Game.GetData(RvGame.GameData.Description); } _updatingGameGrid = false; @@ -1085,11 +1184,7 @@ namespace ROMVault2 { RomGrid.Rows.Add(); int row = RomGrid.Rows.Count - 1; - - string imageName = "R_" + tRomTable.DatStatus + "_" + tRomTable.RepStatus; - - RomCellDraw tDirCellDraw = new RomCellDraw(imageName, _displayColor[(int)tRomTable.RepStatus]); - RomGrid.Rows[row].Cells[0] = tDirCellDraw; + RomGrid.Rows[row].Tag = tRomTable; for (int i = 0; i < RomGrid.Rows[row].Cells.Count; i++) RomGrid.Rows[row].Cells[i].Style.BackColor = _displayColor[(int)tRomTable.RepStatus]; diff --git a/ROMVault2/ROMVault2.csproj b/ROMVault2/ROMVault2.csproj index e08d2ef..269e5e3 100644 --- a/ROMVault2/ROMVault2.csproj +++ b/ROMVault2/ROMVault2.csproj @@ -163,7 +163,6 @@ FrmSettings.cs - Form @@ -333,4 +332,4 @@ --> - \ No newline at end of file + From d5fb529b7b4268874c79b6e228dea2d364bafe52 Mon Sep 17 00:00:00 2001 From: Jim Westfall Date: Sun, 26 Oct 2014 19:52:29 -0700 Subject: [PATCH 10/28] Need cellbounds to be the full wide and not just the visual. --- ROMVault2/FrmMain.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ROMVault2/FrmMain.cs b/ROMVault2/FrmMain.cs index 800fa24..c89da12 100644 --- a/ROMVault2/FrmMain.cs +++ b/ROMVault2/FrmMain.cs @@ -481,7 +481,7 @@ namespace ROMVault2 private void GameGrid_CellFormatting(object sender, System.Windows.Forms.DataGridViewCellFormattingEventArgs e) { - Rectangle cellBounds = GameGrid.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true); + Rectangle cellBounds = GameGrid.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, false); RvDir tRvDir = (ROMVault2.RvDB.RvDir)GameGrid.Rows[e.RowIndex].Tag; if (GameGrid.Columns[e.ColumnIndex].Name == "Type") @@ -567,7 +567,7 @@ namespace ROMVault2 private void RomGrid_CellFormatting(object sender, System.Windows.Forms.DataGridViewCellFormattingEventArgs e) { - Rectangle cellBounds = RomGrid.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true); + Rectangle cellBounds = RomGrid.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, false); RvFile tRvFile = (ROMVault2.RvDB.RvFile)RomGrid.Rows[e.RowIndex].Tag; if (RomGrid.Columns[e.ColumnIndex].Name == "CGot") From bb4b77a6d77a288320b3ac7b55a52e1ee6e685e3 Mon Sep 17 00:00:00 2001 From: Jim Westfall Date: Sun, 26 Oct 2014 19:58:01 -0700 Subject: [PATCH 11/28] Move (Rom|Game)Grid CellFormatting functions to be in the right #region sections --- ROMVault2/FrmMain.cs | 204 +++++++++++++++++++++---------------------- 1 file changed, 102 insertions(+), 102 deletions(-) diff --git a/ROMVault2/FrmMain.cs b/ROMVault2/FrmMain.cs index c89da12..0e4a104 100644 --- a/ROMVault2/FrmMain.cs +++ b/ROMVault2/FrmMain.cs @@ -478,108 +478,6 @@ namespace ROMVault2 DatMaker.MakeDatFromDir(thisDir); } - private void GameGrid_CellFormatting(object sender, System.Windows.Forms.DataGridViewCellFormattingEventArgs e) - { - - Rectangle cellBounds = GameGrid.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, false); - RvDir tRvDir = (ROMVault2.RvDB.RvDir)GameGrid.Rows[e.RowIndex].Tag; - - if (GameGrid.Columns[e.ColumnIndex].Name == "Type") - { - Bitmap bmp = new Bitmap(cellBounds.Width, cellBounds.Height); - Graphics g = Graphics.FromImage(bmp); - - string bitmapName; - switch (tRvDir.FileType) - { - case FileType.Zip: - if (tRvDir.RepStatus == RepStatus.DirCorrect && tRvDir.ZipStatus == ZipStatus.TrrntZip) - bitmapName = "ZipTZ"; - else - bitmapName = "Zip" + tRvDir.RepStatus; - break; - default: - // hack because DirDirInToSort image doesnt exist. - if (tRvDir.RepStatus == RepStatus.DirInToSort) - bitmapName = "Dir" + RepStatus.DirUnknown; - else - bitmapName = "Dir" + tRvDir.RepStatus; - - break; - } - - Bitmap bm = rvImages.GetBitmap(bitmapName); - if (bm != null) - { - g.DrawImage(bm, (cellBounds.Width - cellBounds.Height) / 2, 0, 18, 18); - bm.Dispose(); - } - else - Debug.WriteLine("Missing Graphic for " + bitmapName); - - e.Value = bmp; - - } else if (GameGrid.Columns[e.ColumnIndex].Name == "CCorrect") { - Bitmap bmp = new Bitmap(cellBounds.Width, cellBounds.Height); - Graphics g = Graphics.FromImage(bmp); - Font drawFont = new Font("Arial", 9); - SolidBrush drawBrushBlack = new SolidBrush(Color.Black); - - int gOff; - int columnIndex = 0; - for (int l = 0; l < RepairStatus.DisplayOrder.Length; l++) - { - if (l >= 13) columnIndex = l; - - if (tRvDir.DirStatus.Get(RepairStatus.DisplayOrder[l]) <= 0) continue; - - gOff = FrmMain.GameGridColumnXPositions[columnIndex]; - Bitmap bm = rvImages.GetBitmap(@"G_" + RepairStatus.DisplayOrder[l]); - if (bm != null) - { - g.DrawImage(bm, gOff, 0, 21, 18); - bm.Dispose(); - } - else - Debug.WriteLine("Missing Graphics for " + "G_" + RepairStatus.DisplayOrder[l]); - - columnIndex++; - } - - columnIndex = 0; - for (int l = 0; l < RepairStatus.DisplayOrder.Length; l++) - { - if (l >= 13) - columnIndex = l; - - if (tRvDir.DirStatus.Get(RepairStatus.DisplayOrder[l]) > 0) - { - gOff = FrmMain.GameGridColumnXPositions[columnIndex]; - g.DrawString(tRvDir.DirStatus.Get(RepairStatus.DisplayOrder[l]).ToString(CultureInfo.InvariantCulture), drawFont, drawBrushBlack, new PointF(gOff + 20, 3)); - columnIndex++; - } - } - drawBrushBlack.Dispose(); - drawFont.Dispose(); - e.Value = bmp; - } - } - - private void RomGrid_CellFormatting(object sender, System.Windows.Forms.DataGridViewCellFormattingEventArgs e) - { - Rectangle cellBounds = RomGrid.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, false); - RvFile tRvFile = (ROMVault2.RvDB.RvFile)RomGrid.Rows[e.RowIndex].Tag; - - if (RomGrid.Columns[e.ColumnIndex].Name == "CGot") - { - Bitmap bmp = new Bitmap(cellBounds.Width, cellBounds.Height); - Graphics g = Graphics.FromImage(bmp); - string bitmapName = "R_" + tRvFile.DatStatus + "_" + tRvFile.RepStatus; - g.DrawImage(rvImages.GetBitmap(bitmapName), 0, 0, 54, 18); - e.Value = bmp; - } - } - private void splitContainer3_Panel1_Resize(object sender, EventArgs e) { gbDatInfo.Width = splitContainer3.Panel1.Width - (gbDatInfo.Left * 2); @@ -829,6 +727,92 @@ namespace ROMVault2 } } + private void GameGrid_CellFormatting(object sender, System.Windows.Forms.DataGridViewCellFormattingEventArgs e) + { + + Rectangle cellBounds = GameGrid.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, false); + RvDir tRvDir = (ROMVault2.RvDB.RvDir)GameGrid.Rows[e.RowIndex].Tag; + + if (GameGrid.Columns[e.ColumnIndex].Name == "Type") + { + Bitmap bmp = new Bitmap(cellBounds.Width, cellBounds.Height); + Graphics g = Graphics.FromImage(bmp); + + string bitmapName; + switch (tRvDir.FileType) + { + case FileType.Zip: + if (tRvDir.RepStatus == RepStatus.DirCorrect && tRvDir.ZipStatus == ZipStatus.TrrntZip) + bitmapName = "ZipTZ"; + else + bitmapName = "Zip" + tRvDir.RepStatus; + break; + default: + // hack because DirDirInToSort image doesnt exist. + if (tRvDir.RepStatus == RepStatus.DirInToSort) + bitmapName = "Dir" + RepStatus.DirUnknown; + else + bitmapName = "Dir" + tRvDir.RepStatus; + + break; + } + + Bitmap bm = rvImages.GetBitmap(bitmapName); + if (bm != null) + { + g.DrawImage(bm, (cellBounds.Width - cellBounds.Height) / 2, 0, 18, 18); + bm.Dispose(); + } + else + Debug.WriteLine("Missing Graphic for " + bitmapName); + + e.Value = bmp; + + } else if (GameGrid.Columns[e.ColumnIndex].Name == "CCorrect") { + Bitmap bmp = new Bitmap(cellBounds.Width, cellBounds.Height); + Graphics g = Graphics.FromImage(bmp); + Font drawFont = new Font("Arial", 9); + SolidBrush drawBrushBlack = new SolidBrush(Color.Black); + + int gOff; + int columnIndex = 0; + for (int l = 0; l < RepairStatus.DisplayOrder.Length; l++) + { + if (l >= 13) columnIndex = l; + + if (tRvDir.DirStatus.Get(RepairStatus.DisplayOrder[l]) <= 0) continue; + + gOff = FrmMain.GameGridColumnXPositions[columnIndex]; + Bitmap bm = rvImages.GetBitmap(@"G_" + RepairStatus.DisplayOrder[l]); + if (bm != null) + { + g.DrawImage(bm, gOff, 0, 21, 18); + bm.Dispose(); + } + else + Debug.WriteLine("Missing Graphics for " + "G_" + RepairStatus.DisplayOrder[l]); + + columnIndex++; + } + + columnIndex = 0; + for (int l = 0; l < RepairStatus.DisplayOrder.Length; l++) + { + if (l >= 13) + columnIndex = l; + + if (tRvDir.DirStatus.Get(RepairStatus.DisplayOrder[l]) > 0) + { + gOff = FrmMain.GameGridColumnXPositions[columnIndex]; + g.DrawString(tRvDir.DirStatus.Get(RepairStatus.DisplayOrder[l]).ToString(CultureInfo.InvariantCulture), drawFont, drawBrushBlack, new PointF(gOff + 20, 3)); + columnIndex++; + } + } + drawBrushBlack.Dispose(); + drawFont.Dispose(); + e.Value = bmp; + } + } #endregion @@ -1265,6 +1249,22 @@ namespace ROMVault2 } } } + + private void RomGrid_CellFormatting(object sender, System.Windows.Forms.DataGridViewCellFormattingEventArgs e) + { + Rectangle cellBounds = RomGrid.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, false); + RvFile tRvFile = (ROMVault2.RvDB.RvFile)RomGrid.Rows[e.RowIndex].Tag; + + if (RomGrid.Columns[e.ColumnIndex].Name == "CGot") + { + Bitmap bmp = new Bitmap(cellBounds.Width, cellBounds.Height); + Graphics g = Graphics.FromImage(bmp); + string bitmapName = "R_" + tRvFile.DatStatus + "_" + tRvFile.RepStatus; + g.DrawImage(rvImages.GetBitmap(bitmapName), 0, 0, 54, 18); + e.Value = bmp; + } + } + #endregion private void RomGridSelectionChanged(object sender, EventArgs e) From 16ae35a8a1b9d237cbf397833c26ae5b5789a52f Mon Sep 17 00:00:00 2001 From: Jim Westfall Date: Sun, 26 Oct 2014 20:27:10 -0700 Subject: [PATCH 12/28] Make drawn text look better in GameGrid's CCorrect --- ROMVault2/FrmMain.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ROMVault2/FrmMain.cs b/ROMVault2/FrmMain.cs index 0e4a104..3799604 100644 --- a/ROMVault2/FrmMain.cs +++ b/ROMVault2/FrmMain.cs @@ -771,6 +771,8 @@ namespace ROMVault2 } else if (GameGrid.Columns[e.ColumnIndex].Name == "CCorrect") { Bitmap bmp = new Bitmap(cellBounds.Width, cellBounds.Height); Graphics g = Graphics.FromImage(bmp); + g.Clear(Color.White); + g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit; Font drawFont = new Font("Arial", 9); SolidBrush drawBrushBlack = new SolidBrush(Color.Black); From e950b00a679bedf19a2d084fb2b8f7b744ac3d80 Mon Sep 17 00:00:00 2001 From: Jim Westfall Date: Tue, 28 Oct 2014 17:42:33 -0700 Subject: [PATCH 13/28] GetFiles() for mono was missing initializing the Length --- ROMVault2/IO/RVIO.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/ROMVault2/IO/RVIO.cs b/ROMVault2/IO/RVIO.cs index 6361ce1..476ad7a 100644 --- a/ROMVault2/IO/RVIO.cs +++ b/ROMVault2/IO/RVIO.cs @@ -193,6 +193,7 @@ namespace ROMVault2.IO { Name = tDi.Name, FullName = Path.Combine(FullName, tDi.Name), + Length = tDi.Length, LastWriteTime = tDi.LastWriteTimeUtc.Ticks }; files.Add(lDi); From e27dfd039dc098f3bd55ae7a4aacc6754212edd8 Mon Sep 17 00:00:00 2001 From: Jim Westfall Date: Tue, 28 Oct 2014 18:37:16 -0700 Subject: [PATCH 14/28] chdman fixes for mono/unix - call chdman as chdman and not chdman.exe - fix parsing issue with chdman stderr output --- ROMVault2/SupportedFiles/CHD/CHD.cs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/ROMVault2/SupportedFiles/CHD/CHD.cs b/ROMVault2/SupportedFiles/CHD/CHD.cs index 36131b7..5740ce8 100644 --- a/ROMVault2/SupportedFiles/CHD/CHD.cs +++ b/ROMVault2/SupportedFiles/CHD/CHD.cs @@ -245,10 +245,14 @@ namespace ROMVault2.SupportedFiles.CHD _result = ""; _resultType = CHDManCheck.Unset; - string chdPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "chdman.exe"); + string chdExe = "chdman.exe"; + if (Settings.MonoFileIO) + chdExe = "chdman"; + + string chdPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, chdExe); if (!File.Exists(chdPath)) { - result = "chdman not found"; + result = chdExe + " Not Found."; return CHDManCheck.ChdmanNotFound; } @@ -421,7 +425,7 @@ namespace ROMVault2.SupportedFiles.CHD // check for Verifying message if (sOut.Length >= 24) - if (sOut.Substring(0, 11) == "Verifying, " && sOut.Substring(sOut.Length - 13, 13) == " complete... ") + if (System.Text.RegularExpressions.Regex.IsMatch(sOut, "Verifying, \\d+\\.\\d+\\% complete\\.\\.\\.")) { //_resultType = CHDManCheck.Good; return; From 7f6b01516d9ba5dbde55da33bc70f8f7b4330c5a Mon Sep 17 00:00:00 2001 From: Jim Westfall Date: Tue, 28 Oct 2014 21:10:43 -0700 Subject: [PATCH 15/28] Fix parsing of chdman stderr output. Makes it works under mono/linux and also corrects the displayed error message in windows. --- ROMVault2/SupportedFiles/CHD/CHD.cs | 109 +++++++++++++--------------- 1 file changed, 50 insertions(+), 59 deletions(-) diff --git a/ROMVault2/SupportedFiles/CHD/CHD.cs b/ROMVault2/SupportedFiles/CHD/CHD.cs index 5740ce8..29b4da5 100644 --- a/ROMVault2/SupportedFiles/CHD/CHD.cs +++ b/ROMVault2/SupportedFiles/CHD/CHD.cs @@ -371,70 +371,61 @@ namespace ROMVault2.SupportedFiles.CHD // Collect the process command output. if (String.IsNullOrEmpty(outLine.Data)) return; - string sOut = outLine.Data; - ReportError.LogOut("CHDError: " + sOut); + // We can get fed multiple lines worth of data because of \r line feeds + string[] sLines = outLine.Data.Split(new string[] { "\r" }, StringSplitOptions.None); - _bgw.ReportProgress(0, new bgwText3(sOut)); + foreach (string sLine in sLines) { - if (_resultType != CHDManCheck.Unset) - { - if(_errorLines>0) + if (string.IsNullOrEmpty(sLine)) continue; + + ReportError.LogOut("CHDError: " + sLine); + _bgw.ReportProgress(0, new bgwText3(sLine)); + + if (_resultType != CHDManCheck.Unset) { - _errorLines -= 1; - _result += "\r\n" + sOut; + if (_errorLines>0) + { + _errorLines -= 1; + _result += "\r\n" + sLine; + } + } + else if (System.Text.RegularExpressions.Regex.IsMatch(sLine, @"^No verification to be done; CHD has (uncompressed|no checksum)")) + { + _result = sLine; + _resultType = CHDManCheck.Corrupt; + } + else if (System.Text.RegularExpressions.Regex.IsMatch(sLine, @"^Error (opening|reading) CHD file.*")) + { + _result = sLine; + _resultType = CHDManCheck.Corrupt; + } + else if (System.Text.RegularExpressions.Regex.IsMatch(sLine, @"^Error opening parent CHD file .*:")) + { + _result = sLine; + _resultType = CHDManCheck.Corrupt; + } + else if (System.Text.RegularExpressions.Regex.IsMatch(sLine, @"^Error: (Raw|Overall) SHA1 in header")) + { + _result = sLine; + _resultType = CHDManCheck.Corrupt; + } + else if (System.Text.RegularExpressions.Regex.IsMatch(sLine, @"^Out of memory")) + { + _result = sLine; + _resultType = CHDManCheck.Corrupt; + } + // Verifying messages are a non-error + else if (System.Text.RegularExpressions.Regex.IsMatch(sLine, @"Verifying, \d+\.\d+\% complete\.\.\.")) + { + + } + else + { + ReportError.SendErrorMessage("CHDErrorHandler returned =" + sLine); + _result = "Unknown message : " + sLine; + _resultType = CHDManCheck.CHDUnknownError; } - return; } - - if (sOut.Length > 44) - if (sOut.Substring(0, 23) == "Error reading CHD file " && sOut.Substring(sOut.Length - 21, 21) == ": decompression error") - { - _result = sOut; - _resultType = CHDManCheck.Corrupt; - return; - } - if (sOut.Length > 35) - if (sOut.Substring(0, 23) == "Error opening CHD file " && sOut.Substring(sOut.Length - 21, 21) == ": decompression error") - { - _result = sOut; - _resultType = CHDManCheck.Corrupt; - return; - } - if (sOut.Length > 35) - if (sOut.Substring(0, 23) == "Error opening CHD file " && sOut.Substring(sOut.Length - 12, 12) == ": read error") - { - _result = sOut; - _resultType = CHDManCheck.Corrupt; - return; - } - if (sOut.Length > 25) - if (sOut.Substring(0, 25) == "Error: Raw SHA1 in header") - { - _result = sOut; - _errorLines = 1; - _resultType = CHDManCheck.Corrupt; - return; - } - if (sOut.Length == 13) - if (sOut == "Out of memory") - { - _result = sOut; - _resultType = CHDManCheck.Corrupt; - return; - } - - // check for Verifying message - if (sOut.Length >= 24) - if (System.Text.RegularExpressions.Regex.IsMatch(sOut, "Verifying, \\d+\\.\\d+\\% complete\\.\\.\\.")) - { - //_resultType = CHDManCheck.Good; - return; - } - - - ReportError.SendErrorMessage("CHDErrorHandler returned =" + sOut); - _result = "Unknown message : " + sOut; - _resultType = CHDManCheck.CHDUnknownError; } From 634de3b3d7625e93da87f870c336a4d1aa2563ae Mon Sep 17 00:00:00 2001 From: Jim Westfall Date: Wed, 29 Oct 2014 20:20:37 -0700 Subject: [PATCH 16/28] More CHD related fixes - CHDReturnError was not handled and would cause an exception/crash - CHD error/filename were swapped in ErrorGrid when scanning - Use regex when parsing chdman stdout output --- ROMVault2/FileScanning.cs | 5 +++-- ROMVault2/SupportedFiles/CHD/CHD.cs | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/ROMVault2/FileScanning.cs b/ROMVault2/FileScanning.cs index e8b3726..698c1c4 100644 --- a/ROMVault2/FileScanning.cs +++ b/ROMVault2/FileScanning.cs @@ -820,11 +820,12 @@ namespace ROMVault2 tFile.FileStatusSet(FileStatus.SHA1CHDVerified); return; case CHD.CHDManCheck.Corrupt: - _bgw.ReportProgress(0, new bgwShowError(error, filename)); + _bgw.ReportProgress(0, new bgwShowError(filename, error)); tFile.GotStatus = GotStatus.Corrupt; return; + case CHD.CHDManCheck.CHDReturnError: case CHD.CHDManCheck.CHDUnknownError: - _bgw.ReportProgress(0, new bgwShowError(error, filename)); + _bgw.ReportProgress(0, new bgwShowError(filename, error)); return; case CHD.CHDManCheck.ChdmanNotFound: return; diff --git a/ROMVault2/SupportedFiles/CHD/CHD.cs b/ROMVault2/SupportedFiles/CHD/CHD.cs index 29b4da5..df116da 100644 --- a/ROMVault2/SupportedFiles/CHD/CHD.cs +++ b/ROMVault2/SupportedFiles/CHD/CHD.cs @@ -334,7 +334,7 @@ namespace ROMVault2.SupportedFiles.CHD switch (_outputLineCount) { case 0: - if (sOut.Length < 53 || sOut.Substring(0, 53) != "chdman - MAME Compressed Hunks of Data (CHD) manager ") + if (!System.Text.RegularExpressions.Regex.IsMatch(sOut, @"^chdman - MAME Compressed Hunks of Data \(CHD\) manager ([0-9\.]+) \(.*\)")) { _result = "Incorrect startup of CHDMan :" + sOut; _resultType = CHDManCheck.CHDReturnError; From 76c4af0ec33879107a6b250510f5a3069d4986ff Mon Sep 17 00:00:00 2001 From: Jim Westfall Date: Sat, 1 Nov 2014 17:05:14 -0700 Subject: [PATCH 17/28] Additional Mono rendering fixes - on initial rendering mono likes to send a resize event where the width is 0, ignore it. This was causing gbDatInfo to not render until a manual resize was done. - set AutoScaleMode to System.Windows.Forms.AutoScaleMode.None. This fixes a number of rendering issues under mono and didnt seem to have any negative effect under c#/windows builds. - tweak some of the initial form sizes and locations on FrmMain. A number of the setting didnt make sense based on the size of the panel they were put it. This resolves an issue with the gbDatInfo and gbSetInfo starting off with the wrong size under mono. --- ROMVault2/FrmHelpAbout.Designer.cs | 2 +- ROMVault2/FrmKey.Designer.cs | 2 +- ROMVault2/FrmMain.Designer.cs | 16 ++++++++-------- ROMVault2/FrmMain.cs | 6 ++++++ ROMVault2/FrmProgressWindow.Designer.cs | 2 +- ROMVault2/FrmProgressWindowFix.Designer.cs | 2 +- ROMVault2/FrmRegistration.Designer.cs | 2 +- ROMVault2/FrmSetDir.Designer.cs | 2 +- ROMVault2/FrmSettings.Designer.cs | 2 +- ROMVault2/FrmShowError.Designer.cs | 2 +- ROMVault2/FrmSplashScreen.Designer.cs | 2 +- ROMVault2/rvTree.Designer.cs | 2 +- 12 files changed, 24 insertions(+), 18 deletions(-) diff --git a/ROMVault2/FrmHelpAbout.Designer.cs b/ROMVault2/FrmHelpAbout.Designer.cs index 0bf9571..ea98129 100644 --- a/ROMVault2/FrmHelpAbout.Designer.cs +++ b/ROMVault2/FrmHelpAbout.Designer.cs @@ -70,7 +70,7 @@ // FrmHelpAbout // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; this.BackgroundImage = global::ROMVault2.rvImages.romvaultTZ; this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None; this.ClientSize = new System.Drawing.Size(471, 172); diff --git a/ROMVault2/FrmKey.Designer.cs b/ROMVault2/FrmKey.Designer.cs index 81679fb..63f7c3e 100644 --- a/ROMVault2/FrmKey.Designer.cs +++ b/ROMVault2/FrmKey.Designer.cs @@ -34,7 +34,7 @@ // FrmKey // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; this.BackColor = System.Drawing.SystemColors.ControlDark; this.ClientSize = new System.Drawing.Size(600, 532); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; diff --git a/ROMVault2/FrmMain.Designer.cs b/ROMVault2/FrmMain.Designer.cs index 2bbf160..41b8e01 100644 --- a/ROMVault2/FrmMain.Designer.cs +++ b/ROMVault2/FrmMain.Designer.cs @@ -286,7 +286,7 @@ this.gbDatInfo.Controls.Add(this.label8); this.gbDatInfo.Location = new System.Drawing.Point(5, 0); this.gbDatInfo.Name = "gbDatInfo"; - this.gbDatInfo.Size = new System.Drawing.Size(440, 147); + this.gbDatInfo.Size = new System.Drawing.Size(468, 147); this.gbDatInfo.TabIndex = 3; this.gbDatInfo.TabStop = false; this.gbDatInfo.Text = "Dat Info :"; @@ -517,7 +517,7 @@ // // btnColorKey // - this.btnColorKey.Location = new System.Drawing.Point(568, 85); + this.btnColorKey.Location = new System.Drawing.Point(547, 85); this.btnColorKey.Name = "btnColorKey"; this.btnColorKey.Size = new System.Drawing.Size(89, 23); this.btnColorKey.TabIndex = 9; @@ -528,7 +528,7 @@ // chkBoxShowMerged // this.chkBoxShowMerged.AutoSize = true; - this.chkBoxShowMerged.Location = new System.Drawing.Point(568, 68); + this.chkBoxShowMerged.Location = new System.Drawing.Point(547, 68); this.chkBoxShowMerged.Name = "chkBoxShowMerged"; this.chkBoxShowMerged.Size = new System.Drawing.Size(125, 17); this.chkBoxShowMerged.TabIndex = 8; @@ -541,7 +541,7 @@ this.chkBoxShowFixed.AutoSize = true; this.chkBoxShowFixed.Checked = true; this.chkBoxShowFixed.CheckState = System.Windows.Forms.CheckState.Checked; - this.chkBoxShowFixed.Location = new System.Drawing.Point(568, 52); + this.chkBoxShowFixed.Location = new System.Drawing.Point(547, 52); this.chkBoxShowFixed.Name = "chkBoxShowFixed"; this.chkBoxShowFixed.Size = new System.Drawing.Size(102, 17); this.chkBoxShowFixed.TabIndex = 7; @@ -554,7 +554,7 @@ this.chkBoxShowMissing.AutoSize = true; this.chkBoxShowMissing.Checked = true; this.chkBoxShowMissing.CheckState = System.Windows.Forms.CheckState.Checked; - this.chkBoxShowMissing.Location = new System.Drawing.Point(568, 36); + this.chkBoxShowMissing.Location = new System.Drawing.Point(547, 36); this.chkBoxShowMissing.Name = "chkBoxShowMissing"; this.chkBoxShowMissing.Size = new System.Drawing.Size(124, 17); this.chkBoxShowMissing.TabIndex = 6; @@ -567,7 +567,7 @@ this.chkBoxShowCorrect.AutoSize = true; this.chkBoxShowCorrect.Checked = true; this.chkBoxShowCorrect.CheckState = System.Windows.Forms.CheckState.Checked; - this.chkBoxShowCorrect.Location = new System.Drawing.Point(568, 20); + this.chkBoxShowCorrect.Location = new System.Drawing.Point(547, 20); this.chkBoxShowCorrect.Name = "chkBoxShowCorrect"; this.chkBoxShowCorrect.Size = new System.Drawing.Size(123, 17); this.chkBoxShowCorrect.TabIndex = 5; @@ -579,7 +579,7 @@ // this.gbSetInfo.Location = new System.Drawing.Point(5, 0); this.gbSetInfo.Name = "gbSetInfo"; - this.gbSetInfo.Size = new System.Drawing.Size(416, 147); + this.gbSetInfo.Size = new System.Drawing.Size(532, 147); this.gbSetInfo.TabIndex = 4; this.gbSetInfo.TabStop = false; this.gbSetInfo.Text = "Game Info :"; @@ -987,7 +987,7 @@ // FrmMain // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; this.ClientSize = new System.Drawing.Size(1264, 762); this.Controls.Add(this.splitContainer1); this.Controls.Add(this.menuStrip1); diff --git a/ROMVault2/FrmMain.cs b/ROMVault2/FrmMain.cs index 884be82..412af1f 100644 --- a/ROMVault2/FrmMain.cs +++ b/ROMVault2/FrmMain.cs @@ -479,6 +479,9 @@ namespace ROMVault2 private void splitContainer3_Panel1_Resize(object sender, EventArgs e) { + // fixes a rendering issue in mono + if (splitContainer3.Panel1.Width == 0) return; + gbDatInfo.Width = splitContainer3.Panel1.Width - (gbDatInfo.Left * 2); } @@ -737,6 +740,9 @@ namespace ROMVault2 private void splitContainer4_Panel1_Resize(object sender, EventArgs e) { + // fixes a rendering issue in mono + if (splitContainer4.Panel1.Width == 0) return; + int chkLeft = splitContainer4.Panel1.Width - 150; if (chkLeft < 430) chkLeft = 430; diff --git a/ROMVault2/FrmProgressWindow.Designer.cs b/ROMVault2/FrmProgressWindow.Designer.cs index 56868a2..f9b0d25 100644 --- a/ROMVault2/FrmProgressWindow.Designer.cs +++ b/ROMVault2/FrmProgressWindow.Designer.cs @@ -185,7 +185,7 @@ // FrmProgressWindow // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; this.ClientSize = new System.Drawing.Size(591, 320); this.Controls.Add(this.splitContainer1); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); diff --git a/ROMVault2/FrmProgressWindowFix.Designer.cs b/ROMVault2/FrmProgressWindowFix.Designer.cs index 59397e0..97c8e40 100644 --- a/ROMVault2/FrmProgressWindowFix.Designer.cs +++ b/ROMVault2/FrmProgressWindowFix.Designer.cs @@ -244,7 +244,7 @@ // FrmProgressWindowFix // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; this.BackColor = System.Drawing.Color.White; this.ClientSize = new System.Drawing.Size(1027, 500); this.Controls.Add(this.splitContainer1); diff --git a/ROMVault2/FrmRegistration.Designer.cs b/ROMVault2/FrmRegistration.Designer.cs index bb0ccaf..050e5b9 100644 --- a/ROMVault2/FrmRegistration.Designer.cs +++ b/ROMVault2/FrmRegistration.Designer.cs @@ -91,7 +91,7 @@ // FrmRegistration // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; this.ClientSize = new System.Drawing.Size(444, 178); this.ControlBox = false; this.Controls.Add(this.btnOK); diff --git a/ROMVault2/FrmSetDir.Designer.cs b/ROMVault2/FrmSetDir.Designer.cs index 202169f..f697cbc 100644 --- a/ROMVault2/FrmSetDir.Designer.cs +++ b/ROMVault2/FrmSetDir.Designer.cs @@ -198,7 +198,7 @@ // FrmSetDir // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; this.ClientSize = new System.Drawing.Size(694, 391); this.Controls.Add(this.btnResetAll); this.Controls.Add(this.btnClose); diff --git a/ROMVault2/FrmSettings.Designer.cs b/ROMVault2/FrmSettings.Designer.cs index 742994e..49a71a1 100644 --- a/ROMVault2/FrmSettings.Designer.cs +++ b/ROMVault2/FrmSettings.Designer.cs @@ -220,7 +220,7 @@ // FrmSettings // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; this.ClientSize = new System.Drawing.Size(545, 346); this.Controls.Add(this.chkDoubleCheckDelete); this.Controls.Add(this.label5); diff --git a/ROMVault2/FrmShowError.Designer.cs b/ROMVault2/FrmShowError.Designer.cs index 6e8fa58..16b852c 100644 --- a/ROMVault2/FrmShowError.Designer.cs +++ b/ROMVault2/FrmShowError.Designer.cs @@ -65,7 +65,7 @@ // FrmShowError // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; this.ClientSize = new System.Drawing.Size(589, 583); this.Controls.Add(this.label1); this.Controls.Add(this.button1); diff --git a/ROMVault2/FrmSplashScreen.Designer.cs b/ROMVault2/FrmSplashScreen.Designer.cs index 04ae6d7..0925cb5 100644 --- a/ROMVault2/FrmSplashScreen.Designer.cs +++ b/ROMVault2/FrmSplashScreen.Designer.cs @@ -86,7 +86,7 @@ // FrmSplashScreen // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; this.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("$this.BackgroundImage"))); this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None; this.ClientSize = new System.Drawing.Size(465, 207); diff --git a/ROMVault2/rvTree.Designer.cs b/ROMVault2/rvTree.Designer.cs index 5dff86c..efcfd33 100644 --- a/ROMVault2/rvTree.Designer.cs +++ b/ROMVault2/rvTree.Designer.cs @@ -33,7 +33,7 @@ // rvTree // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; this.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.DoubleBuffered = true; this.Name = "RvTree"; From c82f688adc0669fe0f1d3ae2ae7592dae0763e53 Mon Sep 17 00:00:00 2001 From: Jim Westfall Date: Wed, 5 Nov 2014 13:15:20 -0800 Subject: [PATCH 18/28] ui rendering fixes for progress window FrmProgressWindow.Designer.cs was setup for the windows being 591 wide, but rv was forcing it to be 498 when the window was brought up. This was confusing mono and it was causing rendering issues. This patch makes it so the Designer and rv agree on the width of the window. Additional adjustments were made to standardize the spacing between window edge/progress bar/button, resulting in a width of 511. --- ROMVault2/FrmProgressWindow.Designer.cs | 9 ++++----- ROMVault2/FrmProgressWindow.cs | 10 +++++----- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/ROMVault2/FrmProgressWindow.Designer.cs b/ROMVault2/FrmProgressWindow.Designer.cs index f9b0d25..5f55b11 100644 --- a/ROMVault2/FrmProgressWindow.Designer.cs +++ b/ROMVault2/FrmProgressWindow.Designer.cs @@ -74,7 +74,7 @@ // // cancelButton // - this.cancelButton.Location = new System.Drawing.Point(420, 99); + this.cancelButton.Location = new System.Drawing.Point(424, 99); this.cancelButton.Name = "cancelButton"; this.cancelButton.Size = new System.Drawing.Size(75, 23); this.cancelButton.TabIndex = 2; @@ -123,7 +123,7 @@ this.ErrorGrid.ShowCellToolTips = false; this.ErrorGrid.ShowEditingIcon = false; this.ErrorGrid.ShowRowErrors = false; - this.ErrorGrid.Size = new System.Drawing.Size(591, 186); + this.ErrorGrid.Size = new System.Drawing.Size(511, 186); this.ErrorGrid.TabIndex = 6; this.ErrorGrid.SelectionChanged += new System.EventHandler(this.ErrorGridSelectionChanged); // @@ -165,7 +165,7 @@ // splitContainer1.Panel2 // this.splitContainer1.Panel2.Controls.Add(this.ErrorGrid); - this.splitContainer1.Size = new System.Drawing.Size(591, 320); + this.splitContainer1.Size = new System.Drawing.Size(511, 320); this.splitContainer1.SplitterDistance = 130; this.splitContainer1.TabIndex = 8; // @@ -184,9 +184,8 @@ // // FrmProgressWindow // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; - this.ClientSize = new System.Drawing.Size(591, 320); + this.ClientSize = new System.Drawing.Size(511, 320); this.Controls.Add(this.splitContainer1); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Name = "FrmProgressWindow"; diff --git a/ROMVault2/FrmProgressWindow.cs b/ROMVault2/FrmProgressWindow.cs index 648712d..d725b25 100644 --- a/ROMVault2/FrmProgressWindow.cs +++ b/ROMVault2/FrmProgressWindow.cs @@ -26,7 +26,7 @@ namespace ROMVault2 _titleRoot = titleRoot; InitializeComponent(); - ClientSize = new Size(498, 131); + ClientSize = new Size(511, 131); _titleRoot = titleRoot; @@ -128,8 +128,8 @@ namespace ROMVault2 if (!_errorOpen) { _errorOpen = true; - ClientSize = new Size(498, 292); - MinimumSize = new Size(498, 292); + ClientSize = new Size(511, 292); + MinimumSize = new Size(511, 292); FormBorderStyle = FormBorderStyle.SizableToolWindow; } @@ -153,8 +153,8 @@ namespace ROMVault2 if (!_errorOpen) { _errorOpen = true; - ClientSize = new Size(498, 292); - MinimumSize = new Size(498, 292); + ClientSize = new Size(511, 292); + MinimumSize = new Size(511, 292); FormBorderStyle = FormBorderStyle.SizableToolWindow; } From 004ba9c870e7851452d6091bcd549618623b5d7d Mon Sep 17 00:00:00 2001 From: Jim Westfall Date: Wed, 5 Nov 2014 13:51:51 -0800 Subject: [PATCH 19/28] Force all pTree.Tree.RTree to have aleast some width. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This fixes ToSort not having the "└" in the tree view. --- ROMVault2/rvTree.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ROMVault2/rvTree.cs b/ROMVault2/rvTree.cs index 28e0a57..72af6d3 100644 --- a/ROMVault2/rvTree.cs +++ b/ROMVault2/rvTree.cs @@ -60,7 +60,7 @@ namespace ROMVault2 pTree.Tree.TreeBranches = pTreeBranches; - pTree.Tree.RTree = new Rectangle(0, _yPos - 8, nodeDepth * 18, 16); + pTree.Tree.RTree = new Rectangle(0, _yPos - 8, 1 + nodeDepth * 18, 16); pTree.Tree.RExpand = new Rectangle(5 + nodeDepth * 18, _yPos + 4, 9, 9); pTree.Tree.RChecked = new Rectangle(20 + nodeDepth * 18, _yPos + 2, 13, 13); pTree.Tree.RIcon = new Rectangle(35 + nodeDepth * 18, _yPos, 16, 16); From 1d37e0004a680ab8d884e5896cd49cbd77445539 Mon Sep 17 00:00:00 2001 From: Jim Westfall Date: Sat, 8 Nov 2014 10:19:27 -0800 Subject: [PATCH 20/28] speed up populating GameGrid These changes speed up how long it takes to populate the GameGrid after clicking on a dat in the Tree. MAME 0.155 dat was used for testing. Before the changes population times were windows .net = 2.75 seconds linux mono = 23 seconds After the changes, both now take 300-400ms. This was done using 2 main changes. 1. Fully move populating the rows' Values to the CellFormatting function 2. Determine the total number of rows we will need and use GameGrid.rowCount to set the row count to that. This is much faster then doing individual Add()'s for each row. --- ROMVault2/FrmMain.cs | 91 ++++++++++++++++++++++++++++---------------- 1 file changed, 58 insertions(+), 33 deletions(-) diff --git a/ROMVault2/FrmMain.cs b/ROMVault2/FrmMain.cs index 3799604..bca0025 100644 --- a/ROMVault2/FrmMain.cs +++ b/ROMVault2/FrmMain.cs @@ -584,6 +584,7 @@ namespace ROMVault2 GameGridColumnXPositions = new int[(int)RepStatus.EndValue]; + int rowCount = 0; for (int j = 0; j < tDir.ChildCount; j++) { @@ -608,6 +609,8 @@ namespace ROMVault2 if (!show) continue; + rowCount++; + int columnIndex = 0; for (int l = 0; l < RepairStatus.DisplayOrder.Length; l++) { @@ -621,6 +624,7 @@ namespace ROMVault2 columnIndex++; } } + GameGrid.RowCount = rowCount; int t = 0; for (int l = 0; l < (int)RepStatus.EndValue; l++) @@ -630,6 +634,7 @@ namespace ROMVault2 t += colWidth; } + int row = 0; for (int j = 0; j < tDir.ChildCount; j++) { RvDir tChildDir = tDir.Child(j) as RvDir; @@ -652,38 +657,10 @@ namespace ROMVault2 show = show || !(gCorrect || gMissing || gUnknown || gInToSort || gFixes); if (!show) continue; - - Color bgCol = Color.FromArgb(255, 255, 255); - - - foreach (RepStatus t1 in RepairStatus.DisplayOrder) - { - if (tDirStat.Get(t1) <= 0) continue; - - bgCol = _displayColor[(int)t1]; - break; - } - - - GameGrid.Rows.Add(); - int iRow = GameGrid.Rows.Count - 1; - - GameGrid.Rows[iRow].Selected = false; - GameGrid.Rows[iRow].Tag = tChildDir; - - GameGrid.Rows[iRow].Cells["Type"].Style.BackColor = bgCol; - GameGrid.Rows[iRow].Cells["Type"].Style.SelectionBackColor = bgCol; - GameGrid.Rows[iRow].Cells["CGame"].Style.BackColor = bgCol; - GameGrid.Rows[iRow].Cells["CDescription"].Style.BackColor = bgCol; - GameGrid.Rows[iRow].Cells["CCorrect"].Style.SelectionBackColor = Color.White; - - if (String.IsNullOrEmpty(tChildDir.FileName)) - GameGrid.Rows[iRow].Cells["CGame"].Value = tChildDir.Name; - else - GameGrid.Rows[iRow].Cells["CGame"].Value = tChildDir.Name + " (Found: " + tChildDir.FileName + ")"; - - if (tChildDir.Game != null) - GameGrid.Rows[iRow].Cells["CDescription"].Value = tChildDir.Game.GetData(RvGame.GameData.Description); + + GameGrid.Rows[row].Selected = false; + GameGrid.Rows[row].Tag = tChildDir; + row++; } _updatingGameGrid = false; @@ -729,12 +706,31 @@ namespace ROMVault2 private void GameGrid_CellFormatting(object sender, System.Windows.Forms.DataGridViewCellFormattingEventArgs e) { + + if (_updatingGameGrid) + return; Rectangle cellBounds = GameGrid.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, false); RvDir tRvDir = (ROMVault2.RvDB.RvDir)GameGrid.Rows[e.RowIndex].Tag; + ReportStatus tDirStat = tRvDir.DirStatus; + Color bgCol = Color.FromArgb(255, 255, 255); + + if (cellBounds.Width == 0 || cellBounds.Height == 0) + return; + + foreach (RepStatus t1 in RepairStatus.DisplayOrder) + { + if (tDirStat.Get(t1) <= 0) continue; + + bgCol = _displayColor[(int)t1]; + break; + } if (GameGrid.Columns[e.ColumnIndex].Name == "Type") { + e.CellStyle.BackColor = bgCol; + e.CellStyle.SelectionBackColor = bgCol; + Bitmap bmp = new Bitmap(cellBounds.Width, cellBounds.Height); Graphics g = Graphics.FromImage(bmp); @@ -768,7 +764,27 @@ namespace ROMVault2 e.Value = bmp; - } else if (GameGrid.Columns[e.ColumnIndex].Name == "CCorrect") { + } + else if (GameGrid.Columns[e.ColumnIndex].Name == "CGame") + { + e.CellStyle.BackColor = bgCol; + + if (String.IsNullOrEmpty(tRvDir.FileName)) + e.Value = tRvDir.Name; + else + e.Value = tRvDir.Name + " (Found: " + tRvDir.FileName + ")"; + } + else if (GameGrid.Columns[e.ColumnIndex].Name == "CDescription") + { + e.CellStyle.BackColor = bgCol; + + if (tRvDir.Game != null) + e.Value = tRvDir.Game.GetData(RvGame.GameData.Description); + } + else if (GameGrid.Columns[e.ColumnIndex].Name == "CCorrect") + { + e.CellStyle.SelectionBackColor = Color.White; + Bitmap bmp = new Bitmap(cellBounds.Width, cellBounds.Height); Graphics g = Graphics.FromImage(bmp); g.Clear(Color.White); @@ -814,6 +830,8 @@ namespace ROMVault2 drawFont.Dispose(); e.Value = bmp; } + else + Console.WriteLine("WARN: GameGrid_CellFormatting() unknown column: {0}", GameGrid.Columns[e.ColumnIndex].Name); } #endregion @@ -1254,9 +1272,16 @@ namespace ROMVault2 private void RomGrid_CellFormatting(object sender, System.Windows.Forms.DataGridViewCellFormattingEventArgs e) { + + if (_updatingGameGrid) + return; + Rectangle cellBounds = RomGrid.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, false); RvFile tRvFile = (ROMVault2.RvDB.RvFile)RomGrid.Rows[e.RowIndex].Tag; + if (cellBounds.Width == 0 || cellBounds.Height == 0) + return; + if (RomGrid.Columns[e.ColumnIndex].Name == "CGot") { Bitmap bmp = new Bitmap(cellBounds.Width, cellBounds.Height); From 09ccdd7e10de88263dd180e70838db0883d704fc Mon Sep 17 00:00:00 2001 From: gjefferyes Date: Thu, 13 Nov 2014 09:54:31 -0600 Subject: [PATCH 21/28] remove service References --- ROMVault2/DatReaders/DatReader.cs | 4 - ROMVault2/DatUpdate.cs | 1 - ROMVault2/FixFiles.cs | 7 - ROMVault2/FrmMain.Designer.cs | 15 +- ROMVault2/FrmMain.cs | 28 -- ROMVault2/FrmSplashScreen.cs | 54 ---- ROMVault2/Program.cs | 2 +- ROMVault2/ROMVault2.csproj | 27 +- ROMVault2/ReportError.cs | 51 ---- .../Service References/RVRef/Reference.cs | 137 --------- .../Service References/RVRef/Reference.svcmap | 33 --- .../Service References/RVRef/Service1.xsd | 42 --- .../Service References/RVRef/Service11.disco | 4 - .../Service References/RVRef/Service11.wsdl | 266 ------------------ .../Service References/RVRef/Service11.xsd | 198 ------------- .../RVRef/configuration.svcinfo | 10 - .../RVRef/configuration91.svcinfo | 201 ------------- ROMVault2/SupportedFiles/CHD/CHD.cs | 2 - 18 files changed, 4 insertions(+), 1078 deletions(-) delete mode 100644 ROMVault2/Service References/RVRef/Reference.cs delete mode 100644 ROMVault2/Service References/RVRef/Reference.svcmap delete mode 100644 ROMVault2/Service References/RVRef/Service1.xsd delete mode 100644 ROMVault2/Service References/RVRef/Service11.disco delete mode 100644 ROMVault2/Service References/RVRef/Service11.wsdl delete mode 100644 ROMVault2/Service References/RVRef/Service11.xsd delete mode 100644 ROMVault2/Service References/RVRef/configuration.svcinfo delete mode 100644 ROMVault2/Service References/RVRef/configuration91.svcinfo diff --git a/ROMVault2/DatReaders/DatReader.cs b/ROMVault2/DatReaders/DatReader.cs index c4c2ae0..7e11135 100644 --- a/ROMVault2/DatReaders/DatReader.cs +++ b/ROMVault2/DatReaders/DatReader.cs @@ -116,10 +116,6 @@ namespace ROMVault2.DatReaders { fs.Close(); fs.Dispose(); - string message = string.Format("Error Occured Reading Dat: {0}\r\nSource: {1}\r\nMessage: {2}\r\n", strFilename, e.Source, e.Message); - if (e.InnerException != null) - message += string.Format("\r\nINNER EXCEPTION:\r\nSource: {0}\r\nMessage: {1}\r\n", e.InnerException.Source, e.InnerException.Message); - ReportError.SendErrorMessageDat(message, strFilename); _bgw.ReportProgress(0, new bgwShowError(strFilename, string.Format("Error Occured Reading Dat:\r\n{0}\r\n", e.Message))); return false; } diff --git a/ROMVault2/DatUpdate.cs b/ROMVault2/DatUpdate.cs index 183f6fb..bd4a4b8 100644 --- a/ROMVault2/DatUpdate.cs +++ b/ROMVault2/DatUpdate.cs @@ -31,7 +31,6 @@ namespace ROMVault2 public static void SendAndShowDat(string message, string filename) { - ReportError.SendErrorMessageDat(message, filename); if (_bgw != null) _bgw.ReportProgress(0, new bgwShowError(filename, message)); } diff --git a/ROMVault2/FixFiles.cs b/ROMVault2/FixFiles.cs index 676db6a..ed777b9 100644 --- a/ROMVault2/FixFiles.cs +++ b/ROMVault2/FixFiles.cs @@ -362,7 +362,6 @@ namespace ROMVault2 { int error = Error.GetLastError(); ReportProgress(new bgwShowError(sourceFullName, "Error Setting File Attributes to Normal. Before Case correction Rename. Code " + error)); - ReportError.SendErrorMessage("Error Setting File Attributes to Normal. Before Case correction Rename. Code" + error + " : " + sourceFullName); } File.Move(sourceFullName, fixFile.FullName); @@ -383,7 +382,6 @@ namespace ROMVault2 { int error = Error.GetLastError(); ReportProgress(new bgwShowError(filename, "Error Setting File Attributes to Normal. Before Delete. Code " + error)); - ReportError.SendErrorMessage("Error Setting File Attributes to Normal. Before Delete. Code " + error + " : " + filename); } File.Delete(filename); } @@ -436,7 +434,6 @@ namespace ROMVault2 { int error = Error.GetLastError(); ReportProgress(new bgwShowError(fixFilePath, "Error Setting File Attributes to Normal. Before Delete Moving ToSort. Code " + error)); - ReportError.SendErrorMessage("Error Setting File Attributes to Normal. Before Delete Moving ToSort. Code " + error + " : " + fixFilePath); } File.Delete(fixFilePath); @@ -500,7 +497,6 @@ namespace ROMVault2 { int error = Error.GetLastError(); _bgw.ReportProgress(0, new bgwShowError(fixFilePath, "Error Setting File Attributes to Normal. Before Delete Moving ToSort. Code " + error)); - ReportError.SendErrorMessage("Error Setting File Attributes to Normal. Before Delete Moving ToSort. Code " + error + " : " + fixFilePath); } File.Delete(fixFilePath); @@ -1407,7 +1403,6 @@ namespace ROMVault2 { int error = Error.GetLastError(); ReportProgress(new bgwShowError(filename, "Error Setting File Attributes to Normal. Deleting Original Fix File. Code " + error)); - ReportError.SendErrorMessage("Error Setting File Attributes to Normal. Deleting Original Fix File. Code " + error + " : " + filename); } try { @@ -1417,7 +1412,6 @@ namespace ROMVault2 { int error = Error.GetLastError(); _error = "Error While trying to delete file " + filename + ". Code " + error; - ReportError.SendErrorMessage("Error While trying to delete file. Code " + error + " : " + filename); if (tempZipOut != null && tempZipOut.ZipOpen != ZipOpenType.Closed) tempZipOut.ZipFileClose(); @@ -1684,7 +1678,6 @@ namespace ROMVault2 { int error = Error.GetLastError(); ReportProgress(new bgwShowError(fixZipFullName, "Error Setting File Attributes to Normal. Before Moving To Corrupt. Code " + error)); - ReportError.SendErrorMessage("Error Setting File Attributes to Normal. Before Moving To Corrupt. Code " + error + " : " + fixZipFullName); } diff --git a/ROMVault2/FrmMain.Designer.cs b/ROMVault2/FrmMain.Designer.cs index bd71ea5..ece9540 100644 --- a/ROMVault2/FrmMain.Designer.cs +++ b/ROMVault2/FrmMain.Designer.cs @@ -106,7 +106,6 @@ this.fixReportToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.aboutRomVaultToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.checkForUpdateToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.registratioToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.dataGridViewImageColumn1 = new System.Windows.Forms.DataGridViewImageColumn(); this.dataGridViewImageColumn2 = new System.Windows.Forms.DataGridViewImageColumn(); @@ -931,7 +930,6 @@ // this.helpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.aboutRomVaultToolStripMenuItem, - this.checkForUpdateToolStripMenuItem, this.registratioToolStripMenuItem}); this.helpToolStripMenuItem.Name = "helpToolStripMenuItem"; this.helpToolStripMenuItem.Size = new System.Drawing.Size(44, 20); @@ -940,21 +938,14 @@ // aboutRomVaultToolStripMenuItem // this.aboutRomVaultToolStripMenuItem.Name = "aboutRomVaultToolStripMenuItem"; - this.aboutRomVaultToolStripMenuItem.Size = new System.Drawing.Size(168, 22); + this.aboutRomVaultToolStripMenuItem.Size = new System.Drawing.Size(162, 22); this.aboutRomVaultToolStripMenuItem.Text = "About RomVault"; this.aboutRomVaultToolStripMenuItem.Click += new System.EventHandler(this.AboutRomVaultToolStripMenuItemClick); // - // checkForUpdateToolStripMenuItem - // - this.checkForUpdateToolStripMenuItem.Name = "checkForUpdateToolStripMenuItem"; - this.checkForUpdateToolStripMenuItem.Size = new System.Drawing.Size(168, 22); - this.checkForUpdateToolStripMenuItem.Text = "Check For Update"; - this.checkForUpdateToolStripMenuItem.Click += new System.EventHandler(this.checkForUpdateToolStripMenuItem_Click); - // // registratioToolStripMenuItem // this.registratioToolStripMenuItem.Name = "registratioToolStripMenuItem"; - this.registratioToolStripMenuItem.Size = new System.Drawing.Size(168, 22); + this.registratioToolStripMenuItem.Size = new System.Drawing.Size(162, 22); this.registratioToolStripMenuItem.Text = "Registration"; this.registratioToolStripMenuItem.Click += new System.EventHandler(this.RegistratioToolStripMenuItemClick); // @@ -988,7 +979,6 @@ // // FrmMain // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; this.ClientSize = new System.Drawing.Size(1264, 762); this.Controls.Add(this.splitContainer1); @@ -1077,7 +1067,6 @@ private System.Windows.Forms.ToolStripMenuItem settingsToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem helpToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem aboutRomVaultToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem checkForUpdateToolStripMenuItem; private System.Windows.Forms.DataGridViewImageColumn Type; private System.Windows.Forms.DataGridViewTextBoxColumn CGame; private System.Windows.Forms.DataGridViewTextBoxColumn CDescription; diff --git a/ROMVault2/FrmMain.cs b/ROMVault2/FrmMain.cs index 073f0f4..ba6c53f 100644 --- a/ROMVault2/FrmMain.cs +++ b/ROMVault2/FrmMain.cs @@ -10,7 +10,6 @@ using System.Globalization; using System.ServiceModel; using System.Windows.Forms; using ROMVault2.Properties; -using ROMVault2.RVRef; using ROMVault2.RvDB; using ROMVault2.Utils; using ROMVault2.SupportedFiles; @@ -1435,33 +1434,6 @@ namespace ROMVault2 freg.Dispose(); } - private void checkForUpdateToolStripMenuItem_Click(object sender, EventArgs e) - { - BasicHttpBinding b = new BasicHttpBinding(); - EndpointAddress ep = new EndpointAddress(@"http://services.romvault.com/Service1.svc"); - - Service1Client s = new Service1Client(b, ep); - - string v = s.GetLatestVersion1(Program.Version, Program.SubVersion); - - string thisV = Program.Version + "." + Program.SubVersion.ToString("0000"); - - int res = String.Compare(v, thisV, StringComparison.Ordinal); - - if (res > 0) - { - string url = s.GetUpdateLink1(Program.Version, Program.SubVersion); - MessageBox.Show(Resources.Program_Main_There_is_a_new_release_download_now_from + url); - Process.Start(url); - } - else - { - MessageBox.Show(@"You are running the latest version " + Program.Version + "." + Program.SubVersion); - } - - - } - } } diff --git a/ROMVault2/FrmSplashScreen.cs b/ROMVault2/FrmSplashScreen.cs index 39c0c1a..8f9d677 100644 --- a/ROMVault2/FrmSplashScreen.cs +++ b/ROMVault2/FrmSplashScreen.cs @@ -10,7 +10,6 @@ using System.ServiceModel; using System.Threading; using System.Windows.Forms; using ROMVault2.Properties; -using ROMVault2.RVRef; using ROMVault2.RvDB; namespace ROMVault2 @@ -42,64 +41,11 @@ namespace ROMVault2 private void StartUpCode(object sender, DoWorkEventArgs e) { - - BasicHttpBinding b = new BasicHttpBinding { SendTimeout = new TimeSpan(0, 0, 20), ReceiveTimeout = new TimeSpan(0, 0, 20) }; - EndpointAddress ep = new EndpointAddress(@"http://services.romvault.com/Service1.svc"); - Service1Client s = new Service1Client(b, ep); - - if (string.IsNullOrEmpty(Settings.Username) || string.IsNullOrEmpty(Settings.EMail)) - { - FrmRegistration freg = new FrmRegistration(); - freg.ShowDialog(); - freg.Dispose(); - } - - bool isNetworkAvailable = System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable(); - - string r = "OK"; - try - { - if (isNetworkAvailable) - r = s.SendUser1(Settings.Username, Settings.EMail, Program.Version, Program.SubVersion); - } - catch (Exception) - { - r = "OK"; - } - - if (r != "OK") - { - Program.ErrorMessage=Resources.Program_Main_You_are_not_Authorised_to_use_this_program; - return; - } - // normal check ends - - string thisV = Program.Version + "." + Program.SubVersion.ToString("0000"); - string v = thisV; - try - { - if (isNetworkAvailable) - v = s.GetLatestVersion1(Program.Version, Program.SubVersion); - } - catch (Exception) - { - v = thisV; - } - if (String.Compare(v, thisV, StringComparison.Ordinal) > 0) - { - Program.URL = s.GetUpdateLink1(Program.Version, Program.SubVersion); - Program.ErrorMessage=Resources.Program_Main_There_is_a_new_release_download_now_from + Program.URL; - return; - } - - s.Close(); - RepairStatus.InitStatusCheck(); Settings.SetDefaults(); DB.Read(sender,e); - } diff --git a/ROMVault2/Program.cs b/ROMVault2/Program.cs index 95e594e..84bd8cd 100644 --- a/ROMVault2/Program.cs +++ b/ROMVault2/Program.cs @@ -15,7 +15,7 @@ namespace ROMVault2 //public static UsernamePassword Up; public static readonly Encoding Enc = Encoding.GetEncoding(28591); public const string Version = "2.1"; - public const int SubVersion = 26; + public const int SubVersion = 27; public static string ErrorMessage; public static string URL; diff --git a/ROMVault2/ROMVault2.csproj b/ROMVault2/ROMVault2.csproj index 269e5e3..8b56c14 100644 --- a/ROMVault2/ROMVault2.csproj +++ b/ROMVault2/ROMVault2.csproj @@ -188,11 +188,6 @@ rvTree.cs - - True - True - Reference.svcmap - @@ -279,13 +274,6 @@ Settings.settings True - - Designer - - - - Designer - @@ -309,19 +297,6 @@ PreserveNewest - - - WCF Proxy Generator - Reference.cs - - - - - - - - - @@ -332,4 +307,4 @@ --> - + \ No newline at end of file diff --git a/ROMVault2/ReportError.cs b/ROMVault2/ReportError.cs index f1e54db..cbb93f1 100644 --- a/ROMVault2/ReportError.cs +++ b/ROMVault2/ReportError.cs @@ -10,7 +10,6 @@ using System.Globalization; using System.IO; using System.ServiceModel; using System.Windows.Forms; -using ROMVault2.RVRef; using ROMVault2.RvDB; using ROMVault2.Utils; @@ -32,8 +31,6 @@ namespace ROMVault2 } message += string.Format("\r\nSTACK TRACE:\r\n{0}", e.Exception.StackTrace); - SendErrorMessage(message); - FrmShowError fshow = new FrmShowError(); fshow.settype(message); fshow.ShowDialog(); @@ -58,8 +55,6 @@ namespace ROMVault2 } message += string.Format("\r\nSTACK TRACE:\r\n{0}", e.StackTrace); - SendErrorMessage(message); - FrmShowError fshow = new FrmShowError(); fshow.settype(message); fshow.ShowDialog(); @@ -80,8 +75,6 @@ namespace ROMVault2 message += string.Format("\r\nSTACK TRACE:\r\n{0}", Environment.StackTrace); - SendErrorMessage(message); - FrmShowError fshow = new FrmShowError(); fshow.settype(message); fshow.ShowDialog(); @@ -103,7 +96,6 @@ namespace ROMVault2 public static void SendAndShow(string message, string caption = "RomVault", MessageBoxButtons buttons = MessageBoxButtons.OK, MessageBoxIcon icon = MessageBoxIcon.Exclamation) { - SendErrorMessage(message); Show(message, caption, buttons, icon); } @@ -115,49 +107,6 @@ namespace ROMVault2 MessageBox.Show(text, caption, buttons, icon); } - public static void SendErrorMessage(string message) - { - - bool isNetworkAvailable = System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable(); - if (!isNetworkAvailable) return; - - string st = Environment.StackTrace; - - BasicHttpBinding b = new BasicHttpBinding { SendTimeout = new TimeSpan(0, 0, 5), ReceiveTimeout = new TimeSpan(0, 0, 5) }; - EndpointAddress e = new EndpointAddress(@"http://services.romvault.com/Service1.svc"); - - Service1Client s = new Service1Client(b, e); - - try - { - s.SendErrorMessage3(Settings.Username, Settings.EMail, Program.Version, Program.SubVersion, message + "\n" + st); - } - catch - { - } - s.Close(); - } - - public static void SendErrorMessageDat(string message, string filename) - { - bool isNetworkAvailable = System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable(); - if (!isNetworkAvailable) return; - - BasicHttpBinding b = new BasicHttpBinding { SendTimeout = new TimeSpan(0, 0, 5), ReceiveTimeout = new TimeSpan(0, 0, 5) }; - EndpointAddress e = new EndpointAddress(@"http://services.romvault.com/Service1.svc"); - - Service1Client s = new Service1Client(b, e); - - try - { - s.SendDATErrorMessage3(Settings.Username, Settings.EMail, Program.Version, Program.SubVersion, message, filename); - } - catch - { - } - s.Close(); - } - private static string _logfilename; public static void ReportList(List files) diff --git a/ROMVault2/Service References/RVRef/Reference.cs b/ROMVault2/Service References/RVRef/Reference.cs deleted file mode 100644 index 23e665c..0000000 --- a/ROMVault2/Service References/RVRef/Reference.cs +++ /dev/null @@ -1,137 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.34003 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace ROMVault2.RVRef { - - - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] - [System.ServiceModel.ServiceContractAttribute(ConfigurationName="RVRef.IService1")] - public interface IService1 { - - [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IService1/CheckPassword", ReplyAction="http://tempuri.org/IService1/CheckPasswordResponse")] - string CheckPassword(string username, string password); - - [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IService1/SendUser", ReplyAction="http://tempuri.org/IService1/SendUserResponse")] - string SendUser(string username, string email, int version); - - [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IService1/SendUser1", ReplyAction="http://tempuri.org/IService1/SendUser1Response")] - string SendUser1(string username, string email, string version, int subversion); - - [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IService1/GetLatestVersion", ReplyAction="http://tempuri.org/IService1/GetLatestVersionResponse")] - int GetLatestVersion(int versionNow); - - [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IService1/GetLatestVersion1", ReplyAction="http://tempuri.org/IService1/GetLatestVersion1Response")] - string GetLatestVersion1(string version, int subversion); - - [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IService1/GetUpdateLink", ReplyAction="http://tempuri.org/IService1/GetUpdateLinkResponse")] - string GetUpdateLink(); - - [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IService1/GetUpdateLink1", ReplyAction="http://tempuri.org/IService1/GetUpdateLink1Response")] - string GetUpdateLink1(string version, int subversion); - - [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IService1/SendErrorMessage", ReplyAction="http://tempuri.org/IService1/SendErrorMessageResponse")] - void SendErrorMessage(string username, string error); - - [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IService1/SendErrorMessage1", ReplyAction="http://tempuri.org/IService1/SendErrorMessage1Response")] - void SendErrorMessage1(string username, string email, string error); - - [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IService1/SendErrorMessage2", ReplyAction="http://tempuri.org/IService1/SendErrorMessage2Response")] - void SendErrorMessage2(string username, string email, int version, string error); - - [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IService1/SendErrorMessage3", ReplyAction="http://tempuri.org/IService1/SendErrorMessage3Response")] - void SendErrorMessage3(string username, string email, string version, int subversion, string error); - - [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IService1/SendDATErrorMessage2", ReplyAction="http://tempuri.org/IService1/SendDATErrorMessage2Response")] - void SendDATErrorMessage2(string username, string email, int version, string error, string filename); - - [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IService1/SendDATErrorMessage3", ReplyAction="http://tempuri.org/IService1/SendDATErrorMessage3Response")] - void SendDATErrorMessage3(string username, string email, string version, int subversion, string error, string filename); - } - - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] - public interface IService1Channel : ROMVault2.RVRef.IService1, System.ServiceModel.IClientChannel { - } - - [System.Diagnostics.DebuggerStepThroughAttribute()] - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] - public partial class Service1Client : System.ServiceModel.ClientBase, ROMVault2.RVRef.IService1 { - - public Service1Client() { - } - - public Service1Client(string endpointConfigurationName) : - base(endpointConfigurationName) { - } - - public Service1Client(string endpointConfigurationName, string remoteAddress) : - base(endpointConfigurationName, remoteAddress) { - } - - public Service1Client(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : - base(endpointConfigurationName, remoteAddress) { - } - - public Service1Client(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : - base(binding, remoteAddress) { - } - - public string CheckPassword(string username, string password) { - return base.Channel.CheckPassword(username, password); - } - - public string SendUser(string username, string email, int version) { - return base.Channel.SendUser(username, email, version); - } - - public string SendUser1(string username, string email, string version, int subversion) { - return base.Channel.SendUser1(username, email, version, subversion); - } - - public int GetLatestVersion(int versionNow) { - return base.Channel.GetLatestVersion(versionNow); - } - - public string GetLatestVersion1(string version, int subversion) { - return base.Channel.GetLatestVersion1(version, subversion); - } - - public string GetUpdateLink() { - return base.Channel.GetUpdateLink(); - } - - public string GetUpdateLink1(string version, int subversion) { - return base.Channel.GetUpdateLink1(version, subversion); - } - - public void SendErrorMessage(string username, string error) { - base.Channel.SendErrorMessage(username, error); - } - - public void SendErrorMessage1(string username, string email, string error) { - base.Channel.SendErrorMessage1(username, email, error); - } - - public void SendErrorMessage2(string username, string email, int version, string error) { - base.Channel.SendErrorMessage2(username, email, version, error); - } - - public void SendErrorMessage3(string username, string email, string version, int subversion, string error) { - base.Channel.SendErrorMessage3(username, email, version, subversion, error); - } - - public void SendDATErrorMessage2(string username, string email, int version, string error, string filename) { - base.Channel.SendDATErrorMessage2(username, email, version, error, filename); - } - - public void SendDATErrorMessage3(string username, string email, string version, int subversion, string error, string filename) { - base.Channel.SendDATErrorMessage3(username, email, version, subversion, error, filename); - } - } -} diff --git a/ROMVault2/Service References/RVRef/Reference.svcmap b/ROMVault2/Service References/RVRef/Reference.svcmap deleted file mode 100644 index 5c2ebfa..0000000 --- a/ROMVault2/Service References/RVRef/Reference.svcmap +++ /dev/null @@ -1,33 +0,0 @@ - - - - false - true - - false - false - false - - - true - Auto - true - true - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/ROMVault2/Service References/RVRef/Service1.xsd b/ROMVault2/Service References/RVRef/Service1.xsd deleted file mode 100644 index 32e1c19..0000000 --- a/ROMVault2/Service References/RVRef/Service1.xsd +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/ROMVault2/Service References/RVRef/Service11.disco b/ROMVault2/Service References/RVRef/Service11.disco deleted file mode 100644 index d705778..0000000 --- a/ROMVault2/Service References/RVRef/Service11.disco +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/ROMVault2/Service References/RVRef/Service11.wsdl b/ROMVault2/Service References/RVRef/Service11.wsdl deleted file mode 100644 index 9dd5eac..0000000 --- a/ROMVault2/Service References/RVRef/Service11.wsdl +++ /dev/null @@ -1,266 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/ROMVault2/Service References/RVRef/Service11.xsd b/ROMVault2/Service References/RVRef/Service11.xsd deleted file mode 100644 index e6bd8df..0000000 --- a/ROMVault2/Service References/RVRef/Service11.xsd +++ /dev/null @@ -1,198 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/ROMVault2/Service References/RVRef/configuration.svcinfo b/ROMVault2/Service References/RVRef/configuration.svcinfo deleted file mode 100644 index 36c7f28..0000000 --- a/ROMVault2/Service References/RVRef/configuration.svcinfo +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/ROMVault2/Service References/RVRef/configuration91.svcinfo b/ROMVault2/Service References/RVRef/configuration91.svcinfo deleted file mode 100644 index a1e7b23..0000000 --- a/ROMVault2/Service References/RVRef/configuration91.svcinfo +++ /dev/null @@ -1,201 +0,0 @@ - - - - - - - BasicHttpBinding_IService1 - - - - - - - - - - - - - - - - - - - - - StrongWildcard - - - - - - 65536 - - - - - - - - - System.ServiceModel.Configuration.XmlDictionaryReaderQuotasElement - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - System.Text.UTF8Encoding - - - Buffered - - - - - - Text - - - System.ServiceModel.Configuration.BasicHttpSecurityElement - - - None - - - System.ServiceModel.Configuration.HttpTransportSecurityElement - - - None - - - None - - - System.Security.Authentication.ExtendedProtection.Configuration.ExtendedProtectionPolicyElement - - - Never - - - TransportSelected - - - (Collection) - - - - - - System.ServiceModel.Configuration.BasicHttpMessageSecurityElement - - - UserName - - - Default - - - - - - - - - http://services.romvault.com/Service1.svc - - - - - - basicHttpBinding - - - BasicHttpBinding_IService1 - - - RVRef.IService1 - - - System.ServiceModel.Configuration.AddressHeaderCollectionElement - - - <Header /> - - - System.ServiceModel.Configuration.IdentityElement - - - System.ServiceModel.Configuration.UserPrincipalNameElement - - - - - - System.ServiceModel.Configuration.ServicePrincipalNameElement - - - - - - System.ServiceModel.Configuration.DnsElement - - - - - - System.ServiceModel.Configuration.RsaElement - - - - - - System.ServiceModel.Configuration.CertificateElement - - - - - - System.ServiceModel.Configuration.CertificateReferenceElement - - - My - - - LocalMachine - - - FindBySubjectDistinguishedName - - - - - - False - - - BasicHttpBinding_IService1 - - - - - - - - - - - \ No newline at end of file diff --git a/ROMVault2/SupportedFiles/CHD/CHD.cs b/ROMVault2/SupportedFiles/CHD/CHD.cs index df116da..412fe48 100644 --- a/ROMVault2/SupportedFiles/CHD/CHD.cs +++ b/ROMVault2/SupportedFiles/CHD/CHD.cs @@ -356,7 +356,6 @@ namespace ROMVault2.SupportedFiles.CHD break; default: _result = "Unexpected output from chdman :" + sOut; - ReportError.SendErrorMessage("CHDOutputHandler returned =" + sOut); _resultType = CHDManCheck.CHDUnknownError; break; } @@ -421,7 +420,6 @@ namespace ROMVault2.SupportedFiles.CHD } else { - ReportError.SendErrorMessage("CHDErrorHandler returned =" + sLine); _result = "Unknown message : " + sLine; _resultType = CHDManCheck.CHDUnknownError; } From b54610c2f6987343fe0849018dcf33e68efedb01 Mon Sep 17 00:00:00 2001 From: Jim Westfall Date: Thu, 13 Nov 2014 17:24:53 -0800 Subject: [PATCH 22/28] Work around mono crashing on Rows.Clear() Mono will crash if you do a Rows.Clear() and the first row isnt visible. To work around this, when running under mono force scroll to [0,0] cell before issuing the Clear(). https://bugzilla.xamarin.com/show_bug.cgi?id=24372 Renamed Settings.MonoFileIO to Settings.IsUnix Created Settings.IsMono --- ROMVault2/FrmMain.cs | 21 +++++++++++++++++ ROMVault2/FrmSetDir.cs | 3 +++ ROMVault2/IO/RVIO.cs | 36 ++++++++++++++--------------- ROMVault2/Settings.cs | 4 +++- ROMVault2/SupportedFiles/CHD/CHD.cs | 2 +- 5 files changed, 46 insertions(+), 20 deletions(-) diff --git a/ROMVault2/FrmMain.cs b/ROMVault2/FrmMain.cs index ba6c53f..50ce71c 100644 --- a/ROMVault2/FrmMain.cs +++ b/ROMVault2/FrmMain.cs @@ -444,6 +444,15 @@ namespace ROMVault2 private void DatSetSelected(RvBase cf) { DirTree.Refresh(); + + if (Settings.IsMono) + { + if (GameGrid.RowCount > 0) + GameGrid.CurrentCell = GameGrid[0,0]; + if (RomGrid.RowCount > 0) + RomGrid.CurrentCell = RomGrid[0,0]; + } + GameGrid.Rows.Clear(); RomGrid.Rows.Clear(); @@ -579,6 +588,15 @@ namespace ROMVault2 lblDITRomsUnknown.Text = (tDir.DirStatus.CountUnknown() + tDir.DirStatus.CountInToSort()).ToString(CultureInfo.InvariantCulture); _updatingGameGrid = true; + + if (Settings.IsMono) + { + if (GameGrid.RowCount > 0) + GameGrid.CurrentCell = GameGrid[0,0]; + if (RomGrid.RowCount > 0) + RomGrid.CurrentCell = RomGrid[0,0]; + } + GameGrid.Rows.Clear(); RomGrid.Rows.Clear(); @@ -1160,6 +1178,9 @@ namespace ROMVault2 } } + if (Settings.IsMono && RomGrid.RowCount > 0) + RomGrid.CurrentCell = RomGrid[0,0]; + RomGrid.Rows.Clear(); AddDir(tGame, ""); GC.Collect(); diff --git a/ROMVault2/FrmSetDir.cs b/ROMVault2/FrmSetDir.cs index fa07d0f..27512e6 100644 --- a/ROMVault2/FrmSetDir.cs +++ b/ROMVault2/FrmSetDir.cs @@ -35,6 +35,9 @@ namespace ROMVault2 private void UpdateGrid() { + if (Settings.IsMono && DataGridGames.RowCount > 0) + DataGridGames.CurrentCell = DataGridGames[0,0]; + DataGridGames.Rows.Clear(); foreach (DirMap t in Settings.DirPathMap) { diff --git a/ROMVault2/IO/RVIO.cs b/ROMVault2/IO/RVIO.cs index 476ad7a..6539b24 100644 --- a/ROMVault2/IO/RVIO.cs +++ b/ROMVault2/IO/RVIO.cs @@ -57,7 +57,7 @@ namespace ROMVault2.IO FullName = path; Name = Path.GetFileName(path); - if (Settings.MonoFileIO) + if (Settings.IsUnix) { System.IO.FileInfo fi = new System.IO.FileInfo(path); @@ -94,7 +94,7 @@ namespace ROMVault2.IO FullName = path; Name = Path.GetFileName(path); - if (Settings.MonoFileIO) + if (Settings.IsUnix) { System.IO.DirectoryInfo fi = new System.IO.DirectoryInfo(path); @@ -123,7 +123,7 @@ namespace ROMVault2.IO { List dirs = new List(); - if (Settings.MonoFileIO) + if (Settings.IsUnix) { System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(FullName); System.IO.DirectoryInfo[] arrDi = di.GetDirectories(SearchPattern); @@ -183,7 +183,7 @@ namespace ROMVault2.IO { List files = new List(); - if (Settings.MonoFileIO) + if (Settings.IsUnix) { System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(FullName); System.IO.FileInfo[] arrDi = di.GetFiles(SearchPattern); @@ -239,7 +239,7 @@ namespace ROMVault2.IO { public static bool Exists(string path) { - if (Settings.MonoFileIO) + if (Settings.IsUnix) return System.IO.Directory.Exists(path); @@ -252,7 +252,7 @@ namespace ROMVault2.IO } public static void Move(String sourceDirName, String destDirName) { - if (Settings.MonoFileIO) + if (Settings.IsUnix) { System.IO.Directory.Move(sourceDirName, destDirName); return; @@ -288,7 +288,7 @@ namespace ROMVault2.IO } public static void Delete(String path) { - if (Settings.MonoFileIO) + if (Settings.IsUnix) { System.IO.Directory.Delete(path); return; @@ -301,7 +301,7 @@ namespace ROMVault2.IO public static void CreateDirectory(String path) { - if (Settings.MonoFileIO) + if (Settings.IsUnix) { System.IO.Directory.CreateDirectory(path); return; @@ -323,7 +323,7 @@ namespace ROMVault2.IO { public static bool Exists(string path) { - if (Settings.MonoFileIO) + if (Settings.IsUnix) return System.IO.File.Exists(path); @@ -340,7 +340,7 @@ namespace ROMVault2.IO } public static void Copy(String sourceFileName, String destFileName, bool overwrite) { - if (Settings.MonoFileIO) + if (Settings.IsUnix) { System.IO.File.Copy(sourceFileName, destFileName, overwrite); return; @@ -387,7 +387,7 @@ namespace ROMVault2.IO } public static void Move(String sourceFileName, String destFileName) { - if (Settings.MonoFileIO) + if (Settings.IsUnix) { System.IO.File.Move(sourceFileName, destFileName); return; @@ -412,7 +412,7 @@ namespace ROMVault2.IO } public static void Delete(String path) { - if (Settings.MonoFileIO) + if (Settings.IsUnix) { System.IO.File.Delete(path); return; @@ -431,7 +431,7 @@ namespace ROMVault2.IO public static bool SetAttributes(String path, FileAttributes fileAttributes) { - if (Settings.MonoFileIO) + if (Settings.IsUnix) { try { @@ -466,7 +466,7 @@ namespace ROMVault2.IO } public static string Combine(string path1, string path2) { - if (Settings.MonoFileIO) + if (Settings.IsUnix) return System.IO.Path.Combine(path1, path2); if (path1 == null || path2 == null) @@ -538,7 +538,7 @@ namespace ROMVault2.IO } public static String GetDirectoryName(String path) { - if (Settings.MonoFileIO) + if (Settings.IsUnix) return System.IO.Path.GetDirectoryName(path); @@ -600,7 +600,7 @@ namespace ROMVault2.IO public static int OpenFileRead(string path, out System.IO.Stream stream) { - if (Settings.MonoFileIO) + if (Settings.IsUnix) { try { @@ -634,7 +634,7 @@ namespace ROMVault2.IO public static int OpenFileWrite(string path, out System.IO.Stream stream) { - if (Settings.MonoFileIO) + if (Settings.IsUnix) { try { @@ -675,7 +675,7 @@ namespace ROMVault2.IO { public static string GetShortPath(string path) { - if (Settings.MonoFileIO) + if (Settings.IsUnix) return path; int remove = 0; diff --git a/ROMVault2/Settings.cs b/ROMVault2/Settings.cs index 4efbc9a..5fbe7af 100644 --- a/ROMVault2/Settings.cs +++ b/ROMVault2/Settings.cs @@ -48,7 +48,7 @@ namespace ROMVault2 public static bool CacheSaveTimerEnabled = true; public static int CacheSaveTimePeriod = 10; - public static bool MonoFileIO + public static bool IsUnix { get { @@ -57,6 +57,8 @@ namespace ROMVault2 } } + public static bool IsMono { get { return (Type.GetType ("Mono.Runtime") != null); } } + public static string EMail { get diff --git a/ROMVault2/SupportedFiles/CHD/CHD.cs b/ROMVault2/SupportedFiles/CHD/CHD.cs index 412fe48..3d5ba2b 100644 --- a/ROMVault2/SupportedFiles/CHD/CHD.cs +++ b/ROMVault2/SupportedFiles/CHD/CHD.cs @@ -246,7 +246,7 @@ namespace ROMVault2.SupportedFiles.CHD _resultType = CHDManCheck.Unset; string chdExe = "chdman.exe"; - if (Settings.MonoFileIO) + if (Settings.IsUnix) chdExe = "chdman"; string chdPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, chdExe); From 39e4a6114fd2f1e42bc8936f2c1fd01123c53240 Mon Sep 17 00:00:00 2001 From: Jim Westfall Date: Sun, 7 Dec 2014 10:01:27 -0800 Subject: [PATCH 23/28] Fix FolderBrowserDialog's under mono Mono doesnt work well with RootFolder of DesktopDirectory, you end up being stuck in ~/Desktop/. Instead when being run under mono use MyComputer, which dumps you to / --- ROMVault2/FrmSetDir.cs | 2 +- ROMVault2/FrmSettings.cs | 2 +- ROMVault2/Report.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ROMVault2/FrmSetDir.cs b/ROMVault2/FrmSetDir.cs index 27512e6..b646f2a 100644 --- a/ROMVault2/FrmSetDir.cs +++ b/ROMVault2/FrmSetDir.cs @@ -80,7 +80,7 @@ namespace ROMVault2 { ShowNewFolderButton = true, Description = Resources.FrmSetDir_BtnSetRomLocationClick_Please_select_a_folder_for_This_Rom_Set, - RootFolder = Environment.SpecialFolder.DesktopDirectory, + RootFolder = (Settings.IsMono ? Environment.SpecialFolder.MyComputer : Environment.SpecialFolder.DesktopDirectory), SelectedPath = DBHelper.GetRealPath(_datLocation) }; if (browse.ShowDialog() == DialogResult.OK) diff --git a/ROMVault2/FrmSettings.cs b/ROMVault2/FrmSettings.cs index dc98973..371e042 100644 --- a/ROMVault2/FrmSettings.cs +++ b/ROMVault2/FrmSettings.cs @@ -88,7 +88,7 @@ namespace ROMVault2 { ShowNewFolderButton = true, Description = Resources.FrmSettings_BtnDatClick_Please_select_a_folder_for_DAT_Root, - RootFolder = Environment.SpecialFolder.DesktopDirectory, + RootFolder = (Settings.IsMono ? Environment.SpecialFolder.MyComputer : Environment.SpecialFolder.DesktopDirectory), SelectedPath = Settings.DatRoot }; diff --git a/ROMVault2/Report.cs b/ROMVault2/Report.cs index 373f77c..d801e8d 100644 --- a/ROMVault2/Report.cs +++ b/ROMVault2/Report.cs @@ -40,7 +40,7 @@ namespace ROMVault2 { ShowNewFolderButton = true, Description = @"Please select a folder for Dats", - RootFolder = Environment.SpecialFolder.DesktopDirectory, + RootFolder = (Settings.IsMono ? Environment.SpecialFolder.MyComputer : Environment.SpecialFolder.DesktopDirectory), SelectedPath = @"apps" }; From 47731743b62c36121650c1b5d1af36d6a3bcb14f Mon Sep 17 00:00:00 2001 From: gjefferyes Date: Mon, 8 Dec 2014 10:29:43 -0600 Subject: [PATCH 24/28] Cleaned up a little more, removed the frmRegistration code. And ready for a first github release. so changed to version 2.2 --- ROMVault2/FrmMain.Designer.cs | 12 +- ROMVault2/FrmMain.cs | 10 +- ROMVault2/FrmRegistration.Designer.cs | 121 ---- ROMVault2/FrmRegistration.cs | 28 - ROMVault2/FrmRegistration.resx | 120 ---- ROMVault2/FrmSplashScreen.Designer.cs | 14 - ROMVault2/FrmSplashScreen.cs | 3 - ROMVault2/FrmSplashScreen.resx | 802 +++++++++++++------------- ROMVault2/Program.cs | 4 +- ROMVault2/ROMVault2.csproj | 9 - ROMVault2/Settings.cs | 40 +- 11 files changed, 397 insertions(+), 766 deletions(-) delete mode 100644 ROMVault2/FrmRegistration.Designer.cs delete mode 100644 ROMVault2/FrmRegistration.cs delete mode 100644 ROMVault2/FrmRegistration.resx diff --git a/ROMVault2/FrmMain.Designer.cs b/ROMVault2/FrmMain.Designer.cs index ece9540..00ba590 100644 --- a/ROMVault2/FrmMain.Designer.cs +++ b/ROMVault2/FrmMain.Designer.cs @@ -106,7 +106,6 @@ this.fixReportToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.aboutRomVaultToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.registratioToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.dataGridViewImageColumn1 = new System.Windows.Forms.DataGridViewImageColumn(); this.dataGridViewImageColumn2 = new System.Windows.Forms.DataGridViewImageColumn(); this.dataGridViewImageColumn3 = new System.Windows.Forms.DataGridViewImageColumn(); @@ -929,8 +928,7 @@ // helpToolStripMenuItem // this.helpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.aboutRomVaultToolStripMenuItem, - this.registratioToolStripMenuItem}); + this.aboutRomVaultToolStripMenuItem}); this.helpToolStripMenuItem.Name = "helpToolStripMenuItem"; this.helpToolStripMenuItem.Size = new System.Drawing.Size(44, 20); this.helpToolStripMenuItem.Text = "Help"; @@ -942,13 +940,6 @@ this.aboutRomVaultToolStripMenuItem.Text = "About RomVault"; this.aboutRomVaultToolStripMenuItem.Click += new System.EventHandler(this.AboutRomVaultToolStripMenuItemClick); // - // registratioToolStripMenuItem - // - this.registratioToolStripMenuItem.Name = "registratioToolStripMenuItem"; - this.registratioToolStripMenuItem.Size = new System.Drawing.Size(162, 22); - this.registratioToolStripMenuItem.Text = "Registration"; - this.registratioToolStripMenuItem.Click += new System.EventHandler(this.RegistratioToolStripMenuItemClick); - // // dataGridViewImageColumn1 // this.dataGridViewImageColumn1.FillWeight = 40F; @@ -1083,7 +1074,6 @@ private System.Windows.Forms.DataGridViewTextBoxColumn CStatus; private System.Windows.Forms.DataGridViewTextBoxColumn ZipIndex; private System.Windows.Forms.DataGridViewTextBoxColumn ZipHeader; - private System.Windows.Forms.ToolStripMenuItem registratioToolStripMenuItem; private System.Windows.Forms.Label lblDITRomsFixable; private System.Windows.Forms.Label lblDIRomsFixable; private System.Windows.Forms.ToolStripMenuItem reportsToolStripMenuItem; diff --git a/ROMVault2/FrmMain.cs b/ROMVault2/FrmMain.cs index ba6c53f..1a35cc6 100644 --- a/ROMVault2/FrmMain.cs +++ b/ROMVault2/FrmMain.cs @@ -1426,14 +1426,6 @@ namespace ROMVault2 } } - - private void RegistratioToolStripMenuItemClick(object sender, EventArgs e) - { - FrmRegistration freg = new FrmRegistration(); - freg.ShowDialog(this); - freg.Dispose(); - } - - + } } diff --git a/ROMVault2/FrmRegistration.Designer.cs b/ROMVault2/FrmRegistration.Designer.cs deleted file mode 100644 index 050e5b9..0000000 --- a/ROMVault2/FrmRegistration.Designer.cs +++ /dev/null @@ -1,121 +0,0 @@ -namespace ROMVault2 -{ - partial class FrmRegistration - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.label1 = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); - this.label3 = new System.Windows.Forms.Label(); - this.txtName = new System.Windows.Forms.TextBox(); - this.txtEmail = new System.Windows.Forms.TextBox(); - this.btnOK = new System.Windows.Forms.Button(); - this.SuspendLayout(); - // - // label1 - // - this.label1.Location = new System.Drawing.Point(12, 9); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(420, 49); - this.label1.TabIndex = 0; - this.label1.Text = "To make RomVault 2 the best is can be, RomVault 2 will send error reports to the " + - "author. Please fill out this from so that the Author can contact you in the case" + - " of a crash."; - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(12, 58); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(120, 13); - this.label2.TabIndex = 1; - this.label2.Text = "Your Name: (Username)"; - // - // label3 - // - this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(12, 100); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(103, 13); - this.label3.TabIndex = 2; - this.label3.Text = "Your Contact Email :"; - // - // txtName - // - this.txtName.Location = new System.Drawing.Point(15, 74); - this.txtName.Name = "txtName"; - this.txtName.Size = new System.Drawing.Size(417, 20); - this.txtName.TabIndex = 3; - // - // txtEmail - // - this.txtEmail.Location = new System.Drawing.Point(15, 116); - this.txtEmail.Name = "txtEmail"; - this.txtEmail.Size = new System.Drawing.Size(417, 20); - this.txtEmail.TabIndex = 4; - // - // btnOK - // - this.btnOK.Location = new System.Drawing.Point(303, 145); - this.btnOK.Name = "btnOK"; - this.btnOK.Size = new System.Drawing.Size(128, 23); - this.btnOK.TabIndex = 5; - this.btnOK.Text = "OK"; - this.btnOK.UseVisualStyleBackColor = true; - this.btnOK.Click += new System.EventHandler(this.btnOK_Click); - // - // FrmRegistration - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; - this.ClientSize = new System.Drawing.Size(444, 178); - this.ControlBox = false; - this.Controls.Add(this.btnOK); - this.Controls.Add(this.txtEmail); - this.Controls.Add(this.txtName); - this.Controls.Add(this.label3); - this.Controls.Add(this.label2); - this.Controls.Add(this.label1); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; - this.Name = "FrmRegistration"; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; - this.Text = "Registration"; - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Label label1; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.TextBox txtName; - private System.Windows.Forms.TextBox txtEmail; - private System.Windows.Forms.Button btnOK; - } -} \ No newline at end of file diff --git a/ROMVault2/FrmRegistration.cs b/ROMVault2/FrmRegistration.cs deleted file mode 100644 index 22f08ad..0000000 --- a/ROMVault2/FrmRegistration.cs +++ /dev/null @@ -1,28 +0,0 @@ -/****************************************************** - * ROMVault2 is written by Gordon J. * - * Contact gordon@romvault.com * - * Copyright 2014 * - ******************************************************/ - -using System; -using System.Windows.Forms; - -namespace ROMVault2 -{ - public partial class FrmRegistration : Form - { - public FrmRegistration() - { - InitializeComponent(); - txtName.Text = Settings.Username; - txtEmail.Text = Settings.EMail; - } - - private void btnOK_Click(object sender, EventArgs e) - { - Settings.Username = txtName.Text; - Settings.EMail = txtEmail.Text; - Close(); - } - } -} diff --git a/ROMVault2/FrmRegistration.resx b/ROMVault2/FrmRegistration.resx deleted file mode 100644 index 5ea0895..0000000 --- a/ROMVault2/FrmRegistration.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/ROMVault2/FrmSplashScreen.Designer.cs b/ROMVault2/FrmSplashScreen.Designer.cs index 0925cb5..b15f88f 100644 --- a/ROMVault2/FrmSplashScreen.Designer.cs +++ b/ROMVault2/FrmSplashScreen.Designer.cs @@ -35,7 +35,6 @@ this.progressBar = new System.Windows.Forms.ProgressBar(); this.lblVersion = new System.Windows.Forms.Label(); this.bgWork = new System.ComponentModel.BackgroundWorker(); - this.label1 = new System.Windows.Forms.Label(); this.SuspendLayout(); // // lblStatus @@ -74,24 +73,13 @@ // this.bgWork.WorkerReportsProgress = true; // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(12, 185); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(35, 13); - this.label1.TabIndex = 6; - this.label1.Text = "label1"; - // // FrmSplashScreen // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; this.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("$this.BackgroundImage"))); this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None; this.ClientSize = new System.Drawing.Size(465, 207); this.ControlBox = false; - this.Controls.Add(this.label1); this.Controls.Add(this.lblVersion); this.Controls.Add(this.progressBar); this.Controls.Add(this.lblStatus); @@ -103,7 +91,6 @@ this.Text = "FrmSplashScreen"; this.Shown += new System.EventHandler(this.FrmSplashScreenShown); this.ResumeLayout(false); - this.PerformLayout(); } @@ -114,6 +101,5 @@ private System.Windows.Forms.ProgressBar progressBar; private System.Windows.Forms.Label lblVersion; private System.ComponentModel.BackgroundWorker bgWork; - private System.Windows.Forms.Label label1; } } diff --git a/ROMVault2/FrmSplashScreen.cs b/ROMVault2/FrmSplashScreen.cs index 8f9d677..6b4cc78 100644 --- a/ROMVault2/FrmSplashScreen.cs +++ b/ROMVault2/FrmSplashScreen.cs @@ -6,7 +6,6 @@ using System; using System.ComponentModel; -using System.ServiceModel; using System.Threading; using System.Windows.Forms; using ROMVault2.Properties; @@ -25,8 +24,6 @@ namespace ROMVault2 Opacity = 0; timer1.Interval = 50; - label1.Text = @"Registered to : " + Settings.Username + @" Contact Email (" + Settings.EMail + @")"; - bgWork.DoWork += StartUpCode; bgWork.ProgressChanged += BgwProgressChanged; bgWork.RunWorkerCompleted += BgwRunWorkerCompleted; diff --git a/ROMVault2/FrmSplashScreen.resx b/ROMVault2/FrmSplashScreen.resx index 488f942..739f5ec 100644 --- a/ROMVault2/FrmSplashScreen.resx +++ b/ROMVault2/FrmSplashScreen.resx @@ -172,416 +172,398 @@ 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 \ No newline at end of file diff --git a/ROMVault2/Program.cs b/ROMVault2/Program.cs index 84bd8cd..0d014aa 100644 --- a/ROMVault2/Program.cs +++ b/ROMVault2/Program.cs @@ -14,8 +14,8 @@ namespace ROMVault2 { //public static UsernamePassword Up; public static readonly Encoding Enc = Encoding.GetEncoding(28591); - public const string Version = "2.1"; - public const int SubVersion = 27; + public const string Version = "2.2"; + public const int SubVersion = 0; public static string ErrorMessage; public static string URL; diff --git a/ROMVault2/ROMVault2.csproj b/ROMVault2/ROMVault2.csproj index 8b56c14..5eaf3ba 100644 --- a/ROMVault2/ROMVault2.csproj +++ b/ROMVault2/ROMVault2.csproj @@ -145,12 +145,6 @@ FrmProgressWindow.cs - - Form - - - FrmRegistration.cs - Form @@ -234,9 +228,6 @@ FrmProgressWindowFix.cs - - FrmRegistration.cs - FrmSettings.cs Designer diff --git a/ROMVault2/Settings.cs b/ROMVault2/Settings.cs index 4efbc9a..fd0ddb6 100644 --- a/ROMVault2/Settings.cs +++ b/ROMVault2/Settings.cs @@ -56,45 +56,7 @@ namespace ROMVault2 return ((p == 4) || (p == 6) || (p == 128)); } } - - public static string EMail - { - get - { - RegistryKey regKey1 = Registry.CurrentUser; - regKey1 = regKey1.CreateSubKey("Software\\RomVault2\\User"); - return regKey1.GetValue("Email", "").ToString(); - - } - - set - { - RegistryKey regKey = Registry.CurrentUser; - regKey = regKey.CreateSubKey("Software\\RomVault2\\User"); - regKey.SetValue("Email", value); - } - } - - public static string Username - { - get - { - RegistryKey regKey1 = Registry.CurrentUser; - regKey1 = regKey1.CreateSubKey("Software\\RomVault2\\User"); - return regKey1.GetValue("UserName", "").ToString(); - - } - set - { - RegistryKey regKey = Registry.CurrentUser; - regKey = regKey.CreateSubKey("Software\\RomVault2\\User"); - regKey.SetValue("UserName", value); - } - } - - - - + public static void SetDefaults() { CacheFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "RomVault2_" + DBVersion.Version + ".Cache"); From 3e261ee077b17c9cb4f8a5dec1383a61d46d9777 Mon Sep 17 00:00:00 2001 From: Jim Westfall Date: Sun, 18 Jan 2015 14:09:11 -0800 Subject: [PATCH 25/28] fix sorting on GameGrid When switching to Cell_Formatting to fix rendering in mono and also provide a speed up to displaying the GameGrid, it broken sorting on the CGame and CDescription columns. This is because we are no longer setting the Value field on those cells. On windows, clicking those column headers would do nothing, under mono it would cause a crash. Instead of reverting the Cell_Formatting change, this update make us handle the sorting ourselves. Mono doesnt implement SortCompare, so had to handle column header clicks and make our own IComparer. This also disables sorting on columns that are images, including on RomGrid. --- ROMVault2/FrmMain.Designer.cs | 8 ++- ROMVault2/FrmMain.cs | 93 ++++++++++++++++++++++++++++++++++- 2 files changed, 98 insertions(+), 3 deletions(-) diff --git a/ROMVault2/FrmMain.Designer.cs b/ROMVault2/FrmMain.Designer.cs index 00ba590..e38d02f 100644 --- a/ROMVault2/FrmMain.Designer.cs +++ b/ROMVault2/FrmMain.Designer.cs @@ -656,6 +656,7 @@ this.GameGrid.SelectionChanged += new System.EventHandler(this.GameGridSelectionChanged); this.GameGrid.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.GameGridMouseDoubleClick); this.GameGrid.MouseUp += new System.Windows.Forms.MouseEventHandler(this.GameGrid_MouseUp); + this.GameGrid.ColumnHeaderMouseClick += new System.Windows.Forms.DataGridViewCellMouseEventHandler(this.GameGridColumnHeaderMouseClick); // // Type // @@ -664,7 +665,7 @@ this.Type.Name = "Type"; this.Type.ReadOnly = true; this.Type.Resizable = System.Windows.Forms.DataGridViewTriState.True; - this.Type.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic; + this.Type.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; this.Type.Width = 40; // // CGame @@ -672,6 +673,7 @@ this.CGame.HeaderText = "Game (Directory / Zip)"; this.CGame.Name = "CGame"; this.CGame.ReadOnly = true; + this.CGame.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Programmatic; this.CGame.Width = 220; // // CDescription @@ -679,6 +681,7 @@ this.CDescription.HeaderText = "Description"; this.CDescription.Name = "CDescription"; this.CDescription.ReadOnly = true; + this.CDescription.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Programmatic; this.CDescription.Width = 220; // // CCorrect @@ -687,6 +690,7 @@ this.CCorrect.Name = "CCorrect"; this.CCorrect.ReadOnly = true; this.CCorrect.Resizable = System.Windows.Forms.DataGridViewTriState.False; + this.CCorrect.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; this.CCorrect.Width = 500; // // RomGrid @@ -756,7 +760,7 @@ this.CGot.Name = "CGot"; this.CGot.ReadOnly = true; this.CGot.Resizable = System.Windows.Forms.DataGridViewTriState.True; - this.CGot.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic; + this.CGot.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; this.CGot.Width = 65; // // CRom diff --git a/ROMVault2/FrmMain.cs b/ROMVault2/FrmMain.cs index 6f0385d..f5ed8d2 100644 --- a/ROMVault2/FrmMain.cs +++ b/ROMVault2/FrmMain.cs @@ -37,6 +37,9 @@ namespace ROMVault2 private readonly Color[] _displayColor; private bool _updatingGameGrid; + + private int GameGridSortColumnIndex = 0; + private SortOrder GameGridSortOrder = SortOrder.Descending; public static int[] GameGridColumnXPositions; @@ -456,6 +459,11 @@ namespace ROMVault2 GameGrid.Rows.Clear(); RomGrid.Rows.Clear(); + // clear sorting + GameGrid.Columns[GameGridSortColumnIndex].HeaderCell.SortGlyphDirection = SortOrder.None; + GameGridSortColumnIndex = 0; + GameGridSortOrder = SortOrder.Descending; + if (cf == null) return; @@ -600,6 +608,12 @@ namespace ROMVault2 GameGrid.Rows.Clear(); RomGrid.Rows.Clear(); + // clear sorting + GameGrid.Columns[GameGridSortColumnIndex].HeaderCell.SortGlyphDirection = SortOrder.None; + GameGridSortColumnIndex = 0; + GameGridSortOrder = SortOrder.Descending; + + ReportStatus tDirStat; GameGridColumnXPositions = new int[(int)RepStatus.EndValue]; @@ -851,9 +865,86 @@ namespace ROMVault2 e.Value = bmp; } else - Console.WriteLine("WARN: GameGrid_CellFormatting() unknown column: {0}", GameGrid.Columns[e.ColumnIndex].Name); + Console.WriteLine("WARN: GameGrid_CellFormatting() unknown column: {0}", GameGrid.Columns[e.ColumnIndex].Name); } + private void GameGridColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) + { + + // only allow sort on CGame/CDescription + if (e.ColumnIndex != 1 && e.ColumnIndex != 2) + return; + + DataGridViewColumn newColumn = GameGrid.Columns[e.ColumnIndex]; + DataGridViewColumn oldColumn = GameGrid.Columns[GameGridSortColumnIndex]; + + if (newColumn == oldColumn) + { + if (GameGridSortOrder == SortOrder.Ascending) + GameGridSortOrder = SortOrder.Descending; + else + GameGridSortOrder = SortOrder.Ascending; + } + else + { + oldColumn.HeaderCell.SortGlyphDirection = SortOrder.None; + GameGridSortOrder = SortOrder.Ascending; + } + + GameGrid.Sort(new GameGridRowComparer(GameGridSortOrder, e.ColumnIndex)); + newColumn.HeaderCell.SortGlyphDirection = GameGridSortOrder; + GameGridSortColumnIndex = e.ColumnIndex; + } + + private class GameGridRowComparer : System.Collections.IComparer + { + private int sortMod = 1; + private int columnIndex; + + public GameGridRowComparer(SortOrder sortOrder, int index) + { + columnIndex = index; + + if (sortOrder == SortOrder.Descending) + sortMod = -1; + } + + public int Compare(object a, object b) + { + DataGridViewRow aRow = (DataGridViewRow)a; + DataGridViewRow bRow = (DataGridViewRow)b; + + RvDir aRvDir = (ROMVault2.RvDB.RvDir)aRow.Tag; + RvDir bRvDir = (ROMVault2.RvDB.RvDir)bRow.Tag; + + int result = 0; + switch (columnIndex) + { + case 1: // CGame + result = System.String.Compare(aRvDir.Name, bRvDir.Name); + break; + case 2: // CDescription + String aDes = ""; + String bDes = ""; + if (aRvDir.Game != null) + aDes = aRvDir.Game.GetData(RvGame.GameData.Description); + if (bRvDir.Game != null) + bDes = bRvDir.Game.GetData(RvGame.GameData.Description); + + result = System.String.Compare(aDes, bDes); + + // if desciptions match, fall through to sorting by name + if (result == 0) + result = System.String.Compare(aRvDir.Name, bRvDir.Name); + + break; + default: + Console.WriteLine("WARN: GameGridRowComparer::Compare() Invalid columnIndex: {0}", columnIndex); + break; + } + return sortMod * result; + } + } #endregion #region "Rom Grid Code" From b368f33351af2a34ac220d7342ea4f9b0c94ade2 Mon Sep 17 00:00:00 2001 From: gjefferyes Date: Tue, 27 Jan 2015 09:09:24 -0600 Subject: [PATCH 26/28] A Little Code cleanup in FrmMain, and set Version to 2.2.1 for public release. --- ROMVault2/FrmMain.cs | 185 ++++++++++++++++++------------------- ROMVault2/Program.cs | 2 +- ROMVault2/ROMVault2.csproj | 2 +- 3 files changed, 91 insertions(+), 98 deletions(-) diff --git a/ROMVault2/FrmMain.cs b/ROMVault2/FrmMain.cs index f5ed8d2..28be2b3 100644 --- a/ROMVault2/FrmMain.cs +++ b/ROMVault2/FrmMain.cs @@ -7,7 +7,6 @@ using System; using System.Diagnostics; using System.Drawing; using System.Globalization; -using System.ServiceModel; using System.Windows.Forms; using ROMVault2.Properties; using ROMVault2.RvDB; @@ -18,7 +17,6 @@ namespace ROMVault2 { public partial class FrmMain : Form { - private static readonly Color CBlue = Color.FromArgb(214, 214, 255); private static readonly Color CGreyBlue = Color.FromArgb(214, 224, 255); private static readonly Color CRed = Color.FromArgb(255, 214, 214); @@ -38,10 +36,9 @@ namespace ROMVault2 private bool _updatingGameGrid; - private int GameGridSortColumnIndex = 0; - private SortOrder GameGridSortOrder = SortOrder.Descending; - - public static int[] GameGridColumnXPositions; + private int _gameGridSortColumnIndex; + private SortOrder _gameGridSortOrder = SortOrder.Descending; + private static int[] _gameGridColumnXPositions; private FrmKey _fk; @@ -104,7 +101,7 @@ namespace ROMVault2 _displayColor[(int)RepStatus.Deleted] = CWhite; - GameGridColumnXPositions = new int[(int)RepStatus.EndValue]; + _gameGridColumnXPositions = new int[(int)RepStatus.EndValue]; DirTree.Setup(ref DB.DirTree); @@ -413,33 +410,33 @@ namespace ROMVault2 if (cf != DirTree.GetSelected()) DatSetSelected(cf); - if (e.Button == MouseButtons.Right) + if (e.Button != MouseButtons.Right) + return; + + + RvDir tn = (RvDir)sender; + + ContextMenu mnuContext = new ContextMenu(); + + MenuItem mnuFile = new MenuItem { - RvDir tn = (RvDir)sender; + Index = 0, + Text = Resources.FrmMain_DirTreeRvSelected_Set_ROM_DIR, + Tag = tn.TreeFullName + }; + mnuFile.Click += MnuFileClick; + mnuContext.MenuItems.Add(mnuFile); - ContextMenu mnuContext = new ContextMenu(); - - MenuItem mnuFile = new MenuItem - { - Index = 0, - Text = Resources.FrmMain_DirTreeRvSelected_Set_ROM_DIR, - Tag = tn.TreeFullName - }; - mnuFile.Click += MnuFileClick; - mnuContext.MenuItems.Add(mnuFile); - - MenuItem mnuMakeDat = new MenuItem - { - Index = 1, - Text = @"Make Dat", - Tag = tn - }; - mnuMakeDat.Click += MnuMakeDatClick; - mnuContext.MenuItems.Add(mnuMakeDat); - - - mnuContext.Show(DirTree, e.Location); - } + MenuItem mnuMakeDat = new MenuItem + { + Index = 1, + Text = @"Make Dat", + Tag = tn + }; + mnuMakeDat.Click += MnuMakeDatClick; + mnuContext.MenuItems.Add(mnuMakeDat); + + mnuContext.Show(DirTree, e.Location); } #region "DAT display code" @@ -460,9 +457,9 @@ namespace ROMVault2 RomGrid.Rows.Clear(); // clear sorting - GameGrid.Columns[GameGridSortColumnIndex].HeaderCell.SortGlyphDirection = SortOrder.None; - GameGridSortColumnIndex = 0; - GameGridSortOrder = SortOrder.Descending; + GameGrid.Columns[_gameGridSortColumnIndex].HeaderCell.SortGlyphDirection = SortOrder.None; + _gameGridSortColumnIndex = 0; + _gameGridSortOrder = SortOrder.Descending; if (cf == null) return; @@ -609,14 +606,14 @@ namespace ROMVault2 RomGrid.Rows.Clear(); // clear sorting - GameGrid.Columns[GameGridSortColumnIndex].HeaderCell.SortGlyphDirection = SortOrder.None; - GameGridSortColumnIndex = 0; - GameGridSortOrder = SortOrder.Descending; + GameGrid.Columns[_gameGridSortColumnIndex].HeaderCell.SortGlyphDirection = SortOrder.None; + _gameGridSortColumnIndex = 0; + _gameGridSortOrder = SortOrder.Descending; ReportStatus tDirStat; - GameGridColumnXPositions = new int[(int)RepStatus.EndValue]; + _gameGridColumnXPositions = new int[(int)RepStatus.EndValue]; int rowCount = 0; for (int j = 0; j < tDir.ChildCount; j++) @@ -653,8 +650,8 @@ namespace ROMVault2 if (tDirStat.Get(RepairStatus.DisplayOrder[l]) <= 0) continue; int len = DigitLength(tDirStat.Get(RepairStatus.DisplayOrder[l])) * 7 + 26; - if (len > GameGridColumnXPositions[columnIndex]) - GameGridColumnXPositions[columnIndex] = len; + if (len > _gameGridColumnXPositions[columnIndex]) + _gameGridColumnXPositions[columnIndex] = len; columnIndex++; } } @@ -663,8 +660,8 @@ namespace ROMVault2 int t = 0; for (int l = 0; l < (int)RepStatus.EndValue; l++) { - int colWidth = GameGridColumnXPositions[l]; - GameGridColumnXPositions[l] = t; + int colWidth = _gameGridColumnXPositions[l]; + _gameGridColumnXPositions[l] = t; t += colWidth; } @@ -738,14 +735,14 @@ namespace ROMVault2 } } - private void GameGrid_CellFormatting(object sender, System.Windows.Forms.DataGridViewCellFormattingEventArgs e) + private void GameGrid_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { if (_updatingGameGrid) return; Rectangle cellBounds = GameGrid.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, false); - RvDir tRvDir = (ROMVault2.RvDB.RvDir)GameGrid.Rows[e.RowIndex].Tag; + RvDir tRvDir = (RvDir)GameGrid.Rows[e.RowIndex].Tag; ReportStatus tDirStat = tRvDir.DirStatus; Color bgCol = Color.FromArgb(255, 255, 255); @@ -834,7 +831,7 @@ namespace ROMVault2 if (tRvDir.DirStatus.Get(RepairStatus.DisplayOrder[l]) <= 0) continue; - gOff = FrmMain.GameGridColumnXPositions[columnIndex]; + gOff = _gameGridColumnXPositions[columnIndex]; Bitmap bm = rvImages.GetBitmap(@"G_" + RepairStatus.DisplayOrder[l]); if (bm != null) { @@ -855,7 +852,7 @@ namespace ROMVault2 if (tRvDir.DirStatus.Get(RepairStatus.DisplayOrder[l]) > 0) { - gOff = FrmMain.GameGridColumnXPositions[columnIndex]; + gOff = _gameGridColumnXPositions[columnIndex]; g.DrawString(tRvDir.DirStatus.Get(RepairStatus.DisplayOrder[l]).ToString(CultureInfo.InvariantCulture), drawFont, drawBrushBlack, new PointF(gOff + 20, 3)); columnIndex++; } @@ -876,37 +873,34 @@ namespace ROMVault2 return; DataGridViewColumn newColumn = GameGrid.Columns[e.ColumnIndex]; - DataGridViewColumn oldColumn = GameGrid.Columns[GameGridSortColumnIndex]; + DataGridViewColumn oldColumn = GameGrid.Columns[_gameGridSortColumnIndex]; if (newColumn == oldColumn) { - if (GameGridSortOrder == SortOrder.Ascending) - GameGridSortOrder = SortOrder.Descending; - else - GameGridSortOrder = SortOrder.Ascending; + _gameGridSortOrder = _gameGridSortOrder == SortOrder.Ascending ? SortOrder.Descending : SortOrder.Ascending; } else { oldColumn.HeaderCell.SortGlyphDirection = SortOrder.None; - GameGridSortOrder = SortOrder.Ascending; + _gameGridSortOrder = SortOrder.Ascending; } - GameGrid.Sort(new GameGridRowComparer(GameGridSortOrder, e.ColumnIndex)); - newColumn.HeaderCell.SortGlyphDirection = GameGridSortOrder; - GameGridSortColumnIndex = e.ColumnIndex; + GameGrid.Sort(new GameGridRowComparer(_gameGridSortOrder, e.ColumnIndex)); + newColumn.HeaderCell.SortGlyphDirection = _gameGridSortOrder; + _gameGridSortColumnIndex = e.ColumnIndex; } private class GameGridRowComparer : System.Collections.IComparer { - private int sortMod = 1; - private int columnIndex; + private readonly int _sortMod = 1; + private readonly int _columnIndex; public GameGridRowComparer(SortOrder sortOrder, int index) { - columnIndex = index; + _columnIndex = index; if (sortOrder == SortOrder.Descending) - sortMod = -1; + _sortMod = -1; } public int Compare(object a, object b) @@ -914,14 +908,14 @@ namespace ROMVault2 DataGridViewRow aRow = (DataGridViewRow)a; DataGridViewRow bRow = (DataGridViewRow)b; - RvDir aRvDir = (ROMVault2.RvDB.RvDir)aRow.Tag; - RvDir bRvDir = (ROMVault2.RvDB.RvDir)bRow.Tag; + RvDir aRvDir = (RvDir)aRow.Tag; + RvDir bRvDir = (RvDir)bRow.Tag; int result = 0; - switch (columnIndex) + switch (_columnIndex) { case 1: // CGame - result = System.String.Compare(aRvDir.Name, bRvDir.Name); + result = String.CompareOrdinal(aRvDir.Name, bRvDir.Name); break; case 2: // CDescription String aDes = ""; @@ -931,18 +925,18 @@ namespace ROMVault2 if (bRvDir.Game != null) bDes = bRvDir.Game.GetData(RvGame.GameData.Description); - result = System.String.Compare(aDes, bDes); + result = String.CompareOrdinal(aDes, bDes); // if desciptions match, fall through to sorting by name if (result == 0) - result = System.String.Compare(aRvDir.Name, bRvDir.Name); + result = String.CompareOrdinal(aRvDir.Name, bRvDir.Name); break; default: - Console.WriteLine("WARN: GameGridRowComparer::Compare() Invalid columnIndex: {0}", columnIndex); + Console.WriteLine("WARN: GameGridRowComparer::Compare() Invalid columnIndex: {0}", _columnIndex); break; } - return sortMod * result; + return _sortMod * result; } } #endregion @@ -969,7 +963,7 @@ namespace ROMVault2 private void gbSetInfo_Resize(object sender, EventArgs e) { - int leftPos = 84; + const int leftPos = 84; int rightPos = gbSetInfo.Width - 15; if (rightPos > 750) rightPos = 750; int width = rightPos - leftPos; @@ -999,14 +993,14 @@ namespace ROMVault2 lblSITDeveloper.Width = width; int width3 = (int)((double)width * 0.24); - int P2 = (int)((double)width * 0.38); + int p2 = (int)((double)width * 0.38); int width4 = (int) ((double) width*0.24); lblSITEdition.Width = width3; - lblSIVersion.Left = leftPos + P2 - 78; - lblSITVersion.Left = leftPos + P2; + lblSIVersion.Left = leftPos + p2 - 78; + lblSITVersion.Left = leftPos + p2; lblSITVersion.Width = width3; lblSIType.Left = leftPos + width - width3 - 78; @@ -1016,8 +1010,8 @@ namespace ROMVault2 lblSITMedia.Width = width3; - lblSILanguage.Left = leftPos + P2 - 78; - lblSITLanguage.Left = leftPos + P2; + lblSILanguage.Left = leftPos + p2 - 78; + lblSITLanguage.Left = leftPos + p2; lblSITLanguage.Width = width3; lblSIPlayers.Left = leftPos + width - width3 - 78; @@ -1026,8 +1020,8 @@ namespace ROMVault2 lblSITRatings.Width = width3; - lblSIGenre.Left = leftPos + P2 - 78; - lblSITGenre.Left = leftPos + P2; + lblSIGenre.Left = leftPos + p2 - 78; + lblSITGenre.Left = leftPos + p2; lblSITGenre.Width = width3; lblSIPeripheral.Left = leftPos + width - width3 - 78; @@ -1387,14 +1381,14 @@ namespace ROMVault2 } } - private void RomGrid_CellFormatting(object sender, System.Windows.Forms.DataGridViewCellFormattingEventArgs e) + private void RomGrid_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { if (_updatingGameGrid) return; Rectangle cellBounds = RomGrid.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, false); - RvFile tRvFile = (ROMVault2.RvDB.RvFile)RomGrid.Rows[e.RowIndex].Tag; + RvFile tRvFile = (RvFile)RomGrid.Rows[e.RowIndex].Tag; if (cellBounds.Width == 0 || cellBounds.Height == 0) return; @@ -1516,27 +1510,26 @@ namespace ROMVault2 private void GameGrid_MouseUp(object sender, MouseEventArgs e) { - if (e.Button == MouseButtons.Right) - { - int currentMouseOverRow = GameGrid.HitTest(e.X, e.Y).RowIndex; - if (currentMouseOverRow >= 0) - { - object r1 = GameGrid.Rows[currentMouseOverRow].Cells[1].Value; - string filename = r1 != null ? r1.ToString() : ""; - object r2 = GameGrid.Rows[currentMouseOverRow].Cells[2].Value; - string description = r2 != null ? r2.ToString() : ""; + if (e.Button != MouseButtons.Right) + return; - try - { - Clipboard.Clear(); - Clipboard.SetText("Name : " + filename + Environment.NewLine + "Desc : " + description + Environment.NewLine); - } - catch - { - } + int currentMouseOverRow = GameGrid.HitTest(e.X, e.Y).RowIndex; + if (currentMouseOverRow >= 0) + { + object r1 = GameGrid.Rows[currentMouseOverRow].Cells[1].Value; + string filename = r1 != null ? r1.ToString() : ""; + object r2 = GameGrid.Rows[currentMouseOverRow].Cells[2].Value; + string description = r2 != null ? r2.ToString() : ""; + + try + { + Clipboard.Clear(); + Clipboard.SetText("Name : " + filename + Environment.NewLine + "Desc : " + description + Environment.NewLine); + } + catch + { } } - } } diff --git a/ROMVault2/Program.cs b/ROMVault2/Program.cs index 0d014aa..98403f1 100644 --- a/ROMVault2/Program.cs +++ b/ROMVault2/Program.cs @@ -15,7 +15,7 @@ namespace ROMVault2 //public static UsernamePassword Up; public static readonly Encoding Enc = Encoding.GetEncoding(28591); public const string Version = "2.2"; - public const int SubVersion = 0; + public const int SubVersion = 1; public static string ErrorMessage; public static string URL; diff --git a/ROMVault2/ROMVault2.csproj b/ROMVault2/ROMVault2.csproj index 5eaf3ba..d08bdeb 100644 --- a/ROMVault2/ROMVault2.csproj +++ b/ROMVault2/ROMVault2.csproj @@ -9,7 +9,7 @@ WinExe Properties ROMVault2 - ROMVault21 + ROMVault22 v3.5 From 32f67308fab015ccc6900bf5e5e9d6d24bc9f1e2 Mon Sep 17 00:00:00 2001 From: gjefferyes Date: Wed, 10 Jun 2015 09:45:03 -0500 Subject: [PATCH 27/28] fixed loading the mame 0.162 dat's using the 'machine' xml node. --- ROMVault2/DatReaders/DatXMLReader.cs | 35 ++++++++++++++-------------- ROMVault2/Program.cs | 2 +- ROMVault2/ROMVault2.csproj | 2 +- 3 files changed, 20 insertions(+), 19 deletions(-) diff --git a/ROMVault2/DatReaders/DatXMLReader.cs b/ROMVault2/DatReaders/DatXMLReader.cs index d421215..5371896 100644 --- a/ROMVault2/DatReaders/DatXMLReader.cs +++ b/ROMVault2/DatReaders/DatXMLReader.cs @@ -28,20 +28,16 @@ namespace ROMVault2.DatReaders XmlNodeList dirNodeList = doc.DocumentElement.SelectNodes("dir"); if (dirNodeList != null) { - for (int i = 0; i < dirNodeList.Count; i++) - { - LoadDirFromDat(ref tDat, dirNodeList[i], thisFileType); - } + foreach (XmlNode dirNode in dirNodeList) + LoadDirFromDat(ref tDat, dirNode, thisFileType); } XmlNodeList gameNodeList = doc.DocumentElement.SelectNodes("game"); if (gameNodeList != null) { - for (int i = 0; i < gameNodeList.Count; i++) - { - LoadGameFromDat(ref tDat, gameNodeList[i], thisFileType); - } + foreach (XmlNode gameNode in gameNodeList) + LoadGameFromDat(ref tDat, gameNode, thisFileType); } return true; @@ -60,22 +56,27 @@ namespace ROMVault2.DatReaders XmlNodeList dirNodeList = doc.DocumentElement.SelectNodes("dir"); if (dirNodeList != null) { - for (int i = 0; i < dirNodeList.Count; i++) - { - LoadDirFromDat(ref tDat, dirNodeList[i], thisFileType); - } + foreach (XmlNode dirNode in dirNodeList) + LoadDirFromDat(ref tDat, dirNode, thisFileType); } XmlNodeList gameNodeList = doc.DocumentElement.SelectNodes("game"); if (gameNodeList != null) { - for (int i = 0; i < gameNodeList.Count; i++) - { - LoadGameFromDat(ref tDat, gameNodeList[i], thisFileType); - } + foreach (XmlNode gameNode in gameNodeList) + LoadGameFromDat(ref tDat, gameNode, thisFileType); } + XmlNodeList machineNodeList = doc.DocumentElement.SelectNodes("machine"); + + if (machineNodeList != null) + { + foreach (XmlNode machineNode in machineNodeList) + LoadGameFromDat(ref tDat, machineNode, thisFileType); + } + + return true; } @@ -149,7 +150,7 @@ namespace ROMVault2.DatReaders } val = VarFix.String(packingNode.Attributes.GetNamedItem("dir")).ToLower(); // noautodir , nogame if (!String.IsNullOrEmpty(val)) - tDat.AddData(RvDat.DatData.DirSetup,val); + tDat.AddData(RvDat.DatData.DirSetup, val); } } diff --git a/ROMVault2/Program.cs b/ROMVault2/Program.cs index 98403f1..e91778d 100644 --- a/ROMVault2/Program.cs +++ b/ROMVault2/Program.cs @@ -15,7 +15,7 @@ namespace ROMVault2 //public static UsernamePassword Up; public static readonly Encoding Enc = Encoding.GetEncoding(28591); public const string Version = "2.2"; - public const int SubVersion = 1; + public const int SubVersion = 2; public static string ErrorMessage; public static string URL; diff --git a/ROMVault2/ROMVault2.csproj b/ROMVault2/ROMVault2.csproj index d08bdeb..08f50fc 100644 --- a/ROMVault2/ROMVault2.csproj +++ b/ROMVault2/ROMVault2.csproj @@ -35,7 +35,7 @@ true full false - Stage\ + ..\..\Stage\ TRACE;DEBUG;UNMANAGED;COMPRESS;LZMA_STREAM;DOTNET20 prompt 4 From c04bb9d0705c2882feb5129e263ecd32f287ad2d Mon Sep 17 00:00:00 2001 From: gjefferyes Date: Thu, 11 Jun 2015 10:12:36 -0500 Subject: [PATCH 28/28] Fixed a baddump merging issue (Thanks to Marco for the details to fix this.) --- ROMVault2/DatReaders/DatReader.cs | 12 ++++++++++-- ROMVault2/Program.cs | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/ROMVault2/DatReaders/DatReader.cs b/ROMVault2/DatReaders/DatReader.cs index 7e11135..8f620b9 100644 --- a/ROMVault2/DatReaders/DatReader.cs +++ b/ROMVault2/DatReaders/DatReader.cs @@ -270,6 +270,10 @@ namespace ROMVault2.DatReaders // loop the ROMs in the parent sets for (int r1 = 0; r1 < romofGame.ChildCount; r1++) { + // don't search fixes for files marked as nodump + if (((RvFile)mGame.Child(r)).Status == "nodump" || ((RvFile)romofGame.Child(r1)).Status == "nodump") + continue; + // only find fixes if the Name and the Size of the ROMs are the same if (mGame.Child(r).Name != romofGame.Child(r1).Name || ((RvFile)mGame.Child(r)).Size != ((RvFile)romofGame.Child(r1)).Size) continue; @@ -285,11 +289,13 @@ namespace ROMVault2.DatReaders if (b1) { ((RvFile)mGame.Child(r)).CRC = ((RvFile)romofGame.Child(r1)).CRC; + ((RvFile)mGame.Child(r)).FileStatusSet(FileStatus.CRCFromDAT); ((RvFile)mGame.Child(r)).Status = "(CRCFound)"; } else { ((RvFile)romofGame.Child(r1)).CRC = ((RvFile)mGame.Child(r)).CRC; + ((RvFile)romofGame.Child(r1)).FileStatusSet(FileStatus.CRCFromDAT); ((RvFile)romofGame.Child(r1)).Status = "(CRCFound)"; } @@ -428,6 +434,8 @@ namespace ROMVault2.DatReaders byte[] chdMD51 = ((RvFile)romofGame.Child(r1)).MD5CHD; if (chdMD50 != null && chdMD51 != null && !ArrByte.bCompare(chdMD50, chdMD51)) continue; + // don't merge if only one of the ROM is nodump + if ((((RvFile)romofGame.Child(r1)).Status == "nodump") != (((RvFile)mGame.Child(r)).Status == "nodump")) continue; found = true; break; @@ -446,9 +454,9 @@ namespace ROMVault2.DatReaders return; string parentName = searchGame.Game.GetData(RvGame.GameData.RomOf); - if (String.IsNullOrEmpty(parentName) || parentName==searchGame.Name) + if (String.IsNullOrEmpty(parentName) || parentName == searchGame.Name) parentName = searchGame.Game.GetData(RvGame.GameData.CloneOf); - if (String.IsNullOrEmpty(parentName) || parentName==searchGame.Name) + if (String.IsNullOrEmpty(parentName) || parentName == searchGame.Name) return; int intIndex; diff --git a/ROMVault2/Program.cs b/ROMVault2/Program.cs index e91778d..90505e3 100644 --- a/ROMVault2/Program.cs +++ b/ROMVault2/Program.cs @@ -15,7 +15,7 @@ namespace ROMVault2 //public static UsernamePassword Up; public static readonly Encoding Enc = Encoding.GetEncoding(28591); public const string Version = "2.2"; - public const int SubVersion = 2; + public const int SubVersion = 3; public static string ErrorMessage; public static string URL;