2007-11-07 Igor Zelmanovich <igorz@mainsoft.com>
[mono.git] / mcs / class / System.Web / System.Web.Caching / CacheDependency.cs
index 3e53c02d1062dd99598519288c363a5b98bc29a9..03794c6e89868a9190f09df2f4f5f209dc9c4873 100644 (file)
@@ -54,6 +54,7 @@ namespace System.Web.Caching
                bool hasChanged;
 #if NET_2_0
                bool used;
+               DateTime utcLastModified;
 #endif
                object locker = new object ();
                
@@ -108,6 +109,7 @@ namespace System.Web.Caching
                                                } else
                                                        continue;
                                        }
+                                       watcher.NotifyFilter |= NotifyFilters.Size;
                                        watcher.Created += new FileSystemEventHandler (OnChanged);
                                        watcher.Changed += new FileSystemEventHandler (OnChanged);
                                        watcher.Deleted += new FileSystemEventHandler (OnChanged);
@@ -121,6 +123,10 @@ namespace System.Web.Caching
                        if (dependency != null)
                                dependency.DependencyChanged += new EventHandler (OnChildDependencyChanged);
                        this.start = start;
+
+#if NET_2_0
+                       FinishInit ();
+#endif
                }
 
 #if NET_2_0
@@ -142,16 +148,26 @@ namespace System.Web.Caching
 #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;
                }
-       
+               
                void DisposeWatchers ()
                {
                        lock (locker) {
@@ -163,8 +179,26 @@ namespace System.Web.Caching
                                watchers = null;
                        }
                }
+
                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);
@@ -180,6 +214,11 @@ namespace System.Web.Caching
                }
                
 #if NET_2_0
+               protected internal void FinishInit () 
+               {
+                       utcLastModified = DateTime.UtcNow;
+               }
+
                internal bool IsUsed {
                        get { return used; }
                }
@@ -188,6 +227,17 @@ namespace System.Web.Caching
                        get { return start; }
                        set { start = value; }
                }
+
+               public DateTime UtcLastModified {
+                       get {
+                               return utcLastModified;
+                       }
+               }
+
+               protected void SetUtcLastModified (DateTime utcLastModified) 
+               {
+                       this.utcLastModified = utcLastModified;
+               }
 #endif
                
                public bool HasChanged {
@@ -213,24 +263,34 @@ namespace System.Web.Caching
                        }
                }
                
-               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;
        }
 }