summaryrefslogtreecommitdiffstats
path: root/libk3b/projects/videodvd/k3bvideodvdimager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libk3b/projects/videodvd/k3bvideodvdimager.cpp')
-rw-r--r--libk3b/projects/videodvd/k3bvideodvdimager.cpp221
1 files changed, 221 insertions, 0 deletions
diff --git a/libk3b/projects/videodvd/k3bvideodvdimager.cpp b/libk3b/projects/videodvd/k3bvideodvdimager.cpp
new file mode 100644
index 0000000..7362aa0
--- /dev/null
+++ b/libk3b/projects/videodvd/k3bvideodvdimager.cpp
@@ -0,0 +1,221 @@
+/*
+ *
+ * $Id: k3bvideodvdimager.cpp 633751 2007-02-15 08:22:49Z trueg $
+ * Copyright (C) 2004-2007 Sebastian Trueg <[email protected]>
+ *
+ * This file is part of the K3b project.
+ * Copyright (C) 1998-2007 Sebastian Trueg <[email protected]>
+ *
+ * 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 "k3bvideodvdimager.h"
+#include "k3bvideodvddoc.h"
+#include <k3bdiritem.h>
+#include <k3bfileitem.h>
+#include <k3bprocess.h>
+#include <k3bglobals.h>
+
+#include <ktempfile.h>
+#include <kglobal.h>
+#include <kstandarddirs.h>
+#include <kdebug.h>
+#include <klocale.h>
+
+#include <qtextstream.h>
+#include <qdir.h>
+#include <qfile.h>
+#include <qptrlist.h>
+
+
+
+class K3bVideoDvdImager::Private
+{
+public:
+ K3bVideoDvdDoc* doc;
+
+ QString tempPath;
+};
+
+
+K3bVideoDvdImager::K3bVideoDvdImager( K3bVideoDvdDoc* doc, K3bJobHandler* jh, QObject* parent, const char* name )
+ : K3bIsoImager( doc, jh, parent, name )
+{
+ d = new Private;
+ d->doc = doc;
+}
+
+
+K3bVideoDvdImager::~K3bVideoDvdImager()
+{
+ delete d;
+}
+
+
+void K3bVideoDvdImager::start()
+{
+ fixVideoDVDSettings();
+ K3bIsoImager::start();
+}
+
+
+void K3bVideoDvdImager::init()
+{
+ fixVideoDVDSettings();
+ K3bIsoImager::init();
+}
+
+
+void K3bVideoDvdImager::fixVideoDVDSettings()
+{
+ // Video DVD defaults, we cannot set these in K3bVideoDvdDoc since they
+ // will be overwritten in the burn dialog unless we create some K3bVideoDVDIsoOptions
+ // class with different defaults. But since the whole Video DVD project is a hack we
+ // go the easy road.
+ K3bIsoOptions o = d->doc->isoOptions();
+ o.setISOLevel(1);
+ o.setISOallow31charFilenames(false);
+ o.setCreateJoliet(false);
+ o.setJolietLong(false);
+ o.setCreateRockRidge(false);
+ o.setCreateUdf(true);
+ d->doc->setIsoOptions( o );
+}
+
+
+void K3bVideoDvdImager::calculateSize()
+{
+ fixVideoDVDSettings();
+ K3bIsoImager::calculateSize();
+}
+
+
+int K3bVideoDvdImager::writePathSpec()
+{
+ //
+ // Create a temp dir and link all contents of the VIDEO_TS dir to make mkisofs
+ // able to handle the VideoDVD stuff.
+ //
+ // mkisofs is not able to create VideoDVDs from graft-points.
+ //
+ // We do this here since K3bIsoImager::start calls cleanup which deletes the temp files
+ //
+ QDir dir( KGlobal::dirs()->resourceDirs( "tmp" ).first() );
+ d->tempPath = K3b::findUniqueFilePrefix( "k3bVideoDvd", dir.path() );
+ kdDebug() << "(K3bVideoDvdImager) creating temp dir: " << d->tempPath << endl;
+ if( !dir.mkdir( d->tempPath, true ) ) {
+ emit infoMessage( i18n("Unable to create temporary directory '%1'.").arg(d->tempPath), ERROR );
+ return -1;
+ }
+
+ dir.cd( d->tempPath );
+ if( !dir.mkdir( "VIDEO_TS" ) ) {
+ emit infoMessage( i18n("Unable to create temporary directory '%1'.").arg(d->tempPath + "/VIDEO_TS"), ERROR );
+ return -1;
+ }
+
+ for( QPtrListIterator<K3bDataItem> it( d->doc->videoTsDir()->children() ); *it; ++it ) {
+ if( (*it)->isDir() ) {
+ emit infoMessage( i18n("Found invalid entry in the VIDEO_TS folder (%1).").arg((*it)->k3bName()), ERROR );
+ return -1;
+ }
+
+ // convert to upper case names
+ if( ::symlink( QFile::encodeName( (*it)->localPath() ),
+ QFile::encodeName( d->tempPath + "/VIDEO_TS/" + (*it)->k3bName().upper() ) ) == -1 ) {
+ emit infoMessage( i18n("Unable to link temporary file in folder %1.").arg( d->tempPath ), ERROR );
+ return -1;
+ }
+ }
+
+
+ return K3bIsoImager::writePathSpec();
+}
+
+
+int K3bVideoDvdImager::writePathSpecForDir( K3bDirItem* dirItem, QTextStream& stream )
+{
+ //
+ // We handle the VIDEO_TS dir differently since otherwise mkisofs is not able to
+ // open the VideoDVD structures (see addMkisofsParameters)
+ //
+ if( dirItem == d->doc->videoTsDir() ) {
+ return 0;
+ }
+
+ int num = 0;
+ for( QPtrListIterator<K3bDataItem> it( dirItem->children() ); it.current(); ++it ) {
+ K3bDataItem* item = it.current();
+ num++;
+
+ if( item->isDir() ) {
+ // we cannot add the video_ts dir twice
+ if( item != d->doc->videoTsDir() ) {
+ 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;
+}
+
+
+bool K3bVideoDvdImager::addMkisofsParameters( bool printSize )
+{
+ // Here is another bad design: we assume that K3bIsoImager::start does not add additional
+ // parameters to the process. :(
+ if( K3bIsoImager::addMkisofsParameters( printSize ) ) {
+ *m_process << "-dvd-video";
+ *m_process << "-f"; // follow symlinks
+ *m_process << d->tempPath;
+ return true;
+ }
+ else
+ return false;
+}
+
+
+void K3bVideoDvdImager::cleanup()
+{
+ if( QFile::exists( d->tempPath ) ) {
+ QDir dir( d->tempPath );
+ dir.cd( "VIDEO_TS" );
+ for( QPtrListIterator<K3bDataItem> it( d->doc->videoTsDir()->children() ); *it; ++it )
+ dir.remove( (*it)->k3bName().upper() );
+ dir.cdUp();
+ dir.rmdir( "VIDEO_TS" );
+ dir.cdUp();
+ dir.rmdir( d->tempPath );
+ }
+ d->tempPath = QString::null;
+
+ K3bIsoImager::cleanup();
+}
+
+
+void K3bVideoDvdImager::slotReceivedStderr( const QString& line )
+{
+ if( line.contains( "Unable to make a DVD-Video image" ) ) {
+ emit infoMessage( i18n("The project does not contain all necessary VideoDVD files."), WARNING );
+ emit infoMessage( i18n("The resulting DVD will most likely not be playable on a Hifi DVD player."), WARNING );
+ }
+ else
+ K3bIsoImager::slotReceivedStderr( line );
+}
+
+#include "k3bvideodvdimager.moc"