diff Net/ConnectionList.cs @ 0:3ab940a0c7a0

Initial commit
author Ivo Smits <Ivo@UCIS.nl>
date Tue, 11 Sep 2012 16:28:53 +0200
parents
children 819fb56a56ea
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Net/ConnectionList.cs	Tue Sep 11 16:28:53 2012 +0200
@@ -0,0 +1,133 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+
+namespace UCIS.Net {
+	public class NetworkConnectionList : ICollection<INetworkConnection> {
+		List<INetworkConnection> _list = new List<INetworkConnection>();
+
+		public ulong BytesWritten {
+			get {
+				ulong sum = 0;
+				lock (_list) foreach (INetworkConnection c in _list) sum += c.BytesWritten;
+				return sum;
+			}
+		}
+		public ulong BytesRead {
+			get {
+				ulong sum = 0;
+				lock (_list) foreach (INetworkConnection c in _list) sum += c.BytesRead;
+				return sum;
+			}
+		}
+		public NetworkConnectionList FindByHandler(Object Handler) {
+			NetworkConnectionList l = new NetworkConnectionList();
+			lock (_list) foreach (INetworkConnection c in _list) if (c.Handler == Handler) l.Add(c);
+			return l;
+		}
+		public NetworkConnectionList FindByHandlerType(Type HandlerType) {
+			NetworkConnectionList l = new NetworkConnectionList();
+			lock (_list) foreach (INetworkConnection c in _list) if (c.Handler.GetType() == HandlerType) l.Add(c);
+			return l;
+		}
+		public void CloseAll() {
+			foreach (INetworkConnection c in ToArray()) c.Close();
+		}
+
+		public void Add(INetworkConnection item) {
+			if (item == null) throw new ArgumentNullException("item");
+			lock (_list) _list.Add(item);
+			item.Closed += _ConnectionClosed;
+			if (!item.Connected) Remove(item);
+		}
+		public void Insert(int index, INetworkConnection item) {
+			throw new NotSupportedException();
+		}
+		public bool Remove(INetworkConnection item) {
+			if (item == null) throw new ArgumentNullException("item");
+			item.Closed -= _ConnectionClosed;
+			lock (_list) return _list.Remove(item);
+		}
+		public void RemoveAt(int index) {
+			lock (_list) {
+				INetworkConnection item = _list[index];
+				item.Closed -= _ConnectionClosed;
+				_list.Remove(item);
+			}
+		}
+		public int Count { get { lock (_list) return _list.Count; } }
+		public bool IsReadOnly { get { return false; } }
+		public bool Contains(INetworkConnection item) {
+			lock (_list) return _list.Contains(item);
+		}
+		public void Clear() {
+			lock (_list) {
+				foreach (INetworkConnection c in _list) c.Closed -= _ConnectionClosed;
+				_list.Clear();
+			}
+		}
+		public INetworkConnection this[int index] {
+			get { return _list[index]; }
+			set { throw new NotSupportedException(); }
+		}
+		public int IndexOf(INetworkConnection item) {
+			lock (_list) return _list.IndexOf(item);
+		}
+
+		IEnumerator IEnumerable.GetEnumerator() {
+			return new Enumerator(_list);
+		}
+		public IEnumerator<INetworkConnection> GetEnumerator() {
+			return new Enumerator(_list);
+		}
+
+		public void CopyTo(INetworkConnection[] array, int offset) {
+			lock (_list) _list.CopyTo(array, offset);
+		}
+
+		public INetworkConnection[] ToArray() {
+			lock (_list) return _list.ToArray();
+		}
+
+		private void _ConnectionClosed(Object sender, EventArgs e) {
+			if (sender == null || !(sender is INetworkConnection)) return;
+			Remove((INetworkConnection)sender);
+		}
+
+		private class Enumerator : IEnumerator<INetworkConnection> {
+			int index = 0;
+			INetworkConnection current = null;
+			IList<INetworkConnection> list;
+
+			public Enumerator(IList<INetworkConnection> list) {
+				this.list = list;
+			}
+
+			public void Reset() {
+				index = 0;
+			}
+			public bool MoveNext() {
+				lock (list) {
+					if (index < list.Count) {
+						current = list[index];
+						index++;
+						return true;
+					} else {
+						current = null;
+						return false;
+					}
+				}
+			}
+			public INetworkConnection Current {
+				get { return current; } 
+			}
+			object IEnumerator.Current {
+				get { return current; }
+			}
+			public void Dispose() {
+				current = null;
+				list = null;
+			}
+		}
+	}
+}