2 // System.Security.Permissions.StorePermission class
5 // Sebastien Pouliot <sebastien@ximian.com>
7 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 using System.Globalization;
33 namespace System.Security.Permissions {
36 public sealed class StorePermission : CodeAccessPermission, IUnrestrictedPermission {
38 private const int version = 1;
40 private StorePermissionFlags _flags;
43 public StorePermission (PermissionState state)
45 if (PermissionHelper.CheckPermissionState (state, true) == PermissionState.Unrestricted)
46 _flags = StorePermissionFlags.AllFlags;
48 _flags = StorePermissionFlags.NoFlags;
51 public StorePermission (StorePermissionFlags flags)
53 // reuse validation by the Flags property
58 public StorePermissionFlags Flags {
59 get { return _flags; }
61 if ((value != 0) && (value & StorePermissionFlags.AllFlags) == 0) {
62 string msg = String.Format (Locale.GetText ("Invalid enum {0}"), value);
63 throw new ArgumentException (msg, "StorePermissionFlags");
69 public bool IsUnrestricted ()
71 return (_flags == StorePermissionFlags.AllFlags);
74 public override IPermission Copy ()
76 // buggy behaviour - affects other operations that use Copy
77 // reported as FDBK40928
78 if (_flags == StorePermissionFlags.NoFlags)
81 return new StorePermission (_flags);
84 public override IPermission Intersect (IPermission target)
86 StorePermission dp = Cast (target);
90 if (this.IsUnrestricted () && dp.IsUnrestricted ())
91 return new StorePermission (PermissionState.Unrestricted);
92 if (this.IsUnrestricted ())
94 if (dp.IsUnrestricted ())
97 StorePermissionFlags spf = _flags & dp._flags;
98 if (spf == StorePermissionFlags.NoFlags)
101 return new StorePermission (spf);
104 public override IPermission Union (IPermission target)
106 StorePermission dp = Cast (target);
108 return this.Copy (); // will return null for NoFlags
110 if (this.IsUnrestricted () || dp.IsUnrestricted ())
111 return new StorePermission (PermissionState.Unrestricted);
113 StorePermissionFlags spf = _flags | dp._flags;
114 if (spf == StorePermissionFlags.NoFlags)
117 return new StorePermission (spf);
120 public override bool IsSubsetOf (IPermission target)
122 StorePermission dp = Cast (target);
124 return (_flags == StorePermissionFlags.NoFlags);
126 if (dp.IsUnrestricted ())
128 if (this.IsUnrestricted ())
131 return ((_flags & ~dp._flags) == 0);
134 public override void FromXml (SecurityElement e)
136 // General validation in CodeAccessPermission
137 PermissionHelper.CheckSecurityElement (e, "e", version, version);
138 // Note: we do not (yet) care about the return value
139 // as we only accept version 1 (min/max values)
141 string s = e.Attribute ("Flags");
143 _flags = StorePermissionFlags.NoFlags;
145 _flags = (StorePermissionFlags) Enum.Parse (typeof (StorePermissionFlags), s);
148 public override SecurityElement ToXml ()
150 SecurityElement e = PermissionHelper.Element (typeof (StorePermission), version);
151 if (this.IsUnrestricted ()) {
152 e.AddAttribute ("Unrestricted", Boolean.TrueString);
154 e.AddAttribute ("Flags", _flags.ToString ());
161 private StorePermission Cast (IPermission target)
166 StorePermission dp = (target as StorePermission);
168 PermissionHelper.ThrowInvalidPermission (target, typeof (StorePermission));