Merge branch 'master' of github.com:tgiphil/mono
[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         [ComVisible (true)]
35         [Serializable]
36         public sealed class FileDialogPermission : CodeAccessPermission, IUnrestrictedPermission, IBuiltInPermission {
37
38                 private const int version = 1;
39
40                 private FileDialogPermissionAccess _access;
41
42                 // Constructors
43
44                 public FileDialogPermission (PermissionState state)
45                 {
46                         if (CheckPermissionState (state, true) == PermissionState.Unrestricted)
47                                 _access = FileDialogPermissionAccess.OpenSave;
48                         else
49                                 _access = FileDialogPermissionAccess.None;
50                 }
51
52                 public FileDialogPermission (FileDialogPermissionAccess access)
53                 {
54                         // reuse validation by the Flags property
55                         Access = access;
56                 }
57
58                 // Properties
59
60                 public FileDialogPermissionAccess Access { 
61                         get { return _access; }
62                         set {
63                                 if (!Enum.IsDefined (typeof (FileDialogPermissionAccess), value)) {
64                                         string msg = String.Format (Locale.GetText ("Invalid enum {0}"), value);
65                                         throw new ArgumentException (msg, "FileDialogPermissionAccess");
66                                 }
67                                 _access = value;
68                         }
69                 }
70
71                 // Methods
72
73                 public override IPermission Copy () 
74                 {
75                         return new FileDialogPermission (_access);
76                 }
77
78                 public override void FromXml (SecurityElement esd) 
79                 {
80                         // General validation in CodeAccessPermission
81                         CheckSecurityElement (esd, "esd", version, version);
82                         // Note: we do not (yet) care about the return value 
83                         // as we only accept version 1 (min/max values)
84
85                         if (IsUnrestricted (esd)) {
86                                 _access = FileDialogPermissionAccess.OpenSave;
87                         }
88                         else {
89                                 string a = esd.Attribute ("Access");
90                                 if (a == null)
91                                         _access = FileDialogPermissionAccess.None;
92                                 else {
93                                         _access = (FileDialogPermissionAccess) Enum.Parse (
94                                                 typeof (FileDialogPermissionAccess), a);
95                                 }
96                         }
97                 }
98
99                 public override IPermission Intersect (IPermission target) 
100                 {
101                         FileDialogPermission fdp = Cast (target);
102                         if (fdp == null)
103                                 return null;
104
105                         FileDialogPermissionAccess a = (_access & fdp._access);
106                         return ((a == FileDialogPermissionAccess.None) ? null : new FileDialogPermission (a));
107                 }
108
109                 public override bool IsSubsetOf (IPermission target) 
110                 {
111                         FileDialogPermission fdp = Cast (target);
112                         if (fdp == null)
113                                 return false;
114
115                         return ((_access & fdp._access) == _access);
116                 }
117
118                 public bool IsUnrestricted () 
119                 {
120                         return (_access == FileDialogPermissionAccess.OpenSave);
121                 }
122
123                 public override SecurityElement ToXml () 
124                 {
125                         SecurityElement se = Element (1);
126                         switch (_access) {
127                                 case FileDialogPermissionAccess.Open:
128                                         se.AddAttribute ("Access", "Open");
129                                         break;
130                                 case FileDialogPermissionAccess.Save:
131                                         se.AddAttribute ("Access", "Save");
132                                         break;
133                                 case FileDialogPermissionAccess.OpenSave:
134                                         se.AddAttribute ("Unrestricted", "true");
135                                         break;
136                         }
137                         return se;
138                 }
139
140                 public override IPermission Union (IPermission target)
141                 {
142                         FileDialogPermission fdp = Cast (target);
143                         if (fdp == null)
144                                 return Copy ();
145
146                         if (IsUnrestricted () || fdp.IsUnrestricted ())
147                                 return new FileDialogPermission (PermissionState.Unrestricted);
148
149                         return new FileDialogPermission (_access | fdp._access);
150                 }
151
152                 // IBuiltInPermission
153                 int IBuiltInPermission.GetTokenIndex ()
154                 {
155                         return (int) BuiltInToken.FileDialog;
156                 }
157
158                 // helpers
159
160                 private FileDialogPermission Cast (IPermission target)
161                 {
162                         if (target == null)
163                                 return null;
164
165                         FileDialogPermission fdp = (target as FileDialogPermission);
166                         if (fdp == null) {
167                                 ThrowInvalidPermission (target, typeof (FileDialogPermission));
168                         }
169
170                         return fdp;
171                 }
172         }
173 }