diff options
author | Rüdiger Timm <rt@openoffice.org> | 2008-06-09 12:02:37 +0000 |
---|---|---|
committer | Rüdiger Timm <rt@openoffice.org> | 2008-06-09 12:02:37 +0000 |
commit | fab6aeaeab4cd18ac0ce104f3b990963619c24f7 (patch) | |
tree | a85b20828dd3e5edd877178cc0eb705720c83f38 | |
parent | fd3737b0767038b7c0fa709c84f2eac4d68a5da5 (diff) |
INTEGRATION: CWS sb87 (1.4.18); FILE MERGED
2008/04/24 13:22:13 sb 1.4.18.3: RESYNC: (1.4-1.5); FILE MERGED
2008/04/09 13:56:52 sb 1.4.18.2: #i87548# missing termination of iniDirectory
2008/04/04 12:25:17 sb 1.4.18.1: #i87548# extracted tools/pathutils from desktop extendloaderenvironment, because it is also needed by extensions nsplugin code
-rw-r--r-- | desktop/win32/source/extendloaderenvironment.cxx | 192 |
1 files changed, 12 insertions, 180 deletions
diff --git a/desktop/win32/source/extendloaderenvironment.cxx b/desktop/win32/source/extendloaderenvironment.cxx index 824b4ce81373..519860f5873e 100644 --- a/desktop/win32/source/extendloaderenvironment.cxx +++ b/desktop/win32/source/extendloaderenvironment.cxx @@ -7,7 +7,7 @@ * OpenOffice.org - a multi-platform office productivity suite * * $RCSfile: extendloaderenvironment.cxx,v $ - * $Revision: 1.5 $ + * $Revision: 1.6 $ * * This file is part of OpenOffice.org. * @@ -43,182 +43,12 @@ #pragma warning(pop) #endif -#include "sal/types.h" +#include "tools/pathutils.hxx" #include "extendloaderenvironment.hxx" namespace { -WCHAR * filename(WCHAR * path) { - WCHAR * f = path; - for (WCHAR * p = path;;) { - switch (*p++) { - case L'\0': - return f; - case L'\\': - f = p; - break; - } - } -} - -// Concatenate two strings. -// -// @param path -// An output paremeter taking the resulting path; must point at a valid range of -// memory of size at least MAX_PATH. If NULL is returned, the content is -// unspecified. -// -// @param frontBegin, frontEnd -// Forms a valid range [frontBegin .. frontEnd) of less than MAX_PATH size. -// -// @param backBegin, backLength -// Forms a valid range [backBeghin .. backBegin + backLength) of less than -// MAX_PATH size. -// -// @return -// A pointer to the terminating null character of the concatenation, or NULL if -// a failure occurred. -WCHAR * buildPath( - WCHAR * path, WCHAR const * frontBegin, WCHAR const * frontEnd, - WCHAR const * backBegin, std::size_t backLength) -{ - if (backLength < - static_cast< std::size_t >(MAX_PATH - (frontEnd - frontBegin))) - // hopefully std::size_t is large enough - { - WCHAR * p; - if (frontBegin == path) { - p = const_cast< WCHAR * >(frontEnd); - } else { - p = path; - while (frontBegin != frontEnd) { - *p++ = *frontBegin++; - } - } - for (; backLength > 0; --backLength) { - *p++ = *backBegin++; - } - *p = L'\0'; - return p; - } else { - SetLastError(ERROR_FILENAME_EXCED_RANGE); - return NULL; - } -} - -// Resolve a link file. -// -// @param path -// An input/output parameter taking the path; must point at a valid range of -// memory of size at least MAX_PATH. On input, contains the null-terminated -// full path of the link file. On output, contains the null-terminated full -// path of the resolved link; if NULL is returned, the content is unspecified. -// -// @return -// A pointer to the terminating null character of path, or NULL if a failure -// occurred. -WCHAR * resolveLink(WCHAR * path) { - HANDLE h = CreateFileW( - path, FILE_READ_DATA, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); - if (h == INVALID_HANDLE_VALUE) { - return NULL; - } - char p1[MAX_PATH]; - DWORD n; - BOOL ok = ReadFile(h, p1, MAX_PATH, &n, NULL); - CloseHandle(h); - if (!ok) { - return NULL; - } - WCHAR p2[MAX_PATH]; - std::size_t n2 = 0; - bool colon = false; - for (DWORD i = 0; i < n;) { - unsigned char c = static_cast< unsigned char >(p1[i++]); - switch (c) { - case '\0': - SetLastError(ERROR_BAD_PATHNAME); - return NULL; - case '\x0A': - case '\x0D': - if (n2 == MAX_PATH) { - SetLastError(ERROR_FILENAME_EXCED_RANGE); - return NULL; - } - p2[n2] = L'\0'; - break; - case ':': - colon = true; - // fall through - default: - // Convert from UTF-8 to UTF-16: - if (c <= 0x7F) { - p2[n2++] = c; - } else if (c >= 0xC2 && c <= 0xDF && i < n && - static_cast< unsigned char >(p1[i]) >= 0x80 && - static_cast< unsigned char >(p1[i]) <= 0xBF) - { - p2[n2++] = ((c & 0x1F) << 6) | - (static_cast< unsigned char >(p1[i++]) & 0x3F); - } else if (n - i > 1 && - ((c == 0xE0 && - static_cast< unsigned char >(p1[i]) >= 0xA0 && - static_cast< unsigned char >(p1[i]) <= 0xBF) || - ((c >= 0xE1 && c <= 0xEC || c >= 0xEE && c <= 0xEF) && - static_cast< unsigned char >(p1[i]) >= 0x80 && - static_cast< unsigned char >(p1[i]) <= 0xBF) || - (c == 0xED && - static_cast< unsigned char >(p1[i]) >= 0x80 && - static_cast< unsigned char >(p1[i]) <= 0x9F)) && - static_cast< unsigned char >(p1[i + 1]) >= 0x80 && - static_cast< unsigned char >(p1[i + 1]) <= 0xBF) - { - p2[n2++] = ((c & 0x0F) << 12) | - ((static_cast< unsigned char >(p1[i]) & 0x3F) << 6) | - (static_cast< unsigned char >(p1[i + 1]) & 0x3F); - i += 2; - } else if (n - 2 > 1 && - ((c == 0xF0 && - static_cast< unsigned char >(p1[i]) >= 0x90 && - static_cast< unsigned char >(p1[i]) <= 0xBF) || - (c >= 0xF1 && c <= 0xF3 && - static_cast< unsigned char >(p1[i]) >= 0x80 && - static_cast< unsigned char >(p1[i]) <= 0xBF) || - (c == 0xF4 && - static_cast< unsigned char >(p1[i]) >= 0x80 && - static_cast< unsigned char >(p1[i]) <= 0x8F)) && - static_cast< unsigned char >(p1[i + 1]) >= 0x80 && - static_cast< unsigned char >(p1[i + 1]) <= 0xBF && - static_cast< unsigned char >(p1[i + 2]) >= 0x80 && - static_cast< unsigned char >(p1[i + 2]) <= 0xBF) - { - sal_Int32 u = ((c & 0x07) << 18) | - ((static_cast< unsigned char >(p1[i]) & 0x3F) << 12) | - ((static_cast< unsigned char >(p1[i + 1]) & 0x3F) << 6) | - (static_cast< unsigned char >(p1[i + 2]) & 0x3F); - i += 3; - p2[n2++] = static_cast< WCHAR >(((u - 0x10000) >> 10) | 0xD800); - p2[n2++] = static_cast< WCHAR >( - ((u - 0x10000) & 0x3FF) | 0xDC00); - } else { - SetLastError(ERROR_BAD_PATHNAME); - return NULL; - } - break; - } - } - WCHAR * end; - if (colon || p2[0] == L'\\') { - // Interpret p2 as an absolute path: - end = path; - } else { - // Interpret p2 as a relative path: - end = filename(path); - } - return buildPath(path, path, end, p2, n2); -} - void fail() { LPWSTR buf = NULL; FormatMessageW( @@ -263,7 +93,7 @@ void extendLoaderEnvironment(WCHAR * binPath, WCHAR * iniDirectory) { if (!GetModuleFileNameW(NULL, iniDirectory, MAX_PATH)) { fail(); } - WCHAR * pathEnd = filename(iniDirectory); + WCHAR * pathEnd = tools::filename(iniDirectory); WCHAR name[MAX_PATH + MY_LENGTH(L".bin")]; // hopefully std::size_t is large enough to not overflow WCHAR * nameEnd = name; @@ -281,21 +111,23 @@ void extendLoaderEnvironment(WCHAR * binPath, WCHAR * iniDirectory) { nameEnd[-3] = 'b'; nameEnd[-2] = 'i'; nameEnd[-1] = 'n'; - buildPath(binPath, iniDirectory, pathEnd, name, nameEnd - name); + tools::buildPath(binPath, iniDirectory, pathEnd, name, nameEnd - name); + *pathEnd = L'\0'; WCHAR path[MAX_PATH]; - pathEnd = buildPath( + pathEnd = tools::buildPath( path, iniDirectory, pathEnd, MY_STRING(L"..\\basis-link")); if (pathEnd == NULL) { fail(); } - pathEnd = resolveLink(path); + pathEnd = tools::resolveLink(path); if (pathEnd == NULL) { fail(); } std::size_t const maxEnv = 32767; WCHAR pad[2 * MAX_PATH + maxEnv]; // hopefully std::size_t is large enough to not overflow - WCHAR * padEnd = buildPath(pad, path, pathEnd, MY_STRING(L"\\program")); + WCHAR * padEnd = tools::buildPath( + pad, path, pathEnd, MY_STRING(L"\\program")); if (padEnd == NULL) { fail(); } @@ -307,15 +139,15 @@ void extendLoaderEnvironment(WCHAR * binPath, WCHAR * iniDirectory) { env[n] = L'\0'; bool exclude1 = contains(env, pad, padEnd); WCHAR * pad2 = exclude1 ? pad : padEnd + 1; - pathEnd = buildPath(path, path, pathEnd, MY_STRING(L"\\ure-link")); + pathEnd = tools::buildPath(path, path, pathEnd, MY_STRING(L"\\ure-link")); if (pathEnd == NULL) { fail(); } - pathEnd = resolveLink(path); + pathEnd = tools::resolveLink(path); if (pathEnd == NULL) { fail(); } - padEnd = buildPath(pad2, path, pathEnd, MY_STRING(L"\\bin")); + padEnd = tools::buildPath(pad2, path, pathEnd, MY_STRING(L"\\bin")); if (padEnd == NULL) { fail(); } |