[msvc] Update csproj files
[mono.git] / eglib / src / gmisc-win32.c
index 7e60293f5f2d57e968303b5e925b9343d855ed4e..4aac0ef69460fe70c432dfb78f8fcfd2bd931f5a 100644 (file)
  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
 
+#include <config.h>
+
 #include <stdlib.h>
 #include <glib.h>
 
 #include <windows.h>
+#if _MSC_VER && G_HAVE_API_SUPPORT(HAVE_CLASSIC_WINAPI_SUPPORT)
+#include <shlobj.h>
+#endif
 #include <direct.h>
 #include <io.h>
+#include <assert.h>
 
 const gchar *
 g_getenv(const gchar *variable)
@@ -42,15 +48,20 @@ g_getenv(const gchar *variable)
        gint32 retval;
        var = u8to16(variable); 
        buffer = g_malloc(buffer_size*sizeof(gunichar2));
-       retval = GetEnvironmentVariable (var, buffer, buffer_size);
+       retval = GetEnvironmentVariableW (var, buffer, buffer_size);
        if (retval != 0) {
                if (retval > buffer_size) {
                        g_free (buffer);
                        buffer_size = retval;
                        buffer = g_malloc(buffer_size*sizeof(gunichar2));
-                       retval = GetEnvironmentVariable (var, buffer, buffer_size);
+                       retval = GetEnvironmentVariableW (var, buffer, buffer_size);
                }
                val = u16to8 (buffer);
+       } else {
+               if (GetLastError () != ERROR_ENVVAR_NOT_FOUND){
+                       val = g_malloc (1);
+                       *val = 0;
+               }
        }
        g_free(var);
        g_free(buffer);
@@ -64,7 +75,7 @@ g_setenv(const gchar *variable, const gchar *value, gboolean overwrite)
        gboolean result;
        var = u8to16(variable); 
        val = u8to16(value);
-       result = (SetEnvironmentVariable(var, val) != 0) ? TRUE : FALSE;
+       result = (SetEnvironmentVariableW(var, val) != 0) ? TRUE : FALSE;
        g_free(var);
        g_free(val);
        return result;
@@ -75,44 +86,86 @@ g_unsetenv(const gchar *variable)
 {
        gunichar2 *var;
        var = u8to16(variable); 
-       SetEnvironmentVariable(var, TEXT(""));
+       SetEnvironmentVariableW(var, L"");
        g_free(var);
 }
 
+#if G_HAVE_API_SUPPORT(HAVE_CLASSIC_WINAPI_SUPPORT)
 gchar*
 g_win32_getlocale(void)
 {
-       /* FIXME: Use GetThreadLocale
-        * and convert LCID to standard 
-        * string form, "en_US" */
-       return strdup ("en_US");
+       LCID lcid = GetThreadLocale();
+       gchar buf[19];
+       gint ccBuf = GetLocaleInfoA(lcid, LOCALE_SISO639LANGNAME, buf, 9);
+       buf[ccBuf - 1] = '-';
+       ccBuf += GetLocaleInfoA(lcid, LOCALE_SISO3166CTRYNAME, buf + ccBuf, 9);
+       return g_strdup (buf);
 }
+#endif /* G_HAVE_API_SUPPORT(HAVE_CLASSIC_WINAPI_SUPPORT) */
 
 gboolean
 g_path_is_absolute (const char *filename)
 {
        g_return_val_if_fail (filename != NULL, FALSE);
 
-       if (filename[0] != '\0' && filename[1] != '\0' && filename[1] == ':' && 
-               filename[2] != '\0' && (filename[2] == '\\' || filename[2] == '/'))
-               return TRUE;
-       else
-               return FALSE;
+       if (filename[0] != '\0' && filename[1] != '\0') {
+               if (filename[1] == ':' && filename[2] != '\0' &&
+                       (filename[2] == '\\' || filename[2] == '/'))
+                       return TRUE;
+               /* UNC paths */
+               else if (filename[0] == '\\' && filename[1] == '\\' && 
+                       filename[2] != '\0')
+                       return TRUE;
+       }
+
+       return FALSE;
+}
+
+#if _MSC_VER && G_HAVE_API_SUPPORT(HAVE_CLASSIC_WINAPI_SUPPORT)
+static gchar*
+g_get_known_folder_path (void)
+{
+       gchar *folder_path = NULL;
+       PWSTR profile_path = NULL;
+       HRESULT hr = SHGetKnownFolderPath (&FOLDERID_Profile, KF_FLAG_DEFAULT, NULL, &profile_path);
+       if (SUCCEEDED(hr)) {
+               folder_path = u16to8 (profile_path);
+               CoTaskMemFree (profile_path);
+       }
+
+       return folder_path;
 }
 
+#else
+
+static inline gchar *
+g_get_known_folder_path (void)
+{
+       return NULL;
+}
+#endif
+
 const gchar *
 g_get_home_dir (void)
 {
-       /* FIXME */
-       const gchar *drive = g_getenv ("HOMEDRIVE");
-       const gchar *path = g_getenv ("HOMEPATH");
-       gchar *home_dir = NULL;
-       
-       if (drive && path) {
-               home_dir = g_malloc(strlen(drive) + strlen(path) +1);
-               if (home_dir) {
-                       sprintf(home_dir, "%s%s", drive, path);
+       gchar *home_dir = g_get_known_folder_path ();
+
+       if (!home_dir) {
+               home_dir = (gchar *) g_getenv ("USERPROFILE");
+       }
+
+       if (!home_dir) {
+               const gchar *drive = g_getenv ("HOMEDRIVE");
+               const gchar *path = g_getenv ("HOMEPATH");
+
+               if (drive && path) {
+                       home_dir = g_malloc (strlen (drive) + strlen (path) + 1);
+                       if (home_dir) {
+                               sprintf (home_dir, "%s%s", drive, path);
+                       }
                }
+               g_free (drive);
+               g_free (path);
        }
 
        return home_dir;
@@ -147,4 +200,3 @@ g_get_tmp_dir (void)
        }
        return tmp_dir;
 }
-