private void Watch ()
{
watcher.EnableRaisingEvents = true;
while (active) {
WatcherChangeTypes change_types = 0;
while (queue.Count > 0) {
QueueItem item;
lock (queue) {
item = queue.Dequeue ();
}
int sleep = (int) (item.When + delay - DateTime.Now).TotalMilliseconds;
if (sleep > 0) {
Hyena.Log.DebugFormat ("Watcher: sleeping {0}ms", sleep);
Thread.Sleep (sleep);
}
if (item.ChangeType == WatcherChangeTypes.Changed) {
UpdateTrack (item.FullPath);
} else if (item.ChangeType == WatcherChangeTypes.Created) {
AddTrack (item.FullPath);
} else if (item.ChangeType == WatcherChangeTypes.Deleted) {
RemoveTrack (item.FullPath);
} else if (item.ChangeType == WatcherChangeTypes.Renamed) {
RenameTrack (item.OldFullPath, item.FullPath);
}
change_types |= item.ChangeType;
}
if ((change_types & WatcherChangeTypes.Deleted) > 0) {
library.NotifyTracksDeleted ();
}
if ((change_types & (WatcherChangeTypes.Renamed |
WatcherChangeTypes.Created | WatcherChangeTypes.Changed)) > 0) {
library.NotifyTracksChanged ();
}
handle.WaitOne ();
handle.Reset ();
}
}