// // System.Xml.Serialization.SerializationCodeGeneratorConfiguration.cs: // // Author: // Lluis Sanchez Gual (lluis@ximian.com) // // (C) 2002, 2003 Ximian, Inc. http://www.ximian.com // // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections; using System.Xml.Serialization; namespace System.Xml.Serialization { [XmlType ("configuration")] internal class SerializationCodeGeneratorConfiguration { [XmlElement ("serializer")] public SerializerInfo[] Serializers; } [XmlType ("serializer")] internal class SerializerInfo { [XmlAttribute ("class")] public string ClassName; [XmlAttribute ("assembly")] public string Assembly; [XmlElement ("reader")] public string ReaderClassName; [XmlElement ("writer")] public string WriterClassName; [XmlElement ("baseSerializer")] public string BaseSerializerClassName; [XmlElement ("implementation")] public string ImplementationClassName; [XmlElement ("noreader")] public bool NoReader; [XmlElement ("nowriter")] public bool NoWriter; [XmlElement ("generateAsInternal")] public bool GenerateAsInternal; [XmlElement ("namespace")] public string Namespace; [XmlArray ("namespaceImports")] [XmlArrayItem ("namespaceImport")] public string [] NamespaceImports; [System.ComponentModel.DefaultValue (SerializationFormat.Literal)] public SerializationFormat SerializationFormat = SerializationFormat.Literal; [XmlElement ("outFileName")] public string OutFileName; [XmlArray ("readerHooks")] public Hook[] ReaderHooks; [XmlArray ("writerHooks")] public Hook[] WriterHooks; public ArrayList GetHooks (HookType hookType, XmlMappingAccess dir, HookAction action, Type type, string member) { if ((dir & XmlMappingAccess.Read) != 0) return FindHook (ReaderHooks, hookType, action, type, member); if ((dir & XmlMappingAccess.Write) != 0) return FindHook (WriterHooks, hookType, action, type, member); else throw new Exception ("INTERNAL ERROR"); } ArrayList FindHook (Hook[] hooks, HookType hookType, HookAction action, Type type, string member) { ArrayList foundHooks = new ArrayList (); if (hooks == null) return foundHooks; foreach (Hook hook in hooks) { if (action == HookAction.InsertBefore && (hook.InsertBefore == null || hook.InsertBefore == "")) continue; else if (action == HookAction.InsertAfter && (hook.InsertAfter == null || hook.InsertAfter == "")) continue; else if (action == HookAction.Replace && (hook.Replace == null || hook.Replace == "")) continue; if (hook.HookType != hookType) continue; if (hook.Select != null) { if (hook.Select.TypeName != null && hook.Select.TypeName != "") if (hook.Select.TypeName != type.FullName) continue; if (hook.Select.TypeMember != null && hook.Select.TypeMember != "") if (hook.Select.TypeMember != member) continue; if (hook.Select.TypeAttributes != null && hook.Select.TypeAttributes.Length > 0) { object[] ats = type.GetCustomAttributes (true); bool found = false; foreach (object at in ats) if (Array.IndexOf (hook.Select.TypeAttributes, at.GetType().FullName) != -1) { found = true; break; } if (!found) continue; } } foundHooks.Add (hook); } return foundHooks; } } [XmlType ("hook")] internal class Hook { [XmlAttribute ("type")] public HookType HookType; [XmlElement ("select")] public Select Select; [XmlElement ("insertBefore")] public string InsertBefore; [XmlElement ("insertAfter")] public string InsertAfter; [XmlElement ("replace")] public string Replace; public string GetCode (HookAction action) { if (action == HookAction.InsertBefore) return InsertBefore; else if (action == HookAction.InsertAfter) return InsertAfter; else return Replace; } } [XmlType ("select")] internal class Select { [XmlElement ("typeName")] public string TypeName; [XmlElement("typeAttribute")] public string[] TypeAttributes; [XmlElement ("typeMember")] public string TypeMember; } internal enum HookAction { InsertBefore, InsertAfter, Replace } [XmlType ("hookType")] internal enum HookType { attributes, elements, unknownAttribute, unknownElement, member, type } }