You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Code/Legacy/CrySystem/XML/SerializeXMLWriter.cpp

139 lines
3.6 KiB
C++

/*
* Copyright (c) Contributors to the Open 3D Engine Project.
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#include "CrySystem_precompiled.h"
#include "SerializeXMLWriter.h"
#include <AzCore/Time/ITime.h>
static const size_t MAX_NODE_STACK_DEPTH = 40;
#define TAG_SCRIPT_VALUE "v"
#define TAG_SCRIPT_TYPE "t"
#define TAG_SCRIPT_NAME "n"
CSerializeXMLWriterImpl::CSerializeXMLWriterImpl(const XmlNodeRef& nodeRef)
{
const AZ::TimeMs elaspsedTimeMs = AZ::GetRealElapsedTimeMs();
const double elaspedTimeSec = AZ::TimeMsToSecondsDouble(elaspsedTimeMs);
m_curTime = CTimeValue(elaspedTimeSec);
assert(!!nodeRef);
m_nodeStack.push_back(nodeRef);
m_luaSaveStack.reserve(10);
}
//////////////////////////////////////////////////////////////////////////
CSerializeXMLWriterImpl::~CSerializeXMLWriterImpl()
{
if (m_nodeStack.size() != 1)
{
// Node stack is incorrect.
CryWarning(VALIDATOR_MODULE_SYSTEM, VALIDATOR_WARNING, "!BeginGroup/EndGroup mismatch in SaveGame");
}
}
//////////////////////////////////////////////////////////////////////////
bool CSerializeXMLWriterImpl::Value(const char* name, CTimeValue value)
{
if (value == CTimeValue(0.0f))
{
AddValue(name, "zero");
}
else
{
AddValue(name, (value - m_curTime).GetSeconds());
}
return true;
}
void CSerializeXMLWriterImpl::BeginGroup(const char* szName)
{
if (strchr(szName, ' ') != 0)
{
assert(0 && "Spaces in group name not supported");
CryWarning(VALIDATOR_MODULE_SYSTEM, VALIDATOR_WARNING, "!Spaces in group name not supported: %s/%s", GetStackInfo().c_str(), szName);
}
XmlNodeRef node = CreateNodeNamed(szName);
CurNode()->addChild(node);
m_nodeStack.push_back(node);
if (m_nodeStack.size() > MAX_NODE_STACK_DEPTH)
{
CryWarning(VALIDATOR_MODULE_SYSTEM, VALIDATOR_WARNING, "!Too Deep Node Stack:\r\n%s", GetStackInfo().c_str());
}
}
bool CSerializeXMLWriterImpl::BeginOptionalGroup(const char* szName, bool condition)
{
if (condition)
{
BeginGroup(szName);
return true;
}
return condition;
}
XmlNodeRef CSerializeXMLWriterImpl::CreateNodeNamed(const char* name)
{
XmlNodeRef newNode = CurNode()->createNode(name);
return newNode;
}
void CSerializeXMLWriterImpl::EndGroup()
{
if (m_nodeStack.size() == 1)
{
//
CryWarning(VALIDATOR_MODULE_SYSTEM, VALIDATOR_WARNING, "!Misplaced EndGroup() for BeginGroup(%s)", CurNode()->getTag());
}
assert(!m_nodeStack.empty());
m_nodeStack.pop_back();
assert(!m_nodeStack.empty());
}
//////////////////////////////////////////////////////////////////////////
AZStd::string CSerializeXMLWriterImpl::GetStackInfo() const
{
AZStd::string str;
for (int i = 0; i < (int)m_nodeStack.size(); i++)
{
const char* name = m_nodeStack[i]->getAttr(TAG_SCRIPT_NAME);
if (name && name[0])
{
str += name;
}
else
{
str += m_nodeStack[i]->getTag();
}
if (i != m_nodeStack.size() - 1)
{
str += "/";
}
}
return str;
}
//////////////////////////////////////////////////////////////////////////
AZStd::string CSerializeXMLWriterImpl::GetLuaStackInfo() const
{
AZStd::string str;
for (int i = 0; i < (int)m_luaSaveStack.size(); i++)
{
const char* name = m_luaSaveStack[i];
str += name;
if (i != m_luaSaveStack.size() - 1)
{
str += ".";
}
}
return str;
}