summaryrefslogtreecommitdiff
path: root/indra/llfilesystem
diff options
context:
space:
mode:
Diffstat (limited to 'indra/llfilesystem')
-rw-r--r--indra/llfilesystem/lldir_linux.cpp364
-rw-r--r--indra/llfilesystem/lldir_linux.h36
-rw-r--r--indra/llfilesystem/lldir_mac.cpp148
-rw-r--r--indra/llfilesystem/lldir_mac.h28
-rw-r--r--indra/llfilesystem/lldir_utils_objc.h12
-rw-r--r--indra/llfilesystem/lldir_win32.cpp548
-rw-r--r--indra/llfilesystem/lldir_win32.h32
-rw-r--r--indra/llfilesystem/lldirguard.h58
-rw-r--r--indra/llfilesystem/lldiriterator.cpp322
-rw-r--r--indra/llfilesystem/lldiriterator.h82
-rw-r--r--indra/llfilesystem/lllfsthread.cpp278
-rw-r--r--indra/llfilesystem/lllfsthread.h182
-rw-r--r--indra/llfilesystem/tests/lldir_test.cpp398
-rw-r--r--indra/llfilesystem/tests/lldiriterator_test.cpp18
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();
}