|
|
|
/*
|
|
|
|
**************************************************************************
|
|
|
|
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 <tqbuffer.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, TQIODevice* dev )
|
|
|
|
: PMParser( part, dev )
|
|
|
|
{
|
|
|
|
init( );
|
|
|
|
}
|
|
|
|
|
|
|
|
PMXMLParser::PMXMLParser( PMPart* part, const TQByteArray& 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 TQDomDocument( "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( ) )
|
|
|
|
{
|
|
|
|
TQDomElement e = m_pDoc->documentElement( );
|
|
|
|
// read the format number
|
|
|
|
// assume 1.0 on error
|
|
|
|
TQString 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( TQDomElement& e, PMObject* parent )
|
|
|
|
{
|
|
|
|
TQDomNode c = e.firstChild( );
|
|
|
|
while( !c.isNull( ) )
|
|
|
|
{
|
|
|
|
if( c.isElement( ) )
|
|
|
|
{
|
|
|
|
TQDomElement 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" ).tqarg( ce.tagName( ) ) );
|
|
|
|
}
|
|
|
|
c = c.nextSibling( );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void PMXMLParser::quickParse( TQStringList& list )
|
|
|
|
{
|
|
|
|
if( initDocument( ) )
|
|
|
|
{
|
|
|
|
TQDomElement e = m_pDoc->documentElement( );
|
|
|
|
if( ( e.tagName( ) == "objects" ) || ( e.tagName( ) == "scene" ) )
|
|
|
|
{
|
|
|
|
TQDomNode c = e.firstChild( );
|
|
|
|
|
|
|
|
while( !c.isNull( ) )
|
|
|
|
{
|
|
|
|
if( c.isElement( ) )
|
|
|
|
{
|
|
|
|
TQDomElement ce = c.toElement( );
|
|
|
|
TQString type = m_pPart->prototypeManager( )->className( ce.tagName( ) );
|
|
|
|
if( !type.isNull( ) )
|
|
|
|
list.append( type );
|
|
|
|
}
|
|
|
|
c = c.nextSibling( );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
printError( i18n( "Wrong top level tag" ) );
|
|
|
|
}
|
|
|
|
}
|