X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2Fcorlib%2FSystem.IO%2FFileSystemInfo.cs;h=9c2c3fae9f05eb3f21e12028c6c38e6d343370f9;hb=b52c963187c59fd167cfde556dfd4304f8ded041;hp=b03e43395cdd6d6fa9c2fba974041f3e2b9bf69a;hpb=610d7923acfbdc29cc61e0694b716eea940d819b;p=mono.git diff --git a/mcs/class/corlib/System.IO/FileSystemInfo.cs b/mcs/class/corlib/System.IO/FileSystemInfo.cs index b03e43395cd..9c2c3fae9f0 100644 --- a/mcs/class/corlib/System.IO/FileSystemInfo.cs +++ b/mcs/class/corlib/System.IO/FileSystemInfo.cs @@ -3,6 +3,7 @@ // System.IO.FileSystemInfo.cs // // Copyright (C) 2001 Moonlight Enterprises, All Rights Reserved +// Copyright 2011 Xamarin Inc (http://www.xamarin.com). // // Author: Jim Richardson, develop@wtfo-guru.com // Dan Lewis (dihlewis@yahoo.co.uk) @@ -10,12 +11,55 @@ // //------------------------------------------------------------------------------ -using System; +// +// Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// + +using System.Runtime.InteropServices; +using System.Runtime.Serialization; +using System.Security; +using System.Security.Permissions; namespace System.IO { [Serializable] - public abstract class FileSystemInfo : MarshalByRefObject { + [FileIOPermission (SecurityAction.InheritanceDemand, Unrestricted = true)] + [ComVisible (true)] +#if NET_2_1 + public abstract class FileSystemInfo { +#else + public abstract class FileSystemInfo : MarshalByRefObject, ISerializable { + + #region Implementation of ISerializable + + [ComVisible(false)] + public virtual void GetObjectData (SerializationInfo info, StreamingContext context) + { + info.AddValue ("OriginalPath", OriginalPath, typeof(string)); + info.AddValue ("FullPath", FullPath, typeof(string)); + } + + #endregion Implementation of ISerializable +#endif // public properties public abstract bool Exists { get; } @@ -41,8 +85,14 @@ namespace System.IO { } set { - if (!MonoIO.SetFileAttributes (FullName, value)) - throw MonoIO.GetException (); + MonoIOError error; + + if (!MonoIO.SetFileAttributes (FullName, + value, + out error)) + throw MonoIO.GetException (FullName, + error); + Refresh (true); } } @@ -53,10 +103,28 @@ namespace System.IO { } set { + SecurityManager.EnsureElevatedPermissions (); // this is a no-op outside moonlight + long filetime = value.ToFileTime (); - if (!MonoIO.SetFileTime (FullName, filetime, -1, -1)) - throw MonoIO.GetException (); + MonoIOError error; + + if (!MonoIO.SetFileTime (FullName, filetime, + -1, -1, out error)) + throw MonoIO.GetException (FullName, + error); + Refresh (true); + } + } + + [ComVisible(false)] + public DateTime CreationTimeUtc { + get { + return CreationTime.ToUniversalTime (); + } + + set { + CreationTime = value.ToLocalTime (); } } @@ -67,10 +135,30 @@ namespace System.IO { } set { + SecurityManager.EnsureElevatedPermissions (); // this is a no-op outside moonlight + long filetime = value.ToFileTime (); - if (!MonoIO.SetFileTime (FullName, -1, filetime, -1)) - throw MonoIO.GetException (); + MonoIOError error; + + if (!MonoIO.SetFileTime (FullName, -1, + filetime, -1, + out error)) + throw MonoIO.GetException (FullName, + error); + Refresh (true); + } + } + + [ComVisible(false)] + public DateTime LastAccessTimeUtc { + get { + Refresh (false); + return LastAccessTime.ToUniversalTime (); + } + + set { + LastAccessTime = value.ToLocalTime (); } } @@ -81,10 +169,29 @@ namespace System.IO { } set { + SecurityManager.EnsureElevatedPermissions (); // this is a no-op outside moonlight + long filetime = value.ToFileTime (); - if (!MonoIO.SetFileTime (FullName, -1, -1, filetime)) - throw MonoIO.GetException (); + MonoIOError error; + + if (!MonoIO.SetFileTime (FullName, -1, -1, + filetime, out error)) + throw MonoIO.GetException (FullName, + error); + Refresh (true); + } + } + + [ComVisible(false)] + public DateTime LastWriteTimeUtc { + get { + Refresh (false); + return LastWriteTime.ToUniversalTime (); + } + + set { + LastWriteTime = value.ToLocalTime (); } } @@ -105,6 +212,17 @@ namespace System.IO { this.FullPath = null; } + protected FileSystemInfo (SerializationInfo info, StreamingContext context) + { + if (info == null) + { + throw new ArgumentNullException("info"); + } + + FullPath = info.GetString("FullPath"); + OriginalPath = info.GetString("OriginalPath"); + } + protected string FullPath; protected string OriginalPath; @@ -115,16 +233,35 @@ namespace System.IO { if (valid && !force) return; - MonoIO.GetFileStat (FullName, out stat); + MonoIOError error; + + MonoIO.GetFileStat (FullName, out stat, out error); + /* Don't throw on error here, too much other + * stuff relies on it not doing so... + */ + valid = true; + + InternalRefresh (); + } + + internal virtual void InternalRefresh () + { } internal void CheckPath (string path) { if (path == null) - throw new ArgumentNullException (); + throw new ArgumentNullException ("path"); + if (path.Length == 0) + throw new ArgumentException ("An empty file name is not valid."); if (path.IndexOfAny (Path.InvalidPathChars) != -1) - throw new ArgumentException ("Invalid characters in path."); + throw new ArgumentException ("Illegal characters in path."); + if (Environment.IsRunningOnWindows) { + int idx = path.IndexOf (':'); + if (idx >= 0 && idx != 1) + throw new ArgumentException ("path"); + } } internal MonoIOStat stat;