CacheDependency dependency;
DateTime start;
Cache cache;
-#if !TARGET_JVM
FileSystemWatcher[] watchers;
-#endif
bool hasChanged;
#if NET_2_0
bool used;
+ DateTime utcLastModified;
#endif
object locker = new object ();
public CacheDependency (string[] filenames, string[] cachekeys, CacheDependency dependency, DateTime start)
{
-#if !TARGET_JVM
if (filenames != null) {
watchers = new FileSystemWatcher [filenames.Length];
for (int n=0; n<filenames.Length; n++) {
} else
continue;
}
+ watcher.NotifyFilter |= NotifyFilters.Size;
watcher.Created += new FileSystemEventHandler (OnChanged);
watcher.Changed += new FileSystemEventHandler (OnChanged);
watcher.Deleted += new FileSystemEventHandler (OnChanged);
watchers [n] = watcher;
}
}
-#endif
this.cachekeys = cachekeys;
this.dependency = dependency;
if (dependency != null)
dependency.DependencyChanged += new EventHandler (OnChildDependencyChanged);
this.start = start;
+
+#if NET_2_0
+ FinishInit ();
+#endif
}
#if NET_2_0
public virtual string GetUniqueID ()
{
StringBuilder sb = new StringBuilder ();
-#if !TARGET_JVM
lock (locker) {
if (watchers != null)
foreach (FileSystemWatcher fsw in watchers)
if (fsw != null && fsw.Path != null && fsw.Path.Length != 0)
sb.AppendFormat ("_{0}", fsw.Path);
}
-#endif
if (cachekeys != null)
foreach (string key in cachekeys)
}
#endif
-#if !TARGET_JVM
void OnChanged (object sender, FileSystemEventArgs args)
+ {
+ OnDependencyChanged (sender, args);
+ }
+
+ bool DoOnChanged ()
{
if (DateTime.Now < start)
- return;
+ return false;
hasChanged = true;
+#if NET_2_0
+ utcLastModified = DateTime.UtcNow;
+#endif
DisposeWatchers ();
if (cache != null)
cache.CheckExpiration ();
+
+ return true;
}
-
+
void DisposeWatchers ()
{
lock (locker) {
watchers = null;
}
}
-#else
- void DisposeWatchers ()
+
+ public void Dispose ()
+ {
+ DependencyDispose ();
+ }
+
+#if NET_2_0
+ internal virtual void DependencyDisposeInternal ()
{
}
#endif
- public void Dispose ()
+
+#if NET_2_0
+ protected virtual
+#endif
+ void DependencyDispose ()
{
+#if NET_2_0
+ DependencyDisposeInternal ();
+#endif
DisposeWatchers ();
if (dependency != null)
dependency.DependencyChanged -= new EventHandler (OnChildDependencyChanged);
}
#if NET_2_0
+ protected internal void FinishInit ()
+ {
+ utcLastModified = DateTime.UtcNow;
+ }
+
internal bool IsUsed {
get { return used; }
}
get { return start; }
set { start = value; }
}
+
+ public DateTime UtcLastModified {
+ get {
+ return utcLastModified;
+ }
+ }
+
+ protected void SetUtcLastModified (DateTime utcLastModified)
+ {
+ this.utcLastModified = utcLastModified;
+ }
#endif
public bool HasChanged {
}
}
- void OnChildDependencyChanged (object o, EventArgs a)
+ void OnChildDependencyChanged (object o, EventArgs e)
{
hasChanged = true;
- OnDependencyChanged ();
+ OnDependencyChanged (o, e);
}
- void OnDependencyChanged ()
+ void OnDependencyChanged (object sender, EventArgs e)
{
- if (DependencyChanged != null)
- DependencyChanged (this, null);
+ if (!DoOnChanged ())
+ return;
+
+ if (DependencyChanged == null)
+ return;
+
+ foreach (EventHandler eh in DependencyChanged.GetInvocationList ())
+ eh (sender, e);
}
#if NET_2_0
- internal void SignalDependencyChanged ()
+ protected
+#else
+ internal
+#endif
+ void NotifyDependencyChanged (object sender, EventArgs e)
{
- OnDependencyChanged ();
+ OnDependencyChanged (sender, e);
}
-#endif
+
internal event EventHandler DependencyChanged;
}
}