Mercurial > hg > ucis.core
annotate Net/ConnectionList.cs @ 111:df53bdd49507 default tip
Merge
author | Ivo Smits <Ivo@UCIS.nl> |
---|---|
date | Fri, 07 Nov 2014 18:37:39 +0100 |
parents | 819fb56a56ea |
children |
rev | line source |
---|---|
0 | 1 ???using System; |
2 using System.Collections; | |
3 using System.Collections.Generic; | |
4 | |
5 namespace UCIS.Net { | |
6 public class NetworkConnectionList : ICollection<INetworkConnection> { | |
7 List<INetworkConnection> _list = new List<INetworkConnection>(); | |
8 | |
9 public ulong BytesWritten { | |
10 get { | |
11 ulong sum = 0; | |
12 lock (_list) foreach (INetworkConnection c in _list) sum += c.BytesWritten; | |
13 return sum; | |
14 } | |
15 } | |
16 public ulong BytesRead { | |
17 get { | |
18 ulong sum = 0; | |
19 lock (_list) foreach (INetworkConnection c in _list) sum += c.BytesRead; | |
20 return sum; | |
21 } | |
22 } | |
23 public NetworkConnectionList FindByHandler(Object Handler) { | |
24 NetworkConnectionList l = new NetworkConnectionList(); | |
25 lock (_list) foreach (INetworkConnection c in _list) if (c.Handler == Handler) l.Add(c); | |
26 return l; | |
27 } | |
28 public NetworkConnectionList FindByHandlerType(Type HandlerType) { | |
29 NetworkConnectionList l = new NetworkConnectionList(); | |
30 lock (_list) foreach (INetworkConnection c in _list) if (c.Handler.GetType() == HandlerType) l.Add(c); | |
31 return l; | |
32 } | |
33 public void CloseAll() { | |
34 foreach (INetworkConnection c in ToArray()) c.Close(); | |
35 } | |
36 | |
37 public void Add(INetworkConnection item) { | |
38 if (item == null) throw new ArgumentNullException("item"); | |
39 lock (_list) _list.Add(item); | |
40 item.Closed += _ConnectionClosed; | |
41 if (!item.Connected) Remove(item); | |
42 } | |
43 public void Insert(int index, INetworkConnection item) { | |
44 throw new NotSupportedException(); | |
45 } | |
46 public bool Remove(INetworkConnection item) { | |
47 if (item == null) throw new ArgumentNullException("item"); | |
48 item.Closed -= _ConnectionClosed; | |
49 lock (_list) return _list.Remove(item); | |
50 } | |
51 public void RemoveAt(int index) { | |
52 lock (_list) { | |
53 INetworkConnection item = _list[index]; | |
54 item.Closed -= _ConnectionClosed; | |
55 _list.Remove(item); | |
56 } | |
57 } | |
58 public int Count { get { lock (_list) return _list.Count; } } | |
59 public bool IsReadOnly { get { return false; } } | |
60 public bool Contains(INetworkConnection item) { | |
61 lock (_list) return _list.Contains(item); | |
62 } | |
63 public void Clear() { | |
64 lock (_list) { | |
65 foreach (INetworkConnection c in _list) c.Closed -= _ConnectionClosed; | |
66 _list.Clear(); | |
67 } | |
68 } | |
69 public INetworkConnection this[int index] { | |
108
819fb56a56ea
Removed rate limiting code from TCPServer
Ivo Smits <Ivo@UCIS.nl>
parents:
0
diff
changeset
|
70 get { lock (_list) return _list[index]; } |
0 | 71 set { throw new NotSupportedException(); } |
72 } | |
73 public int IndexOf(INetworkConnection item) { | |
74 lock (_list) return _list.IndexOf(item); | |
75 } | |
76 | |
77 IEnumerator IEnumerable.GetEnumerator() { | |
78 return new Enumerator(_list); | |
79 } | |
80 public IEnumerator<INetworkConnection> GetEnumerator() { | |
81 return new Enumerator(_list); | |
82 } | |
83 | |
84 public void CopyTo(INetworkConnection[] array, int offset) { | |
85 lock (_list) _list.CopyTo(array, offset); | |
86 } | |
87 | |
88 public INetworkConnection[] ToArray() { | |
89 lock (_list) return _list.ToArray(); | |
90 } | |
91 | |
92 private void _ConnectionClosed(Object sender, EventArgs e) { | |
93 if (sender == null || !(sender is INetworkConnection)) return; | |
94 Remove((INetworkConnection)sender); | |
95 } | |
96 | |
97 private class Enumerator : IEnumerator<INetworkConnection> { | |
98 int index = 0; | |
99 INetworkConnection current = null; | |
100 IList<INetworkConnection> list; | |
101 | |
102 public Enumerator(IList<INetworkConnection> list) { | |
103 this.list = list; | |
104 } | |
105 | |
106 public void Reset() { | |
107 index = 0; | |
108 } | |
109 public bool MoveNext() { | |
110 lock (list) { | |
111 if (index < list.Count) { | |
112 current = list[index]; | |
113 index++; | |
114 return true; | |
115 } else { | |
116 current = null; | |
117 return false; | |
118 } | |
119 } | |
120 } | |
121 public INetworkConnection Current { | |
122 get { return current; } | |
123 } | |
124 object IEnumerator.Current { | |
125 get { return current; } | |
126 } | |
127 public void Dispose() { | |
128 current = null; | |
129 list = null; | |
130 } | |
131 } | |
132 } | |
133 } |