// // // Copyright (C) Microsoft. All rights reserved. // // using System; using System.Collections.Generic; using System.Globalization; using System.IO; using System.Xml.Serialization; using Microsoft.WindowsServerSolutions.HostedEmail; namespace Contoso.EmailService { internal class EmailServiceConfiguration { private Dictionary opTable; private Configuration config; public EmailServiceConfiguration(string filePath) { if (string.IsNullOrEmpty(filePath)) throw new ArgumentNullException("filePath"); if (!File.Exists(filePath)) throw new ArgumentException( String.Format(CultureInfo.InvariantCulture, "Cannot find configuration file {0}", filePath), "filePath"); LoadConfiguration(filePath); } private int defaultOperationDuration = 0; public int GetOperationDuration(string opName) { OperationEnum op; if (!Enum.TryParse(opName, out op)) return defaultOperationDuration; if (!opTable.ContainsKey(op)) return defaultOperationDuration; int retVal = 0; if (!int.TryParse(opTable[op].DurationInSeconds, out retVal)) return defaultOperationDuration; return retVal; } public HostedEmailAdaptorException GetOperationException(string opName) { OperationEnum op; if (!Enum.TryParse(opName, out op)) return null; if (!opTable.ContainsKey(op)) return null; var operation = opTable[op]; if (operation.Exception == null) return null; return new HostedEmailAdaptorException( operation.Exception.ErrorCode.ToHEAE_ErrorCode(), operation.Exception.ErrorRecord.ToAddinErrorRecord()); } public DistributionGroup[] DistributionGroups { get { return (config == null) ? null : config.DistributionGroups; } } private void LoadConfiguration(string filePath) { using (TextReader tr = new StreamReader(filePath)) { try { XmlSerializer serializer = new XmlSerializer(typeof(Configuration)); config = (Configuration)serializer.Deserialize(tr); if (config == null || config.DefaultOperationDuration == null) { throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, "{0} is not a valid configuration", filePath)); } if (!int.TryParse(config.DefaultOperationDuration, out defaultOperationDuration)) defaultOperationDuration = 0; opTable = new Dictionary(config.Operations.Length); if (config.Operations == null) return; foreach (var op in config.Operations) { opTable[op.Name] = op; } } catch (InvalidOperationException) { //failed to deserialze the configuration file, just throw the exception throw; } } } } }