/* * * $Id: sourceheader 511311 2006-02-19 14:51:05Z trueg $ * Copyright (C) 2006 Sebastian Trueg * * This file is part of the K3b project. * Copyright (C) 1998-2007 Sebastian Trueg * * 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. * See the file "COPYING" for the exact licensing terms. */ #include "k3bdatapreparationjob.h" #include "k3bdatadoc.h" #include "k3bisooptions.h" #include #include #include #include #include #include #include #include #include class K3bDataPreparationJob::Private : public K3bThread { public: Private( K3bDataDoc* doc ); void run(); void cancel(); K3bDataDoc* doc; TQValueList nonExistingItems; TQString listOfRenamedItems; TQValueList folderSymLinkItems; K3bThreadJob* threadJob; bool canceled; }; K3bDataPreparationJob::Private::Private( K3bDataDoc* _doc ) : doc(_doc) { } void K3bDataPreparationJob::Private::run() { emitStarted(); // clean up nonExistingItems.clear(); listOfRenamedItems.truncate(0); folderSymLinkItems.clear(); // initialize filenames in the project doc->prepareFilenames(); // create the message string for the renamed files if( doc->needToCutFilenames() ) { int maxlines = 10; TQValueList::const_iterator it; for( it = doc->needToCutFilenameItems().begin(); maxlines > 0 && it != doc->needToCutFilenameItems().end(); ++it, --maxlines ) { K3bDataItem* item = *it; listOfRenamedItems += i18n("%1 renamed to %2") .arg( KStringHandler::csqueeze( item->k3bName(), 30 ) ) .arg( KStringHandler::csqueeze( item->writtenName(), 30 ) ); listOfRenamedItems += "
"; } if( it != doc->needToCutFilenameItems().end() ) listOfRenamedItems += "..."; } // // Check for missing files and folder symlinks // K3bDataItem* item = doc->root(); while( (item = item->nextSibling()) ) { if( item->isSymLink() ) { if( doc->isoOptions().followSymbolicLinks() ) { TQFileInfo f( K3b::resolveLink( item->localPath() ) ); if( !f.exists() ) { nonExistingItems.append( item ); } else if( f.isDir() ) { folderSymLinkItems.append( item ); } } } else if( item->isFile() && !TQFile::exists( item->localPath() ) ) { nonExistingItems.append( item ); } if( canceled ) { emitCanceled(); emitFinished(false); return; } } emitFinished( true ); } void K3bDataPreparationJob::Private::cancel() { canceled = true; } static TQString createItemsString( const TQValueList& items, unsigned int max ) { TQString s; unsigned int cnt = 0; for( TQValueList::const_iterator it = items.begin(); it != items.end(); ++it ) { s += KStringHandler::csqueeze( (*it)->localPath(), 60 ); ++cnt; if( cnt >= max || it == items.end() ) break; s += "
"; } if( items.count() > max ) s += "..."; return s; } K3bDataPreparationJob::K3bDataPreparationJob( K3bDataDoc* doc, K3bJobHandler* hdl, TQObject* parent ) : K3bJob( hdl, parent ) { d = new Private( doc ); d->threadJob = new K3bThreadJob( d, this, this ); connectSubJob( d->threadJob, TQT_SLOT(slotWorkDone(bool)), K3bJob::DEFAULT_SIGNAL_CONNECTION ); } K3bDataPreparationJob::~K3bDataPreparationJob() { delete d; } void K3bDataPreparationJob::start() { if( !active() ) { d->canceled = false; jobStarted(); d->threadJob->start(); } } void K3bDataPreparationJob::slotWorkDone( bool success ) { if( success ) { if( !d->listOfRenamedItems.isEmpty() ) { if( !questionYesNo( "

" + i18n("Some filenames need to be shortened due to the %1 char restriction " "of the Joliet extensions. If the Joliet extensions are disabled filenames " "do not have to be shortened but long filenames will not be available on " "Windows systems.") .arg( d->doc->isoOptions().jolietLong() ? 103 : 64 ) + "

" + d->listOfRenamedItems, i18n("Warning"), i18n("Shorten Filenames"), i18n("Disable Joliet extensions") ) ) { // No -> disable joliet // for now we enable RockRidge to be sure we did not lie above (keep long filenames) K3bIsoOptions op = d->doc->isoOptions(); op.setCreateJoliet( false ); op.setCreateRockRidge( true ); d->doc->setIsoOptions( op ); d->doc->prepareFilenames(); } } // // The joliet extension encodes the volume desc in UCS-2, i.e. uses 16 bit for each char. // Thus, the max length here is 16. // if( d->doc->isoOptions().createJoliet() && d->doc->isoOptions().volumeID().length() > 16 ) { if( !questionYesNo( "

" + i18n("The Joliet extensions (which are needed for long filenames on Windows systems) " "restrict the length of the volume descriptior (the name of the filesystem) " "to %1 characters. The selected descriptor '%2' is longer than that. Do you " "want it to be cut or do you want to go back and change it manually?") .arg( 16 ).arg( d->doc->isoOptions().volumeID() ), i18n("Warning"), i18n("Cut volume descriptor in the Joliet tree"), i18n("Cancel and go back") ) ) { d->canceled = true; emit canceled(); jobFinished( false ); return; } } // // Check for missing files // if( !d->nonExistingItems.isEmpty() ) { if( questionYesNo( "

" + i18n("The following files could not be found. Do you want to remove them from the " "project and continue without adding them to the image?") + "

" + createItemsString( d->nonExistingItems, 10 ), i18n("Warning"), i18n("Remove missing files and continue"), i18n("Cancel and go back") ) ) { for( TQValueList::const_iterator it = d->nonExistingItems.begin(); it != d->nonExistingItems.end(); ++it ) { delete *it; } } else { d->canceled = true; emit canceled(); jobFinished(false); return; } } // // Warn about symlinks to folders // if( d->doc->isoOptions().followSymbolicLinks() && !d->folderSymLinkItems.isEmpty() ) { if( !questionYesNo( "

" + i18n("K3b is not able to follow symbolic links to folders after they have been added " "to the project. Do you want to continue " "without writing the symbolic links to the image?") + "

" + createItemsString( d->folderSymLinkItems, 10 ), i18n("Warning"), i18n("Discard symbolic links to folders"), i18n("Cancel and go back") ) ) { d->canceled = true; emit canceled(); jobFinished(false); return; } } jobFinished( true ); } else { if( d->canceled ) emit canceled(); jobFinished(false); } } void K3bDataPreparationJob::cancel() { d->cancel(); } bool K3bDataPreparationJob::hasBeenCanceled() const { return d->canceled; } #include "k3bdatapreparationjob.moc"