// Gonzalo Paniagua Javier (gonzalo@ximian.com)
//
// (C) 2002,2003 Ximian, Inc (http://www.ximian.com)
-// Copyright (C) 2005 Novell, Inc (http://www.novell.com)
+// Copyright (C) 2005-2010 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
using System.Text;
using System.Web.Compilation;
using System.Web.Configuration;
+using System.Web.Hosting;
using System.Web.Util;
using System.IO;
public sealed class PageParser : TemplateControlParser
{
PagesEnableSessionState enableSessionState = PagesEnableSessionState.True;
- bool enableViewStateMac = true;
+ bool enableViewStateMac;
+ bool enableViewStateMacSet;
bool smartNavigation;
bool haveTrace;
bool trace;
string errorPage;
bool validateRequest;
string clientTarget;
- Type baseType = typeof (Page);
-
-#if NET_2_0
bool async;
int asyncTimeout = -1;
string masterPage;
Type masterType;
+ string masterVirtualPath;
string title;
string theme;
string styleSheetTheme;
bool enable_event_validation;
bool maintainScrollPositionOnPostBack;
int maxPageStateFieldLength = -1;
- string pageParserFilter = String.Empty;
Type previousPageType;
-#endif
+ string previousPageVirtualPath;
public PageParser ()
{
internal PageParser (string virtualPath, string inputFile, HttpContext context)
{
+ this.VirtualPath = new VirtualPath (virtualPath);
Context = context;
- BaseVirtualDir = UrlUtils.GetDirectory (virtualPath);
+ BaseVirtualDir = VirtualPathUtility.GetDirectory (virtualPath, false);
InputFile = inputFile;
SetBaseType (null);
AddApplicationAssembly ();
LoadConfigDefaults ();
}
-#if NET_2_0
- internal PageParser (string virtualPath, TextReader reader, HttpContext context)
+ internal PageParser (VirtualPath virtualPath, TextReader reader, HttpContext context)
: this (virtualPath, null, reader, context)
{
}
- internal PageParser (string virtualPath, string inputFile, TextReader reader, HttpContext context)
+ internal PageParser (VirtualPath virtualPath, string inputFile, TextReader reader, HttpContext context)
{
+ this.VirtualPath = virtualPath;
Context = context;
- BaseVirtualDir = UrlUtils.GetDirectory (virtualPath);
+ BaseVirtualDir = virtualPath.DirectoryNoNormalize;
Reader = reader;
- if (String.IsNullOrEmpty (inputFile)) {
- HttpRequest req = context != null ? context.Request : null;
- if (req != null)
- InputFile = req.MapPath (virtualPath);
- } else
+ if (String.IsNullOrEmpty (inputFile))
+ InputFile = virtualPath.PhysicalPath;
+ else
InputFile = inputFile;
SetBaseType (null);
AddApplicationAssembly ();
LoadConfigDefaults ();
}
-#endif
internal override void LoadConfigDefaults ()
{
base.LoadConfigDefaults ();
-#if NET_2_0
PagesSection ps = PagesConfig;
-#else
- PagesConfiguration ps = PagesConfig;
-#endif
notBuffer = !ps.Buffer;
enableSessionState = ps.EnableSessionState;
enableViewStateMac = ps.EnableViewStateMac;
smartNavigation = ps.SmartNavigation;
validateRequest = ps.ValidateRequest;
-#if NET_2_0
masterPage = ps.MasterPageFile;
if (masterPage.Length == 0)
masterPage = null;
-
enable_event_validation = ps.EnableEventValidation;
maxPageStateFieldLength = ps.MaxPageStateFieldLength;
- pageParserFilter = ps.PageParserFilterType;
theme = ps.Theme;
if (theme.Length == 0)
theme = null;
if (styleSheetTheme.Length == 0)
styleSheetTheme = null;
maintainScrollPositionOnPostBack = ps.MaintainScrollPositionOnPostBack;
-#endif
}
- public static IHttpHandler GetCompiledPageInstance (string virtualPath,
- string inputFile,
- HttpContext context)
+ public static IHttpHandler GetCompiledPageInstance (string virtualPath, string inputFile, HttpContext context)
{
-#if NET_2_0
- return BuildManager.CreateInstanceFromVirtualPath (virtualPath, typeof (IHttpHandler)) as IHttpHandler;
-#else
- PageParser pp = new PageParser (virtualPath, inputFile, context);
- IHttpHandler h = (IHttpHandler) pp.GetCompiledInstance ();
- return h;
-#endif
+ bool isFake = false;
+
+ if (!String.IsNullOrEmpty (inputFile))
+ isFake = !inputFile.StartsWith (HttpRuntime.AppDomainAppPath);
+
+ return BuildManager.CreateInstanceFromVirtualPath (new VirtualPath (virtualPath, inputFile, isFake), typeof (IHttpHandler)) as IHttpHandler;
}
internal override void ProcessMainAttributes (Hashtable atts)
// attribute is processed case-insensitive
string enabless = GetString (atts, "EnableSessionState", null);
if (enabless != null) {
- if (String.Compare (enabless, "readonly", true) == 0)
+ if (String.Compare (enabless, "readonly", true, Helpers.InvariantCulture) == 0)
enableSessionState = PagesEnableSessionState.ReadOnly;
- else if (String.Compare (enabless, "true", true) == 0)
+ else if (String.Compare (enabless, "true", true, Helpers.InvariantCulture) == 0)
enableSessionState = PagesEnableSessionState.True;
- else if (String.Compare (enabless, "false", true) == 0)
+ else if (String.Compare (enabless, "false", true, Helpers.InvariantCulture) == 0)
enableSessionState = PagesEnableSessionState.False;
else
ThrowParseException ("Invalid value for enableSessionState: " + enabless);
CultureInfo ci = null;
try {
-#if NET_2_0
if (!culture.StartsWith ("auto"))
-#endif
ci = new CultureInfo (culture);
} catch {
ThrowParseException ("Unsupported Culture: " + culture);
if (uiculture != null) {
CultureInfo ci = null;
try {
-#if NET_2_0
if (!uiculture.StartsWith ("auto"))
-#endif
ci = new CultureInfo (uiculture);
} catch {
ThrowParseException ("Unsupported Culture: " + uiculture);
clientTarget = GetString (atts, "ClientTarget", null);
if (clientTarget != null) {
clientTarget = clientTarget.Trim ();
-#if NET_2_0
- ClientTargetSection sec = (ClientTargetSection)WebConfigurationManager.GetSection ("system.web/clientTarget");
+ ClientTargetSection sec = GetConfigSection <ClientTargetSection> ("system.web/clientTarget");
ClientTarget ct = null;
if ((ct = sec.ClientTargets [clientTarget]) == null)
- clientTarget = clientTarget.ToLower (CultureInfo.InvariantCulture);
+ clientTarget = clientTarget.ToLowerInvariant ();
if (ct == null && (ct = sec.ClientTargets [clientTarget]) == null) {
ThrowParseException (String.Format (
clientTarget));
}
clientTarget = ct.UserAgent;
-#else
- NameValueCollection coll;
- coll = (NameValueCollection) Context.GetConfig ("system.web/clientTarget");
- object ct = null;
-
- if (coll != null) {
- ct = coll [clientTarget];
- if (ct == null)
- ct = coll [clientTarget.ToLower ()];
- }
-
- if (ct == null) {
- ThrowParseException (String.Format (
- "ClientTarget '{0}' is an invalid alias. See the " +
- "documentation for <clientTarget> config. section.",
- clientTarget));
- }
- clientTarget = (string) ct;
-#endif
}
notBuffer = !GetBool (atts, "Buffer", true);
-
-#if NET_2_0
async = GetBool (atts, "Async", false);
string asyncTimeoutVal = GetString (atts, "AsyncTimeout", null);
if (asyncTimeoutVal != null) {
masterPage = GetString (atts, "MasterPageFile", masterPage);
- // Make sure the page exists
if (!String.IsNullOrEmpty (masterPage)) {
- BuildManager.GetCompiledType (masterPage);
+ if (!HostingEnvironment.VirtualPathProvider.FileExists (masterPage))
+ ThrowParseFileNotFound (masterPage);
AddDependency (masterPage);
}
theme = GetString (atts, "Theme", theme);
styleSheetTheme = GetString (atts, "StyleSheetTheme", styleSheetTheme);
- enable_event_validation = GetBool (atts, "EnableEventValidation", true);
+ enable_event_validation = GetBool (atts, "EnableEventValidation", enable_event_validation);
maintainScrollPositionOnPostBack = GetBool (atts, "MaintainScrollPositionOnPostBack", maintainScrollPositionOnPostBack);
-#endif
+
+ if (atts.ContainsKey ("EnableViewState")) {
+ enableViewStateMac = GetBool (atts, "EnableViewStateMac", enableViewStateMac);
+ enableViewStateMacSet = true;
+ }
+
// Ignored by now
- GetString (atts, "EnableViewStateMac", null);
GetString (atts, "SmartNavigation", null);
base.ProcessMainAttributes (atts);
}
-#if NET_2_0
internal override void AddDirective (string directive, Hashtable atts)
- {
+ {
bool isMasterType = String.Compare ("MasterType", directive, StringComparison.OrdinalIgnoreCase) == 0;
bool isPreviousPageType = isMasterType ? false : String.Compare ("PreviousPageType", directive,
StringComparison.OrdinalIgnoreCase) == 0;
-
+
string typeName = null;
string virtualPath = null;
Type type = null;
if (isMasterType || isPreviousPageType) {
+ PageParserFilter pfilter = PageParserFilter;
+ if (pfilter != null)
+ pfilter.PreprocessDirective (directive.ToLowerInvariant (), atts);
+
typeName = GetString (atts, "TypeName", null);
virtualPath = GetString (atts, "VirtualPath", null);
type = LoadType (typeName);
if (type == null)
ThrowParseException (String.Format ("Could not load type '{0}'.", typeName));
- } else if (virtualPath != null) {
- string mappedPath = MapPath (virtualPath);
if (isMasterType)
- type = masterType = BuildManager.GetCompiledType (virtualPath);
+ masterType = type;
+ else
+ previousPageType = type;
+ } else if (!String.IsNullOrEmpty (virtualPath)) {
+ if (!HostingEnvironment.VirtualPathProvider.FileExists (virtualPath))
+ ThrowParseFileNotFound (virtualPath);
+
+ AddDependency (virtualPath);
+ if (isMasterType)
+ masterVirtualPath = virtualPath;
else
- type = previousPageType = GetCompiledPageType (virtualPath, mappedPath,
- HttpContext.Current);
+ previousPageVirtualPath = virtualPath;
} else
- ThrowParseException (
- String.Format ("The {0} directive must have either a TypeName or a VirtualPath attribute.", directive));
+ ThrowParseException (String.Format ("The {0} directive must have either a TypeName or a VirtualPath attribute.", directive));
- AddAssembly (type.Assembly, true);
+ if (type != null)
+ AddAssembly (type.Assembly, true);
} else
base.AddDirective (directive, atts);
}
-#endif
static string SuggestCulture (string culture)
{
public static Type GetCompiledPageType (string virtualPath, string inputFile, HttpContext context)
{
-#if NET_2_0
return BuildManager.GetCompiledType (virtualPath);
-#else
- PageParser pp = new PageParser (virtualPath, inputFile, context);
- return pp.CompileIntoType ();
-#endif
}
protected override Type CompileIntoType ()
internal bool EnableViewStateMac {
get { return enableViewStateMac; }
}
+
+ internal bool EnableViewStateMacSet {
+ get { return enableViewStateMacSet; }
+ }
internal bool SmartNavigation {
get { return smartNavigation; }
get { return tracemode; }
}
-#if NET_2_0
internal override string DefaultBaseTypeName {
get { return PagesConfig.PageBaseType; }
}
-#else
- internal override string DefaultBaseTypeName {
- get { return "System.Web.UI.Page"; }
- }
-#endif
internal override string DefaultDirectiveName {
get { return "page"; }
get { return notBuffer; }
}
-#if NET_2_0
internal bool Async {
get { return async; }
}
}
internal Type MasterType {
- get { return masterType; }
+ get {
+ if (masterType == null && !String.IsNullOrEmpty (masterVirtualPath))
+ masterType = BuildManager.GetCompiledType (masterVirtualPath);
+
+ return masterType;
+ }
}
internal string Title {
get { return maxPageStateFieldLength; }
}
- internal string PageParserFilterType {
- get { return pageParserFilter; }
- }
-
internal Type PreviousPageType {
- get { return previousPageType; }
+ get {
+ if (previousPageType == null && !String.IsNullOrEmpty (previousPageVirtualPath)) {
+ string mappedPath = MapPath (previousPageVirtualPath);
+ previousPageType = GetCompiledPageType (previousPageVirtualPath, mappedPath, HttpContext.Current);
+ }
+
+ return previousPageType;
+ }
}
-#endif
}
}