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);
                }
            }
        }
Example #2
0
        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);
                }
            }
        }