[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: branches/KDE/4.2/kdelibs/kio/kio
From: David Faure <faure () kde ! org>
Date: 2009-01-27 1:24:27
Message-ID: 1233019467.434076.20136.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 917170 by dfaure:
Emit the correct FilesRemoved signal if the job was aborted in the middle of its \
operation, otherwise it can result in confusion and data loss (overwriting files with \
files that don't exist).
BUG: 118593
(this fix will be in 4.2.1)
M +27 -24 copyjob.cpp
M +1 -0 copyjob.h
--- branches/KDE/4.2/kdelibs/kio/kio/copyjob.cpp #917169:917170
@@ -153,7 +153,7 @@
QList<CopyInfo> dirs;
KUrl::List dirsToRemove;
KUrl::List m_srcList;
- KUrl::List m_skippedSourceUrls;
+ KUrl::List m_successSrcList;
KUrl::List::const_iterator m_currentStatSrc;
bool m_bCurrentSrcIsDir;
bool m_bCurrentOperationIsLink;
@@ -770,10 +770,6 @@
void CopyJobPrivate::skip( const KUrl & sourceUrl )
{
- // If this is one if toplevel sources,
- // remove it from d->m_srcList, for a correct FilesRemoved() signal
- // But don't do it right away, we have iterators into that list (#157601)
- m_skippedSourceUrls.append( sourceUrl );
dirsToRemove.removeAll( sourceUrl );
}
@@ -857,6 +853,7 @@
{
//this is required for the undo feature
emit q->copyingDone( q, (*it).uSource, (*it).uDest, (*it).mtime, true, false \
); + m_successSrcList.append((*it).uSource);
m_directoriesCopied.append( *it );
dirs.erase( it );
}
@@ -1118,6 +1115,7 @@
emit q->copyingDone( q, (*it).uSource, (*it).uDest, (*it).mtime, false, \
false ); if (m_mode == CopyJob::Move)
org::kde::KDirNotify::emitFileMoved( (*it).uSource.url(), \
(*it).uDest.url() ); + m_successSrcList.append((*it).uSource);
}
// remove from list, to move on to next file
files.erase( it );
@@ -1372,7 +1370,7 @@
KIO::Job * newjob = 0;
if ( m_mode == CopyJob::Link ) {
// User requested that a symlink be made
- JobFlags flags = bOverwrite ? Overwrite : DefaultFlags;
+ const JobFlags flags = bOverwrite ? Overwrite : DefaultFlags;
newjob = linkNextFile(uSource, uDest, flags);
if (!newjob)
return;
@@ -1384,7 +1382,7 @@
(uSource.pass() == uDest.pass()))
// Copying a symlink - only on the same protocol/host/etc. (#5601, \
downloading an FTP file through its link), {
- JobFlags flags = bOverwrite ? Overwrite : DefaultFlags;
+ const JobFlags flags = bOverwrite ? Overwrite : DefaultFlags;
KIO::SimpleJob *newJob = KIO::symlink( (*it).linkDest, uDest, flags | \
HideProgressInfo /*no GUI*/ ); Scheduler::scheduleJob(newJob);
newjob = newJob;
@@ -1509,23 +1507,6 @@
// but then we need to jump to the else part below. Maybe with a recursive \
call? #endif
} else {
- // Finished - tell the world
- if ( !m_bOnlyRenames )
- {
- KUrl url( m_globalDest );
- if ( m_globalDestinationState != DEST_IS_DIR || m_asMethod )
- url.setPath( url.directory() );
- //kDebug(7007) << "KDirNotify'ing FilesAdded " << url;
- org::kde::KDirNotify::emitFilesAdded( url.url() );
-
- Q_FOREACH(const KUrl& url, m_skippedSourceUrls)
- m_srcList.removeAll(url);
-
- if ( m_mode == CopyJob::Move && !m_srcList.isEmpty() ) {
- //kDebug(7007) << "KDirNotify'ing FilesRemoved " << \
m_srcList.toStringList();
- org::kde::KDirNotify::emitFilesRemoved( m_srcList.toStringList() );
- }
- }
if (m_reportTimer)
m_reportTimer->stop();
--m_processedFiles; // undo the "start at 1" hack
@@ -1535,6 +1516,27 @@
}
}
+void CopyJob::emitResult()
+{
+ Q_D(CopyJob);
+ // Before we go, tell the world about the changes that were made.
+ // Even if some error made us abort midway, we might still have done
+ // part of the job so we better update the views! (#118583)
+ if (!d->m_bOnlyRenames) {
+ KUrl url(d->m_globalDest);
+ if (d->m_globalDestinationState != DEST_IS_DIR || d->m_asMethod)
+ url.setPath(url.directory());
+ //kDebug(7007) << "KDirNotify'ing FilesAdded " << url;
+ org::kde::KDirNotify::emitFilesAdded( url.url() );
+
+ if (d->m_mode == CopyJob::Move && !d->m_successSrcList.isEmpty()) {
+ kDebug(7007) << "KDirNotify'ing FilesRemoved" << \
d->m_successSrcList.toStringList(); + \
org::kde::KDirNotify::emitFilesRemoved(d->m_successSrcList.toStringList()); + \
} + }
+ Job::emitResult();
+}
+
void CopyJobPrivate::slotProcessedSize( KJob*, qulonglong data_size )
{
Q_Q(CopyJob);
@@ -1801,6 +1803,7 @@
kDebug(7007) << "Renaming succeeded, move on";
++m_processedFiles;
emit q->copyingDone( q, *m_currentStatSrc, dest, -1 /*mtime unknown, and not \
needed*/, true, true ); + m_successSrcList.append(*m_currentStatSrc);
statNextSrc();
}
}
--- branches/KDE/4.2/kdelibs/kio/kio/copyjob.h #917169:917170
@@ -245,6 +245,7 @@
protected:
CopyJob(CopyJobPrivate &dd);
+ void emitResult();
private:
Q_PRIVATE_SLOT(d_func(), void slotStart())
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic