In .:
[mono.git] / mcs / class / corlib / System.Security.Permissions / FileDialogPermission.cs
1 //
2 // System.Security.Permissions.FileDialogPermission.cs
3 //
4 // Author
5 //      Sebastien Pouliot  <sebastien@ximian.com>
6 //
7 // Copyright (C) 2003 Motus Technologies. http://www.motus.com
8 // Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com)
9 //
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
17 // 
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
20 // 
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 //
29
30 using System.Runtime.InteropServices;
31 \r
32 namespace System.Security.Permissions {\r
33 \r
34 #if NET_2_0
35         [ComVisible (true)]
36 #endif
37         [Serializable]
38         public sealed class FileDialogPermission : CodeAccessPermission, IUnrestrictedPermission, IBuiltInPermission {
39
40                 private const int version = 1;
41
42                 private FileDialogPermissionAccess _access;
43
44                 // Constructors
45
46                 public FileDialogPermission (PermissionState state)
47                 {
48                         if (CheckPermissionState (state, true) == PermissionState.Unrestricted)
49                                 _access = FileDialogPermissionAccess.OpenSave;
50                         else
51                                 _access = FileDialogPermissionAccess.None;
52                 }
53
54                 public FileDialogPermission (FileDialogPermissionAccess access)
55                 {
56                         // reuse validation by the Flags property
57                         Access = access;
58                 }
59
60                 // Properties
61
62                 public FileDialogPermissionAccess Access { 
63                         get { return _access; }
64                         set {
65                                 if (!Enum.IsDefined (typeof (FileDialogPermissionAccess), value)) {
66                                         string msg = String.Format (Locale.GetText ("Invalid enum {0}"), value);
67                                         throw new ArgumentException (msg, "FileDialogPermissionAccess");
68                                 }
69                                 _access = value;
70                         }
71                 }
72
73                 // Methods
74
75                 public override IPermission Copy () 
76                 {
77                         return new FileDialogPermission (_access);
78                 }
79
80                 public override void FromXml (SecurityElement esd) 
81                 {
82                         // General validation in CodeAccessPermission
83                         CheckSecurityElement (esd, "esd", version, version);
84                         // Note: we do not (yet) care about the return value 
85                         // as we only accept version 1 (min/max values)
86
87                         if (IsUnrestricted (esd)) {
88                                 _access = FileDialogPermissionAccess.OpenSave;
89                         }
90                         else {
91                                 string a = esd.Attribute ("Access");
92                                 if (a == null)
93                                         _access = FileDialogPermissionAccess.None;
94                                 else {
95                                         _access = (FileDialogPermissionAccess) Enum.Parse (
96                                                 typeof (FileDialogPermissionAccess), a);
97                                 }
98                         }
99                 }
100
101                 public override IPermission Intersect (IPermission target) 
102                 {
103                         FileDialogPermission fdp = Cast (target);
104                         if (fdp == null)
105                                 return null;
106
107                         FileDialogPermissionAccess a = (_access & fdp._access);
108                         return ((a == FileDialogPermissionAccess.None) ? null : new FileDialogPermission (a));
109                 }
110
111                 public override bool IsSubsetOf (IPermission target) 
112                 {
113                         FileDialogPermission fdp = Cast (target);
114                         if (fdp == null)
115                                 return false;
116
117                         return ((_access & fdp._access) == _access);
118                 }
119
120                 public bool IsUnrestricted () 
121                 {
122                         return (_access == FileDialogPermissionAccess.OpenSave);
123                 }
124
125 #if !NET_2_0
126                 // Same results as base class - so why is it overrided ?
127                 public override string ToString () 
128                 {
129                         return base.ToString ();
130                 }
131 #endif
132
133                 public override SecurityElement ToXml () 
134                 {
135                         SecurityElement se = Element (1);
136                         switch (_access) {
137                                 case FileDialogPermissionAccess.Open:
138                                         se.AddAttribute ("Access", "Open");
139                                         break;
140                                 case FileDialogPermissionAccess.Save:
141                                         se.AddAttribute ("Access", "Save");
142                                         break;
143                                 case FileDialogPermissionAccess.OpenSave:
144                                         se.AddAttribute ("Unrestricted", "true");
145                                         break;
146                         }
147                         return se;
148                 }
149
150                 public override IPermission Union (IPermission target)
151                 {
152                         FileDialogPermission fdp = Cast (target);
153                         if (fdp == null)
154                                 return Copy ();
155
156                         if (IsUnrestricted () || fdp.IsUnrestricted ())
157                                 return new FileDialogPermission (PermissionState.Unrestricted);
158
159                         return new FileDialogPermission (_access | fdp._access);
160                 }
161
162                 // IBuiltInPermission
163                 int IBuiltInPermission.GetTokenIndex ()
164                 {
165                         return (int) BuiltInToken.FileDialog;
166                 }
167
168                 // helpers
169
170                 private FileDialogPermission Cast (IPermission target)
171                 {
172                         if (target == null)
173                                 return null;
174
175                         FileDialogPermission fdp = (target as FileDialogPermission);
176                         if (fdp == null) {
177                                 ThrowInvalidPermission (target, typeof (FileDialogPermission));
178                         }
179
180                         return fdp;
181                 }
182         }
183 }