Merge pull request #1500 from criteo-forks/criteo
[mono.git] / mcs / class / System.Web / System.Web.UI / BasePartialCachingControl.cs
index 4aa0e760c1fcd597db00539e6983741bd0af1e2f..05b884a1d9e2209eb2d57671c91821736e89c870 100644 (file)
@@ -6,9 +6,7 @@
 //   Jackson Harper (jackson@ximian.com)
 //
 // (C) 2003 Andreas Nahr
-// (C) 2004 Novell, Inc (http://www.novell.com)
-//
-
+// Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com)
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
-using System;
 using System.IO;
 using System.Text;
 using System.ComponentModel;
+using System.Security.Permissions;
 using System.Web.Caching;
 
 namespace System.Web.UI
 {
+       // CAS
+       [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
+       [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
+       // attributes
        [ToolboxItem (false)]
        public abstract class BasePartialCachingControl : Control
        {
-               private CacheDependency dependency;
-               private string ctrl_id;
-               private string guid;
-               private int duration;
-               private string varyby_params;
-               private string varyby_controls;
-               private string varyby_custom;
-
-               private Control control;
+               CacheDependency dependency;
+               string ctrl_id;
+               string guid;
+               int duration;
+               string varyby_params;
+               string varyby_controls;
+               string varyby_custom;
+               DateTime expirationTime;
+               bool slidingExpiration;
+               
+               Control control;
+               ControlCachePolicy cachePolicy;
+               string cacheKey;
+               string cachedData;
                
                protected BasePartialCachingControl()
                {
@@ -85,6 +92,18 @@ namespace System.Web.UI
                        set { varyby_custom = value; }
                }
 
+               internal DateTime ExpirationTime {
+                       get { return expirationTime; }
+                       set { expirationTime = value; }
+               }
+
+               internal bool SlidingExpiration {
+                       get { return slidingExpiration; }
+                       set { slidingExpiration = value; }
+               }
+               internal string ProviderName {
+                       get; set;
+               }
                internal abstract Control CreateControl ();
 
                public override void Dispose ()
@@ -95,23 +114,57 @@ namespace System.Web.UI
                        }
                }
 
-               protected override void OnInit (EventArgs e)
+               void RetrieveCachedContents ()
                {
-                       control = CreateControl ();
-                       Controls.Add (control);
+                       cacheKey = CreateKey ();
+                       OutputCacheProvider provider = GetProvider ();
+                       cachedData = provider.Get (cacheKey) as string;
                }
-
-               protected override void Render (HtmlTextWriter output)
+               OutputCacheProvider GetProvider ()
                {
-                       Cache cache = HttpRuntime.Cache;
-                       string key = CreateKey ();
-                       string data = cache [key] as string;
+                       string providerName = ProviderName;
+                       OutputCacheProvider provider;
+
+                       if (String.IsNullOrEmpty (providerName))
+                               provider = OutputCache.DefaultProvider;
+                       else {
+                               provider = OutputCache.GetProvider (providerName);
+                               if (provider == null)
+                                       provider = OutputCache.DefaultProvider;
+                       }
 
-                       if (data != null) {
-                               output.Write (data);
+                       return provider;
+               }
+               
+               void OnDependencyChanged (string key, object value, CacheItemRemovedReason reason)
+               {
+                       Console.WriteLine ("{0}.OnDependencyChanged (\"{0}\", {1}, {2})", this, key, value, reason);
+                       GetProvider ().Remove (key);
+               }
+               
+               internal override void InitRecursive (Control namingContainer)
+               {
+                       RetrieveCachedContents ();
+                       if (cachedData == null) {
+                               control = CreateControl ();
+                               Controls.Add (control);
+                       } else
+                               control = null;
+                       
+                       base.InitRecursive (namingContainer);
+               }
+               protected internal override void Render (HtmlTextWriter output)
+               {
+                       if (cachedData != null) {
+                               output.Write (cachedData);
                                return;
                        }
 
+                       if (control == null) {
+                               base.Render (output);
+                               return;
+                       }
+                       
                        HttpContext context = HttpContext.Current;
                        StringWriter writer = new StringWriter ();
                        TextWriter prev = context.Response.SetTextWriter (writer);
@@ -124,11 +177,22 @@ namespace System.Web.UI
                                context.Response.SetTextWriter (prev);
                                output.Write (text);
                        }
+                       OutputCacheProvider provider = GetProvider ();
+                       DateTime utcExpire = DateTime.UtcNow.AddSeconds (duration);
+                       provider.Set (cacheKey, text, utcExpire);;
+                       context.InternalCache.Insert (cacheKey, text, dependency, utcExpire.ToLocalTime (),
+                                                     Cache.NoSlidingExpiration, CacheItemPriority.Normal,
+                                                     null);
+               }
 
-                       context.Cache.InsertPrivate (key, text, dependency,
-                                               DateTime.Now.AddSeconds (duration),
-                                               Cache.NoSlidingExpiration,
-                                               CacheItemPriority.Normal, null);
+               public ControlCachePolicy CachePolicy 
+               {
+                       get {
+                               if (cachePolicy == null)
+                                       cachePolicy = new ControlCachePolicy (this);
+
+                               return cachePolicy;
+                       }
                }
 
                public CacheDependency Dependency {
@@ -136,7 +200,7 @@ namespace System.Web.UI
                        set {dependency = value;}
                }
 
-               private string CreateKey ()
+               string CreateKey ()
                {
                        StringBuilder builder = new StringBuilder ();
                        HttpContext context = HttpContext.Current;