//----------------------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- namespace System.ServiceModel.Configuration { using System; using System.Configuration; using System.Diagnostics; using System.IO; using System.ServiceModel.Diagnostics.Application; using System.Text; public sealed partial class ServiceActivationElement : ConfigurationElement { const string PathSeparatorString = "/"; const string ReversSlashString = @"\"; class RelativeAddressValidator : ConfigurationValidatorBase { public override bool CanValidate(Type type) { return type == typeof(string); } // we support relativeAddress with formats as fileName.extension and ~/fileName.extension public override void Validate(object value) { string relativeAddress = value as string; // the size of relativeAddress cannot be smaller than 3 as it must have extension if (string.IsNullOrEmpty(relativeAddress) || string.IsNullOrEmpty(relativeAddress.Trim()) || relativeAddress.Length < 3) { throw FxTrace.Exception.AsError(new ArgumentException(SR.GetString(SR.Hosting_RelativeAddressFormatError, relativeAddress))); } //user gives an absolute address, throw, as we do not support absolute address if (relativeAddress.StartsWith(PathSeparatorString, StringComparison.CurrentCultureIgnoreCase) || relativeAddress.StartsWith(ReversSlashString, StringComparison.CurrentCultureIgnoreCase)) { throw FxTrace.Exception.AsError(new ArgumentException(SR.GetString(SR.Hosting_NoAbsoluteRelativeAddress, relativeAddress))); } } } [AttributeUsage(AttributeTargets.Property)] sealed class RelativeAddressValidatorAttribute : ConfigurationValidatorAttribute { public override ConfigurationValidatorBase ValidatorInstance { get { return new RelativeAddressValidator(); } } } public ServiceActivationElement() { } public ServiceActivationElement(string relativeAddress) : this() { if (relativeAddress == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(ConfigurationStrings.RelativeAddress); } this.RelativeAddress = relativeAddress; } public ServiceActivationElement(string relativeAddress, string service) : this(relativeAddress) { this.Service = service; } public ServiceActivationElement(string relativeAddress, string service, string factory) : this(relativeAddress, service) { this.Factory = factory; } [ConfigurationProperty(ConfigurationStrings.RelativeAddress, Options = ConfigurationPropertyOptions.IsRequired | ConfigurationPropertyOptions.IsKey)] [RelativeAddressValidator()] public string RelativeAddress { get { return (string)base[ConfigurationStrings.RelativeAddress]; } set { base[ConfigurationStrings.RelativeAddress] = value; } } [ConfigurationProperty(ConfigurationStrings.Service, Options = ConfigurationPropertyOptions.None)] [StringValidator(MinLength = 0)] public string Service { get { return (string)base[ConfigurationStrings.Service]; } set { if (string.IsNullOrEmpty(value)) { value = string.Empty; } base[ConfigurationStrings.Service] = value; } } [ConfigurationProperty(ConfigurationStrings.Factory, Options = ConfigurationPropertyOptions.None)] [StringValidator(MinLength = 0)] public string Factory { get { return (string)base[ConfigurationStrings.Factory]; } set { if (string.IsNullOrEmpty(value)) { value = string.Empty; } base[ConfigurationStrings.Factory] = value; } } } }