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.
29 using System.Globalization;
31 namespace System.Security.Permissions {
34 public sealed class StorePermission : CodeAccessPermission, IUnrestrictedPermission {
36 private const int version = 1;
38 private StorePermissionFlags _flags;
41 public StorePermission (PermissionState state)
43 if (PermissionHelper.CheckPermissionState (state, true) == PermissionState.Unrestricted)
44 _flags = StorePermissionFlags.AllFlags;
46 _flags = StorePermissionFlags.NoFlags;
49 public StorePermission (StorePermissionFlags flags)
51 // reuse validation by the Flags property
56 public StorePermissionFlags Flags {
57 get { return _flags; }
59 if ((value != 0) && (value & StorePermissionFlags.AllFlags) == 0) {
60 string msg = String.Format (Locale.GetText ("Invalid enum {0}"), value);
61 throw new ArgumentException (msg, "StorePermissionFlags");
67 public bool IsUnrestricted ()
69 return (_flags == StorePermissionFlags.AllFlags);
72 public override IPermission Copy ()
74 // buggy behaviour - affects other operations that use Copy
75 // reported as FDBK40928
76 if (_flags == StorePermissionFlags.NoFlags)
79 return new StorePermission (_flags);
82 public override IPermission Intersect (IPermission target)
84 StorePermission dp = Cast (target);
88 if (this.IsUnrestricted () && dp.IsUnrestricted ())
89 return new StorePermission (PermissionState.Unrestricted);
90 if (this.IsUnrestricted ())
92 if (dp.IsUnrestricted ())
95 StorePermissionFlags spf = _flags & dp._flags;
96 if (spf == StorePermissionFlags.NoFlags)
99 return new StorePermission (spf);
102 public override IPermission Union (IPermission target)
104 StorePermission dp = Cast (target);
106 return this.Copy (); // will return null for NoFlags
108 if (this.IsUnrestricted () || dp.IsUnrestricted ())
109 return new StorePermission (PermissionState.Unrestricted);
111 StorePermissionFlags spf = _flags | dp._flags;
112 if (spf == StorePermissionFlags.NoFlags)
115 return new StorePermission (spf);
118 public override bool IsSubsetOf (IPermission target)
120 StorePermission dp = Cast (target);
122 return (_flags == StorePermissionFlags.NoFlags);
124 if (dp.IsUnrestricted ())
126 if (this.IsUnrestricted ())
129 return ((_flags & ~dp._flags) == 0);
132 public override void FromXml (SecurityElement e)
134 // General validation in CodeAccessPermission
135 PermissionHelper.CheckSecurityElement (e, "e", version, version);
136 // Note: we do not (yet) care about the return value
137 // as we only accept version 1 (min/max values)
139 string s = e.Attribute ("Flags");
141 _flags = StorePermissionFlags.NoFlags;
143 _flags = (StorePermissionFlags) Enum.Parse (typeof (StorePermissionFlags), s);
146 public override SecurityElement ToXml ()
148 SecurityElement e = PermissionHelper.Element (typeof (StorePermission), version);
149 if (this.IsUnrestricted ()) {
150 e.AddAttribute ("Unrestricted", Boolean.TrueString);
152 e.AddAttribute ("Flags", _flags.ToString ());
159 private StorePermission Cast (IPermission target)
164 StorePermission dp = (target as StorePermission);
166 PermissionHelper.ThrowInvalidPermission (target, typeof (StorePermission));