summaryrefslogtreecommitdiff
path: root/indra/llfilesystem
diff options
context:
space:
mode:
authorAlexander Gavriliuk <alexandrgproductengine@lindenlab.com>2024-03-05 17:03:11 +0100
committerGuru <alexandrgproductengine@lindenlab.com>2024-03-05 19:54:31 +0100
commita865d423974ea06dffa47798c81e98e7570b02ec (patch)
treed25f6c86d2948f7d8683aaa573d24135c8a26edb /indra/llfilesystem
parent043a92997f187826ad26ff269613c8f0ed11379f (diff)
viewer#819 Avoid reading the same XML file multiple times
Diffstat (limited to 'indra/llfilesystem')
-rw-r--r--indra/llfilesystem/lldir.cpp33
-rw-r--r--indra/llfilesystem/lldir.h4
2 files changed, 33 insertions, 4 deletions
diff --git a/indra/llfilesystem/lldir.cpp b/indra/llfilesystem/lldir.cpp
index 69b23f9cf8..ee5dec2b77 100644
--- a/indra/llfilesystem/lldir.cpp
+++ b/indra/llfilesystem/lldir.cpp
@@ -71,6 +71,7 @@ LLDir *gDirUtilp = (LLDir *)&gDirUtil;
/// Values for findSkinnedFilenames(subdir) parameter
const char
*LLDir::XUI = "xui",
+ *LLDir::HTML = "html",
*LLDir::TEXTURES = "textures",
*LLDir::SKINBASE = "";
@@ -761,14 +762,13 @@ std::vector<std::string> LLDir::findSkinnedFilenames(const std::string& subdir,
else
{
// We do not recognize this subdir. Investigate.
- std::string subdir_path(add(getDefaultSkinDir(), subdir));
- if (fileExists(add(subdir_path, "en")))
+ if (skinExists(subdir, "en"))
{
// defaultSkinDir/subdir contains subdir "en". That's our
// default language; this subdir is localized.
found = sLocalized.insert(StringMap::value_type(subdir, "en")).first;
}
- else if (fileExists(add(subdir_path, "en-us")))
+ else if (skinExists(subdir, "en-us"))
{
// defaultSkinDir/subdir contains subdir "en-us" but not "en".
// Set as default language; this subdir is localized.
@@ -865,6 +865,33 @@ std::vector<std::string> LLDir::findSkinnedFilenames(const std::string& subdir,
return results;
}
+// virtual
+bool LLDir::skinExists(const std::string& subdir, const std::string& skin) const
+{
+ std::string skin_path(add(getDefaultSkinDir(), subdir, skin));
+ return fileExists(skin_path);
+}
+
+// virtual
+std::string LLDir::getFileContents(const std::string& filename) const
+{
+ LLFILE* fp = LLFile::fopen(filename, "rb"); /* Flawfinder: ignore */
+ if (fp)
+ {
+ fseek(fp, 0, SEEK_END);
+ U32 length = ftell(fp);
+ fseek(fp, 0, SEEK_SET);
+
+ std::vector<char> buffer(length);
+ size_t nread = fread(buffer.data(), 1, length, fp);
+ fclose(fp);
+
+ return std::string(buffer.data(), nread);
+ }
+
+ return LLStringUtil::null;
+}
+
std::string LLDir::getTempFilename() const
{
LLUUID random_uuid;
diff --git a/indra/llfilesystem/lldir.h b/indra/llfilesystem/lldir.h
index b9a046ba33..d43921c292 100644
--- a/indra/llfilesystem/lldir.h
+++ b/indra/llfilesystem/lldir.h
@@ -72,6 +72,8 @@ class LLDir
// pure virtual functions
virtual std::string getCurPath() = 0;
virtual bool fileExists(const std::string &filename) const = 0;
+ virtual bool skinExists(const std::string& subdir, const std::string &skin) const;
+ virtual std::string getFileContents(const std::string& filename) const;
const std::string findFile(const std::string& filename, const std::vector<std::string> filenames) const;
const std::string findFile(const std::string& filename, const std::string& searchPath1 = "", const std::string& searchPath2 = "", const std::string& searchPath3 = "") const;
@@ -150,7 +152,7 @@ class LLDir
const std::string& filename,
ESkinConstraint constraint=CURRENT_SKIN) const;
/// Values for findSkinnedFilenames(subdir) parameter
- static const char *XUI, *TEXTURES, *SKINBASE;
+ static const char *XUI, *HTML, *TEXTURES, *SKINBASE;
/**
* Return the base-language pathname from findSkinnedFilenames(), or
* the empty string if no such file exists. Parameters are identical to