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.
176 lines
5.0 KiB
C++
176 lines
5.0 KiB
C++
/*
|
|
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
|
|
* its licensors.
|
|
*
|
|
* For complete copyright and license terms please see the LICENSE at the root of this
|
|
* distribution (the "License"). All use of this software is governed by the License,
|
|
* or, if provided, by the license below or the license accompanying this file. Do not
|
|
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
*
|
|
*/
|
|
#ifndef CRYINCLUDE_CRYCOMMON_SERIALIZATION_IXMLARCHIVE_H
|
|
#define CRYINCLUDE_CRYCOMMON_SERIALIZATION_IXMLARCHIVE_H
|
|
#pragma once
|
|
|
|
|
|
#include "Serialization/IArchive.h"
|
|
#include "CryExtension/ICryUnknown.h"
|
|
#include "CryExtension/CryCreateClassInstance.h"
|
|
|
|
namespace Serialization
|
|
{
|
|
struct IXmlArchive
|
|
: public ICryUnknown
|
|
, public IArchive
|
|
{
|
|
public:
|
|
CRYINTERFACE_DECLARE(IXmlArchive, 0x1386c94ded174f96, 0xab14d20e1b616588);
|
|
|
|
using IArchive::operator();
|
|
|
|
virtual void SetXmlNode(XmlNodeRef pRootNode) = 0;
|
|
virtual XmlNodeRef GetXmlNode() const = 0;
|
|
|
|
protected:
|
|
IXmlArchive(int caps)
|
|
: IArchive(caps | IArchive::NO_EMPTY_NAMES) {}
|
|
};
|
|
|
|
|
|
typedef AZStd::shared_ptr< IXmlArchive > IXmlArchivePtr;
|
|
|
|
|
|
inline IXmlArchivePtr CreateXmlInputArchive()
|
|
{
|
|
IXmlArchivePtr pArchive;
|
|
CryCreateClassInstance("CXmlIArchive", pArchive);
|
|
return pArchive;
|
|
}
|
|
|
|
|
|
inline IXmlArchivePtr CreateXmlInputArchive(XmlNodeRef pXmlNode)
|
|
{
|
|
if (pXmlNode)
|
|
{
|
|
IXmlArchivePtr pArchive = CreateXmlInputArchive();
|
|
if (pArchive)
|
|
{
|
|
pArchive->SetXmlNode(pXmlNode);
|
|
}
|
|
return pArchive;
|
|
}
|
|
return IXmlArchivePtr();
|
|
}
|
|
|
|
|
|
inline IXmlArchivePtr CreateXmlInputArchive(const char* const filename)
|
|
{
|
|
XmlNodeRef pXmlNode = gEnv->pSystem->LoadXmlFromFile(filename);
|
|
return CreateXmlInputArchive(pXmlNode);
|
|
}
|
|
|
|
|
|
inline IXmlArchivePtr CreateXmlOutputArchive()
|
|
{
|
|
IXmlArchivePtr pArchive;
|
|
CryCreateClassInstance("CXmlOArchive", pArchive);
|
|
return pArchive;
|
|
}
|
|
|
|
|
|
inline IXmlArchivePtr CreateXmlOutputArchive(XmlNodeRef pXmlNode)
|
|
{
|
|
if (pXmlNode)
|
|
{
|
|
IXmlArchivePtr pArchive = CreateXmlOutputArchive();
|
|
if (pArchive)
|
|
{
|
|
pArchive->SetXmlNode(pXmlNode);
|
|
}
|
|
return pArchive;
|
|
}
|
|
return IXmlArchivePtr();
|
|
}
|
|
|
|
|
|
inline IXmlArchivePtr CreateXmlOutputArchive(const char* const xmlRootElementName)
|
|
{
|
|
XmlNodeRef pXmlNode = gEnv->pSystem->CreateXmlNode(xmlRootElementName);
|
|
return CreateXmlOutputArchive(pXmlNode);
|
|
}
|
|
|
|
|
|
template< typename T >
|
|
bool StructFromXml(const char* const filename, T& dataOut)
|
|
{
|
|
Serialization::IXmlArchivePtr pXmlArchive = Serialization::CreateXmlInputArchive(filename);
|
|
if (pXmlArchive)
|
|
{
|
|
Serialization::SStruct serializer = Serialization::SStruct(dataOut);
|
|
const bool success = serializer(*pXmlArchive);
|
|
return success;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
|
|
template< typename T >
|
|
bool StructFromXml(XmlNodeRef pXmlNode, T& dataOut)
|
|
{
|
|
Serialization::IXmlArchivePtr pXmlArchive = Serialization::CreateXmlInputArchive(pXmlNode);
|
|
if (pXmlArchive)
|
|
{
|
|
Serialization::SStruct serializer = Serialization::SStruct(dataOut);
|
|
const bool success = serializer(*pXmlArchive);
|
|
return success;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
|
|
template< typename T >
|
|
XmlNodeRef StructToXml(const char* const xmlRootElementName, const T& dataIn)
|
|
{
|
|
Serialization::IXmlArchivePtr pXmlArchive = Serialization::CreateXmlOutputArchive(xmlRootElementName);
|
|
if (pXmlArchive)
|
|
{
|
|
Serialization::SStruct serializer = Serialization::SStruct(const_cast< T& >(dataIn));
|
|
const bool success = serializer(*pXmlArchive);
|
|
if (success)
|
|
{
|
|
return pXmlArchive->GetXmlNode();
|
|
}
|
|
}
|
|
return XmlNodeRef();
|
|
}
|
|
|
|
|
|
template< typename T >
|
|
bool StructToXml(XmlNodeRef pXmlNode, const T& dataIn)
|
|
{
|
|
Serialization::IXmlArchivePtr pXmlArchive = Serialization::CreateXmlOutputArchive(pXmlNode);
|
|
if (pXmlArchive)
|
|
{
|
|
Serialization::SStruct serializer = Serialization::SStruct(const_cast< T& >(dataIn));
|
|
const bool success = serializer(*pXmlArchive);
|
|
return success;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
|
|
template< typename T >
|
|
bool StructToXml(const char* const filename, const char* const xmlRootElementName, const T& dataIn)
|
|
{
|
|
XmlNodeRef pXmlNode = Serialization::StructToXml(xmlRootElementName, dataIn);
|
|
if (pXmlNode)
|
|
{
|
|
return pXmlNode->saveToFile(filename);
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
|
|
#endif // CRYINCLUDE_CRYCOMMON_SERIALIZATION_IXMLARCHIVE_H
|