Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / whidbey / NetFXspW7 / ndp / fx / src / xsp / System / Web / UI / BaseTemplateParser.cs / 1 / BaseTemplateParser.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- /* * Implements the ASP.NET template parser * * Copyright (c) 1998 Microsoft Corporation */ namespace System.Web.UI { using System.Text; using System; using System.IO; using System.Collections; using System.Collections.Specialized; using System.ComponentModel; using System.ComponentModel.Design; using System.Reflection; using System.Configuration; using System.Web.Caching; using System.Web.Util; using System.Web.Hosting; using System.Web.Compilation; using HttpException = System.Web.HttpException; using System.Text.RegularExpressions; using System.Globalization; using System.Security.Permissions; /* * Parser for Template Files (TemplateControls and PageTheme) */ ////// /// [AspNetHostingPermission(SecurityAction.LinkDemand, Level=AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission(SecurityAction.InheritanceDemand, Level=AspNetHostingPermissionLevel.Minimal)] public abstract class BaseTemplateParser : TemplateParser { private const string _sourceString = "src"; private const string _namespaceString = "namespace"; private const string _tagnameString = "tagname"; internal Type GetDesignTimeUserControlType(string tagPrefix, string tagName) { Debug.Assert(FInDesigner); Type type = typeof(UserControl); IDesignerHost host = DesignerHost; if (host != null) { IUserControlTypeResolutionService ucTypeResService = (IUserControlTypeResolutionService)host.GetService(typeof(IUserControlTypeResolutionService)); if (ucTypeResService != null) { try { type = ucTypeResService.GetType(tagPrefix, tagName); } catch { } } } return type; } /* * Compile a nested .ascx file (a User Control) and return its Type */ protected internal Type GetUserControlType(string virtualPath) { return GetUserControlType(VirtualPath.Create(virtualPath)); } internal Type GetUserControlType(VirtualPath virtualPath) { Type t = GetReferencedType(virtualPath, false /*allowNoCompile*/); // Fail if it's a no compile uc, since it doesn't have a Type we can use if (t == null) { // First, check whether there is a PageParserFilter that can give us a type if (_pageParserFilter != null) t = _pageParserFilter.GetNoCompileUserControlType(); if (t == null) ProcessError(SR.GetString(SR.Cant_use_nocompile_uc, virtualPath)); } else { // Make sure it has the correct base type Util.CheckAssignableType(typeof(UserControl), t); } return t; } /* * Compile a .aspx/.ascx file and return its Type */ protected Type GetReferencedType(string virtualPath) { return GetReferencedType(VirtualPath.Create(virtualPath)); } internal Type GetReferencedType(VirtualPath virtualPath) { return GetReferencedType(virtualPath, true /*allowNoCompile*/); } internal Type GetReferencedType(VirtualPath virtualPath, bool allowNoCompile) { virtualPath = ResolveVirtualPath(virtualPath); // If we have a page parser filter, make sure the reference is allowed if (_pageParserFilter != null && !_pageParserFilter.AllowVirtualReference(CompConfig, virtualPath)) { ProcessError(SR.GetString(SR.Reference_not_allowed, virtualPath)); } BuildResult result = null; Type t = null; try { result = BuildManager.GetVPathBuildResult(virtualPath); } catch (HttpCompileException e) { // Add the path depdencies properly so we know when // to invalidate the cached result. if (e.VirtualPathDependencies != null) { foreach (string vPath in e.VirtualPathDependencies) { AddSourceDependency(VirtualPath.Create(vPath)); } } throw; } catch { // Add the virtualPath to the dependency so that // we know when to check again. This could happen if the // virtualPath points to a file not created yet. // This only affects designtime code path since we do want to return // partial result even if there is an error, and that result is // cached. VSWhidbey 372585 if (IgnoreParseErrors) { AddSourceDependency(virtualPath); } throw; } // Is it a no-compile page/uc BuildResultNoCompileTemplateControl noCompileResult = result as BuildResultNoCompileTemplateControl; if (noCompileResult != null) { // If no-compile is not acceptable, return null if (!allowNoCompile) return null; // In the no-compile case, use the base type, since we don't compile a type t = noCompileResult.BaseType; } else if (result is BuildResultCompiledType) { BuildResultCompiledType compiledResult = (BuildResultCompiledType) result; Debug.Assert(compiledResult != null); t = compiledResult.ResultType; } else { throw new HttpException(SR.GetString(SR.Invalid_typeless_reference, _sourceString)); } Debug.Assert(t != null); // Add a dependency on the Type AddTypeDependency(t); // Add a dependency on the BuildResult AddBuildResultDependency(result); return t; } internal override void ProcessDirective(string directiveName, IDictionary directive) { if (StringUtil.EqualsIgnoreCase(directiveName, "register")) { // Register directive // Get the tagprefix, which is required string tagPrefix = Util.GetAndRemoveNonEmptyIdentifierAttribute(directive, "tagprefix", true /*required*/); string tagName = Util.GetAndRemoveNonEmptyIdentifierAttribute(directive, _tagnameString, false /*required*/); VirtualPath src = Util.GetAndRemoveVirtualPathAttribute(directive, _sourceString, false /*required*/); string ns = Util.GetAndRemoveNonEmptyNoSpaceAttribute(directive, _namespaceString, false /*required*/); // An Assembly can optionally be specified (ASURT 61326/VSWhidbey 87050) string assemblyName = Util.GetAndRemoveNonEmptyAttribute(directive, "assembly", false /*required*/); RegisterDirectiveEntry registerEntry; if (tagName != null) { // It's a user control registration // 'src' is required if (src == null) { throw new HttpException(SR.GetString(SR.Missing_attr, _sourceString)); } // 'namespace' is not allowed if (ns != null) { throw new HttpException( SR.GetString(SR.Invalid_attr, _namespaceString, "tagname")); } // 'assembly' is not allowed if (assemblyName != null) { throw new HttpException( SR.GetString(SR.Invalid_attr, "assembly", "tagname")); } UserControlRegisterEntry ucRegisterEntry = new UserControlRegisterEntry(tagPrefix, tagName); ucRegisterEntry.UserControlSource = src; registerEntry = ucRegisterEntry; TypeMapper.ProcessUserControlRegistration(ucRegisterEntry); } else if (src != null) { // It's missing the tagname attribute. throw new HttpException(SR.GetString(SR.Missing_attr, _tagnameString)); } else { // It's a namespace prefix registration // 'namespace' is required if (ns == null) { throw new HttpException(SR.GetString(SR.Missing_attr, _namespaceString)); } TagNamespaceRegisterEntry nsRegisterEntry = new TagNamespaceRegisterEntry(tagPrefix, ns, assemblyName); registerEntry = nsRegisterEntry; TypeMapper.ProcessTagNamespaceRegistration(nsRegisterEntry); } registerEntry.Line = _lineNumber; registerEntry.VirtualPath = CurrentVirtualPathString; // If there are some attributes left, fail Util.CheckUnknownDirectiveAttributes(directiveName, directive); } else { base.ProcessDirective(directiveName, directive); } } } /* * Entry representing a register directive * e.g. <%@ Register tagprefix="tagprefix" Namespace="namespace" Assembly="assembly" %> OR * e.g. <%@ Register tagprefix="tagprefix" Tagname="tagname" Src="pathname" %> */ internal abstract class RegisterDirectiveEntry: SourceLineInfo { internal RegisterDirectiveEntry(string tagPrefix) { _tagPrefix = tagPrefix; } private string _tagPrefix; internal string TagPrefix { get { return _tagPrefix;} } } /* * Entry representing the registration of a tag namespace * e.g. <%@ Register tagprefix="tagprefix" Namespace="namespace" Assembly="assembly" %> */ internal class TagNamespaceRegisterEntry: RegisterDirectiveEntry { internal TagNamespaceRegisterEntry(string tagPrefix, string namespaceName, string assemblyName) : base(tagPrefix) { _ns = namespaceName; _assemblyName = assemblyName; } private string _ns; internal string Namespace { get { return _ns;} } private string _assemblyName; internal string AssemblyName { get { return _assemblyName;} } #if DONT_COMPILE internal string Key { get { return TagPrefix + ":" + _ns + ":" + (_assemblyName == null ? String.Empty : _assemblyName); } } #endif } /* * Entry representing the registration of a user control * e.g. <%@ Register tagprefix="tagprefix" Tagname="tagname" Src="pathname" %> */ internal class UserControlRegisterEntry: RegisterDirectiveEntry { internal UserControlRegisterEntry(string tagPrefix, string tagName) : base(tagPrefix) { _tagName = tagName; } private string _tagName; internal string TagName { get { return _tagName;} } private VirtualPath _source; internal VirtualPath UserControlSource { get { return _source;} set { _source = value;} } private bool _comesFromConfig; internal bool ComesFromConfig { get { return _comesFromConfig;} set { _comesFromConfig = value;} } internal string Key { get { return TagPrefix + ":" + _tagName; } } } internal class TagNamespaceRegisterEntryTable : Hashtable { public TagNamespaceRegisterEntryTable() : base(StringComparer.OrdinalIgnoreCase) { } public override object Clone() { // We override clone to perform a deep copy of the hashtable contents but a shallow copy of // the contained arraylist itself TagNamespaceRegisterEntryTable newTable = new TagNamespaceRegisterEntryTable(); foreach (DictionaryEntry entry in this) { newTable[entry.Key] = ((ArrayList)entry.Value).Clone(); } return newTable; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //------------------------------------------------------------------------------ //[To be supplied.] ///// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- /* * Implements the ASP.NET template parser * * Copyright (c) 1998 Microsoft Corporation */ namespace System.Web.UI { using System.Text; using System; using System.IO; using System.Collections; using System.Collections.Specialized; using System.ComponentModel; using System.ComponentModel.Design; using System.Reflection; using System.Configuration; using System.Web.Caching; using System.Web.Util; using System.Web.Hosting; using System.Web.Compilation; using HttpException = System.Web.HttpException; using System.Text.RegularExpressions; using System.Globalization; using System.Security.Permissions; /* * Parser for Template Files (TemplateControls and PageTheme) */ ////// /// [AspNetHostingPermission(SecurityAction.LinkDemand, Level=AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission(SecurityAction.InheritanceDemand, Level=AspNetHostingPermissionLevel.Minimal)] public abstract class BaseTemplateParser : TemplateParser { private const string _sourceString = "src"; private const string _namespaceString = "namespace"; private const string _tagnameString = "tagname"; internal Type GetDesignTimeUserControlType(string tagPrefix, string tagName) { Debug.Assert(FInDesigner); Type type = typeof(UserControl); IDesignerHost host = DesignerHost; if (host != null) { IUserControlTypeResolutionService ucTypeResService = (IUserControlTypeResolutionService)host.GetService(typeof(IUserControlTypeResolutionService)); if (ucTypeResService != null) { try { type = ucTypeResService.GetType(tagPrefix, tagName); } catch { } } } return type; } /* * Compile a nested .ascx file (a User Control) and return its Type */ protected internal Type GetUserControlType(string virtualPath) { return GetUserControlType(VirtualPath.Create(virtualPath)); } internal Type GetUserControlType(VirtualPath virtualPath) { Type t = GetReferencedType(virtualPath, false /*allowNoCompile*/); // Fail if it's a no compile uc, since it doesn't have a Type we can use if (t == null) { // First, check whether there is a PageParserFilter that can give us a type if (_pageParserFilter != null) t = _pageParserFilter.GetNoCompileUserControlType(); if (t == null) ProcessError(SR.GetString(SR.Cant_use_nocompile_uc, virtualPath)); } else { // Make sure it has the correct base type Util.CheckAssignableType(typeof(UserControl), t); } return t; } /* * Compile a .aspx/.ascx file and return its Type */ protected Type GetReferencedType(string virtualPath) { return GetReferencedType(VirtualPath.Create(virtualPath)); } internal Type GetReferencedType(VirtualPath virtualPath) { return GetReferencedType(virtualPath, true /*allowNoCompile*/); } internal Type GetReferencedType(VirtualPath virtualPath, bool allowNoCompile) { virtualPath = ResolveVirtualPath(virtualPath); // If we have a page parser filter, make sure the reference is allowed if (_pageParserFilter != null && !_pageParserFilter.AllowVirtualReference(CompConfig, virtualPath)) { ProcessError(SR.GetString(SR.Reference_not_allowed, virtualPath)); } BuildResult result = null; Type t = null; try { result = BuildManager.GetVPathBuildResult(virtualPath); } catch (HttpCompileException e) { // Add the path depdencies properly so we know when // to invalidate the cached result. if (e.VirtualPathDependencies != null) { foreach (string vPath in e.VirtualPathDependencies) { AddSourceDependency(VirtualPath.Create(vPath)); } } throw; } catch { // Add the virtualPath to the dependency so that // we know when to check again. This could happen if the // virtualPath points to a file not created yet. // This only affects designtime code path since we do want to return // partial result even if there is an error, and that result is // cached. VSWhidbey 372585 if (IgnoreParseErrors) { AddSourceDependency(virtualPath); } throw; } // Is it a no-compile page/uc BuildResultNoCompileTemplateControl noCompileResult = result as BuildResultNoCompileTemplateControl; if (noCompileResult != null) { // If no-compile is not acceptable, return null if (!allowNoCompile) return null; // In the no-compile case, use the base type, since we don't compile a type t = noCompileResult.BaseType; } else if (result is BuildResultCompiledType) { BuildResultCompiledType compiledResult = (BuildResultCompiledType) result; Debug.Assert(compiledResult != null); t = compiledResult.ResultType; } else { throw new HttpException(SR.GetString(SR.Invalid_typeless_reference, _sourceString)); } Debug.Assert(t != null); // Add a dependency on the Type AddTypeDependency(t); // Add a dependency on the BuildResult AddBuildResultDependency(result); return t; } internal override void ProcessDirective(string directiveName, IDictionary directive) { if (StringUtil.EqualsIgnoreCase(directiveName, "register")) { // Register directive // Get the tagprefix, which is required string tagPrefix = Util.GetAndRemoveNonEmptyIdentifierAttribute(directive, "tagprefix", true /*required*/); string tagName = Util.GetAndRemoveNonEmptyIdentifierAttribute(directive, _tagnameString, false /*required*/); VirtualPath src = Util.GetAndRemoveVirtualPathAttribute(directive, _sourceString, false /*required*/); string ns = Util.GetAndRemoveNonEmptyNoSpaceAttribute(directive, _namespaceString, false /*required*/); // An Assembly can optionally be specified (ASURT 61326/VSWhidbey 87050) string assemblyName = Util.GetAndRemoveNonEmptyAttribute(directive, "assembly", false /*required*/); RegisterDirectiveEntry registerEntry; if (tagName != null) { // It's a user control registration // 'src' is required if (src == null) { throw new HttpException(SR.GetString(SR.Missing_attr, _sourceString)); } // 'namespace' is not allowed if (ns != null) { throw new HttpException( SR.GetString(SR.Invalid_attr, _namespaceString, "tagname")); } // 'assembly' is not allowed if (assemblyName != null) { throw new HttpException( SR.GetString(SR.Invalid_attr, "assembly", "tagname")); } UserControlRegisterEntry ucRegisterEntry = new UserControlRegisterEntry(tagPrefix, tagName); ucRegisterEntry.UserControlSource = src; registerEntry = ucRegisterEntry; TypeMapper.ProcessUserControlRegistration(ucRegisterEntry); } else if (src != null) { // It's missing the tagname attribute. throw new HttpException(SR.GetString(SR.Missing_attr, _tagnameString)); } else { // It's a namespace prefix registration // 'namespace' is required if (ns == null) { throw new HttpException(SR.GetString(SR.Missing_attr, _namespaceString)); } TagNamespaceRegisterEntry nsRegisterEntry = new TagNamespaceRegisterEntry(tagPrefix, ns, assemblyName); registerEntry = nsRegisterEntry; TypeMapper.ProcessTagNamespaceRegistration(nsRegisterEntry); } registerEntry.Line = _lineNumber; registerEntry.VirtualPath = CurrentVirtualPathString; // If there are some attributes left, fail Util.CheckUnknownDirectiveAttributes(directiveName, directive); } else { base.ProcessDirective(directiveName, directive); } } } /* * Entry representing a register directive * e.g. <%@ Register tagprefix="tagprefix" Namespace="namespace" Assembly="assembly" %> OR * e.g. <%@ Register tagprefix="tagprefix" Tagname="tagname" Src="pathname" %> */ internal abstract class RegisterDirectiveEntry: SourceLineInfo { internal RegisterDirectiveEntry(string tagPrefix) { _tagPrefix = tagPrefix; } private string _tagPrefix; internal string TagPrefix { get { return _tagPrefix;} } } /* * Entry representing the registration of a tag namespace * e.g. <%@ Register tagprefix="tagprefix" Namespace="namespace" Assembly="assembly" %> */ internal class TagNamespaceRegisterEntry: RegisterDirectiveEntry { internal TagNamespaceRegisterEntry(string tagPrefix, string namespaceName, string assemblyName) : base(tagPrefix) { _ns = namespaceName; _assemblyName = assemblyName; } private string _ns; internal string Namespace { get { return _ns;} } private string _assemblyName; internal string AssemblyName { get { return _assemblyName;} } #if DONT_COMPILE internal string Key { get { return TagPrefix + ":" + _ns + ":" + (_assemblyName == null ? String.Empty : _assemblyName); } } #endif } /* * Entry representing the registration of a user control * e.g. <%@ Register tagprefix="tagprefix" Tagname="tagname" Src="pathname" %> */ internal class UserControlRegisterEntry: RegisterDirectiveEntry { internal UserControlRegisterEntry(string tagPrefix, string tagName) : base(tagPrefix) { _tagName = tagName; } private string _tagName; internal string TagName { get { return _tagName;} } private VirtualPath _source; internal VirtualPath UserControlSource { get { return _source;} set { _source = value;} } private bool _comesFromConfig; internal bool ComesFromConfig { get { return _comesFromConfig;} set { _comesFromConfig = value;} } internal string Key { get { return TagPrefix + ":" + _tagName; } } } internal class TagNamespaceRegisterEntryTable : Hashtable { public TagNamespaceRegisterEntryTable() : base(StringComparer.OrdinalIgnoreCase) { } public override object Clone() { // We override clone to perform a deep copy of the hashtable contents but a shallow copy of // the contained arraylist itself TagNamespaceRegisterEntryTable newTable = new TagNamespaceRegisterEntryTable(); foreach (DictionaryEntry entry in this) { newTable[entry.Key] = ((ArrayList)entry.Value).Clone(); } return newTable; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.[To be supplied.] ///
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- GenericsNotImplementedException.cs
- DebugViewWriter.cs
- Object.cs
- ConditionCollection.cs
- ReaderWriterLockWrapper.cs
- TokenBasedSetEnumerator.cs
- StyleCollection.cs
- DataGridViewCell.cs
- SessionStateSection.cs
- ResourceBinder.cs
- PointValueSerializer.cs
- SplineKeyFrames.cs
- SettingsPropertyIsReadOnlyException.cs
- MetaModel.cs
- TrustManagerPromptUI.cs
- PropertyRecord.cs
- LayoutTable.cs
- MsmqIntegrationInputMessage.cs
- TextPatternIdentifiers.cs
- SqlInternalConnection.cs
- ForeignKeyConstraint.cs
- TextEncodedRawTextWriter.cs
- FontResourceCache.cs
- DecoderReplacementFallback.cs
- ThreadExceptionEvent.cs
- DockAndAnchorLayout.cs
- FtpWebResponse.cs
- DataGridViewAutoSizeModeEventArgs.cs
- TypeNameConverter.cs
- TransportSecurityProtocol.cs
- QueryContinueDragEventArgs.cs
- ClientConfigurationSystem.cs
- Int16Storage.cs
- Speller.cs
- MessageBox.cs
- CellIdBoolean.cs
- WebPartDisplayModeEventArgs.cs
- PeerCollaboration.cs
- DataGridRowHeaderAutomationPeer.cs
- KeyGestureConverter.cs
- SqlIdentifier.cs
- IEnumerable.cs
- PenThreadWorker.cs
- DataColumnMappingCollection.cs
- CollectionBase.cs
- TypeUtil.cs
- TypeElement.cs
- x509utils.cs
- WindowsFormsDesignerOptionService.cs
- ColorConverter.cs
- DotExpr.cs
- Int32CAMarshaler.cs
- Rfc2898DeriveBytes.cs
- PeerCollaborationPermission.cs
- LineMetrics.cs
- MemberInfoSerializationHolder.cs
- CodeExporter.cs
- WebPartManager.cs
- Shared.cs
- GPPOINT.cs
- DataBinder.cs
- WebPartZoneCollection.cs
- PeerName.cs
- sqlnorm.cs
- ComponentResourceKeyConverter.cs
- Track.cs
- XpsSerializerWriter.cs
- SimpleHandlerBuildProvider.cs
- FrameworkContentElementAutomationPeer.cs
- TreeNodeEventArgs.cs
- UIElementPropertyUndoUnit.cs
- HttpProcessUtility.cs
- xml.cs
- TransactionProtocol.cs
- ToggleButton.cs
- DrawingBrush.cs
- PrivilegedConfigurationManager.cs
- Wrapper.cs
- XmlValidatingReader.cs
- XmlEntity.cs
- XhtmlTextWriter.cs
- Utils.cs
- LiteralControl.cs
- MetafileEditor.cs
- MultiByteCodec.cs
- TailCallAnalyzer.cs
- GenericPrincipal.cs
- SqlAggregateChecker.cs
- ToolStripControlHost.cs
- XpsFixedDocumentSequenceReaderWriter.cs
- DataViewSetting.cs
- Italic.cs
- Boolean.cs
- ImageListDesigner.cs
- BidOverLoads.cs
- ConnectionManager.cs
- HandlerBase.cs
- WebControlParameterProxy.cs
- Dispatcher.cs
- ControlCachePolicy.cs