Summary: | ripping to fat32 fails with illegal characters in filename | ||
---|---|---|---|
Product: | [Applications] k3b | Reporter: | Stefan Sieber <stesieber> |
Component: | Audio Project | Assignee: | Sebastian Trueg <trueg> |
Status: | RESOLVED FIXED | ||
Severity: | normal | ||
Priority: | NOR | ||
Version: | unspecified | ||
Target Milestone: | --- | ||
Platform: | Gentoo Packages | ||
OS: | Linux | ||
Latest Commit: | Version Fixed In: | ||
Sentry Crash Report: | |||
Attachments: | Dialog with error |
Description
Stefan Sieber
2005-06-17 18:01:03 UTC
Could you please check if this bug still occurs with the recent version of k3b (0.12.17 or 1.0pre2)? Confirmed on 1.0beta1. See screenshot. Created attachment 18657 [details]
Dialog with error
Occurs when ripping to smb mounted share, which has the same limitation as a
FAT partition.
This is all the debugging output I get: System ----------------------- K3b Version: 1.0beta1 KDE Version: 3.5.5 QT Version: 3.3.6 Kernel: 2.6.17-gentoo-r7 Devices ----------------------- MATSHITA DVD-RAM UJ-841S 1.20 (/dev/sr0, ) [CD-R, CD-RW, CD-ROM, DVD-ROM, DVD-R, DVD-RW, DVD+R, DVD+R DL] [DVD-ROM, DVD-R Sequential, DVD-R Dual Layer Sequential, DVD-RAM, DVD-RW Restricted Overwrite, DVD-RW Sequential, DVD+RW, DVD+R, CD-ROM, CD-R, CD-RW] [SAO, TAO, Restricted Overwrite] Idea to solve this (basicly just for me to remember it): Integrate filename charset checking and correction into K3bFileSplitter and rename it to K3bFile. my solution idea is no good. This way the app does not know which filename is really used which introduces problems for overwriting files especially. So I have no solution yet and postpone this one to K3b 2.0 SVN commit 618058 by trueg: Introducing simple FAT filesystem check which replaces invalid characters with "_". BUG: 107616 M +17 -2 libk3b/tools/k3bfilesysteminfo.cpp M +9 -0 libk3b/tools/k3bfilesysteminfo.h M +6 -5 src/rip/k3baudiorippingdialog.cpp M +15 -1 src/rip/videodvd/k3bvideodvdrippingdialog.cpp M +3 -0 src/rip/videodvd/k3bvideodvdrippingdialog.h --- trunk/extragear/multimedia/k3b/libk3b/tools/k3bfilesysteminfo.cpp #618057:618058 @@ -15,8 +15,11 @@ #include "k3bfilesysteminfo.h" +#include <k3bglobals.h> + #include <qfile.h> #include <qfileinfo.h> +#include <qregexp.h> #include <kdebug.h> @@ -100,8 +103,10 @@ void K3bFileSystemInfo::setPath( const QString& path ) { - d->path = path; - d->statDone = false; + if( d->path != path ) { + d->path = path; + d->statDone = false; + } } @@ -111,3 +116,13 @@ d->stat(); return d->type; } + + +QString K3bFileSystemInfo::fixupPath( const QString& path ) +{ + QString s = K3b::fixupPath( path ); + if( type() == K3bFileSystemInfo::FS_FAT ) + return s.replace( QRegExp("\"?*/\\[]|=:;"), "_" ); + else + return s; +} --- trunk/extragear/multimedia/k3b/libk3b/tools/k3bfilesysteminfo.h #618057:618058 @@ -39,6 +39,15 @@ FileSystemType type() const; + /** + * Ensures that the file path does not contain + * any invalid chars. + * + * For now it only replaces characters like * or [ + * on FAT file systems. + */ + QString fixupPath( const QString& ); + private: class Private; Private* d; --- trunk/extragear/multimedia/k3b/src/rip/k3baudiorippingdialog.cpp #618057:618058 @@ -25,7 +25,7 @@ #include <k3bglobals.h> #include <k3btrack.h> #include <k3bstdguiitems.h> - +#include <k3bfilesysteminfo.h> #include <k3bpluginmanager.h> #include <k3baudioencoder.h> @@ -74,6 +74,7 @@ QValueVector<QString> filenames; QString playlistFilename; + K3bFileSystemInfo fsInfo; }; @@ -289,6 +290,7 @@ d->filenames.clear(); QString baseDir = K3b::prepareDir( m_optionWidget->baseDir() ); + d->fsInfo.setPath( baseDir ); KIO::filesize_t overallSize = 0; @@ -333,9 +335,8 @@ K3b::Msf(length).toString(), fileSize < 0 ? i18n("unknown") : KIO::convertSize( fileSize ), i18n("Audio") ); + d->filenames.append( d->fsInfo.fixupPath( baseDir + "/" + filename + "." + extension ) ); - d->filenames.append( K3b::fixupPath( baseDir + "/" + filename + "." + extension ) ); - if( m_optionWidget->createCueFile() ) (void)new KListViewItem( m_viewTracks, m_viewTracks->lastItem(), @@ -391,7 +392,7 @@ fileSize < 0 ? i18n("unknown") : KIO::convertSize( fileSize ), (m_toc[index].type() == K3bTrack::AUDIO ? i18n("Audio") : i18n("Data") ) ); - d->filenames.append( K3b::fixupPath( baseDir + "/" + filename ) ); + d->filenames.append( d->fsInfo.fixupPath( baseDir + "/" + filename ) ); } } @@ -409,7 +410,7 @@ "-", i18n("Playlist") ); - d->playlistFilename = K3b::fixupPath( baseDir + "/" + filename ); + d->playlistFilename = d->fsInfo.fixupPath( baseDir + "/" + filename ); } if( overallSize > 0 ) --- trunk/extragear/multimedia/k3b/src/rip/videodvd/k3bvideodvdrippingdialog.cpp #618057:618058 @@ -21,6 +21,7 @@ #include <k3bmedium.h> #include <k3bmediacache.h> #include <k3bglobals.h> +#include <k3bfilesysteminfo.h> #include <klocale.h> #include <klistview.h> @@ -136,6 +137,13 @@ }; +class K3bVideoDVDRippingDialog::Private +{ +public: + K3bFileSystemInfo fsInfo; +}; + + K3bVideoDVDRippingDialog::K3bVideoDVDRippingDialog( const K3bVideoDVD::VideoDVD& dvd, const QValueList<int>& titles, QWidget* parent, const char* name ) @@ -147,6 +155,8 @@ "VideoDVD Ripping" ), // config group m_dvd( dvd ) { + d = new Private; + QWidget* frame = mainWidget(); QHBoxLayout* frameLayout = new QHBoxLayout( frame ); frameLayout->setMargin( 0 ); @@ -171,6 +181,7 @@ K3bVideoDVDRippingDialog::~K3bVideoDVDRippingDialog() { + delete d; } @@ -244,12 +255,15 @@ void K3bVideoDVDRippingDialog::slotUpdateFilenames() { + QString baseDir = K3b::prepareDir( m_w->m_editBaseDir->url() ); + d->fsInfo.setPath( baseDir ); + for( QMap<QCheckListItem*, K3bVideoDVDRippingJob::TitleRipInfo>::iterator it = m_titleRipInfos.begin(); it != m_titleRipInfos.end(); ++it ) { QString f = createFilename( it.data(), m_w->m_comboFilenamePattern->currentText() ); if( m_w->m_checkBlankReplace->isChecked() ) f.replace( QRegExp( "\\s" ), m_w->m_editBlankReplace->text() ); - it.data().filename = K3b::prepareDir( m_w->m_editBaseDir->url() ) + f; + it.data().filename = d->fsInfo.fixupPath( baseDir + f ); it.key()->setText( 3, f ); } } --- trunk/extragear/multimedia/k3b/src/rip/videodvd/k3bvideodvdrippingdialog.h #618057:618058 @@ -74,6 +74,9 @@ QMap<QCheckListItem*, K3bVideoDVDRippingJob::TitleRipInfo> m_titleRipInfos; class AudioStreamViewItem; + + class Private; + Private* d; }; #endif |