#include "channelSerializerXML.h"
#include "streamSerializerXML.h"
#include "metadataXML.h"
#include "metadataXMLPluginStrings.h"
#include <sstream>
#include <stdlib.h>
#include <string.h>
#include <maya/MString.h>
#include <maya/MStringResource.h>
#include <maya/adskDataChannel.h>
#include <maya/adskDataChannelSerializer.h>
#include <maya/adskDataStream.h>
#include <maya/adskDataStreamSerializer.h>
#include <assert.h>
#include <libxml/globals.h>
#include <libxml/xmlreader.h>
#include <libxml/parser.h>
using namespace adsk::Data::XML;
ChannelSerializerXML::ChannelSerializerXML()
{
}
ChannelSerializerXML::~ChannelSerializerXML ()
{
}
ChannelSerializerXML::read(
std::istream& cSrc,
std::string& errors ) const
{
unsigned int errorCount = 0;
errors = "";
xmlDocPtr doc = NULL;
LIBXML_TEST_VERSION
cSrc.seekg (0, std::ios::end);
int size = (int) cSrc.tellg();
char* memblock = new char [size];
if (memblock == nullptr) {
return nullptr;
}
cSrc.seekg (0, std::ios::beg);
cSrc.read (memblock, size);
doc = xmlReadMemory(memblock, size, NULL, NULL, 0);
xmlNode* rootEl = xmlDocGetRootElement(doc);
for (xmlNode* curNode = rootEl; curNode; curNode = curNode->next)
{
if( ! curNode ) continue;
if (curNode->type != XML_ELEMENT_NODE)
{
continue;
}
if( newChannel )
{
REPORT_ERROR_AT_LINE(kChannelXMLTooManyChannels, curNode->line);
continue;
}
newChannel = parseDOM( doc, *curNode, errorCount, errors );
}
delete[] memblock;
xmlFreeDoc(doc);
if( errorCount > 0 )
{
delete newChannel;
newChannel = NULL;
}
return newChannel;
}
ChannelSerializerXML::parseDOM(
xmlDocPtr doc,
xmlNode& channelNode,
unsigned int& errorCount,
std::string& errors ) const
{
const StreamSerializerXML* xmlStreamSerializer = dynamic_cast<const StreamSerializerXML*>( adsk::Data::StreamSerializer::formatByName( xmlFormatType ) );
if( ! xmlStreamSerializer )
{
REPORT_ERROR_AT_LINE(kChannelXMLStreamSerializerMissing, channelNode.line);
return NULL;
}
xmlNode* nameNode = Util::findNamedNode( channelNode.children, xmlTagChannelName );
const char* channelName = nameNode ? (const char*) Util::findText( doc, nameNode ) : NULL;
if( ! channelName )
{
REPORT_ERROR_AT_LINE(kChannelXMLNameMissing, channelNode.line);
return NULL;
}
if( 0 != strcmp( (const char*)channelNode.name, xmlTagChannel ) )
{
return NULL;
}
for( xmlNode* streamNode=channelNode.children; streamNode; streamNode=streamNode->next )
{
if( (streamNode->type != XML_ELEMENT_NODE)
|| (0 != strcmp((const char*)streamNode->name, xmlTagStream) ) )
{
continue;
}
xmlStreamSerializer->parseDOM( doc, *streamNode, errorCount, errors );
if( errorCount > 0 )
{
delete newStream;
}
else if( newStream )
{
}
}
if( errorCount > 0 )
{
return NULL;
}
}
int
ChannelSerializerXML::write(
std::ostream& cDst,
std::string& errors ) const
{
unsigned int errorCount = 0;
const StreamSerializerXML* xmlStreamSerializer = dynamic_cast<const StreamSerializerXML*>( adsk::Data::StreamSerializer::formatByName( xmlFormatType ) );
if( ! xmlStreamSerializer )
{
REPORT_ERROR_AT_LINE(kChannelXMLStreamSerializerMissing, 0.0);
return 1;
}
cDst << xmlTagChannelIndent << "<" << xmlTagChannel << ">" << std::endl;
cDst << xmlTagStreamIndent << "<" << xmlTagChannelName << ">"
<< dataToWrite.
name() <<
"</" << xmlTagChannelName <<
">" << std::endl;
{
if( ! theStream ) continue;
errorCount += xmlStreamSerializer->write( *theStream, cDst, errors );
}
cDst << xmlTagChannelIndent << "</" << xmlTagChannel << ">" << std::endl;
return errorCount;
}
void
ChannelSerializerXML::getFormatDescription(
std::ostream& info ) const
{
}