2002-08-21 Dietmar Maurer <dietmar@ximian.com>
[mono.git] / mcs / class / corlib / System / Environment.cs
index 6800e84ec5134ac269a38b87b81dccc3bbb2c0f1..ccb608bff74357d7ea3e1c61067f3f3c2f9f2fcb 100644 (file)
 // 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 () {}\r
+\r
+               [MonoTODO]\r
                public enum SpecialFolder\r
-               {       // TODO: Determin if these windoze style folder identifiers \r
-                       //       linux counterparts\r
-                       ApplicationData,\r
-                       CommonApplicationData,\r
-                       CommonProgramFiles,\r
-                       Cookies,\r
-                       DesktopDirectory,\r
-                       Favorites,\r
-                       History,\r
-                       InternetCache,\r
-                       LocalApplicationData,\r
-                       Personal,\r
-                       ProgramFiles,\r
-                       Programs,\r
-                       Recent,\r
-                       SendTo,\r
-                       StartMenu,\r
-                       Startup,\r
-                       System,\r
-                       Templates\r
+               {       // TODO: Determine if these windoze style folder identifiers \r
+                       //       have unix/linux counterparts\r
+                       Programs = 0x02,\r
+                       Personal = 0x05,\r
+                       Favorites = 0x06,\r
+                       Startup = 0x07,\r
+                       Recent = 0x08,\r
+                       SendTo = 0x09,\r
+                       StartMenu = 0x0b,\r
+                       DesktopDirectory = 0x10,\r
+                       Templates = 0x15,\r
+                       ApplicationData = 0x1a,\r
+                       LocalApplicationData = 0x1c,\r
+                       InternetCache = 0x20,\r
+                       Cookies = 0x21,\r
+                       History = 0x22,\r
+                       CommonApplicationData   = 0x23,\r
+                       System = 0x25,\r
+                       ProgramFiles = 0x26,\r
+                       CommonProgramFiles = 0x2b,\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,13 +132,15 @@ namespace System
                }\r
 \r
                /// <summary>\r
-               /// Get a string containing a trace of the stack\r
+               /// Get StackTrace\r
                /// </summary>\r
-               public static string StackTrace\r
-               {\r
-                       get\r
-                       {\r
-                               return null;\r
+               public static string StackTrace {\r
+                       get {\r
+                               try {\r
+                                       throw new Exception ();\r
+                               } catch (Exception e) {\r
+                                       return e.StackTrace;\r
+                               }\r
                        }\r
                }\r
 \r
@@ -131,35 +151,32 @@ 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
-               public static int TickCount\r
-               {\r
-                       get\r
-                       {\r
-                               return 0;\r
-                       }\r
+               public extern static int TickCount {\r
+                       [MethodImplAttribute (MethodImplOptions.InternalCall)]\r
+                       get;\r
                }\r
 \r
                /// <summary>\r
                /// Get UserDomainName\r
                /// </summary>\r
-               public static string UserDomainName\r
-               {\r
-                       get\r
-                       {\r
-                               return null;\r
+               [MonoTODO]\r
+               public static string UserDomainName {\r
+                       get {\r
+                               return MachineName;\r
                        }\r
                }\r
 \r
                /// <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 +188,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
@@ -186,19 +204,19 @@ namespace System
                }\r
 \r
                /// <summary>\r
-               /// Get the version of an assembly\r
+               /// Get the version of the common language runtime \r
                /// </summary>\r
-               public static Version Version\r
-               {\r
-                       get\r
-                       {\r
-                               return null;\r
+               [MonoTODO]\r
+               public static Version Version {\r
+                       get {\r
+                               return new Version();\r
                        }\r
                }\r
 \r
                /// <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 +225,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 +240,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 +276,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