// 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()
{
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 ()
}
}
- 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);
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 {
set {dependency = value;}
}
- private string CreateKey ()
+ string CreateKey ()
{
StringBuilder builder = new StringBuilder ();
HttpContext context = HttpContext.Current;