diff src/win32/win32dep.c @ 6848:060aa79a733e

[gaim-migrate @ 7393] Using SHGetFolderPath to determine windows gaim home directory committer: Tailor Script <tailor@pidgin.im>
author Herman Bloggs <hermanator12002@yahoo.com>
date Mon, 15 Sep 2003 21:30:37 +0000
parents 5aeba37b303c
children 4eee806af511
line wrap: on
line diff
--- a/src/win32/win32dep.c	Mon Sep 15 13:29:22 2003 +0000
+++ b/src/win32/win32dep.c	Mon Sep 15 21:30:37 2003 +0000
@@ -60,6 +60,7 @@
 /*
  * LOCALS
  */
+static char app_data_dir[MAX_PATH];
 static char install_dir[MAXPATHLEN];
 static char lib_dir[MAXPATHLEN];
 static char locale_dir[MAXPATHLEN];
@@ -75,6 +76,8 @@
  *  PROTOS
  */
 BOOL (*MyFlashWindowEx)(PFLASHWINFO pfwi)=NULL;
+HRESULT (*SHGetFolderPath)(HWND, int, HANDLE, DWORD, LPTSTR) = NULL;
+
 FARPROC wgaim_find_and_loadproc(char*, char*);
 extern void wgaim_gtkspell_init();
 
@@ -208,6 +211,10 @@
 	return (char*)&locale_dir;
 }
 
+char* wgaim_data_dir(void) {
+        return (char*)&app_data_dir;
+}
+
 /* Miscellaneous */
 
 gboolean wgaim_read_reg_string(HKEY key, char* sub_key, char* val_name, LPBYTE data, LPDWORD data_len) {
@@ -411,6 +418,12 @@
 }
 
 /* Windows Initializations */
+typedef enum {
+    SHGFP_TYPE_CURRENT  = 0,   // current value for user, verify it exists
+    SHGFP_TYPE_DEFAULT  = 1,   // default value, may not exist
+} SHGFP_TYPE;
+
+#define CSIDL_APPDATA 0x001a
 
 void wgaim_pre_plugin_init(void) {
         char *perlenv, *newenv;
@@ -425,6 +438,42 @@
         if(putenv(newenv)<0)
 		gaim_debug(GAIM_DEBUG_WARNING, "wgaim", "putenv failed\n");
         g_free(newenv);
+
+        /* Set app data dir, where to save Gaim user settings */
+        newenv = (char*)g_getenv("HOME");
+        if(!newenv) {
+                SHGetFolderPath = (void*)wgaim_find_and_loadproc("shfolder.dll", "SHGetFolderPathA");
+                if(SHGetFolderPath) {
+                        HRESULT hrResult = SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, app_data_dir);
+                        if(hrResult != S_FALSE && hrResult != E_FAIL && hrResult != E_INVALIDARG) {
+                                gaim_debug(GAIM_DEBUG_INFO, "wgaim", "APP DATA PATH set to: %s\n", app_data_dir);
+                        }
+                        else
+                                strcpy(app_data_dir, "C:");
+                }
+
+                /* As of 0.69, using SHGetFolderPath to determine app settings directory.
+                   Move app settings to new location if need be. */
+                { 
+                        char *old_home = g_strdup_printf("%s%s", g_get_home_dir() ? g_get_home_dir() : "C:", "\\.gaim");
+                        char *new_home = g_strdup_printf("%s\\.gaim", wgaim_data_dir());
+                        GDir *dir_old, *dir_new;
+
+                        dir_old = g_dir_open(old_home, 0, NULL);
+                        dir_new = g_dir_open(new_home, 0, NULL);
+                        if(dir_old && !dir_new) {
+                                if(MoveFile(old_home, new_home) != 0)
+                                        gaim_debug(GAIM_DEBUG_INFO, "wgaim", "Success moving '.gaim' directory\n");
+                        }
+                        g_free(new_home);
+                        g_free(old_home);
+                        g_dir_close(dir_old);
+                        g_dir_close(dir_new);
+                }
+        }
+        else {
+                strcpy(app_data_dir, newenv);
+        }
 }
 
 void wgaim_init(void) {