2010-05-14 Marek Habersack <mhabersack@novell.com>
[mono.git] / mcs / class / System.Web / System.Web.UI / MasterPageParser.cs
index 9616fa42a7d47d36c37341edd63ada912cdfe26c..fc986d25f1ae802efd5896a3d1070f0a1a199c1d 100644 (file)
@@ -4,7 +4,7 @@
 // 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
@@ -42,23 +43,43 @@ 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);
@@ -67,11 +88,13 @@ namespace System.Web.UI
                        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);
@@ -79,23 +102,39 @@ namespace System.Web.UI
                                                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 {
@@ -107,5 +146,3 @@ namespace System.Web.UI
                }
        }
 }
-
-#endif