From 6542144aba958ca312eb6a5b8196531c2d120f75 Mon Sep 17 00:00:00 2001 From: ramon18 Date: Mon, 22 Dec 2003 14:34:05 +0000 Subject: [PATCH] Shell Folders code now use "current user" if cannot retrieve nothing for "all users" git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@3298 212acab6-be3b-0410-9dea-997c60f758d6 --- Source/exehead/util.c | 82 ++++++++++++++++++++++++++----------------- 1 file changed, 50 insertions(+), 32 deletions(-) diff --git a/Source/exehead/util.c b/Source/exehead/util.c index 3ca43012..2661bc26 100644 --- a/Source/exehead/util.c +++ b/Source/exehead/util.c @@ -491,48 +491,66 @@ char * NSISCALL GetNSISString(char *outbuf, int strtab) LPITEMIDLIST idl; int qLaunch=0; int nCreateFlag = CSIDL_FLAG_CREATE; + int nFolderCurUser; - nVarIdx = (*(WORD*)in & 0x0FFF)-1; in+=sizeof(WORD); // Read code for current user + nFolderCurUser = (*(WORD*)in & 0x0FFF)-1; // Read code for current user + in+=sizeof(WORD); + nVarIdx = nFolderCurUser; if ( g_exec_flags.all_user_var ) - nVarIdx = (*(WORD*)in & 0x0FFF)-1; in+=sizeof(WORD); // Use code for All users instead + { + nVarIdx = (*(WORD*)in & 0x0FFF)-1; // Use code for All users instead + } + else + nFolderCurUser=-1; // Already using current user + + in+=sizeof(WORD); *out=0; - + while (TRUE) { - switch ( nVarIdx ) + switch ( nVarIdx ) + { + case CSIDL_BITBUCKET: // COMMONFILES + myRegGetStr(HKEY_LOCAL_MACHINE, smwcvesf, "CommonFilesDir", out); + break; + case CSIDL_CONTROLS: // PROGRAMFILES + myRegGetStr(HKEY_LOCAL_MACHINE, smwcvesf, "ProgramFilesDir", out); + if (!*out) + mystrcpy(out, "C:\\Program Files"); + break; + case CSIDL_DESKTOP: // QUICKLAUNCH + nVarIdx = CSIDL_APPDATA; + qLaunch = 1; + // dont break + default: + // Get and force path creation + if ( !SHGetSpecialFolderLocation(g_hwnd, nVarIdx | nCreateFlag, &idl) ) { - case CSIDL_BITBUCKET: // COMMONFILES - myRegGetStr(HKEY_LOCAL_MACHINE, smwcvesf, "CommonFilesDir", out); - break; - case CSIDL_CONTROLS: // PROGRAMFILES - myRegGetStr(HKEY_LOCAL_MACHINE, smwcvesf, "ProgramFilesDir", out); - if (!*out) - mystrcpy(out, "C:\\Program Files"); - break; - case CSIDL_DESKTOP: // QUICKLAUNCH - nVarIdx |= CSIDL_APPDATA; - qLaunch = 1; - // dont break - default: - // Get and force path creation - if ( !SHGetSpecialFolderLocation(g_hwnd, nVarIdx | nCreateFlag, &idl) ) - { - if (my_PIDL2Path(out, idl, 1)) - { - if (qLaunch) - lstrcat(out,"\\Microsoft\\Internet Explorer\\Quick Launch"); - } - } - else - *out=0; - break; + if (my_PIDL2Path(out, idl, 1)) + { + if (qLaunch) + lstrcat(out,"\\Microsoft\\Internet Explorer\\Quick Launch"); + } } + break; + } - if ( *out || nCreateFlag == 0 ) - break; + if ( *out ) + break; // Found something + + if ( nCreateFlag == 0 ) + { + if ( nFolderCurUser == -1 ) // Already dropped to current user??? + break; else - nCreateFlag = 0; // remove create flag if it fails + { + nVarIdx = nFolderCurUser; // Drop to current user if fail + nFolderCurUser = -1; + } + } + else + nCreateFlag = 0; // remove create flag if it fails } validate_filename(out);