using System.Collections;
using System.IO;
using System.Security.Permissions;
+#if NET_2_0
+using System.Text;
+#endif
namespace System.Web.Caching
{
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 ();
+#if NET_2_0
+ public CacheDependency (): this (null, null, null, DateTime.Now)
+ {
+ }
+#endif
+
public CacheDependency (string filename): this (new string[] { filename }, null, null, DateTime.Now)
{
}
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 ();
+ 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);
+ }
+
+ if (cachekeys != null)
+ foreach (string key in cachekeys)
+ sb.AppendFormat ("_{0}", key);
+ return sb.ToString ();
}
+#endif
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;
}
-#if TARGET_JVM
- void DisposeWatchers ()
- {
- }
-#else
void DisposeWatchers ()
{
lock (locker) {
watchers = null;
}
}
-#endif
+
public void Dispose ()
{
+ DependencyDispose ();
+ }
+
+#if NET_2_0
+ internal virtual void DependencyDisposeInternal ()
+ {
+ }
+#endif
+
+#if NET_2_0
+ protected virtual
+#endif
+ void DependencyDispose ()
+ {
+#if NET_2_0
+ DependencyDisposeInternal ();
+#endif
DisposeWatchers ();
if (dependency != null)
dependency.DependencyChanged -= new EventHandler (OnChildDependencyChanged);
internal void SetCache (Cache c)
{
cache = c;
+#if NET_2_0
+ used = c != null;
+#endif
}
+#if NET_2_0
+ protected internal void FinishInit ()
+ {
+ utcLastModified = DateTime.UtcNow;
+ }
+
+ internal bool IsUsed {
+ get { return used; }
+ }
+
+ internal DateTime Start {
+ get { return start; }
+ set { start = value; }
+ }
+
+ public DateTime UtcLastModified {
+ get {
+ return utcLastModified;
+ }
+ }
+
+ protected void SetUtcLastModified (DateTime utcLastModified)
+ {
+ this.utcLastModified = utcLastModified;
+ }
+#endif
+
public bool HasChanged {
get {
if (hasChanged)
if (DateTime.Now < start)
return false;
- if (cache != null) {
- if (cachekeys != null) {
- foreach (string key in cachekeys) {
- if (cache.GetKeyLastChange (key) > start) {
- hasChanged = true;
- break;
- }
+ if (cache != null && cachekeys != null) {
+ foreach (string key in cachekeys) {
+ if (cache.GetKeyLastChange (key) > start) {
+ hasChanged = true;
+ break;
}
}
}
}
}
- 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
+ protected
+#else
+ internal
+#endif
+ void NotifyDependencyChanged (object sender, EventArgs e)
+ {
+ OnDependencyChanged (sender, e);
+ }
+
internal event EventHandler DependencyChanged;
}
}