Merge pull request #681 from tritao/dll-api
[mono.git] / mcs / class / corlib / System.IO / DirectoryInfo.cs
index f8f1f4be845ae7d927a2d286fe6e8f6803ca36ea..ce558743516117060aec9c27bc44a691bcf3f713 100644 (file)
@@ -35,10 +35,9 @@ using System.Collections;
 using System.Collections.Generic;
 using System.Runtime.InteropServices;
 using System.Runtime.Serialization;
+using System.Security;
 using System.Text;
-#if !MOONLIGHT
 using System.Security.AccessControl;
-#endif
 
 namespace System.IO {
        
@@ -57,6 +56,8 @@ namespace System.IO {
                {
                        CheckPath (path);
 
+                       SecurityManager.EnsureElevatedPermissions (); // this is a no-op outside moonlight
+
                        FullPath = Path.GetFullPath (path);
                        if (simpleOriginalPath)
                                OriginalPath = Path.GetFileName (path);
@@ -255,6 +256,8 @@ namespace System.IO {
                                throw new ArgumentException ("An empty file name is not valid.", "destDirName");
 
                        Directory.Move (FullPath, Path.GetFullPath (destDirName));
+                       FullPath = OriginalPath = destDirName;
+                       Initialize ();
                }
 
                public override string ToString ()
@@ -262,30 +265,17 @@ namespace System.IO {
                        return OriginalPath;
                }
 
-#if !MOONLIGHT
                public DirectoryInfo[] GetDirectories (string searchPattern, SearchOption searchOption)
                {
-                       switch (searchOption) {
-                       case SearchOption.TopDirectoryOnly:
-                               return GetDirectories (searchPattern);
-                       case SearchOption.AllDirectories:
-                               Queue workq = new Queue(GetDirectories(searchPattern));
-                               Queue doneq = new Queue();
-                               while (workq.Count > 0)
-                                       {
-                                               DirectoryInfo cinfo = (DirectoryInfo) workq.Dequeue();
-                                               DirectoryInfo[] cinfoDirs = cinfo.GetDirectories(searchPattern);
-                                               foreach (DirectoryInfo i in cinfoDirs) workq.Enqueue(i);
-                                               doneq.Enqueue(cinfo);
-                                       }
-
-                               DirectoryInfo[] infos = new DirectoryInfo[doneq.Count];
-                               doneq.CopyTo(infos, 0);
-                               return infos;
-                       default:
-                               string msg = Locale.GetText ("Invalid enum value '{0}' for '{1}'.", searchOption, "SearchOption");
-                               throw new ArgumentOutOfRangeException ("searchOption", msg);
+                   //NULL-check of searchPattern is done in Directory.GetDirectories
+                       string [] names = Directory.GetDirectories (FullPath, searchPattern, searchOption);
+                       //Convert the names to DirectoryInfo instances
+                       DirectoryInfo[] infos = new DirectoryInfo [names.Length];
+                       for (int i = 0; i<names.Length; ++i){
+                               string name = names[i];
+                               infos [i] = new DirectoryInfo (name);
                        }
+                       return infos;
                }       
 
                internal int GetFilesSubdirs (ArrayList l, string pattern)
@@ -349,28 +339,22 @@ namespace System.IO {
                        return CreateSubdirectory (path);
                }
 
-               [MonoNotSupported ("DirectorySecurity isn't implemented")]
                public DirectorySecurity GetAccessControl ()
                {
-                       throw new UnauthorizedAccessException ();
+                       return Directory.GetAccessControl (FullPath);
                }
 
-               [MonoNotSupported ("DirectorySecurity isn't implemented")]
                public DirectorySecurity GetAccessControl (AccessControlSections includeSections)
                {
-                       throw new UnauthorizedAccessException ();
+                       return Directory.GetAccessControl (FullPath, includeSections);
                }
 
-               [MonoLimitation ("DirectorySecurity isn't implemented")]
                public void SetAccessControl (DirectorySecurity directorySecurity)
                {
-                       if (directorySecurity != null)
-                               throw new ArgumentNullException ("directorySecurity");
-                       throw new UnauthorizedAccessException ();
+                       Directory.SetAccessControl (FullPath, directorySecurity);
                }
-#endif
 
-#if NET_4_0 || MOONLIGHT
+#if NET_4_0
 
                public IEnumerable<DirectoryInfo> EnumerateDirectories ()
                {
@@ -383,6 +367,14 @@ namespace System.IO {
                }
 
                public IEnumerable<DirectoryInfo> EnumerateDirectories (string searchPattern, SearchOption searchOption)
+               {
+                       if (searchPattern == null)
+                               throw new ArgumentNullException ("searchPattern");
+
+                       return CreateEnumerateDirectoriesIterator (searchPattern, searchOption);
+               }
+
+               IEnumerable<DirectoryInfo> CreateEnumerateDirectoriesIterator (string searchPattern, SearchOption searchOption)
                {
                        foreach (string name in Directory.EnumerateDirectories (FullPath, searchPattern, searchOption))
                                yield return new DirectoryInfo (name);
@@ -399,6 +391,14 @@ namespace System.IO {
                }
 
                public IEnumerable<FileInfo> EnumerateFiles (string searchPattern, SearchOption searchOption)
+               {
+                       if (searchPattern == null)
+                               throw new ArgumentNullException ("searchPattern");
+
+                       return CreateEnumerateFilesIterator (searchPattern, searchOption);
+               }
+
+               IEnumerable<FileInfo> CreateEnumerateFilesIterator (string searchPattern, SearchOption searchOption)
                {
                        foreach (string name in Directory.EnumerateFiles (FullPath, searchPattern, searchOption))
                                yield return new FileInfo (name);
@@ -432,7 +432,7 @@ namespace System.IO {
                        FileAttributes rattr;
                        bool subdirs = searchOption == SearchOption.AllDirectories;
 
-                       Directory.ValidatePath (full); // required for Moonlight, nop-op otherwise
+                       Path.Validate (full);
                        
                        string s = MonoIO.FindFirst (full, path_with_pattern, out rattr, out error, out handle);
                        if (s == null)