// // MessageProperties.cs // // Author: // Atsushi Enomoto // // Copyright (C) 2005 Novell, Inc. http://www.novell.com // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ServiceModel.Channels; using System.ServiceModel.Security; using Pair = System.Collections.Generic.KeyValuePair; namespace System.ServiceModel.Channels { [MonoTODO ("it's untested")] public sealed class MessageProperties : IDictionary, ICollection, IEnumerable, IEnumerable, IDisposable { bool allow_output_batch; MessageEncoder encoder; Uri via; List list; public MessageProperties () { list = new List (); } public MessageProperties (MessageProperties properties) { properties.CopyProperties (this); } [MonoTODO ("This should actually be internal of a property.")] public bool AllowOutputBatching { get { return allow_output_batch; } set { allow_output_batch = value; } } public int Count { get { return list.Count; } } [MonoTODO ("This should actually be internal of a property.")] public MessageEncoder Encoder { get { return encoder; } set { encoder = value; } } public bool IsFixedSize { get { return false; } } public bool IsReadOnly { get { return false; } } public ICollection Keys { get { return new ParameterKeyCollection (list); } } public object this [string name] { get { for (int i = 0; i < list.Count; i++) if (list [i].Key == name) return list [i].Value; return null; } set { for (int i = 0; i < list.Count; i++) if (list [i].Key == name) { list [i] = new Pair (name, value); return; } list.Add (new Pair (name, value)); } } #if !NET_2_1 public SecurityMessageProperty Security { get { return (SecurityMessageProperty) this ["Security"]; } set { this ["Security"] = value; } } #endif public ICollection Values { get { return new ParameterValueCollection (list); } } [MonoTODO ("This should actually be internal of a property.")] public Uri Via { get { return via; } set { via = value; } } public void Add (string name, object property) { list.Add (new Pair (name, property)); } public void Clear () { list.Clear (); } public bool ContainsKey (string name) { for (int i = 0; i < list.Count; i++) if (list [i].Key == name) return true; return false; } public void CopyProperties (MessageProperties properties) { list = new List (properties.list); allow_output_batch = properties.allow_output_batch; encoder = properties.encoder; via = properties.via; } public void Dispose () { } public bool Remove (string name) { for (int i = 0; i < list.Count; i++) if (list [i].Key == name) { list.RemoveAt (i); return true; } return false; } public bool TryGetValue (string name, out object value) { for (int i = 0; i < list.Count; i++) if (list [i].Key == name) { value = list [i].Value; return true; } value = null; return false; } void ICollection.Add (Pair pair) { list.Add (pair); } bool ICollection.Contains (Pair pair) { return list.Contains (pair); } void ICollection.CopyTo (Pair [] array, int index) { list.CopyTo (array, index); } bool ICollection.Remove (Pair pair) { return list.Remove (pair); } IEnumerator IEnumerable.GetEnumerator () { return list.GetEnumerator (); } IEnumerator IEnumerable.GetEnumerator () { return (IEnumerator) ((IEnumerable) this).GetEnumerator (); } class ParameterKeyCollection : ICollection { List source; public ParameterKeyCollection (List source) { this.source = source; } public int Count { get { return source.Count; } } public bool IsReadOnly { get { return true; } } public void Add (string item) { throw new InvalidOperationException (); } public void Clear () { throw new InvalidOperationException (); } public bool Contains (string item) { for (int i = 0; i < source.Count; i++) if (source [i].Key == item) return true; return false; } public void CopyTo (string [] array, int index) { for (int i = 0; i < source.Count; i++) array [index + i] = source [i].Key; } public IEnumerator GetEnumerator () { foreach (Pair p in source) yield return p.Key; } IEnumerator IEnumerable.GetEnumerator () { foreach (Pair p in source) yield return p.Key; } public bool Remove (string item) { throw new InvalidOperationException (); } } class ParameterValueCollection : ICollection { List source; public ParameterValueCollection (List source) { this.source = source; } public int Count { get { return source.Count; } } public bool IsReadOnly { get { return true; } } public void Add (object item) { throw new InvalidOperationException (); } public void Clear () { throw new InvalidOperationException (); } public bool Contains (object item) { for (int i = 0; i < source.Count; i++) if (source [i].Value == item) return true; return false; } public void CopyTo (object [] array, int index) { for (int i = 0; i < source.Count; i++) array [index + i] = source [i].Value; } public IEnumerator GetEnumerator () { foreach (Pair p in source) yield return p.Value; } IEnumerator IEnumerable.GetEnumerator () { foreach (Pair p in source) yield return p.Key; } public bool Remove (object item) { throw new InvalidOperationException (); } } } }