void KreImporter::parseFile( const QString &filename ) { QFile * file = 0; bool unlink = false; kDebug() << "loading file:" << filename ; if ( filename.right( 4 ) == ".kre" ) { file = new QFile( filename ); kDebug() << "file is an archive" ; KTar* kre = new KTar( filename, "application/x-gzip" ); kre->open( QIODevice::ReadOnly ); const KArchiveDirectory* dir = kre->directory(); QString name; QStringList fileList = dir->entries(); for ( QStringList::Iterator it = fileList.begin(); it != fileList.end(); ++it ) { if ( ( *it ).right( 6 ) == ".kreml" ) { name = *it; } } if ( name.isEmpty() ) { kDebug() << "error: Archive doesn't contain a valid Krecipes file" ; setErrorMsg( i18n( "Archive does not contain a valid Krecipes file" ) ); return ; } QString tmp_dir = KStandardDirs::locateLocal( "tmp", "" ); dir->copyTo( tmp_dir ); file = new QFile( tmp_dir + name ); kre->close(); unlink = true; //remove file after import } else { file = new QFile( filename ); } if ( file->open( QIODevice::ReadOnly ) ) { kDebug() << "file opened" ; QDomDocument doc; QString error; int line; int column; if ( !doc.setContent( file, &error, &line, &column ) ) { kDebug() << QString( "error: \"%1\" at line %2, column %3" ).arg( error ).arg( line ).arg( column ) ; setErrorMsg( i18n( "\"%1\" at line %2, column %3" , error , line, column ) ); return ; } QDomElement kreml = doc.documentElement(); if ( kreml.tagName() != "krecipes" ) { setErrorMsg( i18n( "This file does not appear to be a *.kreml file" ) ); return ; } // TODO Check if there are changes between versions QString kreVersion = kreml.attribute( "version" ); kDebug() << "KreML version" << kreVersion ; QDomNodeList r = kreml.childNodes(); QDomElement krecipe; for ( int z = 0; z < r.count(); z++ ) { krecipe = r.item( z ).toElement(); QDomNodeList l = krecipe.childNodes(); if ( krecipe.tagName() == "krecipes-recipe" ) { Recipe recipe; for ( int i = 0; i < l.count(); i++ ) { QDomElement el = l.item( i ).toElement(); if ( el.tagName() == "krecipes-description" ) { readDescription( el.childNodes(), &recipe ); } if ( el.tagName() == "krecipes-ingredients" ) { readIngredients( el.childNodes(), &recipe ); } if ( el.tagName() == "krecipes-instructions" ) { recipe.instructions = el.text().trimmed(); } if ( el.tagName() == "krecipes-ratings" ) { readRatings( el.childNodes(), &recipe ); } } add ( recipe ); } else if ( krecipe.tagName() == "krecipes-category-structure" ) { CategoryTree * tree = new CategoryTree; readCategoryStructure( l, tree ); setCategoryStructure( tree ); } } } if ( unlink ) { file->remove (); } }