private static NetLogFileReader OpenFileReader(FileInfo fi, Dictionary <string, TravelLogUnit> tlu_lookup = null, Dictionary <string, List <JournalLocOrJump> > vsc_lookup = null, Dictionary <string, NetLogFileReader> netlogreaders = null) { NetLogFileReader reader; TravelLogUnit tlu; List <JournalLocOrJump> vsclist = null; if (vsc_lookup != null && vsc_lookup.ContainsKey(fi.Name)) { vsclist = vsc_lookup[fi.Name]; } if (netlogreaders != null && netlogreaders.ContainsKey(fi.Name)) { return(netlogreaders[fi.Name]); } else if (tlu_lookup != null && tlu_lookup.ContainsKey(fi.Name)) { tlu = tlu_lookup[fi.Name]; tlu.Path = fi.DirectoryName; reader = new NetLogFileReader(tlu, vsclist); } else if (TravelLogUnit.TryGet(fi.Name, out tlu)) { tlu.Path = fi.DirectoryName; reader = new NetLogFileReader(tlu, vsclist); } else { reader = new NetLogFileReader(fi.FullName); } if (netlogreaders != null) { netlogreaders[fi.Name] = reader; } return(reader); }
static public void ParseFiles(string datapath, out string error, int defaultMapColour, Func <bool> cancelRequested, Action <int, string> updateProgress, bool forceReload = false, Dictionary <string, NetLogFileReader> netlogreaders = null, int currentcmdrid = -1) { error = null; if (datapath == null) { error = "Netlog directory not set!"; return; } if (!Directory.Exists(datapath)) // if logfiles directory is not found { error = "Netlog directory is not present!"; return; } if (netlogreaders == null) { netlogreaders = new Dictionary <string, NetLogFileReader>(); } if (currentcmdrid < 0) { currentcmdrid = EDDConfig.Instance.CurrentCmdrID; } // TLUs List <TravelLogUnit> tlus = TravelLogUnit.GetAll(); Dictionary <string, TravelLogUnit> netlogtravelogUnits = tlus.Where(t => t.type == 1).GroupBy(t => t.Name).Select(g => g.First()).ToDictionary(t => t.Name); Dictionary <long, string> travellogunitid2name = netlogtravelogUnits.Values.ToDictionary(t => t.id, t => t.Name); Dictionary <string, List <JournalLocOrJump> > vsc_lookup = JournalEntry.GetAll().OfType <JournalLocOrJump>().GroupBy(v => v.TLUId).Where(g => travellogunitid2name.ContainsKey(g.Key)).ToDictionary(g => travellogunitid2name[g.Key], g => g.ToList()); // list of systems in journal, sorted by time List <JournalLocOrJump> vsSystemsEnts = JournalEntry.GetAll(currentcmdrid).OfType <JournalLocOrJump>().OrderBy(j => j.EventTimeUTC).ToList(); // order by file write time so we end up on the last one written FileInfo[] allFiles = Directory.EnumerateFiles(datapath, "netLog.*.log", SearchOption.AllDirectories).Select(f => new FileInfo(f)).OrderBy(p => p.LastWriteTime).ToArray(); List <NetLogFileReader> readersToUpdate = new List <NetLogFileReader>(); for (int i = 0; i < allFiles.Length; i++) { FileInfo fi = allFiles[i]; var reader = OpenFileReader(fi, netlogtravelogUnits, vsc_lookup, netlogreaders); if (!netlogtravelogUnits.ContainsKey(reader.TravelLogUnit.Name)) { netlogtravelogUnits[reader.TravelLogUnit.Name] = reader.TravelLogUnit; reader.TravelLogUnit.Add(); } if (!netlogreaders.ContainsKey(reader.TravelLogUnit.Name)) { netlogreaders[reader.TravelLogUnit.Name] = reader; } if (forceReload) { // Force a reload of the travel log reader.TravelLogUnit.Size = 0; } if (reader.filePos != fi.Length || i == allFiles.Length - 1) // File not already in DB, or is the last one { readersToUpdate.Add(reader); } } for (int i = 0; i < readersToUpdate.Count; i++) { using (SQLiteConnectionUser cn = new SQLiteConnectionUser(utc: true)) { int ji = 0; NetLogFileReader reader = readersToUpdate[i]; updateProgress(i * 100 / readersToUpdate.Count, reader.TravelLogUnit.Name); using (DbTransaction tn = cn.BeginTransaction()) { foreach (JObject jo in reader.ReadSystems(cancelRequested, currentcmdrid)) { jo["EDDMapColor"] = defaultMapColour; JournalLocOrJump je = new JournalFSDJump(jo) { TLUId = (int)reader.TravelLogUnit.id, CommanderId = currentcmdrid, }; while (ji < vsSystemsEnts.Count && vsSystemsEnts[ji].EventTimeUTC < je.EventTimeUTC) { ji++; // move to next entry which is bigger in time or equal to ours. } JournalLocOrJump prev = (ji > 0 && (ji - 1) < vsSystemsEnts.Count) ? vsSystemsEnts[ji - 1] : null; JournalLocOrJump next = ji < vsSystemsEnts.Count ? vsSystemsEnts[ji] : null; bool previssame = (prev != null && prev.StarSystem.Equals(je.StarSystem, StringComparison.CurrentCultureIgnoreCase) && (!prev.HasCoordinate || !je.HasCoordinate || (prev.StarPos - je.StarPos).LengthSquared < 0.01)); bool nextissame = (next != null && next.StarSystem.Equals(je.StarSystem, StringComparison.CurrentCultureIgnoreCase) && (!next.HasCoordinate || !je.HasCoordinate || (next.StarPos - je.StarPos).LengthSquared < 0.01)); // System.Diagnostics.Debug.WriteLine("{0} {1} {2}", ji, vsSystemsEnts[ji].EventTimeUTC, je.EventTimeUTC); if (!(previssame || nextissame)) { je.Add(cn, tn); System.Diagnostics.Debug.WriteLine("Add {0} {1}", je.EventTimeUTC, je.EventDataString); } } tn.Commit(); reader.TravelLogUnit.Update(); } if (updateProgress != null) { updateProgress((i + 1) * 100 / readersToUpdate.Count, reader.TravelLogUnit.Name); } } } }
private void ScanTickWorker(object sender, System.ComponentModel.DoWorkEventArgs e) { var worker = sender as System.ComponentModel.BackgroundWorker; var entries = new List <VisitedSystemsClass>(); e.Result = entries; int netlogpos = 0; NetLogFileReader nfi = null; try { if (EDDConfig.Instance.NetLogDirAutoMode) { EliteDangerous.CheckED(); } string filename = null; if (m_netLogFileQueue.TryDequeue(out filename)) // if a new one queued, we swap to using it { nfi = OpenFileReader(new FileInfo(filename)); lastnfi = nfi; } else if (!File.Exists(lastnfi.FileName) || lastnfi.filePos >= new FileInfo(lastnfi.FileName).Length) { HashSet <string> tlunames = new HashSet <string>(TravelLogUnit.GetAllNames()); string[] filenames = Directory.EnumerateFiles(GetNetLogPath(), "netLog.*.log", SearchOption.AllDirectories) .Select(s => new { name = Path.GetFileName(s), fullname = s }) .Where(s => !tlunames.Contains(s.name)) .OrderBy(s => s.name) .Select(s => s.fullname) .ToArray(); foreach (var name in filenames) { nfi = OpenFileReader(new FileInfo(name)); lastnfi = nfi; break; } } else { nfi = lastnfi; } if (nfi != null) { if (nfi.TimeZone == null) { nfi.ReadHeader(); if (nfi.TravelLogUnit.id == 0) { nfi.TravelLogUnit.Add(); } } netlogpos = nfi.TravelLogUnit.Size; foreach (VisitedSystemsClass dbsys in nfi.ReadSystems()) { dbsys.EDSM_sync = false; dbsys.MapColour = EDDConfig.Instance.DefaultMapColour; dbsys.Commander = EDDConfig.Instance.CurrentCmdrID; dbsys.Add(); // here we need to make sure the cursystem is set up.. need to do it here because OnNewPosition expects all cursystems to be non null.. VisitedSystemsClass item2 = VisitedSystemsClass.GetLast(dbsys.Commander, dbsys.Time); VisitedSystemsClass.UpdateVisitedSystemsEntries(dbsys, item2, EDDiscoveryForm.EDDConfig.UseDistances); // ensure they have system classes behind them.. entries.Add(dbsys); if (worker.CancellationPending) { break; } } nfi.TravelLogUnit.Update(); } if (worker.CancellationPending) { e.Cancel = true; } } catch (Exception ex) { // Revert and re-read the failed entries if (nfi != null && nfi.TravelLogUnit != null) { nfi.TravelLogUnit.Size = netlogpos; } System.Diagnostics.Trace.WriteLine("Net tick exception : " + ex.Message); System.Diagnostics.Trace.WriteLine(ex.StackTrace); throw; } }
// called during start up and if refresh history is pressed public List <VisitedSystemsClass> ParseFiles(out string error, int defaultMapColour, Func <bool> cancelRequested, Action <int, string> updateProgress) { error = null; string datapath = GetNetLogPath(); if (datapath == null) { error = "Netlog directory not found!" + Environment.NewLine + "Specify location in settings tab"; return(null); } if (!Directory.Exists(datapath)) // if logfiles directory is not found { error = "Netlog directory is not present!" + Environment.NewLine + "Specify location in settings tab"; return(null); } List <VisitedSystemsClass> vsSystemsList = VisitedSystemsClass.GetAll(EDDConfig.Instance.CurrentCmdrID); List <VisitedSystemsClass> visitedSystems = new List <VisitedSystemsClass>(); Dictionary <string, TravelLogUnit> m_travelogUnits = TravelLogUnit.GetAll().Where(t => t.type == 1).GroupBy(t => t.Name).Select(g => g.First()).ToDictionary(t => t.Name); Dictionary <string, List <VisitedSystemsClass> > vsc_lookup = VisitedSystemsClass.GetAll().GroupBy(v => v.Unit).ToDictionary(g => g.Key, g => g.ToList()); if (vsSystemsList != null) { foreach (VisitedSystemsClass vs in vsSystemsList) { if (visitedSystems.Count == 0) { visitedSystems.Add(vs); } else if (!visitedSystems.Last <VisitedSystemsClass>().Name.Equals(vs.Name)) // Avoid duplicate if times exist in same system from different files. { visitedSystems.Add(vs); } else { VisitedSystemsClass vs2 = (VisitedSystemsClass)visitedSystems.Last <VisitedSystemsClass>(); if (vs2.id != vs.id) { vs.Commander = -2; // Move to dupe user vs.Update(); } } } } // order by file write time so we end up on the last one written FileInfo[] allFiles = Directory.EnumerateFiles(datapath, "netLog.*.log", SearchOption.AllDirectories).Select(f => new FileInfo(f)).OrderBy(p => p.LastWriteTime).ToArray(); List <NetLogFileReader> readersToUpdate = new List <NetLogFileReader>(); for (int i = 0; i < allFiles.Length; i++) { FileInfo fi = allFiles[i]; var reader = OpenFileReader(fi, m_travelogUnits, vsc_lookup); if (!m_travelogUnits.ContainsKey(reader.TravelLogUnit.Name)) { m_travelogUnits[reader.TravelLogUnit.Name] = reader.TravelLogUnit; reader.TravelLogUnit.Add(); } if (!netlogreaders.ContainsKey(reader.TravelLogUnit.Name)) { netlogreaders[reader.TravelLogUnit.Name] = lastnfi; } if (reader.filePos != fi.Length || i == allFiles.Length - 1) // File not already in DB, or is the last one { readersToUpdate.Add(reader); } } using (SQLiteConnectionED cn = new SQLiteConnectionED()) { for (int i = 0; i < readersToUpdate.Count; i++) { NetLogFileReader reader = readersToUpdate[i]; updateProgress(i * 100 / readersToUpdate.Count, reader.TravelLogUnit.Name); using (DbTransaction tn = cn.BeginTransaction()) { foreach (VisitedSystemsClass ps in reader.ReadSystems(cancelRequested)) { ps.EDSM_sync = false; ps.MapColour = defaultMapColour; ps.Commander = EDDConfig.Instance.CurrentCmdrID; ps.Add(cn, tn); visitedSystems.Add(ps); } reader.TravelLogUnit.Update(cn, tn); tn.Commit(); } if (updateProgress != null) { updateProgress((i + 1) * 100 / readersToUpdate.Count, reader.TravelLogUnit.Name); } lastnfi = reader; } } return(visitedSystems); }
private static NetLogFileReader OpenFileReader(FileInfo fi, Dictionary<string, TravelLogUnit> tlu_lookup = null, Dictionary<string, List<JournalLocOrJump>> vsc_lookup = null, Dictionary<string, NetLogFileReader> netlogreaders = null) { NetLogFileReader reader; TravelLogUnit tlu; List<JournalLocOrJump> vsclist = null; if (vsc_lookup != null && vsc_lookup.ContainsKey(fi.Name)) { vsclist = vsc_lookup[fi.Name]; } if (netlogreaders != null && netlogreaders.ContainsKey(fi.Name)) { return netlogreaders[fi.Name]; } else if (tlu_lookup != null && tlu_lookup.ContainsKey(fi.Name)) { tlu = tlu_lookup[fi.Name]; tlu.Path = fi.DirectoryName; reader = new NetLogFileReader(tlu, vsclist); } else if (TravelLogUnit.TryGet(fi.Name, out tlu)) { tlu.Path = fi.DirectoryName; reader = new NetLogFileReader(tlu, vsclist); } else { reader = new NetLogFileReader(fi.FullName); } if (netlogreaders != null) { netlogreaders[fi.Name] = reader; } return reader; }
private void ScanTickWorker(object sender, System.ComponentModel.DoWorkEventArgs e) { var worker = sender as System.ComponentModel.BackgroundWorker; var entries = new List<VisitedSystemsClass>(); e.Result = entries; int netlogpos = 0; NetLogFileReader nfi = null; try { if (EDDConfig.Instance.NetLogDirAutoMode) { EliteDangerous.CheckED(); } string filename = null; if (m_netLogFileQueue.TryDequeue(out filename)) // if a new one queued, we swap to using it { nfi = OpenFileReader(new FileInfo(filename)); lastnfi = nfi; } else if (!File.Exists(lastnfi.FileName) || lastnfi.filePos >= new FileInfo(lastnfi.FileName).Length) { HashSet<string> tlunames = new HashSet<string>(TravelLogUnit.GetAllNames()); string[] filenames = Directory.EnumerateFiles(GetNetLogPath(), "netLog.*.log", SearchOption.AllDirectories) .Select(s => new { name = Path.GetFileName(s), fullname = s }) .Where(s => !tlunames.Contains(s.name)) .OrderBy(s => s.name) .Select(s => s.fullname) .ToArray(); foreach (var name in filenames) { nfi = OpenFileReader(new FileInfo(name)); lastnfi = nfi; break; } } else { nfi = lastnfi; } if (nfi != null) { if (nfi.TimeZone == null) { nfi.ReadHeader(); if (nfi.TravelLogUnit.id == 0) nfi.TravelLogUnit.Add(); } netlogpos = nfi.TravelLogUnit.Size; foreach(VisitedSystemsClass dbsys in nfi.ReadSystems()) { dbsys.EDSM_sync = false; dbsys.MapColour = EDDConfig.Instance.DefaultMapColour; dbsys.Commander = EDDConfig.Instance.CurrentCmdrID; dbsys.Add(); // here we need to make sure the cursystem is set up.. need to do it here because OnNewPosition expects all cursystems to be non null.. VisitedSystemsClass item2 = VisitedSystemsClass.GetLast(dbsys.Commander, dbsys.Time); VisitedSystemsClass.UpdateVisitedSystemsEntries(dbsys, item2, EDDiscoveryForm.EDDConfig.UseDistances); // ensure they have system classes behind them.. entries.Add(dbsys); if (worker.CancellationPending) { break; } } nfi.TravelLogUnit.Update(); } if (worker.CancellationPending) { e.Cancel = true; } } catch (Exception ex) { // Revert and re-read the failed entries if (nfi != null && nfi.TravelLogUnit != null) { nfi.TravelLogUnit.Size = netlogpos; } System.Diagnostics.Trace.WriteLine("Net tick exception : " + ex.Message); System.Diagnostics.Trace.WriteLine(ex.StackTrace); throw; } }
private NetLogFileReader OpenFileReader(FileInfo fi, Dictionary<string, TravelLogUnit> tlu_lookup = null, Dictionary<string, List<VisitedSystemsClass>> vsc_lookup = null) { NetLogFileReader reader; TravelLogUnit tlu; List<VisitedSystemsClass> vsclist = null; if (vsc_lookup != null && vsc_lookup.ContainsKey(fi.Name)) { vsclist = vsc_lookup[fi.Name]; } if (netlogreaders.ContainsKey(fi.Name)) { reader = netlogreaders[fi.Name]; } else if (tlu_lookup != null && tlu_lookup.ContainsKey(fi.Name)) { tlu = tlu_lookup[fi.Name]; tlu.Path = fi.DirectoryName; reader = new NetLogFileReader(tlu, vsclist); netlogreaders[fi.Name] = reader; } else if (TravelLogUnit.TryGet(fi.Name, out tlu)) { tlu.Path = fi.DirectoryName; reader = new NetLogFileReader(tlu, vsclist); netlogreaders[fi.Name] = reader; } else { reader = new NetLogFileReader(fi.FullName); netlogreaders[fi.Name] = reader; } return reader; }
// called during start up and if refresh history is pressed public List<VisitedSystemsClass> ParseFiles(out string error, int defaultMapColour, Func<bool> cancelRequested, Action<int, string> updateProgress, bool forceReload = false) { error = null; string datapath = GetNetLogPath(); if (datapath == null) { error = "Netlog directory not found!" + Environment.NewLine + "Specify location in settings tab"; return null; } if (!Directory.Exists(datapath)) // if logfiles directory is not found { error = "Netlog directory is not present!" + Environment.NewLine + "Specify location in settings tab"; return null; } List<VisitedSystemsClass> vsSystemsList = VisitedSystemsClass.GetAll(EDDConfig.Instance.CurrentCmdrID); List<VisitedSystemsClass> visitedSystems = new List<VisitedSystemsClass>(); Dictionary<string, TravelLogUnit> m_travelogUnits = TravelLogUnit.GetAll().Where(t => t.type == 1).GroupBy(t => t.Name).Select(g => g.First()).ToDictionary(t => t.Name); Dictionary<string, List<VisitedSystemsClass>> vsc_lookup = VisitedSystemsClass.GetAll().GroupBy(v => v.Unit).ToDictionary(g => g.Key, g => g.ToList()); if (vsSystemsList != null) { foreach (VisitedSystemsClass vs in vsSystemsList) { if (visitedSystems.Count == 0) visitedSystems.Add(vs); else if (!visitedSystems.Last<VisitedSystemsClass>().Name.Equals(vs.Name)) // Avoid duplicate if times exist in same system from different files. visitedSystems.Add(vs); else { VisitedSystemsClass vs2 = (VisitedSystemsClass)visitedSystems.Last<VisitedSystemsClass>(); if (vs2.id != vs.id) { vs.Commander = -2; // Move to dupe user vs.Update(); } } } } // order by file write time so we end up on the last one written FileInfo[] allFiles = Directory.EnumerateFiles(datapath, "netLog.*.log", SearchOption.AllDirectories).Select(f => new FileInfo(f)).OrderBy(p => p.LastWriteTime).ToArray(); List<NetLogFileReader> readersToUpdate = new List<NetLogFileReader>(); for (int i = 0; i < allFiles.Length; i++) { FileInfo fi = allFiles[i]; var reader = OpenFileReader(fi, m_travelogUnits, vsc_lookup); if (!m_travelogUnits.ContainsKey(reader.TravelLogUnit.Name)) { m_travelogUnits[reader.TravelLogUnit.Name] = reader.TravelLogUnit; reader.TravelLogUnit.Add(); } if (!netlogreaders.ContainsKey(reader.TravelLogUnit.Name)) { netlogreaders[reader.TravelLogUnit.Name] = lastnfi; } if (forceReload) { // Force a reload of the travel log reader.TravelLogUnit.Size = 0; } if (reader.filePos != fi.Length || i == allFiles.Length - 1) // File not already in DB, or is the last one { readersToUpdate.Add(reader); } } using (SQLiteConnectionUser cn = new SQLiteConnectionUser()) { for (int i = 0; i < readersToUpdate.Count; i++) { NetLogFileReader reader = readersToUpdate[i]; updateProgress(i * 100 / readersToUpdate.Count, reader.TravelLogUnit.Name); using (DbTransaction tn = cn.BeginTransaction()) { foreach (VisitedSystemsClass ps in reader.ReadSystems(cancelRequested)) { ps.EDSM_sync = false; ps.MapColour = defaultMapColour; ps.Commander = EDDConfig.Instance.CurrentCmdrID; ps.Add(cn, tn); visitedSystems.Add(ps); } reader.TravelLogUnit.Update(cn, tn); tn.Commit(); } if (updateProgress != null) { updateProgress((i + 1) * 100 / readersToUpdate.Count, reader.TravelLogUnit.Name); } lastnfi = reader; } } return visitedSystems; }