summaryrefslogtreecommitdiffstats
path: root/src/misc/k3bdvdcopydialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/misc/k3bdvdcopydialog.cpp')
-rw-r--r--src/misc/k3bdvdcopydialog.cpp455
1 files changed, 455 insertions, 0 deletions
diff --git a/src/misc/k3bdvdcopydialog.cpp b/src/misc/k3bdvdcopydialog.cpp
new file mode 100644
index 0000000..f93abba
--- /dev/null
+++ b/src/misc/k3bdvdcopydialog.cpp
@@ -0,0 +1,455 @@
+/*
+ *
+ * $Id: k3bdvdcopydialog.cpp 733470 2007-11-06 12:10:29Z trueg $
+ * Copyright (C) 2003 Sebastian Trueg <trueg@k3b.org>
+ *
+ * This file is part of the K3b project.
+ * Copyright (C) 1998-2007 Sebastian Trueg <trueg@k3b.org>
+ *
+ * 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 "k3bdvdcopydialog.h"
+#include "k3bdvdcopyjob.h"
+
+#include <k3btempdirselectionwidget.h>
+#include <k3bwriterselectionwidget.h>
+#include <k3bglobals.h>
+#include <k3bstdguiitems.h>
+#include <k3bmediaselectioncombobox.h>
+#include <k3bdevice.h>
+#include <k3bdevicemanager.h>
+#include <k3bexternalbinmanager.h>
+#include <k3bburnprogressdialog.h>
+#include <k3bwritingmodewidget.h>
+#include <k3bthememanager.h>
+#include <k3bapplication.h>
+#include <k3bmediacache.h>
+#include <k3biso9660.h>
+
+#include <qlayout.h>
+#include <qgroupbox.h>
+#include <qcheckbox.h>
+#include <qlabel.h>
+#include <qtabwidget.h>
+#include <qspinbox.h>
+#include <qptrlist.h>
+#include <qfile.h>
+#include <qpushbutton.h>
+#include <qtooltip.h>
+#include <qwhatsthis.h>
+#include <qhbox.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <kconfig.h>
+#include <kapplication.h>
+#include <kstandarddirs.h>
+#include <kiconloader.h>
+#include <kmessagebox.h>
+#include <kglobal.h>
+
+
+
+K3bDvdCopyDialog::K3bDvdCopyDialog( QWidget* parent, const char* name, bool modal )
+ : K3bInteractionDialog( parent, name,
+ i18n("DVD Copy"),
+ i18n("No video transcoding!"),
+ START_BUTTON|CANCEL_BUTTON,
+ START_BUTTON,
+ "default dvd copy settings",
+ modal )
+{
+ QWidget* w = mainWidget();
+
+ //
+ // Source group
+ // //////////////////////////////////////////////////////////////////////////
+ QGroupBox* groupSource = new QGroupBox( 1, Qt::Vertical, i18n("Source Medium"), w );
+ groupSource->setInsideSpacing( spacingHint() );
+ groupSource->setInsideMargin( marginHint() );
+ m_comboSourceDevice = new K3bMediaSelectionComboBox( groupSource );
+ m_comboSourceDevice->setWantedMediumType( K3bDevice::MEDIA_WRITABLE_DVD|K3bDevice::MEDIA_DVD_ROM );
+ m_comboSourceDevice->setWantedMediumState( K3bDevice::STATE_COMPLETE|K3bDevice::STATE_INCOMPLETE );
+ // //////////////////////////////////////////////////////////////////////////
+
+ //
+ // Writer group
+ // //////////////////////////////////////////////////////////////////////////
+ m_writerSelectionWidget = new K3bWriterSelectionWidget( w );
+ m_writerSelectionWidget->setSupportedWritingApps( K3b::GROWISOFS );
+ m_writerSelectionWidget->setWantedMediumType( K3bDevice::MEDIA_WRITABLE_DVD );
+ m_writerSelectionWidget->setWantedMediumState( K3bDevice::STATE_EMPTY );
+ // //////////////////////////////////////////////////////////////////////////
+
+ //
+ // Option tab
+ // //////////////////////////////////////////////////////////////////////////
+ QTabWidget* tabWidget = new QTabWidget( w );
+
+ // option tab --------------------
+ QWidget* optionTab = new QWidget( tabWidget );
+ QGridLayout* optionTabGrid = new QGridLayout( optionTab );
+ optionTabGrid->setSpacing( spacingHint() );
+ optionTabGrid->setMargin( marginHint() );
+
+ QGroupBox* groupWritingMode = new QGroupBox( 1, Qt::Vertical, i18n("Writing Mode"), optionTab );
+ groupWritingMode->setInsideMargin( marginHint() );
+ m_writingModeWidget = new K3bWritingModeWidget( groupWritingMode );
+
+ QGroupBox* groupOptions = new QGroupBox( 5, Qt::Vertical, i18n("Settings"), optionTab );
+ groupOptions->setInsideSpacing( spacingHint() );
+ groupOptions->setInsideMargin( marginHint() );
+ m_checkSimulate = K3bStdGuiItems::simulateCheckbox( groupOptions );
+ m_checkCacheImage = K3bStdGuiItems::createCacheImageCheckbox( groupOptions );
+ m_checkOnlyCreateImage = K3bStdGuiItems::onlyCreateImagesCheckbox( groupOptions );
+ m_checkDeleteImages = K3bStdGuiItems::removeImagesCheckbox( groupOptions );
+ m_checkVerifyData = K3bStdGuiItems::verifyCheckBox( groupOptions );
+
+ QGroupBox* groupCopies = new QGroupBox( 2, Qt::Horizontal, i18n("Copies"), optionTab );
+ groupCopies->setInsideSpacing( spacingHint() );
+ groupCopies->setInsideMargin( marginHint() );
+ QLabel* pixLabel = new QLabel( groupCopies );
+ pixLabel->setPixmap( SmallIcon( "cdcopy", KIcon::SizeMedium ) );
+ pixLabel->setScaledContents( false );
+ m_spinCopies = new QSpinBox( groupCopies );
+ m_spinCopies->setMinValue( 1 );
+ m_spinCopies->setMaxValue( 999 );
+
+ optionTabGrid->addWidget( groupWritingMode, 0, 0 );
+ optionTabGrid->addMultiCellWidget( groupOptions, 0, 1, 1, 1 );
+ optionTabGrid->addWidget( groupCopies, 1, 0 );
+ optionTabGrid->setRowStretch( 1, 1 );
+ optionTabGrid->setColStretch( 1, 1 );
+
+ tabWidget->addTab( optionTab, i18n("&Options") );
+
+
+ //
+ // Image tab
+ // //////////////////////////////////////////////////////////////////////////
+ QWidget* imageTab = new QWidget( tabWidget );
+ QGridLayout* imageTabGrid = new QGridLayout( imageTab );
+ imageTabGrid->setSpacing( spacingHint() );
+ imageTabGrid->setMargin( marginHint() );
+
+ m_tempDirSelectionWidget = new K3bTempDirSelectionWidget( imageTab );
+ m_tempDirSelectionWidget->setSelectionMode( K3bTempDirSelectionWidget::FILE );
+
+ imageTabGrid->addWidget( m_tempDirSelectionWidget, 0, 0 );
+
+ tabWidget->addTab( imageTab, i18n("&Image") );
+
+
+ //
+ // advanced tab ------------------
+ // //////////////////////////////////////////////////////////////////////////
+ QWidget* advancedTab = new QWidget( tabWidget );
+ QGridLayout* advancedTabGrid = new QGridLayout( advancedTab );
+ advancedTabGrid->setSpacing( spacingHint() );
+ advancedTabGrid->setMargin( marginHint() );
+
+ QGroupBox* groupGeneral = new QGroupBox( 2, Qt::Vertical, i18n("General"), advancedTab );
+ groupGeneral->setInsideSpacing( spacingHint() );
+ groupGeneral->setInsideMargin( marginHint() );
+ QHBox* box = new QHBox( groupGeneral );
+ box->setSpacing( spacingHint() );
+ box->setStretchFactor( new QLabel( i18n("Read retries:"), box ), 1 );
+ m_spinRetries = new QSpinBox( 1, 128, 1, box );
+ m_checkIgnoreReadErrors = new QCheckBox( i18n("Ignore read errors"), groupGeneral );
+
+ advancedTabGrid->addWidget( groupGeneral, 0, 0 );
+
+ tabWidget->addTab( advancedTab, i18n("&Advanced") );
+ // //////////////////////////////////////////////////////////////////////////
+
+
+ //
+ // setup layout
+ // //////////////////////////////////////////////////////////////////////////
+ QGridLayout* grid = new QGridLayout( w );
+ grid->setMargin( 0 );
+ grid->setSpacing( spacingHint() );
+
+ grid->addWidget( groupSource, 0, 0 );
+ grid->addWidget( m_writerSelectionWidget, 1, 0 );
+ grid->addWidget( tabWidget, 2, 0 );
+ grid->setRowStretch( 2, 1 );
+ // //////////////////////////////////////////////////////////////////////////
+
+
+ // tab order
+ setTabOrder( m_writingModeWidget, m_spinCopies );
+ setTabOrder( m_spinCopies, groupOptions );
+
+
+ //
+ // setup connections
+ // //////////////////////////////////////////////////////////////////////////
+ connect( m_writerSelectionWidget, SIGNAL(writerChanged()), this, SLOT(slotToggleAll()) );
+ connect( m_comboSourceDevice, SIGNAL(selectionChanged(K3bDevice::Device*)), this, SLOT(slotToggleAll()) );
+ connect( m_comboSourceDevice, SIGNAL(selectionChanged(K3bDevice::Device*)),
+ this, SLOT(slotSourceMediumChanged(K3bDevice::Device*)) );
+ connect( m_checkSimulate, SIGNAL(toggled(bool)), this, SLOT(slotToggleAll()) );
+ connect( m_checkCacheImage, SIGNAL(toggled(bool)), this, SLOT(slotToggleAll()) );
+ connect( m_checkOnlyCreateImage, SIGNAL(toggled(bool)), this, SLOT(slotToggleAll()) );
+ connect( m_writingModeWidget, SIGNAL(writingModeChanged(int)), this, SLOT(slotToggleAll()) );
+
+ QToolTip::add( m_checkIgnoreReadErrors, i18n("Skip unreadable sectors") );
+ QWhatsThis::add( m_checkIgnoreReadErrors, i18n("<p>If this option is checked and K3b is not able to read a sector from the "
+ "source CD/DVD it will be replaced with zeros on the resulting copy.") );
+}
+
+
+K3bDvdCopyDialog::~K3bDvdCopyDialog()
+{
+}
+
+
+void K3bDvdCopyDialog::init()
+{
+ slotSourceMediumChanged( m_comboSourceDevice->selectedDevice() );
+}
+
+
+void K3bDvdCopyDialog::setReadingDevice( K3bDevice::Device* dev )
+{
+ m_comboSourceDevice->setSelectedDevice( dev );
+}
+
+
+K3bDevice::Device* K3bDvdCopyDialog::readingDevice() const
+{
+ return m_comboSourceDevice->selectedDevice();
+}
+
+
+void K3bDvdCopyDialog::slotStartClicked()
+{
+ //
+ // Let's check the available size
+ //
+ if( m_checkCacheImage->isChecked() || m_checkOnlyCreateImage->isChecked() ) {
+ if( neededSize()/1024 > m_tempDirSelectionWidget->freeTempSpace() ) {
+ if( KMessageBox::warningContinueCancel( this, i18n("There seems to be not enough free space in temporary directory. "
+ "Write anyway?") ) == KMessageBox::Cancel )
+ return;
+ }
+ }
+
+ //
+ // The job asks if we want to overwrite.
+ //
+
+ K3bJobProgressDialog* dlg = 0;
+ if( m_checkOnlyCreateImage->isChecked() ) {
+ dlg = new K3bJobProgressDialog( kapp->mainWidget() );
+ }
+ else {
+ dlg = new K3bBurnProgressDialog( kapp->mainWidget() );
+ }
+
+ K3bDvdCopyJob* job = new K3bDvdCopyJob( dlg, this );
+
+ job->setWriterDevice( m_writerSelectionWidget->writerDevice() );
+ job->setReaderDevice( m_comboSourceDevice->selectedDevice() );
+ job->setImagePath( m_tempDirSelectionWidget->tempPath() );
+ job->setRemoveImageFiles( m_checkDeleteImages->isChecked() && !m_checkOnlyCreateImage->isChecked() );
+ job->setOnlyCreateImage( m_checkOnlyCreateImage->isChecked() );
+ job->setSimulate( m_checkSimulate->isChecked() );
+ job->setOnTheFly( !m_checkCacheImage->isChecked() );
+ job->setWriteSpeed( m_writerSelectionWidget->writerSpeed() );
+ job->setCopies( m_checkSimulate->isChecked() ? 1 : m_spinCopies->value() );
+ job->setWritingMode( m_writingModeWidget->writingMode() );
+ job->setIgnoreReadErrors( m_checkIgnoreReadErrors->isChecked() );
+ job->setReadRetries( m_spinRetries->value() );
+ job->setVerifyData( m_checkVerifyData->isChecked() );
+
+ if( !exitLoopOnHide() )
+ hide();
+
+ dlg->startJob( job );
+
+ delete dlg;
+ delete job;
+
+ if( KConfigGroup( k3bcore->config(), "General Options" ).readBoolEntry( "keep action dialogs open", false ) &&
+ !exitLoopOnHide() )
+ show();
+ else
+ close();
+}
+
+
+void K3bDvdCopyDialog::loadUserDefaults( KConfigBase* c )
+{
+ m_comboSourceDevice->setSelectedDevice( k3bcore->deviceManager()->findDevice( c->readEntry( "source_device" ) ) );
+
+ m_writerSelectionWidget->loadConfig( c );
+
+ m_writingModeWidget->loadConfig( c );
+
+ m_tempDirSelectionWidget->readConfig( c );
+
+ m_checkSimulate->setChecked( c->readBoolEntry( "simulate", false ) );
+ m_checkCacheImage->setChecked( !c->readBoolEntry( "on_the_fly", false ) );
+ m_checkOnlyCreateImage->setChecked( c->readBoolEntry( "only_create_image", false ) );
+ m_checkDeleteImages->setChecked( c->readBoolEntry( "remove_image", true ) );
+ m_checkIgnoreReadErrors->setChecked( c->readBoolEntry( "ignore read errors", false ) );
+ m_spinRetries->setValue( c->readNumEntry( "retries", 128 ) );
+ m_spinCopies->setValue( c->readNumEntry( "copies", 1 ) );
+ m_checkVerifyData->setChecked( c->readBoolEntry( "verify data", false ) );
+
+ slotToggleAll();
+}
+
+
+void K3bDvdCopyDialog::saveUserDefaults( KConfigBase* c )
+{
+ m_tempDirSelectionWidget->saveConfig();
+
+ m_writingModeWidget->saveConfig( c );
+ m_tempDirSelectionWidget->saveConfig( c );
+
+ c->writeEntry( "source_device", m_comboSourceDevice->selectedDevice() ? m_comboSourceDevice->selectedDevice()->devicename() : QString() );
+
+ c->writeEntry( "simulate", m_checkSimulate->isChecked() );
+ c->writeEntry( "on_the_fly", !m_checkCacheImage->isChecked() );
+ c->writeEntry( "only_create_image", m_checkOnlyCreateImage->isChecked() );
+ c->writeEntry( "remove_image", m_checkDeleteImages->isChecked() );
+ c->writeEntry( "ignore read errors", m_checkIgnoreReadErrors->isChecked() );
+ c->writeEntry( "retries", m_spinRetries->value() );
+ c->writeEntry( "copies", m_spinCopies->value() );
+ c->writeEntry( "verify data", m_checkVerifyData->isChecked() );
+
+ m_writerSelectionWidget->saveConfig( c );
+
+ if( m_tempDirSelectionWidget->isEnabled() )
+ m_tempDirSelectionWidget->saveConfig();
+}
+
+
+void K3bDvdCopyDialog::loadK3bDefaults()
+{
+ m_writerSelectionWidget->loadDefaults();
+ m_tempDirSelectionWidget->setTempPath( K3b::defaultTempPath() );
+
+ m_writingModeWidget->setWritingMode( K3b::WRITING_MODE_AUTO );
+
+ m_checkSimulate->setChecked( false );
+ m_checkCacheImage->setChecked( true );
+ m_checkOnlyCreateImage->setChecked( false );
+ m_checkDeleteImages->setChecked( true );
+ m_checkIgnoreReadErrors->setChecked(false);
+ m_spinCopies->setValue( 1 );
+ m_spinRetries->setValue(128);
+ m_checkVerifyData->setChecked( false );
+
+ slotToggleAll();
+}
+
+
+void K3bDvdCopyDialog::toggleAll()
+{
+ updateOverrideDevice();
+
+ m_checkSimulate->setDisabled( m_checkOnlyCreateImage->isChecked() );
+ m_checkCacheImage->setDisabled( m_checkOnlyCreateImage->isChecked() );
+
+ K3bDevice::Device* dev = m_writerSelectionWidget->writerDevice();
+ if( dev ) {
+ // select the proper writing modes
+ // if writing and reading devices are the same we cannot use
+ // K3bWritingModeWidget::determineSupportedModesFromMedium since the inserted medium is not the one we
+ // will be using for burning. In that case we go the old fashioned way.
+ if( dev == m_comboSourceDevice->selectedDevice() ) {
+ int modes = 0;
+ if( dev->type() & (K3bDevice::DVDR|K3bDevice::DVDRW) ) {
+ modes |= K3b::DAO|K3b::WRITING_MODE_RES_OVWR;
+ if( dev->featureCurrent( K3bDevice::FEATURE_INCREMENTAL_STREAMING_WRITABLE ) != 0 )
+ modes |= K3b::WRITING_MODE_INCR_SEQ;
+ }
+
+ m_writingModeWidget->setSupportedModes( modes );
+ m_checkSimulate->setDisabled( m_checkOnlyCreateImage->isChecked() );
+ }
+ else {
+ m_writingModeWidget->determineSupportedModesFromMedium( dev );
+
+ if( k3bappcore->mediaCache()->diskInfo( dev ).mediaType() & K3bDevice::MEDIA_DVD_PLUS_ALL ) {
+ // no simulation support for DVD+R(W) media
+ m_checkSimulate->setChecked(false);
+ m_checkSimulate->setEnabled(false);
+ }
+ else {
+ m_checkSimulate->setDisabled( m_checkOnlyCreateImage->isChecked() );
+ }
+ }
+ }
+
+
+
+ m_writingModeWidget->setDisabled( m_checkOnlyCreateImage->isChecked() );
+ m_writerSelectionWidget->setDisabled( m_checkOnlyCreateImage->isChecked() );
+ m_tempDirSelectionWidget->setDisabled( !m_checkCacheImage->isChecked() && !m_checkOnlyCreateImage->isChecked() );
+ m_writingModeWidget->setDisabled( m_checkOnlyCreateImage->isChecked() );
+ m_checkDeleteImages->setDisabled( m_checkOnlyCreateImage->isChecked() || !m_checkCacheImage->isChecked() );
+ m_spinCopies->setDisabled( m_checkSimulate->isChecked() || m_checkOnlyCreateImage->isChecked() );
+ m_checkVerifyData->setDisabled( m_checkOnlyCreateImage->isChecked() || m_checkSimulate->isChecked() );
+
+ setButtonEnabled( START_BUTTON, m_comboSourceDevice->selectedDevice() &&
+ (dev || m_checkOnlyCreateImage->isChecked()) );
+}
+
+
+void K3bDvdCopyDialog::slotSourceMediumChanged( K3bDevice::Device* dev )
+{
+ updateOverrideDevice();
+
+ K3bMedium medium = k3bappcore->mediaCache()->medium( dev );
+
+ m_writerSelectionWidget->setWantedMediumType( k3bappcore->mediaCache()->diskInfo( dev ).numLayers() > 1 &&
+ k3bappcore->mediaCache()->diskInfo( dev ).size().mode1Bytes() > 4700372992LL
+ ? K3bDevice::MEDIA_WRITABLE_DVD_DL
+ : K3bDevice::MEDIA_WRITABLE_DVD_SL );
+
+ m_tempDirSelectionWidget->setNeededSize( neededSize() );
+
+ m_tempDirSelectionWidget->setDefaultImageFileName( medium.volumeId().lower() + ".iso" );
+
+ toggleAll();
+}
+
+
+void K3bDvdCopyDialog::updateOverrideDevice()
+{
+ if( !m_checkCacheImage->isChecked() ) {
+ m_writerSelectionWidget->setOverrideDevice( 0 );
+ m_writerSelectionWidget->setIgnoreDevice( m_comboSourceDevice->selectedDevice() );
+ }
+ else {
+ m_writerSelectionWidget->setIgnoreDevice( 0 );
+ m_writerSelectionWidget->setOverrideDevice( m_comboSourceDevice->selectedDevice(),
+ i18n("Use the same device for burning"),
+ i18n("<qt>Use the same device for burning <i>(Or insert another medium)</i>") );
+ }
+}
+
+
+KIO::filesize_t K3bDvdCopyDialog::neededSize() const
+{
+ K3bMedium medium = k3bappcore->mediaCache()->medium( m_comboSourceDevice->selectedDevice() );
+
+ if( medium.diskInfo().diskState() == K3bDevice::STATE_NO_MEDIA )
+ return 0;
+ else if( medium.diskInfo().mediaType() & (K3bDevice::MEDIA_DVD_RW_OVWR|K3bDevice::MEDIA_DVD_PLUS_RW) )
+ return (KIO::filesize_t)medium.iso9660Descriptor().volumeSpaceSize * (KIO::filesize_t)2048;
+ else
+ return medium.diskInfo().size().mode1Bytes();
+}
+
+#include "k3bdvdcopydialog.moc"