summaryrefslogtreecommitdiff
path: root/indra/llfilesystem
diff options
context:
space:
mode:
Diffstat (limited to 'indra/llfilesystem')
-rw-r--r--indra/llfilesystem/lldir_linux.cpp538
-rw-r--r--indra/llfilesystem/lldir_mac.cpp402
-rw-r--r--indra/llfilesystem/lldir_mac.h112
-rw-r--r--indra/llfilesystem/lldir_win32.cpp910
-rw-r--r--indra/llfilesystem/lldir_win32.h118
-rw-r--r--indra/llfilesystem/lllfsthread.h280
6 files changed, 1180 insertions, 1180 deletions
diff --git a/indra/llfilesystem/lldir_linux.cpp b/indra/llfilesystem/lldir_linux.cpp
index f7ece4c95c..b13b42c954 100644
--- a/indra/llfilesystem/lldir_linux.cpp
+++ b/indra/llfilesystem/lldir_linux.cpp
@@ -1,269 +1,269 @@
-/**
- * @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$
- */
-
-#include "linden_common.h"
-
-#include "lldir_linux.h"
-#include "llerror.h"
-#include "llrand.h"
-#include "llstring.h"
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <glob.h>
-#include <pwd.h>
-
-
-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;
- }
-}
-
-
-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;
-#ifdef APP_RO_DATA_DIR
- mAppRODataDir = APP_RO_DATA_DIR;
-#else
- 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;
- }
- 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";
-}
-
-LLDir_Linux::~LLDir_Linux()
-{
-}
-
-// Implementation
-
-
-void LLDir_Linux::initAppDirs(const std::string &app_name,
- 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");
-}
-
-U32 LLDir_Linux::countFilesInDir(const std::string &dirname, const std::string &mask)
-{
- 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;
-
- globfree(&g);
- }
-
- 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;
-}
-
-
-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;
- }
-}
-
-
-/*virtual*/ std::string LLDir_Linux::getLLPluginLauncher()
-{
- 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";
-}
+/**
+ * @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$
+ */
+
+#include "linden_common.h"
+
+#include "lldir_linux.h"
+#include "llerror.h"
+#include "llrand.h"
+#include "llstring.h"
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <glob.h>
+#include <pwd.h>
+
+
+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;
+ }
+}
+
+
+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;
+#ifdef APP_RO_DATA_DIR
+ mAppRODataDir = APP_RO_DATA_DIR;
+#else
+ 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;
+ }
+ 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";
+}
+
+LLDir_Linux::~LLDir_Linux()
+{
+}
+
+// Implementation
+
+
+void LLDir_Linux::initAppDirs(const std::string &app_name,
+ 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");
+}
+
+U32 LLDir_Linux::countFilesInDir(const std::string &dirname, const std::string &mask)
+{
+ 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;
+
+ globfree(&g);
+ }
+
+ 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;
+}
+
+
+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;
+ }
+}
+
+
+/*virtual*/ std::string LLDir_Linux::getLLPluginLauncher()
+{
+ 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";
+}
diff --git a/indra/llfilesystem/lldir_mac.cpp b/indra/llfilesystem/lldir_mac.cpp
index 06545121b6..b9be75c528 100644
--- a/indra/llfilesystem/lldir_mac.cpp
+++ b/indra/llfilesystem/lldir_mac.cpp
@@ -1,201 +1,201 @@
-/**
- * @file lldir_mac.cpp
- * @brief Implementation of directory utilities for macOS
- *
- * $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
-
-#include "linden_common.h"
-
-#include "lldir_mac.h"
-#include "llerror.h"
-#include "llrand.h"
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <glob.h>
-#include <boost/filesystem.hpp>
-#include "lldir_utils_objc.h"
-
-// --------------------------------------------------------------------------------
-
-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));
- }
- return true;
-}
-
-// --------------------------------------------------------------------------------
-
-LLDir_Mac::LLDir_Mac()
-{
- 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;
-
- boost::filesystem::path executablepath(executablepathstr);
-
-# ifndef BOOST_SYSTEM_NO_DEPRECATED
-#endif
- mExecutableFilename = executablepath.filename().string();
- mExecutableDir = executablepath.parent_path().string();
-
- // 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
- 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
- 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
- //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";
- }
-}
-
-LLDir_Mac::~LLDir_Mac()
-{
-}
-
-// Implementation
-
-
-void LLDir_Mac::initAppDirs(const std::string &app_name,
- 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");
-}
-
-std::string LLDir_Mac::getCurPath()
-{
- return boost::filesystem::path( boost::filesystem::current_path() ).string();
-}
-
-
-
-bool LLDir_Mac::fileExists(const std::string &filename) const
-{
- return boost::filesystem::exists(filename);
-}
-
-
-/*virtual*/ std::string LLDir_Mac::getLLPluginLauncher()
-{
- 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";
-}
-
-
-#endif // LL_DARWIN
+/**
+ * @file lldir_mac.cpp
+ * @brief Implementation of directory utilities for macOS
+ *
+ * $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
+
+#include "linden_common.h"
+
+#include "lldir_mac.h"
+#include "llerror.h"
+#include "llrand.h"
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <glob.h>
+#include <boost/filesystem.hpp>
+#include "lldir_utils_objc.h"
+
+// --------------------------------------------------------------------------------
+
+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));
+ }
+ return true;
+}
+
+// --------------------------------------------------------------------------------
+
+LLDir_Mac::LLDir_Mac()
+{
+ 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;
+
+ boost::filesystem::path executablepath(executablepathstr);
+
+# ifndef BOOST_SYSTEM_NO_DEPRECATED
+#endif
+ mExecutableFilename = executablepath.filename().string();
+ mExecutableDir = executablepath.parent_path().string();
+
+ // 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
+ 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
+ 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
+ //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";
+ }
+}
+
+LLDir_Mac::~LLDir_Mac()
+{
+}
+
+// Implementation
+
+
+void LLDir_Mac::initAppDirs(const std::string &app_name,
+ 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");
+}
+
+std::string LLDir_Mac::getCurPath()
+{
+ return boost::filesystem::path( boost::filesystem::current_path() ).string();
+}
+
+
+
+bool LLDir_Mac::fileExists(const std::string &filename) const
+{
+ return boost::filesystem::exists(filename);
+}
+
+
+/*virtual*/ std::string LLDir_Mac::getLLPluginLauncher()
+{
+ 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";
+}
+
+
+#endif // LL_DARWIN
diff --git a/indra/llfilesystem/lldir_mac.h b/indra/llfilesystem/lldir_mac.h
index 5b43139336..f812ee810b 100644
--- a/indra/llfilesystem/lldir_mac.h
+++ b/indra/llfilesystem/lldir_mac.h
@@ -1,56 +1,56 @@
-/**
- * @file lldir_mac.h
- * @brief Definition of directory utilities class for macOS
- *
- * $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.
-#endif // !LL_DARWIN
-
-#ifndef LL_LLDIR_MAC_H
-#define LL_LLDIR_MAC_H
-
-#include "lldir.h"
-
-#include <dirent.h>
-
-class LLDir_Mac : public LLDir
-{
-public:
- LLDir_Mac();
- virtual ~LLDir_Mac();
-
- /*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 getLLPluginLauncher();
- /*virtual*/ std::string getLLPluginFilename(std::string base_name);
-};
-
-#endif // LL_LLDIR_MAC_H
-
-
+/**
+ * @file lldir_mac.h
+ * @brief Definition of directory utilities class for macOS
+ *
+ * $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.
+#endif // !LL_DARWIN
+
+#ifndef LL_LLDIR_MAC_H
+#define LL_LLDIR_MAC_H
+
+#include "lldir.h"
+
+#include <dirent.h>
+
+class LLDir_Mac : public LLDir
+{
+public:
+ LLDir_Mac();
+ virtual ~LLDir_Mac();
+
+ /*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 getLLPluginLauncher();
+ /*virtual*/ std::string getLLPluginFilename(std::string base_name);
+};
+
+#endif // LL_LLDIR_MAC_H
+
+
diff --git a/indra/llfilesystem/lldir_win32.cpp b/indra/llfilesystem/lldir_win32.cpp
index 9e48bce58e..0fca4004b6 100644
--- a/indra/llfilesystem/lldir_win32.cpp
+++ b/indra/llfilesystem/lldir_win32.cpp
@@ -1,455 +1,455 @@
-/**
- * @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$
- */
-
-#if LL_WINDOWS
-
-#include "linden_common.h"
-
-#include "lldir_win32.h"
-#include "llerror.h"
-#include "llstring.h"
-#include "stringize.h"
-#include "llfile.h"
-#include <shlobj.h>
-#include <fstream>
-
-#include <direct.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-
-// Utility stuff to get versions of the sh
-#define PACKVERSION(major,minor) MAKELONG(minor,major)
-DWORD GetDllVersion(LPCTSTR lpszDllName);
-
-namespace
-{ // anonymous
- enum class prst { INIT, OPEN, SKIP };
- prst state{ prst::INIT };
-
- // This is called so early that we can't count on static objects being
- // properly constructed yet, so declare a pointer instead of an instance.
- std::ofstream* prelogf = nullptr;
-
- void prelog(const std::string& message)
- {
- std::optional<std::string> prelog_name;
-
- switch (state)
- {
- case prst::INIT:
- // assume we failed, until we succeed
- state = prst::SKIP;
-
- prelog_name = LLStringUtil::getoptenv("PRELOG");
- if (! prelog_name)
- // no PRELOG variable set, carry on
- return;
- prelogf = new llofstream(*prelog_name, std::ios_base::app);
- if (! (prelogf && prelogf->is_open()))
- // can't complain to anybody; how?
- return;
- // got the log file open, cool!
- state = prst::OPEN;
- (*prelogf) << "========================================================================"
- << std::endl;
- // fall through, don't break
- [[fallthrough]];
-
- case prst::OPEN:
- (*prelogf) << message << std::endl;
- break;
-
- case prst::SKIP:
- // either PRELOG isn't set, or we failed to open that pathname
- break;
- }
- }
-} // anonymous namespace
-
-#define PRELOG(expression) prelog(STRINGIZE(expression))
-
-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;
- }
-
-/*==========================================================================*|
- // 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");
-}
-
-LLDir_Win32::~LLDir_Win32()
-{
-}
-
-// Implementation
-
-void LLDir_Win32::initAppDirs(const std::string &app_name,
- 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" );
-}
-
-U32 LLDir_Win32::countFilesInDir(const std::string &dirname, const std::string &mask)
-{
- HANDLE count_search_h;
- U32 file_count;
-
- file_count = 0;
-
- 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++;
-
- 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);
-
- 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;
- }
-}
-
-
-/*virtual*/ std::string LLDir_Win32::getLLPluginLauncher()
-{
- 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";
-}
-
-
-#if 0
-// Utility function to get version number of a DLL
-
-#define PACKVERSION(major,minor) MAKELONG(minor,major)
-
-DWORD GetDllVersion(LPCTSTR lpszDllName)
-{
-
- HINSTANCE hinstDll;
- DWORD dwVersion = 0;
-
- hinstDll = LoadLibrary(lpszDllName); /* Flawfinder: ignore */
-
- if(hinstDll)
- {
- DLLGETVERSIONPROC pDllGetVersion;
-
- pDllGetVersion = (DLLGETVERSIONPROC) GetProcAddress(hinstDll, "DllGetVersion");
-
-/*Because some DLLs might not implement this function, you
- must test for it explicitly. Depending on the particular
- DLL, the lack of a DllGetVersion function can be a useful
- indicator of the version.
-*/
- if(pDllGetVersion)
- {
- DLLVERSIONINFO dvi;
- HRESULT hr;
-
- ZeroMemory(&dvi, sizeof(dvi));
- dvi.cbSize = sizeof(dvi);
-
- hr = (*pDllGetVersion)(&dvi);
-
- if(SUCCEEDED(hr))
- {
- dwVersion = PACKVERSION(dvi.dwMajorVersion, dvi.dwMinorVersion);
- }
- }
-
- FreeLibrary(hinstDll);
- }
- return dwVersion;
-}
-#endif
-
-#endif
-
-
+/**
+ * @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$
+ */
+
+#if LL_WINDOWS
+
+#include "linden_common.h"
+
+#include "lldir_win32.h"
+#include "llerror.h"
+#include "llstring.h"
+#include "stringize.h"
+#include "llfile.h"
+#include <shlobj.h>
+#include <fstream>
+
+#include <direct.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+// Utility stuff to get versions of the sh
+#define PACKVERSION(major,minor) MAKELONG(minor,major)
+DWORD GetDllVersion(LPCTSTR lpszDllName);
+
+namespace
+{ // anonymous
+ enum class prst { INIT, OPEN, SKIP };
+ prst state{ prst::INIT };
+
+ // This is called so early that we can't count on static objects being
+ // properly constructed yet, so declare a pointer instead of an instance.
+ std::ofstream* prelogf = nullptr;
+
+ void prelog(const std::string& message)
+ {
+ std::optional<std::string> prelog_name;
+
+ switch (state)
+ {
+ case prst::INIT:
+ // assume we failed, until we succeed
+ state = prst::SKIP;
+
+ prelog_name = LLStringUtil::getoptenv("PRELOG");
+ if (! prelog_name)
+ // no PRELOG variable set, carry on
+ return;
+ prelogf = new llofstream(*prelog_name, std::ios_base::app);
+ if (! (prelogf && prelogf->is_open()))
+ // can't complain to anybody; how?
+ return;
+ // got the log file open, cool!
+ state = prst::OPEN;
+ (*prelogf) << "========================================================================"
+ << std::endl;
+ // fall through, don't break
+ [[fallthrough]];
+
+ case prst::OPEN:
+ (*prelogf) << message << std::endl;
+ break;
+
+ case prst::SKIP:
+ // either PRELOG isn't set, or we failed to open that pathname
+ break;
+ }
+ }
+} // anonymous namespace
+
+#define PRELOG(expression) prelog(STRINGIZE(expression))
+
+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;
+ }
+
+/*==========================================================================*|
+ // 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");
+}
+
+LLDir_Win32::~LLDir_Win32()
+{
+}
+
+// Implementation
+
+void LLDir_Win32::initAppDirs(const std::string &app_name,
+ 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" );
+}
+
+U32 LLDir_Win32::countFilesInDir(const std::string &dirname, const std::string &mask)
+{
+ HANDLE count_search_h;
+ U32 file_count;
+
+ file_count = 0;
+
+ 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++;
+
+ 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);
+
+ 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;
+ }
+}
+
+
+/*virtual*/ std::string LLDir_Win32::getLLPluginLauncher()
+{
+ 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";
+}
+
+
+#if 0
+// Utility function to get version number of a DLL
+
+#define PACKVERSION(major,minor) MAKELONG(minor,major)
+
+DWORD GetDllVersion(LPCTSTR lpszDllName)
+{
+
+ HINSTANCE hinstDll;
+ DWORD dwVersion = 0;
+
+ hinstDll = LoadLibrary(lpszDllName); /* Flawfinder: ignore */
+
+ if(hinstDll)
+ {
+ DLLGETVERSIONPROC pDllGetVersion;
+
+ pDllGetVersion = (DLLGETVERSIONPROC) GetProcAddress(hinstDll, "DllGetVersion");
+
+/*Because some DLLs might not implement this function, you
+ must test for it explicitly. Depending on the particular
+ DLL, the lack of a DllGetVersion function can be a useful
+ indicator of the version.
+*/
+ if(pDllGetVersion)
+ {
+ DLLVERSIONINFO dvi;
+ HRESULT hr;
+
+ ZeroMemory(&dvi, sizeof(dvi));
+ dvi.cbSize = sizeof(dvi);
+
+ hr = (*pDllGetVersion)(&dvi);
+
+ if(SUCCEEDED(hr))
+ {
+ dwVersion = PACKVERSION(dvi.dwMajorVersion, dvi.dwMinorVersion);
+ }
+ }
+
+ FreeLibrary(hinstDll);
+ }
+ return dwVersion;
+}
+#endif
+
+#endif
+
+
diff --git a/indra/llfilesystem/lldir_win32.h b/indra/llfilesystem/lldir_win32.h
index 7b25a86f6f..ab2726f1a0 100644
--- a/indra/llfilesystem/lldir_win32.h
+++ b/indra/llfilesystem/lldir_win32.h
@@ -1,59 +1,59 @@
-/**
- * @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$
- */
-
-#if !LL_WINDOWS
-#error This header must not be included when compiling for any target other than Windows. Consider including lldir.h instead.
-#endif // !LL_WINDOWS
-
-#ifndef LL_LLDIR_WIN32_H
-#define LL_LLDIR_WIN32_H
-
-#include "lldir.h"
-
-class LLDir_Win32 : public LLDir
-{
-public:
- LLDir_Win32();
- virtual ~LLDir_Win32();
-
- /*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 getLLPluginLauncher();
- /*virtual*/ std::string getLLPluginFilename(std::string base_name);
-
-private:
- void* mDirSearch_h{ nullptr };
- llutf16string mCurrentDir;
-};
-
-#endif // LL_LLDIR_WIN32_H
-
-
+/**
+ * @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$
+ */
+
+#if !LL_WINDOWS
+#error This header must not be included when compiling for any target other than Windows. Consider including lldir.h instead.
+#endif // !LL_WINDOWS
+
+#ifndef LL_LLDIR_WIN32_H
+#define LL_LLDIR_WIN32_H
+
+#include "lldir.h"
+
+class LLDir_Win32 : public LLDir
+{
+public:
+ LLDir_Win32();
+ virtual ~LLDir_Win32();
+
+ /*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 getLLPluginLauncher();
+ /*virtual*/ std::string getLLPluginFilename(std::string base_name);
+
+private:
+ void* mDirSearch_h{ nullptr };
+ llutf16string mCurrentDir;
+};
+
+#endif // LL_LLDIR_WIN32_H
+
+
diff --git a/indra/llfilesystem/lllfsthread.h b/indra/llfilesystem/lllfsthread.h
index 51ef2d39ab..c0ed1931bb 100644
--- a/indra/llfilesystem/lllfsthread.h
+++ b/indra/llfilesystem/lllfsthread.h
@@ -1,140 +1,140 @@
-/**
- * @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$
- */
-
-#ifndef LL_LLLFSTHREAD_H
-#define LL_LLLFSTHREAD_H
-
-#include <queue>
-#include <string>
-#include <map>
-#include <set>
-
-#include "llpointer.h"
-#include "llqueuedthread.h"
-
-//============================================================================
-// Threaded Local File System
-//============================================================================
-
-class LLLFSThread : public LLQueuedThread
-{
- //------------------------------------------------------------------------
-public:
- 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;
- };
-
- //------------------------------------------------------------------------
-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
-
-public:
- static LLLFSThread* sLocal; // Default local file thread
-};
-
-//============================================================================
-
-
-#endif // LL_LLLFSTHREAD_H
+/**
+ * @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$
+ */
+
+#ifndef LL_LLLFSTHREAD_H
+#define LL_LLLFSTHREAD_H
+
+#include <queue>
+#include <string>
+#include <map>
+#include <set>
+
+#include "llpointer.h"
+#include "llqueuedthread.h"
+
+//============================================================================
+// Threaded Local File System
+//============================================================================
+
+class LLLFSThread : public LLQueuedThread
+{
+ //------------------------------------------------------------------------
+public:
+ 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;
+ };
+
+ //------------------------------------------------------------------------
+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
+
+public:
+ static LLLFSThread* sLocal; // Default local file thread
+};
+
+//============================================================================
+
+
+#endif // LL_LLLFSTHREAD_H