Evidence.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. // System.Security.Policy.Evidence
  2. //
  3. // Authors:
  4. // Sean MacIsaac ([email protected])
  5. // Nick Drochak ([email protected])
  6. // Jackson Harper ([email protected])
  7. //
  8. // (C) 2001 Ximian, Inc.
  9. using System;
  10. using System.Collections;
  11. namespace System.Security.Policy {
  12. [MonoTODO]
  13. public sealed class Evidence : ICollection, IEnumerable {
  14. private ArrayList hostEvidenceList = new ArrayList ();
  15. private ArrayList assemblyEvidenceList = new ArrayList ();
  16. public Evidence ()
  17. {
  18. }
  19. public Evidence (Evidence evidence)
  20. {
  21. if (evidence != null)
  22. Merge (evidence);
  23. }
  24. public Evidence (object[] hostEvidence, object[] assemblyEvidence )
  25. {
  26. if (null != hostEvidence)
  27. hostEvidenceList.AddRange (hostEvidence);
  28. if (null != assemblyEvidence)
  29. assemblyEvidenceList.AddRange (assemblyEvidence);
  30. }
  31. //
  32. // Public Properties
  33. //
  34. public int Count {
  35. get {
  36. return (hostEvidenceList.Count + assemblyEvidenceList.Count);
  37. }
  38. }
  39. public bool IsReadOnly {
  40. get{ return false; }
  41. }
  42. public bool IsSynchronized {
  43. get { return false; }
  44. }
  45. [MonoTODO]
  46. public bool Locked {
  47. get {
  48. throw new NotImplementedException ();
  49. }
  50. set {
  51. throw new NotImplementedException ();
  52. }
  53. }
  54. public object SyncRoot {
  55. get { return this; }
  56. }
  57. //
  58. // Public Methods
  59. //
  60. public void AddAssembly (object id)
  61. {
  62. assemblyEvidenceList.Add (id);
  63. }
  64. [MonoTODO("If Locked is true and the code that calls this method does not have SecurityPermissionFlag.ControlEvidence a SecurityException should be thrown")]
  65. public void AddHost (object id)
  66. {
  67. hostEvidenceList.Add (id);
  68. }
  69. public void CopyTo (Array array, int index)
  70. {
  71. if (hostEvidenceList.Count > 0)
  72. hostEvidenceList.CopyTo (array,index);
  73. if (assemblyEvidenceList.Count > 0)
  74. assemblyEvidenceList.CopyTo (array,index + hostEvidenceList.Count);
  75. }
  76. public IEnumerator GetEnumerator ()
  77. {
  78. return new EvidenceEnumerator (hostEvidenceList.GetEnumerator (),
  79. assemblyEvidenceList.GetEnumerator ());
  80. }
  81. public IEnumerator GetAssemblyEnumerator ()
  82. {
  83. return assemblyEvidenceList.GetEnumerator ();
  84. }
  85. public IEnumerator GetHostEnumerator ()
  86. {
  87. return hostEvidenceList.GetEnumerator ();
  88. }
  89. public void Merge (Evidence evidence)
  90. {
  91. IEnumerator hostenum, assemblyenum;
  92. hostenum = evidence.GetHostEnumerator ();
  93. while( hostenum.MoveNext () ) {
  94. AddHost (hostenum.Current);
  95. }
  96. assemblyenum = evidence.GetAssemblyEnumerator ();
  97. while( assemblyenum.MoveNext () ) {
  98. AddAssembly (assemblyenum.Current);
  99. }
  100. }
  101. private class EvidenceEnumerator : IEnumerator {
  102. private IEnumerator currentEnum, hostEnum, assemblyEnum;
  103. public EvidenceEnumerator (IEnumerator hostenum, IEnumerator assemblyenum)
  104. {
  105. this.hostEnum = hostenum;
  106. this.assemblyEnum = assemblyenum;
  107. currentEnum = hostEnum;
  108. }
  109. public bool MoveNext ()
  110. {
  111. bool ret = currentEnum.MoveNext ();
  112. if ( !ret && hostEnum == currentEnum ) {
  113. currentEnum = assemblyEnum;
  114. ret = assemblyEnum.MoveNext ();
  115. }
  116. return ret;
  117. }
  118. public void Reset ()
  119. {
  120. hostEnum.Reset ();
  121. assemblyEnum.Reset ();
  122. currentEnum = hostEnum;
  123. }
  124. public object Current {
  125. get {
  126. return currentEnum.Current;
  127. }
  128. }
  129. }
  130. }
  131. }