/// <summary>
 /// Enqueue event and wait to be dispatched.
 /// </summary>
 /// <param name="e">A <see cref="Syncless.Monitor.DTO.FileSystemEvent"/> object containing the information needed to handle a request.</param>
 public void Enqueue(FileSystemEvent e)
 {
     lock (queue)
     {
         queue.Enqueue(e);
     }
     if (dispatcherThread == null) // start the thread if not started
     {
         dispatcherThread = new Thread(DispatchEvent);
         dispatcherThread.Start();
     }
     else if (dispatcherThread.ThreadState == ThreadState.WaitSleepJoin) // wake the thread if sleeped
     {
         waitHandle.Set();
     }
 }
Esempio n. 2
0
 private void ExecuteFile(FileSystemEvent fse)
 {
     FileChangeEvent fileEvent;
     switch (fse.EventType)
     {
         case EventChangeType.CREATED:
             //ServiceLocator.GetLogger(ServiceLocator.DEVELOPER_LOG).Write("File Created: " + fse.Path);
             fileEvent = new FileChangeEvent(new FileInfo(fse.Path), EventChangeType.CREATED);
             ServiceLocator.MonitorI.HandleFileChange(fileEvent);
             break;
         case EventChangeType.MODIFIED:
             //ServiceLocator.GetLogger(ServiceLocator.DEVELOPER_LOG).Write("File Modified: " + fse.Path);
             fileEvent = new FileChangeEvent(new FileInfo(fse.Path), EventChangeType.MODIFIED);
             ServiceLocator.MonitorI.HandleFileChange(fileEvent);
             break;
         case EventChangeType.DELETED:
             //ServiceLocator.GetLogger(ServiceLocator.DEVELOPER_LOG).Write("File Deleted: " + fse.Path);
             fileEvent = new FileChangeEvent(new FileInfo(fse.Path), EventChangeType.DELETED);
             ServiceLocator.MonitorI.HandleFileChange(fileEvent);
             break;
         case EventChangeType.RENAMED:
             //ServiceLocator.GetLogger(ServiceLocator.DEVELOPER_LOG).Write("File Renamed: " + fse.OldPath + " " + fse.Path);
             fileEvent = new FileChangeEvent(new FileInfo(fse.OldPath), new FileInfo(fse.Path));
             ServiceLocator.MonitorI.HandleFileChange(fileEvent);
             break;
         default:
             Debug.Assert(false);
             break;
     }
 }
 private void ProcessUnknown(FileSystemEvent fse, List<FileSystemEvent> eventList)
 {
     switch (fse.EventType)
     {
         case EventChangeType.CREATED:
             processList.Add(fse);
             break;
         case EventChangeType.DELETED:
             GenericDeleted(fse);
             break;
         case EventChangeType.RENAMED:
             GenericRenamed(fse, eventList);
             break;
         default:
             Debug.Assert(false);
             break;
     }
 }
 private void RenamedHasCreating(FileSystemEvent fse, List<FileSystemEvent> eventList, ref bool hasCreating, ref bool foundCreated)
 {
     for (int i = 0; i < creatingList.Count; i++) // wait for the created event if a creating event exist
     {
         string path = creatingList[i];
         if (path.ToLower().Equals(fse.OldPath.ToLower())) // still creating
         {
             hasCreating = true;
             for (int j = 0; j < eventList.Count; j++) // look for the created event
             {
                 FileSystemEvent e = eventList[j];
                 if (e.Path.ToLower().Equals(fse.OldPath.ToLower()) && e.EventType == EventChangeType.CREATED && e.FileSystemType == FileSystemType.FILE)
                 {
                     ProcessFile(e, eventList); // process the created event first
                     eventList.RemoveAt(j);
                     foundCreated = true;
                     break;
                 }
             }
         }
     }
 }
        private void GenericRenamed(FileSystemEvent fse, List<FileSystemEvent> eventList)
        {
            bool hasCreating = false;
            bool foundCreated = false;

            if (fse.FileSystemType != FileSystemType.FOLDER) // does not apply if is a folder
            {
                RenamedHasCreating(fse, eventList, ref hasCreating, ref foundCreated); // wait for the created event if a creating event exist
            }

            bool addRenamed = true;
            for (int i = 0; i < processList.Count; i++)
            {
                FileSystemEvent pEvent = processList[i];
                if (pEvent.Path.ToLower().Equals(fse.OldPath.ToLower())) // remove any existing event if exist
                {
                    processList.RemoveAt(i);
                    i--;
                    if (pEvent.EventType == EventChangeType.CREATED) // if is created event, transform it to a create event with the new path name
                    {
                        addRenamed = false;
                        processList.Add(new FileSystemEvent(fse.Path, EventChangeType.CREATED, fse.FileSystemType));
                    }
                    else if (pEvent.EventType == EventChangeType.RENAMED) // if is renamed event, transform it to a renamed event with the new old path name and new path name
                    {
                        addRenamed = false;
                        processList.Add(new FileSystemEvent(pEvent.OldPath, fse.Path, fse.FileSystemType));
                    }
                }
            }
            if (addRenamed)
            {
                processList.Add(fse);
            }

            if (fse.FileSystemType != FileSystemType.FOLDER) // does not apply if is a folder
            {
                if (hasCreating && !foundCreated) // put all remainding events into waiting list if the created event is not found
                {
                    waitingList = new List<FileSystemEvent>(eventList);
                    eventList.Clear();
                }
            }
        }
 private bool DeletedHasCreating(FileSystemEvent fse)
 {
     for (int i = 0; i < creatingList.Count; i++) // ignore this event if it is still creating
     {
         string path = creatingList[i];
         if (path.ToLower().Equals(fse.Path.ToLower()))
         {
             creatingList.RemoveAt(i); // file is deleted so no need to wait for the created event
             return false;
         }
     }
     return true;
 }
 private void GenericDeleted(FileSystemEvent fse)
 {
     bool addDeleted = true;
     if (fse.FileSystemType != FileSystemType.FOLDER) // does not apply if is a folder
     {
         addDeleted = DeletedHasCreating(fse); // ignore this event if it is still creating
     }
     for (int i = 0; i < processList.Count; i++)
     {
         FileSystemEvent pEvent = processList[i];
         if (pEvent.Path.ToLower().Equals(fse.Path.ToLower())) // remove any existing event if exist
         {
             processList.RemoveAt(i);
             i--;
             // "creation" (renamed is also a form of creation) is found so there is not a need to execute this event
             if (pEvent.EventType == EventChangeType.CREATED || pEvent.EventType == EventChangeType.RENAMED)
             {
                 addDeleted = false; 
             }
         }
         if (pEvent.EventType == EventChangeType.DELETED) // remove all child deleted event so only the root path will be executed
         {
             FileInfo child = new FileInfo(pEvent.Path);
             DirectoryInfo parent = new DirectoryInfo(fse.Path);
             if (child.Directory.FullName.ToLower().Equals(parent.FullName.ToLower()))
             {
                 processList.RemoveAt(i);
                 i--;
             }
         }
     }
     if (addDeleted)
     {
         processList.Add(fse);
     }
 }
Esempio n. 8
0
 // execute when a deleted event is fired
 private void OnDeleted(object source, FileSystemEventArgs e)
 {
     if (!filtering.ApplyFilter(filterList, e.FullPath))
     {
         return;
     }
     ExtendedFileSystemWatcher watcher = (ExtendedFileSystemWatcher)source;
     FileSystemEvent fse = new FileSystemEvent(e.FullPath, watcher.Path);
     FileSystemEventDispatcher.Instance.Enqueue(fse);
 }
 private void FileCreated(FileSystemEvent fse)
 {
     for (int i = 0; i < creatingList.Count; i++) // remove from the creating list since it is created.
     {
         string path = creatingList[i];
         if (path.ToLower().Equals(fse.Path.ToLower()))
         {
             creatingList.RemoveAt(i);
             processList.Add(fse);
             return;
         }
     }
 }
Esempio n. 10
0
 private void ProcessFile(FileSystemEvent fse, List<FileSystemEvent> eventList)
 {
     switch (fse.EventType)
     {
         case EventChangeType.CREATING:
             creatingList.Add(fse.Path);
             break;
         case EventChangeType.CREATED:
             FileCreated(fse);
             break;
         case EventChangeType.MODIFIED:
             if (!FileModified(fse)) return;
             break;
         case EventChangeType.DELETED:
             GenericDeleted(fse);
             break;
         case EventChangeType.RENAMED:
             GenericRenamed(fse, eventList);
             break;
         default:
             Debug.Assert(false);
             break;
     }
 }
Esempio n. 11
0
 // execute when a renamed event for root watcher is fired
 private void OnRootRenamed(object source, RenamedEventArgs e)
 {
     if (!filtering.ApplyFilter(filterList, e.OldFullPath))
     {
         return;
     }
     FileSystemWatcher watcher = (FileSystemWatcher)source;
     List<string> folders = rootsAndParent[watcher.Path];
     foreach (string folder in folders)
     {
         if (e.OldFullPath.Equals(folder))
         {
             FileSystemEvent fse = new FileSystemEvent(e.OldFullPath, e.FullPath, FileSystemType.FOLDER);
             FileSystemEventDispatcher.Instance.Enqueue(fse);
             return;
         }
     }
 }
Esempio n. 12
0
 // execute when a create completed event is fired
 private void OnCreateComplete(object source, FileSystemEventArgs e)
 {
     if (!filtering.ApplyFilter(filterList, e.FullPath))
     {
         return;
     }
     FileSystemEvent fse = new FileSystemEvent(e.FullPath, EventChangeType.CREATED, FileSystemType.FILE);
     FileSystemEventDispatcher.Instance.Enqueue(fse);
 }
Esempio n. 13
0
 // execute when a renamed event is fired
 private void OnRenamed(object source, RenamedEventArgs e)
 {
     if (!filtering.ApplyFilter(filterList, e.OldFullPath))
     {
         return;
     }
     FileSystemEvent fse;
     if (File.Exists(e.FullPath))
     {
         fse = new FileSystemEvent(e.OldFullPath, e.FullPath, FileSystemType.FILE);
     }
     else if (Directory.Exists(e.FullPath))
     {
         fse = new FileSystemEvent(e.OldFullPath, e.FullPath, FileSystemType.FOLDER);
     }
     else
     {
         fse = new FileSystemEvent(e.OldFullPath, e.FullPath, FileSystemType.UNKNOWN);
     }
     FileSystemEventDispatcher.Instance.Enqueue(fse);
 }
Esempio n. 14
0
 private void ExecuteFolder(FileSystemEvent fse)
 {
     FolderChangeEvent folderEvent;
     switch (fse.EventType)
     {
         case EventChangeType.CREATED:
             //ServiceLocator.GetLogger(ServiceLocator.DEVELOPER_LOG).Write("Folder Created: " + fse.Path);
             folderEvent = new FolderChangeEvent(new DirectoryInfo(fse.Path), EventChangeType.CREATED);
             ServiceLocator.MonitorI.HandleFolderChange(folderEvent);
             break;
         case EventChangeType.DELETED:
             //ServiceLocator.GetLogger(ServiceLocator.DEVELOPER_LOG).Write("Folder Deleted: " + fse.Path);
             folderEvent = new FolderChangeEvent(new DirectoryInfo(fse.Path), EventChangeType.DELETED);
             ServiceLocator.MonitorI.HandleFolderChange(folderEvent);
             break;
         case EventChangeType.RENAMED:
             //ServiceLocator.GetLogger(ServiceLocator.DEVELOPER_LOG).Write("Folder Renamed: " + fse.OldPath + " " + fse.Path);
             folderEvent = new FolderChangeEvent(new DirectoryInfo(fse.OldPath), new DirectoryInfo(fse.Path));
             ServiceLocator.MonitorI.HandleFolderChange(folderEvent);
             break;
         default:
             Debug.Assert(false);
             break;
     }
 }
Esempio n. 15
0
 private bool FileModified(FileSystemEvent fse)
 {
     foreach (string path in creatingList) // ignore this event if it is still creating
     {
         if (path.ToLower().Equals(fse.Path.ToLower()))
         {
             return false;
         }
     }
     bool addModified = true;
     for (int i = 0; i < processList.Count; i++)
     {
         FileSystemEvent pEvent = processList[i];
         if (pEvent.Path.ToLower().Equals(fse.Path.ToLower())) // ignore this event if there exist any event for this path
         {
             addModified = false;
             break;
         }
         else if (pEvent.EventType == EventChangeType.RENAMED) // ignore this event if a path is renamed
         {
             if (pEvent.OldPath.ToLower().Equals(fse.Path.ToLower()) && pEvent.FileSystemType == fse.FileSystemType)
             {
                 addModified = false;
                 break;
             }
         }
     }
     if (addModified)
     {
         processList.Add(fse);
     }
     return true;
 }
Esempio n. 16
0
 private void ExecuteUnknown(FileSystemEvent fse)
 {
     switch (fse.EventType)
     {
         case EventChangeType.DELETED:
             //ServiceLocator.GetLogger(ServiceLocator.DEVELOPER_LOG).Write("File/Folder Deleted: " + fse.Path);
             DeleteChangeEvent deleteEvent = new DeleteChangeEvent(new DirectoryInfo(fse.Path), new DirectoryInfo(fse.WatchPath));
             ServiceLocator.MonitorI.HandleDeleteChange(deleteEvent);
             break;
         default:
             Debug.Assert(false);
             break;
     }
 }
Esempio n. 17
0
 // execute when a modified event is fired
 private void OnModified(object source, FileSystemEventArgs e)
 {
     if (!filtering.ApplyFilter(filterList, e.FullPath))
     {
         return;
     }
     if (File.Exists(e.FullPath))
     {
         FileSystemEvent fse = new FileSystemEvent(e.FullPath, EventChangeType.MODIFIED, FileSystemType.FILE);
         FileSystemEventDispatcher.Instance.Enqueue(fse);
     }
 }