[Development] Implement gethomedir() function on Windows.


git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@4208 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/common/os/os.cxx b/common/os/os.cxx
index 5d41055..fb07dcf 100644
--- a/common/os/os.cxx
+++ b/common/os/os.cxx
@@ -20,30 +20,37 @@
 #include <config.h>
 #endif
 
-#ifndef WIN32
 #include <os/os.h>
 
 #include <assert.h>
+
+#ifndef WIN32
 #include <pwd.h>
 #include <stdlib.h>
 #include <string.h>
 #include <sys/types.h>
 #include <unistd.h>
+#else
+#include <windows.h>
+#include <wininet.h> /* MinGW needs it */
+#include <shlobj.h>
+#endif
 
 int gethomedir(char **dirp)
 {
+#ifndef WIN32
 	char *homedir, *dir;
 	size_t len;
 	uid_t uid;
 	struct passwd *passwd;
+#else
+	TCHAR *dir;
+	BOOL ret;
+#endif
 
 	assert(dirp != NULL && *dirp == NULL);
 
-#ifdef WIN32
-	/* Not supported, yet */
-	return -1;
-#endif
-
+#ifndef WIN32
 	homedir = getenv("HOME");
 	if (homedir == NULL) {
 		uid = getuid();
@@ -57,11 +64,25 @@
 
 	len = strlen(homedir) + 1;
 	dir = new char[len];
+	if (dir == NULL)
+		return -1;
+
 	memcpy(dir, homedir, len);
+#else
+	dir = new TCHAR[MAX_PATH];
+	if (dir == NULL)
+		return -1;
+
+	ret = SHGetSpecialFolderPath(NULL, dir, CSIDL_APPDATA, FALSE);
+	if (ret == FALSE) {
+		delete [] dir;
+		return -1;
+	}
+
+	
+#endif
 
 	*dirp = dir;
 	return 0;
 }
 
-#endif
-
diff --git a/common/os/os.h b/common/os/os.h
index fce21de..18e61e2 100644
--- a/common/os/os.h
+++ b/common/os/os.h
@@ -27,6 +27,9 @@
  * Get home directory. If HOME environment variable is set then it is returned.
  * Otherwise home directory is obtained via getpwuid function.
  *
+ * Note for Windows:
+ * This functions returns array of TCHARs, not array of chars.
+ *
  * Returns:
  * 0 - Success
  * -1 - Failure