36 #include <QtCore/QTimer>
37 #include <QtCore/QFile>
46 return (protocol.startsWith(QLatin1String(
"webdav"), Qt::CaseInsensitive) ||
47 protocol.startsWith(QLatin1String(
"http"), Qt::CaseInsensitive));
71 , m_processedFiles( 0 )
72 , m_processedDirs( 0 )
73 , m_totalFilesDirs( 0 )
75 , m_currentStat( m_srcList.begin() )
88 KUrl::List::iterator m_currentStat;
90 QTimer *m_reportTimer;
93 void currentSourceStated(
bool isDir,
bool isLink);
94 void finishedStatPhase();
95 void deleteNextFile();
103 static inline
DeleteJob *newJob(const
KUrl::List &src, JobFlags flags)
120 d_func()->m_reportTimer =
new QTimer(
this);
121 connect(d_func()->m_reportTimer,SIGNAL(
timeout()),
this,SLOT(slotReport()));
123 d_func()->m_reportTimer->start( 200 );
125 QTimer::singleShot(0,
this, SLOT(slotStart()));
134 return d_func()->m_srcList;
137 void DeleteJobPrivate::slotStart()
142 void DeleteJobPrivate::slotReport()
145 emit q->deleting( q, m_currentURL );
152 q->setTotalAmount(KJob::Files, files.count());
153 q->setTotalAmount(KJob::Directories,
dirs.count());
156 q->setProcessedAmount(KJob::Directories, m_processedDirs);
157 q->emitPercent( m_processedFiles + m_processedDirs, m_totalFilesDirs );
160 q->setProcessedAmount(KJob::Files, m_processedFiles);
161 q->emitPercent( m_processedFiles, m_totalFilesDirs );
169 UDSEntryList::ConstIterator it = list.begin();
170 const UDSEntryList::ConstIterator
end = list.end();
171 for (; it != end; ++it)
176 Q_ASSERT(!displayName.isEmpty());
177 if (displayName !=
".." && displayName !=
".")
181 if ( !urlStr.isEmpty() )
184 url =
static_cast<SimpleJob *
>(job)->url();
190 symlinks.append( url );
191 else if ( entry.
isDir() )
200 void DeleteJobPrivate::statNextSrc()
204 if (m_currentStat != m_srcList.end()) {
205 m_currentURL = (*m_currentStat);
209 QPointer<DeleteJob> that = q;
220 while(m_currentStat != m_srcList.end()) {
221 m_currentURL = (*m_currentStat);
226 currentSourceStated(cachedItem.
isDir(), cachedItem.
isLink());
231 if (!kio_resolve_local_urls) {
235 while(m_currentStat != m_srcList.end() && (*m_currentStat).isLocalFile()) {
236 m_currentURL = (*m_currentStat);
237 QFileInfo fileInfo(m_currentURL.toLocalFile());
238 currentSourceStated(fileInfo.isDir(), fileInfo.isSymLink());
242 if (m_currentStat == m_srcList.end()) {
252 if (!q->hasSubjobs())
257 void DeleteJobPrivate::finishedStatPhase()
259 m_totalFilesDirs = files.count() + symlinks.count() +
dirs.count();
272 void DeleteJobPrivate::deleteNextFile()
276 if ( !files.isEmpty() || !symlinks.isEmpty() )
281 KUrl::List::iterator it = files.begin();
283 if ( it == files.end() )
285 it = symlinks.begin();
291 if ( (*it).isLocalFile() && DeleteFileW( (LPCWSTR)(*it).toLocalFile().utf16() ) != 0 ) {
293 if ( (*it).isLocalFile() && unlink( QFile::encodeName((*it).toLocalFile()) ) == 0 ) {
298 if ( m_processedFiles % 300 == 1 || m_totalFilesDirs < 300) {
321 }
while (!job && (!files.isEmpty() || !symlinks.isEmpty()));
327 void DeleteJobPrivate::deleteNextDir()
330 if ( !
dirs.isEmpty() )
334 KUrl::List::iterator it = --
dirs.end();
337 if ( (*it).isLocalFile() && RemoveDirectoryW( (LPCWSTR)(*it).toLocalFile().utf16() ) != 0 ) {
339 if ( (*it).isLocalFile() &&
::rmdir( QFile::encodeName((*it).toLocalFile()) ) == 0 ) {
342 if ( m_processedDirs % 100 == 1 ) {
350 job->
addMetaData(QString::fromLatin1(
"recurse"),
"true");
357 }
while ( !
dirs.isEmpty() );
367 if ( !m_srcList.isEmpty() )
372 if (m_reportTimer!=0)
373 m_reportTimer->stop();
377 void DeleteJobPrivate::currentSourceStated(
bool isDir,
bool isLink)
380 const KUrl url = (*m_currentStat);
381 if (isDir && !isLink) {
398 q->addSubjob(newjob);
404 symlinks.append(url);
412 m_parentDirs.insert(parentDir);
425 if (
StatJob* statJob = qobject_cast<StatJob*>(job)) {
433 const UDSEntry entry = statJob->statResult();
435 const bool isLink = entry.
isLink();
436 const bool isDir = entry.
isDir();
437 d->currentSourceStated(isDir, isLink);
446 d->finishedStatPhase();
462 d->m_processedFiles++;
474 d->m_processedDirs++;
488 srcList.append( src );
489 DeleteJob* job = DeleteJobPrivate::newJob(srcList, flags);
496 DeleteJob* job = DeleteJobPrivate::newJob(src, flags);
501 #include "deletejob.moc"