/*
OpenNxSerialization Framework
Copyright (C) 2006 - 2007 "NeXtreme Innovations"
[The Next Xtreme Innovations]
This program is free software, distributed under the terms of
the GNU General Public License Version 2. See the "License.txt" file
at the top of the source tree.
*/
using System;
using System.Configuration;
using NeXtreme.OpenNxSerialization.Surrogates;
using NeXtreme.OpenNxSerialization.Configuration;
namespace NeXtreme.OpenNxSerialization
{
/// <summary>
/// Class that helps configuration of the serialization infrastructure using a configuration file
/// </summary>
public class NxConfigurator
{
/// <summary>
/// Reads the configuration file and configures the serialization infrastructure
/// </summary>
/// <param name="userLevel">Use <paramref name="userLevel"/> to specify which configuration file
/// is to be represented by the <see cref="System.Configuration.Configuration"/> object returned by
/// <see cref="ConfigurationManager"/> </param>
/// <param name="sectionName">The section name within the configuration file</param>
/// <returns>A configured <see cref="NxTypeSurrogateSelector"/> object</returns>
public static NxTypeSurrogateSelector Configure(ConfigurationUserLevel userLevel, string sectionName)
{
if (sectionName == null)
throw new ArgumentNullException("sectionName");
System.Configuration.Configuration config =
ConfigurationManager.OpenExeConfiguration(userLevel);
NxConfigurationSection configSection = config.GetSection(sectionName) as NxConfigurationSection;
if (configSection == null)
{
return null;
}
return Configure(configSection);
}
/// <summary>
/// Reads the configuration file and configures the serialization infrastructure
/// </summary>
/// <param name="fileName">confgiuration file name</param>
/// <param name="sectionName">The section name within the configuration file</param>
/// <returns>A configured <see cref="NxTypeSurrogateSelector"/> object</returns>
public static NxTypeSurrogateSelector Configure(string fileName, string sectionName)
{
if (fileName == null)
throw new ArgumentNullException("fileName");
if (sectionName == null)
throw new ArgumentNullException("sectionName");
System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(fileName);
NxConfigurationSection configSection = config.GetSection(sectionName) as NxConfigurationSection;
if (configSection == null)
{
return null;
}
return Configure(configSection);
}
/// <summary>
/// Reads the configuration file and configures the serialization infrastructure
/// </summary>
/// <param name="config">A <see cref="System.Configuration.Configuration"/> object</param>
/// <param name="sectionName">The section name within the <see cref="System.Configuration.Configuration"/>
/// object</param>
/// <returns>A configured <see cref="NxTypeSurrogateSelector"/> object</returns>
public static NxTypeSurrogateSelector Configure(System.Configuration.Configuration config, string sectionName)
{
if (config == null)
throw new ArgumentNullException("config");
if (sectionName == null)
throw new ArgumentNullException("sectionName");
NxConfigurationSection configSection = config.GetSection(sectionName) as NxConfigurationSection;
if (configSection == null)
{
return null;
}
return Configure(configSection);
}
/// <summary>
/// Reads the configuration file and configures the serialization infrastructure
/// </summary>
/// <param name="configSection"></param>
/// <returns>A configured <see cref="NxTypeSurrogateSelector"/> object</returns>
public static NxTypeSurrogateSelector Configure(NxConfigurationSection configSection)
{
if (configSection == null)
throw new ArgumentNullException("configSection");
TypeNameConverter convertor = new TypeNameConverter();
NxTypeSurrogateSelector selector = new NxTypeSurrogateSelector(configSection.UseBuiltinSurrogates);
for (int i = 0; i < configSection.KnownSurrogates.Count; i++)
{
NxKnownSurrogateElement surrogateConfig = configSection.KnownSurrogates[i];
Type surrogateType = (Type)convertor.ConvertFrom(surrogateConfig.TypeName);
INxSerializationSurrogate surrogate =
(INxSerializationSurrogate) Activator.CreateInstance(surrogateType, true);
if (surrogateConfig.TypeHandle != 0)
{
selector.RegisterTypeSurrogate(surrogate, (short)surrogateConfig.TypeHandle);
}
else
{
selector.RegisterTypeSurrogate(surrogate);
}
}
NxFormatterServices typeRegistrar = new NxFormatterServices(selector);
for (int i = 0; i < configSection.KnownTypes.Count; i++)
{
NxKnownTypeElement typeConfig = configSection.KnownTypes[i];
Type type = (Type)convertor.ConvertFrom(typeConfig.TypeName);
if (typeConfig.TypeHandle != 0)
{
typeRegistrar.RegisterCompactType(type, (short)typeConfig.TypeHandle);
}
else
{
typeRegistrar.RegisterCompactType(type);
}
}
return selector;
}
}
}