00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
#include "kdirsize.h"
00021
#include <kdebug.h>
00022
#include <qapplication.h>
00023
#include <qtimer.h>
00024
#include <config-kfile.h>
00025
00026
using namespace KIO;
00027
00028 KDirSize::KDirSize(
const KURL & directory )
00029 : KIO::Job(false ), m_bAsync(true), m_totalSize(0L)
00030 {
00031 startNextJob( directory );
00032 }
00033
00034 KDirSize::KDirSize(
const KFileItemList & lstItems )
00035 : KIO::Job(false ), m_bAsync(true), m_totalSize(0L), m_lstItems(lstItems)
00036 {
00037
QTimer::singleShot( 0,
this, SLOT(processList()) );
00038 }
00039
00040
void KDirSize::processList()
00041 {
00042
while (!m_lstItems.
isEmpty())
00043 {
00044
KFileItem * item = m_lstItems.
first();
00045 m_lstItems.
removeFirst();
00046
if ( !item->
isLink() )
00047 {
00048
if ( item->
isDir() )
00049 {
00050
kdDebug(kfile_area) <<
"KDirSize::processList dir -> listing" <<
endl;
00051
KURL url = item->
url();
00052 startNextJob( url );
00053
return;
00054 }
00055
else
00056 {
00057 m_totalSize += item->
size();
00058
00059
00060 }
00061 }
00062 }
00063
kdDebug(kfile_area) <<
"KDirSize::processList finished" <<
endl;
00064
if ( !m_bAsync )
00065 qApp->exit_loop();
00066
emitResult();
00067 }
00068
00069
void KDirSize::startNextJob(
const KURL & url )
00070 {
00071
KIO::ListJob * listJob =
KIO::listRecursive( url,
false );
00072
connect( listJob, SIGNAL(entries(
KIO::Job *,
00073
const KIO::UDSEntryList& )),
00074 SLOT( slotEntries(
KIO::Job*,
00075
const KIO::UDSEntryList& )));
00076
addSubjob( listJob );
00077 }
00078
00079
void KDirSize::slotEntries(
KIO::Job*,
const KIO::UDSEntryList & list )
00080 {
00081
KIO::UDSEntryListConstIterator it = list.
begin();
00082
KIO::UDSEntryListConstIterator end = list.
end();
00083
for (; it !=
end; ++it) {
00084 KIO::UDSEntry::ConstIterator it2 = (*it).begin();
00085 KIO::filesize_t size = 0;
00086
bool isLink =
false;
00087
QString name;
00088
for( ; it2 != (*it).end(); it2++ ) {
00089
switch( (*it2).m_uds ) {
00090
case KIO::UDS_NAME:
00091
name = (*it2).m_str;
00092
break;
00093
case KIO::UDS_LINK_DEST:
00094 isLink = !(*it2).m_str.
isEmpty();
00095
break;
00096
case KIO::UDS_SIZE:
00097 size = ((*it2).m_long);
00098
break;
00099
default:
00100
break;
00101 }
00102 }
00103
if ( !isLink &&
name !=
QString::fromLatin1(
"..") )
00104 {
00105 m_totalSize += size;
00106
00107 }
00108 }
00109 }
00110
00111
00112 KDirSize *
KDirSize::dirSizeJob(
const KURL & directory )
00113 {
00114
return new KDirSize( directory );
00115 }
00116
00117
00118 KDirSize *
KDirSize::dirSizeJob(
const KFileItemList & lstItems )
00119 {
00120
return new KDirSize( lstItems );
00121 }
00122
00123
00124 KIO::filesize_t
KDirSize::dirSize(
const KURL & directory )
00125 {
00126
KDirSize *
dirSize =
dirSizeJob( directory );
00127 dirSize->
setSync();
00128 qApp->enter_loop();
00129
return dirSize->
totalSize();
00130 }
00131
00132
00133 void KDirSize::slotResult(
KIO::Job * job )
00134 {
00135
kdDebug(kfile_area) <<
" KDirSize::slotResult( KIO::Job * job ) m_lstItems:" << m_lstItems.
count() <<
endl;
00136
if ( !m_lstItems.
isEmpty() )
00137 {
00138 subjobs.
remove(job);
00139 processList();
00140 }
00141
else
00142 {
00143
if ( !m_bAsync )
00144 qApp->exit_loop();
00145 KIO::Job::slotResult( job );
00146 }
00147 }
00148
00149
void KDirSize::virtual_hook(
int id,
void* data )
00150 { KIO::Job::virtual_hook(
id, data ); }
00151
00152
#include "kdirsize.moc"