2 // System.IO.IsolatedStorage.IsolatedStorageFileStream
5 // Sean MacIsaac (macisaac@ximian.com)
6 // Sebastien Pouliot <sebastien@ximian.com>
8 // (C) 2001 Ximian, Inc.
9 // Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com)
11 // Permission is hereby granted, free of charge, to any person obtaining
12 // a copy of this software and associated documentation files (the
13 // "Software"), to deal in the Software without restriction, including
14 // without limitation the rights to use, copy, modify, merge, publish,
15 // distribute, sublicense, and/or sell copies of the Software, and to
16 // permit persons to whom the Software is furnished to do so, subject to
17 // the following conditions:
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 using System.Diagnostics;
32 using System.Globalization;
\r
33 using System.Reflection;
34 using System.Security;
35 using System.Security.Permissions;
38 using System.Runtime.InteropServices;
39 using Microsoft.Win32.SafeHandles;
42 namespace System.IO.IsolatedStorage {
47 public class IsolatedStorageFileStream : FileStream {
49 [ReflectionPermission (SecurityAction.Assert, TypeInformation = true)]
50 private static string CreateIsolatedPath (IsolatedStorageFile isf, string path, FileMode mode)
53 throw new ArgumentNullException ("path");
55 if (!Enum.IsDefined (typeof (FileMode), mode))
56 throw new ArgumentException ("mode");
59 // we can't call GetUserStoreForDomain here because it depends on
60 // Assembly.GetCallingAssembly (), which would be our constructor,
61 // i.e. the result would always be mscorlib.dll. So we need to do
62 // a small stack walk to find who's calling the constructor
64 StackFrame sf = new StackFrame (3); // skip self and constructor
65 isf = IsolatedStorageFile.GetStore (IsolatedStorageScope.User | IsolatedStorageScope.Domain | IsolatedStorageScope.Assembly,
66 IsolatedStorageFile.GetDomainIdentityFromEvidence (AppDomain.CurrentDomain.Evidence),
67 IsolatedStorageFile.GetAssemblyIdentityFromEvidence (sf.GetMethod ().ReflectedType.Assembly.UnprotectedGetEvidence ()));
70 // ensure that the _root_ isolated storage can be (and is) created.
71 FileInfo fi = new FileInfo (isf.Root);
72 if (!fi.Directory.Exists)
73 fi.Directory.Create ();
75 // remove the root path character(s) if they exist
76 if (Path.IsPathRooted (path)) {
77 string root = Path.GetPathRoot (path);
78 path = path.Remove (0, root.Length);
81 // other directories (provided by 'path') must already exists
82 string file = Path.Combine (isf.Root, path);
83 fi = new FileInfo (file);
84 if (!fi.Directory.Exists) {
85 // don't leak the path information for isolated storage
86 string msg = Locale.GetText ("Could not find a part of the path \"{0}\".");
87 throw new DirectoryNotFoundException (String.Format (msg, path));
90 // FIXME: this is probably a good place to Assert our security
91 // needs (once Mono supports imperative security stack modifiers)
96 public IsolatedStorageFileStream (string path, FileMode mode)
97 : this (path, mode, (mode == FileMode.Append ? FileAccess.Write : FileAccess.ReadWrite), FileShare.Read, DefaultBufferSize, null)
101 public IsolatedStorageFileStream (string path, FileMode mode, FileAccess access)
102 : this (path, mode, access, access == FileAccess.Write ? FileShare.None : FileShare.Read, DefaultBufferSize, null)
106 public IsolatedStorageFileStream (string path, FileMode mode, FileAccess access, FileShare share)
107 : this (path, mode, access, share, DefaultBufferSize, null)
111 public IsolatedStorageFileStream (string path, FileMode mode, FileAccess access, FileShare share, int bufferSize)
112 : this (path, mode, access, share, bufferSize, null)
116 // FIXME: Further limit the assertion when imperative Assert is implemented
117 [FileIOPermission (SecurityAction.Assert, Unrestricted = true)]
118 public IsolatedStorageFileStream (string path, FileMode mode, FileAccess access, FileShare share, int bufferSize, IsolatedStorageFile isf)
119 : base (CreateIsolatedPath (isf, path, mode), mode, access, share, bufferSize, false, true)
123 public IsolatedStorageFileStream (string path, FileMode mode, FileAccess access, FileShare share, IsolatedStorageFile isf)
124 : this (path, mode, access, share, DefaultBufferSize, isf)
128 public IsolatedStorageFileStream (string path, FileMode mode, FileAccess access, IsolatedStorageFile isf)
129 : this (path, mode, access, access == FileAccess.Write ? FileShare.None : FileShare.Read, DefaultBufferSize, isf)
133 public IsolatedStorageFileStream (string path, FileMode mode, IsolatedStorageFile isf)
134 : this (path, mode, (mode == FileMode.Append ? FileAccess.Write : FileAccess.ReadWrite), FileShare.Read, DefaultBufferSize, isf)
138 public override bool CanRead {
139 get {return base.CanRead;}
142 public override bool CanSeek {
143 get {return base.CanSeek;}
146 public override bool CanWrite {
147 get {return base.CanWrite;}
151 public override SafeFileHandle SafeFileHandle {
152 [SecurityPermission (SecurityAction.LinkDemand, UnmanagedCode = true)]
154 throw new IsolatedStorageException (
155 Locale.GetText ("Information is restricted"));
159 [Obsolete ("Use SafeFileHandle - once available")]
161 public override IntPtr Handle {
162 [SecurityPermission (SecurityAction.LinkDemand, UnmanagedCode = true)]
164 throw new IsolatedStorageException (
165 Locale.GetText ("Information is restricted"));
169 public override bool IsAsync {
170 get {return base.IsAsync;}
173 public override long Length {
174 get {return base.Length;}
177 public override long Position {
178 get {return base.Position;}
179 set {base.Position = value;}
182 public override IAsyncResult BeginRead (byte[] buffer, int offset, int numBytes, AsyncCallback userCallback, object stateObject)
184 return base.BeginRead (buffer, offset, numBytes, userCallback, stateObject);
187 public override IAsyncResult BeginWrite (byte[] buffer, int offset, int numBytes, AsyncCallback userCallback, object stateObject)
189 return base.BeginWrite (buffer, offset, numBytes, userCallback, stateObject);
192 public override void Close ()
197 public override int EndRead (IAsyncResult asyncResult)
199 return base.EndRead (asyncResult);
202 public override void EndWrite (IAsyncResult asyncResult)
204 base.EndWrite (asyncResult);
207 public override void Flush ()
212 public override int Read (byte[] buffer, int offset, int count)
214 return base.Read (buffer, offset, count);
217 public override int ReadByte ()
219 return base.ReadByte ();
222 public override long Seek (long offset, SeekOrigin origin)
224 return base.Seek (offset, origin);
227 public override void SetLength (long value)
229 base.SetLength (value);
232 public override void Write (byte[] buffer, int offset, int count)
234 base.Write (buffer, offset, count);
237 public override void WriteByte (byte value)
239 base.WriteByte (value);
242 protected override void Dispose (bool disposing)
244 base.Dispose (disposing);