// Authors:
// Lluis Sanchez Gual (lluis@novell.com)
//
-// (C) 2005 Novell, Inc.
+// (C) 2005-2010 Novell, Inc.
//
//
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
-#if NET_2_0
-
using System;
using System.Collections;
+using System.Collections.Generic;
+using System.Globalization;
using System.IO;
using System.Web;
using System.Web.Compilation;
+using System.Web.Hosting;
using System.Web.Util;
namespace System.Web.UI
internal sealed class MasterPageParser: UserControlParser
{
Type masterType;
+ string masterTypeVirtualPath;
+ List <string> contentPlaceHolderIds;
+ string cacheEntryName;
+
+ internal MasterPageParser (VirtualPath virtualPath, string inputFile, HttpContext context)
+ : base (virtualPath, inputFile, context, "System.Web.UI.MasterPage")
+ {
+ this.cacheEntryName = String.Concat ("@@MasterPagePHIDS:", virtualPath, ":", inputFile);
+
+ contentPlaceHolderIds = HttpRuntime.InternalCache.Get (this.cacheEntryName) as List <string>;
+ LoadConfigDefaults ();
+ }
- internal MasterPageParser (string virtualPath, string inputFile, HttpContext context)
- : base (virtualPath, inputFile, context, "System.Web.UI.MasterPage")
+ internal MasterPageParser (VirtualPath virtualPath, TextReader reader, HttpContext context)
+ : this (virtualPath, null, reader, context)
{
}
+ internal MasterPageParser (VirtualPath virtualPath, string inputFile, TextReader reader, HttpContext context)
+ : base (virtualPath, inputFile, reader, context)
+ {
+ this.cacheEntryName = String.Concat ("@@MasterPagePHIDS:", virtualPath, ":", InputFile);
+
+ contentPlaceHolderIds = HttpRuntime.InternalCache.Get (this.cacheEntryName) as List <string>;
+ LoadConfigDefaults ();
+ }
+
public static MasterPage GetCompiledMasterInstance (string virtualPath, string inputFile, HttpContext context)
{
- MasterPageParser mpp = new MasterPageParser (virtualPath, inputFile, context);
- return (MasterPage) mpp.GetCompiledInstance ();
+ return BuildManager.CreateInstanceFromVirtualPath (virtualPath, typeof (MasterPage)) as MasterPage;
}
public static Type GetCompiledMasterType (string virtualPath, string inputFile, HttpContext context)
{
- MasterPageParser mpp = new MasterPageParser (virtualPath, inputFile, context);
- return mpp.CompileIntoType ();
+ return BuildManager.GetCompiledType (virtualPath);
}
+
internal override void HandleOptions (object obj)
{
base.HandleOptions (obj);
mp.MasterPageFile = MasterPageFile;
}
-
-#if NET_2_0
internal override void AddDirective (string directive, Hashtable atts)
{
- if (String.Compare ("MasterType", directive, true) == 0) {
+ if (String.Compare ("MasterType", directive, StringComparison.OrdinalIgnoreCase) == 0) {
+ PageParserFilter pfilter = PageParserFilter;
+ if (pfilter != null)
+ pfilter.PreprocessDirective (directive.ToLowerInvariant (), atts);
+
string type = GetString (atts, "TypeName", null);
if (type != null) {
masterType = LoadType (type);
ThrowParseException ("Could not load type '" + type + "'.");
} else {
string path = GetString (atts, "VirtualPath", null);
- if (path != null)
- masterType = MasterPageParser.GetCompiledMasterType (path, MapPath (path), HttpContext.Current);
- else
- ThrowParseException ("The MasterType directive must have either a TypeName or a VirtualPath attribute."); }
- AddAssembly (masterType.Assembly, true);
+ if (!String.IsNullOrEmpty (path)) {
+ if (!HostingEnvironment.VirtualPathProvider.FileExists (path))
+ ThrowParseFileNotFound (path);
+
+ masterTypeVirtualPath = path;
+ AddDependency (path);
+ } else
+ ThrowParseException ("The MasterType directive must have either a TypeName or a VirtualPath attribute.");
+ }
+ if (masterType != null)
+ AddAssembly (masterType.Assembly, true);
}
else
base.AddDirective (directive, atts);
}
-#endif
- internal Type MasterType {
- get { return masterType; }
+ internal void AddContentPlaceHolderId (string id)
+ {
+ if (contentPlaceHolderIds == null) {
+ contentPlaceHolderIds = new List <string> (1);
+ HttpRuntime.InternalCache.Insert (cacheEntryName, contentPlaceHolderIds);
+ }
+
+ contentPlaceHolderIds.Add (id);
}
-
- internal override Type DefaultBaseType {
- get { return typeof (MasterPage); }
+
+ internal Type MasterType {
+ get {
+ if (masterType == null && !String.IsNullOrEmpty (masterTypeVirtualPath))
+ masterType = BuildManager.GetCompiledType (masterTypeVirtualPath);
+
+ return masterType;
+ }
}
internal override string DefaultBaseTypeName {
}
}
}
-
-#endif