diff --git a/DiscImageChef.Core/PluginBase.cs b/DiscImageChef.Core/PluginBase.cs index 1abb0ec0..7af0fcc2 100644 --- a/DiscImageChef.Core/PluginBase.cs +++ b/DiscImageChef.Core/PluginBase.cs @@ -65,7 +65,7 @@ namespace DiscImageChef.Core { if(!type.IsSubclassOf(typeof(ImagePlugin))) continue; - ImagePlugin plugin = (ImagePlugin)type.GetConstructor(Type.EmptyTypes).Invoke(new object[] { }); + ImagePlugin plugin = (ImagePlugin)type.GetConstructor(Type.EmptyTypes)?.Invoke(new object[] { }); RegisterImagePlugin(plugin); } catch(Exception exception) { DicConsole.ErrorWriteLine("Exception {0}", exception); } @@ -77,7 +77,7 @@ namespace DiscImageChef.Core { if(!type.IsSubclassOf(typeof(PartitionPlugin))) continue; - PartitionPlugin plugin = (PartitionPlugin)type.GetConstructor(Type.EmptyTypes).Invoke(new object[] { }); + PartitionPlugin plugin = (PartitionPlugin)type.GetConstructor(Type.EmptyTypes)?.Invoke(new object[] { }); RegisterPartPlugin(plugin); } catch(Exception exception) { DicConsole.ErrorWriteLine("Exception {0}", exception); } @@ -91,9 +91,8 @@ namespace DiscImageChef.Core Filesystem plugin; if(encoding != null) - plugin = (Filesystem)type.GetConstructor(new[] {encoding.GetType()}) - .Invoke(new object[] {encoding}); - else plugin = (Filesystem)type.GetConstructor(Type.EmptyTypes).Invoke(new object[] { }); + plugin = (Filesystem)type.GetConstructor(new[] {encoding.GetType()})?.Invoke(new object[] {encoding}); + else plugin = (Filesystem)type.GetConstructor(Type.EmptyTypes)?.Invoke(new object[] { }); RegisterPlugin(plugin); } catch(Exception exception) { DicConsole.ErrorWriteLine("Exception {0}", exception); } diff --git a/DiscImageChef.Devices/Windows/UsbFunctions.cs b/DiscImageChef.Devices/Windows/UsbFunctions.cs index 5db7dc26..cc74b10f 100644 --- a/DiscImageChef.Devices/Windows/UsbFunctions.cs +++ b/DiscImageChef.Devices/Windows/UsbFunctions.cs @@ -259,7 +259,7 @@ namespace DiscImageChef.Devices.Windows } // Did we find an InterfaceID of a USB device? - if(instanceId.StartsWith("USB\\")) foundDevice = FindDeviceByInstanceId(instanceId); + if(instanceId?.StartsWith("USB\\", StringComparison.Ordinal) == true) foundDevice = FindDeviceByInstanceId(instanceId); return foundDevice; } diff --git a/DiscImageChef.DiscImages/AppleDOS.cs b/DiscImageChef.DiscImages/AppleDOS.cs index d36d7916..c46c0c01 100644 --- a/DiscImageChef.DiscImages/AppleDOS.cs +++ b/DiscImageChef.DiscImages/AppleDOS.cs @@ -77,7 +77,7 @@ namespace DiscImageChef.DiscImages public override bool IdentifyImage(Filter imageFilter) { - extension = Path.GetExtension(imageFilter.GetFilename()).ToLower(); + extension = Path.GetExtension(imageFilter.GetFilename())?.ToLower(); if(imageFilter.GetDataForkLength() == 143360 && (extension == ".po" || extension == ".do")) return true; @@ -97,7 +97,7 @@ namespace DiscImageChef.DiscImages deinterleaved = new byte[tmp.Length]; - extension = Path.GetExtension(imageFilter.GetFilename()).ToLower(); + extension = Path.GetExtension(imageFilter.GetFilename())?.ToLower(); int[] offsets; diff --git a/DiscImageChef.DiscImages/ZZZRawImage.cs b/DiscImageChef.DiscImages/ZZZRawImage.cs index c1c03ef3..587a1d7b 100644 --- a/DiscImageChef.DiscImages/ZZZRawImage.cs +++ b/DiscImageChef.DiscImages/ZZZRawImage.cs @@ -80,7 +80,7 @@ namespace DiscImageChef.DiscImages // Check if file is not multiple of 512 if(imageFilter.GetDataForkLength() % 512 == 0) return true; - extension = Path.GetExtension(imageFilter.GetFilename()).ToLower(); + extension = Path.GetExtension(imageFilter.GetFilename())?.ToLower(); if(extension == ".hdf" && ImageInfo.ImageSize % 256 == 0) return true; @@ -119,7 +119,7 @@ namespace DiscImageChef.DiscImages Stream stream = imageFilter.GetDataForkStream(); stream.Seek(0, SeekOrigin.Begin); - extension = Path.GetExtension(imageFilter.GetFilename()).ToLower(); + extension = Path.GetExtension(imageFilter.GetFilename())?.ToLower(); switch(extension) { case ".iso" when imageFilter.GetDataForkLength() % 2048 == 0: ImageInfo.SectorSize = 2048; break; diff --git a/DiscImageChef.Filters/Filters.cs b/DiscImageChef.Filters/Filters.cs index 87270b90..44cf5f8f 100644 --- a/DiscImageChef.Filters/Filters.cs +++ b/DiscImageChef.Filters/Filters.cs @@ -51,8 +51,8 @@ namespace DiscImageChef.Filters { if(!type.IsSubclassOf(typeof(Filter))) continue; - Filter filter = (Filter)type.GetConstructor(Type.EmptyTypes).Invoke(new object[] { }); - if(!filtersList.ContainsKey(filter.Name.ToLower())) filtersList.Add(filter.Name.ToLower(), filter); + Filter filter = (Filter)type.GetConstructor(Type.EmptyTypes)?.Invoke(new object[] { }); + if(filter != null && !filtersList.ContainsKey(filter.Name.ToLower())) filtersList.Add(filter.Name.ToLower(), filter); } catch(Exception exception) { DicConsole.ErrorWriteLine("Exception {0}", exception); } } @@ -67,18 +67,17 @@ namespace DiscImageChef.Filters if(!filter.Identify(path)) continue; Filter foundFilter = - (Filter)filter.GetType().GetConstructor(Type.EmptyTypes).Invoke(new object[] { }); - foundFilter.Open(path); + (Filter)filter.GetType().GetConstructor(Type.EmptyTypes)?.Invoke(new object[] { }); - if(foundFilter.IsOpened()) return foundFilter; + foundFilter?.Open(path); + + if(foundFilter?.IsOpened() == true) return foundFilter; } else noFilter = filter; - if(!noFilter.Identify(path)) return noFilter; + if(!noFilter?.Identify(path) == true) return noFilter; - noFilter.Open(path); - - if(noFilter.IsOpened()) return noFilter; + noFilter?.Open(path); return noFilter; } diff --git a/DiscImageChef.Interop/DetectOS.cs b/DiscImageChef.Interop/DetectOS.cs index f495dcab..0f5621e3 100644 --- a/DiscImageChef.Interop/DetectOS.cs +++ b/DiscImageChef.Interop/DetectOS.cs @@ -131,9 +131,9 @@ namespace DiscImageChef.Interop Marshal.FreeHGlobal(pStr); Marshal.FreeHGlobal(pLen); - if(machine.StartsWith("iPad", StringComparison.Ordinal) || - machine.StartsWith("iPod", StringComparison.Ordinal) || - machine.StartsWith("iPhone", StringComparison.Ordinal)) return PlatformID.iOS; + if(machine != null && (machine.StartsWith("iPad", StringComparison.Ordinal) || + machine.StartsWith("iPod", StringComparison.Ordinal) || + machine.StartsWith("iPhone", StringComparison.Ordinal))) return PlatformID.iOS; return PlatformID.MacOSX; } diff --git a/DiscImageChef.Server/ViewReport.aspx.cs b/DiscImageChef.Server/ViewReport.aspx.cs index 832c4585..3ce74156 100644 --- a/DiscImageChef.Server/ViewReport.aspx.cs +++ b/DiscImageChef.Server/ViewReport.aspx.cs @@ -579,6 +579,8 @@ namespace DiscImageChef.Server { _line = tocStream.ReadLine(); + if(_line == null) break; + if(_line.Length == 0 || _line[0] == '#') continue; if(inManufacturer) diff --git a/DiscImageChef.Settings/Settings.cs b/DiscImageChef.Settings/Settings.cs index a5b2ff7a..9ba2d2c4 100644 --- a/DiscImageChef.Settings/Settings.cs +++ b/DiscImageChef.Settings/Settings.cs @@ -242,7 +242,7 @@ namespace DiscImageChef.Settings case PlatformID.WinCE: case PlatformID.WindowsPhone: { - RegistryKey parentKey = Registry.CurrentUser.OpenSubKey("SOFTWARE").OpenSubKey("Claunia.com"); + RegistryKey parentKey = Registry.CurrentUser.OpenSubKey("SOFTWARE")?.OpenSubKey("Claunia.com"); if(parentKey == null) { SetDefaultSettings(); @@ -358,40 +358,43 @@ namespace DiscImageChef.Settings case PlatformID.WindowsPhone: { RegistryKey parentKey = - Registry.CurrentUser.OpenSubKey("SOFTWARE", true).CreateSubKey("Claunia.com"); - RegistryKey key = parentKey.CreateSubKey("DiscImageChef"); + Registry.CurrentUser.OpenSubKey("SOFTWARE", true)?.CreateSubKey("Claunia.com"); + RegistryKey key = parentKey?.CreateSubKey("DiscImageChef"); - key.SetValue("SaveReportsGlobally", Current.SaveReportsGlobally); - key.SetValue("ShareReports", Current.ShareReports); + if(key != null) + { + key.SetValue("SaveReportsGlobally", Current.SaveReportsGlobally); + key.SetValue("ShareReports", Current.ShareReports); - if(Current.Stats != null) - { - key.SetValue("Statistics", true); - key.SetValue("ShareStats", Current.Stats.ShareStats); - key.SetValue("BenchmarkStats", Current.Stats.BenchmarkStats); - key.SetValue("CommandStats", Current.Stats.CommandStats); - key.SetValue("DeviceStats", Current.Stats.DeviceStats); - key.SetValue("FilesystemStats", Current.Stats.FilesystemStats); - key.SetValue("FilterStats", Current.Stats.FilterStats); - key.SetValue("MediaImageStats", Current.Stats.MediaImageStats); - key.SetValue("MediaScanStats", Current.Stats.MediaScanStats); - key.SetValue("PartitionStats", Current.Stats.PartitionStats); - key.SetValue("MediaStats", Current.Stats.MediaStats); - key.SetValue("VerifyStats", Current.Stats.VerifyStats); - } - else - { - key.SetValue("Statistics", true); - key.DeleteValue("ShareStats", false); - key.DeleteValue("BenchmarkStats", false); - key.DeleteValue("CommandStats", false); - key.DeleteValue("DeviceStats", false); - key.DeleteValue("FilesystemStats", false); - key.DeleteValue("MediaImageStats", false); - key.DeleteValue("MediaScanStats", false); - key.DeleteValue("PartitionStats", false); - key.DeleteValue("MediaStats", false); - key.DeleteValue("VerifyStats", false); + if(Current.Stats != null) + { + key.SetValue("Statistics", true); + key.SetValue("ShareStats", Current.Stats.ShareStats); + key.SetValue("BenchmarkStats", Current.Stats.BenchmarkStats); + key.SetValue("CommandStats", Current.Stats.CommandStats); + key.SetValue("DeviceStats", Current.Stats.DeviceStats); + key.SetValue("FilesystemStats", Current.Stats.FilesystemStats); + key.SetValue("FilterStats", Current.Stats.FilterStats); + key.SetValue("MediaImageStats", Current.Stats.MediaImageStats); + key.SetValue("MediaScanStats", Current.Stats.MediaScanStats); + key.SetValue("PartitionStats", Current.Stats.PartitionStats); + key.SetValue("MediaStats", Current.Stats.MediaStats); + key.SetValue("VerifyStats", Current.Stats.VerifyStats); + } + else + { + key.SetValue("Statistics", true); + key.DeleteValue("ShareStats", false); + key.DeleteValue("BenchmarkStats", false); + key.DeleteValue("CommandStats", false); + key.DeleteValue("DeviceStats", false); + key.DeleteValue("FilesystemStats", false); + key.DeleteValue("MediaImageStats", false); + key.DeleteValue("MediaScanStats", false); + key.DeleteValue("PartitionStats", false); + key.DeleteValue("MediaStats", false); + key.DeleteValue("VerifyStats", false); + } } } break; diff --git a/DiscImageChef/Commands/Analyze.cs b/DiscImageChef/Commands/Analyze.cs index 3f287068..3631d27e 100644 --- a/DiscImageChef/Commands/Analyze.cs +++ b/DiscImageChef/Commands/Analyze.cs @@ -183,10 +183,13 @@ namespace DiscImageChef.Commands else { plugins.PluginsList.TryGetValue(idPlugins[0], out plugin); - DicConsole.WriteLine(string.Format("Identified by {0}.", plugin.Name)); - plugin.GetInformation(imageFormat, partitions[i], out information); - DicConsole.Write(information); - Core.Statistics.AddFilesystem(plugin.XmlFSType.Type); + if(plugin != null) + { + DicConsole.WriteLine(string.Format("Identified by {0}.", plugin.Name)); + plugin.GetInformation(imageFormat, partitions[i], out information); + DicConsole.Write(information); + Core.Statistics.AddFilesystem(plugin.XmlFSType.Type); + } } } } @@ -219,10 +222,13 @@ namespace DiscImageChef.Commands else { plugins.PluginsList.TryGetValue(idPlugins[0], out plugin); - DicConsole.WriteLine(string.Format("Identified by {0}.", plugin.Name)); - plugin.GetInformation(imageFormat, wholePart, out information); - DicConsole.Write(information); - Core.Statistics.AddFilesystem(plugin.XmlFSType.Type); + if(plugin != null) + { + DicConsole.WriteLine(string.Format("Identified by {0}.", plugin.Name)); + plugin.GetInformation(imageFormat, wholePart, out information); + DicConsole.Write(information); + Core.Statistics.AddFilesystem(plugin.XmlFSType.Type); + } } } } diff --git a/DiscImageChef/Commands/Checksum.cs b/DiscImageChef/Commands/Checksum.cs index 2ccf3564..8625f159 100644 --- a/DiscImageChef/Commands/Checksum.cs +++ b/DiscImageChef/Commands/Checksum.cs @@ -120,7 +120,7 @@ namespace DiscImageChef.Commands byte[] hiddenSector = inputFormat.ReadSector(i); - mediaChecksum.Update(hiddenSector); + mediaChecksum?.Update(hiddenSector); } DicConsole.DebugWriteLine("Checksum command", @@ -155,17 +155,19 @@ namespace DiscImageChef.Commands doneSectors += sectors - doneSectors; } - if(options.WholeDisc) mediaChecksum.Update(sector); + if(options.WholeDisc) + mediaChecksum?.Update(sector); - if(options.SeparatedTracks) trackChecksum.Update(sector); + if(options.SeparatedTracks) trackChecksum?.Update(sector); } DicConsole.WriteLine(); if(options.SeparatedTracks) - foreach(ChecksumType chk in trackChecksum.End()) - DicConsole.WriteLine("Track {0}'s {1}: {2}", currentTrack.TrackSequence, chk.type, - chk.Value); + if(trackChecksum != null) + foreach(ChecksumType chk in trackChecksum.End()) + DicConsole.WriteLine("Track {0}'s {1}: {2}", currentTrack.TrackSequence, chk.type, + chk.Value); previousTrackEnd = currentTrack.TrackEndSector; } @@ -176,12 +178,13 @@ namespace DiscImageChef.Commands DicConsole.Write("\rHashing track-less sector {0}", i); byte[] hiddenSector = inputFormat.ReadSector(i); - mediaChecksum.Update(hiddenSector); + mediaChecksum?.Update(hiddenSector); } if(options.WholeDisc) - foreach(ChecksumType chk in mediaChecksum.End()) - DicConsole.WriteLine("Disk's {0}: {1}", chk.type, chk.Value); + if(mediaChecksum != null) + foreach(ChecksumType chk in mediaChecksum.End()) + DicConsole.WriteLine("Disk's {0}: {1}", chk.type, chk.Value); } catch(Exception ex) { diff --git a/DiscImageChef/Commands/Ls.cs b/DiscImageChef/Commands/Ls.cs index ec063923..67df2ae8 100644 --- a/DiscImageChef/Commands/Ls.cs +++ b/DiscImageChef/Commands/Ls.cs @@ -152,14 +152,18 @@ namespace DiscImageChef.Commands .GetType().GetConstructor(new[] { typeof(ImagePlugin), typeof(Partition), typeof(Encoding) - }).Invoke(new object[] {imageFormat, partitions[i], null}); + }) + ?.Invoke(new object[] {imageFormat, partitions[i], null}); + + if(fs == null) continue; error = fs.Mount(options.Debug); if(error == Errno.NoError) { List rootDir = new List(); error = fs.ReadDir("/", ref rootDir); - if(error == Errno.NoError) foreach(string entry in rootDir) DicConsole.WriteLine("{0}", entry); + if(error == Errno.NoError) + foreach(string entry in rootDir) DicConsole.WriteLine("{0}", entry); else DicConsole.ErrorWriteLine("Error {0} reading root directory {0}", error.ToString()); @@ -179,15 +183,20 @@ namespace DiscImageChef.Commands .GetType().GetConstructor(new[] { typeof(ImagePlugin), typeof(Partition), typeof(Encoding) - }).Invoke(new object[] {imageFormat, partitions[i], null}); + }) + ?.Invoke(new object[] {imageFormat, partitions[i], null}); + if(fs == null) continue; + error = fs.Mount(options.Debug); if(error == Errno.NoError) { List rootDir = new List(); error = fs.ReadDir("/", ref rootDir); - if(error == Errno.NoError) foreach(string entry in rootDir) DicConsole.WriteLine("{0}", entry); + if(error == Errno.NoError) + foreach(string entry in rootDir) DicConsole.WriteLine("{0}", entry); else - DicConsole.ErrorWriteLine("Error {0} reading root directory {0}", error.ToString()); + DicConsole.ErrorWriteLine("Error {0} reading root directory {0}", + error.ToString()); Core.Statistics.AddFilesystem(fs.XmlFSType.Type); } @@ -217,15 +226,20 @@ namespace DiscImageChef.Commands .GetType().GetConstructor(new[] { typeof(ImagePlugin), typeof(Partition), typeof(Encoding) - }).Invoke(new object[] {imageFormat, wholePart, null}); + }) + ?.Invoke(new object[] {imageFormat, wholePart, null}); + if(fs == null) continue; + error = fs.Mount(options.Debug); if(error == Errno.NoError) { List rootDir = new List(); error = fs.ReadDir("/", ref rootDir); - if(error == Errno.NoError) foreach(string entry in rootDir) DicConsole.WriteLine("{0}", entry); + if(error == Errno.NoError) + foreach(string entry in rootDir) DicConsole.WriteLine("{0}", entry); else - DicConsole.ErrorWriteLine("Error {0} reading root directory {0}", error.ToString()); + DicConsole.ErrorWriteLine("Error {0} reading root directory {0}", + error.ToString()); Core.Statistics.AddFilesystem(fs.XmlFSType.Type); } @@ -235,48 +249,50 @@ namespace DiscImageChef.Commands else { plugins.PluginsList.TryGetValue(idPlugins[0], out plugin); - DicConsole.WriteLine(string.Format("Identified by {0}.", plugin.Name)); - Filesystem fs = (Filesystem)plugin - .GetType().GetConstructor(new[] - { - typeof(ImagePlugin), typeof(Partition), typeof(Encoding) - }).Invoke(new object[] {imageFormat, wholePart, null}); - error = fs.Mount(options.Debug); - if(error == Errno.NoError) + if(plugin != null) { - List rootDir = new List(); - error = fs.ReadDir("/", ref rootDir); + DicConsole.WriteLine(string.Format("Identified by {0}.", plugin.Name)); + Filesystem fs = (Filesystem)plugin + .GetType().GetConstructor(new[] {typeof(ImagePlugin), typeof(Partition), typeof(Encoding)}) + ?.Invoke(new object[] {imageFormat, wholePart, null}); + error = fs.Mount(options.Debug); if(error == Errno.NoError) - foreach(string entry in rootDir) - if(options.Long) - { - FileEntryInfo stat = new FileEntryInfo(); - List xattrs = new List(); - - error = fs.Stat(entry, ref stat); - if(error == Errno.NoError) + { + List rootDir = new List(); + error = fs.ReadDir("/", ref rootDir); + if(error == Errno.NoError) + foreach(string entry in rootDir) + if(options.Long) { - DicConsole.WriteLine("{0}\t{1}\t{2} bytes\t{3}", stat.CreationTimeUtc, - stat.Inode, stat.Length, entry); + FileEntryInfo stat = new FileEntryInfo(); + List xattrs = new List(); - error = fs.ListXAttr(entry, ref xattrs); - if(error != Errno.NoError) continue; - - foreach(string xattr in xattrs) + error = fs.Stat(entry, ref stat); + if(error == Errno.NoError) { - byte[] xattrBuf = new byte[0]; - error = fs.GetXattr(entry, xattr, ref xattrBuf); - if(error == Errno.NoError) DicConsole.WriteLine("\t\t{0}\t{1} bytes", xattr, xattrBuf.Length); + DicConsole.WriteLine("{0}\t{1}\t{2} bytes\t{3}", stat.CreationTimeUtc, + stat.Inode, stat.Length, entry); + + error = fs.ListXAttr(entry, ref xattrs); + if(error != Errno.NoError) continue; + + foreach(string xattr in xattrs) + { + byte[] xattrBuf = new byte[0]; + error = fs.GetXattr(entry, xattr, ref xattrBuf); + if(error == Errno.NoError) + DicConsole.WriteLine("\t\t{0}\t{1} bytes", xattr, xattrBuf.Length); + } } + else DicConsole.WriteLine("{0}", entry); } else DicConsole.WriteLine("{0}", entry); - } - else DicConsole.WriteLine("{0}", entry); - else DicConsole.ErrorWriteLine("Error {0} reading root directory {0}", error.ToString()); + else DicConsole.ErrorWriteLine("Error {0} reading root directory {0}", error.ToString()); - Core.Statistics.AddFilesystem(fs.XmlFSType.Type); + Core.Statistics.AddFilesystem(fs.XmlFSType.Type); + } + else DicConsole.ErrorWriteLine("Unable to mount device, error {0}", error.ToString()); } - else DicConsole.ErrorWriteLine("Unable to mount device, error {0}", error.ToString()); } } catch(Exception ex)