Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / Orcas / NetFXw7 / ndp / fx / src / xsp / System / Web / Extensions / ui / ScriptResourceAttribute.cs / 1 / ScriptResourceAttribute.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.Web.UI { using System; using System.Collections; using System.Globalization; using System.IO; using System.Reflection; using System.Resources; using System.Security.Permissions; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Web; using System.Web.Handlers; using System.Web.Resources; using System.Web.Script.Serialization; using System.Web.Util; [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] [AspNetHostingPermission(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] public sealed class ScriptResourceAttribute : Attribute { private string _scriptName; private string _scriptResourceName; private string _typeName; private static readonly Regex _webResourceRegEx = new Regex( @"<%\s*=\s*(?WebResource|ScriptResource)\(""(? [^""]*)""\)\s*%>", RegexOptions.Singleline | RegexOptions.Multiline); public ScriptResourceAttribute(string scriptName, string scriptResourceName, string typeName) { if (String.IsNullOrEmpty(scriptName)) { throw new ArgumentException(AtlasWeb.Common_NullOrEmpty, "scriptName"); } if (String.IsNullOrEmpty(scriptResourceName)) { throw new ArgumentException(AtlasWeb.Common_NullOrEmpty, "scriptResourceName"); } if (String.IsNullOrEmpty(typeName)) { throw new ArgumentException(AtlasWeb.Common_NullOrEmpty, "typeName"); } _scriptName = scriptName; _scriptResourceName = scriptResourceName; _typeName = typeName; } public string ScriptName { get { return _scriptName; } } public string ScriptResourceName { get { return _scriptResourceName; } } public string TypeName { get { return _typeName; } } private static void CopyScriptToStringBuilderWithSubstitution( string content, Assembly assembly, bool zip, bool notifyScriptLoaded, StringBuilder output) { // Looking for something of the form: WebResource("resourcename") MatchCollection matches = _webResourceRegEx.Matches(content); int startIndex = 0; foreach (Match match in matches) { output.Append(content.Substring(startIndex, match.Index - startIndex)); Group group = match.Groups["resourceName"]; string embeddedResourceName = group.Value; bool isScriptResource = String.Equals( match.Groups["resourceType"].Value, "ScriptResource", StringComparison.Ordinal); try { if (isScriptResource) { output.Append(ScriptResourceHandler.GetScriptResourceUrl( assembly, embeddedResourceName, CultureInfo.CurrentUICulture, zip, notifyScriptLoaded)); } else { output.Append(ScriptResourceHandler.GetWebResourceUrl(assembly, embeddedResourceName)); } } catch (HttpException e) { throw new HttpException(String.Format(CultureInfo.CurrentCulture, AtlasWeb.ScriptResourceHandler_UnknownResource, embeddedResourceName), e); } startIndex = match.Index + match.Length; } output.Append(content.Substring(startIndex, content.Length - startIndex)); } internal static ResourceManager GetResourceManager(string resourceName, Assembly assembly) { if (String.IsNullOrEmpty(resourceName)) { return null; } return new ResourceManager(GetResourceName(resourceName), assembly); } private static string GetResourceName(string rawResourceName) { if (rawResourceName.EndsWith(".resources", StringComparison.OrdinalIgnoreCase)) { return rawResourceName.Substring(0, rawResourceName.Length - 10); } return rawResourceName; } internal static string GetScriptFromWebResourceInternal( Assembly assembly, string resourceName, CultureInfo culture, bool zip, bool notifyScriptLoaded, out string contentType) { ScriptResourceInfo resourceInfo = ScriptResourceInfo.GetInstance(assembly, resourceName); ScriptResourceInfo releaseResourceInfo = null; if (resourceName.EndsWith(".debug.js", StringComparison.OrdinalIgnoreCase)) { // This is a debug script, we'll need to merge the debug resource // with the release one. string releaseResourceName = resourceName.Substring(0, resourceName.Length - 9) + ".js"; releaseResourceInfo = ScriptResourceInfo.GetInstance(assembly, releaseResourceName); } if ((resourceInfo == ScriptResourceInfo.Empty) && ((releaseResourceInfo == null) || (releaseResourceInfo == ScriptResourceInfo.Empty))) { throw new HttpException(AtlasWeb.ScriptResourceHandler_InvalidRequest); } ResourceManager resourceManager = null; ResourceSet neutralSet = null; ResourceManager releaseResourceManager = null; ResourceSet releaseNeutralSet = null; CultureInfo previousCulture = Thread.CurrentThread.CurrentUICulture; try { Thread.CurrentThread.CurrentUICulture = culture; if (!String.IsNullOrEmpty(resourceInfo.ScriptResourceName)) { resourceManager = GetResourceManager(resourceInfo.ScriptResourceName, assembly); // The following may throw MissingManifestResourceException neutralSet = resourceManager.GetResourceSet(CultureInfo.InvariantCulture, true, true); } if ((releaseResourceInfo != null) && !String.IsNullOrEmpty(releaseResourceInfo.ScriptResourceName)) { releaseResourceManager = GetResourceManager(releaseResourceInfo.ScriptResourceName, assembly); releaseNeutralSet = releaseResourceManager.GetResourceSet(CultureInfo.InvariantCulture, true, true); } if ((releaseResourceInfo != null) && !String.IsNullOrEmpty(releaseResourceInfo.ScriptResourceName) && !String.IsNullOrEmpty(resourceInfo.ScriptResourceName) && (releaseResourceInfo.TypeName != resourceInfo.TypeName)) { throw new HttpException(String.Format( CultureInfo.CurrentCulture, AtlasWeb.ScriptResourceHandler_TypeNameMismatch, releaseResourceInfo.ScriptResourceName)); } StringBuilder builder = new StringBuilder(); WriteScript(assembly, resourceInfo, releaseResourceInfo, resourceManager, neutralSet, releaseResourceManager, releaseNeutralSet, zip, notifyScriptLoaded, builder); contentType = resourceInfo.ContentType; return builder.ToString(); } finally { Thread.CurrentThread.CurrentUICulture = previousCulture; if (releaseNeutralSet != null) { releaseNeutralSet.Dispose(); } if (neutralSet != null) { neutralSet.Dispose(); } } } private static void RegisterNamespace(StringBuilder builder, string typeName, bool isDebug) { int lastDot = typeName.LastIndexOf('.'); if (lastDot != -1) { builder.Append("Type.registerNamespace('"); builder.Append(typeName.Substring(0, lastDot)); builder.Append("');"); if (isDebug) builder.AppendLine(); } } internal static void WriteNotificationToStringBuilder(bool notifyScriptLoaded, StringBuilder builder) { if (notifyScriptLoaded) { // DevDiv Bugs 131109: Resources and notification should go on a new line even in release mode // because main script may not end in a semi-colon or may end in a javascript comment. // Note: If resources exist, this newline isn't necessary because one was already output. // But it is not worth keeping track of whether a newline has been output. // A newline is required for resources and notification, better to just output it for both. builder.AppendLine(); builder.Append("if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();"); } } private static bool WriteResource( StringBuilder builder, ResourceManager resourceManager, ResourceSet neutralSet, bool first, bool isDebug) { foreach (DictionaryEntry res in neutralSet) { string key = (string)res.Key; string value = resourceManager.GetObject(key) as string; if (value != null) { if (first) { first = false; } else { builder.Append(','); } if (isDebug) builder.AppendLine(); builder.Append('"'); builder.Append(JavaScriptString.QuoteString(key)); builder.Append("\":\""); builder.Append(JavaScriptString.QuoteString(value)); builder.Append('"'); } } return first; } private static void WriteResourceToStringBuilder( ScriptResourceInfo resourceInfo, ScriptResourceInfo releaseResourceInfo, ResourceManager resourceManager, ResourceSet neutralSet, ResourceManager releaseResourceManager, ResourceSet releaseNeutralSet, StringBuilder builder) { if ((resourceManager != null) || (releaseResourceManager != null)) { string typeName = resourceInfo.TypeName; if (String.IsNullOrEmpty(typeName)) { typeName = releaseResourceInfo.TypeName; } WriteResources(builder, typeName, resourceManager, neutralSet, releaseResourceManager, releaseNeutralSet, resourceInfo.IsDebug); } } private static void WriteResources(StringBuilder builder, string typeName, ResourceManager resourceManager, ResourceSet neutralSet, ResourceManager releaseResourceManager, ResourceSet releaseNeutralSet, bool isDebug) { // DevDiv Bugs 131109: Resources and notification should go on a new line even in release mode // because main script may not end in a semi-colon or may end in a javascript comment. builder.AppendLine(); RegisterNamespace(builder, typeName, isDebug); builder.Append(typeName); builder.Append("={"); bool first = true; if (resourceManager != null) { first = WriteResource(builder, resourceManager, neutralSet, first, isDebug); } if (releaseResourceManager != null) { WriteResource(builder, releaseResourceManager, releaseNeutralSet, first, isDebug); } if (isDebug) { builder.AppendLine(); builder.AppendLine("};"); } else{ builder.Append("};"); } } private static void WriteScript(Assembly assembly, ScriptResourceInfo resourceInfo, ScriptResourceInfo releaseResourceInfo, ResourceManager resourceManager, ResourceSet neutralSet, ResourceManager releaseResourceManager, ResourceSet releaseNeutralSet, bool zip, bool notifyScriptLoaded, StringBuilder output) { using (StreamReader reader = new StreamReader( assembly.GetManifestResourceStream(resourceInfo.ScriptName), true)) { if (resourceInfo.IsDebug) { // Output version information AssemblyName assemblyName = assembly.GetName(); output.AppendLine("// Name: " + resourceInfo.ScriptName); output.AppendLine("// Assembly: " + assemblyName.Name); output.AppendLine("// Version: " + assemblyName.Version.ToString()); output.AppendLine("// FileVersion: " + AssemblyUtil.GetAssemblyFileVersion(assembly)); } if (resourceInfo.PerformSubstitution) { CopyScriptToStringBuilderWithSubstitution( reader.ReadToEnd(), assembly, zip, notifyScriptLoaded, output); } else { output.Append(reader.ReadToEnd()); } WriteResourceToStringBuilder(resourceInfo, releaseResourceInfo, resourceManager, neutralSet, releaseResourceManager, releaseNeutralSet, output); WriteNotificationToStringBuilder(notifyScriptLoaded, output); } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //------------------------------------------------------------------------------ // // Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.Web.UI { using System; using System.Collections; using System.Globalization; using System.IO; using System.Reflection; using System.Resources; using System.Security.Permissions; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Web; using System.Web.Handlers; using System.Web.Resources; using System.Web.Script.Serialization; using System.Web.Util; [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] [AspNetHostingPermission(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] public sealed class ScriptResourceAttribute : Attribute { private string _scriptName; private string _scriptResourceName; private string _typeName; private static readonly Regex _webResourceRegEx = new Regex( @"<%\s*=\s*(?WebResource|ScriptResource)\(""(? [^""]*)""\)\s*%>", RegexOptions.Singleline | RegexOptions.Multiline); public ScriptResourceAttribute(string scriptName, string scriptResourceName, string typeName) { if (String.IsNullOrEmpty(scriptName)) { throw new ArgumentException(AtlasWeb.Common_NullOrEmpty, "scriptName"); } if (String.IsNullOrEmpty(scriptResourceName)) { throw new ArgumentException(AtlasWeb.Common_NullOrEmpty, "scriptResourceName"); } if (String.IsNullOrEmpty(typeName)) { throw new ArgumentException(AtlasWeb.Common_NullOrEmpty, "typeName"); } _scriptName = scriptName; _scriptResourceName = scriptResourceName; _typeName = typeName; } public string ScriptName { get { return _scriptName; } } public string ScriptResourceName { get { return _scriptResourceName; } } public string TypeName { get { return _typeName; } } private static void CopyScriptToStringBuilderWithSubstitution( string content, Assembly assembly, bool zip, bool notifyScriptLoaded, StringBuilder output) { // Looking for something of the form: WebResource("resourcename") MatchCollection matches = _webResourceRegEx.Matches(content); int startIndex = 0; foreach (Match match in matches) { output.Append(content.Substring(startIndex, match.Index - startIndex)); Group group = match.Groups["resourceName"]; string embeddedResourceName = group.Value; bool isScriptResource = String.Equals( match.Groups["resourceType"].Value, "ScriptResource", StringComparison.Ordinal); try { if (isScriptResource) { output.Append(ScriptResourceHandler.GetScriptResourceUrl( assembly, embeddedResourceName, CultureInfo.CurrentUICulture, zip, notifyScriptLoaded)); } else { output.Append(ScriptResourceHandler.GetWebResourceUrl(assembly, embeddedResourceName)); } } catch (HttpException e) { throw new HttpException(String.Format(CultureInfo.CurrentCulture, AtlasWeb.ScriptResourceHandler_UnknownResource, embeddedResourceName), e); } startIndex = match.Index + match.Length; } output.Append(content.Substring(startIndex, content.Length - startIndex)); } internal static ResourceManager GetResourceManager(string resourceName, Assembly assembly) { if (String.IsNullOrEmpty(resourceName)) { return null; } return new ResourceManager(GetResourceName(resourceName), assembly); } private static string GetResourceName(string rawResourceName) { if (rawResourceName.EndsWith(".resources", StringComparison.OrdinalIgnoreCase)) { return rawResourceName.Substring(0, rawResourceName.Length - 10); } return rawResourceName; } internal static string GetScriptFromWebResourceInternal( Assembly assembly, string resourceName, CultureInfo culture, bool zip, bool notifyScriptLoaded, out string contentType) { ScriptResourceInfo resourceInfo = ScriptResourceInfo.GetInstance(assembly, resourceName); ScriptResourceInfo releaseResourceInfo = null; if (resourceName.EndsWith(".debug.js", StringComparison.OrdinalIgnoreCase)) { // This is a debug script, we'll need to merge the debug resource // with the release one. string releaseResourceName = resourceName.Substring(0, resourceName.Length - 9) + ".js"; releaseResourceInfo = ScriptResourceInfo.GetInstance(assembly, releaseResourceName); } if ((resourceInfo == ScriptResourceInfo.Empty) && ((releaseResourceInfo == null) || (releaseResourceInfo == ScriptResourceInfo.Empty))) { throw new HttpException(AtlasWeb.ScriptResourceHandler_InvalidRequest); } ResourceManager resourceManager = null; ResourceSet neutralSet = null; ResourceManager releaseResourceManager = null; ResourceSet releaseNeutralSet = null; CultureInfo previousCulture = Thread.CurrentThread.CurrentUICulture; try { Thread.CurrentThread.CurrentUICulture = culture; if (!String.IsNullOrEmpty(resourceInfo.ScriptResourceName)) { resourceManager = GetResourceManager(resourceInfo.ScriptResourceName, assembly); // The following may throw MissingManifestResourceException neutralSet = resourceManager.GetResourceSet(CultureInfo.InvariantCulture, true, true); } if ((releaseResourceInfo != null) && !String.IsNullOrEmpty(releaseResourceInfo.ScriptResourceName)) { releaseResourceManager = GetResourceManager(releaseResourceInfo.ScriptResourceName, assembly); releaseNeutralSet = releaseResourceManager.GetResourceSet(CultureInfo.InvariantCulture, true, true); } if ((releaseResourceInfo != null) && !String.IsNullOrEmpty(releaseResourceInfo.ScriptResourceName) && !String.IsNullOrEmpty(resourceInfo.ScriptResourceName) && (releaseResourceInfo.TypeName != resourceInfo.TypeName)) { throw new HttpException(String.Format( CultureInfo.CurrentCulture, AtlasWeb.ScriptResourceHandler_TypeNameMismatch, releaseResourceInfo.ScriptResourceName)); } StringBuilder builder = new StringBuilder(); WriteScript(assembly, resourceInfo, releaseResourceInfo, resourceManager, neutralSet, releaseResourceManager, releaseNeutralSet, zip, notifyScriptLoaded, builder); contentType = resourceInfo.ContentType; return builder.ToString(); } finally { Thread.CurrentThread.CurrentUICulture = previousCulture; if (releaseNeutralSet != null) { releaseNeutralSet.Dispose(); } if (neutralSet != null) { neutralSet.Dispose(); } } } private static void RegisterNamespace(StringBuilder builder, string typeName, bool isDebug) { int lastDot = typeName.LastIndexOf('.'); if (lastDot != -1) { builder.Append("Type.registerNamespace('"); builder.Append(typeName.Substring(0, lastDot)); builder.Append("');"); if (isDebug) builder.AppendLine(); } } internal static void WriteNotificationToStringBuilder(bool notifyScriptLoaded, StringBuilder builder) { if (notifyScriptLoaded) { // DevDiv Bugs 131109: Resources and notification should go on a new line even in release mode // because main script may not end in a semi-colon or may end in a javascript comment. // Note: If resources exist, this newline isn't necessary because one was already output. // But it is not worth keeping track of whether a newline has been output. // A newline is required for resources and notification, better to just output it for both. builder.AppendLine(); builder.Append("if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();"); } } private static bool WriteResource( StringBuilder builder, ResourceManager resourceManager, ResourceSet neutralSet, bool first, bool isDebug) { foreach (DictionaryEntry res in neutralSet) { string key = (string)res.Key; string value = resourceManager.GetObject(key) as string; if (value != null) { if (first) { first = false; } else { builder.Append(','); } if (isDebug) builder.AppendLine(); builder.Append('"'); builder.Append(JavaScriptString.QuoteString(key)); builder.Append("\":\""); builder.Append(JavaScriptString.QuoteString(value)); builder.Append('"'); } } return first; } private static void WriteResourceToStringBuilder( ScriptResourceInfo resourceInfo, ScriptResourceInfo releaseResourceInfo, ResourceManager resourceManager, ResourceSet neutralSet, ResourceManager releaseResourceManager, ResourceSet releaseNeutralSet, StringBuilder builder) { if ((resourceManager != null) || (releaseResourceManager != null)) { string typeName = resourceInfo.TypeName; if (String.IsNullOrEmpty(typeName)) { typeName = releaseResourceInfo.TypeName; } WriteResources(builder, typeName, resourceManager, neutralSet, releaseResourceManager, releaseNeutralSet, resourceInfo.IsDebug); } } private static void WriteResources(StringBuilder builder, string typeName, ResourceManager resourceManager, ResourceSet neutralSet, ResourceManager releaseResourceManager, ResourceSet releaseNeutralSet, bool isDebug) { // DevDiv Bugs 131109: Resources and notification should go on a new line even in release mode // because main script may not end in a semi-colon or may end in a javascript comment. builder.AppendLine(); RegisterNamespace(builder, typeName, isDebug); builder.Append(typeName); builder.Append("={"); bool first = true; if (resourceManager != null) { first = WriteResource(builder, resourceManager, neutralSet, first, isDebug); } if (releaseResourceManager != null) { WriteResource(builder, releaseResourceManager, releaseNeutralSet, first, isDebug); } if (isDebug) { builder.AppendLine(); builder.AppendLine("};"); } else{ builder.Append("};"); } } private static void WriteScript(Assembly assembly, ScriptResourceInfo resourceInfo, ScriptResourceInfo releaseResourceInfo, ResourceManager resourceManager, ResourceSet neutralSet, ResourceManager releaseResourceManager, ResourceSet releaseNeutralSet, bool zip, bool notifyScriptLoaded, StringBuilder output) { using (StreamReader reader = new StreamReader( assembly.GetManifestResourceStream(resourceInfo.ScriptName), true)) { if (resourceInfo.IsDebug) { // Output version information AssemblyName assemblyName = assembly.GetName(); output.AppendLine("// Name: " + resourceInfo.ScriptName); output.AppendLine("// Assembly: " + assemblyName.Name); output.AppendLine("// Version: " + assemblyName.Version.ToString()); output.AppendLine("// FileVersion: " + AssemblyUtil.GetAssemblyFileVersion(assembly)); } if (resourceInfo.PerformSubstitution) { CopyScriptToStringBuilderWithSubstitution( reader.ReadToEnd(), assembly, zip, notifyScriptLoaded, output); } else { output.Append(reader.ReadToEnd()); } WriteResourceToStringBuilder(resourceInfo, releaseResourceInfo, resourceManager, neutralSet, releaseResourceManager, releaseNeutralSet, output); WriteNotificationToStringBuilder(notifyScriptLoaded, output); } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- ShutDownListener.cs
- AddInServer.cs
- formatter.cs
- ListView.cs
- DataViewSetting.cs
- DataSourceConverter.cs
- File.cs
- XmlTextReaderImpl.cs
- DataKey.cs
- ObjectParameterCollection.cs
- JumpItem.cs
- PrinterResolution.cs
- SecurityTokenValidationException.cs
- AnimationStorage.cs
- LogFlushAsyncResult.cs
- CompilationRelaxations.cs
- TimestampInformation.cs
- StreamSecurityUpgradeAcceptorAsyncResult.cs
- GeneralTransform3DGroup.cs
- TakeOrSkipWhileQueryOperator.cs
- ViewSimplifier.cs
- WebContentFormatHelper.cs
- MruCache.cs
- LinqDataSource.cs
- WorkflowTraceTransfer.cs
- AddInDeploymentState.cs
- manifestimages.cs
- ResourceExpressionBuilder.cs
- TemplateLookupAction.cs
- Decimal.cs
- _HeaderInfo.cs
- PeerName.cs
- ConditionBrowserDialog.cs
- ProjectionPlanCompiler.cs
- TextBoxAutoCompleteSourceConverter.cs
- WebPart.cs
- BitmapEffect.cs
- TriggerBase.cs
- SqlAggregateChecker.cs
- GridSplitterAutomationPeer.cs
- RegexFCD.cs
- TextBoxBase.cs
- ScrollEvent.cs
- SystemMulticastIPAddressInformation.cs
- FileDialogCustomPlaces.cs
- MultilineStringConverter.cs
- ReadWriteSpinLock.cs
- AsmxEndpointPickerExtension.cs
- DesignerMetadata.cs
- FixedSchema.cs
- DataSourceCacheDurationConverter.cs
- CustomErrorsSectionWrapper.cs
- TreeNodeCollection.cs
- DbCommandDefinition.cs
- HtmlMeta.cs
- ZipIOEndOfCentralDirectoryBlock.cs
- WorkflowPersistenceContext.cs
- InteropEnvironment.cs
- ViewManager.cs
- SQLDateTimeStorage.cs
- ColorMatrix.cs
- RuleInfoComparer.cs
- RectangleHotSpot.cs
- MediaContext.cs
- BeginEvent.cs
- StreamUpdate.cs
- TouchEventArgs.cs
- DoubleAnimation.cs
- Overlapped.cs
- TdsParserSessionPool.cs
- ComAdminWrapper.cs
- OdbcConnectionFactory.cs
- Paragraph.cs
- BlurEffect.cs
- ProcessManager.cs
- RunClient.cs
- __TransparentProxy.cs
- TagPrefixAttribute.cs
- OLEDB_Enum.cs
- MatrixAnimationUsingKeyFrames.cs
- RetrieveVirtualItemEventArgs.cs
- CapabilitiesAssignment.cs
- SID.cs
- SBCSCodePageEncoding.cs
- UInt64.cs
- LinkLabel.cs
- UnionExpr.cs
- DLinqTableProvider.cs
- MobileControlBuilder.cs
- TranslateTransform.cs
- CountdownEvent.cs
- RemoteDebugger.cs
- VariableQuery.cs
- Char.cs
- httpserverutility.cs
- ReferenceEqualityComparer.cs
- PeerNameRecordCollection.cs
- CRYPTPROTECT_PROMPTSTRUCT.cs
- TreeNodeClickEventArgs.cs
- LinkTarget.cs