foomatic2loader.cpp00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "foomatic2loader.h"
00021 #include "driver.h"
00022
00023 #include <qfile.h>
00024 #include <qregexp.h>
00025 #include <qbuffer.h>
00026 #include <kdebug.h>
00027 #include <klocale.h>
00028
00029 void kdeprint_foomatic2scanner_init( QIODevice* );
00030 void kdeprint_foomatic2scanner_terminate();
00031
00032 Foomatic2Loader::Foomatic2Loader()
00033 {
00034 }
00035
00036 Foomatic2Loader::~Foomatic2Loader()
00037 {
00038 }
00039
00040 bool Foomatic2Loader::read( QIODevice *d )
00041 {
00042 bool result = true;
00043 m_foodata.clear();
00044 kdeprint_foomatic2scanner_init( d );
00045 if ( kdeprint_foomatic2parse( this ) != 0 )
00046 result = false;
00047 kdeprint_foomatic2scanner_terminate();
00048 return result;
00049 }
00050
00051 bool Foomatic2Loader::readFromFile( const QString& filename )
00052 {
00053 QFile f( filename );
00054 m_foodata.clear();
00055 if ( f.open( IO_ReadOnly ) )
00056 return read( &f );
00057 return false;
00058 }
00059
00060 bool Foomatic2Loader::readFromBuffer( const QString& buffer )
00061 {
00062 QCString buf = buffer.utf8();
00063 QBuffer d( buf );
00064 m_foodata.clear();
00065 if ( d.open( IO_ReadOnly ) )
00066 return read( &d );
00067 return false;
00068 }
00069
00070 DrBase* Foomatic2Loader::createValue( const QString& name, const QMap<QString,QVariant>& m ) const
00071 {
00072 DrBase *choice = new DrBase;
00073 choice->setName( name );
00074 choice->set( "text", m.operator[]( "comment" ).toString() );
00075 return choice;
00076 }
00077
00078 DrBase* Foomatic2Loader::createOption( const QMap<QString,QVariant>& m ) const
00079 {
00080 QString type = m.operator[]( "type" ).toString();
00081 DrBase *opt = NULL;
00082 if ( type == "enum" )
00083 {
00084 DrListOption *lopt = new DrListOption;
00085 QVariant a = m.operator[]( "vals_byname" );
00086 QMap<QString,QVariant>::ConstIterator it = a.mapBegin();
00087 for ( ; it!=a.mapEnd(); ++it )
00088 {
00089 if ( it.data().type() != QVariant::Map )
00090 continue;
00091 DrBase *ch = createValue( it.key(), it.data().toMap() );
00092 if ( ch )
00093 lopt->addChoice( ch );
00094 }
00095 opt = lopt;
00096 }
00097 else if ( type == "int" || type == "float" )
00098 {
00099 if ( type == "int" )
00100 opt = new DrIntegerOption;
00101 else
00102 opt = new DrFloatOption;
00103 opt->set( "minval", m.operator[]( "min" ).toString() );
00104 opt->set( "maxval", m.operator[]( "max" ).toString() );
00105 }
00106 else if ( type == "bool" )
00107 {
00108 DrBooleanOption *bopt = new DrBooleanOption;
00109 DrBase *choice;
00110
00111 choice = new DrBase;
00112 choice->setName( "0" );
00113 choice->set( "text", m.operator[]( "name_false" ).toString() );
00114 bopt->addChoice( choice );
00115 choice = new DrBase;
00116 choice->setName( "1" );
00117 choice->set( "text", m.operator[]( "name_true" ).toString() );
00118 bopt->addChoice( choice );
00119 opt = bopt;
00120 }
00121 else if ( type == "string" )
00122 {
00123 opt = new DrStringOption;
00124 }
00125 if ( opt )
00126 {
00127 opt->setName( m.operator[]( "name" ).toString() );
00128 opt->set( "text", m.operator[]( "comment" ).toString() );
00129 QString defval = m.operator[]( "default" ).toString();
00130 if ( !defval.isEmpty() )
00131 {
00132 opt->setValueText( defval );
00133 opt->set( "default", defval );
00134 }
00135 }
00136 return opt;
00137 }
00138
00139 DrMain* Foomatic2Loader::buildDriver() const
00140 {
00141 if ( m_foodata.isEmpty() )
00142 return NULL;
00143
00144 QVariant v = m_foodata.find( "VAR" ).data();
00145 if ( !v.isNull() && v.type() == QVariant::Map )
00146 {
00147 DrMain *driver = new DrMain;
00148 QMap<QString,DrGroup*> groups;
00149 driver->set( "manufacturer", v.mapFind( "make" ).data().toString() );
00150 driver->set( "model", v.mapFind( "model" ).data().toString() );
00151 driver->set( "matic_printer", v.mapFind( "id" ).data().toString() );
00152 driver->set( "matic_driver", v.mapFind( "driver" ).data().toString() );
00153 driver->set( "text", QString( "%1 %2 (%3)" ).arg( driver->get( "manufacturer" ) ).arg( driver->get( "model" ) ).arg( driver->get( "matic_driver" ) ) );
00154 if ( m_foodata.contains( "POSTPIPE" ) )
00155 driver->set( "postpipe", m_foodata.find( "POSTPIPE" ).data().toString() );
00156 v = v.mapFind( "args" ).data();
00157 if ( !v.isNull() && v.type() == QVariant::List )
00158 {
00159 QValueList<QVariant>::ConstIterator it = v.listBegin();
00160 for ( ; it!=v.listEnd(); ++it )
00161 {
00162 if ( ( *it ).type() != QVariant::Map )
00163 continue;
00164 DrBase *opt = createOption( ( *it ).toMap() );
00165 if ( opt )
00166 {
00167 QString group = DrGroup::groupForOption( opt->name() );
00168 DrGroup *grp = NULL;
00169 if ( !groups.contains( group ) )
00170 {
00171 grp = new DrGroup;
00172 grp->set( "text", group );
00173 driver->addGroup( grp );
00174 groups.insert( group, grp );
00175 }
00176 else
00177 grp = groups[ group ];
00178 grp->addOption( opt );
00179 if ( opt->name() == "PageSize" )
00180 {
00181
00182 QVariant choices = ( *it ).mapFind( "vals_byname" ).data();
00183 QRegExp re( "(\\d+) +(\\d+)" );
00184 if ( choices.type() == QVariant::Map )
00185 {
00186 QMap<QString,QVariant>::ConstIterator it = choices.mapBegin();
00187 for ( ; it!=choices.mapEnd(); ++it )
00188 {
00189 QString driverval = ( *it ).mapFind( "driverval" ).data().toString();
00190 if ( re.exactMatch( driverval ) )
00191 {
00192 driver->addPageSize( new DrPageSize( it.key(), re.cap( 1 ).toInt(), re.cap( 2 ).toInt(), 36, 24, 36, 24 ) );
00193 }
00194 }
00195 }
00196 }
00197 }
00198 else
00199 kdWarning( 500 ) << "Failed to create option: " << ( *it ).toMap()[ "name" ].toString() << endl;
00200 }
00201 }
00202 return driver;
00203 }
00204 return NULL;
00205 }
00206
00207 DrMain* Foomatic2Loader::modifyDriver( DrMain *driver ) const
00208 {
00209 if ( !m_foodata.isEmpty() )
00210 {
00211 QValueList<DrBase*> optList;
00212 DrGroup *grp = NULL;
00213
00214 QVariant V = m_foodata.find( "VAR" ).data();
00215 if ( !V.isNull() && V.type() == QVariant::Map )
00216 {
00217 QVariant v = V.mapFind( "args" ).data();
00218 if ( !v.isNull() && v.type() == QVariant::List )
00219 {
00220 QValueList<QVariant>::ConstIterator it = v.listBegin();
00221 for ( ; it!=v.listEnd(); ++it )
00222 {
00223 if ( ( *it ).type() != QVariant::Map )
00224 continue;
00225 DrBase *opt = createOption( ( *it ).toMap() );
00226 if ( opt )
00227 optList.append( opt );
00228 else
00229 kdWarning( 500 ) << "Failed to create option: " << ( *it ).toMap()[ "name" ].toString() << endl;
00230 }
00231 }
00232 else
00233 {
00234 v = V.mapFind( "args_byname" ).data();
00235 if ( !v.isNull() && v.type() == QVariant::Map )
00236 {
00237 QMap<QString,QVariant>::ConstIterator it = v.mapBegin();
00238 for ( ; it!=v.mapEnd(); ++it )
00239 {
00240 if ( ( *it ).type() != QVariant::Map )
00241 continue;
00242 DrBase *opt = createOption( ( *it ).toMap() );
00243 if ( opt )
00244 optList.append( opt );
00245 else
00246 kdWarning( 500 ) << "Failed to create option: " << ( *it ).toMap()[ "name" ].toString() << endl;
00247 }
00248 }
00249 }
00250 }
00251
00252 for ( QValueList<DrBase*>::ConstIterator it=optList.begin(); it!=optList.end(); ++it )
00253 {
00254 DrBase *opt = ( *it );
00255 if ( opt )
00256 {
00257 switch ( opt->type() )
00258 {
00259 case DrBase::List:
00260 case DrBase::Boolean:
00261 delete opt;
00262 break;
00263 default:
00264 {
00265 if ( !grp )
00266 {
00267 grp = new DrGroup;
00268 grp->set( "text", i18n( "Adjustments" ) );
00269 driver->addGroup( grp );
00270 }
00271 DrBase *oldOpt = driver->findOption( opt->name() );
00272 if ( oldOpt && oldOpt->type() == DrBase::List )
00273 {
00274 QPtrListIterator<DrBase> it( *( static_cast<DrListOption*>( oldOpt )->choices() ) );
00275 QString fixedvals;
00276 for ( ; it.current(); ++it )
00277 {
00278 fixedvals.append( it.current()->name() );
00279 if ( !it.atLast() )
00280 fixedvals.append( "|" );
00281 }
00282 opt->set( "fixedvals", fixedvals );
00283 }
00284 driver->removeOptionGlobally( opt->name() );
00285 grp->addOption( opt );
00286 break;
00287 }
00288 }
00289 }
00290 }
00291 }
00292 return driver;
00293 }
00294
00295 DrMain* Foomatic2Loader::loadDriver( const QString& filename )
00296 {
00297 Foomatic2Loader loader;
00298 if ( loader.readFromFile( filename ) )
00299 return loader.buildDriver();
00300 else
00301 return NULL;
00302 }
|