Пример #1
0
 public LocationInfoEventArgs()
 {
     System    = "";
     Location  = "";
     Position  = new Point3Dbl();
     TimeStamp = new DateTime(1900, 1, 1, 0, 0, 0);
 }
Пример #2
0
 public LocationChangedEventArgs()
 {
     Changed   = enLogEvents.Location;
     System    = "";
     Location  = "";
     Position  = new Point3Dbl();
     TimeStamp = new DateTime(1900, 1, 1, 0, 0, 0);
 }
Пример #3
0
 public BasedataEventArgs()
 {
     EventType   = JournalEvent.Undefined;
     Coordinates = new Point3Dbl();
 }
Пример #4
0
        /// <summary>
        /// processing the collected informations
        /// </summary>
        /// <param name="LoggedEvents"></param>
        private void processingLocationInfo(List <LogEvent> LoggedEvents)
        {
            //Boolean SystemHasChanged   = false;
            //Boolean LocationHasChanged = false;
            String      OldSystemString;
            String      OldLocationString;
            String      foundSystemString;
            String      foundLocationString;
            enLogEvents EventFlags  = enLogEvents.None;
            Point3Dbl   usePosition = null;

            try
            {
                if (LoggedEvents.Count() > 0)
                {
                    // order by date
                    LoggedEvents = LoggedEvents.OrderBy(x => x.Time).ToList();

                    // scan sequence
                    foreach (LogEvent Event in LoggedEvents)
                    {
                        OldSystemString     = Program.actualCondition.System;
                        OldLocationString   = Program.actualCondition.Location;
                        EventFlags          = enLogEvents.None;
                        usePosition         = null;
                        foundSystemString   = "";
                        foundLocationString = "";

                        switch (Event.EventType)
                        {
                        case enLogEvents.Jump:
                            // after a jump we are no longer on a station

                            if (!m_InitialJumpFound)
                            {
                                // it's only the "startjump" of ED, not really a jump
                                m_InitialJumpFound = true;
                                Program.DBCon.setIniValue(DB_GROUPNAME, "InitialJumpFound", m_InitialJumpFound.ToString());
                            }
                            else
                            {
                                if (!String.IsNullOrEmpty(OldLocationString))
                                {
                                    EventFlags         |= enLogEvents.Location;
                                    foundLocationString = Event.Value;
                                }

                                EventFlags |= enLogEvents.Jump;

                                Debug.Print("log - scanning : jump found");
                            }
                            break;

                        case enLogEvents.System:
                            // a new system is everytime valid, check if the system has changed
                            if ((Event.Value != "") && (!Event.Value.Equals(OldSystemString, StringComparison.InvariantCultureIgnoreCase)))
                            {
                                EventFlags       |= enLogEvents.System;
                                foundSystemString = Event.Value;
                                usePosition       = Event.Position;

                                // after a jump we are no longer on a station
                                if (!String.IsNullOrEmpty(OldLocationString))
                                {
                                    EventFlags         |= enLogEvents.Location;
                                    foundLocationString = "";
                                }
                                Debug.Print("log - scanning : system found : " + Event.Value);
                            }
                            break;

                        case enLogEvents.Location:
                            // a new station is everytime valid, check if the station has changed
                            if ((Event.Value != "") && (!Event.Value.Equals(OldLocationString, StringComparison.InvariantCultureIgnoreCase)))
                            {
                                EventFlags         |= enLogEvents.Location;
                                foundLocationString = Event.Value;
                            }
                            Debug.Print("log - scanning : location found : " + Event.Value);
                            break;
                        }

                        if (EventFlags != enLogEvents.None)
                        {
                            // something has changed -> fire events

                            var LI = new LocationInfoEventArgs()
                            {
                                System   = foundSystemString,
                                Location = foundLocationString,
                                Position = usePosition
                            };
                            LocationInfo.Raise(this, LI);


                            var EA = new LocationChangedEventArgs()
                            {
                                System      = foundSystemString,
                                Location    = foundLocationString,
                                OldSystem   = OldSystemString,
                                OldLocation = OldLocationString,
                                Changed     = EventFlags,
                                Position    = usePosition,
                                TimeStamp   = Event.Time
                            };
                            LocationChanged.Raise(this, EA);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Error while processing location info", ex);
            }
        }
Пример #5
0
        private void UpdateSystemNameFromLogFile_worker()
        {
            SingleThreadLogger logger      = new SingleThreadLogger(ThreadLoggerType.FileScanner);
            Regex RegExTest_FindBestIsland = new Regex(String.Format("FindBestIsland:.+:.+:.+:.+", Regex.Escape(Program.DBCon.getIniValue <String>(IBE.IBESettingsView.DB_GROUPNAME, "PilotsName"))), RegexOptions.IgnoreCase);
            Regex RegExTest_Island_Claimed = new Regex(String.Format("vvv------------ ISLAND .+ CLAIMED ------------vvv"), RegexOptions.IgnoreCase);

            do
            {
                try
                {
                    Boolean         EndNow       = false;
                    string          Systemname   = "";
                    string          Locationname = "";
                    string          currentLogString;
                    Match           m                    = null;
                    Boolean         Got_Jump             = false;
                    List <String>   PossibleLocations    = new List <string>();
                    List <LogEvent> LoggedEvents         = new List <LogEvent>();
                    DateTime        TimestampCurrentLine = DateTime.MinValue;
                    String          InfoCurrentLine      = "";
                    //DateTime Timestamp_YoungestLine     = DateTime.MaxValue;
                    Int32    LineCountRaw = 0;
                    Int32    LineCount    = 0;
                    DateTime TimestampLastScanCandidate = DateTime.MinValue;
                    String   InfoLastScanCandidate      = "";

                    #if extScanLog
                    logger.Log("start, RegEx = <" + String.Format("FindBestIsland:.+:.+:.+:.+", Regex.Escape(Program.RegulatedNoiseSettings.PilotsName)) + ">");
                    #endif

                    var appConfigPath = Program.DBCon.getIniValue("Settings", "GamePath");

                    if (Directory.Exists(appConfigPath))
                    {
                        //var versions = Directory.GetDirectories(appConfigPath).Where(x => x.Contains("FORC-FDEV")).ToList().OrderByDescending(x => x).ToList();
                        var versions = new String[] { appConfigPath };

                        if (versions.Count() == 0)
                        {
#if extScanLog
                            logger.Log("no dirs with <FORC-FDEV> found");
                            var versions2 = Directory.GetDirectories(appConfigPath).ToList().OrderByDescending(x => x).ToList();
                            foreach (string SubPath in versions2)
                            {
                                logger.Log("but found <" + SubPath + ">");
                            }
#endif
                        }
                        else
                        {
#if extScanLog
                            logger.Log("lookin' for files in <" + versions[0] + ">");
#endif

                            // We'll just go right ahead and use the latest log...
                            var netLogs =
                                Directory.GetFiles(versions[0] + "\\Logs", "netLog*.log")
                                .OrderByDescending(File.GetLastWriteTime)
                                .ToArray();

                            if (netLogs.Length != 0)
                            {
                                Systemname   = "";
                                Locationname = "";
                                LoggedEvents.Clear();
                                var newestNetLog = netLogs[0];

                                if (!m_currentLogFile.Equals(newestNetLog, StringComparison.InvariantCultureIgnoreCase))
                                {
                                    // new logfile -> ignore the first jump again, it's simpply the "startjump" of ED, not a real jump
                                    m_InitialJumpFound = false;
                                    m_currentLogFile   = newestNetLog;

                                    Program.DBCon.setIniValue(DB_GROUPNAME, "CurrentLogfile", m_currentLogFile);
                                    Program.DBCon.setIniValue(DB_GROUPNAME, "InitialJumpFound", m_InitialJumpFound.ToString());

                                    m_TimestampLastScan = DateTime.MinValue;
                                    m_InfoLastScan      = "";
                                    Program.DBCon.setIniValue(DB_GROUPNAME, "TimestampLastScan", m_TimestampLastScan.ToString());
                                    Program.DBCon.setIniValue(DB_GROUPNAME, "InfoLastScan", m_InfoLastScan);
                                }

                                #if extScanLog
                                Debug.Print("File opened : <" + newestNetLog + ">");
                                logger.Log("File opened : <" + newestNetLog + ">");
                                #endif

                                FileStream Datei      = new FileStream(newestNetLog, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
                                Byte[]     ByteBuffer = new Byte[1];
                                Byte[]     LineBuffer = new Byte[SEARCH_MAXLENGTH];

                                Datei.Seek(0, SeekOrigin.End);

                                while (!EndNow && (Datei.Position >= 2))
                                {
                                    long StartPos = -1;
                                    long EndPos   = -1;

                                    do
                                    {
                                        Datei.Read(ByteBuffer, 0, ByteBuffer.Length);
                                        //Debug.Print(ByteBuffer[0].ToString("x") + " ");
                                        if ((ByteBuffer[0] == 0x0A) || (ByteBuffer[0] == 0x0D))
                                        {
                                            if (EndPos == -1)
                                            {
                                                if (ByteBuffer[0] == 0x0D)
                                                {
                                                    EndPos = Datei.Position + 1;
                                                }
                                                else
                                                {
                                                    EndPos = Datei.Position;
                                                }

                                                Datei.Seek(-3, SeekOrigin.Current);
                                            }
                                            else
                                            {
                                                if (ByteBuffer[0] == 0x0D)
                                                {
                                                    StartPos = Datei.Position + 1;
                                                }
                                                else
                                                {
                                                    StartPos = Datei.Position;
                                                }
                                            }
                                        }
                                        else
                                        {
                                            if ((LineCountRaw == 0) && (EndPos == -1))
                                            {
                                                EndPos = Datei.Position;
                                            }

                                            Datei.Seek(-3, SeekOrigin.Current);
                                        }
                                    } while (StartPos == -1 && Datei.Position >= 3);

                                    LineCountRaw++;

                                    if ((StartPos == -1) && ((EndPos - StartPos) > SEARCH_MINLENGTH))
                                    {
                                        StartPos = 0;
                                    }

                                    if ((StartPos >= 0) && ((EndPos - StartPos) <= SEARCH_MAXLENGTH))
                                    {
                                        // found a line and it's not too long
                                        // read
                                        Datei.Read(LineBuffer, 0, (int)(EndPos - StartPos));
                                        // and convert to string
                                        currentLogString = Encoding.ASCII.GetString(LineBuffer, 0, (int)(EndPos - StartPos));

                                        Debug.Print("log - scanning :" + currentLogString);

                                        if (currentLogString != null)
                                        {
                                            // *********************************************
                                            // check the timestamp of the current line to avoid to re-analyse older data
                                            if (TryGetTimeFromLine(currentLogString, ref TimestampCurrentLine, ref InfoCurrentLine))
                                            {
                                                if (TimestampCurrentLine < m_TimestampLastScan)
                                                {
                                                    // everything is coming now is older
                                                    EndNow = true;
                                                }
                                                else if ((TimestampCurrentLine == m_TimestampLastScan) && (InfoCurrentLine.Equals(m_InfoLastScan)))
                                                {
                                                    // everything is coming now is older
                                                    EndNow = true;
                                                }

                                                // if it's the first line we have to save the "new youngest line"
                                                // to avoid to re-analyse the same lines lines next scan
                                                if (LineCount == 0)
                                                {
                                                    TimestampLastScanCandidate = TimestampCurrentLine;
                                                    InfoLastScanCandidate      = InfoCurrentLine;
                                                }

                                                LineCount++;

                                                if (!EndNow)
                                                {
                                                    // first: check if we've jumped
                                                    m = RegExTest_Island_Claimed.Match(currentLogString);
                                                    if (m.Success)
                                                    {
                                                        if (!Got_Jump)
                                                        {
                                                            LoggedEvents.Add(new LogEvent()
                                                            {
                                                                EventType = enLogEvents.Jump, Value = "", Time = TimestampCurrentLine
                                                            });
                                                            Got_Jump = true;
                                                        }

                                                        #if extScanLog
                                                        Debug.Print("Jump Recognized");
                                                        logger.Log("Jump Recognized : " + currentLogString.Replace("\n", "").Replace("\r", ""));
                                                        #endif
                                                    }

                                                    // *********************************************
                                                    // second: looking for the systemname
                                                    if (String.IsNullOrEmpty(Systemname))
                                                    {
                                                        if (currentLogString.Contains("System:"))
                                                        {
                                                            #if extScanLog
                                                            Debug.Print("Systemstring:" + currentLogString);
                                                            logger.Log("Systemstring:" + currentLogString.Replace("\n", "").Replace("\r", ""));
                                                            #endif

                                                            // before 2.1 :
                                                            // Systemname = currentLogString.Substring(currentLogString.IndexOf("(", StringComparison.Ordinal) + 1);
                                                            // Systemname = Systemname.Substring(0, Systemname.IndexOf(")", StringComparison.Ordinal));

                                                            // since 2.1 :
                                                            currentLogString = currentLogString.Replace("\r", "").Replace("\n", "").Replace(@"\\", "");
                                                            MatchCollection matchCollection = Regex.Matches(currentLogString, @"(?<match>[^""\s]+)|\""(?<match>[^""]*)""");
                                                            Point3Dbl       systemPosition  = new Point3Dbl();

                                                            for (int i = 0; i < matchCollection.Count; i++)
                                                            {
                                                                if ((matchCollection[i].ToString().Equals("System:")) && (matchCollection.Count > i))
                                                                {
                                                                    Systemname = matchCollection[i + 1].ToString().Replace("\"", "");
                                                                }
                                                                else if ((matchCollection[i].ToString().StartsWith("System:")) && (matchCollection[i].ToString().Length > "System:".Length))
                                                                {
                                                                    Systemname = matchCollection[i].ToString().Substring("System:".Length).Replace("\"", "");
                                                                }
                                                                else if (matchCollection[i].ToString().StartsWith("StarPos:("))
                                                                {
                                                                    try
                                                                    {
                                                                        var posParts = matchCollection[i].ToString().Replace("StarPos:(", "").Replace(")ly", "").Replace(")", "").Split(new char[] { ',' });

                                                                        systemPosition.X = Double.Parse(posParts[0], System.Globalization.CultureInfo.InvariantCulture);
                                                                        systemPosition.Y = Double.Parse(posParts[1], System.Globalization.CultureInfo.InvariantCulture);
                                                                        systemPosition.Z = Double.Parse(posParts[2], System.Globalization.CultureInfo.InvariantCulture);
                                                                    }
                                                                    catch (Exception)
                                                                    {
                                                                    }
                                                                }
                                                            }


                                                            LoggedEvents.Add(new LogEvent()
                                                            {
                                                                EventType = enLogEvents.System, Value = Systemname, Time = TimestampCurrentLine, Position = systemPosition
                                                            });

                                                            #if extScanLog
                                                            Debug.Print("System: " + systemName);
                                                            logger.Log("System: " + systemName);
                                                            #endif

                                                            // preparing search for location info
                                                            RegExTest_FindBestIsland = new Regex(String.Format("FindBestIsland:.+:.+:.+:{0}", Regex.Escape(Systemname)), RegexOptions.IgnoreCase);

                                                            #if extScanLog
                                                            logger.Log("new Regex : <" + String.Format("FindBestIsland:.+:.+:.+:{0}", Regex.Escape(systemName)) + ">");
                                                            #endif

                                                            // we may have candidates, check them and if nothing found search from the current position
                                                            foreach (string candidate in PossibleLocations)
                                                            {
                                                                #if extScanLog
                                                                Debug.Print("check candidate : " + candidate);
                                                                logger.Log("check candidate : " + candidate.Replace("\n", "").Replace("\r", ""));
                                                                #endif

                                                                m = RegExTest_FindBestIsland.Match(candidate);
                                                                //Debug.Print(currentLogString);
                                                                //if (currentLogString.Contains("Duke Jones"))
                                                                //    Debug.Print("Stop");
                                                                if (m.Success)
                                                                {
                                                                    #if extScanLog
                                                                    Debug.Print("locationstring from candidate : " + candidate);
                                                                    logger.Log("locationstring from candidate : " + candidate.Replace("\n", "").Replace("\r", ""));
                                                                    #endif

                                                                    getLocation(ref Locationname, m);

                                                                    DateTime CurrentTimestamp = new DateTime();
                                                                    String   CurrentInfo      = "";
                                                                    TryGetTimeFromLine(currentLogString, ref CurrentTimestamp, ref CurrentInfo);
                                                                    LoggedEvents.Add(new LogEvent()
                                                                    {
                                                                        EventType = enLogEvents.Location, Value = Locationname, Time = CurrentTimestamp
                                                                    });

                                                                    EndNow = true;
                                                                    break;
                                                                }
                                                            }
                                                        }
                                                        else
                                                        {
                                                            m = RegExTest_FindBestIsland.Match(currentLogString);
                                                            if (m.Success)
                                                            {
                                                                #if extScanLog
                                                                Debug.Print("Candidate : " + currentLogString);
                                                                logger.Log("Candidate added : " + currentLogString.Replace("\n", "").Replace("\r", ""));
                                                                #endif

                                                                PossibleLocations.Add(currentLogString);
                                                            }
                                                        }
                                                    }
                                                }

                                                if (!EndNow)
                                                {
                                                    // if we have the systemname we're looking for the locationname
                                                    if (!string.IsNullOrEmpty(Systemname) && string.IsNullOrEmpty(Locationname))
                                                    {
                                                        m = RegExTest_FindBestIsland.Match(currentLogString);
                                                        //Debug.Print(currentLogString);
                                                        //if (currentLogString.Contains("Duke Jones"))
                                                        //    Debug.Print("Stop");
                                                        if (m.Success)
                                                        {
                                                            #if extScanLog
                                                            Debug.Print("locationstring (direct) : " + currentLogString);
                                                            logger.Log("locationstring (direct) : " + currentLogString.Replace("\n", "").Replace("\r", ""));
                                                            #endif

                                                            getLocation(ref Locationname, m);
                                                            LoggedEvents.Add(new LogEvent()
                                                            {
                                                                EventType = enLogEvents.Location, Value = Locationname, Time = TimestampCurrentLine
                                                            });

                                                            EndNow = true;
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }

                                    if (!EndNow)
                                    {
                                        if (StartPos >= 3)
                                        {
                                            Datei.Seek(StartPos - 1, SeekOrigin.Begin);
                                        }
                                        else
                                        {
                                            Datei.Seek(0, SeekOrigin.Begin);
                                        }
                                    }
                                }


                                if ((!m_TimestampLastScan.Equals(TimestampLastScanCandidate)) || (!m_InfoLastScan.Equals(InfoLastScanCandidate)))
                                {
                                    // save only if changed
                                    m_TimestampLastScan = TimestampLastScanCandidate;
                                    m_InfoLastScan      = InfoLastScanCandidate;

                                    Program.DBCon.setIniValue(DB_GROUPNAME, "TimestampLastScan", m_TimestampLastScan.ToString());
                                    Program.DBCon.setIniValue(DB_GROUPNAME, "InfoLastScan", m_InfoLastScan);
                                }

                                Datei.Close();
                                Datei.Dispose();

                                #if extScanLog
                                Debug.Print("Datei geschlossen");
                                logger.Log("File closed");
                                #endif

                                processingLocationInfo(LoggedEvents);

                                LoggedEvents.Clear();
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    Debug.Print("AnalyseError");
                    logger.Log(ex.Message + "\n" + ex.StackTrace + "\n\n");
                }

                #if extScanLog
                logger.Log("sleeping...");
                logger.Log("\n\n\n");
                Debug.Print("\n\n\n");
                #endif

                m_LogfileScanner_ARE.WaitOne();

                #if extScanLog
                logger.Log("awake...");
                #endif
            }while (!m_Closing);

            #if extScanLog
            Debug.Print("out");
            #endif
        }