You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdegraphics/kpovmodeler/pmxmlparser.cpp

178 lines
5.0 KiB

/*
**************************************************************************
description
--------------------
copyright : (C) 2000-2002 by Andreas Zehender
email : zehender@kde.org
**************************************************************************
**************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
**************************************************************************/
#include "pmxmlparser.h"
#include <qbuffer.h>
#include <klocale.h>
#include "pmpart.h"
#include "pmscene.h"
#include "pmxmlhelper.h"
#include "pmprototypemanager.h"
#include "pmdocumentformat.h"
#include "pmdebug.h"
PMXMLParser::PMXMLParser( PMPart* part, QIODevice* dev )
: PMParser( part, dev )
{
init( );
}
PMXMLParser::PMXMLParser( PMPart* part, const QByteArray& array )
: PMParser( part, array )
{
init( );
}
void PMXMLParser::init( )
{
m_pDoc = 0;
m_majorDocumentFormat = 1;
m_minorDocumentFormat = 0;
}
PMXMLParser::~PMXMLParser( )
{
if( m_pDoc )
delete m_pDoc;
}
bool PMXMLParser::initDocument( )
{
if( !m_pDoc )
{
m_pDoc = new QDomDocument( "KPOVMODELER" );
if( m_pDoc->setContent( m_pDevice ) )
return true;
else
{
printError( i18n( "Could not load the documents data!" ) );
setFatalError( );
return false;
}
}
return true;
}
void PMXMLParser::topParse( )
{
if( initDocument( ) )
{
QDomElement e = m_pDoc->documentElement( );
// read the format number
// assume 1.0 on error
QString fstring = e.attribute( "majorFormat", "1" );
bool ok = true;
int format = fstring.toInt( &ok );
if( !ok || ( format < 1 ) )
format = 1;
m_majorDocumentFormat = format;
fstring = e.attribute( "minorFormat", "0" );
ok = true;
format = fstring.toInt( &ok );
if( !ok || ( format < 0 ) )
format = 0;
m_minorDocumentFormat = format;
if( ( m_majorDocumentFormat > c_majorDocumentFormat )
|| ( m_majorDocumentFormat == c_majorDocumentFormat )
&& ( m_minorDocumentFormat > c_minorDocumentFormat ) )
printWarning( i18n( "This document was created with a newer version of KPovModeler. "
"The whole document may not be loaded correctly." ) );
if( e.tagName( ) == "objects" )
{
parseChildObjects( e, 0 );
}
else if( e.tagName( ) == "scene" )
{
PMScene* scene = new PMScene( m_pPart );
insertChild( scene, 0 );
PMXMLHelper hlp( e, m_pPart, this,
m_majorDocumentFormat, m_minorDocumentFormat );
scene->readAttributes( hlp );
parseChildObjects( e, scene );
}
else
{
printError( i18n( "Wrong top level tag" ) );
setFatalError( );
}
}
}
void PMXMLParser::parseChildObjects( QDomElement& e, PMObject* parent )
{
QDomNode c = e.firstChild( );
while( !c.isNull( ) )
{
if( c.isElement( ) )
{
QDomElement ce = c.toElement( );
PMPrototypeManager* m = m_pPart->prototypeManager( );
PMObject* obj = m->newObject( m->className( ce.tagName( ) ) );
if( obj )
{
PMXMLHelper hlp( ce, m_pPart, this,
m_majorDocumentFormat, m_minorDocumentFormat );
obj->readAttributes( hlp );
if( insertChild( obj, parent ) )
{
parseChildObjects( ce, obj );
if( obj->isA( "Declare" ) )
checkID( ( PMDeclare* ) obj );
}
else
delete obj;
}
else if( ce.tagName( ) != "extra_data" )
printError( i18n( "Unknown object %1" ).arg( ce.tagName( ) ) );
}
c = c.nextSibling( );
}
}
void PMXMLParser::quickParse( QStringList& list )
{
if( initDocument( ) )
{
QDomElement e = m_pDoc->documentElement( );
if( ( e.tagName( ) == "objects" ) || ( e.tagName( ) == "scene" ) )
{
QDomNode c = e.firstChild( );
while( !c.isNull( ) )
{
if( c.isElement( ) )
{
QDomElement ce = c.toElement( );
QString type = m_pPart->prototypeManager( )->className( ce.tagName( ) );
if( !type.isNull( ) )
list.append( type );
}
c = c.nextSibling( );
}
}
else
printError( i18n( "Wrong top level tag" ) );
}
}