* 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)
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);
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;
{
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;
}
return tmp_dir;
}
-