2008-10-11 Miguel de Icaza <miguel@novell.com>
[mono.git] / eglib / src / gmisc-win32.c
1 /*
2  * gmisc.c: Misc functions with no place to go (right now)
3  *
4  * Author:
5  *   Aaron Bockover (abockover@novell.com)
6  *
7  * (C) 2006 Novell, Inc.
8  *
9  * Permission is hereby granted, free of charge, to any person obtaining
10  * a copy of this software and associated documentation files (the
11  * "Software"), to deal in the Software without restriction, including
12  * without limitation the rights to use, copy, modify, merge, publish,
13  * distribute, sublicense, and/or sell copies of the Software, and to
14  * permit persons to whom the Software is furnished to do so, subject to
15  * the following conditions:
16  *
17  * The above copyright notice and this permission notice shall be
18  * included in all copies or substantial portions of the Software.
19  *
20  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27  */
28
29 #include <stdlib.h>
30 #include <glib.h>
31
32 #include <windows.h>
33 #include <direct.h>
34 #include <io.h>
35
36 const gchar *
37 g_getenv(const gchar *variable)
38 {
39         gunichar2 *var, *buffer;
40         gchar* val = NULL;
41         gint32 buffer_size = 1024;
42         gint32 retval;
43         var = u8to16(variable); 
44         buffer = g_malloc(buffer_size*sizeof(gunichar2));
45         retval = GetEnvironmentVariable (var, buffer, buffer_size);
46         if (retval != 0) {
47                 if (retval > buffer_size) {
48                         g_free (buffer);
49                         buffer_size = retval;
50                         buffer = g_malloc(buffer_size*sizeof(gunichar2));
51                         retval = GetEnvironmentVariable (var, buffer, buffer_size);
52                 }
53                 val = u16to8 (buffer);
54         }
55         g_free(var);
56         g_free(buffer);
57         return val; 
58 }
59
60 gboolean
61 g_setenv(const gchar *variable, const gchar *value, gboolean overwrite)
62 {
63         gunichar2 *var, *val;
64         gboolean result;
65         var = u8to16(variable); 
66         val = u8to16(value);
67         result = (SetEnvironmentVariable(var, val) != 0) ? TRUE : FALSE;
68         g_free(var);
69         g_free(val);
70         return result;
71 }
72
73 void
74 g_unsetenv(const gchar *variable)
75 {
76         gunichar2 *var;
77         var = u8to16(variable); 
78         SetEnvironmentVariable(var, TEXT(""));
79         g_free(var);
80 }
81
82 gchar*
83 g_win32_getlocale(void)
84 {
85         /* FIXME: Use GetThreadLocale
86          * and convert LCID to standard 
87          * string form, "en_US" */
88         return strdup ("en_US");
89 }
90
91 gboolean
92 g_path_is_absolute (const char *filename)
93 {
94         g_return_val_if_fail (filename != NULL, FALSE);
95
96         if (filename[0] != '\0' && filename[1] != '\0' && filename[1] == ':' && 
97                 filename[2] != '\0' && (filename[2] == '\\' || filename[2] == '/'))
98                 return TRUE;
99         else
100                 return FALSE;
101 }
102
103 const gchar *
104 g_get_home_dir (void)
105 {
106         /* FIXME */
107         const gchar *drive = g_getenv ("HOMEDRIVE");
108         const gchar *path = g_getenv ("HOMEPATH");
109         gchar *home_dir = NULL;
110         
111         if (drive && path) {
112                 home_dir = g_malloc(strlen(drive) + strlen(path) +1);
113                 if (home_dir) {
114                         sprintf(home_dir, "%s%s", drive, path);
115                 }
116         }
117
118         return home_dir;
119 }
120
121 const char *
122 g_get_user_name (void)
123 {
124         const char * retName = g_getenv ("USER");
125         if (!retName)
126                 retName = g_getenv ("USERNAME");
127         return retName;
128 }
129
130 static const char *tmp_dir;
131
132 const gchar *
133 g_get_tmp_dir (void)
134 {
135         if (tmp_dir == NULL){
136                 if (tmp_dir == NULL){
137                         tmp_dir = g_getenv ("TMPDIR");
138                         if (tmp_dir == NULL){
139                                 tmp_dir = g_getenv ("TMP");
140                                 if (tmp_dir == NULL){
141                                         tmp_dir = g_getenv ("TEMP");
142                                         if (tmp_dir == NULL)
143                                                 tmp_dir = "C:\\temp";
144                                 }
145                         }
146                 }
147         }
148         return tmp_dir;
149 }
150