Mon Apr 29 15:32:02 CEST 2002 Paolo Molaro <lupus@ximian.com>
[mono.git] / mcs / class / corlib / System / Environment.cs
index 6800e84ec5134ac269a38b87b81dccc3bbb2c0f1..dc92fda727c3c26b535a8082f3098bf542649ce8 100644 (file)
@@ -5,20 +5,29 @@
 // Copyright (C) 2001 Moonlight Enterprises, All Rights Reserved\r
 // \r
 // Author:         Jim Richardson, develop@wtfo-guru.com\r
+//                 Dan Lewis (dihlewis@yahoo.co.uk)\r
 // Created:        Saturday, August 11, 2001 \r
 //\r
 //------------------------------------------------------------------------------\r
 \r
 using System;\r
+using System.IO;\r
+//using System.Diagnostics;\r
 using System.Collections;\r
+using System.Security;\r
+using System.Security.Permissions;\r
+using System.Runtime.CompilerServices;\r
 \r
 namespace System\r
 {\r
        public sealed class Environment\r
        {\r
+               private Environment () {}
+
+               [MonoTODO]\r
                public enum SpecialFolder\r
-               {       // TODO: Determin if these windoze style folder identifiers \r
-                       //       linux counterparts\r
+               {       // TODO: Determine if these windoze style folder identifiers \r
+                       //       have unix/linux counterparts\r
                        ApplicationData,\r
                        CommonApplicationData,\r
                        CommonProgramFiles,\r
@@ -39,74 +48,83 @@ namespace System
                        Templates\r
                }\r
 \r
+               // TODO: Make sure the security attributes do what I expect\r
+                       \r
                /// <summary>\r
                /// Gets the command line for this process\r
                /// </summary>\r
                public static string CommandLine\r
-               {\r
+               {       // TODO: Coordinate with implementor of EnvironmentPermissionAttribute\r
+                       // [EnvironmentPermissionAttribute(SecurityAction.Demand, Read = "COMMANDLINE")]\r
                        get\r
                        {\r
-                               return null;\r
+                               // FIXME: we may need to quote, but any sane person\r
+                               // should use GetCommandLineArgs () instead.\r
+                               return String.Join ("", GetCommandLineArgs ());\r
                        }\r
                }\r
 \r
                /// <summary>\r
-               /// Gets or sets the current directory\r
+               /// Gets or sets the current directory. Actually this is supposed to get\r
+               /// and/or set the process start directory acording to the documentation\r
+               /// but actually test revealed at beta2 it is just Getting/Setting the CurrentDirectory\r
                /// </summary>\r
                public static string CurrentDirectory\r
                {\r
+                       // originally it was my thought that the external call would be made in\r
+                       // the directory class however that class has additional security requirements\r
+                       // so the Directory class will call this class for its get/set current directory\r
+                       \r
+                       // [EnvironmentPermissionAttribute(SecurityAction.Demand, Unrestricted = true)]\r
                        get\r
                        {\r
-                               // TODO: needs more research/work/thought\r
-                               return GetEnvironmentVariable("PWD");\r
+                               return MonoIO.GetCurrentDirectory ();\r
                        }\r
+                       [MonoTODO("disabled because of compile error. Need mcs magic.")]\r
+                       //[SecurityPermissionAttribute(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)]\r
                        set\r
                        {\r
+                               MonoIO.SetCurrentDirectory (value);\r
                        }\r
                }\r
 \r
                /// <summary>\r
                /// Gets or sets the exit code of this process\r
                /// </summary>\r
+               [MonoTODO]\r
                public static int ExitCode\r
-               {\r
+               {       // TODO: find a way to implement this property\r
                        get\r
                        {\r
-                               return 0;\r
+                               throw new NotImplementedException ();\r
                        }\r
                        set\r
                        {\r
+                               throw new NotImplementedException ();\r
                        }\r
                }\r
 \r
                /// <summary>\r
                /// Gets the name of the local computer\r
                /// </summary>\r
-               public static string MachineName\r
-               {\r
-                       get\r
-                       {\r
-                               // TODO: needs more research/work/thought\r
-                               return GetEnvironmentVariable("HOSTNAME");\r
-                       }\r
+               public extern static string MachineName {\r
+                       [MethodImplAttribute (MethodImplOptions.InternalCall)]\r
+                       get;\r
                }\r
 \r
                /// <summary>\r
                /// Gets the standard new line value\r
                /// </summary>\r
-               public static string NewLine\r
-               {\r
-                       get\r
-                       {\r
-                               return "\n";\r
-                       }\r
+               public extern static string NewLine {\r
+                       [MethodImplAttribute (MethodImplOptions.InternalCall)]\r
+                       get;\r
                }\r
 \r
                /// <summary>\r
                /// Gets the current OS version information\r
                /// </summary>\r
-               public static OperatingSystem OSVersion\r
-               {\r
+               [MonoTODO]\r
+               public static OperatingSystem OSVersion {\r
                        get\r
                        {\r
                                return null;\r
@@ -114,8 +132,9 @@ namespace System
                }\r
 \r
                /// <summary>\r
-               /// Get a string containing a trace of the stack\r
+               /// Get StackTrace\r
                /// </summary>\r
+               [MonoTODO]\r
                public static string StackTrace\r
                {\r
                        get\r
@@ -131,24 +150,27 @@ namespace System
                {\r
                        get\r
                        {\r
-                               return null;\r
+                               return GetFolderPath(SpecialFolder.System);\r
                        }\r
                }\r
 \r
                /// <summary>\r
                /// Get the number of milliseconds that have elapsed since the system was booted\r
                /// </summary>\r
+               [MonoTODO]\r
                public static int TickCount\r
                {\r
                        get\r
                        {\r
                                return 0;\r
+                               //return getTickCount();\r
                        }\r
                }\r
 \r
                /// <summary>\r
                /// Get UserDomainName\r
                /// </summary>\r
+               [MonoTODO]\r
                public static string UserDomainName\r
                {\r
                        get\r
@@ -160,6 +182,7 @@ namespace System
                /// <summary>\r
                /// Gets a flag indicating whether the process is in interactive mode\r
                /// </summary>\r
+               [MonoTODO]\r
                public static bool UserInteractive\r
                {\r
                        get\r
@@ -171,6 +194,7 @@ namespace System
                /// <summary>\r
                /// Get the user name of current process is running under\r
                /// </summary>\r
+               [MonoTODO]\r
                public static string UserName\r
                {\r
                        get\r
@@ -188,6 +212,7 @@ namespace System
                /// <summary>\r
                /// Get the version of an assembly\r
                /// </summary>\r
+               [MonoTODO]\r
                public static Version Version\r
                {\r
                        get\r
@@ -199,6 +224,7 @@ namespace System
                /// <summary>\r
                /// Get the amount of physical memory mapped to process\r
                /// </summary>\r
+               [MonoTODO]\r
                public static long WorkingSet\r
                {\r
                        get\r
@@ -207,13 +233,13 @@ namespace System
                        }\r
                }\r
 \r
-               public static void Exit(int exitCode)\r
-               { \r
-               }\r
+               [MethodImplAttribute (MethodImplOptions.InternalCall)]\r
+               public extern static void Exit(int exitCode);\r
 \r
                /// <summary>\r
                /// Substitute environment variables in the argument "name"\r
                /// </summary>\r
+               [MonoTODO]\r
                public static string ExpandEnvironmentVariables(string name)\r
                {\r
                        return name;\r
@@ -222,30 +248,34 @@ namespace System
                /// <summary>\r
                /// Return an array of the command line arguments of the current process\r
                /// </summary>\r
-               public static string[] GetCommandLineArgs()\r
-               {\r
-                       return null;\r
-               }\r
+               [MethodImplAttribute (MethodImplOptions.InternalCall)]\r
+               public extern static string[] GetCommandLineArgs();\r
 \r
                /// <summary>\r
-               /// Return a string containing the value of the environment variable identifed by parameter "variable"\r
+               /// Return a string containing the value of the environment\r
+               /// variable identifed by parameter "variable"\r
                /// </summary>\r
-               public static string GetEnvironmentVariable(string variable)\r
-               {\r
-                       return null;\r
-               }\r
+               [MethodImplAttribute (MethodImplOptions.InternalCall)]\r
+               public extern static string GetEnvironmentVariable (string name);\r
 \r
                /// <summary>\r
                /// Return a set of all environment variables and their values\r
                /// </summary>\r
+          \r
                public static IDictionary GetEnvironmentVariables()\r
                {\r
-                       return null;\r
+                       Hashtable vars = new Hashtable ();\r
+                       foreach (string name in GetEnvironmentVariableNames ())\r
+                               vars [name] = GetEnvironmentVariable (name);\r
+                       \r
+                       return vars;\r
                }\r
 \r
                /// <summary>\r
-               /// Returns the fully qualified path of the folder specified by the "folder" parameter\r
+               /// Returns the fully qualified path of the\r
+               /// folder specified by the "folder" parameter\r
                /// </summary>\r
+               [MonoTODO]\r
                public static string GetFolderPath(SpecialFolder folder)\r
                {\r
                        return null;\r
@@ -254,9 +284,16 @@ namespace System
                /// <summary>\r
                /// Returns an array of the logical drives\r
                /// </summary>\r
+               [MonoTODO]\r
                public static string[] GetLogicalDrives()\r
                {\r
                        return null;\r
                }\r
+\r
+               // private methods\r
+\r
+               [MethodImplAttribute (MethodImplOptions.InternalCall)]\r
+               private extern static string [] GetEnvironmentVariableNames ();\r
+\r
        }\r
 }\r