void K3bDataUrlAddingDialog::slotCopyMoveItems() { if( m_bCanceled ) return; // // Pop first item from the item list // K3bDataItem* item = m_items.first().first; K3bDirItem* dir = m_items.first().second; m_items.remove( m_items.begin() ); ++m_filesHandled; m_infoLabel->setText( item->k3bPath() ); if( m_totalFiles == 0 ) m_counterLabel->setText( QString("(%1)").arg(m_filesHandled) ); else m_counterLabel->setText( QString("(%1/%2)").arg(m_filesHandled).arg(m_totalFiles) ); if( dir == item->parent() ) { kdDebug() << "(K3bDataUrlAddingDialog) trying to move an item into its own parent dir." << endl; } else if( dir == item ) { kdDebug() << "(K3bDataUrlAddingDialog) trying to move an item into itselft." << endl; } else { // // Let's see if an item with that name alredy exists // if( K3bDataItem* oldItem = dir->find( item->k3bName() ) ) { // // reuse an existing dir: move all child items into the old dir // if( oldItem->isDir() && item->isDir() ) { const QPtrList<K3bDataItem>& cl = dynamic_cast<K3bDirItem*>( item )->children(); for( QPtrListIterator<K3bDataItem> it( cl ); *it; ++it ) m_items.append( qMakePair( *it, dynamic_cast<K3bDirItem*>( oldItem ) ) ); // FIXME: we need to remove the old dir item } // // we cannot replace files in the old session with dirs and vice versa (I think) // files are handled in K3bFileItem constructor and dirs handled above // else if( oldItem->isFromOldSession() && item->isDir() != oldItem->isDir() ) { QString newName; if( getNewName( newName, dir, newName ) ) { if( m_copyItems ) item = item->copy(); item->setK3bName( newName ); dir->addDataItem( item ); } } else if( m_bExistingItemsReplaceAll ) { // // if we replace an item from an old session K3bDirItem::addDataItem takes care // of replacing the item // if( !oldItem->isFromOldSession() ) delete oldItem; if( m_copyItems ) item = item->copy(); dir->addDataItem( item ); } else if( !m_bExistingItemsIgnoreAll ) { switch( K3bMultiChoiceDialog::choose( i18n("File already exists"), i18n("<p>File <em>%1</em> already exists in " "project folder <em>%2</em>.") .arg( item->k3bName() ) .arg("/" + dir->k3bPath()), QMessageBox::Warning, this, 0, 6, KGuiItem( i18n("Replace"), QString::null, i18n("Replace the existing file") ), KGuiItem( i18n("Replace All"), QString::null, i18n("Always replace existing files") ), KGuiItem( i18n("Ignore"), QString::null, i18n("Keep the existing file") ), KGuiItem( i18n("Ignore All"), QString::null, i18n("Always keep the existing file") ), KGuiItem( i18n("Rename"), QString::null, i18n("Rename the new file") ), KStdGuiItem::cancel() ) ) { case 2: // replace all m_bExistingItemsReplaceAll = true; // fallthrough case 1: // replace // // if we replace an item from an old session K3bDirItem::addDataItem takes care // of replacing the item // if( !oldItem->isFromOldSession() ) delete oldItem; if( m_copyItems ) item = item->copy(); dir->addDataItem( item ); break; case 4: // ignore all m_bExistingItemsIgnoreAll = true; // fallthrough case 3: // ignore // do nothing break; case 5: {// rename QString newName; if( getNewName( newName, dir, newName ) ) { if( m_copyItems ) item = item->copy(); item->setK3bName( newName ); dir->addDataItem( item ); } break; } case 6: // cancel slotCancel(); return; } } } // // No old item with the same name // else { if( m_copyItems ) item = item->copy(); dir->addDataItem( item ); } } if( m_items.isEmpty() ) { m_dirSizeJob->cancel(); accept(); } else { updateProgress(); QTimer::singleShot( 0, this, SLOT(slotCopyMoveItems()) ); } }
int K3bIsoImager::writePathSpecForDir( K3bDirItem* dirItem, QTextStream& stream ) { if( !m_noDeepDirectoryRelocation && dirItem->depth() > 7 ) { kdDebug() << "(K3bIsoImager) found directory depth > 7. Enabling no deep directory relocation." << endl; m_noDeepDirectoryRelocation = true; } // now create the graft points int num = 0; for( QPtrListIterator<K3bDataItem> it( dirItem->children() ); it.current(); ++it ) { K3bDataItem* item = it.current(); bool writeItem = item->writeToCd(); if( item->isSymLink() ) { if( d->usedLinkHandling == Private::DISCARD_ALL || ( d->usedLinkHandling == Private::DISCARD_BROKEN && !item->isValid() ) ) writeItem = false; else if( d->usedLinkHandling == Private::FOLLOW ) { QFileInfo f( K3b::resolveLink( item->localPath() ) ); if( !f.exists() ) { emit infoMessage( i18n("Could not follow link %1 to non-existing file %2. Skipping...") .arg(item->k3bName()) .arg(f.filePath()), WARNING ); writeItem = false; } else if( f.isDir() ) { emit infoMessage( i18n("Ignoring link %1 to folder %2. K3b is unable to follow links to folders.") .arg(item->k3bName()) .arg(f.filePath()), WARNING ); writeItem = false; } } } else if( item->isFile() ) { QFileInfo f( item->localPath() ); if( !f.exists() ) { emit infoMessage( i18n("Could not find file %1. Skipping...").arg(item->localPath()), WARNING ); writeItem = false; } else if( !f.isReadable() ) { emit infoMessage( i18n("Could not read file %1. Skipping...").arg(item->localPath()), WARNING ); writeItem = false; } } if( writeItem ) { num++; // some versions of mkisofs seem to have a bug that prevents to use filenames // that contain one or more backslashes if( item->writtenPath().contains("\\") ) m_containsFilesWithMultibleBackslashes = true; if( item->isDir() ) { stream << escapeGraftPoint( item->writtenPath() ) << "=" << escapeGraftPoint( dummyDir( static_cast<K3bDirItem*>(item) ) ) << "\n"; int x = writePathSpecForDir( dynamic_cast<K3bDirItem*>(item), stream ); if( x >= 0 ) num += x; else return -1; } else { writePathSpecForFile( static_cast<K3bFileItem*>(item), stream ); } } } return num; }