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/pmlibraryobject.cpp

332 lines
9.1 KiB

//-*-C++-*-
/*
**************************************************************************
description
--------------------
copyright : (C) 2002 by Luis Carvalho
email : lpassos@mail.telepac.pt
**************************************************************************
**************************************************************************
* *
* 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 "pmlibraryobject.h"
#include <tqstring.h>
#include <tqvaluelist.h>
#include <tqdom.h>
#include <tqbuffer.h>
#include <tqimage.h>
#include <karchive.h>
#include <kurl.h>
#include <ktar.h>
#include <kfilterdev.h>
#include <stdlib.h>
#include "pmdebug.h"
PMLibraryObject::PMLibraryObject( )
{
m_previewLoaded = false;
m_objectsLoaded = false;
m_preview = NULL;
m_objects = NULL;
m_data = NULL;
m_name = TQString();
m_description = TQString();
m_keywords = TQString();
}
PMLibraryObject::PMLibraryObject( KURL u )
{
m_previewLoaded = false;
m_objectsLoaded = false;
m_preview = NULL;
m_objects = NULL;
m_data = new KTar( u.path( ), "application/x-gzip" );
loadLibraryInfo( );
}
PMLibraryObject::~PMLibraryObject( )
{
delete m_data;
if( m_previewLoaded )
delete m_preview;
if( m_objectsLoaded )
delete m_objects;
}
void PMLibraryObject::loadLibraryInfo( )
{
if( m_data )
{
m_data->open( IO_ReadOnly );
// Position in the root of the file
const KArchiveDirectory* root = m_data->directory( );
if( !root )
return;
// Find the object info
const KArchiveEntry* entry = root->entry( "objectinfo.xml" );
if( entry && entry->isFile( ) )
{
TQBuffer buffer( ( ( KArchiveFile* )entry )->data( ) );
buffer.open( IO_ReadOnly );
TQDomDocument doc( "OBJECTINFO" );
doc.setContent( &buffer );
TQDomElement e = doc.documentElement( );
m_name = e.attribute( "name", "empty" );
TQDomNode c = e.firstChild( );
while( !c.isNull( ) )
{
if( c.isElement( ) )
{
TQDomElement ce = c.toElement( );
// Description information
if( ce.tagName( ) == "description" )
{
TQDomText te = ce.firstChild( ).toText( );
m_description = te.nodeValue( );
}
// Keywords information
else if( ce.tagName( ) == "keywords" )
{
TQDomText te = ce.firstChild( ).toText( );
m_keywords = te.nodeValue( );
}
// Extra files list
else if( ce.tagName( ) == "file_entries" )
{
TQDomNode entry = ce.firstChild( );
while( !entry.isNull( ) )
{
TQDomElement entryElement = entry.toElement( );
if( entryElement.tagName( ) == "file" )
m_extraFiles.append( entryElement.attribute( "name", "" ) );
entry = entry.nextSibling( );
}
}
}
c = c.nextSibling( );
}
}
m_data->close( );
}
}
TQImage* PMLibraryObject::preview( )
{
if( !m_previewLoaded )
{
if( m_data )
{
m_data->open( IO_ReadOnly );
// Position in the root of the file
const KArchiveDirectory* root = m_data->directory( );
if( !root )
return NULL;
// Find the object preview
const KArchiveEntry* entry = root->entry( "preview.png" );
if( entry && entry->isFile( ) )
{
TQBuffer buffer( ( ( KArchiveFile* )entry )->data( ) );
buffer.open( IO_ReadOnly );
m_preview = new TQImage( buffer.readAll( ) );
m_previewLoaded = true;
}
m_data->close( );
}
}
return m_preview;
}
TQByteArray* PMLibraryObject::objects( )
{
if( !m_objectsLoaded )
{
if( m_data )
{
m_data->open( IO_ReadOnly );
// Position in the root of the file
const KArchiveDirectory* root = m_data->directory( );
if( !root )
return NULL;
// Find the object info
const KArchiveEntry* entry = root->entry( "objectdata.kpm" );
if( entry && entry->isFile( ) )
{
// Transfer the file contents to a TQByteArray.
// TODO Maybe there is a smarter way of doing this.
char buf[256];
int nbytes;
TQIODevice* aux_in = ( ( KArchiveFile* )entry )->device( );
m_objects = new TQByteArray( );
TQBuffer aux_out( *m_objects );
aux_in->open( IO_ReadOnly );
aux_out.open( IO_WriteOnly );
while( !aux_in->atEnd( ) )
{
nbytes = aux_in->readBlock( buf, 256 );
aux_out.writeBlock( buf, nbytes );
}
delete aux_in;
if( m_objects->size( ) != 0 )
m_objectsLoaded = true;
else
{
delete m_objects;
m_objects = NULL;
}
}
}
}
return m_objects;
}
void PMLibraryObject::setName( const TQString& str )
{
m_name = str;
}
void PMLibraryObject::setDescription( const TQString& str )
{
m_description = str;
}
void PMLibraryObject::setKeywords( const TQString& str )
{
m_keywords = str;
}
void PMLibraryObject::setPreview( const TQImage& img )
{
if( m_previewLoaded )
delete m_preview;
m_preview = new TQImage( img );
m_previewLoaded = true;
}
void PMLibraryObject::setObjects( const TQByteArray& obj )
{
if( m_objectsLoaded )
delete m_objects;
m_objects = new TQByteArray( obj );
m_objects->detach( );
m_objectsLoaded = true;
}
void PMLibraryObject::save( const TQString& fileName )
{
// create the library file
m_data = new KTar( fileName, "application/x-gzip" );
m_data->open( IO_WriteOnly );
// save object info
saveLibraryInfo( );
// save preview
savePreview( );
// save library objects
saveObjects( );
m_data->close( );
}
void PMLibraryObject::saveLibraryInfo( )
{
// Pre-condition for the execution of this method.
if( !m_data || !m_data->isOpened( ) )
{
kdError( PMArea ) << "Trying to save to an unopened data file." << endl;
exit( 1 );
}
TQBuffer buf;
// Document type
TQDomDocument doc( "OBJECTINFO" );
// The root element for the document has one attribute: name
TQDomElement root = doc.createElement( "object" );
doc.appendChild( root );
root.setAttribute( "name", m_name );
// Inside the root element we add the description node ...
TQDomElement description = doc.createElement( "description" );
root.appendChild( description );
description.appendChild( doc.createTextNode( m_description ) );
// ... and the keywords node ...
TQDomElement keywords = doc.createElement( "keywords" );
root.appendChild( keywords );
keywords.appendChild( doc.createTextNode( m_keywords ) );
// ... and finally the extra files information
TQDomElement file_list = doc.createElement( "file_list" );
root.appendChild( file_list );
TQStringList::Iterator it = m_extraFiles.begin( );
for( ; it != m_extraFiles.end( ); ++it )
{
TQDomElement entry = doc.createElement( "file" );
entry.setAttribute( "name", *it );
file_list.appendChild( entry );
}
// Write the document to the buffer
TQByteArray array;
TQTextStream str( array, IO_WriteOnly );
str.setEncoding( TQTextStream::UnicodeUTF8 );
str << doc.toString( );
m_data->writeFile( "objectinfo.xml", "user", "group", array.size( ), array.data( ) );
}
void PMLibraryObject::savePreview( )
{
// Pre-condition for the execution of this method.
if( !m_data || !m_data->isOpened( ) )
{
kdError( PMArea ) << "Trying to save to an unopened data file." << endl;
exit( 1 );
}
TQByteArray array;
TQBuffer iods( array );
TQImageIO img_io( &iods, "PNG" );
if( m_previewLoaded )
{
img_io.setImage( *m_preview );
iods.open( IO_WriteOnly );
img_io.write( );
m_data->writeFile( "preview.png", "user", "group", array.size( ), array.data( ) );
}
}
void PMLibraryObject::saveObjects( )
{
// Pre-condition for the execution of this method.
if( !m_data || !m_data->isOpened( ) )
{
kdError( PMArea ) << "Trying to save to an unopened data file." << endl;
exit( 1 );
}
if( m_objectsLoaded )
m_data->writeFile( "objectdata.kpm", "user", "group", m_objects->size( ), m_objects->data( ) );
}