summaryrefslogtreecommitdiff
path: root/indra/llxml/llxmlnode.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/llxml/llxmlnode.cpp')
-rw-r--r--indra/llxml/llxmlnode.cpp114
1 files changed, 35 insertions, 79 deletions
diff --git a/indra/llxml/llxmlnode.cpp b/indra/llxml/llxmlnode.cpp
index dc60b1aa66..9c7ac66f01 100644
--- a/indra/llxml/llxmlnode.cpp
+++ b/indra/llxml/llxmlnode.cpp
@@ -137,19 +137,19 @@ LLXMLNode::LLXMLNode(const LLXMLNode& rhs) :
}
// returns a new copy of this node and all its children
-LLXMLNodePtr LLXMLNode::deepCopy() const
+LLXMLNodePtr LLXMLNode::deepCopy()
{
LLXMLNodePtr newnode = LLXMLNodePtr(new LLXMLNode(*this));
if (mChildren.notNull())
{
- for (LLXMLChildList::const_iterator iter = mChildren->map.begin();
+ for (LLXMLChildList::iterator iter = mChildren->map.begin();
iter != mChildren->map.end(); ++iter)
{
LLXMLNodePtr temp_ptr_for_gcc(iter->second->deepCopy());
newnode->addChild(temp_ptr_for_gcc);
}
}
- for (LLXMLAttribList::const_iterator iter = mAttributes.begin();
+ for (LLXMLAttribList::iterator iter = mAttributes.begin();
iter != mAttributes.end(); ++iter)
{
LLXMLNodePtr temp_ptr_for_gcc(iter->second->deepCopy());
@@ -650,82 +650,37 @@ bool LLXMLNode::updateNode(
return true;
}
-static std::map<std::string, LLXMLNodePtr> sXMLCache;
-static LLSharedMutex sXMLCacheMutex;
-
-static void saveToCache(const std::string& filename, const LLXMLNodePtr& node)
-{
- LLXMLNodePtr node_copy = node->deepCopy();
-
- LLExclusiveMutexLock lock(&sXMLCacheMutex);
- sXMLCache.emplace(filename, node_copy);
-}
-
-static bool loadFromCache(const std::string& filename, LLXMLNodePtr& node)
+// static
+bool LLXMLNode::parseFile(const std::string& filename, LLXMLNodePtr& node, LLXMLNode* defaults_tree)
{
- LLSharedMutexLock lock(&sXMLCacheMutex);
- auto it = sXMLCache.find(filename);
- if (it == sXMLCache.end())
- return false;
- node = it->second->deepCopy();
- return true;
-}
+ // Read file
+ LL_DEBUGS("XMLNode") << "parsing XML file: " << filename << LL_ENDL;
+ LLFILE* fp = LLFile::fopen(filename, "rb"); /* Flawfinder: ignore */
+ if (fp == NULL)
+ {
+ node = NULL ;
+ return false;
+ }
+ fseek(fp, 0, SEEK_END);
+ U32 length = ftell(fp);
+ fseek(fp, 0, SEEK_SET);
-// static
-bool LLXMLNode::parseFile(const std::string& filename, LLXMLNodePtr& node, LLXMLNode* defaults_tree, bool cacheable)
-{
- // Try to read from cache
- if (cacheable)
- {
- if (loadFromCache(filename, node))
- {
- node->setDefault(defaults_tree);
- node->updateDefault();
- return true;
- }
- }
-
- std::string xml = gDirUtilp->getFileContents(filename);
- if (xml.empty())
- {
- LL_WARNS("XMLNode") << "no XML file: " << filename << LL_ENDL;
- }
- else if (parseBuffer(xml.data(), xml.size(), node))
- {
- if (cacheable)
- {
- saveToCache(filename, node);
- }
- node->setDefault(defaults_tree);
- node->updateDefault();
- return true;
- }
-
- node = nullptr;
- return false;
-}
+ U8* buffer = new U8[length+1];
+ size_t nread = fread(buffer, 1, length, fp);
+ buffer[nread] = 0;
+ fclose(fp);
-// static
-bool LLXMLNode::parseBuffer(
- const char* buffer,
- U32 length,
- LLXMLNodePtr& node,
- LLXMLNode* defaults)
-{
- if (parseBuffer(buffer, length, node))
- {
- node->setDefault(defaults);
- node->updateDefault();
- return true;
- }
- return false;
+ bool rv = parseBuffer(buffer, nread, node, defaults_tree);
+ delete [] buffer;
+ return rv;
}
// static
bool LLXMLNode::parseBuffer(
- const char* buffer,
+ U8* buffer,
U32 length,
- LLXMLNodePtr& node)
+ LLXMLNodePtr& node,
+ LLXMLNode* defaults)
{
// Init
XML_Parser my_parser = XML_ParserCreate(NULL);
@@ -741,7 +696,7 @@ bool LLXMLNode::parseBuffer(
XML_SetUserData(my_parser, (void *)file_node_ptr);
// Do the parsing
- if (XML_Parse(my_parser, buffer, length, true) != XML_STATUS_OK)
+ if (XML_Parse(my_parser, (const char *)buffer, length, true) != XML_STATUS_OK)
{
LL_WARNS() << "Error parsing xml error code: "
<< XML_ErrorString(XML_GetErrorCode(my_parser))
@@ -762,6 +717,9 @@ bool LLXMLNode::parseBuffer(
LLXMLNode *return_node = file_node->mChildren->map.begin()->second;
+ return_node->setDefault(defaults);
+ return_node->updateDefault();
+
node = return_node;
return true;
}
@@ -866,20 +824,18 @@ bool LLXMLNode::isFullyDefault()
}
// static
-bool LLXMLNode::getLayeredXMLNode(LLXMLNodePtr& root, const std::vector<std::string>& paths, bool cacheable)
+bool LLXMLNode::getLayeredXMLNode(LLXMLNodePtr& root,
+ const std::vector<std::string>& paths)
{
- if (paths.empty())
- {
- return false;
- }
+ if (paths.empty()) return false;
std::string filename = paths.front();
if (filename.empty())
{
return false;
}
-
- if (!LLXMLNode::parseFile(filename, root, nullptr, cacheable))
+
+ if (!LLXMLNode::parseFile(filename, root, NULL))
{
LL_WARNS() << "Problem reading UI description file: " << filename << LL_ENDL;
return false;