public void GenerateSerializers (TextWriter writer)
{
_writer = writer;
_results = new GenerationResult [_xmlMaps.Length];
WriteLine ("// It is automatically generated");
WriteLine ("using System;");
WriteLine ("using System.Xml;");
WriteLine ("using System.Xml.Schema;");
WriteLine ("using System.Xml.Serialization;");
WriteLine ("using System.Text;");
WriteLine ("using System.Collections;");
WriteLine ("using System.Globalization;");
if (_config != null && _config.NamespaceImports != null && _config.NamespaceImports.Length > 0) {
foreach (string ns in _config.NamespaceImports)
WriteLine ("using " + ns + ";");
}
WriteLine ("");
string readerClassName = null;
string writerClassName = null;
string baseClassName = null;
string implClassName = null;
string namspace = null;
if (_config != null)
{
readerClassName = _config.ReaderClassName;
writerClassName = _config.WriterClassName;
baseClassName = _config.BaseSerializerClassName;
implClassName = _config.ImplementationClassName;
namspace = _config.Namespace;
}
if (readerClassName == null || readerClassName.Length == 0)
readerClassName = "GeneratedReader";
if (writerClassName == null || writerClassName.Length == 0)
writerClassName = "GeneratedWriter";
if (baseClassName == null || baseClassName.Length == 0)
baseClassName = "BaseXmlSerializer";
if (implClassName == null || implClassName.Length == 0)
implClassName = "XmlSerializerContract";
readerClassName = GetUniqueClassName (readerClassName);
writerClassName = GetUniqueClassName (writerClassName);
baseClassName = GetUniqueClassName (baseClassName);
implClassName = GetUniqueClassName (implClassName);
Hashtable mapsByNamespace = new Hashtable ();
Hashtable generatedMaps = new Hashtable ();
for (int n=0; n<_xmlMaps.Length; n++)
{
_typeMap = _xmlMaps [n];
if (_typeMap == null) continue;
_result = generatedMaps [_typeMap] as GenerationResult;
if (_result != null) {
_results[n] = _result;
continue;
}
_result = new GenerationResult ();
_results[n] = _result;
generatedMaps [_typeMap] = _result;
string typeName;
if (_typeMap is XmlTypeMapping) typeName = CodeIdentifier.MakeValid (((XmlTypeMapping)_typeMap).TypeData.CSharpName);
else typeName = ((XmlMembersMapping)_typeMap).ElementName;
_result.ReaderClassName = readerClassName;
_result.WriterClassName = writerClassName;
_result.BaseSerializerClassName = baseClassName;
_result.ImplementationClassName = implClassName;
if (namspace == null || namspace.Length == 0)
_result.Namespace = "Mono.GeneratedSerializers." + _typeMap.Format;
else
_result.Namespace = namspace;
_result.WriteMethodName = GetUniqueName ("rwo", _typeMap, "WriteRoot_" + typeName);
_result.ReadMethodName = GetUniqueName ("rro", _typeMap, "ReadRoot_" + typeName);
_result.Mapping = _typeMap;
ArrayList maps = (ArrayList) mapsByNamespace [_result.Namespace];
if (maps == null) {
maps = new ArrayList ();
mapsByNamespace [_result.Namespace] = maps;
}
maps.Add (_result);
}
foreach (DictionaryEntry entry in mapsByNamespace)
{
ArrayList maps = (ArrayList) entry.Value;
WriteLine ("namespace " + entry.Key);
WriteLineInd ("{");
if (_config == null || !_config.NoReader)
GenerateReader (readerClassName, maps);
WriteLine ("");
if (_config == null || !_config.NoWriter)
GenerateWriter (writerClassName, maps);
WriteLine ("");
#if NET_2_0
GenerateContract (maps);
#endif
WriteLineUni ("}");
WriteLine ("");
}
}