Esempio n. 1
0
        private void FSEventListAnalysisTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            List <FSSyncEvent>  WorkingList;
            List <FSSyncEvent>  TempList;
            FSSyncEvent         TempEvent;
            FSSyncEvent         MyEvent;
            BasicActionEnum     TempFileChainStatus;
            string              TempFinalFileName  = String.Empty;
            string              TempFinalFileName2 = String.Empty;
            VirtualFile         TempVirtualFile;
            SyncEventIgnoreItem SEII;

            List <FSSyncEvent> FilteredList = new List <FSSyncEvent>();

            lock (FSEventListLock)
            {
                //Extract the list for analysis
                WorkingList = ObjectCopier.Clone(FSEventList);
                FSEventList.Clear();
            }

            #region Event Analysis

            for (int i = 0; i < WorkingList.Count; i++)
            {
                WorkingList[i].Index = i;                                         //Reindex the list of actions
            }
            lock (FSEventListAnalysisLock)
            {
                while (WorkingList.Count > 0)
                {
                    MyEvent = WorkingList[0];

                    switch (MyEvent.Action)
                    {
                    case BasicActionEnum.Created:

                        //Detect Temporary : Create / Update / Delete in the same batch
                        TempEvent = WorkingList.Find(x => x.Action.Equals(BasicActionEnum.Deleted) && x.Index > MyEvent.Index && x.OldOrCurrentFilePathFull.Equals(MyEvent.OldOrCurrentFilePathFull));
                        if (TempEvent != null)
                        {
                            //Log(String.Format("File {0} was temporary", MyEvent.OldOrCurrentFilePathFull)); //Temporary file, do nothing about it
                            WorkingList.Remove(TempEvent);
                        }
                        else
                        {
                            //Remove multiple Changed events for the same file
                            TempList = WorkingList.FindAll((x => x.Action.Equals(BasicActionEnum.Changed) && x.OldOrCurrentFilePathFull.Equals(MyEvent.OldOrCurrentFilePathFull)));
                            if (TempList != null)
                            {
                                foreach (FSSyncEvent xe in TempList)
                                {
                                    WorkingList.Remove(xe);
                                }
                            }

                            //Check what happened to this new file
                            TempFileChainStatus = BuildFileEventChain(MyEvent.OldOrCurrentFilePathFull, MyEvent.Index, WorkingList, ref TempFinalFileName /*, ref TempIndex*/);
                            if (TempFileChainStatus.Equals(BasicActionEnum.Renamed))
                            {
                                FilteredList.Add(new FSSyncEvent(BasicActionEnum.Created, TempFinalFileName, ""));
                                //Log(String.Format("File was created with name {0} and finally renamed to {1}", MyEvent.OldOrCurrentFilePathFull, TempFinalFileName));
                            }
                            else if (TempFileChainStatus.Equals(BasicActionEnum.Deleted))
                            {
                                //Log(String.Format("File {0} was a temporary file",MyEvent.OldOrCurrentFilePathFull));
                            }
                            else
                            {
                                FilteredList.Add(new FSSyncEvent(BasicActionEnum.Created, MyEvent.OldOrCurrentFilePathFull, ""));
                                //Log(String.Format("File {0} is new", MyEvent.OldOrCurrentFilePathFull));
                            }
                        }

                        break;

                    case BasicActionEnum.Changed:

                        //Is there are subsequent changes for this file, ignore them
                        WorkingList.RemoveAll((x => x.Action.Equals(BasicActionEnum.Changed) && x.Index > MyEvent.Index && x.OldOrCurrentFilePathFull.Equals(MyEvent.OldOrCurrentFilePathFull)));

                        //Check if the file is not deleted in a next step
                        TempEvent = WorkingList.Find(x => x.Action.Equals(BasicActionEnum.Deleted) && x.Index > MyEvent.Index && x.OldOrCurrentFileName.Equals(MyEvent.OldOrCurrentFileName));
                        if (TempEvent != null)
                        {
                            //Log(String.Format("File {0} was deleted", MyEvent.OldOrCurrentFilePathFull));
                            FilteredList.Add(new FSSyncEvent(BasicActionEnum.Deleted, MyEvent.OldOrCurrentFilePathFull, ""));
                            WorkingList.Remove(TempEvent);
                        }
                        else
                        {
                            //Log(String.Format("File {0} has changed", MyEvent.OldOrCurrentFilePathFull));
                            FilteredList.Add(new FSSyncEvent(BasicActionEnum.Changed, MyEvent.OldOrCurrentFilePathFull, ""));
                        }

                        break;

                    case BasicActionEnum.Deleted:
                        //Check if there is a following Create for the same file name, means it has been moved
                        //TODO : Maybe Move detected should be made on more than the filename / can add last modification date
                        TempEvent = WorkingList.Find(x => x.Action.Equals(BasicActionEnum.Created) && x.Index > MyEvent.Index && x.OldOrCurrentFileName.Equals(MyEvent.OldOrCurrentFileName));
                        if (TempEvent != null)
                        {
                            if (MyEvent.OldOrCurrentFilePathFull.Equals(TempEvent.OldOrCurrentFilePathFull))
                            {
                                //Log(String.Format("File {0} has been updated", MyEvent.OldOrCurrentFilePathFull)); //A file moved to the same location is an updated file and not a moved file
                                FilteredList.Add(new FSSyncEvent(BasicActionEnum.Changed, MyEvent.OldOrCurrentFilePathFull, ""));
                            }
                            else
                            {
                                //Log(String.Format("File {0} has moved to {1}", MyEvent.OldOrCurrentFilePathFull, TempEvent.OldOrCurrentFilePathFull));
                                FilteredList.Add(new FSSyncEvent(BasicActionEnum.Moved, MyEvent.OldOrCurrentFilePathFull, TempEvent.OldOrCurrentFilePathFull));
                            }

                            WorkingList.Remove(TempEvent);
                        }
                        else
                        {
                            //Log(String.Format("File {0} has been deleted", MyEvent.OldOrCurrentFilePathFull));
                            FilteredList.Add(new FSSyncEvent(BasicActionEnum.Deleted, MyEvent.OldOrCurrentFilePathFull, ""));
                        }
                        break;

                    case BasicActionEnum.Renamed:

                        TempFileChainStatus = BuildFileEventChain(MyEvent.NewFilePathFull, MyEvent.Index, WorkingList, ref TempFinalFileName /*, ref TempIndex*/);
                        if (TempFileChainStatus.Equals(BasicActionEnum.Renamed))
                        {
                            //Log(String.Format("File {0} was renamed to {1}", MyEvent.OldOrCurrentFilePathFull, TempFinalFileName));
                            FilteredList.Add(new FSSyncEvent(BasicActionEnum.Renamed, MyEvent.OldOrCurrentFilePathFull, TempFinalFileName));
                        }
                        else if (TempFileChainStatus.Equals(BasicActionEnum.Deleted))
                        {
                            //Log(String.Format("File {0} has been renammed and then deleted", MyEvent.OldOrCurrentFilePathFull));
                            FilteredList.Add(new FSSyncEvent(BasicActionEnum.Deleted, MyEvent.OldOrCurrentFilePathFull, ""));
                        }
                        else
                        {
                            //Log(String.Format("File {0} was renamed to {1}", MyEvent.OldOrCurrentFilePathFull, MyEvent.NewFilePathFull));
                            FilteredList.Add(new FSSyncEvent(BasicActionEnum.Renamed, MyEvent.OldOrCurrentFilePathFull, MyEvent.NewFilePathFull));
                        }

                        break;
                    }

                    WorkingList.Remove(MyEvent);
                }
            }

            #endregion

            #region Office documents handling

            for (int i = 0; i < FilteredList.Count; i++)
            {
                FilteredList[i].Index = i;
            }

            //Ms office changed documents will appear as Created and Deleted in the same round, detect this here
            TempList = FilteredList.FindAll(x => x.Action.Equals(BasicActionEnum.Created));
            for (int i = 0; i < TempList.Count; i++)
            {
                TempEvent = FilteredList.Find(x => x.Action.Equals(BasicActionEnum.Deleted) && x.Index > TempList[i].Index && x.OldOrCurrentFilePathFull.Equals(TempList[i].OldOrCurrentFilePathFull) && File.Exists(TempList[i].OldOrCurrentFilePathFull));
                if (TempEvent != null)
                {
                    //Office document upgrade detected
                    FilteredList.Add(new FSSyncEvent(BasicActionEnum.Changed, TempEvent.OldOrCurrentFilePathFull, ""));
                    FilteredList.Remove(TempEvent);
                    FilteredList.Remove(TempList[i]);
                }
            }

            //Ms office changed documents will appear as Deleted and Created in the same round, detect this here
            for (int i = 0; i < FilteredList.Count; i++)
            {
                FilteredList[i].Index = i;
            }
            TempList = FilteredList.FindAll(x => x.Action.Equals(BasicActionEnum.Deleted));
            for (int i = 0; i < TempList.Count; i++)
            {
                TempEvent = FilteredList.Find(x => x.Action.Equals(BasicActionEnum.Created) && x.Index > TempList[i].Index && x.OldOrCurrentFilePathFull.Equals(TempList[i].OldOrCurrentFilePathFull));
                if (TempEvent != null)
                {
                    //Office document upgrade detected
                    FilteredList.Add(new FSSyncEvent(BasicActionEnum.Changed, TempEvent.OldOrCurrentFilePathFull, ""));
                    FilteredList.Remove(TempEvent);
                    FilteredList.Remove(TempList[i]);
                }
            }

            //Remove Office Temporary files
            FilteredList.RemoveAll(x => x.Action.Equals(BasicActionEnum.Created) && x.OldOrCurrentFileName.StartsWith("~"));
            FilteredList.RemoveAll(x => x.Action.Equals(BasicActionEnum.Deleted) && x.OldOrCurrentFileName.StartsWith("~"));

            #endregion

            #region Dispatch Events

            if (FilteredList.Count > 0)
            {
                lock (FSIgnoreEventListLock)
                {
                    for (int i = 0; i < FilteredList.Count; i++)
                    {
                        OnLog(String.Format("[{0}] - {1} -> {2}", FilteredList[i].Action.ToString(), FilteredList[i].OldOrCurrentFileName, FilteredList[i].NewFileName));
                        switch (FilteredList[i].Action)
                        {
                        case BasicActionEnum.Created:

                            //Is this an event to be ignored ?
                            SEII = FSIgnoreEventList.Find(x => (x.Event & SyncEventEnum.LocalCreate) > 0 && x.NewOrCurrentFilePathFull.Equals(FilteredList[i].OldOrCurrentFilePathFull));
                            if (SEII == null)
                            {
                                if (File.Exists(FilteredList[i].OldOrCurrentFilePathFull))
                                {
                                    OnEvent(new SyncEventItem(SyncEventEnum.LocalCreate, FilteredList[i].OldOrCurrentFilePathFull, false, false));
                                }
                            }
                            else
                            {
                                FSIgnoreEventList.Remove(SEII);
                                OnLog("Event Ignored");
                            }
                            break;

                        case BasicActionEnum.Deleted:

                            //Is there a file with this name ?
                            TempVirtualFile = _RootVirtualFolder.FindFileBasedOnPath(GetRelativeFilePath(FilteredList[i].OldOrCurrentFilePathFull));
                            if (TempVirtualFile != null)
                            {
                                //Is this an event to be ignored ?
                                SEII = FSIgnoreEventList.Find(x => (x.Event & SyncEventEnum.LocalDelete) > 0 && x.NewOrCurrentFilePathFull.Equals(FilteredList[i].OldOrCurrentFilePathFull));
                                if (SEII == null)
                                {
                                    OnEvent(new SyncEventItem(SyncEventEnum.LocalDelete, TempVirtualFile.FileId, false, false));
                                }
                                else
                                {
                                    FSIgnoreEventList.Remove(SEII);
                                    OnLog("Event Ignored");
                                }
                            }

                            /*
                             * else
                             * {
                             *  //This is a folder
                             *  var TempVirtualFileList = _RootVirtualFolder.FindAllFilesBasedOnFolder(GetRelativeFilePath(FilteredList[i].OldOrCurrentFilePathFull) + @"\");
                             *  for (int k = 0; k < TempVirtualFileList.Count; k++)
                             *  {
                             *      SubTempVirtualFile = _RootVirtualFolder.FindFileBasedOnPath(TempVirtualFileList[k].FilePathRelative);
                             *      if (SubTempVirtualFile != null)
                             *      {
                             *          OnLog(String.Format("Found file {0}", SubTempVirtualFile.FilePathRelative));
                             *          OnDeleted(new SyncEventItem(SyncEventEnum.LocalDelete, SubTempVirtualFile.FileId));
                             *      }
                             *  }
                             * }
                             */
                            break;

                        case BasicActionEnum.Moved:

                            //Is this an event to be ignored ?
                            SEII = FSIgnoreEventList.Find(x => (x.Event & SyncEventEnum.LocalMove) > 0 && x.NewOrCurrentFilePathFull.Equals(FilteredList[i].NewFilePathFull));
                            if (SEII == null)
                            {
                                if (File.Exists(FilteredList[i].NewFilePathFull))
                                {
                                    OnEvent(new SyncEventItem(SyncEventEnum.LocalMove, Guid.Empty, FilteredList[i].NewFilePathFull, FilteredList[i].OldOrCurrentFilePathFull, false, false));
                                }
                            }
                            else
                            {
                                FSIgnoreEventList.Remove(SEII);
                                OnLog("Event Ignored");
                            }
                            break;

                        case BasicActionEnum.Renamed:

                            //Is there a file with this name ?
                            TempVirtualFile = _RootVirtualFolder.FindFileBasedOnPath(GetRelativeFilePath(FilteredList[i].OldOrCurrentFilePathFull));
                            if (TempVirtualFile != null)
                            {
                                //Is this an event to be ignored ?
                                SEII = FSIgnoreEventList.Find(x => (x.Event & SyncEventEnum.LocalRename) > 0 && x.NewOrCurrentFilePathFull.Equals(FilteredList[i].NewFilePathFull));
                                if (SEII == null)
                                {
                                    OnEvent(new SyncEventItem(SyncEventEnum.LocalRename, Guid.Empty, FilteredList[i].NewFilePathFull, FilteredList[i].OldOrCurrentFilePathFull, false, false));
                                }
                                else
                                {
                                    FSIgnoreEventList.Remove(SEII);
                                    OnLog("Event Ignored");
                                }
                            }

                            /*else
                             * {
                             *  //This is a folder
                             *  var TempVirtualFileList = _RootVirtualFolder.FindAllFilesBasedOnFolder(GetRelativeFilePath(FilteredList[i].OldOrCurrentFilePathFull) + @"\");
                             *  for (int k = 0; k < TempVirtualFileList.Count; k++)
                             *  {
                             *      SubTempVirtualFile = _RootVirtualFolder.FindFileBasedOnPath(TempVirtualFileList[k].FilePathRelative);
                             *      if (SubTempVirtualFile != null)
                             *      {
                             *          OnLog(String.Format("Found file {0}", SubTempVirtualFile.FilePathRelative));
                             *          OnRenamed(new SyncEventItem(SyncEventEnum.LocalRename, Guid.Empty, SubTempVirtualFile.FilePathRelative.Replace(GetRelativeFilePath(FilteredList[i].OldOrCurrentFilePathFull), GetRelativeFilePath(FilteredList[i].NewFilePathFull)), SubTempVirtualFile.FilePathRelative));
                             *      }
                             *  }
                             * }
                             */
                            break;

                        case BasicActionEnum.Changed:

                            //Is this an event to be ignored ?
                            SEII = FSIgnoreEventList.Find(x => (x.Event & SyncEventEnum.LocalUpdate) > 0 && x.NewOrCurrentFilePathFull.Equals(FilteredList[i].OldOrCurrentFilePathFull));
                            if (SEII == null)
                            {
                                if (File.Exists(FilteredList[i].OldOrCurrentFilePathFull))
                                {
                                    OnEvent(new SyncEventItem(SyncEventEnum.LocalUpdate, FilteredList[i].OldOrCurrentFilePathFull, false, false));
                                }
                            }
                            else
                            {
                                FSIgnoreEventList.Remove(SEII);
                                OnLog("Event Ignored");
                            }
                            break;
                        }
                    }
                }
            }

            #endregion
        }
Esempio n. 2
0
        /// <summary>
        /// what the simulation every day does
        /// </summary>
        public void Simulation()
        {
            if (!Initialized)
            {
                FireAusgabe("Initialisierung noch nicht abgeschlossen! Zuerst müssen alle Personen geladen werden.");
                return;
            }

            try
            {
                this.SaveAktuellerTagToDb();
                foreach (Person person in workingList)
                {
                    //check if person is still alive; if not you have nothing to do here
                    if (!person.Lebend)
                    {
                        continue;
                    }

                    //gets the age of the person and his/her partner when a partner exists
                    //int alter = startDatum.AddDays(vergangeneTage).Year - person.Geburtsdatum.Year;
                    //int alterPartner = 0;
                    int alterDurchschnitt = 0;
                    if (person.MeinPartner != null)
                    {
                        //person.MeinPartner.Alter = startDatum.AddDays(vergangeneTage).Year - person.MeinPartner.Geburtsdatum.Year;
                        alterDurchschnitt = (person.Alter + person.MeinPartner.Alter) / 2;
                    }

                    //after 9 months carrying that little person in you, you feel good to see your baby
                    if (person.IsSchwanger && person.WirdKindGebaerenAnTag == aktuellerTag)
                    {
                        person.GebaereKind();
                    }

                    //celebrate your birthday by sharing it with others
                    if (person.Geburtsdatum.Month == aktuellerTag.Month && person.Geburtsdatum.Day == aktuellerTag.Day && person.Alter == 16)
                    {
                        FireAusgabe(person.Vorname + " " + person.Familienname + " hat Geburtstag und wird " + person.Alter + " Jahre alt.");
                    }

                    //chance of max 19.4% to get the girlfriend pregnant (chance depends on the summed up age of both partners and on the count of children they already have and decreases when the people gets older and get more children)
                    if (person.MeinPartner != null && !person.IsSchwanger && !person.MeinPartner.IsSchwanger)
                    {
                        double x     = 0;
                        int    iNext = rand.Next();
                        if (alterDurchschnitt < 32)
                        {
                            if (person.Partner != 0 && iNext % 10000 < ((200.0 / alterDurchschnitt) / (Math.Pow(person.Kinder.Count + 1, 2))))
                            {
                                person.ZeugeKind();
                            }
                        }
                        else if (alterDurchschnitt < 46)
                        {
                            if (person.Partner != 0 && iNext % 10000 < ((350.0 / alterDurchschnitt) / (Math.Pow(person.Kinder.Count + 1, 2))))
                            {
                                person.ZeugeKind();
                            }
                        }
                        else if (person.Partner != 0 && iNext % 10000 < (x = (55.0 / alterDurchschnitt) / (Math.Pow(person.Kinder.Count + 1, 3))) && x > 0)
                        {
                            person.ZeugeKind();
                        }
                    }

                    //chance of 0.1% to find a partner
                    if (person.DarfPartner && rand.Next() % 1000 < 1)
                    {
                        person.SuchePartner();
                    }


                    //chance of min 0.0001% to kill the person by old age when they reached 80 years (increases the older the person is)
                    if (person.Alter > 80)
                    {
                        int iNext = rand.Next();
                        if (iNext % 10000 < 0.1 * person.Alter)
                        {
                            person.Sterben();
                        }
                    }

                    //zuEntfernende.Enqueue(person);
                    //neuHinzuzufuegende.Enqueue(person);
                }
            }
            finally
            {
                if (ZuEntfernende.Count > 0 || NeuHinzuzufuegende.Count > 0)
                {
                    while (ZuEntfernende.Count > 0)
                    {
                        Person entf = ZuEntfernende.Dequeue();
                        entf.PersonAusgabe -= Person_PersonAusgabe;
                        WorkingList.Remove(entf);
                    }
                    while (NeuHinzuzufuegende.Count > 0)
                    {
                        Person add = NeuHinzuzufuegende.Dequeue();
                        add.PersonAusgabe += Person_PersonAusgabe;
                        WorkingList.Add(add);
                    }
                    WorkingList.Sort(SortTheList);
                    this.ListChanged?.Invoke(this, new EventArgs());
                }
                aktuellerTag = aktuellerTag.AddDays(1);
            }
        }
        private void FSEventListAnalysisTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            List <FSSyncEvent>   WorkingList;
            List <FSSyncEvent>   WorkingListFiltered = new List <FSSyncEvent>();
            List <FSSyncEvent>   TempSubList;
            FSSyncEvent          TempEvent;
            FSSyncEvent          MyEvent;
            EventFileChainResult TempFileChainStatus;
            string              TempFinalFileName  = String.Empty;
            string              TempFinalFileName2 = String.Empty;
            VirtualFile         TempVirtualFile;
            SyncEventIgnoreItem SEII;

            lock (FSEventListLock)
            {
                //Extract the list for analysis
                WorkingList = ObjectCopier.Clone(FSEventList);
                FSEventList.Clear();
            }

            #region Event Analysis

            for (int i = 0; i < WorkingList.Count; i++)
            {
                WorkingList[i].Index = i;                                         //Reindex the list of actions
            }
            lock (FSEventListAnalysisLock)
            {
                while (WorkingList.Count > 0)
                {
                    MyEvent = WorkingList[0];

                    switch (MyEvent.Action)
                    {
                    case BasicActionEnum.FileCreated:

                        #region

                        //Detect Temporary : Create / Update / Delete in the same batch
                        TempEvent = WorkingList.Find(x => x.Action.Equals(BasicActionEnum.FileDeleted) && x.Index > MyEvent.Index && x.OldOrCurrentFilePathFull.Equals(MyEvent.OldOrCurrentFilePathFull));
                        if (TempEvent != null)
                        {
                            //Log(String.Format("File {0} was temporary", MyEvent.OldOrCurrentFilePathFull)); //Temporary file, do nothing about it
                            WorkingList.Remove(TempEvent);
                        }
                        else
                        {
                            //Remove multiple Changed events for the same file
                            TempSubList = WorkingList.FindAll((x => x.Action.Equals(BasicActionEnum.FileChanged) && x.OldOrCurrentFilePathFull.Equals(MyEvent.OldOrCurrentFilePathFull) && x.Index > MyEvent.Index));
                            if (TempSubList != null)
                            {
                                foreach (FSSyncEvent xe in TempSubList)
                                {
                                    WorkingList.Remove(xe);
                                }
                            }

                            //Check what happened to this new file
                            TempFileChainStatus = BuildFileEventChain(MyEvent.OldOrCurrentFilePathFull, MyEvent.Index, WorkingList, ref TempFinalFileName);
                            if (TempFileChainStatus.Action.Equals(BasicActionEnum.FileRenamed))
                            {
                                WorkingListFiltered.Add(new FSSyncEvent(BasicActionEnum.FileCreated, TempFinalFileName, "", TempFileChainStatus.ElementIndex));

                                //Log(String.Format("File was created with name {0} and finally renamed to {1}", MyEvent.OldOrCurrentFilePathFull, TempFinalFileName));
                                TempSubList = WorkingList.FindAll((x => x.Action.Equals(BasicActionEnum.FileChanged) && x.OldOrCurrentFilePathFull.Equals(TempFinalFileName) && x.Index > TempFileChainStatus.ElementIndex));
                                if (TempSubList != null)
                                {
                                    foreach (FSSyncEvent xe in TempSubList)
                                    {
                                        WorkingList.Remove(xe);
                                    }
                                }
                            }
                            else if (TempFileChainStatus.Action.Equals(BasicActionEnum.FileDeleted))
                            {
                                //Log(String.Format("File {0} was a temporary file",MyEvent.OldOrCurrentFilePathFull));
                            }
                            else
                            {
                                WorkingListFiltered.Add(new FSSyncEvent(BasicActionEnum.FileCreated, MyEvent.OldOrCurrentFilePathFull, "", TempFileChainStatus.ElementIndex));
                                //Log(String.Format("File {0} is new", MyEvent.OldOrCurrentFilePathFull));
                            }
                        }

                        #endregion

                        break;

                    case BasicActionEnum.FileChanged:

                        #region

                        //Is there are subsequent changes for this file, ignore them
                        WorkingList.RemoveAll((x => x.Action.Equals(BasicActionEnum.FileChanged) && x.Index > MyEvent.Index && x.OldOrCurrentFilePathFull.Equals(MyEvent.OldOrCurrentFilePathFull)));

                        //Check if the file is not deleted in a next step
                        TempEvent = WorkingList.Find(x => x.Action.Equals(BasicActionEnum.FileDeleted) && x.Index > MyEvent.Index && x.OldOrCurrentFileName.Equals(MyEvent.OldOrCurrentFileName));
                        if (TempEvent != null)
                        {
                            //Log(String.Format("File {0} was deleted", MyEvent.OldOrCurrentFilePathFull));
                            WorkingListFiltered.Add(new FSSyncEvent(BasicActionEnum.FileDeleted, MyEvent.OldOrCurrentFilePathFull, ""));
                            WorkingList.Remove(TempEvent);
                        }
                        else
                        {
                            //Log(String.Format("File {0} has changed", MyEvent.OldOrCurrentFilePathFull));
                            WorkingListFiltered.Add(new FSSyncEvent(BasicActionEnum.FileChanged, MyEvent.OldOrCurrentFilePathFull, ""));
                        }

                        #endregion

                        break;

                    case BasicActionEnum.FileDeleted:

                        #region

                        //Check if there is a following Create for the same file name, means it has been moved
                        //TODO : Maybe Move detection should be made on more than the filename / can add last modification date. This requires to make a request to the VirtualRootFolder and get a FileInfo on the new file
                        TempEvent = WorkingList.Find(x => x.Action.Equals(BasicActionEnum.FileCreated) && x.Index > MyEvent.Index && x.OldOrCurrentFileName.Equals(MyEvent.OldOrCurrentFileName));
                        if (TempEvent != null)
                        {
                            if (MyEvent.OldOrCurrentFilePathFull.Equals(TempEvent.OldOrCurrentFilePathFull))
                            {
                                //Log(String.Format("File {0} has been updated", MyEvent.OldOrCurrentFilePathFull)); //A file moved to the same location is an updated file and not a moved file
                                WorkingListFiltered.Add(new FSSyncEvent(BasicActionEnum.FileChanged, MyEvent.OldOrCurrentFilePathFull, ""));
                            }
                            else
                            {
                                //Log(String.Format("File {0} has moved to {1}", MyEvent.OldOrCurrentFilePathFull, TempEvent.OldOrCurrentFilePathFull));
                                WorkingListFiltered.Add(new FSSyncEvent(BasicActionEnum.FileMoved, MyEvent.OldOrCurrentFilePathFull, TempEvent.OldOrCurrentFilePathFull));
                            }

                            WorkingList.Remove(TempEvent);
                        }
                        else
                        {
                            //Log(String.Format("File {0} has been deleted", MyEvent.OldOrCurrentFilePathFull));
                            WorkingListFiltered.Add(new FSSyncEvent(BasicActionEnum.FileDeleted, MyEvent.OldOrCurrentFilePathFull, ""));
                        }

                        #endregion

                        break;

                    case BasicActionEnum.FileRenamed:

                        #region

                        TempFileChainStatus = BuildFileEventChain(MyEvent.NewFilePathFull, MyEvent.Index, WorkingList, ref TempFinalFileName);
                        if (TempFileChainStatus.Action.Equals(BasicActionEnum.FileRenamed))
                        {
                            //Log(String.Format("File {0} was renamed to {1}", MyEvent.OldOrCurrentFilePathFull, TempFinalFileName));
                            WorkingListFiltered.Add(new FSSyncEvent(BasicActionEnum.FileRenamed, MyEvent.OldOrCurrentFilePathFull, TempFinalFileName, TempFileChainStatus.ElementIndex));
                        }
                        else if (TempFileChainStatus.Action.Equals(BasicActionEnum.FileDeleted))
                        {
                            //Log(String.Format("File {0} has been renammed and then deleted", MyEvent.OldOrCurrentFilePathFull));
                            WorkingListFiltered.Add(new FSSyncEvent(BasicActionEnum.FileDeleted, MyEvent.OldOrCurrentFilePathFull, "", TempFileChainStatus.ElementIndex));
                        }
                        else
                        {
                            //Log(String.Format("File {0} was renamed to {1}", MyEvent.OldOrCurrentFilePathFull, MyEvent.NewFilePathFull));
                            WorkingListFiltered.Add(new FSSyncEvent(BasicActionEnum.FileRenamed, MyEvent.OldOrCurrentFilePathFull, MyEvent.NewFilePathFull, TempFileChainStatus.ElementIndex));
                        }

                        #endregion

                        break;

                    default:
                        //Passthrough events
                        WorkingListFiltered.Add(MyEvent);
                        break;
                    }

                    WorkingList.Remove(MyEvent);
                }
            }

            #endregion

            #region Office documents handling

            for (int i = 0; i < WorkingListFiltered.Count; i++)
            {
                WorkingListFiltered[i].Index = i;
            }

            //Ms office changed documents will appear as Created and Deleted in the same round, detect this here
            TempSubList = WorkingListFiltered.FindAll(x => x.Action.Equals(BasicActionEnum.FileCreated));
            for (int i = 0; i < TempSubList.Count; i++)
            {
                TempEvent = WorkingListFiltered.Find(x => x.Action.Equals(BasicActionEnum.FileDeleted) && x.Index > TempSubList[i].Index && x.OldOrCurrentFilePathFull.Equals(TempSubList[i].OldOrCurrentFilePathFull) && File.Exists(TempSubList[i].OldOrCurrentFilePathFull));
                if (TempEvent != null)
                {
                    //Office document upgrade detected
                    WorkingListFiltered.Add(new FSSyncEvent(BasicActionEnum.FileChanged, TempEvent.OldOrCurrentFilePathFull, ""));
                    WorkingListFiltered.Remove(TempEvent);
                    WorkingListFiltered.Remove(TempSubList[i]);
                }
            }

            //Ms office changed documents will appear as Deleted and Created in the same round, detect this here
            for (int i = 0; i < WorkingListFiltered.Count; i++)
            {
                WorkingListFiltered[i].Index = i;
            }
            TempSubList = WorkingListFiltered.FindAll(x => x.Action.Equals(BasicActionEnum.FileDeleted));
            for (int i = 0; i < TempSubList.Count; i++)
            {
                TempEvent = WorkingListFiltered.Find(x => x.Action.Equals(BasicActionEnum.FileCreated) && x.Index > TempSubList[i].Index && x.OldOrCurrentFilePathFull.Equals(TempSubList[i].OldOrCurrentFilePathFull));
                if (TempEvent != null)
                {
                    //Office document upgrade detected
                    WorkingListFiltered.Add(new FSSyncEvent(BasicActionEnum.FileChanged, TempEvent.OldOrCurrentFilePathFull, ""));
                    WorkingListFiltered.Remove(TempEvent);
                    WorkingListFiltered.Remove(TempSubList[i]);
                }
            }

            //Remove Office Temporary files
            WorkingListFiltered.RemoveAll(x => x.Action.Equals(BasicActionEnum.FileCreated) && x.OldOrCurrentFileName.StartsWith("~"));
            WorkingListFiltered.RemoveAll(x => x.Action.Equals(BasicActionEnum.FileDeleted) && x.OldOrCurrentFileName.StartsWith("~"));
            WorkingListFiltered.RemoveAll(x => x.Action.Equals(BasicActionEnum.FileCreated) && x.OldOrCurrentFileName.StartsWith(".DS_Store"));
            WorkingListFiltered.RemoveAll(x => x.Action.Equals(BasicActionEnum.FileDeleted) && x.OldOrCurrentFileName.StartsWith(".DS_Store"));

            #endregion

            #region Dispatch Events

            WorkingListFiltered.Sort(); //Sort events. We do that so that detected file chain event do not occur before other events on which they depend (ex : file move before folder creation)

            if (WorkingListFiltered.Count > 0)
            {
                lock (FSIgnoreEventListLock)
                {
                    for (int i = 0; i < WorkingListFiltered.Count; i++)
                    {
                        switch (WorkingListFiltered[i].Action)
                        {
                        case BasicActionEnum.FileCreated:

                            #region

                            //Is this an event to be ignored ?
                            SEII = FSIgnoreEventList.Find(x => (x.Event & SyncEventEnum.LocalCreate) > 0 && x.NewOrCurrentFilePathFull.Equals(WorkingListFiltered[i].OldOrCurrentFilePathFull));
                            if (SEII == null)
                            {
                                OnLog(String.Format("[{0}] - {1}", WorkingListFiltered[i].Action.ToString(), WorkingListFiltered[i].OldOrCurrentFileName));
                                OnEvent(new SyncEventItem(SyncEventEnum.LocalCreate, WorkingListFiltered[i].OldOrCurrentFilePathFull, false, false));
                            }
                            else
                            {
                                OnLog(String.Format("[{0}][Ignored] - {1}", WorkingListFiltered[i].Action.ToString(), WorkingListFiltered[i].OldOrCurrentFileName));
                                FSIgnoreEventList.Remove(SEII);
                            }

                            #endregion

                            break;

                        case BasicActionEnum.FileDeleted:

                            #region

                            //Is there a file with this name ?
                            TempVirtualFile = (VirtualFile)_RootVirtualFolder.FlatElementsGetElementBasedOnPath(GetRelativeFilePath(WorkingListFiltered[i].OldOrCurrentFilePathFull), VirtualElementType.File, false);
                            if (TempVirtualFile != null)
                            {
                                //Is this an event to be ignored ?
                                SEII = FSIgnoreEventList.Find(x => (x.Event & SyncEventEnum.LocalDelete) > 0 && x.NewOrCurrentFilePathFull.Equals(WorkingListFiltered[i].OldOrCurrentFilePathFull));
                                if (SEII == null)
                                {
                                    OnLog(String.Format("[{0}] - {1}", WorkingListFiltered[i].Action.ToString(), WorkingListFiltered[i].OldOrCurrentFileName));
                                    OnEvent(new SyncEventItem(SyncEventEnum.LocalDelete, TempVirtualFile.ElementId, false, false));
                                }
                                else
                                {
                                    OnLog(String.Format("[{0}][Ignored] - {1}", WorkingListFiltered[i].Action.ToString(), WorkingListFiltered[i].OldOrCurrentFileName));
                                    FSIgnoreEventList.Remove(SEII);
                                }
                            }
                            //Obsolete
                            //else
                            //{
                            //    //This is a folder
                            //    var TempVirtualFileList = _RootVirtualFolder.FindAllFilesBasedOnFolder(GetRelativeFilePath(FilteredList[i].OldOrCurrentFilePathFull) + @"\");
                            //    for (int k = 0; k < TempVirtualFileList.Count; k++)
                            //    {
                            //        SubTempVirtualFile = _RootVirtualFolder.FindFileBasedOnPath(TempVirtualFileList[k].FilePathRelative);
                            //        if (SubTempVirtualFile != null)
                            //        {
                            //            OnLog(String.Format("Found file {0}", SubTempVirtualFile.FilePathRelative));
                            //            OnDeleted(new SyncEventItem(SyncEventEnum.LocalDelete, SubTempVirtualFile.FileId));
                            //        }
                            //    }
                            //}
                            #endregion

                            break;

                        case BasicActionEnum.FileMoved:

                            #region

                            //Is this an event to be ignored ?
                            SEII = FSIgnoreEventList.Find(x => (x.Event & SyncEventEnum.LocalMove) > 0 && x.NewOrCurrentFilePathFull.Equals(WorkingListFiltered[i].NewFilePathFull));
                            if (SEII == null)
                            {
                                OnLog(String.Format("[{0}] - {1} -> {2}", WorkingListFiltered[i].Action.ToString(), WorkingListFiltered[i].OldOrCurrentFileName, WorkingListFiltered[i].NewFileName));
                                OnEvent(new SyncEventItem(SyncEventEnum.LocalMove, Guid.Empty, WorkingListFiltered[i].NewFilePathFull, WorkingListFiltered[i].OldOrCurrentFilePathFull, false, false));
                            }
                            else
                            {
                                OnLog(String.Format("[{0}][Ignored] - {1} -> {2}", WorkingListFiltered[i].Action.ToString(), WorkingListFiltered[i].OldOrCurrentFileName, WorkingListFiltered[i].NewFileName));
                                FSIgnoreEventList.Remove(SEII);
                            }

                            #endregion

                            break;

                        case BasicActionEnum.FileRenamed:

                            #region

                            //Is there a file with this name ?
                            TempVirtualFile = (VirtualFile)_RootVirtualFolder.FlatElementsGetElementBasedOnPath(GetRelativeFilePath(WorkingListFiltered[i].OldOrCurrentFilePathFull), VirtualElementType.File, false);
                            if (TempVirtualFile != null)
                            {
                                //Is this an event to be ignored ?
                                SEII = FSIgnoreEventList.Find(x => (x.Event & SyncEventEnum.LocalRename) > 0 && x.NewOrCurrentFilePathFull.Equals(WorkingListFiltered[i].NewFilePathFull));
                                if (SEII == null)
                                {
                                    OnLog(String.Format("[{0}] - {1} -> {2}", WorkingListFiltered[i].Action.ToString(), WorkingListFiltered[i].OldOrCurrentFileName, WorkingListFiltered[i].NewFileName));
                                    OnEvent(new SyncEventItem(SyncEventEnum.LocalRename, WorkingListFiltered[i].NewFilePathFull, WorkingListFiltered[i].OldOrCurrentFilePathFull, false, false));
                                }
                                else
                                {
                                    OnLog(String.Format("[{0}][Ignored] - {1} -> {2}", WorkingListFiltered[i].Action.ToString(), WorkingListFiltered[i].OldOrCurrentFileName, WorkingListFiltered[i].NewFileName));
                                    FSIgnoreEventList.Remove(SEII);
                                }
                            }
                            //Obsolete
                            //else
                            //{
                            //    //This is a folder
                            //    var TempVirtualFileList = _RootVirtualFolder.FindAllFilesBasedOnFolder(GetRelativeFilePath(FilteredList[i].OldOrCurrentFilePathFull) + @"\");
                            //    for (int k = 0; k < TempVirtualFileList.Count; k++)
                            //    {
                            //        SubTempVirtualFile = _RootVirtualFolder.FindFileBasedOnPath(TempVirtualFileList[k].FilePathRelative);
                            //        if (SubTempVirtualFile != null)
                            //        {
                            //            OnLog(String.Format("Found file {0}", SubTempVirtualFile.FilePathRelative));
                            //            OnRenamed(new SyncEventItem(SyncEventEnum.LocalRename, Guid.Empty, SubTempVirtualFile.FilePathRelative.Replace(GetRelativeFilePath(FilteredList[i].OldOrCurrentFilePathFull), GetRelativeFilePath(FilteredList[i].NewFilePathFull)), SubTempVirtualFile.FilePathRelative));
                            //        }
                            //    }
                            //}

                            #endregion

                            break;

                        case BasicActionEnum.FileChanged:

                            #region

                            //Is this an event to be ignored ?
                            SEII = FSIgnoreEventList.Find(x => (x.Event & SyncEventEnum.LocalUpdate) > 0 && x.NewOrCurrentFilePathFull.Equals(WorkingListFiltered[i].OldOrCurrentFilePathFull));
                            if (SEII == null)
                            {
                                OnLog(String.Format("[{0}] - {1}", WorkingListFiltered[i].Action.ToString(), WorkingListFiltered[i].OldOrCurrentFileName));
                                if (File.Exists(WorkingListFiltered[i].OldOrCurrentFilePathFull))
                                {
                                    OnEvent(new SyncEventItem(SyncEventEnum.LocalUpdate, WorkingListFiltered[i].OldOrCurrentFilePathFull, false, false));
                                }
                            }
                            else
                            {
                                OnLog(String.Format("[{0}][Ignored] - {1}", WorkingListFiltered[i].Action.ToString(), WorkingListFiltered[i].OldOrCurrentFileName));
                                FSIgnoreEventList.Remove(SEII);
                            }

                            #endregion

                            break;

                        case BasicActionEnum.DirCreated:

                            SEII = FSIgnoreEventList.Find(x => (x.Event & SyncEventEnum.LocalCreate) > 0 && x.NewOrCurrentFilePathFull.Equals(WorkingListFiltered[i].OldOrCurrentFilePathFull));
                            if (SEII == null)
                            {
                                OnLog(String.Format("[{0}] - {1}", WorkingListFiltered[i].Action.ToString(), WorkingListFiltered[i].OldOrCurrentFileName));
                                OnEvent(new SyncEventItem(SyncEventEnum.LocalCreate, WorkingListFiltered[i].OldOrCurrentFilePathFull, true, false));
                            }
                            else
                            {
                                OnLog(String.Format("[{0}][Ignored] - {1}", WorkingListFiltered[i].Action.ToString(), WorkingListFiltered[i].OldOrCurrentFileName));
                                FSIgnoreEventList.Remove(SEII);
                            }

                            break;

                        case BasicActionEnum.DirRenamed:

                            SEII = FSIgnoreEventList.Find(x => (x.Event & SyncEventEnum.LocalRename) > 0 && x.NewOrCurrentFilePathFull.Equals(WorkingListFiltered[i].NewFilePathFull));
                            if (SEII == null)
                            {
                                OnLog(String.Format("[{0}] - {1}", WorkingListFiltered[i].Action.ToString(), WorkingListFiltered[i].OldOrCurrentFileName));
                                OnEvent(new SyncEventItem(SyncEventEnum.LocalRename, WorkingListFiltered[i].NewFilePathFull, WorkingListFiltered[i].OldOrCurrentFilePathFull, true, false));
                            }
                            else
                            {
                                OnLog(String.Format("[{0}][Ignored] - {1}", WorkingListFiltered[i].Action.ToString(), WorkingListFiltered[i].OldOrCurrentFileName));
                                FSIgnoreEventList.Remove(SEII);
                            }

                            break;

                        case BasicActionEnum.DirDeleted:

                            SEII = FSIgnoreEventList.Find(x => (x.Event & SyncEventEnum.LocalDelete) > 0 && x.NewOrCurrentFilePathFull.Equals(WorkingListFiltered[i].OldOrCurrentFilePathFull));
                            if (SEII == null)
                            {
                                OnLog(String.Format("[{0}] - {1}", WorkingListFiltered[i].Action.ToString(), WorkingListFiltered[i].OldOrCurrentFileName));
                                OnEvent(new SyncEventItem(SyncEventEnum.LocalDelete, WorkingListFiltered[i].OldOrCurrentFilePathFull, true, false));
                            }
                            else
                            {
                                OnLog(String.Format("[{0}][Ignored] - {1}", WorkingListFiltered[i].Action.ToString(), WorkingListFiltered[i].OldOrCurrentFileName));
                                FSIgnoreEventList.Remove(SEII);
                            }

                            break;
                        }
                    }
                }
            }

            #endregion
        }