diff --git a/DiscImageChef.Core/Statistics.cs b/DiscImageChef.Core/Statistics.cs index 98e485740..3894b9879 100644 --- a/DiscImageChef.Core/Statistics.cs +++ b/DiscImageChef.Core/Statistics.cs @@ -33,6 +33,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Net; using System.Threading; using System.Xml.Serialization; @@ -52,10 +53,6 @@ namespace DiscImageChef.Core /// public static class Statistics { - /// - /// Contains all known statistics - /// - public static Stats AllStats; /// /// Statistics file semaphore /// @@ -70,43 +67,353 @@ namespace DiscImageChef.Core { if(File.Exists(Path.Combine(Settings.Settings.StatsPath, "Statistics.xml"))) { - AllStats = new Stats(); - ctx.OperatingSystems.Add(new OperatingSystem - { - Name = DetectOS.GetRealPlatformID().ToString(), - Synchronized = false, - Version = DetectOS.GetVersion(), - Count = 1 - }); - ctx.Versions.Add(new Version - { - Value = CommonTypes.Interop.Version.GetVersion(), - Synchronized = false, - Count = 1 - }); - XmlSerializer xs = new XmlSerializer(AllStats.GetType()); - StreamReader sr = new StreamReader(Path.Combine(Settings.Settings.StatsPath, "Statistics.xml")); - AllStats = (Stats)xs.Deserialize(sr); + Stats allStats = new Stats(); + XmlSerializer xs = new XmlSerializer(allStats.GetType()); + StreamReader sr = new StreamReader(Path.Combine(Settings.Settings.StatsPath, "Statistics.xml")); + allStats = (Stats)xs.Deserialize(sr); sr.Close(); + + if(allStats.Commands != null) + { + if(allStats.Commands.Analyze > 0) + { + Command command = ctx.Commands.FirstOrDefault(c => c.Name == "analyze" && c.Synchronized) ?? + new Command {Name = "analyze", Synchronized = true}; + + command.Count += (ulong)allStats.Commands.Analyze; + ctx.Commands.Update(command); + } + + if(allStats.Commands.Benchmark > 0) + { + Command command = ctx.Commands.FirstOrDefault(c => c.Name == "benchmark" && c.Synchronized) ?? + new Command {Name = "benchmark", Synchronized = true}; + + command.Count += (ulong)allStats.Commands.Benchmark; + ctx.Commands.Update(command); + } + + if(allStats.Commands.Checksum > 0) + { + Command command = ctx.Commands.FirstOrDefault(c => c.Name == "checksum" && c.Synchronized) ?? + new Command {Name = "checksum", Synchronized = true}; + + command.Count += (ulong)allStats.Commands.Checksum; + ctx.Commands.Update(command); + } + + if(allStats.Commands.Compare > 0) + { + Command command = ctx.Commands.FirstOrDefault(c => c.Name == "compare" && c.Synchronized) ?? + new Command {Name = "compare", Synchronized = true}; + + command.Count += (ulong)allStats.Commands.Compare; + ctx.Commands.Update(command); + } + + if(allStats.Commands.ConvertImage > 0) + { + Command command = + ctx.Commands.FirstOrDefault(c => c.Name == "convert-image" && c.Synchronized) ?? + new Command {Name = "convert-image", Synchronized = true}; + + command.Count += (ulong)allStats.Commands.ConvertImage; + ctx.Commands.Update(command); + } + + if(allStats.Commands.CreateSidecar > 0) + { + Command command = + ctx.Commands.FirstOrDefault(c => c.Name == "create-sidecar" && c.Synchronized) ?? + new Command {Name = "create-sidecar", Synchronized = true}; + + command.Count += (ulong)allStats.Commands.CreateSidecar; + ctx.Commands.Update(command); + } + + if(allStats.Commands.Decode > 0) + { + Command command = ctx.Commands.FirstOrDefault(c => c.Name == "decode" && c.Synchronized) ?? + new Command {Name = "decode", Synchronized = true}; + + command.Count += (ulong)allStats.Commands.Decode; + ctx.Commands.Update(command); + } + + if(allStats.Commands.DeviceInfo > 0) + { + Command command = ctx.Commands.FirstOrDefault(c => c.Name == "device-info" && c.Synchronized) ?? + new Command {Name = "device-info", Synchronized = true}; + + command.Count += (ulong)allStats.Commands.DeviceInfo; + ctx.Commands.Update(command); + } + + if(allStats.Commands.DeviceReport > 0) + { + Command command = + ctx.Commands.FirstOrDefault(c => c.Name == "device-report" && c.Synchronized) ?? + new Command {Name = "device-report", Synchronized = true}; + + command.Count += (ulong)allStats.Commands.DeviceReport; + ctx.Commands.Update(command); + } + + if(allStats.Commands.DumpMedia > 0) + { + Command command = ctx.Commands.FirstOrDefault(c => c.Name == "dump-media" && c.Synchronized) ?? + new Command {Name = "dump-media", Synchronized = true}; + + command.Count += (ulong)allStats.Commands.DumpMedia; + ctx.Commands.Update(command); + } + + if(allStats.Commands.Entropy > 0) + { + Command command = ctx.Commands.FirstOrDefault(c => c.Name == "entropy" && c.Synchronized) ?? + new Command {Name = "entropy", Synchronized = true}; + + command.Count += (ulong)allStats.Commands.Entropy; + ctx.Commands.Update(command); + } + + if(allStats.Commands.ExtractFiles > 0) + { + Command command = + ctx.Commands.FirstOrDefault(c => c.Name == "extract-files" && c.Synchronized) ?? + new Command {Name = "extract-files", Synchronized = true}; + + command.Count += (ulong)allStats.Commands.ExtractFiles; + ctx.Commands.Update(command); + } + + if(allStats.Commands.Formats > 0) + { + Command command = ctx.Commands.FirstOrDefault(c => c.Name == "formats" && c.Synchronized) ?? + new Command {Name = "formats", Synchronized = true}; + + command.Count += (ulong)allStats.Commands.Formats; + ctx.Commands.Update(command); + } + + if(allStats.Commands.ImageInfo > 0) + { + Command command = ctx.Commands.FirstOrDefault(c => c.Name == "image-info" && c.Synchronized) ?? + new Command {Name = "image-info", Synchronized = true}; + + command.Count += (ulong)allStats.Commands.ImageInfo; + ctx.Commands.Update(command); + } + + if(allStats.Commands.ListDevices > 0) + { + Command command = + ctx.Commands.FirstOrDefault(c => c.Name == "list-devices" && c.Synchronized) ?? + new Command {Name = "list-devices", Synchronized = true}; + + command.Count += (ulong)allStats.Commands.ListDevices; + ctx.Commands.Update(command); + } + + if(allStats.Commands.ListEncodings > 0) + { + Command command = + ctx.Commands.FirstOrDefault(c => c.Name == "list-encodings" && c.Synchronized) ?? + new Command {Name = "list-encodings", Synchronized = true}; + + command.Count += (ulong)allStats.Commands.ListEncodings; + ctx.Commands.Update(command); + } + + if(allStats.Commands.Ls > 0) + { + Command command = ctx.Commands.FirstOrDefault(c => c.Name == "ls" && c.Synchronized) ?? + new Command {Name = "ls", Synchronized = true}; + + command.Count += (ulong)allStats.Commands.Ls; + ctx.Commands.Update(command); + } + + if(allStats.Commands.MediaInfo > 0) + { + Command command = ctx.Commands.FirstOrDefault(c => c.Name == "media-info" && c.Synchronized) ?? + new Command {Name = "media-info", Synchronized = true}; + + command.Count += (ulong)allStats.Commands.MediaInfo; + ctx.Commands.Update(command); + } + + if(allStats.Commands.MediaScan > 0) + { + Command command = ctx.Commands.FirstOrDefault(c => c.Name == "media-scan" && c.Synchronized) ?? + new Command {Name = "media-scan", Synchronized = true}; + + command.Count += (ulong)allStats.Commands.MediaScan; + ctx.Commands.Update(command); + } + + if(allStats.Commands.PrintHex > 0) + { + Command command = ctx.Commands.FirstOrDefault(c => c.Name == "printhex" && c.Synchronized) ?? + new Command {Name = "printhex", Synchronized = true}; + + command.Count += (ulong)allStats.Commands.PrintHex; + ctx.Commands.Update(command); + } + + if(allStats.Commands.Verify > 0) + { + Command command = ctx.Commands.FirstOrDefault(c => c.Name == "verify" && c.Synchronized) ?? + new Command {Name = "verify", Synchronized = true}; + + command.Count += (ulong)allStats.Commands.Verify; + ctx.Commands.Update(command); + } + } + + if(allStats.OperatingSystems != null) + foreach(OsStats operatingSystem in allStats.OperatingSystems) + { + if(string.IsNullOrWhiteSpace(operatingSystem.name) || + string.IsNullOrWhiteSpace(operatingSystem.version)) continue; + + OperatingSystem existing = + ctx.OperatingSystems.FirstOrDefault(c => c.Name == operatingSystem.name && + c.Version == operatingSystem.version && + c.Synchronized) ?? new OperatingSystem + { + Name = operatingSystem.name, Version = operatingSystem.version, Synchronized = true + }; + + existing.Count += (ulong)operatingSystem.Value; + ctx.OperatingSystems.Update(existing); + } + + if(allStats.Versions != null) + foreach(NameValueStats nvs in allStats.Versions) + { + if(string.IsNullOrWhiteSpace(nvs.name)) continue; + + Version existing = ctx.Versions.FirstOrDefault(c => c.Value == nvs.name && c.Synchronized) ?? + new Version {Value = nvs.name, Synchronized = true}; + + existing.Count += (ulong)nvs.Value; + ctx.Versions.Update(existing); + } + + if(allStats.Filesystems != null) + foreach(NameValueStats nvs in allStats.Filesystems) + { + if(string.IsNullOrWhiteSpace(nvs.name)) continue; + + Filesystem existing = + ctx.Filesystems.FirstOrDefault(c => c.Name == nvs.name && c.Synchronized) ?? + new Filesystem {Name = nvs.name, Synchronized = true}; + + existing.Count += (ulong)nvs.Value; + ctx.Filesystems.Update(existing); + } + + if(allStats.Partitions != null) + foreach(NameValueStats nvs in allStats.Partitions) + { + if(string.IsNullOrWhiteSpace(nvs.name)) continue; + + Partition existing = ctx.Partitions.FirstOrDefault(c => c.Name == nvs.name && c.Synchronized) ?? + new Partition {Name = nvs.name, Synchronized = true}; + + existing.Count += (ulong)nvs.Value; + ctx.Partitions.Update(existing); + } + + if(allStats.Filesystems != null) + foreach(NameValueStats nvs in allStats.Filesystems) + { + if(string.IsNullOrWhiteSpace(nvs.name)) continue; + + Filesystem existing = + ctx.Filesystems.FirstOrDefault(c => c.Name == nvs.name && c.Synchronized) ?? + new Filesystem {Name = nvs.name, Synchronized = true}; + + existing.Count += (ulong)nvs.Value; + ctx.Filesystems.Update(existing); + } + + if(allStats.MediaImages != null) + foreach(NameValueStats nvs in allStats.MediaImages) + { + if(string.IsNullOrWhiteSpace(nvs.name)) continue; + + MediaFormat existing = + ctx.MediaFormats.FirstOrDefault(c => c.Name == nvs.name && c.Synchronized) ?? + new MediaFormat {Name = nvs.name, Synchronized = true}; + + existing.Count += (ulong)nvs.Value; + ctx.MediaFormats.Update(existing); + } + + if(allStats.Filters != null) + foreach(NameValueStats nvs in allStats.Filters) + { + if(string.IsNullOrWhiteSpace(nvs.name)) continue; + + Filter existing = ctx.Filters.FirstOrDefault(c => c.Name == nvs.name && c.Synchronized) ?? + new Filter {Name = nvs.name, Synchronized = true}; + + existing.Count += (ulong)nvs.Value; + ctx.Filters.Update(existing); + } + + if(allStats.Devices != null) + foreach(DeviceStats device in allStats.Devices) + { + if(ctx.SeenDevices.Any(d => d.Manufacturer == device.Manufacturer && d.Model == device.Model && + d.Revision == device.Revision && d.Bus == device.Bus)) + continue; + + ctx.SeenDevices.Add(new DeviceStat + { + Bus = device.Bus, + Manufacturer = device.Manufacturer, + Model = device.Model, + Revision = device.Revision, + Synchronized = true + }); + } + + if(allStats.Medias != null) + foreach(MediaStats media in allStats.Medias) + { + if(string.IsNullOrWhiteSpace(media.type)) continue; + + Database.Models.Media existing = + ctx.Medias.FirstOrDefault(c => c.Type == media.type && c.Real == media.real && + c.Synchronized) ?? new Database.Models.Media + { + Type = media.type, Real = media.real, Synchronized = true + }; + + existing.Count += (ulong)media.Value; + ctx.Medias.Update(existing); + } + + ctx.SaveChanges(); + File.Delete(Path.Combine(Settings.Settings.StatsPath, "Statistics.xml")); } - else if(Settings.Settings.Current.Stats != null) + + if(Settings.Settings.Current.Stats == null) return; + + ctx.OperatingSystems.Add(new OperatingSystem { - AllStats = new Stats(); - ctx.OperatingSystems.Add(new OperatingSystem - { - Name = DetectOS.GetRealPlatformID().ToString(), - Synchronized = false, - Version = DetectOS.GetVersion(), - Count = 1 - }); - ctx.Versions.Add(new Version - { - Value = CommonTypes.Interop.Version.GetVersion(), - Synchronized = false, - Count = 1 - }); - } - else AllStats = null; + Name = DetectOS.GetRealPlatformID().ToString(), + Synchronized = false, + Version = DetectOS.GetVersion(), + Count = 1 + }); + ctx.Versions.Add(new Version + { + Value = CommonTypes.Interop.Version.GetVersion(), Synchronized = false, Count = 1 + }); } /// @@ -115,15 +422,6 @@ namespace DiscImageChef.Core public static void SaveStats() { ctx.SaveChanges(); - - if(AllStats == null) return; - - FileStream fs = new FileStream(Path.Combine(Settings.Settings.StatsPath, "Statistics.xml"), - FileMode.Create); - XmlSerializer xs = new XmlSerializer(AllStats.GetType()); - xs.Serialize(fs, AllStats); - fs.Close(); - if(Settings.Settings.Current.Stats != null && Settings.Settings.Current.Stats.ShareStats) SubmitStats(); } diff --git a/DiscImageChef.Gui/Forms/frmMain.xeto.cs b/DiscImageChef.Gui/Forms/frmMain.xeto.cs index 59f69bc17..3f43b5b74 100644 --- a/DiscImageChef.Gui/Forms/frmMain.xeto.cs +++ b/DiscImageChef.Gui/Forms/frmMain.xeto.cs @@ -42,6 +42,7 @@ using DiscImageChef.CommonTypes.Structs; using DiscImageChef.Console; using DiscImageChef.Core; using DiscImageChef.Core.Media.Info; +using DiscImageChef.Database; using DiscImageChef.Decoders.SCSI; using DiscImageChef.Devices; using DiscImageChef.Gui.Dialogs; @@ -596,7 +597,10 @@ namespace DiscImageChef.Gui.Forms protected void OnMenuStatistics(object sender, EventArgs e) { - if(Statistics.AllStats == null) + DicContext ctx = new DicContext(); + + if(!ctx.Commands.Any() && !ctx.Filesystems.Any() && !ctx.Filters.Any() && !ctx.MediaFormats.Any() && + !ctx.Medias.Any() && !ctx.Partitions.Any() && !ctx.SeenDevices.Any()) { MessageBox.Show("There are no statistics."); return;