35 #include <QtCore/QTimer>
36 #include <QtCore/QFile>
45 return (protocol.startsWith(QLatin1String(
"webdav"), Qt::CaseInsensitive) ||
46 protocol.startsWith(QLatin1String(
"http"), Qt::CaseInsensitive));
70 , m_processedFiles( 0 )
71 , m_processedDirs( 0 )
72 , m_totalFilesDirs( 0 )
74 , m_currentStat( m_srcList.begin() )
87 KUrl::List::iterator m_currentStat;
89 QTimer *m_reportTimer;
92 void currentSourceStated(
bool isDir,
bool isLink);
93 void finishedStatPhase();
94 void deleteNextFile();
102 static inline
DeleteJob *newJob(const
KUrl::List &src, JobFlags flags)
119 d_func()->m_reportTimer =
new QTimer(
this);
120 connect(d_func()->m_reportTimer,SIGNAL(
timeout()),
this,SLOT(slotReport()));
122 d_func()->m_reportTimer->start( 200 );
124 QTimer::singleShot(0,
this, SLOT(slotStart()));
133 return d_func()->m_srcList;
136 void DeleteJobPrivate::slotStart()
141 void DeleteJobPrivate::slotReport()
144 emit q->deleting( q, m_currentURL );
151 q->setTotalAmount(KJob::Files, files.count());
152 q->setTotalAmount(KJob::Directories,
dirs.count());
155 q->setProcessedAmount(KJob::Directories, m_processedDirs);
156 q->emitPercent( m_processedFiles + m_processedDirs, m_totalFilesDirs );
159 q->setProcessedAmount(KJob::Files, m_processedFiles);
160 q->emitPercent( m_processedFiles, m_totalFilesDirs );
168 UDSEntryList::ConstIterator it = list.begin();
169 const UDSEntryList::ConstIterator
end = list.end();
170 for (; it != end; ++it)
175 Q_ASSERT(!displayName.isEmpty());
176 if (displayName !=
".." && displayName !=
".")
180 if ( !urlStr.isEmpty() )
183 url =
static_cast<SimpleJob *
>(job)->url();
189 symlinks.append( url );
190 else if ( entry.
isDir() )
199 void DeleteJobPrivate::statNextSrc()
203 if (m_currentStat != m_srcList.end()) {
204 m_currentURL = (*m_currentStat);
208 QPointer<DeleteJob> that = q;
219 while(m_currentStat != m_srcList.end()) {
220 m_currentURL = (*m_currentStat);
225 currentSourceStated(cachedItem.
isDir(), cachedItem.
isLink());
230 if (!kio_resolve_local_urls) {
234 while(m_currentStat != m_srcList.end() && (*m_currentStat).isLocalFile()) {
235 m_currentURL = (*m_currentStat);
236 QFileInfo fileInfo(m_currentURL.toLocalFile());
237 currentSourceStated(fileInfo.isDir(), fileInfo.isSymLink());
241 if (m_currentStat == m_srcList.end()) {
251 if (!q->hasSubjobs())
256 void DeleteJobPrivate::finishedStatPhase()
258 m_totalFilesDirs = files.count() + symlinks.count() +
dirs.count();
271 void DeleteJobPrivate::deleteNextFile()
275 if ( !files.isEmpty() || !symlinks.isEmpty() )
280 KUrl::List::iterator it = files.begin();
282 if ( it == files.end() )
284 it = symlinks.begin();
290 if ( (*it).isLocalFile() && DeleteFileW( (LPCWSTR)(*it).toLocalFile().utf16() ) != 0 ) {
292 if ( (*it).isLocalFile() && unlink( QFile::encodeName((*it).toLocalFile()) ) == 0 ) {
297 if ( m_processedFiles % 300 == 1 || m_totalFilesDirs < 300) {
320 }
while (!job && (!files.isEmpty() || !symlinks.isEmpty()));
326 void DeleteJobPrivate::deleteNextDir()
329 if ( !
dirs.isEmpty() )
333 KUrl::List::iterator it = --
dirs.end();
336 if ( (*it).isLocalFile() && RemoveDirectoryW( (LPCWSTR)(*it).toLocalFile().utf16() ) != 0 ) {
338 if ( (*it).isLocalFile() &&
::rmdir( QFile::encodeName((*it).toLocalFile()) ) == 0 ) {
341 if ( m_processedDirs % 100 == 1 ) {
349 job->
addMetaData(QString::fromLatin1(
"recurse"),
"true");
356 }
while ( !
dirs.isEmpty() );
366 if ( !m_srcList.isEmpty() )
371 if (m_reportTimer!=0)
372 m_reportTimer->stop();
376 void DeleteJobPrivate::currentSourceStated(
bool isDir,
bool isLink)
379 const KUrl url = (*m_currentStat);
380 if (isDir && !isLink) {
397 q->addSubjob(newjob);
403 symlinks.append(url);
411 m_parentDirs.insert(parentDir);
424 if (
StatJob* statJob = qobject_cast<StatJob*>(job)) {
432 const UDSEntry entry = statJob->statResult();
434 const bool isLink = entry.
isLink();
435 const bool isDir = entry.
isDir();
436 d->currentSourceStated(isDir, isLink);
445 d->finishedStatPhase();
461 d->m_processedFiles++;
473 d->m_processedDirs++;
487 srcList.append( src );
488 return DeleteJobPrivate::newJob(srcList, flags);
493 return DeleteJobPrivate::newJob(src, flags);
496 #include "deletejob.moc"