diff options
-rw-r--r-- | src/particle/particle.cpp | 9 | ||||
-rw-r--r-- | src/particle/particleengine.cpp | 11 | ||||
-rw-r--r-- | src/resources/loaders/xmlloader.cpp | 14 | ||||
-rw-r--r-- | src/resources/loaders/xmlloader.h | 4 |
4 files changed, 29 insertions, 9 deletions
diff --git a/src/particle/particle.cpp b/src/particle/particle.cpp index 9d755276d..11e36728b 100644 --- a/src/particle/particle.cpp +++ b/src/particle/particle.cpp @@ -38,6 +38,7 @@ #include "resources/image/image.h" #include "resources/loaders/imageloader.h" +#include "resources/loaders/xmlloader.h" #include "utils/delete2.h" #include "utils/dtor.h" @@ -410,14 +411,17 @@ Particle *Particle::addEffect(const std::string &restrict particleEffectFile, const size_t pos = particleEffectFile.find('|'); const std::string dyePalettes = (pos != std::string::npos) ? particleEffectFile.substr(pos + 1) : ""; - XML::Document doc(particleEffectFile.substr(0, pos), + XML::Document *doc = Loader::getXml(particleEffectFile.substr(0, pos), UseResman_true, SkipError_false); - const XmlNodePtrConst rootNode = doc.rootNode(); + if (!doc) + return nullptr; + const XmlNodePtrConst rootNode = doc->rootNode(); if (!rootNode || !xmlNameEqual(rootNode, "effect")) { logger->log("Error loading particle: %s", particleEffectFile.c_str()); + doc->decRef(); return nullptr; } @@ -537,6 +541,7 @@ Particle *Particle::addEffect(const std::string &restrict particleEffectFile, mChildParticles.push_back(newParticle); } + doc->decRef(); return newParticle; } diff --git a/src/particle/particleengine.cpp b/src/particle/particleengine.cpp index 6fd9a79f9..5486076c4 100644 --- a/src/particle/particleengine.cpp +++ b/src/particle/particleengine.cpp @@ -32,6 +32,7 @@ #include "resources/dye/dye.h" #include "resources/loaders/imageloader.h" +#include "resources/loaders/xmlloader.h" #include "utils/dtor.h" @@ -134,14 +135,19 @@ Particle *ParticleEngine::addEffect(const std::string &restrict const size_t pos = particleEffectFile.find('|'); const std::string dyePalettes = (pos != std::string::npos) ? particleEffectFile.substr(pos + 1) : ""; - XML::Document doc(particleEffectFile.substr(0, pos), + XML::Document *doc = Loader::getXml( + particleEffectFile.substr(0, pos), UseResman_true, SkipError_false); - const XmlNodePtrConst rootNode = doc.rootNode(); + if (!doc) + return nullptr; + + const XmlNodePtrConst rootNode = doc->rootNode(); if (!rootNode || !xmlNameEqual(rootNode, "effect")) { logger->log("Error loading particle: %s", particleEffectFile.c_str()); + doc->decRef(); return nullptr; } @@ -261,6 +267,7 @@ Particle *ParticleEngine::addEffect(const std::string &restrict mChildParticles.push_back(newParticle); } + doc->decRef(); return newParticle; } diff --git a/src/resources/loaders/xmlloader.cpp b/src/resources/loaders/xmlloader.cpp index b834c8788..de227a1cb 100644 --- a/src/resources/loaders/xmlloader.cpp +++ b/src/resources/loaders/xmlloader.cpp @@ -33,7 +33,9 @@ namespace { struct ResourceLoader final { - std::string path; + const std::string path; + const UseResman useResman; + const SkipError skipError; static Resource *load(const void *const v) { @@ -48,16 +50,20 @@ namespace rl->path.c_str()); return nullptr; } - Resource *const res = nullptr; + Resource *const res = new XML::Document(rl->path, + rl->useResman, + rl->skipError); return res; } }; } // namespace -XML::Document *Loader::getXml(const std::string &idPath) +XML::Document *Loader::getXml(const std::string &idPath, + const UseResman useResman, + const SkipError skipError) { - ResourceLoader rl = { idPath}; + ResourceLoader rl = { idPath, useResman, skipError }; return static_cast<XML::Document*>(resourceManager->get( idPath, ResourceLoader::load, &rl)); } diff --git a/src/resources/loaders/xmlloader.h b/src/resources/loaders/xmlloader.h index d898a0092..4133271fa 100644 --- a/src/resources/loaders/xmlloader.h +++ b/src/resources/loaders/xmlloader.h @@ -29,7 +29,9 @@ namespace Loader { - XML::Document *getXml(const std::string &idPath) A_WARN_UNUSED; + XML::Document *getXml(const std::string &idPath, + const UseResman useResman, + const SkipError skipError) A_WARN_UNUSED; } // namespace Loader |