private void ProcessEvents(object sender, ElapsedEventArgs e) { // Allow only one Timer event to be executed. if (Monitor.TryEnter(_EnterThread)) { // Only one thread at a time is processing the events try { // Lock the Collection, while processing the Events lock (_Events.SyncRoot) { #region Affected directories // Get parent directories where events occured so we can avoid multiple refreshes on // the same directory FolderWatcherEvent currentEvent = null; ArrayList refreshDir = new ArrayList(); for (int i = 0; i < _Events.Count; i++) { currentEvent = _Events[i] as FolderWatcherEvent; if (currentEvent != null) { string strPath = currentEvent.FileName; if (!string.IsNullOrEmpty(strPath)) { strPath = Path.GetDirectoryName(strPath); // Add only one copy of changed directory if (strPath != null && !refreshDir.Contains(strPath)) { refreshDir.Add(strPath); } } } } #endregion #region Process all events // Process all events for Picturesdatabase purpose (delete event only) // Does not fire any GUIWindowsMessage for (int i = 0; i < _Events.Count; i++) { currentEvent = _Events[i] as FolderWatcherEvent; if (currentEvent != null) { switch (currentEvent.Type) { #region file events handlers // Create Pictures case FolderWatcherEvent.EventType.Create: case FolderWatcherEvent.EventType.Change: { AddPictures(currentEvent.FileName); break; } // Delete Pictures case FolderWatcherEvent.EventType.Delete: { DeletePictures(currentEvent.FileName); break; } // Rename Pictures case FolderWatcherEvent.EventType.Rename: { RenamePictures(currentEvent.OldFileName, currentEvent.FileName); break; } #endregion #region directory events handlers // Create directory case FolderWatcherEvent.EventType.CreateDirectory: { AddPicturesDirectory(currentEvent.FileName); break; } // Delete directory case FolderWatcherEvent.EventType.DeleteDirectory: { DeletePicturesDirectory(currentEvent.FileName); break; } // Rename directory case FolderWatcherEvent.EventType.RenameDirectory: { RenamePicturesDirectory(currentEvent.OldFileName, currentEvent.FileName); break; } #endregion } _Events.RemoveAt(i); i--; // Don't skip next event } } #endregion } } finally { Monitor.Exit(_EnterThread); } } }
private void ProcessEvents(object sender, ElapsedEventArgs e) { // Allow only one Timer event to be executed. if (Monitor.TryEnter(_EnterThread)) { // Only one thread at a time is processing the events try { // Lock the Collection, while processing the Events lock (_Events.SyncRoot) { #region Affected directories // Get parent directories where events occured so we can avoid multiple refreshes on // the same directory FolderWatcherEvent currentEvent = null; ArrayList refreshDir = new ArrayList(); for (int i = 0; i < _Events.Count; i++) { currentEvent = _Events[i] as FolderWatcherEvent; if (currentEvent != null) { string strPath = currentEvent.FileName; if (!string.IsNullOrEmpty(strPath)) { // Case if change occured inside of DVD/BD folder if (strPath.ToUpperInvariant().Contains(@"\VIDEO_TS")) { strPath = strPath.Substring(0, strPath.ToUpperInvariant().IndexOf(@"\VIDEO_TS")); } else if (strPath.ToUpperInvariant().Contains(@"\BDMV")) { strPath = strPath.Substring(0, strPath.ToUpperInvariant().IndexOf(@"\BDMV")); } strPath = Path.GetDirectoryName(strPath); // Add only one copy of changed directory if (strPath != null && !refreshDir.Contains(strPath)) { refreshDir.Add(strPath); } } } } #endregion #region Process all events // Process all events for videodatabase purpose (delete event only) // Does not fire any GUIWindowsMessage for (int i = 0; i < _Events.Count; i++) { currentEvent = _Events[i] as FolderWatcherEvent; if (currentEvent != null) { switch (currentEvent.Type) { #region file events handlers // Create video case FolderWatcherEvent.EventType.Create: case FolderWatcherEvent.EventType.Change: { AddVideo(currentEvent.FileName); /*if (!_useOnlyNfoScraper) * { * foreach (string mScanShare in m_ScanShares) * { * if (currentEvent.FileName.Contains(mScanShare)) * { * VideoDatabase.AddMovieQueueFile(currentEvent.FileName); * } * } * }*/ break; } // Delete video case FolderWatcherEvent.EventType.Delete: { /*if (!movieEventFired) * { * foreach (string mScanShare in m_ScanShares) * { * if (currentEvent.FileName.Contains(mScanShare)) * { * movieEventFired = true; * } * } * }*/ DeleteVideo(currentEvent.FileName); break; } // Rename video case FolderWatcherEvent.EventType.Rename: { RenameVideo(currentEvent.OldFileName, currentEvent.FileName); break; } #endregion #region directory events handlers // Create directory case FolderWatcherEvent.EventType.CreateDirectory: { AddVideoDirectory(currentEvent.FileName); break; } // Delete directory case FolderWatcherEvent.EventType.DeleteDirectory: { /*foreach (string mScanShare in m_ScanShares) * { * if (!movieEventFired && currentEvent.FileName.Contains(mScanShare)) * { * movieEventFired = true; * } * }*/ DeleteVideoDirectory(currentEvent.FileName); break; } // Rename directory case FolderWatcherEvent.EventType.RenameDirectory: { /*foreach (string mScanShare in m_ScanShares) * { * if (!movieEventFired && currentEvent.FileName.Contains(mScanShare)) * { * movieEventFired = true; * } * }*/ RenameVideoDirectory(currentEvent.OldFileName, currentEvent.FileName); break; } #endregion } _Events.RemoveAt(i); i--; // Don't skip next event } } #endregion /*// Send only one message for database views refresh (delete) * if (movieEventFired) * { * GUIMessage msg = new GUIMessage(GUIMessage.MessageType.GUI_MSG_VIDEODATABASE_REFRESH, 0, 0, 0, 0, 0, * null); * GUIWindowManager.SendMessage(msg); * }*/ } } finally { Monitor.Exit(_EnterThread); } } }