You've already forked linux-packaging-mono
							
							
		
			
	
	
		
			250 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			250 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|   | //------------------------------------------------------------------------------ | ||
|  | // <copyright file="MobileControlsSectionHandler.cs" company="Microsoft"> | ||
|  | //     Copyright (c) Microsoft Corporation.  All rights reserved. | ||
|  | // </copyright>                                                                 | ||
|  | //------------------------------------------------------------------------------ | ||
|  | 
 | ||
|  | using System.Collections; | ||
|  | using System.Configuration; | ||
|  | using System.Diagnostics; | ||
|  | using System.Xml; | ||
|  | using System.Web.Mobile; | ||
|  | using System.Reflection; | ||
|  | using System.Security.Permissions; | ||
|  | 
 | ||
|  | namespace System.Web.UI.MobileControls | ||
|  | { | ||
|  | 
 | ||
|  |     /// <include file='doc\MobileControlsSectionHandler.uex' path='docs/doc[@for="MobileControlsSectionHandler"]/*' /> | ||
|  |     [AspNetHostingPermission(SecurityAction.LinkDemand, Level=AspNetHostingPermissionLevel.Minimal)] | ||
|  |     [AspNetHostingPermission(SecurityAction.InheritanceDemand, Level=AspNetHostingPermissionLevel.Minimal)] | ||
|  |     [Obsolete("The System.Web.Mobile.dll assembly has been deprecated and should no longer be used. For information about how to develop ASP.NET mobile applications, see http://go.microsoft.com/fwlink/?LinkId=157231.")] | ||
|  |     public class MobileControlsSectionHandler : IConfigurationSectionHandler | ||
|  |     { | ||
|  |         // IConfigurationSectionHandler methods | ||
|  |         /// <internalonly/> | ||
|  |         protected Object Create(Object parent, Object context, XmlNode input) | ||
|  |         { | ||
|  |             // see ASURT 123738 | ||
|  |             if (context == null || context.GetType() != typeof(System.Web.Configuration.HttpConfigurationContext)) { | ||
|  |                 return null; | ||
|  |             } | ||
|  |              | ||
|  |             ControlsConfig config = new ControlsConfig((ControlsConfig)parent); | ||
|  | 
 | ||
|  |             // First step through each attribute on the <mobilecontrols> element | ||
|  |             // and update the ControlsConfig dictionary with it. | ||
|  |             XmlAttributeCollection attributes = input.Attributes; | ||
|  |             foreach (XmlNode attribute in attributes) | ||
|  |             { | ||
|  |                 config[attribute.Name] = attribute.Value; | ||
|  |             } | ||
|  | 
 | ||
|  |             //check validity of cookielessDataDictionary type | ||
|  |             String cookielessDataDictionaryType = config["cookielessDataDictionaryType"]; | ||
|  |             if (!String.IsNullOrEmpty(cookielessDataDictionaryType)) { | ||
|  |                 Type t = Type.GetType(cookielessDataDictionaryType); | ||
|  |                 if (t == null)   | ||
|  |                 { | ||
|  |                     throw new ConfigurationErrorsException( | ||
|  |                         SR.GetString(SR.MobileControlsSectionHandler_TypeNotFound, | ||
|  |                                  cookielessDataDictionaryType, | ||
|  |                                  "IDictionary"), | ||
|  |                         input); | ||
|  |                 } | ||
|  |                 if (!(typeof(IDictionary).IsAssignableFrom(t))) | ||
|  |                 { | ||
|  |                     throw new ConfigurationErrorsException( | ||
|  |                         SR.GetString(SR.MobileControlsSectionHandler_NotAssignable, | ||
|  |                                      cookielessDataDictionaryType, | ||
|  |                                      "IDictionary"), | ||
|  |                         input); | ||
|  |                 } | ||
|  | 
 | ||
|  |             } | ||
|  | 
 | ||
|  |             // Iterate through each <device> tag within the config section | ||
|  |             ConfigurationSectionHelper helper = new ConfigurationSectionHelper(); | ||
|  |             foreach(XmlNode nextNode in input) | ||
|  |             { | ||
|  |                 helper.Node = nextNode; | ||
|  | 
 | ||
|  |                 if(helper.IsWhitespaceOrComment()) | ||
|  |                 { | ||
|  |                     continue; | ||
|  |                 } | ||
|  | 
 | ||
|  |                 helper.RejectNonElement(); | ||
|  |                  | ||
|  |                 // handle <device> tags | ||
|  |                 switch(nextNode.Name) | ||
|  |                 { | ||
|  |                 case "device": | ||
|  |                     String deviceName = helper.RemoveStringAttribute("name", false); | ||
|  |                      | ||
|  |                     IndividualDeviceConfig idc = CreateDeviceConfig(config, helper, deviceName); | ||
|  | 
 | ||
|  |                     helper.CheckForUnrecognizedAttributes(); | ||
|  | 
 | ||
|  |                     // Iterate through every control adapter | ||
|  |                     // within the <device> | ||
|  |                     foreach(XmlNode currentChild in nextNode.ChildNodes) | ||
|  |                     { | ||
|  |                         helper.Node = currentChild; | ||
|  | 
 | ||
|  |                         if(helper.IsWhitespaceOrComment()) | ||
|  |                         { | ||
|  |                             continue; | ||
|  |                         } | ||
|  | 
 | ||
|  |                         helper.RejectNonElement(); | ||
|  |                          | ||
|  |                         if (!currentChild.Name.Equals("control")) | ||
|  |                         { | ||
|  |                             throw new ConfigurationErrorsException( | ||
|  |                                 SR.GetString(SR.MobileControlsSectionHandler_UnknownElementName, "<control>"), | ||
|  |                                 currentChild); | ||
|  |                         } | ||
|  |                         else | ||
|  |                         { | ||
|  |                             String controlName = helper.RemoveStringAttribute("name", true); | ||
|  |                             String adapterName = helper.RemoveStringAttribute("adapter", true); | ||
|  |                             helper.CheckForUnrecognizedAttributes(); | ||
|  | 
 | ||
|  |                             idc.AddControl(CheckedGetType(controlName, "control", helper, typeof(MobileControl), currentChild), | ||
|  |                                            CheckedGetType(adapterName, "adapter", helper, typeof(IControlAdapter), currentChild)); | ||
|  | 
 | ||
|  |                         } | ||
|  | 
 | ||
|  |                         helper.Node = null; | ||
|  |                     } | ||
|  | 
 | ||
|  |                     // Add complete device config to master configs. | ||
|  |                     if (String.IsNullOrEmpty(deviceName)) { | ||
|  |                         deviceName = Guid.NewGuid().ToString(); | ||
|  |                     } | ||
|  |                      | ||
|  |                     if (!config.AddDeviceConfig(deviceName, idc)) | ||
|  |                     { | ||
|  |                         // Problem is due to a duplicated name | ||
|  |                         throw new ConfigurationErrorsException( | ||
|  |                             SR.GetString(SR.MobileControlsSectionHandler_DuplicatedDeviceName, deviceName), | ||
|  |                             nextNode); | ||
|  |                          | ||
|  |                     } | ||
|  |                      | ||
|  |                     helper.Node = null; | ||
|  |                     break; | ||
|  |                 default: | ||
|  |                     throw new ConfigurationErrorsException( | ||
|  |                         SR.GetString(SR.MobileControlsSectionHandler_UnknownElementName, "<device>"), | ||
|  |                         nextNode); | ||
|  |                 } | ||
|  |             } | ||
|  | 
 | ||
|  |             config.FixupDeviceConfigInheritance(input); | ||
|  | 
 | ||
|  |             return config; | ||
|  |              | ||
|  |         } | ||
|  | 
 | ||
|  |         // Helper to create a device config given the names of methods | ||
|  |         private IndividualDeviceConfig CreateDeviceConfig(ControlsConfig config, | ||
|  |                                                           ConfigurationSectionHelper helper, | ||
|  |                                                           String deviceName) | ||
|  |         { | ||
|  |             String nameOfDeviceToInheritFrom = | ||
|  |                 helper.RemoveStringAttribute("inheritsFrom", false); | ||
|  | 
 | ||
|  |             if (nameOfDeviceToInheritFrom != null && nameOfDeviceToInheritFrom.Length == 0) { | ||
|  |                 nameOfDeviceToInheritFrom = null; | ||
|  |             } | ||
|  |              | ||
|  |             bool propertiesRequired = nameOfDeviceToInheritFrom == null; | ||
|  | 
 | ||
|  |             String predicateClass = helper.RemoveStringAttribute("predicateClass", propertiesRequired); | ||
|  |             // If a predicate class is specified, so must a method. | ||
|  |             String predicateMethod = helper.RemoveStringAttribute("predicateMethod", predicateClass != null); | ||
|  |             String pageAdapterClass = helper.RemoveStringAttribute("pageAdapter", propertiesRequired); | ||
|  | 
 | ||
|  |             IndividualDeviceConfig.DeviceQualifiesDelegate predicateDelegate = null; | ||
|  |             if (predicateClass != null || predicateMethod != null) | ||
|  |             { | ||
|  |                 Type predicateClassType = CheckedGetType(predicateClass, "PredicateClass", helper, null, null); | ||
|  |                 try | ||
|  |                 { | ||
|  |                     predicateDelegate = | ||
|  |                         (IndividualDeviceConfig.DeviceQualifiesDelegate) | ||
|  |                         IndividualDeviceConfig.DeviceQualifiesDelegate.CreateDelegate( | ||
|  |                             typeof(IndividualDeviceConfig.DeviceQualifiesDelegate), | ||
|  |                             predicateClassType, | ||
|  |                             predicateMethod); | ||
|  |                 } | ||
|  |                 catch | ||
|  |                 { | ||
|  |                     throw new ConfigurationErrorsException( | ||
|  |                         SR.GetString(SR.MobileControlsSectionHandler_CantCreateMethodOnClass, | ||
|  |                                      predicateMethod, predicateClassType.FullName), | ||
|  |                         helper.Node); | ||
|  |                 } | ||
|  |             } | ||
|  |                      | ||
|  |             Type pageAdapterType = null; | ||
|  |             if (pageAdapterClass != null) | ||
|  |             { | ||
|  |                 pageAdapterType = CheckedGetType(pageAdapterClass, "PageAdapterClass", helper, typeof(IPageAdapter), null); | ||
|  |             } | ||
|  | 
 | ||
|  |             return new IndividualDeviceConfig(config, | ||
|  |                                               deviceName, | ||
|  |                                               predicateDelegate, | ||
|  |                                               pageAdapterType, | ||
|  |                                               nameOfDeviceToInheritFrom); | ||
|  |         } | ||
|  | 
 | ||
|  | 
 | ||
|  |         // Helper method to encapsulate type lookup followed by | ||
|  |         // throwing a ConfigurationErrorsException on failure. | ||
|  |         private Type CheckedGetType(String typename, | ||
|  |                                     String whereUsed, | ||
|  |                                     ConfigurationSectionHelper helper, | ||
|  |                                     Type typeImplemented, | ||
|  |                                     XmlNode input) | ||
|  |         { | ||
|  |             Type t = Type.GetType(typename); | ||
|  |             if (t == null) { | ||
|  |                 throw new ConfigurationErrorsException( | ||
|  |                     SR.GetString(SR.MobileControlsSectionHandler_TypeNotFound, | ||
|  |                                  typename, | ||
|  |                                  whereUsed), | ||
|  |                     helper.Node); | ||
|  |             } | ||
|  | 
 | ||
|  |             if (typeImplemented != null && !typeImplemented.IsAssignableFrom(t)) { | ||
|  |                 if (input != null) { | ||
|  |                     throw new ConfigurationErrorsException( | ||
|  |                         SR.GetString(SR.MobileControlsSectionHandler_NotAssignable, | ||
|  |                                      t, | ||
|  |                                      typeImplemented), | ||
|  |                         input); | ||
|  |                 } | ||
|  |                 else { | ||
|  |                     throw new ConfigurationErrorsException( | ||
|  |                         SR.GetString(SR.MobileControlsSectionHandler_NotAssignable, | ||
|  |                                      t, | ||
|  |                                      typeImplemented), | ||
|  |                         helper.Node); | ||
|  |                 } | ||
|  |             } | ||
|  | 
 | ||
|  |             return t; | ||
|  |         } | ||
|  | 
 | ||
|  |         #region IConfigurationSectionHandler implementation | ||
|  |         Object IConfigurationSectionHandler.Create(Object parent, Object context, XmlNode input) { | ||
|  |             return Create(parent, context, input); | ||
|  |         } | ||
|  |         #endregion | ||
|  |     } | ||
|  | } |