Exemple #1
0
        public TaskScheduler(SyncItemQueue <FolderWatcherQueueItem> q, EventWaitHandle exitThreadEvent, Tasks.Common.Models.TaskFactory taskFactory, TimeSpan taskDelay, ScheduleTicker scheduleTicker)
        {
            _fileQueue = q;

            _queueEvents    = new WaitHandle[] { exitThreadEvent, q.ItemsQueuedEvent };
            _tickerEvents   = new WaitHandle[] { exitThreadEvent, scheduleTicker.TickerEvent };
            _taskFactory    = taskFactory;
            _taskDelay      = taskDelay;
            _scheduleTicker = scheduleTicker;
        }
        public HueConnection()
        {
            // Limit the max buffer size for the response so we don't get overwhelmed
            _httpClient = new HttpClient {
                MaxResponseContentBufferSize = 256000
            };
            _httpClient.DefaultRequestHeaders.Add("user-agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)");

            _queue          = new SyncItemQueue <QueueItem>(true);
            _scheduleTicker = new ScheduleTicker(new Schedules.Common.Models.Schedule(), new TimeSpan(0, 0, 0, 0, ThrottleRate));

            _exitThreadEvent        = new ManualResetEvent(false);
            _queueEvents            = new WaitHandle[] { _exitThreadEvent, _queue.ItemsQueuedEvent };
            _tickerEvents           = new WaitHandle[] { _exitThreadEvent, _scheduleTicker.TickerEvent };
            _syncItemQueueResponses = new Dictionary <string, HueObjectBase>();

            _consumerSyncRoot = new object();
        }
Exemple #3
0
        /// <summary>
        /// This is the constructor
        /// </summary>
        /// <param name="queue">the item queue to use</param>
        /// <param name="exitThreadEvent">the event to trigger the folder watcher to exit</param>
        /// <param name="folderPath">the folder path to watch</param>
        /// <param name="filePattern">the file pattern filter</param>
        /// <param name="addParentFolder">this flag triggers an event for the parent folder to be added to the queue as well</param>
        public FolderWatcher(SyncItemQueue <FolderWatcherQueueItem> queue, EventWaitHandle exitThreadEvent, string folderPath, string filePattern, bool addParentFolder)
        {
            _queue           = queue;
            _exitThreadEvent = exitThreadEvent;
            _folderWatcher   = new FileSystemWatcher(folderPath, filePattern)
            {
                NotifyFilter          = NotifyFilters.FileName | NotifyFilters.LastWrite,
                IncludeSubdirectories = true,
                EnableRaisingEvents   = false
            };

            _folderWatcher.Created += FolderWatcherChanged;
            _folderWatcher.Deleted += FolderWatcherChanged;
            _folderWatcher.Renamed += FolderWatcherRenamed;
            _folderWatcher.Changed += FolderWatcherChanged;

            _addParentFolder = addParentFolder;
        }
Exemple #4
0
        public void StartWatchFolder(string folderName)
        {
            _logHelper.WriteEntry(String.Format("Starting WatchFolder ServiceViewModel for {0}", folderName), MessageType.Information);

            WatchFolderSettings watchFolderSettings = _watchFolderSettingsHelper.Settings.WatchFoldersSettings[folderName];

            // load task engines
            var pluginLoader = new PluginLoader <IPlugin>();
            var taskFactory  = new TaskFactory();

            pluginLoader.LoadPlugins(Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location));

            foreach (TaskEngineSettings taskEngineSettings in watchFolderSettings.TaskEnginesSettings)
            {
                taskFactory.AddToTaskEngines((ITaskEngine)pluginLoader.GetPlugin(taskEngineSettings.TypeName));
            }

            _logHelper.WriteEntry(String.Format("{0} Task Engines detected for WatchFolder ServiceViewModel for {1}", taskFactory.TaskEngines.Count, folderName), MessageType.Information);

            if (taskFactory.TaskEngines.Count == 0)
            {
                _logHelper.WriteEntry(String.Format("{0} Task Engines detected for WatchFolder ServiceViewModel for {1}.  Stopping", taskFactory.TaskEngines.Count, folderName), MessageType.Warning);
                return;
            }

            if (!_queues.ContainsKey(folderName))
            {
                _queues[folderName] = new SyncItemQueue <FolderWatcherQueueItem>();
            }
            else
            {
                _queues.Add(folderName, new SyncItemQueue <FolderWatcherQueueItem>());
            }

            if (_exitThreadEvents.ContainsKey(folderName))
            {
                _exitThreadEvents[folderName] = new ManualResetEvent(false);
            }
            else
            {
                _exitThreadEvents.Add(folderName, new ManualResetEvent(false));
            }

            //deserialise queue from settings

            foreach (QueueStateItem queueItem in watchFolderSettings.Queue)
            {
                _queues[folderName].EnqueueSync(new FolderWatcherQueueItem {
                    Path = queueItem.Path, Time = queueItem.DateTime
                });
            }

            //var transcodeEngine = new FlacToMp3TranscodeEngine();
            //var copyFolderArtEngine = new CopyFolderArtEngine();
            //taskFactory.AddToTaskEngines(transcodeEngine);
            //taskFactory.AddToTaskEngines(copyFolderArtEngine);

            var scheduleTicker = new ScheduleTicker(watchFolderSettings.ScheduleSettings.GetSchedule(), watchFolderSettings.TimerInterval);
            var folderWatcher  = new FolderWatcher(_queues[folderName], _exitThreadEvents[folderName], folderName, "*.*", true);
            var taskScheduler  = new TaskScheduler(_queues[folderName], _exitThreadEvents[folderName], taskFactory, watchFolderSettings.InitialTaskDelay, scheduleTicker);

            if (!_producerThreads.ContainsKey(watchFolderSettings.FolderName))
            {
                _producerThreads.Add(folderName, new Thread(folderWatcher.ThreadRun)
                {
                    Name = String.Format("ProducerThread for {0}", watchFolderSettings.FolderName)
                });
            }

            if (!_consumerThreads.ContainsKey(watchFolderSettings.FolderName))
            {
                _consumerThreads.Add(folderName, new Thread(taskScheduler.ThreadRun)
                {
                    Name = String.Format("ConsumerThread for {0}", watchFolderSettings.FolderName)
                });
            }

            _producerThreads[folderName].Start();
            _consumerThreads[folderName].Start();

            _logHelper.WriteEntry(String.Format("Started WatchFolder ServiceViewModel for {0}", folderName), MessageType.Information);
        }