2007-11-07 Igor Zelmanovich <igorz@mainsoft.com>
[mono.git] / mcs / class / System.Web / System.Web.Caching / CacheDependency.cs
index 7796ba99543b9f6acfee76851105fbc3a050e6b2..03794c6e89868a9190f09df2f4f5f209dc9c4873 100644 (file)
@@ -50,12 +50,11 @@ 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 ();
                
@@ -96,7 +95,6 @@ namespace System.Web.Caching
                
                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++) {
@@ -111,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);
@@ -119,26 +118,27 @@ namespace System.Web.Caching
                                        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)
@@ -147,18 +147,27 @@ namespace System.Web.Caching
                }
 #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) {
@@ -170,13 +179,26 @@ namespace System.Web.Caching
                                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);
@@ -192,6 +214,11 @@ namespace System.Web.Caching
                }
                
 #if NET_2_0
+               protected internal void FinishInit () 
+               {
+                       utcLastModified = DateTime.UtcNow;
+               }
+
                internal bool IsUsed {
                        get { return used; }
                }
@@ -200,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 {
@@ -225,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;
        }
 }