b=499863; XREDirProvider gives wrong APPDATA dir on Windows CE; r=rs

This commit is contained in:
Vladimir Vukicevic 2009-07-17 16:04:56 -07:00
Родитель 834991fc6b
Коммит 2805422804
2 изменённых файлов: 42 добавлений и 7 удалений

Просмотреть файл

@ -884,26 +884,45 @@ nsXREDirProvider::DoShutdown()
static nsresult static nsresult
GetShellFolderPath(int folder, nsAString& _retval) GetShellFolderPath(int folder, nsAString& _retval)
{ {
PRUnichar* buf;
PRUint32 bufLength = _retval.GetMutableData(&buf, MAXPATHLEN + 3);
NS_ENSURE_TRUE(bufLength >= (MAXPATHLEN + 3), NS_ERROR_OUT_OF_MEMORY);
nsresult rv = NS_OK;
#if defined(WINCE) && !defined(WINCE_WINDOWS_MOBILE)
if (folder == CSIDL_APPDATA || folder == CSIDL_LOCAL_APPDATA)
folder = CSIDL_PROFILE;
BOOL ok = SHGetSpecialFolderPath(NULL, buf, folder, true);
if (!ok) {
_retval.SetLength(0);
return NS_ERROR_FAILURE;
}
buf[bufLength - 1] = L'\0';
_retval.SetLength(wcslen(buf));
// sometimes CSIDL_PROFILE shows up without a root slash
if (folder == CSIDL_PROFILE && buf[0] != '\\') {
_retval.Insert('\\', 0);
}
#else
LPITEMIDLIST pItemIDList = NULL; LPITEMIDLIST pItemIDList = NULL;
PRUnichar* buf;
PRUint32 bufLength = _retval.GetMutableData(&buf, MAXPATHLEN);
NS_ENSURE_TRUE(bufLength >= MAXPATHLEN, NS_ERROR_OUT_OF_MEMORY);
nsresult rv;
if (SUCCEEDED(SHGetSpecialFolderLocation(NULL, folder, &pItemIDList)) && if (SUCCEEDED(SHGetSpecialFolderLocation(NULL, folder, &pItemIDList)) &&
SHGetPathFromIDListW(pItemIDList, buf)) { SHGetPathFromIDListW(pItemIDList, buf)) {
// We're going to use wcslen (wcsnlen not available in msvc7.1) so make // We're going to use wcslen (wcsnlen not available in msvc7.1) so make
// sure to null terminate. // sure to null terminate.
buf[bufLength - 1] = L'\0'; buf[bufLength - 1] = L'\0';
_retval.SetLength(wcslen(buf)); _retval.SetLength(wcslen(buf));
rv = NS_OK;
} else { } else {
_retval.SetLength(0); _retval.SetLength(0);
rv = NS_ERROR_NOT_AVAILABLE; rv = NS_ERROR_NOT_AVAILABLE;
} }
CoTaskMemFree(pItemIDList); CoTaskMemFree(pItemIDList);
#endif
return rv; return rv;
} }

Просмотреть файл

@ -178,8 +178,15 @@ static nsresult GetWindowsFolder(int folder, nsILocalFile** aFile)
{ {
#ifdef WINCE #ifdef WINCE
#define SHGetSpecialFolderPathW SHGetSpecialFolderPath #define SHGetSpecialFolderPathW SHGetSpecialFolderPath
#ifndef WINCE_WINDOWS_MOBILE
if (folder == CSIDL_APPDATA || folder == CSIDL_LOCAL_APPDATA)
folder = CSIDL_PROFILE;
#endif #endif
WCHAR path[MAX_PATH + 2]; #endif
WCHAR path_orig[MAX_PATH + 3];
WCHAR *path = path_orig+1;
HRESULT result = SHGetSpecialFolderPathW(NULL, path, folder, true); HRESULT result = SHGetSpecialFolderPathW(NULL, path, folder, true);
if (!SUCCEEDED(result)) if (!SUCCEEDED(result))
@ -193,6 +200,15 @@ static nsresult GetWindowsFolder(int folder, nsILocalFile** aFile)
path[++len] = L'\0'; path[++len] = L'\0';
} }
#if defined(WINCE) && !defined(WINCE_WINDOWS_MOBILE)
// sometimes CSIDL_PROFILE shows up without a root slash
if (folder == CSIDL_PROFILE && path[0] != '\\') {
path_orig[0] = '\\';
path = path_orig;
len++;
}
#endif
return NS_NewLocalFile(nsDependentString(path, len), PR_TRUE, aFile); return NS_NewLocalFile(nsDependentString(path, len), PR_TRUE, aFile);
} }