2 // System.Security.Policy.Evidence
5 // Sean MacIsaac (macisaac@ximian.com)
6 // Nick Drochak (ndrochak@gol.com)
7 // Jackson Harper (Jackson@LatitudeGeo.com)
8 // Sebastien Pouliot (spouliot@motus.com)
10 // (C) 2001 Ximian, Inc.
11 // Portions (C) 2003, 2004 Motus Technologies Inc. (http://www.motus.com)
15 using System.Collections;
16 using System.Security.Permissions;
18 namespace System.Security.Policy {
21 public sealed class Evidence : ICollection, IEnumerable {
24 private ArrayList hostEvidenceList;
25 private ArrayList assemblyEvidenceList;
29 hostEvidenceList = ArrayList.Synchronized (new ArrayList ());
30 assemblyEvidenceList = ArrayList.Synchronized (new ArrayList ());
33 public Evidence (Evidence evidence) : this ()
39 public Evidence (object[] hostEvidence, object[] assemblyEvidence) : this ()
41 if (null != hostEvidence)
42 hostEvidenceList.AddRange (hostEvidence);
43 if (null != assemblyEvidence)
44 assemblyEvidenceList.AddRange (assemblyEvidence);
53 return (hostEvidenceList.Count + assemblyEvidenceList.Count);
57 public bool IsReadOnly {
61 // LAMESPEC: Always TRUE (not FALSE)
62 public bool IsSynchronized {
67 get { return _locked; }
69 new SecurityPermission (SecurityPermissionFlag.ControlEvidence).Demand ();
74 public object SyncRoot {
82 public void AddAssembly (object id)
84 assemblyEvidenceList.Add (id);
87 public void AddHost (object id)
90 new SecurityPermission (SecurityPermissionFlag.ControlEvidence).Demand ();
92 hostEvidenceList.Add (id);
95 public void CopyTo (Array array, int index)
97 if (hostEvidenceList.Count > 0)
98 hostEvidenceList.CopyTo (array, index);
99 if (assemblyEvidenceList.Count > 0)
100 assemblyEvidenceList.CopyTo (array, index + hostEvidenceList.Count);
103 public IEnumerator GetEnumerator ()
105 return new EvidenceEnumerator (hostEvidenceList.GetEnumerator (),
106 assemblyEvidenceList.GetEnumerator ());
109 public IEnumerator GetAssemblyEnumerator ()
111 return assemblyEvidenceList.GetEnumerator ();
114 public IEnumerator GetHostEnumerator ()
116 return hostEvidenceList.GetEnumerator ();
119 public void Merge (Evidence evidence)
121 IEnumerator hostenum, assemblyenum;
123 hostenum = evidence.GetHostEnumerator ();
124 while( hostenum.MoveNext () ) {
125 AddHost (hostenum.Current);
128 assemblyenum = evidence.GetAssemblyEnumerator ();
129 while( assemblyenum.MoveNext () ) {
130 AddAssembly (assemblyenum.Current);
134 private class EvidenceEnumerator : IEnumerator {
136 private IEnumerator currentEnum, hostEnum, assemblyEnum;
138 public EvidenceEnumerator (IEnumerator hostenum, IEnumerator assemblyenum)
140 this.hostEnum = hostenum;
141 this.assemblyEnum = assemblyenum;
142 currentEnum = hostEnum;
145 public bool MoveNext ()
147 bool ret = currentEnum.MoveNext ();
149 if ( !ret && hostEnum == currentEnum ) {
150 currentEnum = assemblyEnum;
151 ret = assemblyEnum.MoveNext ();
160 assemblyEnum.Reset ();
161 currentEnum = hostEnum;
164 public object Current {
166 return currentEnum.Current;