| File: FrameworkFork\System.ServiceModel\System\ServiceModel\Security\ReferenceList.cs | Web Access |
| Project: src\src\dotnet-svcutil\lib\src\dotnet-svcutil-lib.csproj (dotnet-svcutil-lib) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. namespace System.ServiceModel.Security { using System.Collections.Generic; using System.IdentityModel; using System.Runtime.CompilerServices; using Microsoft.Xml; using DictionaryManager = System.IdentityModel.DictionaryManager; using ISecurityElement = System.IdentityModel.ISecurityElement; [TypeForwardedFrom("System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")] internal sealed class ReferenceList : ISecurityElement { internal static readonly XmlDictionaryString ElementName = XD.XmlEncryptionDictionary.ReferenceList; private const string NamespacePrefix = XmlEncryptionStrings.Prefix; internal static readonly XmlDictionaryString NamespaceUri = EncryptedType.NamespaceUri; internal static readonly XmlDictionaryString UriAttribute = XD.XmlEncryptionDictionary.URI; private List<string> _referredIds = new List<string>(); public ReferenceList() { } public int DataReferenceCount { get { return _referredIds.Count; } } public bool HasId { get { return false; } } public string Id { get { // PreSharp Bug: Property get methods should not throw exceptions. #pragma warning disable 56503 throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new NotSupportedException()); } } public void AddReferredId(string id) { if (id == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("id")); } _referredIds.Add(id); } public bool ContainsReferredId(string id) { if (id == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("id")); } return _referredIds.Contains(id); } public string GetReferredId(int index) { return _referredIds[index]; } public void ReadFrom(XmlDictionaryReader reader) { reader.ReadStartElement(ElementName, NamespaceUri); while (reader.IsStartElement()) { string id = DataReference.ReadFrom(reader); if (_referredIds.Contains(id)) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError( new SecurityMessageSerializationException(string.Format(SR_IdentityModel.InvalidDataReferenceInReferenceList, "#" + id))); } _referredIds.Add(id); } reader.ReadEndElement(); // ReferenceList if (this.DataReferenceCount == 0) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new SecurityMessageSerializationException(SR_IdentityModel.ReferenceListCannotBeEmpty)); } } public bool TryRemoveReferredId(string id) { if (id == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("id")); } return _referredIds.Remove(id); } public void WriteTo(XmlDictionaryWriter writer, DictionaryManager dictionaryManager) { if (this.DataReferenceCount == 0) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR_IdentityModel.ReferenceListCannotBeEmpty)); } writer.WriteStartElement(NamespacePrefix, ElementName, NamespaceUri); for (int i = 0; i < this.DataReferenceCount; i++) { DataReference.WriteTo(writer, _referredIds[i]); } writer.WriteEndElement(); // ReferenceList } private static class DataReference { internal static readonly XmlDictionaryString ElementName = XD.XmlEncryptionDictionary.DataReference; internal static readonly XmlDictionaryString NamespaceUri = EncryptedType.NamespaceUri; public static string ReadFrom(XmlDictionaryReader reader) { string prefix; string uri = XmlHelper.ReadEmptyElementAndRequiredAttribute(reader, ElementName, NamespaceUri, ReferenceList.UriAttribute, out prefix); if (uri.Length < 2 || uri[0] != '#') { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError( new SecurityMessageSerializationException(string.Format(SR_IdentityModel.InvalidDataReferenceInReferenceList, uri))); } return uri.Substring(1); } public static void WriteTo(XmlDictionaryWriter writer, string referredId) { writer.WriteStartElement(XD.XmlEncryptionDictionary.Prefix.Value, ElementName, NamespaceUri); writer.WriteStartAttribute(ReferenceList.UriAttribute, null); writer.WriteString("#"); writer.WriteString(referredId); writer.WriteEndAttribute(); writer.WriteEndElement(); } } } }