diff options
Diffstat (limited to 'kdeprint/foomatic2loader.cpp')
-rw-r--r-- | kdeprint/foomatic2loader.cpp | 302 |
1 files changed, 302 insertions, 0 deletions
diff --git a/kdeprint/foomatic2loader.cpp b/kdeprint/foomatic2loader.cpp new file mode 100644 index 000000000..4fdd990ce --- /dev/null +++ b/kdeprint/foomatic2loader.cpp @@ -0,0 +1,302 @@ +/* + * This file is part of the KDE libraries + * Copyright (c) 2001-2003 Michael Goffioul <kdeprint@swing.be> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License version 2 as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + **/ + +#include "foomatic2loader.h" +#include "driver.h" + +#include <qfile.h> +#include <qregexp.h> +#include <qbuffer.h> +#include <kdebug.h> +#include <klocale.h> + +void kdeprint_foomatic2scanner_init( QIODevice* ); +void kdeprint_foomatic2scanner_terminate(); + +Foomatic2Loader::Foomatic2Loader() +{ +} + +Foomatic2Loader::~Foomatic2Loader() +{ +} + +bool Foomatic2Loader::read( QIODevice *d ) +{ + bool result = true; + m_foodata.clear(); + kdeprint_foomatic2scanner_init( d ); + if ( kdeprint_foomatic2parse( this ) != 0 ) + result = false; + kdeprint_foomatic2scanner_terminate(); + return result; +} + +bool Foomatic2Loader::readFromFile( const QString& filename ) +{ + QFile f( filename ); + m_foodata.clear(); + if ( f.open( IO_ReadOnly ) ) + return read( &f ); + return false; +} + +bool Foomatic2Loader::readFromBuffer( const QString& buffer ) +{ + QCString buf = buffer.utf8(); + QBuffer d( buf ); + m_foodata.clear(); + if ( d.open( IO_ReadOnly ) ) + return read( &d ); + return false; +} + +DrBase* Foomatic2Loader::createValue( const QString& name, const QMap<QString,QVariant>& m ) const +{ + DrBase *choice = new DrBase; + choice->setName( name ); + choice->set( "text", m.operator[]( "comment" ).toString() ); + return choice; +} + +DrBase* Foomatic2Loader::createOption( const QMap<QString,QVariant>& m ) const +{ + QString type = m.operator[]( "type" ).toString(); + DrBase *opt = NULL; + if ( type == "enum" ) + { + DrListOption *lopt = new DrListOption; + QVariant a = m.operator[]( "vals_byname" ); + QMap<QString,QVariant>::ConstIterator it = a.mapBegin(); + for ( ; it!=a.mapEnd(); ++it ) + { + if ( it.data().type() != QVariant::Map ) + continue; + DrBase *ch = createValue( it.key(), it.data().toMap() ); + if ( ch ) + lopt->addChoice( ch ); + } + opt = lopt; + } + else if ( type == "int" || type == "float" ) + { + if ( type == "int" ) + opt = new DrIntegerOption; + else + opt = new DrFloatOption; + opt->set( "minval", m.operator[]( "min" ).toString() ); + opt->set( "maxval", m.operator[]( "max" ).toString() ); + } + else if ( type == "bool" ) + { + DrBooleanOption *bopt = new DrBooleanOption; + DrBase *choice; + // choice 1 + choice = new DrBase; + choice->setName( "0" ); + choice->set( "text", m.operator[]( "name_false" ).toString() ); + bopt->addChoice( choice ); + choice = new DrBase; + choice->setName( "1" ); + choice->set( "text", m.operator[]( "name_true" ).toString() ); + bopt->addChoice( choice ); + opt = bopt; + } + else if ( type == "string" ) + { + opt = new DrStringOption; + } + if ( opt ) + { + opt->setName( m.operator[]( "name" ).toString() ); + opt->set( "text", m.operator[]( "comment" ).toString() ); + QString defval = m.operator[]( "default" ).toString(); + if ( !defval.isEmpty() ) + { + opt->setValueText( defval ); + opt->set( "default", defval ); + } + } + return opt; +} + +DrMain* Foomatic2Loader::buildDriver() const +{ + if ( m_foodata.isEmpty() ) + return NULL; + + QVariant v = m_foodata.find( "VAR" ).data(); + if ( !v.isNull() && v.type() == QVariant::Map ) + { + DrMain *driver = new DrMain; + QMap<QString,DrGroup*> groups; + driver->set( "manufacturer", v.mapFind( "make" ).data().toString() ); + driver->set( "model", v.mapFind( "model" ).data().toString() ); + driver->set( "matic_printer", v.mapFind( "id" ).data().toString() ); + driver->set( "matic_driver", v.mapFind( "driver" ).data().toString() ); + driver->set( "text", QString( "%1 %2 (%3)" ).arg( driver->get( "manufacturer" ) ).arg( driver->get( "model" ) ).arg( driver->get( "matic_driver" ) ) ); + if ( m_foodata.contains( "POSTPIPE" ) ) + driver->set( "postpipe", m_foodata.find( "POSTPIPE" ).data().toString() ); + v = v.mapFind( "args" ).data(); + if ( !v.isNull() && v.type() == QVariant::List ) + { + QValueList<QVariant>::ConstIterator it = v.listBegin(); + for ( ; it!=v.listEnd(); ++it ) + { + if ( ( *it ).type() != QVariant::Map ) + continue; + DrBase *opt = createOption( ( *it ).toMap() ); + if ( opt ) + { + QString group = DrGroup::groupForOption( opt->name() ); + DrGroup *grp = NULL; + if ( !groups.contains( group ) ) + { + grp = new DrGroup; + grp->set( "text", group ); + driver->addGroup( grp ); + groups.insert( group, grp ); + } + else + grp = groups[ group ]; + grp->addOption( opt ); + if ( opt->name() == "PageSize" ) + { + // try to add the corresponding page sizes + QVariant choices = ( *it ).mapFind( "vals_byname" ).data(); + QRegExp re( "(\\d+) +(\\d+)" ); + if ( choices.type() == QVariant::Map ) + { + QMap<QString,QVariant>::ConstIterator it = choices.mapBegin(); + for ( ; it!=choices.mapEnd(); ++it ) + { + QString driverval = ( *it ).mapFind( "driverval" ).data().toString(); + if ( re.exactMatch( driverval ) ) + { + driver->addPageSize( new DrPageSize( it.key(), re.cap( 1 ).toInt(), re.cap( 2 ).toInt(), 36, 24, 36, 24 ) ); + } + } + } + } + } + else + kdWarning( 500 ) << "Failed to create option: " << ( *it ).toMap()[ "name" ].toString() << endl; + } + } + return driver; + } + return NULL; +} + +DrMain* Foomatic2Loader::modifyDriver( DrMain *driver ) const +{ + if ( !m_foodata.isEmpty() ) + { + QValueList<DrBase*> optList; + DrGroup *grp = NULL; + + QVariant V = m_foodata.find( "VAR" ).data(); + if ( !V.isNull() && V.type() == QVariant::Map ) + { + QVariant v = V.mapFind( "args" ).data(); + if ( !v.isNull() && v.type() == QVariant::List ) + { + QValueList<QVariant>::ConstIterator it = v.listBegin(); + for ( ; it!=v.listEnd(); ++it ) + { + if ( ( *it ).type() != QVariant::Map ) + continue; + DrBase *opt = createOption( ( *it ).toMap() ); + if ( opt ) + optList.append( opt ); + else + kdWarning( 500 ) << "Failed to create option: " << ( *it ).toMap()[ "name" ].toString() << endl; + } + } + else + { + v = V.mapFind( "args_byname" ).data(); + if ( !v.isNull() && v.type() == QVariant::Map ) + { + QMap<QString,QVariant>::ConstIterator it = v.mapBegin(); + for ( ; it!=v.mapEnd(); ++it ) + { + if ( ( *it ).type() != QVariant::Map ) + continue; + DrBase *opt = createOption( ( *it ).toMap() ); + if ( opt ) + optList.append( opt ); + else + kdWarning( 500 ) << "Failed to create option: " << ( *it ).toMap()[ "name" ].toString() << endl; + } + } + } + } + + for ( QValueList<DrBase*>::ConstIterator it=optList.begin(); it!=optList.end(); ++it ) + { + DrBase *opt = ( *it ); + if ( opt ) + { + switch ( opt->type() ) + { + case DrBase::List: + case DrBase::Boolean: + delete opt; + break; + default: + { + if ( !grp ) + { + grp = new DrGroup; + grp->set( "text", i18n( "Adjustments" ) ); + driver->addGroup( grp ); + } + DrBase *oldOpt = driver->findOption( opt->name() ); + if ( oldOpt && oldOpt->type() == DrBase::List ) + { + QPtrListIterator<DrBase> it( *( static_cast<DrListOption*>( oldOpt )->choices() ) ); + QString fixedvals; + for ( ; it.current(); ++it ) + { + fixedvals.append( it.current()->name() ); + if ( !it.atLast() ) + fixedvals.append( "|" ); + } + opt->set( "fixedvals", fixedvals ); + } + driver->removeOptionGlobally( opt->name() ); + grp->addOption( opt ); + break; + } + } + } + } + } + return driver; +} + +DrMain* Foomatic2Loader::loadDriver( const QString& filename ) +{ + Foomatic2Loader loader; + if ( loader.readFromFile( filename ) ) + return loader.buildDriver(); + else + return NULL; +} |