Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / wpf / src / Framework / System / Windows / Documents / Serialization / SerializerDescriptor.cs / 1 / SerializerDescriptor.cs
//---------------------------------------------------------------------------- // //// Copyright (C) Microsoft Corporation. All rights reserved. // // // // Description: Plug-in document serializers implement this class // // See spec at// // History: // 07/16/2005 : oliverfo - Created // //--------------------------------------------------------------------------- namespace System.Windows.Documents.Serialization { using System; using System.Globalization; using System.Collections.Generic; using System.Reflection; using System.Windows; using System.Security; using System.Security.Permissions; using System.Diagnostics.CodeAnalysis; using Microsoft.Win32; using MS.Internal.PresentationFramework; /// /// SerializerDescriptor describes an individual plug-in serializer /// public sealed class SerializerDescriptor { #region Constructors private SerializerDescriptor() { } #endregion #region Private Methods private static string GetNonEmptyRegistryString(RegistryKey key, string value) { string result = key.GetValue(value) as string; if ( result == null ) { throw new KeyNotFoundException(); } return result; } #endregion #region Public Methods ////// Creates a SerializerDescriptor. The interface must be defined in the calling assembly /// The WinFX version, and assembly name, and version are initialized by reflecting on the calling assembly /// ////// Create a SerializerDescriptor from a ISerializerFactory instance /// /// This method currently requires full trust to run. /// ////// The DemandPlugInSerializerPermissions() ensures that this method only works in full trust. /// Full trust is required, so that partial trust applications do not load or use potentially /// unsafe serializer plug ins /// public static SerializerDescriptor CreateFromFactoryInstance( ISerializerFactory factoryInstance ) { SecurityHelper.DemandPlugInSerializerPermissions(); if (factoryInstance == null) { throw new ArgumentNullException("factoryInstance"); } if (factoryInstance.DisplayName == null) { throw new ArgumentException(SR.Get(SRID.SerializerProviderDisplayNameNull)); } if (factoryInstance.ManufacturerName == null) { throw new ArgumentException(SR.Get(SRID.SerializerProviderManufacturerNameNull)); } if (factoryInstance.ManufacturerWebsite == null) { throw new ArgumentException(SR.Get(SRID.SerializerProviderManufacturerWebsiteNull)); } if (factoryInstance.DefaultFileExtension == null) { throw new ArgumentException(SR.Get(SRID.SerializerProviderDefaultFileExtensionNull)); } SerializerDescriptor sd = new SerializerDescriptor(); sd._displayName = factoryInstance.DisplayName; sd._manufacturerName = factoryInstance.ManufacturerName; sd._manufacturerWebsite = factoryInstance.ManufacturerWebsite; sd._defaultFileExtension = factoryInstance.DefaultFileExtension; // When this is called with an instantiated factory object, it must be loadable sd._isLoadable = true; Type factoryType = factoryInstance.GetType(); sd._assemblyName = factoryType.Assembly.FullName; sd._assemblyPath = factoryType.Assembly.Location; sd._assemblyVersion = factoryType.Assembly.GetName().Version; sd._factoryInterfaceName = factoryType.FullName; sd._winFXVersion = typeof(System.Windows.Controls.Button).Assembly.GetName().Version; return sd; } ////// From a SerializerDescriptor (which required full trust to create) /// creates an ISerializerFactory by loading the assembly and reflecting on the type /// ////// Create an ISerializerFactory from a SerializerDescriptor /// /// This method currently requires full trust to run. /// ////// The DemandPlugInSerializerPermissions() ensures that this method only works in full trust. /// Full trust is required, so that partial trust applications do not load or use potentially /// unsafe serializer plug ins /// [SuppressMessage("Microsoft.Security", "CA2001:AvoidCallingProblematicMethods")] internal ISerializerFactory CreateSerializerFactory() { SecurityHelper.DemandPlugInSerializerPermissions(); string assemblyPath = AssemblyPath; // This is the only way to load the plug-in assembly. The only permitted permission // if file read access to the actual plug-in assembly. Assembly plugIn = Assembly.LoadFrom(assemblyPath); ISerializerFactory factory = plugIn.CreateInstance(FactoryInterfaceName) as ISerializerFactory; return factory; } #endregion #region Internal Methods internal void WriteToRegistryKey(RegistryKey key) { key.SetValue("uiLanguage", CultureInfo.CurrentUICulture.Name); key.SetValue("displayName", this.DisplayName); key.SetValue("manufacturerName", this.ManufacturerName); key.SetValue("manufacturerWebsite", this.ManufacturerWebsite); key.SetValue("defaultFileExtension", this.DefaultFileExtension); key.SetValue("assemblyName", this.AssemblyName); key.SetValue("assemblyPath", this.AssemblyPath); key.SetValue("factoryInterfaceName", this.FactoryInterfaceName); key.SetValue("assemblyVersion", this.AssemblyVersion.ToString()); key.SetValue("winFXVersion", this.WinFXVersion.ToString()); } ////// Load a SerializerDescriptor from the registry /// ////// Create a SerializerDescriptor from the registry /// /// This method currently requires full trust to run. /// ////// The DemandPlugInSerializerPermissions() ensures that this method only works in full trust. /// Full trust is required, so that partial trust applications do not load or use potentially /// unsafe serializer plug ins /// internal static SerializerDescriptor CreateFromRegistry(RegistryKey plugIns, string keyName) { SecurityHelper.DemandPlugInSerializerPermissions(); SerializerDescriptor sd = new SerializerDescriptor(); try { RegistryKey key = plugIns.OpenSubKey(keyName); sd._displayName = GetNonEmptyRegistryString(key, "displayName"); sd._manufacturerName = GetNonEmptyRegistryString(key, "manufacturerName"); sd._manufacturerWebsite = new Uri(GetNonEmptyRegistryString(key, "manufacturerWebsite")); sd._defaultFileExtension = GetNonEmptyRegistryString(key, "defaultFileExtension"); sd._assemblyName = GetNonEmptyRegistryString(key, "assemblyName"); sd._assemblyPath = GetNonEmptyRegistryString(key, "assemblyPath"); sd._factoryInterfaceName = GetNonEmptyRegistryString(key, "factoryInterfaceName"); sd._assemblyVersion = new Version(GetNonEmptyRegistryString(key, "assemblyVersion")); sd._winFXVersion = new Version(GetNonEmptyRegistryString(key, "winFXVersion")); string uiLanguage = GetNonEmptyRegistryString(key, "uiLanguage"); key.Close(); // update language strings. if (!uiLanguage.Equals(CultureInfo.CurrentUICulture.Name)) { ISerializerFactory factory = sd.CreateSerializerFactory(); sd._displayName = factory.DisplayName; sd._manufacturerName = factory.ManufacturerName; sd._manufacturerWebsite = factory.ManufacturerWebsite; sd._defaultFileExtension = factory.DefaultFileExtension; key = plugIns.CreateSubKey(keyName); sd.WriteToRegistryKey(key); key.Close(); } } catch (KeyNotFoundException) { sd = null; } if (sd != null) { Assembly plugIn = Assembly.ReflectionOnlyLoadFrom(sd._assemblyPath); if (typeof(System.Windows.Controls.Button).Assembly.GetName().Version == sd._winFXVersion && plugIn != null && plugIn.GetName().Version == sd._assemblyVersion) { sd._isLoadable = true; } } return sd; } #endregion #region Public Properties ////// DisplayName of the Serializer /// public string DisplayName { get { return _displayName; } } ////// ManufacturerName of the Serializer /// public string ManufacturerName { get { return _manufacturerName; } } ////// ManufacturerWebsite of the Serializer /// public Uri ManufacturerWebsite { get { return _manufacturerWebsite; } } ////// Default File Extension of files produced the Serializer /// public string DefaultFileExtension { get { return _defaultFileExtension; } } ////// AssemblyName of the Serializer /// public string AssemblyName { get { return _assemblyName; } } ////// AssemblyPath of the Serializer /// public string AssemblyPath { get { return _assemblyPath; } } ////// FactoryInterfaceName of the Serializer /// public string FactoryInterfaceName { get { return _factoryInterfaceName; } } ////// AssemblyVersion of the Serializer /// public Version AssemblyVersion { get { return _assemblyVersion; } } ////// DisplayName of the Serializer /// public Version WinFXVersion { get { return _winFXVersion; } } ////// returns false if serializer plug-in cannot be loaded on current WinFX version /// public bool IsLoadable { get { return _isLoadable; } } ////// Compares two SerializerDescriptor for equality /// public override bool Equals(object obj) { SerializerDescriptor sd = obj as SerializerDescriptor; if (sd != null) { return sd._displayName == _displayName && sd._assemblyName == _assemblyName && sd._assemblyPath == _assemblyPath && sd._factoryInterfaceName == _factoryInterfaceName && sd._defaultFileExtension == _defaultFileExtension && sd._assemblyVersion == _assemblyVersion && sd._winFXVersion == _winFXVersion; } return false; } ////// Returns a hashcode for this serializer /// public override int GetHashCode() { string id = _displayName + "/" + _assemblyName + "/" + _assemblyPath + "/" + _factoryInterfaceName + "/" + _assemblyVersion + "/" + _winFXVersion; return id.GetHashCode(); } #endregion #region Data private string _displayName; private string _manufacturerName; private Uri _manufacturerWebsite; private string _defaultFileExtension; private string _assemblyName; private string _assemblyPath; private string _factoryInterfaceName; private Version _assemblyVersion; private Version _winFXVersion; private bool _isLoadable; #endregion } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. //---------------------------------------------------------------------------- // //// Copyright (C) Microsoft Corporation. All rights reserved. // // // // Description: Plug-in document serializers implement this class // // See spec at// // History: // 07/16/2005 : oliverfo - Created // //--------------------------------------------------------------------------- namespace System.Windows.Documents.Serialization { using System; using System.Globalization; using System.Collections.Generic; using System.Reflection; using System.Windows; using System.Security; using System.Security.Permissions; using System.Diagnostics.CodeAnalysis; using Microsoft.Win32; using MS.Internal.PresentationFramework; /// /// SerializerDescriptor describes an individual plug-in serializer /// public sealed class SerializerDescriptor { #region Constructors private SerializerDescriptor() { } #endregion #region Private Methods private static string GetNonEmptyRegistryString(RegistryKey key, string value) { string result = key.GetValue(value) as string; if ( result == null ) { throw new KeyNotFoundException(); } return result; } #endregion #region Public Methods ////// Creates a SerializerDescriptor. The interface must be defined in the calling assembly /// The WinFX version, and assembly name, and version are initialized by reflecting on the calling assembly /// ////// Create a SerializerDescriptor from a ISerializerFactory instance /// /// This method currently requires full trust to run. /// ////// The DemandPlugInSerializerPermissions() ensures that this method only works in full trust. /// Full trust is required, so that partial trust applications do not load or use potentially /// unsafe serializer plug ins /// public static SerializerDescriptor CreateFromFactoryInstance( ISerializerFactory factoryInstance ) { SecurityHelper.DemandPlugInSerializerPermissions(); if (factoryInstance == null) { throw new ArgumentNullException("factoryInstance"); } if (factoryInstance.DisplayName == null) { throw new ArgumentException(SR.Get(SRID.SerializerProviderDisplayNameNull)); } if (factoryInstance.ManufacturerName == null) { throw new ArgumentException(SR.Get(SRID.SerializerProviderManufacturerNameNull)); } if (factoryInstance.ManufacturerWebsite == null) { throw new ArgumentException(SR.Get(SRID.SerializerProviderManufacturerWebsiteNull)); } if (factoryInstance.DefaultFileExtension == null) { throw new ArgumentException(SR.Get(SRID.SerializerProviderDefaultFileExtensionNull)); } SerializerDescriptor sd = new SerializerDescriptor(); sd._displayName = factoryInstance.DisplayName; sd._manufacturerName = factoryInstance.ManufacturerName; sd._manufacturerWebsite = factoryInstance.ManufacturerWebsite; sd._defaultFileExtension = factoryInstance.DefaultFileExtension; // When this is called with an instantiated factory object, it must be loadable sd._isLoadable = true; Type factoryType = factoryInstance.GetType(); sd._assemblyName = factoryType.Assembly.FullName; sd._assemblyPath = factoryType.Assembly.Location; sd._assemblyVersion = factoryType.Assembly.GetName().Version; sd._factoryInterfaceName = factoryType.FullName; sd._winFXVersion = typeof(System.Windows.Controls.Button).Assembly.GetName().Version; return sd; } ////// From a SerializerDescriptor (which required full trust to create) /// creates an ISerializerFactory by loading the assembly and reflecting on the type /// ////// Create an ISerializerFactory from a SerializerDescriptor /// /// This method currently requires full trust to run. /// ////// The DemandPlugInSerializerPermissions() ensures that this method only works in full trust. /// Full trust is required, so that partial trust applications do not load or use potentially /// unsafe serializer plug ins /// [SuppressMessage("Microsoft.Security", "CA2001:AvoidCallingProblematicMethods")] internal ISerializerFactory CreateSerializerFactory() { SecurityHelper.DemandPlugInSerializerPermissions(); string assemblyPath = AssemblyPath; // This is the only way to load the plug-in assembly. The only permitted permission // if file read access to the actual plug-in assembly. Assembly plugIn = Assembly.LoadFrom(assemblyPath); ISerializerFactory factory = plugIn.CreateInstance(FactoryInterfaceName) as ISerializerFactory; return factory; } #endregion #region Internal Methods internal void WriteToRegistryKey(RegistryKey key) { key.SetValue("uiLanguage", CultureInfo.CurrentUICulture.Name); key.SetValue("displayName", this.DisplayName); key.SetValue("manufacturerName", this.ManufacturerName); key.SetValue("manufacturerWebsite", this.ManufacturerWebsite); key.SetValue("defaultFileExtension", this.DefaultFileExtension); key.SetValue("assemblyName", this.AssemblyName); key.SetValue("assemblyPath", this.AssemblyPath); key.SetValue("factoryInterfaceName", this.FactoryInterfaceName); key.SetValue("assemblyVersion", this.AssemblyVersion.ToString()); key.SetValue("winFXVersion", this.WinFXVersion.ToString()); } ////// Load a SerializerDescriptor from the registry /// ////// Create a SerializerDescriptor from the registry /// /// This method currently requires full trust to run. /// ////// The DemandPlugInSerializerPermissions() ensures that this method only works in full trust. /// Full trust is required, so that partial trust applications do not load or use potentially /// unsafe serializer plug ins /// internal static SerializerDescriptor CreateFromRegistry(RegistryKey plugIns, string keyName) { SecurityHelper.DemandPlugInSerializerPermissions(); SerializerDescriptor sd = new SerializerDescriptor(); try { RegistryKey key = plugIns.OpenSubKey(keyName); sd._displayName = GetNonEmptyRegistryString(key, "displayName"); sd._manufacturerName = GetNonEmptyRegistryString(key, "manufacturerName"); sd._manufacturerWebsite = new Uri(GetNonEmptyRegistryString(key, "manufacturerWebsite")); sd._defaultFileExtension = GetNonEmptyRegistryString(key, "defaultFileExtension"); sd._assemblyName = GetNonEmptyRegistryString(key, "assemblyName"); sd._assemblyPath = GetNonEmptyRegistryString(key, "assemblyPath"); sd._factoryInterfaceName = GetNonEmptyRegistryString(key, "factoryInterfaceName"); sd._assemblyVersion = new Version(GetNonEmptyRegistryString(key, "assemblyVersion")); sd._winFXVersion = new Version(GetNonEmptyRegistryString(key, "winFXVersion")); string uiLanguage = GetNonEmptyRegistryString(key, "uiLanguage"); key.Close(); // update language strings. if (!uiLanguage.Equals(CultureInfo.CurrentUICulture.Name)) { ISerializerFactory factory = sd.CreateSerializerFactory(); sd._displayName = factory.DisplayName; sd._manufacturerName = factory.ManufacturerName; sd._manufacturerWebsite = factory.ManufacturerWebsite; sd._defaultFileExtension = factory.DefaultFileExtension; key = plugIns.CreateSubKey(keyName); sd.WriteToRegistryKey(key); key.Close(); } } catch (KeyNotFoundException) { sd = null; } if (sd != null) { Assembly plugIn = Assembly.ReflectionOnlyLoadFrom(sd._assemblyPath); if (typeof(System.Windows.Controls.Button).Assembly.GetName().Version == sd._winFXVersion && plugIn != null && plugIn.GetName().Version == sd._assemblyVersion) { sd._isLoadable = true; } } return sd; } #endregion #region Public Properties ////// DisplayName of the Serializer /// public string DisplayName { get { return _displayName; } } ////// ManufacturerName of the Serializer /// public string ManufacturerName { get { return _manufacturerName; } } ////// ManufacturerWebsite of the Serializer /// public Uri ManufacturerWebsite { get { return _manufacturerWebsite; } } ////// Default File Extension of files produced the Serializer /// public string DefaultFileExtension { get { return _defaultFileExtension; } } ////// AssemblyName of the Serializer /// public string AssemblyName { get { return _assemblyName; } } ////// AssemblyPath of the Serializer /// public string AssemblyPath { get { return _assemblyPath; } } ////// FactoryInterfaceName of the Serializer /// public string FactoryInterfaceName { get { return _factoryInterfaceName; } } ////// AssemblyVersion of the Serializer /// public Version AssemblyVersion { get { return _assemblyVersion; } } ////// DisplayName of the Serializer /// public Version WinFXVersion { get { return _winFXVersion; } } ////// returns false if serializer plug-in cannot be loaded on current WinFX version /// public bool IsLoadable { get { return _isLoadable; } } ////// Compares two SerializerDescriptor for equality /// public override bool Equals(object obj) { SerializerDescriptor sd = obj as SerializerDescriptor; if (sd != null) { return sd._displayName == _displayName && sd._assemblyName == _assemblyName && sd._assemblyPath == _assemblyPath && sd._factoryInterfaceName == _factoryInterfaceName && sd._defaultFileExtension == _defaultFileExtension && sd._assemblyVersion == _assemblyVersion && sd._winFXVersion == _winFXVersion; } return false; } ////// Returns a hashcode for this serializer /// public override int GetHashCode() { string id = _displayName + "/" + _assemblyName + "/" + _assemblyPath + "/" + _factoryInterfaceName + "/" + _assemblyVersion + "/" + _winFXVersion; return id.GetHashCode(); } #endregion #region Data private string _displayName; private string _manufacturerName; private Uri _manufacturerWebsite; private string _defaultFileExtension; private string _assemblyName; private string _assemblyPath; private string _factoryInterfaceName; private Version _assemblyVersion; private Version _winFXVersion; private bool _isLoadable; #endregion } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- AdvancedBindingPropertyDescriptor.cs
- TrailingSpaceComparer.cs
- IisTraceWebEventProvider.cs
- SchemaTypeEmitter.cs
- AncestorChangedEventArgs.cs
- StateBag.cs
- XmlAtomErrorReader.cs
- AssemblySettingAttributes.cs
- WebPartManager.cs
- AutoResizedEvent.cs
- XmlEnumAttribute.cs
- ArgumentNullException.cs
- IconEditor.cs
- ToolStripComboBox.cs
- WsatRegistrationHeader.cs
- SharedPersonalizationStateInfo.cs
- AdCreatedEventArgs.cs
- TemplatedMailWebEventProvider.cs
- Rect.cs
- CaseCqlBlock.cs
- GenericXmlSecurityToken.cs
- Timer.cs
- ReflectionPermission.cs
- OlePropertyStructs.cs
- KnownTypesProvider.cs
- QilLoop.cs
- DependencyObject.cs
- StsCommunicationException.cs
- FormViewInsertedEventArgs.cs
- ResolvedKeyFrameEntry.cs
- DesignColumnCollection.cs
- InputLangChangeEvent.cs
- TreeView.cs
- SqlResolver.cs
- ApplicationId.cs
- ScopeCollection.cs
- WindowsGraphicsCacheManager.cs
- Viewport3DVisual.cs
- StyleXamlTreeBuilder.cs
- StringHelper.cs
- SessionSwitchEventArgs.cs
- HandledEventArgs.cs
- ServiceModelInstallComponent.cs
- OAVariantLib.cs
- securestring.cs
- XmlSchemaAnnotation.cs
- WeakReference.cs
- Utils.cs
- XmlQualifiedNameTest.cs
- MatrixTransform3D.cs
- BasicViewGenerator.cs
- HtmlTableRow.cs
- HostVisual.cs
- __TransparentProxy.cs
- HotCommands.cs
- HtmlImage.cs
- MenuCommandService.cs
- LazyLoadBehavior.cs
- ReachDocumentPageSerializerAsync.cs
- tooltip.cs
- DataGridViewSelectedColumnCollection.cs
- QueryRewriter.cs
- TypeLoadException.cs
- XamlFxTrace.cs
- RSAOAEPKeyExchangeFormatter.cs
- XmlReflectionImporter.cs
- CodeObject.cs
- SmiContext.cs
- KeysConverter.cs
- SessionStateModule.cs
- StateMachineTimers.cs
- IgnoreDeviceFilterElement.cs
- StaticResourceExtension.cs
- PreProcessor.cs
- PageEventArgs.cs
- Oid.cs
- SHA512Managed.cs
- TargetPerspective.cs
- OutputCacheSection.cs
- StoreConnection.cs
- TreeIterators.cs
- DataGridRowAutomationPeer.cs
- Vector3DKeyFrameCollection.cs
- EntitySetDataBindingList.cs
- XsdDateTime.cs
- CodePrimitiveExpression.cs
- CompModSwitches.cs
- ChangeProcessor.cs
- TextClipboardData.cs
- DecoratedNameAttribute.cs
- GridEntryCollection.cs
- AspNetSynchronizationContext.cs
- FontStretches.cs
- PrintingPermissionAttribute.cs
- ObjectItemAssemblyLoader.cs
- RestClientProxyHandler.cs
- LedgerEntryCollection.cs
- RuntimeConfigLKG.cs
- TextAutomationPeer.cs
- AutomationPatternInfo.cs