XMLFile.cpp 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. //
  2. // Urho3D Engine
  3. // Copyright (c) 2008-2011 Lasse Öörni
  4. //
  5. // Permission is hereby granted, free of charge, to any person obtaining a copy
  6. // of this software and associated documentation files (the "Software"), to deal
  7. // in the Software without restriction, including without limitation the rights
  8. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  9. // copies of the Software, and to permit persons to whom the Software is
  10. // furnished to do so, subject to the following conditions:
  11. //
  12. // The above copyright notice and this permission notice shall be included in
  13. // all copies or substantial portions of the Software.
  14. //
  15. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  18. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  20. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  21. // THE SOFTWARE.
  22. //
  23. #include "Precompiled.h"
  24. #include "File.h"
  25. #include "SharedArrayPtr.h"
  26. #include "StringUtils.h"
  27. #include "XMLFile.h"
  28. #include <tinyxml.h>
  29. #include "DebugNew.h"
  30. XMLFile::XMLFile(const std::string& name) :
  31. Resource(name),
  32. mDocument(new TiXmlDocument(name.c_str()))
  33. {
  34. }
  35. XMLFile::~XMLFile()
  36. {
  37. delete mDocument;
  38. mDocument = 0;
  39. }
  40. void XMLFile::load(Deserializer& source, ResourceCache* cache)
  41. {
  42. unsigned dataSize = source.getSize();
  43. SharedArrayPtr<char> buffer(new char[dataSize + 1]);
  44. source.read(buffer.getPtr(), dataSize);
  45. buffer[dataSize] = 0;
  46. mDocument->Clear();
  47. mDocument->Parse(buffer.getPtr());
  48. if (mDocument->Error())
  49. {
  50. mDocument->ClearError();
  51. EXCEPTION("Could not parse XML data from " + source.getName());
  52. }
  53. // This probably does not reflect internal data structure size accurately
  54. setMemoryUse(dataSize);
  55. }
  56. void XMLFile::save(Serializer& dest)
  57. {
  58. // Only support saving to a File
  59. File* file = dynamic_cast<File*>(&dest);
  60. if (!file)
  61. EXCEPTION("XML data destination is not a File");
  62. if (!mDocument->SaveFile(file->getHandle()))
  63. EXCEPTION("Failed to save XML data to " + file->getName());
  64. }
  65. XMLElement XMLFile::createRootElement(const std::string& name)
  66. {
  67. TiXmlElement newRoot(name.c_str());
  68. mDocument->Clear();
  69. mDocument->InsertEndChild(newRoot);
  70. return getRootElement();
  71. }
  72. XMLElement XMLFile::getRootElement(const std::string& name) const
  73. {
  74. XMLElement rootElem = XMLElement(mDocument->RootElement());
  75. if ((rootElem.isNull()) || ((!name.empty()) && (rootElem.getName() != name)))
  76. return XMLElement();
  77. return rootElem;
  78. }