diff options
author | Nat Goodspeed <nat@lindenlab.com> | 2024-05-15 12:18:31 -0400 |
---|---|---|
committer | Nat Goodspeed <nat@lindenlab.com> | 2024-05-15 12:18:31 -0400 |
commit | 7ccf02515ad3f9e3bf795d651fe4b3c0d773f353 (patch) | |
tree | c4adc897c07f652e617e91fbf41c12b823acc808 /indra/llfilesystem | |
parent | 1abf5f18d6afc7ae9e1b1562b92e5c1ce33b722f (diff) | |
parent | e7eced3c87310b15ac20cc3cd470d67686104a14 (diff) |
Merge commit 'e7eced3' into lua-timers for whitespace fixes.
Diffstat (limited to 'indra/llfilesystem')
-rw-r--r-- | indra/llfilesystem/lldir_linux.cpp | 364 | ||||
-rw-r--r-- | indra/llfilesystem/lldir_linux.h | 36 | ||||
-rw-r--r-- | indra/llfilesystem/lldir_mac.cpp | 148 | ||||
-rw-r--r-- | indra/llfilesystem/lldir_mac.h | 28 | ||||
-rw-r--r-- | indra/llfilesystem/lldir_utils_objc.h | 12 | ||||
-rw-r--r-- | indra/llfilesystem/lldir_win32.cpp | 548 | ||||
-rw-r--r-- | indra/llfilesystem/lldir_win32.h | 32 | ||||
-rw-r--r-- | indra/llfilesystem/lldirguard.h | 58 | ||||
-rw-r--r-- | indra/llfilesystem/lldiriterator.cpp | 322 | ||||
-rw-r--r-- | indra/llfilesystem/lldiriterator.h | 82 | ||||
-rw-r--r-- | indra/llfilesystem/lllfsthread.cpp | 278 | ||||
-rw-r--r-- | indra/llfilesystem/lllfsthread.h | 182 | ||||
-rw-r--r-- | indra/llfilesystem/tests/lldir_test.cpp | 398 | ||||
-rw-r--r-- | indra/llfilesystem/tests/lldiriterator_test.cpp | 18 |
14 files changed, 1253 insertions, 1253 deletions
diff --git a/indra/llfilesystem/lldir_linux.cpp b/indra/llfilesystem/lldir_linux.cpp index 80ad05345a..cc951ec4b9 100644 --- a/indra/llfilesystem/lldir_linux.cpp +++ b/indra/llfilesystem/lldir_linux.cpp @@ -1,25 +1,25 @@ -/** +/** * @file lldir_linux.cpp * @brief Implementation of directory utilities for linux * * $LicenseInfo:firstyear=2002&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2010, Linden Research, Inc. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License only. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * + * * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ @@ -39,104 +39,104 @@ static std::string getCurrentUserHome(char* fallback) { - const uid_t uid = getuid(); - struct passwd *pw; - - pw = getpwuid(uid); - if ((pw != NULL) && (pw->pw_dir != NULL)) - { - return pw->pw_dir; - } - - LL_INFOS() << "Couldn't detect home directory from passwd - trying $HOME" << LL_ENDL; - auto home_env = LLStringUtil::getoptenv("HOME"); - if (home_env) - { - return *home_env; - } - else - { - LL_WARNS() << "Couldn't detect home directory! Falling back to " << fallback << LL_ENDL; - return fallback; - } + const uid_t uid = getuid(); + struct passwd *pw; + + pw = getpwuid(uid); + if ((pw != NULL) && (pw->pw_dir != NULL)) + { + return pw->pw_dir; + } + + LL_INFOS() << "Couldn't detect home directory from passwd - trying $HOME" << LL_ENDL; + auto home_env = LLStringUtil::getoptenv("HOME"); + if (home_env) + { + return *home_env; + } + else + { + LL_WARNS() << "Couldn't detect home directory! Falling back to " << fallback << LL_ENDL; + return fallback; + } } LLDir_Linux::LLDir_Linux() { - mDirDelimiter = "/"; - mCurrentDirIndex = -1; - mCurrentDirCount = -1; - mDirp = NULL; - - char tmp_str[LL_MAX_PATH]; /* Flawfinder: ignore */ - if (getcwd(tmp_str, LL_MAX_PATH) == NULL) - { - strcpy(tmp_str, "/tmp"); - LL_WARNS() << "Could not get current directory; changing to " - << tmp_str << LL_ENDL; - if (chdir(tmp_str) == -1) - { - LL_ERRS() << "Could not change directory to " << tmp_str << LL_ENDL; - } - } - - mExecutableFilename = ""; - mExecutablePathAndName = ""; - mExecutableDir = tmp_str; - mWorkingDir = tmp_str; + mDirDelimiter = "/"; + mCurrentDirIndex = -1; + mCurrentDirCount = -1; + mDirp = NULL; + + char tmp_str[LL_MAX_PATH]; /* Flawfinder: ignore */ + if (getcwd(tmp_str, LL_MAX_PATH) == NULL) + { + strcpy(tmp_str, "/tmp"); + LL_WARNS() << "Could not get current directory; changing to " + << tmp_str << LL_ENDL; + if (chdir(tmp_str) == -1) + { + LL_ERRS() << "Could not change directory to " << tmp_str << LL_ENDL; + } + } + + mExecutableFilename = ""; + mExecutablePathAndName = ""; + mExecutableDir = tmp_str; + mWorkingDir = tmp_str; #ifdef APP_RO_DATA_DIR - mAppRODataDir = APP_RO_DATA_DIR; + mAppRODataDir = APP_RO_DATA_DIR; #else - mAppRODataDir = tmp_str; + mAppRODataDir = tmp_str; #endif std::string::size_type build_dir_pos = mExecutableDir.rfind("/build-linux-"); if (build_dir_pos != std::string::npos) { - // ...we're in a dev checkout - mSkinBaseDir = mExecutableDir.substr(0, build_dir_pos) + "/indra/newview/skins"; - LL_INFOS() << "Running in dev checkout with mSkinBaseDir " - << mSkinBaseDir << LL_ENDL; + // ...we're in a dev checkout + mSkinBaseDir = mExecutableDir.substr(0, build_dir_pos) + "/indra/newview/skins"; + LL_INFOS() << "Running in dev checkout with mSkinBaseDir " + << mSkinBaseDir << LL_ENDL; } else { - // ...normal installation running - mSkinBaseDir = mAppRODataDir + mDirDelimiter + "skins"; - } - - mOSUserDir = getCurrentUserHome(tmp_str); - mOSUserAppDir = ""; - mLindenUserDir = ""; - - char path [32]; /* Flawfinder: ignore */ - - // *NOTE: /proc/%d/exe doesn't work on FreeBSD. But that's ok, - // because this is the linux implementation. - - snprintf (path, sizeof(path), "/proc/%d/exe", (int) getpid ()); - int rc = readlink (path, tmp_str, sizeof (tmp_str)-1); /* Flawfinder: ignore */ - if ( (rc != -1) && (rc <= ((int) sizeof (tmp_str)-1)) ) - { - tmp_str[rc] = '\0'; //readlink() doesn't 0-terminate the buffer - mExecutablePathAndName = tmp_str; - char *path_end; - if ((path_end = strrchr(tmp_str,'/'))) - { - *path_end = '\0'; - mExecutableDir = tmp_str; - mWorkingDir = tmp_str; - mExecutableFilename = path_end+1; - } - else - { - mExecutableFilename = tmp_str; - } - } - - mLLPluginDir = mExecutableDir + mDirDelimiter + "llplugin"; - - // *TODO: don't use /tmp, use $HOME/.secondlife/tmp or something. - mTempDir = "/tmp"; + // ...normal installation running + mSkinBaseDir = mAppRODataDir + mDirDelimiter + "skins"; + } + + mOSUserDir = getCurrentUserHome(tmp_str); + mOSUserAppDir = ""; + mLindenUserDir = ""; + + char path [32]; /* Flawfinder: ignore */ + + // *NOTE: /proc/%d/exe doesn't work on FreeBSD. But that's ok, + // because this is the linux implementation. + + snprintf (path, sizeof(path), "/proc/%d/exe", (int) getpid ()); + int rc = readlink (path, tmp_str, sizeof (tmp_str)-1); /* Flawfinder: ignore */ + if ( (rc != -1) && (rc <= ((int) sizeof (tmp_str)-1)) ) + { + tmp_str[rc] = '\0'; //readlink() doesn't 0-terminate the buffer + mExecutablePathAndName = tmp_str; + char *path_end; + if ((path_end = strrchr(tmp_str,'/'))) + { + *path_end = '\0'; + mExecutableDir = tmp_str; + mWorkingDir = tmp_str; + mExecutableFilename = path_end+1; + } + else + { + mExecutableFilename = tmp_str; + } + } + + mLLPluginDir = mExecutableDir + mDirDelimiter + "llplugin"; + + // *TODO: don't use /tmp, use $HOME/.secondlife/tmp or something. + mTempDir = "/tmp"; } LLDir_Linux::~LLDir_Linux() @@ -147,123 +147,123 @@ LLDir_Linux::~LLDir_Linux() void LLDir_Linux::initAppDirs(const std::string &app_name, - const std::string& app_read_only_data_dir) + const std::string& app_read_only_data_dir) { - // Allow override so test apps can read newview directory - if (!app_read_only_data_dir.empty()) - { - mAppRODataDir = app_read_only_data_dir; - mSkinBaseDir = add(mAppRODataDir, "skins"); - } - mAppName = app_name; - - std::string upper_app_name(app_name); - LLStringUtil::toUpper(upper_app_name); - - auto app_home_env(LLStringUtil::getoptenv(upper_app_name + "_USER_DIR")); - if (app_home_env) - { - // user has specified own userappdir i.e. $SECONDLIFE_USER_DIR - mOSUserAppDir = *app_home_env; - } - else - { - // traditionally on unixoids, MyApp gets ~/.myapp dir for data - mOSUserAppDir = mOSUserDir; - mOSUserAppDir += "/"; - mOSUserAppDir += "."; - std::string lower_app_name(app_name); - LLStringUtil::toLower(lower_app_name); - mOSUserAppDir += lower_app_name; - } - - // create any directories we expect to write to. - - int res = LLFile::mkdir(mOSUserAppDir); - if (res == -1) - { - LL_WARNS() << "Couldn't create app user dir " << mOSUserAppDir << LL_ENDL; - LL_WARNS() << "Default to base dir" << mOSUserDir << LL_ENDL; - mOSUserAppDir = mOSUserDir; - } - - res = LLFile::mkdir(getExpandedFilename(LL_PATH_LOGS,"")); - if (res == -1) - { - LL_WARNS() << "Couldn't create LL_PATH_LOGS dir " << getExpandedFilename(LL_PATH_LOGS,"") << LL_ENDL; - } - - res = LLFile::mkdir(getExpandedFilename(LL_PATH_USER_SETTINGS,"")); - if (res == -1) - { - LL_WARNS() << "Couldn't create LL_PATH_USER_SETTINGS dir " << getExpandedFilename(LL_PATH_USER_SETTINGS,"") << LL_ENDL; - } - - res = LLFile::mkdir(getExpandedFilename(LL_PATH_CACHE,"")); - if (res == -1) - { - LL_WARNS() << "Couldn't create LL_PATH_CACHE dir " << getExpandedFilename(LL_PATH_CACHE,"") << LL_ENDL; - } - - mCAFile = getExpandedFilename(LL_PATH_EXECUTABLE, "ca-bundle.crt"); + // Allow override so test apps can read newview directory + if (!app_read_only_data_dir.empty()) + { + mAppRODataDir = app_read_only_data_dir; + mSkinBaseDir = add(mAppRODataDir, "skins"); + } + mAppName = app_name; + + std::string upper_app_name(app_name); + LLStringUtil::toUpper(upper_app_name); + + auto app_home_env(LLStringUtil::getoptenv(upper_app_name + "_USER_DIR")); + if (app_home_env) + { + // user has specified own userappdir i.e. $SECONDLIFE_USER_DIR + mOSUserAppDir = *app_home_env; + } + else + { + // traditionally on unixoids, MyApp gets ~/.myapp dir for data + mOSUserAppDir = mOSUserDir; + mOSUserAppDir += "/"; + mOSUserAppDir += "."; + std::string lower_app_name(app_name); + LLStringUtil::toLower(lower_app_name); + mOSUserAppDir += lower_app_name; + } + + // create any directories we expect to write to. + + int res = LLFile::mkdir(mOSUserAppDir); + if (res == -1) + { + LL_WARNS() << "Couldn't create app user dir " << mOSUserAppDir << LL_ENDL; + LL_WARNS() << "Default to base dir" << mOSUserDir << LL_ENDL; + mOSUserAppDir = mOSUserDir; + } + + res = LLFile::mkdir(getExpandedFilename(LL_PATH_LOGS,"")); + if (res == -1) + { + LL_WARNS() << "Couldn't create LL_PATH_LOGS dir " << getExpandedFilename(LL_PATH_LOGS,"") << LL_ENDL; + } + + res = LLFile::mkdir(getExpandedFilename(LL_PATH_USER_SETTINGS,"")); + if (res == -1) + { + LL_WARNS() << "Couldn't create LL_PATH_USER_SETTINGS dir " << getExpandedFilename(LL_PATH_USER_SETTINGS,"") << LL_ENDL; + } + + res = LLFile::mkdir(getExpandedFilename(LL_PATH_CACHE,"")); + if (res == -1) + { + LL_WARNS() << "Couldn't create LL_PATH_CACHE dir " << getExpandedFilename(LL_PATH_CACHE,"") << LL_ENDL; + } + + mCAFile = getExpandedFilename(LL_PATH_EXECUTABLE, "ca-bundle.crt"); } U32 LLDir_Linux::countFilesInDir(const std::string &dirname, const std::string &mask) { - U32 file_count = 0; - glob_t g; + U32 file_count = 0; + glob_t g; - std::string tmp_str; - tmp_str = dirname; - tmp_str += mask; - - if(glob(tmp_str.c_str(), GLOB_NOSORT, NULL, &g) == 0) - { - file_count = g.gl_pathc; + std::string tmp_str; + tmp_str = dirname; + tmp_str += mask; - globfree(&g); - } + if(glob(tmp_str.c_str(), GLOB_NOSORT, NULL, &g) == 0) + { + file_count = g.gl_pathc; + + globfree(&g); + } - return (file_count); + return (file_count); } std::string LLDir_Linux::getCurPath() { - char tmp_str[LL_MAX_PATH]; /* Flawfinder: ignore */ - if (getcwd(tmp_str, LL_MAX_PATH) == NULL) - { - LL_WARNS() << "Could not get current directory" << LL_ENDL; - tmp_str[0] = '\0'; - } - return tmp_str; + char tmp_str[LL_MAX_PATH]; /* Flawfinder: ignore */ + if (getcwd(tmp_str, LL_MAX_PATH) == NULL) + { + LL_WARNS() << "Could not get current directory" << LL_ENDL; + tmp_str[0] = '\0'; + } + return tmp_str; } bool LLDir_Linux::fileExists(const std::string &filename) const { - struct stat stat_data; - // Check the age of the file - // Now, we see if the files we've gathered are recent... - int res = stat(filename.c_str(), &stat_data); - if (!res) - { - return TRUE; - } - else - { - return FALSE; - } + struct stat stat_data; + // Check the age of the file + // Now, we see if the files we've gathered are recent... + int res = stat(filename.c_str(), &stat_data); + if (!res) + { + return TRUE; + } + else + { + return FALSE; + } } /*virtual*/ std::string LLDir_Linux::getLLPluginLauncher() { - return gDirUtilp->getExecutableDir() + gDirUtilp->getDirDelimiter() + - "SLPlugin"; + return gDirUtilp->getExecutableDir() + gDirUtilp->getDirDelimiter() + + "SLPlugin"; } /*virtual*/ std::string LLDir_Linux::getLLPluginFilename(std::string base_name) { - return gDirUtilp->getLLPluginDir() + gDirUtilp->getDirDelimiter() + - "lib" + base_name + ".so"; + return gDirUtilp->getLLPluginDir() + gDirUtilp->getDirDelimiter() + + "lib" + base_name + ".so"; } diff --git a/indra/llfilesystem/lldir_linux.h b/indra/llfilesystem/lldir_linux.h index e83a020ba4..bd031bd7bb 100644 --- a/indra/llfilesystem/lldir_linux.h +++ b/indra/llfilesystem/lldir_linux.h @@ -1,25 +1,25 @@ -/** +/** * @file lldir_linux.h * @brief Definition of directory utilities class for linux * * $LicenseInfo:firstyear=2000&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2010, Linden Research, Inc. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License only. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * + * * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ @@ -39,24 +39,24 @@ class LLDir_Linux : public LLDir { public: - LLDir_Linux(); - virtual ~LLDir_Linux(); + LLDir_Linux(); + virtual ~LLDir_Linux(); - /*virtual*/ void initAppDirs(const std::string &app_name, - const std::string& app_read_only_data_dir); + /*virtual*/ void initAppDirs(const std::string &app_name, + const std::string& app_read_only_data_dir); - virtual std::string getCurPath(); - virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask); - /*virtual*/ bool fileExists(const std::string &filename) const; + virtual std::string getCurPath(); + virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask); + /*virtual*/ bool fileExists(const std::string &filename) const; - /*virtual*/ std::string getLLPluginLauncher(); - /*virtual*/ std::string getLLPluginFilename(std::string base_name); + /*virtual*/ std::string getLLPluginLauncher(); + /*virtual*/ std::string getLLPluginFilename(std::string base_name); private: - DIR *mDirp; - int mCurrentDirIndex; - int mCurrentDirCount; - std::string mCurrentDir; + DIR *mDirp; + int mCurrentDirIndex; + int mCurrentDirCount; + std::string mCurrentDir; }; #endif // LL_LLDIR_LINUX_H diff --git a/indra/llfilesystem/lldir_mac.cpp b/indra/llfilesystem/lldir_mac.cpp index 9ad8e274b6..b9560c8234 100644 --- a/indra/llfilesystem/lldir_mac.cpp +++ b/indra/llfilesystem/lldir_mac.cpp @@ -1,28 +1,28 @@ -/** +/** * @file lldir_mac.cpp * @brief Implementation of directory utilities for Mac OS X * * $LicenseInfo:firstyear=2002&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2010, Linden Research, Inc. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License only. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * + * * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ - */ + */ #if LL_DARWIN @@ -40,17 +40,17 @@ // -------------------------------------------------------------------------------- -static bool CreateDirectory(const std::string &parent, +static bool CreateDirectory(const std::string &parent, const std::string &child, std::string *fullname) { - + boost::filesystem::path p(parent); p /= child; - + if (fullname) *fullname = std::string(p.string()); - + if (! boost::filesystem::create_directory(p)) { return (boost::filesystem::is_directory(p)); @@ -62,95 +62,95 @@ static bool CreateDirectory(const std::string &parent, LLDir_Mac::LLDir_Mac() { - mDirDelimiter = "/"; + mDirDelimiter = "/"; const std::string secondLifeString = "SecondLife"; - + std::string executablepathstr = getSystemExecutableFolder(); //NOTE: LLINFOS/LLERRS will not output to log here. The streams are not initialized. - - if (!executablepathstr.empty()) - { - // mExecutablePathAndName - mExecutablePathAndName = executablepathstr; - + + if (!executablepathstr.empty()) + { + // mExecutablePathAndName + mExecutablePathAndName = executablepathstr; + boost::filesystem::path executablepath(executablepathstr); - + # ifndef BOOST_SYSTEM_NO_DEPRECATED #endif mExecutableFilename = executablepath.filename().string(); mExecutableDir = executablepath.parent_path().string(); - - // mAppRODataDir + + // mAppRODataDir std::string resourcepath = getSystemResourceFolder(); mAppRODataDir = resourcepath; - - // *NOTE: When running in a dev tree, use the copy of - // skins in indra/newview/ rather than in the application bundle. This - // mirrors Windows dev environment behavior and allows direct checkin - // of edited skins/xui files. JC - - // MBW -- This keeps the mac application from finding other things. - // If this is really for skins, it should JUST apply to skins. - - std::string::size_type build_dir_pos = mExecutableDir.rfind("/build-darwin-"); - if (build_dir_pos != std::string::npos) - { - // ...we're in a dev checkout - mSkinBaseDir = mExecutableDir.substr(0, build_dir_pos) - + "/indra/newview/skins"; - LL_INFOS() << "Running in dev checkout with mSkinBaseDir " - << mSkinBaseDir << LL_ENDL; - } - else - { - // ...normal installation running - mSkinBaseDir = mAppRODataDir + mDirDelimiter + "skins"; - } - - // mOSUserDir + + // *NOTE: When running in a dev tree, use the copy of + // skins in indra/newview/ rather than in the application bundle. This + // mirrors Windows dev environment behavior and allows direct checkin + // of edited skins/xui files. JC + + // MBW -- This keeps the mac application from finding other things. + // If this is really for skins, it should JUST apply to skins. + + std::string::size_type build_dir_pos = mExecutableDir.rfind("/build-darwin-"); + if (build_dir_pos != std::string::npos) + { + // ...we're in a dev checkout + mSkinBaseDir = mExecutableDir.substr(0, build_dir_pos) + + "/indra/newview/skins"; + LL_INFOS() << "Running in dev checkout with mSkinBaseDir " + << mSkinBaseDir << LL_ENDL; + } + else + { + // ...normal installation running + mSkinBaseDir = mAppRODataDir + mDirDelimiter + "skins"; + } + + // mOSUserDir std::string appdir = getSystemApplicationSupportFolder(); std::string rootdir; //Create root directory if (CreateDirectory(appdir, secondLifeString, &rootdir)) { - + // Save the full path to the folder mOSUserDir = rootdir; - + // Create our sub-dirs CreateDirectory(rootdir, std::string("data"), NULL); CreateDirectory(rootdir, std::string("logs"), NULL); CreateDirectory(rootdir, std::string("user_settings"), NULL); CreateDirectory(rootdir, std::string("browser_profile"), NULL); } - - //mOSCacheDir + + //mOSCacheDir std::string cachedir = getSystemCacheFolder(); if (!cachedir.empty()) - { + { mOSCacheDir = cachedir; //TODO: This changes from ~/Library/Cache/Secondlife to ~/Library/Cache/com.app.secondlife/Secondlife. Last dir level could go away. CreateDirectory(mOSCacheDir, secondLifeString, NULL); - } - - // mOSUserAppDir - mOSUserAppDir = mOSUserDir; - - // mTempDir + } + + // mOSUserAppDir + mOSUserAppDir = mOSUserDir; + + // mTempDir //Aura 120920 boost::filesystem::temp_directory_path() not yet implemented on mac. :( std::string tmpdir = getSystemTempFolder(); if (!tmpdir.empty()) { CreateDirectory(tmpdir, secondLifeString, &mTempDir); } - - mWorkingDir = getCurPath(); - mLLPluginDir = mAppRODataDir + mDirDelimiter + "llplugin"; - } + mWorkingDir = getCurPath(); + + mLLPluginDir = mAppRODataDir + mDirDelimiter + "llplugin"; + } } LLDir_Mac::~LLDir_Mac() @@ -161,20 +161,20 @@ LLDir_Mac::~LLDir_Mac() void LLDir_Mac::initAppDirs(const std::string &app_name, - const std::string& app_read_only_data_dir) + const std::string& app_read_only_data_dir) { - // Allow override so test apps can read newview directory - if (!app_read_only_data_dir.empty()) - { - mAppRODataDir = app_read_only_data_dir; - mSkinBaseDir = add(mAppRODataDir, "skins"); - } - mCAFile = add(mAppRODataDir, "ca-bundle.crt"); + // Allow override so test apps can read newview directory + if (!app_read_only_data_dir.empty()) + { + mAppRODataDir = app_read_only_data_dir; + mSkinBaseDir = add(mAppRODataDir, "skins"); + } + mCAFile = add(mAppRODataDir, "ca-bundle.crt"); } std::string LLDir_Mac::getCurPath() { - return boost::filesystem::path( boost::filesystem::current_path() ).string(); + return boost::filesystem::path( boost::filesystem::current_path() ).string(); } @@ -187,14 +187,14 @@ bool LLDir_Mac::fileExists(const std::string &filename) const /*virtual*/ std::string LLDir_Mac::getLLPluginLauncher() { - return gDirUtilp->getAppRODataDir() + gDirUtilp->getDirDelimiter() + - "SLPlugin.app/Contents/MacOS/SLPlugin"; + return gDirUtilp->getAppRODataDir() + gDirUtilp->getDirDelimiter() + + "SLPlugin.app/Contents/MacOS/SLPlugin"; } /*virtual*/ std::string LLDir_Mac::getLLPluginFilename(std::string base_name) { - return gDirUtilp->getLLPluginDir() + gDirUtilp->getDirDelimiter() + - base_name + ".dylib"; + return gDirUtilp->getLLPluginDir() + gDirUtilp->getDirDelimiter() + + base_name + ".dylib"; } diff --git a/indra/llfilesystem/lldir_mac.h b/indra/llfilesystem/lldir_mac.h index 558727ebbc..dbb8d85e81 100644 --- a/indra/llfilesystem/lldir_mac.h +++ b/indra/llfilesystem/lldir_mac.h @@ -1,28 +1,28 @@ -/** +/** * @file lldir_mac.h * @brief Definition of directory utilities class for Mac OS X * * $LicenseInfo:firstyear=2000&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2010, Linden Research, Inc. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License only. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * + * * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ - */ + */ #if !LL_DARWIN #error This header must not be included when compiling for any target other than Mac OS. Consider including lldir.h instead. @@ -38,17 +38,17 @@ class LLDir_Mac : public LLDir { public: - LLDir_Mac(); - virtual ~LLDir_Mac(); + LLDir_Mac(); + virtual ~LLDir_Mac(); - /*virtual*/ void initAppDirs(const std::string &app_name, - const std::string& app_read_only_data_dir); + /*virtual*/ void initAppDirs(const std::string &app_name, + const std::string& app_read_only_data_dir); - virtual std::string getCurPath(); - virtual bool fileExists(const std::string &filename) const; + virtual std::string getCurPath(); + virtual bool fileExists(const std::string &filename) const; - /*virtual*/ std::string getLLPluginLauncher(); - /*virtual*/ std::string getLLPluginFilename(std::string base_name); + /*virtual*/ std::string getLLPluginLauncher(); + /*virtual*/ std::string getLLPluginFilename(std::string base_name); }; #endif // LL_LLDIR_MAC_H diff --git a/indra/llfilesystem/lldir_utils_objc.h b/indra/llfilesystem/lldir_utils_objc.h index 59dbeb4aec..142933972a 100644 --- a/indra/llfilesystem/lldir_utils_objc.h +++ b/indra/llfilesystem/lldir_utils_objc.h @@ -1,28 +1,28 @@ -/** +/** * @file lldir_utils_objc.h * @brief Definition of directory utilities class for Mac OS X * * $LicenseInfo:firstyear=2020&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2020, Linden Research, Inc. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License only. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * + * * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ - */ + */ #if !LL_DARWIN #error This header must not be included when compiling for any target other than Mac OS. Consider including lldir.h instead. diff --git a/indra/llfilesystem/lldir_win32.cpp b/indra/llfilesystem/lldir_win32.cpp index b3b3afb37e..5c85f0d3d4 100644 --- a/indra/llfilesystem/lldir_win32.cpp +++ b/indra/llfilesystem/lldir_win32.cpp @@ -1,25 +1,25 @@ -/** +/** * @file lldir_win32.cpp * @brief Implementation of directory utilities for windows * * $LicenseInfo:firstyear=2002&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2010, Linden Research, Inc. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License only. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * + * * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ @@ -91,200 +91,200 @@ namespace LLDir_Win32::LLDir_Win32() { - // set this first: used by append() and add() methods - mDirDelimiter = "\\"; - - WCHAR w_str[MAX_PATH]; - // Application Data is where user settings go. We rely on $APPDATA being - // correct. - auto APPDATA = LLStringUtil::getoptenv("APPDATA"); - if (APPDATA) - { - mOSUserDir = *APPDATA; - } - PRELOG("APPDATA='" << mOSUserDir << "'"); - // On Windows, we could have received a plain-ASCII pathname in which - // non-ASCII characters have been munged to '?', or the pathname could - // have been badly encoded and decoded such that we now have garbage - // instead of a valid path. Check that mOSUserDir actually exists. - if (mOSUserDir.empty() || ! fileExists(mOSUserDir)) - { - PRELOG("APPDATA does not exist"); - //HRESULT okay = SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, 0, w_str); - wchar_t *pwstr = NULL; - HRESULT okay = SHGetKnownFolderPath(FOLDERID_RoamingAppData, 0, NULL, &pwstr); - PRELOG("SHGetKnownFolderPath(FOLDERID_RoamingAppData) returned " << okay); - if (SUCCEEDED(okay) && pwstr) - { - // But of course, only update mOSUserDir if SHGetKnownFolderPath() works. - mOSUserDir = ll_convert_wide_to_string(pwstr); - // Not only that: update our environment so that child processes - // will see a reasonable value as well. - _wputenv_s(L"APPDATA", pwstr); - // SHGetKnownFolderPath() contract requires us to free pwstr - CoTaskMemFree(pwstr); - PRELOG("mOSUserDir='" << mOSUserDir << "'"); - } - } - - // We want cache files to go on the local disk, even if the - // user is on a network with a "roaming profile". - // - // On Vista this is: - // C:\Users\James\AppData\Local - // - // We used to store the cache in AppData\Roaming, and the installer - // cleans up that version on upgrade. JC - auto LOCALAPPDATA = LLStringUtil::getoptenv("LOCALAPPDATA"); - if (LOCALAPPDATA) - { - mOSCacheDir = *LOCALAPPDATA; - } - PRELOG("LOCALAPPDATA='" << mOSCacheDir << "'"); - // Windows really does not deal well with pathnames containing non-ASCII - // characters. See above remarks about APPDATA. - if (mOSCacheDir.empty() || ! fileExists(mOSCacheDir)) - { - PRELOG("LOCALAPPDATA does not exist"); - //HRESULT okay = SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA, NULL, 0, w_str); - wchar_t *pwstr = NULL; - HRESULT okay = SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, NULL, &pwstr); - PRELOG("SHGetKnownFolderPath(FOLDERID_LocalAppData) returned " << okay); - if (SUCCEEDED(okay) && pwstr) - { - // But of course, only update mOSCacheDir if SHGetKnownFolderPath() works. - mOSCacheDir = ll_convert_wide_to_string(pwstr); - // Update our environment so that child processes will see a - // reasonable value as well. - _wputenv_s(L"LOCALAPPDATA", pwstr); - // SHGetKnownFolderPath() contract requires us to free pwstr - CoTaskMemFree(pwstr); - PRELOG("mOSCacheDir='" << mOSCacheDir << "'"); - } - } - - if (GetTempPath(MAX_PATH, w_str)) - { - if (wcslen(w_str)) /* Flawfinder: ignore */ - { - w_str[wcslen(w_str)-1] = '\0'; /* Flawfinder: ignore */ // remove trailing slash - } - mTempDir = utf16str_to_utf8str(llutf16string(w_str)); - - if (mOSUserDir.empty()) - { - mOSUserDir = mTempDir; - } - - if (mOSCacheDir.empty()) - { - mOSCacheDir = mTempDir; - } - } - else - { - mTempDir = mOSUserDir; - } + // set this first: used by append() and add() methods + mDirDelimiter = "\\"; + + WCHAR w_str[MAX_PATH]; + // Application Data is where user settings go. We rely on $APPDATA being + // correct. + auto APPDATA = LLStringUtil::getoptenv("APPDATA"); + if (APPDATA) + { + mOSUserDir = *APPDATA; + } + PRELOG("APPDATA='" << mOSUserDir << "'"); + // On Windows, we could have received a plain-ASCII pathname in which + // non-ASCII characters have been munged to '?', or the pathname could + // have been badly encoded and decoded such that we now have garbage + // instead of a valid path. Check that mOSUserDir actually exists. + if (mOSUserDir.empty() || ! fileExists(mOSUserDir)) + { + PRELOG("APPDATA does not exist"); + //HRESULT okay = SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, 0, w_str); + wchar_t *pwstr = NULL; + HRESULT okay = SHGetKnownFolderPath(FOLDERID_RoamingAppData, 0, NULL, &pwstr); + PRELOG("SHGetKnownFolderPath(FOLDERID_RoamingAppData) returned " << okay); + if (SUCCEEDED(okay) && pwstr) + { + // But of course, only update mOSUserDir if SHGetKnownFolderPath() works. + mOSUserDir = ll_convert_wide_to_string(pwstr); + // Not only that: update our environment so that child processes + // will see a reasonable value as well. + _wputenv_s(L"APPDATA", pwstr); + // SHGetKnownFolderPath() contract requires us to free pwstr + CoTaskMemFree(pwstr); + PRELOG("mOSUserDir='" << mOSUserDir << "'"); + } + } + + // We want cache files to go on the local disk, even if the + // user is on a network with a "roaming profile". + // + // On Vista this is: + // C:\Users\James\AppData\Local + // + // We used to store the cache in AppData\Roaming, and the installer + // cleans up that version on upgrade. JC + auto LOCALAPPDATA = LLStringUtil::getoptenv("LOCALAPPDATA"); + if (LOCALAPPDATA) + { + mOSCacheDir = *LOCALAPPDATA; + } + PRELOG("LOCALAPPDATA='" << mOSCacheDir << "'"); + // Windows really does not deal well with pathnames containing non-ASCII + // characters. See above remarks about APPDATA. + if (mOSCacheDir.empty() || ! fileExists(mOSCacheDir)) + { + PRELOG("LOCALAPPDATA does not exist"); + //HRESULT okay = SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA, NULL, 0, w_str); + wchar_t *pwstr = NULL; + HRESULT okay = SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, NULL, &pwstr); + PRELOG("SHGetKnownFolderPath(FOLDERID_LocalAppData) returned " << okay); + if (SUCCEEDED(okay) && pwstr) + { + // But of course, only update mOSCacheDir if SHGetKnownFolderPath() works. + mOSCacheDir = ll_convert_wide_to_string(pwstr); + // Update our environment so that child processes will see a + // reasonable value as well. + _wputenv_s(L"LOCALAPPDATA", pwstr); + // SHGetKnownFolderPath() contract requires us to free pwstr + CoTaskMemFree(pwstr); + PRELOG("mOSCacheDir='" << mOSCacheDir << "'"); + } + } + + if (GetTempPath(MAX_PATH, w_str)) + { + if (wcslen(w_str)) /* Flawfinder: ignore */ + { + w_str[wcslen(w_str)-1] = '\0'; /* Flawfinder: ignore */ // remove trailing slash + } + mTempDir = utf16str_to_utf8str(llutf16string(w_str)); + + if (mOSUserDir.empty()) + { + mOSUserDir = mTempDir; + } + + if (mOSCacheDir.empty()) + { + mOSCacheDir = mTempDir; + } + } + else + { + mTempDir = mOSUserDir; + } /*==========================================================================*| - // Now that we've got mOSUserDir, one way or another, let's see how we did - // with our environment variables. - { - auto report = [this](std::ostream& out){ - out << "mOSUserDir = '" << mOSUserDir << "'\n" - << "mOSCacheDir = '" << mOSCacheDir << "'\n" - << "mTempDir = '" << mTempDir << "'" << std::endl; - }; - int res = LLFile::mkdir(mOSUserDir); - if (res == -1) - { - // If we couldn't even create the directory, just blurt to stderr - report(std::cerr); - } - else - { - // successfully created logdir, plunk a log file there - std::string logfilename(add(mOSUserDir, "lldir.log")); - std::ofstream logfile(logfilename.c_str()); - if (! logfile.is_open()) - { - report(std::cerr); - } - else - { - report(logfile); - } - } - } + // Now that we've got mOSUserDir, one way or another, let's see how we did + // with our environment variables. + { + auto report = [this](std::ostream& out){ + out << "mOSUserDir = '" << mOSUserDir << "'\n" + << "mOSCacheDir = '" << mOSCacheDir << "'\n" + << "mTempDir = '" << mTempDir << "'" << std::endl; + }; + int res = LLFile::mkdir(mOSUserDir); + if (res == -1) + { + // If we couldn't even create the directory, just blurt to stderr + report(std::cerr); + } + else + { + // successfully created logdir, plunk a log file there + std::string logfilename(add(mOSUserDir, "lldir.log")); + std::ofstream logfile(logfilename.c_str()); + if (! logfile.is_open()) + { + report(std::cerr); + } + else + { + report(logfile); + } + } + } |*==========================================================================*/ -// fprintf(stderr, "mTempDir = <%s>",mTempDir); - - // Set working directory, for LLDir::getWorkingDir() - GetCurrentDirectory(MAX_PATH, w_str); - mWorkingDir = utf16str_to_utf8str(llutf16string(w_str)); - - // Set the executable directory - S32 size = GetModuleFileName(NULL, w_str, MAX_PATH); - if (size) - { - w_str[size] = '\0'; - mExecutablePathAndName = utf16str_to_utf8str(llutf16string(w_str)); - S32 path_end = mExecutablePathAndName.find_last_of('\\'); - if (path_end != std::string::npos) - { - mExecutableDir = mExecutablePathAndName.substr(0, path_end); - mExecutableFilename = mExecutablePathAndName.substr(path_end+1, std::string::npos); - } - else - { - mExecutableFilename = mExecutablePathAndName; - } - - } - else - { - fprintf(stderr, "Couldn't get APP path, assuming current directory!"); - mExecutableDir = mWorkingDir; - // Assume it's the current directory - } - - // mAppRODataDir = "."; - - // Determine the location of the App-Read-Only-Data - // Try the working directory then the exe's dir. - mAppRODataDir = mWorkingDir; - - -// if (mExecutableDir.find("indra") == std::string::npos) - - // *NOTE:Mani - It is a mistake to put viewer specific code in - // the LLDir implementation. The references to 'skins' and - // 'llplugin' need to go somewhere else. - // alas... this also gets called during static initialization - // time due to the construction of gDirUtil in lldir.cpp. - if(! LLFile::isdir(add(mAppRODataDir, "skins"))) - { - // What? No skins in the working dir? - // Try the executable's directory. - mAppRODataDir = mExecutableDir; - } - -// LL_INFOS() << "mAppRODataDir = " << mAppRODataDir << LL_ENDL; - - mSkinBaseDir = add(mAppRODataDir, "skins"); - - // Build the default cache directory - mDefaultCacheDir = buildSLOSCacheDir(); - - // Make sure it exists - int res = LLFile::mkdir(mDefaultCacheDir); - if (res == -1) - { - LL_WARNS() << "Couldn't create LL_PATH_CACHE dir " << mDefaultCacheDir << LL_ENDL; - } - - mLLPluginDir = add(mExecutableDir, "llplugin"); +// fprintf(stderr, "mTempDir = <%s>",mTempDir); + + // Set working directory, for LLDir::getWorkingDir() + GetCurrentDirectory(MAX_PATH, w_str); + mWorkingDir = utf16str_to_utf8str(llutf16string(w_str)); + + // Set the executable directory + S32 size = GetModuleFileName(NULL, w_str, MAX_PATH); + if (size) + { + w_str[size] = '\0'; + mExecutablePathAndName = utf16str_to_utf8str(llutf16string(w_str)); + S32 path_end = mExecutablePathAndName.find_last_of('\\'); + if (path_end != std::string::npos) + { + mExecutableDir = mExecutablePathAndName.substr(0, path_end); + mExecutableFilename = mExecutablePathAndName.substr(path_end+1, std::string::npos); + } + else + { + mExecutableFilename = mExecutablePathAndName; + } + + } + else + { + fprintf(stderr, "Couldn't get APP path, assuming current directory!"); + mExecutableDir = mWorkingDir; + // Assume it's the current directory + } + + // mAppRODataDir = "."; + + // Determine the location of the App-Read-Only-Data + // Try the working directory then the exe's dir. + mAppRODataDir = mWorkingDir; + + +// if (mExecutableDir.find("indra") == std::string::npos) + + // *NOTE:Mani - It is a mistake to put viewer specific code in + // the LLDir implementation. The references to 'skins' and + // 'llplugin' need to go somewhere else. + // alas... this also gets called during static initialization + // time due to the construction of gDirUtil in lldir.cpp. + if(! LLFile::isdir(add(mAppRODataDir, "skins"))) + { + // What? No skins in the working dir? + // Try the executable's directory. + mAppRODataDir = mExecutableDir; + } + +// LL_INFOS() << "mAppRODataDir = " << mAppRODataDir << LL_ENDL; + + mSkinBaseDir = add(mAppRODataDir, "skins"); + + // Build the default cache directory + mDefaultCacheDir = buildSLOSCacheDir(); + + // Make sure it exists + int res = LLFile::mkdir(mDefaultCacheDir); + if (res == -1) + { + LL_WARNS() << "Couldn't create LL_PATH_CACHE dir " << mDefaultCacheDir << LL_ENDL; + } + + mLLPluginDir = add(mExecutableDir, "llplugin"); } LLDir_Win32::~LLDir_Win32() @@ -294,110 +294,110 @@ LLDir_Win32::~LLDir_Win32() // Implementation void LLDir_Win32::initAppDirs(const std::string &app_name, - const std::string& app_read_only_data_dir) + const std::string& app_read_only_data_dir) { - // Allow override so test apps can read newview directory - if (!app_read_only_data_dir.empty()) - { - mAppRODataDir = app_read_only_data_dir; - mSkinBaseDir = add(mAppRODataDir, "skins"); - } - mAppName = app_name; - mOSUserAppDir = add(mOSUserDir, app_name); - - int res = LLFile::mkdir(mOSUserAppDir); - if (res == -1) - { - LL_WARNS() << "Couldn't create app user dir " << mOSUserAppDir << LL_ENDL; - LL_WARNS() << "Default to base dir" << mOSUserDir << LL_ENDL; - mOSUserAppDir = mOSUserDir; - } - //dumpCurrentDirectories(); - - res = LLFile::mkdir(getExpandedFilename(LL_PATH_LOGS,"")); - if (res == -1) - { - LL_WARNS() << "Couldn't create LL_PATH_LOGS dir " << getExpandedFilename(LL_PATH_LOGS,"") << LL_ENDL; - } - - res = LLFile::mkdir(getExpandedFilename(LL_PATH_USER_SETTINGS,"")); - if (res == -1) - { - LL_WARNS() << "Couldn't create LL_PATH_USER_SETTINGS dir " << getExpandedFilename(LL_PATH_USER_SETTINGS,"") << LL_ENDL; - } - - res = LLFile::mkdir(getExpandedFilename(LL_PATH_CACHE,"")); - if (res == -1) - { - LL_WARNS() << "Couldn't create LL_PATH_CACHE dir " << getExpandedFilename(LL_PATH_CACHE,"") << LL_ENDL; - } - - mCAFile = getExpandedFilename( LL_PATH_EXECUTABLE, "ca-bundle.crt" ); + // Allow override so test apps can read newview directory + if (!app_read_only_data_dir.empty()) + { + mAppRODataDir = app_read_only_data_dir; + mSkinBaseDir = add(mAppRODataDir, "skins"); + } + mAppName = app_name; + mOSUserAppDir = add(mOSUserDir, app_name); + + int res = LLFile::mkdir(mOSUserAppDir); + if (res == -1) + { + LL_WARNS() << "Couldn't create app user dir " << mOSUserAppDir << LL_ENDL; + LL_WARNS() << "Default to base dir" << mOSUserDir << LL_ENDL; + mOSUserAppDir = mOSUserDir; + } + //dumpCurrentDirectories(); + + res = LLFile::mkdir(getExpandedFilename(LL_PATH_LOGS,"")); + if (res == -1) + { + LL_WARNS() << "Couldn't create LL_PATH_LOGS dir " << getExpandedFilename(LL_PATH_LOGS,"") << LL_ENDL; + } + + res = LLFile::mkdir(getExpandedFilename(LL_PATH_USER_SETTINGS,"")); + if (res == -1) + { + LL_WARNS() << "Couldn't create LL_PATH_USER_SETTINGS dir " << getExpandedFilename(LL_PATH_USER_SETTINGS,"") << LL_ENDL; + } + + res = LLFile::mkdir(getExpandedFilename(LL_PATH_CACHE,"")); + if (res == -1) + { + LL_WARNS() << "Couldn't create LL_PATH_CACHE dir " << getExpandedFilename(LL_PATH_CACHE,"") << LL_ENDL; + } + + mCAFile = getExpandedFilename( LL_PATH_EXECUTABLE, "ca-bundle.crt" ); } U32 LLDir_Win32::countFilesInDir(const std::string &dirname, const std::string &mask) { - HANDLE count_search_h; - U32 file_count; + HANDLE count_search_h; + U32 file_count; - file_count = 0; + file_count = 0; - WIN32_FIND_DATA FileData; + WIN32_FIND_DATA FileData; - llutf16string pathname = utf8str_to_utf16str(dirname); - pathname += utf8str_to_utf16str(mask); - - if ((count_search_h = FindFirstFile(pathname.c_str(), &FileData)) != INVALID_HANDLE_VALUE) - { - file_count++; + llutf16string pathname = utf8str_to_utf16str(dirname); + pathname += utf8str_to_utf16str(mask); - while (FindNextFile(count_search_h, &FileData)) - { - file_count++; - } - - FindClose(count_search_h); - } + if ((count_search_h = FindFirstFile(pathname.c_str(), &FileData)) != INVALID_HANDLE_VALUE) + { + file_count++; - return (file_count); + while (FindNextFile(count_search_h, &FileData)) + { + file_count++; + } + + FindClose(count_search_h); + } + + return (file_count); } std::string LLDir_Win32::getCurPath() { - WCHAR w_str[MAX_PATH]; - GetCurrentDirectory(MAX_PATH, w_str); + WCHAR w_str[MAX_PATH]; + GetCurrentDirectory(MAX_PATH, w_str); - return utf16str_to_utf8str(llutf16string(w_str)); + return utf16str_to_utf8str(llutf16string(w_str)); } bool LLDir_Win32::fileExists(const std::string &filename) const { - llstat stat_data; - // Check the age of the file - // Now, we see if the files we've gathered are recent... - int res = LLFile::stat(filename, &stat_data); - if (!res) - { - return TRUE; - } - else - { - return FALSE; - } + llstat stat_data; + // Check the age of the file + // Now, we see if the files we've gathered are recent... + int res = LLFile::stat(filename, &stat_data); + if (!res) + { + return TRUE; + } + else + { + return FALSE; + } } /*virtual*/ std::string LLDir_Win32::getLLPluginLauncher() { - return gDirUtilp->getExecutableDir() + gDirUtilp->getDirDelimiter() + - "SLPlugin.exe"; + return gDirUtilp->getExecutableDir() + gDirUtilp->getDirDelimiter() + + "SLPlugin.exe"; } /*virtual*/ std::string LLDir_Win32::getLLPluginFilename(std::string base_name) { - return gDirUtilp->getLLPluginDir() + gDirUtilp->getDirDelimiter() + - base_name + ".dll"; + return gDirUtilp->getLLPluginDir() + gDirUtilp->getDirDelimiter() + + base_name + ".dll"; } @@ -412,8 +412,8 @@ DWORD GetDllVersion(LPCTSTR lpszDllName) HINSTANCE hinstDll; DWORD dwVersion = 0; - hinstDll = LoadLibrary(lpszDllName); /* Flawfinder: ignore */ - + hinstDll = LoadLibrary(lpszDllName); /* Flawfinder: ignore */ + if(hinstDll) { DLLGETVERSIONPROC pDllGetVersion; @@ -421,7 +421,7 @@ DWORD GetDllVersion(LPCTSTR lpszDllName) pDllGetVersion = (DLLGETVERSIONPROC) GetProcAddress(hinstDll, "DllGetVersion"); /*Because some DLLs might not implement this function, you - must test for it explicitly. Depending on the particular + must test for it explicitly. Depending on the particular DLL, the lack of a DllGetVersion function can be a useful indicator of the version. */ @@ -440,7 +440,7 @@ DWORD GetDllVersion(LPCTSTR lpszDllName) dwVersion = PACKVERSION(dvi.dwMajorVersion, dvi.dwMinorVersion); } } - + FreeLibrary(hinstDll); } return dwVersion; diff --git a/indra/llfilesystem/lldir_win32.h b/indra/llfilesystem/lldir_win32.h index 450efaf9da..2830364f15 100644 --- a/indra/llfilesystem/lldir_win32.h +++ b/indra/llfilesystem/lldir_win32.h @@ -1,25 +1,25 @@ -/** +/** * @file lldir_win32.h * @brief Definition of directory utilities class for windows * * $LicenseInfo:firstyear=2000&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2010, Linden Research, Inc. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License only. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * + * * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ @@ -36,22 +36,22 @@ class LLDir_Win32 : public LLDir { public: - LLDir_Win32(); - virtual ~LLDir_Win32(); + LLDir_Win32(); + virtual ~LLDir_Win32(); - /*virtual*/ void initAppDirs(const std::string &app_name, - const std::string& app_read_only_data_dir); + /*virtual*/ void initAppDirs(const std::string &app_name, + const std::string& app_read_only_data_dir); - /*virtual*/ std::string getCurPath(); - /*virtual*/ U32 countFilesInDir(const std::string &dirname, const std::string &mask); - /*virtual*/ bool fileExists(const std::string &filename) const; + /*virtual*/ std::string getCurPath(); + /*virtual*/ U32 countFilesInDir(const std::string &dirname, const std::string &mask); + /*virtual*/ bool fileExists(const std::string &filename) const; - /*virtual*/ std::string getLLPluginLauncher(); - /*virtual*/ std::string getLLPluginFilename(std::string base_name); + /*virtual*/ std::string getLLPluginLauncher(); + /*virtual*/ std::string getLLPluginFilename(std::string base_name); private: - void* mDirSearch_h; - llutf16string mCurrentDir; + void* mDirSearch_h; + llutf16string mCurrentDir; }; #endif // LL_LLDIR_WIN32_H diff --git a/indra/llfilesystem/lldirguard.h b/indra/llfilesystem/lldirguard.h index 37b9e9b83e..fcb179bbc8 100644 --- a/indra/llfilesystem/lldirguard.h +++ b/indra/llfilesystem/lldirguard.h @@ -1,25 +1,25 @@ -/** +/** * @file lldirguard.h * @brief Protect working directory from being changed in scope. * * $LicenseInfo:firstyear=2009&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2010, Linden Research, Inc. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License only. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * + * * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ @@ -34,39 +34,39 @@ class LLDirectoryGuard { public: - LLDirectoryGuard() - { - mOrigDirLen = GetCurrentDirectory(MAX_PATH, mOrigDir); - } + LLDirectoryGuard() + { + mOrigDirLen = GetCurrentDirectory(MAX_PATH, mOrigDir); + } - ~LLDirectoryGuard() - { - mFinalDirLen = GetCurrentDirectory(MAX_PATH, mFinalDir); - if ((mOrigDirLen!=mFinalDirLen) || - (wcsncmp(mOrigDir,mFinalDir,mOrigDirLen)!=0)) - { - // Dir has changed - std::string mOrigDirUtf8 = utf16str_to_utf8str(llutf16string(mOrigDir)); - std::string mFinalDirUtf8 = utf16str_to_utf8str(llutf16string(mFinalDir)); - LL_INFOS() << "Resetting working dir from " << mFinalDirUtf8 << " to " << mOrigDirUtf8 << LL_ENDL; - SetCurrentDirectory(mOrigDir); - } - } + ~LLDirectoryGuard() + { + mFinalDirLen = GetCurrentDirectory(MAX_PATH, mFinalDir); + if ((mOrigDirLen!=mFinalDirLen) || + (wcsncmp(mOrigDir,mFinalDir,mOrigDirLen)!=0)) + { + // Dir has changed + std::string mOrigDirUtf8 = utf16str_to_utf8str(llutf16string(mOrigDir)); + std::string mFinalDirUtf8 = utf16str_to_utf8str(llutf16string(mFinalDir)); + LL_INFOS() << "Resetting working dir from " << mFinalDirUtf8 << " to " << mOrigDirUtf8 << LL_ENDL; + SetCurrentDirectory(mOrigDir); + } + } private: - TCHAR mOrigDir[MAX_PATH]; - DWORD mOrigDirLen; - TCHAR mFinalDir[MAX_PATH]; - DWORD mFinalDirLen; + TCHAR mOrigDir[MAX_PATH]; + DWORD mOrigDirLen; + TCHAR mFinalDir[MAX_PATH]; + DWORD mFinalDirLen; }; #else // No-op outside Windows. class LLDirectoryGuard { public: - LLDirectoryGuard() {} - ~LLDirectoryGuard() {} + LLDirectoryGuard() {} + ~LLDirectoryGuard() {} }; -#endif +#endif #endif diff --git a/indra/llfilesystem/lldiriterator.cpp b/indra/llfilesystem/lldiriterator.cpp index f57bf4ebc6..61f768c512 100644 --- a/indra/llfilesystem/lldiriterator.cpp +++ b/indra/llfilesystem/lldiriterator.cpp @@ -37,74 +37,74 @@ static std::string glob_to_regex(const std::string& glob); class LLDirIterator::Impl { public: - Impl(const std::string &dirname, const std::string &mask); - ~Impl(); + Impl(const std::string &dirname, const std::string &mask); + ~Impl(); - bool next(std::string &fname); + bool next(std::string &fname); private: - boost::regex mFilterExp; - fs::directory_iterator mIter; - bool mIsValid; + boost::regex mFilterExp; + fs::directory_iterator mIter; + bool mIsValid; }; LLDirIterator::Impl::Impl(const std::string &dirname, const std::string &mask) - : mIsValid(false) + : mIsValid(false) { #ifdef LL_WINDOWS // or BOOST_WINDOWS_API - fs::path dir_path(utf8str_to_utf16str(dirname)); + fs::path dir_path(utf8str_to_utf16str(dirname)); #else - fs::path dir_path(dirname); + fs::path dir_path(dirname); #endif - bool is_dir = false; - - // Check if path is a directory. - try - { - is_dir = fs::is_directory(dir_path); - } - catch (const fs::filesystem_error& e) - { - LL_WARNS() << e.what() << LL_ENDL; - return; - } - - if (!is_dir) - { - LL_WARNS() << "Invalid path: \"" << dir_path.string() << "\"" << LL_ENDL; - return; - } - - // Initialize the directory iterator for the given path. - try - { - mIter = fs::directory_iterator(dir_path); - } - catch (const fs::filesystem_error& e) - { - LL_WARNS() << e.what() << LL_ENDL; - return; - } - - // Convert the glob mask to a regular expression - std::string exp = glob_to_regex(mask); - - // Initialize boost::regex with the expression converted from - // the glob mask. - // An exception is thrown if the expression is not valid. - try - { - mFilterExp.assign(exp); - } - catch (boost::regex_error& e) - { - LL_WARNS() << "\"" << exp << "\" is not a valid regular expression: " - << e.what() << LL_ENDL; - return; - } - - mIsValid = true; + bool is_dir = false; + + // Check if path is a directory. + try + { + is_dir = fs::is_directory(dir_path); + } + catch (const fs::filesystem_error& e) + { + LL_WARNS() << e.what() << LL_ENDL; + return; + } + + if (!is_dir) + { + LL_WARNS() << "Invalid path: \"" << dir_path.string() << "\"" << LL_ENDL; + return; + } + + // Initialize the directory iterator for the given path. + try + { + mIter = fs::directory_iterator(dir_path); + } + catch (const fs::filesystem_error& e) + { + LL_WARNS() << e.what() << LL_ENDL; + return; + } + + // Convert the glob mask to a regular expression + std::string exp = glob_to_regex(mask); + + // Initialize boost::regex with the expression converted from + // the glob mask. + // An exception is thrown if the expression is not valid. + try + { + mFilterExp.assign(exp); + } + catch (boost::regex_error& e) + { + LL_WARNS() << "\"" << exp << "\" is not a valid regular expression: " + << e.what() << LL_ENDL; + return; + } + + mIsValid = true; } LLDirIterator::Impl::~Impl() @@ -113,39 +113,39 @@ LLDirIterator::Impl::~Impl() bool LLDirIterator::Impl::next(std::string &fname) { - fname = ""; - - if (!mIsValid) - { - LL_WARNS() << "The iterator is not correctly initialized." << LL_ENDL; - return false; - } - - fs::directory_iterator end_itr; // default construction yields past-the-end - bool found = false; - - // Check if path is a directory. - try - { - while (mIter != end_itr && !found) - { - boost::smatch match; - std::string name = mIter->path().filename().string(); - found = ll_regex_match(name, match, mFilterExp); - if (found) - { - fname = name; - } - - ++mIter; - } - } - catch (const fs::filesystem_error& e) - { - LL_WARNS() << e.what() << LL_ENDL; - } - - return found; + fname = ""; + + if (!mIsValid) + { + LL_WARNS() << "The iterator is not correctly initialized." << LL_ENDL; + return false; + } + + fs::directory_iterator end_itr; // default construction yields past-the-end + bool found = false; + + // Check if path is a directory. + try + { + while (mIter != end_itr && !found) + { + boost::smatch match; + std::string name = mIter->path().filename().string(); + found = ll_regex_match(name, match, mFilterExp); + if (found) + { + fname = name; + } + + ++mIter; + } + } + catch (const fs::filesystem_error& e) + { + LL_WARNS() << e.what() << LL_ENDL; + } + + return found; } /** @@ -153,91 +153,91 @@ Converts the incoming glob into a regex. This involves converting incoming glob expressions to regex equivilents and at the same time, escaping any regex meaningful characters which do not have glob meaning, i.e. - .()+|^$ + .()+|^$ in the input. */ std::string glob_to_regex(const std::string& glob) { - std::string regex; - regex.reserve(glob.size()<<1); - S32 braces = 0; - bool escaped = false; - bool square_brace_open = false; - - for (std::string::const_iterator i = glob.begin(); i != glob.end(); ++i) - { - char c = *i; - - switch (c) - { - case '*': - if (glob.begin() == i) - { - regex+="[^.].*"; - } - else - { - regex+= escaped ? "*" : ".*"; - } - break; - case '?': - regex+= escaped ? '?' : '.'; - break; - case '{': - braces++; - regex+='('; - break; - case '}': - if (!braces) - { - LL_ERRS() << "glob_to_regex: Closing brace without an equivalent opening brace: " << glob << LL_ENDL; - } - - regex+=')'; - braces--; - break; - case ',': - regex+= braces ? '|' : c; - break; - case '!': - regex+= square_brace_open ? '^' : c; - break; - case '.': // This collection have different regex meaning - case '^': // and so need escaping. - case '(': - case ')': - case '+': - case '|': - case '$': - regex += '\\'; - default: - regex += c; - break; - } - - escaped = ('\\' == c); - square_brace_open = ('[' == c); - } - - if (braces) - { - LL_ERRS() << "glob_to_regex: Unterminated brace expression: " << glob << LL_ENDL; - } - - return regex; + std::string regex; + regex.reserve(glob.size()<<1); + S32 braces = 0; + bool escaped = false; + bool square_brace_open = false; + + for (std::string::const_iterator i = glob.begin(); i != glob.end(); ++i) + { + char c = *i; + + switch (c) + { + case '*': + if (glob.begin() == i) + { + regex+="[^.].*"; + } + else + { + regex+= escaped ? "*" : ".*"; + } + break; + case '?': + regex+= escaped ? '?' : '.'; + break; + case '{': + braces++; + regex+='('; + break; + case '}': + if (!braces) + { + LL_ERRS() << "glob_to_regex: Closing brace without an equivalent opening brace: " << glob << LL_ENDL; + } + + regex+=')'; + braces--; + break; + case ',': + regex+= braces ? '|' : c; + break; + case '!': + regex+= square_brace_open ? '^' : c; + break; + case '.': // This collection have different regex meaning + case '^': // and so need escaping. + case '(': + case ')': + case '+': + case '|': + case '$': + regex += '\\'; + default: + regex += c; + break; + } + + escaped = ('\\' == c); + square_brace_open = ('[' == c); + } + + if (braces) + { + LL_ERRS() << "glob_to_regex: Unterminated brace expression: " << glob << LL_ENDL; + } + + return regex; } LLDirIterator::LLDirIterator(const std::string &dirname, const std::string &mask) { - mImpl = new Impl(dirname, mask); + mImpl = new Impl(dirname, mask); } LLDirIterator::~LLDirIterator() { - delete mImpl; + delete mImpl; } bool LLDirIterator::next(std::string &fname) { - return mImpl->next(fname); + return mImpl->next(fname); } diff --git a/indra/llfilesystem/lldiriterator.h b/indra/llfilesystem/lldiriterator.h index 0b48be41b3..31d8349b7f 100644 --- a/indra/llfilesystem/lldiriterator.h +++ b/indra/llfilesystem/lldiriterator.h @@ -37,51 +37,51 @@ class LLDirIterator { public: - /** - * Constructs LLDirIterator object to search for glob pattern - * matches in a directory. - * - * @param dirname - name of a directory to search in. - * @param mask - search pattern, a glob expression - * - * Wildcards supported in glob expressions: - * -------------------------------------------------------------- - * | Wildcard | Matches | - * -------------------------------------------------------------- - * | * |zero or more characters | - * | ? |exactly one character | - * | [abcde] |exactly one character listed | - * | [a-e] |exactly one character in the given range | - * | [!abcde] |any character that is not listed | - * | [!a-e] |any character that is not in the given range | - * | {abc,xyz} |exactly one entire word in the options given | - * -------------------------------------------------------------- - */ - LLDirIterator(const std::string &dirname, const std::string &mask); + /** + * Constructs LLDirIterator object to search for glob pattern + * matches in a directory. + * + * @param dirname - name of a directory to search in. + * @param mask - search pattern, a glob expression + * + * Wildcards supported in glob expressions: + * -------------------------------------------------------------- + * | Wildcard | Matches | + * -------------------------------------------------------------- + * | * |zero or more characters | + * | ? |exactly one character | + * | [abcde] |exactly one character listed | + * | [a-e] |exactly one character in the given range | + * | [!abcde] |any character that is not listed | + * | [!a-e] |any character that is not in the given range | + * | {abc,xyz} |exactly one entire word in the options given | + * -------------------------------------------------------------- + */ + LLDirIterator(const std::string &dirname, const std::string &mask); - ~LLDirIterator(); + ~LLDirIterator(); - /** - * Searches for the next directory entry matching the glob mask - * specified upon iterator construction. - * Returns true if a match is found, sets fname - * parameter to the name of the matched directory entry and - * increments the iterator position. - * - * Typical usage: - * <code> - * LLDirIterator iter(directory, pattern); - * if ( iter.next(scanResult) ) - * </code> - * - * @param fname - name of the matched directory entry. - * @return true if a match is found, false otherwise. - */ - bool next(std::string &fname); + /** + * Searches for the next directory entry matching the glob mask + * specified upon iterator construction. + * Returns true if a match is found, sets fname + * parameter to the name of the matched directory entry and + * increments the iterator position. + * + * Typical usage: + * <code> + * LLDirIterator iter(directory, pattern); + * if ( iter.next(scanResult) ) + * </code> + * + * @param fname - name of the matched directory entry. + * @return true if a match is found, false otherwise. + */ + bool next(std::string &fname); protected: - class Impl; - Impl* mImpl; + class Impl; + Impl* mImpl; }; #endif //LL_LLDIRITERATOR_H diff --git a/indra/llfilesystem/lllfsthread.cpp b/indra/llfilesystem/lllfsthread.cpp index dbb69cd605..7d135b4472 100644 --- a/indra/llfilesystem/lllfsthread.cpp +++ b/indra/llfilesystem/lllfsthread.cpp @@ -1,25 +1,25 @@ -/** +/** * @file lllfsthread.cpp * @brief LLLFSThread base class * * $LicenseInfo:firstyear=2001&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2010, Linden Research, Inc. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License only. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * + * * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ @@ -38,112 +38,112 @@ //static void LLLFSThread::initClass(bool local_is_threaded) { - llassert(sLocal == NULL); - sLocal = new LLLFSThread(local_is_threaded); + llassert(sLocal == NULL); + sLocal = new LLLFSThread(local_is_threaded); } //static S32 LLLFSThread::updateClass(U32 ms_elapsed) { - return sLocal->update((F32)ms_elapsed); + return sLocal->update((F32)ms_elapsed); } //static void LLLFSThread::cleanupClass() { - llassert(sLocal != NULL); - sLocal->setQuitting(); - while (sLocal->getPending()) - { - sLocal->update(0); - } + llassert(sLocal != NULL); + sLocal->setQuitting(); + while (sLocal->getPending()) + { + sLocal->update(0); + } sLocal->shutdown(); - delete sLocal; - sLocal = NULL; + delete sLocal; + sLocal = NULL; } //---------------------------------------------------------------------------- LLLFSThread::LLLFSThread(bool threaded) : - LLQueuedThread("LFS", threaded) + LLQueuedThread("LFS", threaded) { - if(!mLocalAPRFilePoolp) - { - mLocalAPRFilePoolp = new LLVolatileAPRPool() ; - } + if(!mLocalAPRFilePoolp) + { + mLocalAPRFilePoolp = new LLVolatileAPRPool() ; + } } LLLFSThread::~LLLFSThread() { - // mLocalAPRFilePoolp cleanup in LLThread - // ~LLQueuedThread() will be called here + // mLocalAPRFilePoolp cleanup in LLThread + // ~LLQueuedThread() will be called here } //---------------------------------------------------------------------------- -LLLFSThread::handle_t LLLFSThread::read(const std::string& filename, /* Flawfinder: ignore */ - U8* buffer, S32 offset, S32 numbytes, - Responder* responder) +LLLFSThread::handle_t LLLFSThread::read(const std::string& filename, /* Flawfinder: ignore */ + U8* buffer, S32 offset, S32 numbytes, + Responder* responder) { LL_PROFILE_ZONE_SCOPED; - handle_t handle = generateHandle(); + handle_t handle = generateHandle(); - Request* req = new Request(this, handle, - FILE_READ, filename, - buffer, offset, numbytes, - responder); + Request* req = new Request(this, handle, + FILE_READ, filename, + buffer, offset, numbytes, + responder); - bool res = addRequest(req); - if (!res) - { - LL_ERRS() << "LLLFSThread::read called after LLLFSThread::cleanupClass()" << LL_ENDL; - } + bool res = addRequest(req); + if (!res) + { + LL_ERRS() << "LLLFSThread::read called after LLLFSThread::cleanupClass()" << LL_ENDL; + } - return handle; + return handle; } LLLFSThread::handle_t LLLFSThread::write(const std::string& filename, - U8* buffer, S32 offset, S32 numbytes, - Responder* responder) + U8* buffer, S32 offset, S32 numbytes, + Responder* responder) { LL_PROFILE_ZONE_SCOPED; - handle_t handle = generateHandle(); - - Request* req = new Request(this, handle, - FILE_WRITE, filename, - buffer, offset, numbytes, - responder); - - bool res = addRequest(req); - if (!res) - { - LL_ERRS() << "LLLFSThread::read called after LLLFSThread::cleanupClass()" << LL_ENDL; - } - - return handle; + handle_t handle = generateHandle(); + + Request* req = new Request(this, handle, + FILE_WRITE, filename, + buffer, offset, numbytes, + responder); + + bool res = addRequest(req); + if (!res) + { + LL_ERRS() << "LLLFSThread::read called after LLLFSThread::cleanupClass()" << LL_ENDL; + } + + return handle; } //============================================================================ LLLFSThread::Request::Request(LLLFSThread* thread, - handle_t handle, - operation_t op, const std::string& filename, - U8* buffer, S32 offset, S32 numbytes, - Responder* responder) : - QueuedRequest(handle, FLAG_AUTO_COMPLETE), - mThread(thread), - mOperation(op), - mFileName(filename), - mBuffer(buffer), - mOffset(offset), - mBytes(numbytes), - mBytesRead(0), - mResponder(responder) + handle_t handle, + operation_t op, const std::string& filename, + U8* buffer, S32 offset, S32 numbytes, + Responder* responder) : + QueuedRequest(handle, FLAG_AUTO_COMPLETE), + mThread(thread), + mOperation(op), + mFileName(filename), + mBuffer(buffer), + mOffset(offset), + mBytes(numbytes), + mBytesRead(0), + mResponder(responder) { - if (numbytes <= 0) - { - LL_WARNS() << "LLLFSThread: Request with numbytes = " << numbytes << LL_ENDL; - } + if (numbytes <= 0) + { + LL_WARNS() << "LLLFSThread: Request with numbytes = " << numbytes << LL_ENDL; + } } LLLFSThread::Request::~Request() @@ -154,85 +154,85 @@ LLLFSThread::Request::~Request() void LLLFSThread::Request::finishRequest(bool completed) { LL_PROFILE_ZONE_SCOPED; - if (mResponder.notNull()) - { - mResponder->completed(completed ? mBytesRead : 0); - mResponder = NULL; - } + if (mResponder.notNull()) + { + mResponder->completed(completed ? mBytesRead : 0); + mResponder = NULL; + } } void LLLFSThread::Request::deleteRequest() { LL_PROFILE_ZONE_SCOPED; - if (getStatus() == STATUS_QUEUED) - { - LL_ERRS() << "Attempt to delete a queued LLLFSThread::Request!" << LL_ENDL; - } - if (mResponder.notNull()) - { - mResponder->completed(0); - mResponder = NULL; - } - LLQueuedThread::QueuedRequest::deleteRequest(); + if (getStatus() == STATUS_QUEUED) + { + LL_ERRS() << "Attempt to delete a queued LLLFSThread::Request!" << LL_ENDL; + } + if (mResponder.notNull()) + { + mResponder->completed(0); + mResponder = NULL; + } + LLQueuedThread::QueuedRequest::deleteRequest(); } bool LLLFSThread::Request::processRequest() { LL_PROFILE_ZONE_SCOPED; - bool complete = false; - if (mOperation == FILE_READ) - { - llassert(mOffset >= 0); - LLAPRFile infile ; // auto-closes - infile.open(mFileName, LL_APR_RB, mThread->getLocalAPRFilePool()); - if (!infile.getFileHandle()) - { - LL_WARNS() << "LLLFS: Unable to read file: " << mFileName << LL_ENDL; - mBytesRead = 0; // fail - return true; - } - S32 off; - if (mOffset < 0) - off = infile.seek(APR_END, 0); - else - off = infile.seek(APR_SET, mOffset); - llassert_always(off >= 0); - mBytesRead = infile.read(mBuffer, mBytes ); - complete = true; -// LL_INFOS() << "LLLFSThread::READ:" << mFileName << " Bytes: " << mBytesRead << LL_ENDL; - } - else if (mOperation == FILE_WRITE) - { - apr_int32_t flags = APR_CREATE|APR_WRITE|APR_BINARY; - if (mOffset < 0) - flags |= APR_APPEND; - LLAPRFile outfile ; // auto-closes - outfile.open(mFileName, flags, mThread->getLocalAPRFilePool()); - if (!outfile.getFileHandle()) - { - LL_WARNS() << "LLLFS: Unable to write file: " << mFileName << LL_ENDL; - mBytesRead = 0; // fail - return true; - } - if (mOffset >= 0) - { - S32 seek = outfile.seek(APR_SET, mOffset); - if (seek < 0) - { - LL_WARNS() << "LLLFS: Unable to write file (seek failed): " << mFileName << LL_ENDL; - mBytesRead = 0; // fail - return true; - } - } - mBytesRead = outfile.write(mBuffer, mBytes ); - complete = true; -// LL_INFOS() << "LLLFSThread::WRITE:" << mFileName << " Bytes: " << mBytesRead << "/" << mBytes << " Offset:" << mOffset << LL_ENDL; - } - else - { - LL_ERRS() << "LLLFSThread::unknown operation: " << (S32)mOperation << LL_ENDL; - } - return complete; + bool complete = false; + if (mOperation == FILE_READ) + { + llassert(mOffset >= 0); + LLAPRFile infile ; // auto-closes + infile.open(mFileName, LL_APR_RB, mThread->getLocalAPRFilePool()); + if (!infile.getFileHandle()) + { + LL_WARNS() << "LLLFS: Unable to read file: " << mFileName << LL_ENDL; + mBytesRead = 0; // fail + return true; + } + S32 off; + if (mOffset < 0) + off = infile.seek(APR_END, 0); + else + off = infile.seek(APR_SET, mOffset); + llassert_always(off >= 0); + mBytesRead = infile.read(mBuffer, mBytes ); + complete = true; +// LL_INFOS() << "LLLFSThread::READ:" << mFileName << " Bytes: " << mBytesRead << LL_ENDL; + } + else if (mOperation == FILE_WRITE) + { + apr_int32_t flags = APR_CREATE|APR_WRITE|APR_BINARY; + if (mOffset < 0) + flags |= APR_APPEND; + LLAPRFile outfile ; // auto-closes + outfile.open(mFileName, flags, mThread->getLocalAPRFilePool()); + if (!outfile.getFileHandle()) + { + LL_WARNS() << "LLLFS: Unable to write file: " << mFileName << LL_ENDL; + mBytesRead = 0; // fail + return true; + } + if (mOffset >= 0) + { + S32 seek = outfile.seek(APR_SET, mOffset); + if (seek < 0) + { + LL_WARNS() << "LLLFS: Unable to write file (seek failed): " << mFileName << LL_ENDL; + mBytesRead = 0; // fail + return true; + } + } + mBytesRead = outfile.write(mBuffer, mBytes ); + complete = true; +// LL_INFOS() << "LLLFSThread::WRITE:" << mFileName << " Bytes: " << mBytesRead << "/" << mBytes << " Offset:" << mOffset << LL_ENDL; + } + else + { + LL_ERRS() << "LLLFSThread::unknown operation: " << (S32)mOperation << LL_ENDL; + } + return complete; } //============================================================================ diff --git a/indra/llfilesystem/lllfsthread.h b/indra/llfilesystem/lllfsthread.h index f2693a1172..3230c0c2ae 100644 --- a/indra/llfilesystem/lllfsthread.h +++ b/indra/llfilesystem/lllfsthread.h @@ -1,25 +1,25 @@ -/** +/** * @file lllfsthread.h * @brief LLLFSThread base class * * $LicenseInfo:firstyear=2000&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2010, Linden Research, Inc. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License only. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * + * * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ @@ -41,97 +41,97 @@ class LLLFSThread : public LLQueuedThread { - //------------------------------------------------------------------------ + //------------------------------------------------------------------------ public: - enum operation_t { - FILE_READ, - FILE_WRITE, - FILE_RENAME, - FILE_REMOVE - }; - - //------------------------------------------------------------------------ + enum operation_t { + FILE_READ, + FILE_WRITE, + FILE_RENAME, + FILE_REMOVE + }; + + //------------------------------------------------------------------------ public: - class Responder : public LLThreadSafeRefCount - { - protected: - ~Responder(); - public: - virtual void completed(S32 bytes) = 0; - }; - - class Request : public QueuedRequest - { - protected: - virtual ~Request(); // use deleteRequest() - - public: - Request(LLLFSThread* thread, - handle_t handle, - operation_t op, const std::string& filename, - U8* buffer, S32 offset, S32 numbytes, - Responder* responder); - - S32 getBytes() - { - return mBytes; - } - S32 getBytesRead() - { - return mBytesRead; - } - S32 getOperation() - { - return mOperation; - } - U8* getBuffer() - { - return mBuffer; - } - const std::string& getFilename() - { - return mFileName; - } - - /*virtual*/ bool processRequest(); - /*virtual*/ void finishRequest(bool completed); - /*virtual*/ void deleteRequest(); - - private: - LLLFSThread* mThread; - operation_t mOperation; - - std::string mFileName; - - U8* mBuffer; // dest for reads, source for writes, new UUID for rename - S32 mOffset; // offset into file, -1 = append (WRITE only) - S32 mBytes; // bytes to read from file, -1 = all - S32 mBytesRead; // bytes read from file - - LLPointer<Responder> mResponder; - }; - - //------------------------------------------------------------------------ + class Responder : public LLThreadSafeRefCount + { + protected: + ~Responder(); + public: + virtual void completed(S32 bytes) = 0; + }; + + class Request : public QueuedRequest + { + protected: + virtual ~Request(); // use deleteRequest() + + public: + Request(LLLFSThread* thread, + handle_t handle, + operation_t op, const std::string& filename, + U8* buffer, S32 offset, S32 numbytes, + Responder* responder); + + S32 getBytes() + { + return mBytes; + } + S32 getBytesRead() + { + return mBytesRead; + } + S32 getOperation() + { + return mOperation; + } + U8* getBuffer() + { + return mBuffer; + } + const std::string& getFilename() + { + return mFileName; + } + + /*virtual*/ bool processRequest(); + /*virtual*/ void finishRequest(bool completed); + /*virtual*/ void deleteRequest(); + + private: + LLLFSThread* mThread; + operation_t mOperation; + + std::string mFileName; + + U8* mBuffer; // dest for reads, source for writes, new UUID for rename + S32 mOffset; // offset into file, -1 = append (WRITE only) + S32 mBytes; // bytes to read from file, -1 = all + S32 mBytesRead; // bytes read from file + + LLPointer<Responder> mResponder; + }; + + //------------------------------------------------------------------------ public: - LLLFSThread(bool threaded = TRUE); - ~LLLFSThread(); - - // Return a Request handle - handle_t read(const std::string& filename, /* Flawfinder: ignore */ - U8* buffer, S32 offset, S32 numbytes, - Responder* responder); - handle_t write(const std::string& filename, - U8* buffer, S32 offset, S32 numbytes, - Responder* responder); - - // static initializers - static void initClass(bool local_is_threaded = TRUE); // Setup sLocal - static S32 updateClass(U32 ms_elapsed); - static void cleanupClass(); // Delete sLocal - + LLLFSThread(bool threaded = TRUE); + ~LLLFSThread(); + + // Return a Request handle + handle_t read(const std::string& filename, /* Flawfinder: ignore */ + U8* buffer, S32 offset, S32 numbytes, + Responder* responder); + handle_t write(const std::string& filename, + U8* buffer, S32 offset, S32 numbytes, + Responder* responder); + + // static initializers + static void initClass(bool local_is_threaded = TRUE); // Setup sLocal + static S32 updateClass(U32 ms_elapsed); + static void cleanupClass(); // Delete sLocal + public: - static LLLFSThread* sLocal; // Default local file thread + static LLLFSThread* sLocal; // Default local file thread }; //============================================================================ diff --git a/indra/llfilesystem/tests/lldir_test.cpp b/indra/llfilesystem/tests/lldir_test.cpp index 60265cade6..6e191ad096 100644 --- a/indra/llfilesystem/tests/lldir_test.cpp +++ b/indra/llfilesystem/tests/lldir_test.cpp @@ -6,21 +6,21 @@ * $LicenseInfo:firstyear=2008&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2010, Linden Research, Inc. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License only. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * + * * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ @@ -190,228 +190,228 @@ struct LLDir_Dummy: public LLDir namespace tut { - struct LLDirTest + struct LLDirTest { }; typedef test_group<LLDirTest> LLDirTest_t; typedef LLDirTest_t::object LLDirTest_object_t; tut::LLDirTest_t tut_LLDirTest("LLDir"); - template<> template<> - void LLDirTest_object_t::test<1>() - // getDirDelimiter - { - ensure("getDirDelimiter", !gDirUtilp->getDirDelimiter().empty()); - } - - template<> template<> - void LLDirTest_object_t::test<2>() - // getBaseFileName - { - std::string delim = gDirUtilp->getDirDelimiter(); - std::string rawFile = "foo"; - std::string rawFileExt = "foo.bAr"; - std::string rawFileNullExt = "foo."; - std::string rawExt = ".bAr"; - std::string rawDot = "."; - std::string pathNoExt = "aa" + delim + "bb" + delim + "cc" + delim + "dd" + delim + "ee"; - std::string pathExt = pathNoExt + ".eXt"; - std::string dottedPathNoExt = "aa" + delim + "bb" + delim + "cc.dd" + delim + "ee"; - std::string dottedPathExt = dottedPathNoExt + ".eXt"; - - // foo[.bAr] - - ensure_equals("getBaseFileName/r-no-ext/no-strip-exten", - gDirUtilp->getBaseFileName(rawFile, false), - "foo"); - - ensure_equals("getBaseFileName/r-no-ext/strip-exten", - gDirUtilp->getBaseFileName(rawFile, true), - "foo"); - - ensure_equals("getBaseFileName/r-ext/no-strip-exten", - gDirUtilp->getBaseFileName(rawFileExt, false), - "foo.bAr"); - - ensure_equals("getBaseFileName/r-ext/strip-exten", - gDirUtilp->getBaseFileName(rawFileExt, true), - "foo"); - - // foo. + template<> template<> + void LLDirTest_object_t::test<1>() + // getDirDelimiter + { + ensure("getDirDelimiter", !gDirUtilp->getDirDelimiter().empty()); + } + + template<> template<> + void LLDirTest_object_t::test<2>() + // getBaseFileName + { + std::string delim = gDirUtilp->getDirDelimiter(); + std::string rawFile = "foo"; + std::string rawFileExt = "foo.bAr"; + std::string rawFileNullExt = "foo."; + std::string rawExt = ".bAr"; + std::string rawDot = "."; + std::string pathNoExt = "aa" + delim + "bb" + delim + "cc" + delim + "dd" + delim + "ee"; + std::string pathExt = pathNoExt + ".eXt"; + std::string dottedPathNoExt = "aa" + delim + "bb" + delim + "cc.dd" + delim + "ee"; + std::string dottedPathExt = dottedPathNoExt + ".eXt"; + + // foo[.bAr] + + ensure_equals("getBaseFileName/r-no-ext/no-strip-exten", + gDirUtilp->getBaseFileName(rawFile, false), + "foo"); + + ensure_equals("getBaseFileName/r-no-ext/strip-exten", + gDirUtilp->getBaseFileName(rawFile, true), + "foo"); + + ensure_equals("getBaseFileName/r-ext/no-strip-exten", + gDirUtilp->getBaseFileName(rawFileExt, false), + "foo.bAr"); + + ensure_equals("getBaseFileName/r-ext/strip-exten", + gDirUtilp->getBaseFileName(rawFileExt, true), + "foo"); + + // foo. + + ensure_equals("getBaseFileName/rn-no-ext/no-strip-exten", + gDirUtilp->getBaseFileName(rawFileNullExt, false), + "foo."); + + ensure_equals("getBaseFileName/rn-no-ext/strip-exten", + gDirUtilp->getBaseFileName(rawFileNullExt, true), + "foo"); + + // .bAr + // interesting case - with no basename, this IS the basename, not the extension. + + ensure_equals("getBaseFileName/e-ext/no-strip-exten", + gDirUtilp->getBaseFileName(rawExt, false), + ".bAr"); + + ensure_equals("getBaseFileName/e-ext/strip-exten", + gDirUtilp->getBaseFileName(rawExt, true), + ".bAr"); + + // . + + ensure_equals("getBaseFileName/d/no-strip-exten", + gDirUtilp->getBaseFileName(rawDot, false), + "."); - ensure_equals("getBaseFileName/rn-no-ext/no-strip-exten", - gDirUtilp->getBaseFileName(rawFileNullExt, false), - "foo."); + ensure_equals("getBaseFileName/d/strip-exten", + gDirUtilp->getBaseFileName(rawDot, true), + "."); - ensure_equals("getBaseFileName/rn-no-ext/strip-exten", - gDirUtilp->getBaseFileName(rawFileNullExt, true), - "foo"); - - // .bAr - // interesting case - with no basename, this IS the basename, not the extension. - - ensure_equals("getBaseFileName/e-ext/no-strip-exten", - gDirUtilp->getBaseFileName(rawExt, false), - ".bAr"); - - ensure_equals("getBaseFileName/e-ext/strip-exten", - gDirUtilp->getBaseFileName(rawExt, true), - ".bAr"); - - // . - - ensure_equals("getBaseFileName/d/no-strip-exten", - gDirUtilp->getBaseFileName(rawDot, false), - "."); - - ensure_equals("getBaseFileName/d/strip-exten", - gDirUtilp->getBaseFileName(rawDot, true), - "."); - - // aa/bb/cc/dd/ee[.eXt] - - ensure_equals("getBaseFileName/no-ext/no-strip-exten", - gDirUtilp->getBaseFileName(pathNoExt, false), - "ee"); - - ensure_equals("getBaseFileName/no-ext/strip-exten", - gDirUtilp->getBaseFileName(pathNoExt, true), - "ee"); - - ensure_equals("getBaseFileName/ext/no-strip-exten", - gDirUtilp->getBaseFileName(pathExt, false), - "ee.eXt"); - - ensure_equals("getBaseFileName/ext/strip-exten", - gDirUtilp->getBaseFileName(pathExt, true), - "ee"); - - // aa/bb/cc.dd/ee[.eXt] - - ensure_equals("getBaseFileName/d-no-ext/no-strip-exten", - gDirUtilp->getBaseFileName(dottedPathNoExt, false), - "ee"); - - ensure_equals("getBaseFileName/d-no-ext/strip-exten", - gDirUtilp->getBaseFileName(dottedPathNoExt, true), - "ee"); - - ensure_equals("getBaseFileName/d-ext/no-strip-exten", - gDirUtilp->getBaseFileName(dottedPathExt, false), - "ee.eXt"); - - ensure_equals("getBaseFileName/d-ext/strip-exten", - gDirUtilp->getBaseFileName(dottedPathExt, true), - "ee"); - } - - template<> template<> - void LLDirTest_object_t::test<3>() - // getDirName - { - std::string delim = gDirUtilp->getDirDelimiter(); - std::string rawFile = "foo"; - std::string rawFileExt = "foo.bAr"; - std::string pathNoExt = "aa" + delim + "bb" + delim + "cc" + delim + "dd" + delim + "ee"; - std::string pathExt = pathNoExt + ".eXt"; - std::string dottedPathNoExt = "aa" + delim + "bb" + delim + "cc.dd" + delim + "ee"; - std::string dottedPathExt = dottedPathNoExt + ".eXt"; + // aa/bb/cc/dd/ee[.eXt] - // foo[.bAr] + ensure_equals("getBaseFileName/no-ext/no-strip-exten", + gDirUtilp->getBaseFileName(pathNoExt, false), + "ee"); - ensure_equals("getDirName/r-no-ext", - gDirUtilp->getDirName(rawFile), - ""); + ensure_equals("getBaseFileName/no-ext/strip-exten", + gDirUtilp->getBaseFileName(pathNoExt, true), + "ee"); - ensure_equals("getDirName/r-ext", - gDirUtilp->getDirName(rawFileExt), - ""); + ensure_equals("getBaseFileName/ext/no-strip-exten", + gDirUtilp->getBaseFileName(pathExt, false), + "ee.eXt"); - // aa/bb/cc/dd/ee[.eXt] + ensure_equals("getBaseFileName/ext/strip-exten", + gDirUtilp->getBaseFileName(pathExt, true), + "ee"); - ensure_equals("getDirName/no-ext", - gDirUtilp->getDirName(pathNoExt), - "aa" + delim + "bb" + delim + "cc" + delim + "dd"); + // aa/bb/cc.dd/ee[.eXt] - ensure_equals("getDirName/ext", - gDirUtilp->getDirName(pathExt), - "aa" + delim + "bb" + delim + "cc" + delim + "dd"); + ensure_equals("getBaseFileName/d-no-ext/no-strip-exten", + gDirUtilp->getBaseFileName(dottedPathNoExt, false), + "ee"); - // aa/bb/cc.dd/ee[.eXt] + ensure_equals("getBaseFileName/d-no-ext/strip-exten", + gDirUtilp->getBaseFileName(dottedPathNoExt, true), + "ee"); - ensure_equals("getDirName/d-no-ext", - gDirUtilp->getDirName(dottedPathNoExt), - "aa" + delim + "bb" + delim + "cc.dd"); + ensure_equals("getBaseFileName/d-ext/no-strip-exten", + gDirUtilp->getBaseFileName(dottedPathExt, false), + "ee.eXt"); - ensure_equals("getDirName/d-ext", - gDirUtilp->getDirName(dottedPathExt), - "aa" + delim + "bb" + delim + "cc.dd"); - } + ensure_equals("getBaseFileName/d-ext/strip-exten", + gDirUtilp->getBaseFileName(dottedPathExt, true), + "ee"); + } + + template<> template<> + void LLDirTest_object_t::test<3>() + // getDirName + { + std::string delim = gDirUtilp->getDirDelimiter(); + std::string rawFile = "foo"; + std::string rawFileExt = "foo.bAr"; + std::string pathNoExt = "aa" + delim + "bb" + delim + "cc" + delim + "dd" + delim + "ee"; + std::string pathExt = pathNoExt + ".eXt"; + std::string dottedPathNoExt = "aa" + delim + "bb" + delim + "cc.dd" + delim + "ee"; + std::string dottedPathExt = dottedPathNoExt + ".eXt"; + + // foo[.bAr] + + ensure_equals("getDirName/r-no-ext", + gDirUtilp->getDirName(rawFile), + ""); - template<> template<> - void LLDirTest_object_t::test<4>() - // getExtension - { - std::string delim = gDirUtilp->getDirDelimiter(); - std::string rawFile = "foo"; - std::string rawFileExt = "foo.bAr"; - std::string rawFileNullExt = "foo."; - std::string rawExt = ".bAr"; - std::string rawDot = "."; - std::string pathNoExt = "aa" + delim + "bb" + delim + "cc" + delim + "dd" + delim + "ee"; - std::string pathExt = pathNoExt + ".eXt"; - std::string dottedPathNoExt = "aa" + delim + "bb" + delim + "cc.dd" + delim + "ee"; - std::string dottedPathExt = dottedPathNoExt + ".eXt"; + ensure_equals("getDirName/r-ext", + gDirUtilp->getDirName(rawFileExt), + ""); - // foo[.bAr] + // aa/bb/cc/dd/ee[.eXt] - ensure_equals("getExtension/r-no-ext", - gDirUtilp->getExtension(rawFile), - ""); + ensure_equals("getDirName/no-ext", + gDirUtilp->getDirName(pathNoExt), + "aa" + delim + "bb" + delim + "cc" + delim + "dd"); - ensure_equals("getExtension/r-ext", - gDirUtilp->getExtension(rawFileExt), - "bar"); + ensure_equals("getDirName/ext", + gDirUtilp->getDirName(pathExt), + "aa" + delim + "bb" + delim + "cc" + delim + "dd"); - // foo. + // aa/bb/cc.dd/ee[.eXt] + + ensure_equals("getDirName/d-no-ext", + gDirUtilp->getDirName(dottedPathNoExt), + "aa" + delim + "bb" + delim + "cc.dd"); + + ensure_equals("getDirName/d-ext", + gDirUtilp->getDirName(dottedPathExt), + "aa" + delim + "bb" + delim + "cc.dd"); + } + + template<> template<> + void LLDirTest_object_t::test<4>() + // getExtension + { + std::string delim = gDirUtilp->getDirDelimiter(); + std::string rawFile = "foo"; + std::string rawFileExt = "foo.bAr"; + std::string rawFileNullExt = "foo."; + std::string rawExt = ".bAr"; + std::string rawDot = "."; + std::string pathNoExt = "aa" + delim + "bb" + delim + "cc" + delim + "dd" + delim + "ee"; + std::string pathExt = pathNoExt + ".eXt"; + std::string dottedPathNoExt = "aa" + delim + "bb" + delim + "cc.dd" + delim + "ee"; + std::string dottedPathExt = dottedPathNoExt + ".eXt"; - ensure_equals("getExtension/rn-no-ext", - gDirUtilp->getExtension(rawFileNullExt), - ""); + // foo[.bAr] - // .bAr - // interesting case - with no basename, this IS the basename, not the extension. + ensure_equals("getExtension/r-no-ext", + gDirUtilp->getExtension(rawFile), + ""); - ensure_equals("getExtension/e-ext", - gDirUtilp->getExtension(rawExt), - ""); + ensure_equals("getExtension/r-ext", + gDirUtilp->getExtension(rawFileExt), + "bar"); - // . + // foo. - ensure_equals("getExtension/d", - gDirUtilp->getExtension(rawDot), - ""); + ensure_equals("getExtension/rn-no-ext", + gDirUtilp->getExtension(rawFileNullExt), + ""); - // aa/bb/cc/dd/ee[.eXt] - - ensure_equals("getExtension/no-ext", - gDirUtilp->getExtension(pathNoExt), - ""); - - ensure_equals("getExtension/ext", - gDirUtilp->getExtension(pathExt), - "ext"); - - // aa/bb/cc.dd/ee[.eXt] + // .bAr + // interesting case - with no basename, this IS the basename, not the extension. - ensure_equals("getExtension/d-no-ext", - gDirUtilp->getExtension(dottedPathNoExt), - ""); + ensure_equals("getExtension/e-ext", + gDirUtilp->getExtension(rawExt), + ""); - ensure_equals("getExtension/d-ext", - gDirUtilp->getExtension(dottedPathExt), - "ext"); - } + // . + + ensure_equals("getExtension/d", + gDirUtilp->getExtension(rawDot), + ""); + + // aa/bb/cc/dd/ee[.eXt] + + ensure_equals("getExtension/no-ext", + gDirUtilp->getExtension(pathNoExt), + ""); + + ensure_equals("getExtension/ext", + gDirUtilp->getExtension(pathExt), + "ext"); + + // aa/bb/cc.dd/ee[.eXt] + + ensure_equals("getExtension/d-no-ext", + gDirUtilp->getExtension(dottedPathNoExt), + ""); + + ensure_equals("getExtension/d-ext", + gDirUtilp->getExtension(dottedPathExt), + "ext"); + } std::string makeTestFile( const std::string& dir, const std::string& file ) { @@ -431,7 +431,7 @@ namespace tut std::string uniqueDir; bool foundUnused; std::string delim = gDirUtilp->getDirDelimiter(); - + for (counter=0, foundUnused=false; !foundUnused; counter++ ) { char counterStr[3]; @@ -440,7 +440,7 @@ namespace tut foundUnused = ! ( LLFile::isdir(uniqueDir) || LLFile::isfile(uniqueDir) ); } ensure("test directory '" + uniqueDir + "' creation failed", !LLFile::mkdir(uniqueDir)); - + return uniqueDir + delim; // HACK - apparently, the trailing delimiter is needed... } @@ -487,7 +487,7 @@ namespace tut } } } - + template<> template<> void LLDirTest_object_t::test<5>() // LLDirIterator::next diff --git a/indra/llfilesystem/tests/lldiriterator_test.cpp b/indra/llfilesystem/tests/lldiriterator_test.cpp index a65e3dada5..dc573b5555 100644 --- a/indra/llfilesystem/tests/lldiriterator_test.cpp +++ b/indra/llfilesystem/tests/lldiriterator_test.cpp @@ -6,21 +6,21 @@ * $LicenseInfo:firstyear=2011&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2011, Linden Research, Inc. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License only., - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * + * * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ @@ -32,7 +32,7 @@ namespace tut { - + struct LLDirIteratorFixture { LLDirIteratorFixture() @@ -45,19 +45,19 @@ namespace tut /* CHOP-662 was originally introduced to deal with crashes deleting files from - a directory (VWR-25500). However, this introduced a crash looking for + a directory (VWR-25500). However, this introduced a crash looking for old chat logs as the glob_to_regex function in lldiriterator wasn't escaping lots of regexp characters */ void test_chop_662(void) { - // Check a selection of bad group names from the crash reports + // Check a selection of bad group names from the crash reports LLDirIterator iter(".","+bad-group-name]+?\?-??.*"); LLDirIterator iter1(".","))--@---bad-group-name2((?\?-??.*\\.txt"); - LLDirIterator iter2(".","__^v--x)Cuide d sua vida(x--v^__?\?-??.*"); + LLDirIterator iter2(".","__^v--x)Cuide d sua vida(x--v^__?\?-??.*"); } template<> template<> - void LLDirIteratorTest_t::test<1>() + void LLDirIteratorTest_t::test<1>() { test_chop_662(); } |