Files
Dec2017-Script-Dump/System/IO/DefaultWatcher.cs
T
2026-06-04 11:42:34 +02:00

321 lines
8.0 KiB
C#

using System;
using System.Collections;
using System.Threading;
namespace System.IO
{
// Token: 0x0200010D RID: 269
internal class DefaultWatcher : IFileWatcher
{
// Token: 0x060009BD RID: 2493 RVA: 0x00019B9C File Offset: 0x00017D9C
private DefaultWatcher()
{
}
// Token: 0x060009BF RID: 2495 RVA: 0x00019BB4 File Offset: 0x00017DB4
public static bool GetInstance(out IFileWatcher watcher)
{
if (DefaultWatcher.instance != null)
{
watcher = DefaultWatcher.instance;
return true;
}
DefaultWatcher.instance = new DefaultWatcher();
watcher = DefaultWatcher.instance;
return true;
}
// Token: 0x060009C0 RID: 2496 RVA: 0x00019BDC File Offset: 0x00017DDC
public void StartDispatching(FileSystemWatcher fsw)
{
lock (this)
{
if (DefaultWatcher.watches == null)
{
DefaultWatcher.watches = new Hashtable();
}
if (DefaultWatcher.thread == null)
{
DefaultWatcher.thread = new Thread(new ThreadStart(this.Monitor));
DefaultWatcher.thread.IsBackground = true;
DefaultWatcher.thread.Start();
}
}
Hashtable hashtable = DefaultWatcher.watches;
lock (hashtable)
{
DefaultWatcherData defaultWatcherData = (DefaultWatcherData)DefaultWatcher.watches[fsw];
if (defaultWatcherData == null)
{
defaultWatcherData = new DefaultWatcherData();
defaultWatcherData.Files = new Hashtable();
DefaultWatcher.watches[fsw] = defaultWatcherData;
}
defaultWatcherData.FSW = fsw;
defaultWatcherData.Directory = fsw.FullPath;
defaultWatcherData.NoWildcards = !fsw.Pattern.HasWildcard;
if (defaultWatcherData.NoWildcards)
{
defaultWatcherData.FileMask = Path.Combine(defaultWatcherData.Directory, fsw.MangledFilter);
}
else
{
defaultWatcherData.FileMask = fsw.MangledFilter;
}
defaultWatcherData.IncludeSubdirs = fsw.IncludeSubdirectories;
defaultWatcherData.Enabled = true;
defaultWatcherData.DisabledTime = DateTime.MaxValue;
this.UpdateDataAndDispatch(defaultWatcherData, false);
}
}
// Token: 0x060009C1 RID: 2497 RVA: 0x00019D48 File Offset: 0x00017F48
public void StopDispatching(FileSystemWatcher fsw)
{
lock (this)
{
if (DefaultWatcher.watches == null)
{
return;
}
}
Hashtable hashtable = DefaultWatcher.watches;
lock (hashtable)
{
DefaultWatcherData defaultWatcherData = (DefaultWatcherData)DefaultWatcher.watches[fsw];
if (defaultWatcherData != null)
{
defaultWatcherData.Enabled = false;
defaultWatcherData.DisabledTime = DateTime.Now;
}
}
}
// Token: 0x060009C2 RID: 2498 RVA: 0x00019DF0 File Offset: 0x00017FF0
private void Monitor()
{
int num = 0;
for (;;)
{
Thread.Sleep(750);
Hashtable hashtable = DefaultWatcher.watches;
Hashtable hashtable2;
lock (hashtable)
{
if (DefaultWatcher.watches.Count == 0)
{
if (++num == 20)
{
break;
}
continue;
}
else
{
hashtable2 = (Hashtable)DefaultWatcher.watches.Clone();
}
}
if (hashtable2.Count != 0)
{
num = 0;
foreach (object obj in hashtable2.Values)
{
DefaultWatcherData defaultWatcherData = (DefaultWatcherData)obj;
bool flag = this.UpdateDataAndDispatch(defaultWatcherData, true);
if (flag)
{
Hashtable hashtable3 = DefaultWatcher.watches;
lock (hashtable3)
{
DefaultWatcher.watches.Remove(defaultWatcherData.FSW);
}
}
}
}
}
lock (this)
{
DefaultWatcher.thread = null;
}
}
// Token: 0x060009C3 RID: 2499 RVA: 0x00019F6C File Offset: 0x0001816C
private bool UpdateDataAndDispatch(DefaultWatcherData data, bool dispatch)
{
if (!data.Enabled)
{
return data.DisabledTime != DateTime.MaxValue && (DateTime.Now - data.DisabledTime).TotalSeconds > 5.0;
}
this.DoFiles(data, data.Directory, dispatch);
return false;
}
// Token: 0x060009C4 RID: 2500 RVA: 0x00019FD0 File Offset: 0x000181D0
private static void DispatchEvents(FileSystemWatcher fsw, FileAction action, string filename)
{
RenamedEventArgs renamedEventArgs = null;
lock (fsw)
{
fsw.DispatchEvents(action, filename, ref renamedEventArgs);
if (fsw.Waiting)
{
fsw.Waiting = false;
global::System.Threading.Monitor.PulseAll(fsw);
}
}
}
// Token: 0x060009C5 RID: 2501 RVA: 0x0001A034 File Offset: 0x00018234
private void DoFiles(DefaultWatcherData data, string directory, bool dispatch)
{
bool flag = Directory.Exists(directory);
if (flag && data.IncludeSubdirs)
{
foreach (string text in Directory.GetDirectories(directory))
{
this.DoFiles(data, text, dispatch);
}
}
string[] array = null;
if (!flag)
{
array = DefaultWatcher.NoStringsArray;
}
else if (!data.NoWildcards)
{
array = Directory.GetFileSystemEntries(directory, data.FileMask);
}
else if (File.Exists(data.FileMask) || Directory.Exists(data.FileMask))
{
array = new string[] { data.FileMask };
}
else
{
array = DefaultWatcher.NoStringsArray;
}
foreach (object obj in data.Files.Keys)
{
string text2 = (string)obj;
FileData fileData = (FileData)data.Files[text2];
if (fileData.Directory == directory)
{
fileData.NotExists = true;
}
}
foreach (string text3 in array)
{
FileData fileData2 = (FileData)data.Files[text3];
if (fileData2 == null)
{
try
{
data.Files.Add(text3, DefaultWatcher.CreateFileData(directory, text3));
}
catch
{
data.Files.Remove(text3);
goto IL_1BD;
}
if (dispatch)
{
DefaultWatcher.DispatchEvents(data.FSW, FileAction.Added, text3);
}
}
else if (fileData2.Directory == directory)
{
fileData2.NotExists = false;
}
IL_1BD:;
}
if (!dispatch)
{
return;
}
ArrayList arrayList = null;
foreach (object obj2 in data.Files.Keys)
{
string text4 = (string)obj2;
FileData fileData3 = (FileData)data.Files[text4];
if (fileData3.NotExists)
{
if (arrayList == null)
{
arrayList = new ArrayList();
}
arrayList.Add(text4);
DefaultWatcher.DispatchEvents(data.FSW, FileAction.Removed, text4);
}
}
if (arrayList != null)
{
foreach (object obj3 in arrayList)
{
string text5 = (string)obj3;
data.Files.Remove(text5);
}
arrayList = null;
}
foreach (object obj4 in data.Files.Keys)
{
string text6 = (string)obj4;
FileData fileData4 = (FileData)data.Files[text6];
DateTime creationTime;
DateTime lastWriteTime;
try
{
creationTime = File.GetCreationTime(text6);
lastWriteTime = File.GetLastWriteTime(text6);
}
catch
{
if (arrayList == null)
{
arrayList = new ArrayList();
}
arrayList.Add(text6);
DefaultWatcher.DispatchEvents(data.FSW, FileAction.Removed, text6);
continue;
}
if (creationTime != fileData4.CreationTime || lastWriteTime != fileData4.LastWriteTime)
{
fileData4.CreationTime = creationTime;
fileData4.LastWriteTime = lastWriteTime;
DefaultWatcher.DispatchEvents(data.FSW, FileAction.Modified, text6);
}
}
if (arrayList != null)
{
foreach (object obj5 in arrayList)
{
string text7 = (string)obj5;
data.Files.Remove(text7);
}
}
}
// Token: 0x060009C6 RID: 2502 RVA: 0x0001A4F8 File Offset: 0x000186F8
private static FileData CreateFileData(string directory, string filename)
{
FileData fileData = new FileData();
string text = Path.Combine(directory, filename);
fileData.Directory = directory;
fileData.Attributes = File.GetAttributes(text);
fileData.CreationTime = File.GetCreationTime(text);
fileData.LastWriteTime = File.GetLastWriteTime(text);
return fileData;
}
// Token: 0x04000337 RID: 823
private static DefaultWatcher instance;
// Token: 0x04000338 RID: 824
private static Thread thread;
// Token: 0x04000339 RID: 825
private static Hashtable watches;
// Token: 0x0400033A RID: 826
private static string[] NoStringsArray = new string[0];
}
}