00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <kdebug.h>
00021 #include <kio/job.h>
00022 #include <kmimetype.h>
00023 #include <kprotocolinfo.h>
00024
00025 #include <qapplication.h>
00026 #include <qeventloop.h>
00027
00028 #include "forwardingslavebase.h"
00029
00030 namespace KIO
00031 {
00032
00033 class ForwardingSlaveBasePrivate
00034 {
00035 };
00036
00037 ForwardingSlaveBase::ForwardingSlaveBase(const QCString &protocol,
00038 const QCString &poolSocket,
00039 const QCString &appSocket)
00040 : QObject(), SlaveBase(protocol, poolSocket, appSocket)
00041 {
00042 }
00043
00044 ForwardingSlaveBase::~ForwardingSlaveBase()
00045 {
00046 }
00047
00048 bool ForwardingSlaveBase::internalRewriteURL(const KURL &url, KURL &newURL)
00049 {
00050 bool result = true;
00051
00052 if ( url.protocol().ascii()==mProtocol )
00053 {
00054 result = rewriteURL(url, newURL);
00055 }
00056 else
00057 {
00058 newURL = url;
00059 }
00060
00061 m_processedURL = newURL;
00062 m_requestedURL = url;
00063 return result;
00064 }
00065
00066 void ForwardingSlaveBase::prepareUDSEntry(KIO::UDSEntry &entry,
00067 bool listing) const
00068 {
00069 kdDebug() << "ForwardingSlaveBase::prepareUDSEntry: listing=="
00070 << listing << endl;
00071
00072 bool url_found = false;
00073 QString name;
00074 KURL url;
00075
00076 KIO::UDSEntry::iterator it = entry.begin();
00077 KIO::UDSEntry::iterator end = entry.end();
00078
00079 for(; it!=end; ++it)
00080 {
00081 KURL new_url = m_requestedURL;
00082
00083 switch( (*it).m_uds )
00084 {
00085 case KIO::UDS_NAME:
00086 name = (*it).m_str;
00087 kdDebug() << "Name = " << name << endl;
00088 break;
00089 case KIO::UDS_URL:
00090 url_found = true;
00091 url = (*it).m_str;
00092 if (listing)
00093 {
00094 new_url.addPath(url.fileName());
00095 }
00096 (*it).m_str = new_url.url();
00097 kdDebug() << "URL = " << url << endl;
00098 kdDebug() << "New URL = " << (*it).m_str << endl;
00099 break;
00100 }
00101 }
00102
00103 if ( m_processedURL.isLocalFile() )
00104 {
00105 KURL new_url = m_processedURL;
00106 if (listing)
00107 {
00108 new_url.addPath( name );
00109 }
00110
00111 KIO::UDSAtom atom;
00112 atom.m_uds = KIO::UDS_LOCAL_PATH;
00113 atom.m_long = 0;
00114 atom.m_str = new_url.path();
00115 entry.append(atom);
00116 }
00117 }
00118
00119 void ForwardingSlaveBase::get(const KURL &url)
00120 {
00121 kdDebug() << "ForwardingSlaveBase::get: " << url << endl;
00122
00123 KURL new_url;
00124 if ( internalRewriteURL(url, new_url) )
00125 {
00126 KIO::TransferJob *job = KIO::get(new_url, false, false);
00127 connectTransferJob(job);
00128
00129 qApp->eventLoop()->enterLoop();
00130 }
00131 }
00132
00133 void ForwardingSlaveBase::put(const KURL &url, int permissions,
00134 bool overwrite, bool resume )
00135 {
00136 kdDebug() << "ForwardingSlaveBase::put: " << url << endl;
00137
00138 KURL new_url;
00139 if ( internalRewriteURL(url, new_url) )
00140 {
00141 KIO::TransferJob *job = KIO::put(new_url, permissions, overwrite,
00142 resume, false);
00143 connectTransferJob(job);
00144
00145 qApp->eventLoop()->enterLoop();
00146 }
00147 }
00148
00149 void ForwardingSlaveBase::stat(const KURL &url)
00150 {
00151 kdDebug() << "ForwardingSlaveBase::stat: " << url << endl;
00152
00153 KURL new_url;
00154 if ( internalRewriteURL(url, new_url) )
00155 {
00156 KIO::SimpleJob *job = KIO::stat(new_url, false);
00157 connectSimpleJob(job);
00158
00159 qApp->eventLoop()->enterLoop();
00160 }
00161 }
00162
00163 void ForwardingSlaveBase::mimetype(const KURL &url)
00164 {
00165 kdDebug() << "ForwardingSlaveBase::mimetype: " << url << endl;
00166
00167 KURL new_url;
00168 if ( internalRewriteURL(url, new_url) )
00169 {
00170 KIO::TransferJob *job = KIO::mimetype(new_url, false);
00171 connectTransferJob(job);
00172
00173 qApp->eventLoop()->enterLoop();
00174 }
00175 }
00176
00177 void ForwardingSlaveBase::listDir(const KURL &url)
00178 {
00179 kdDebug() << "ForwardingSlaveBase::listDir: " << url << endl;
00180
00181 KURL new_url;
00182 if ( internalRewriteURL(url, new_url) )
00183 {
00184 KIO::ListJob *job = KIO::listDir(new_url, false);
00185 connectListJob(job);
00186
00187 qApp->eventLoop()->enterLoop();
00188 }
00189 }
00190
00191 void ForwardingSlaveBase::mkdir(const KURL &url, int permissions)
00192 {
00193 kdDebug() << "ForwardingSlaveBase::mkdir: " << url << endl;
00194
00195 KURL new_url;
00196 if ( internalRewriteURL(url, new_url) )
00197 {
00198 KIO::SimpleJob *job = KIO::mkdir(new_url, permissions);
00199 connectSimpleJob(job);
00200
00201 qApp->eventLoop()->enterLoop();
00202 }
00203 }
00204
00205 void ForwardingSlaveBase::rename(const KURL &src, const KURL &dest,
00206 bool overwrite)
00207 {
00208 kdDebug() << "ForwardingSlaveBase::rename: " << src << ", " << dest << endl;
00209
00210 KURL new_src, new_dest;
00211 if ( internalRewriteURL(src, new_src) && internalRewriteURL(dest, new_dest) )
00212 {
00213 KIO::Job *job = KIO::rename(new_src, new_dest, overwrite);
00214 connectJob(job);
00215
00216 qApp->eventLoop()->enterLoop();
00217 }
00218 }
00219
00220 void ForwardingSlaveBase::symlink(const QString &target, const KURL &dest,
00221 bool overwrite)
00222 {
00223 kdDebug() << "ForwardingSlaveBase::symlink: " << target << ", " << dest << endl;
00224
00225 KURL new_dest;
00226 if ( internalRewriteURL(dest, new_dest) )
00227 {
00228 KIO::SimpleJob *job = KIO::symlink(target, new_dest, overwrite, false);
00229 connectSimpleJob(job);
00230
00231 qApp->eventLoop()->enterLoop();
00232 }
00233 }
00234
00235 void ForwardingSlaveBase::chmod(const KURL &url, int permissions)
00236 {
00237 kdDebug() << "ForwardingSlaveBase::chmod: " << url << endl;
00238
00239 KURL new_url;
00240 if ( internalRewriteURL(url, new_url) )
00241 {
00242 KIO::SimpleJob *job = KIO::chmod(new_url, permissions);
00243 connectSimpleJob(job);
00244
00245 qApp->eventLoop()->enterLoop();
00246 }
00247 }
00248
00249 void ForwardingSlaveBase::copy(const KURL &src, const KURL &dest,
00250 int permissions, bool overwrite)
00251 {
00252 kdDebug() << "ForwardingSlaveBase::copy: " << src << ", " << dest << endl;
00253
00254 KURL new_src, new_dest;
00255 if ( internalRewriteURL(src, new_src) && internalRewriteURL(dest, new_dest) )
00256 {
00257 KIO::Job *job = KIO::file_copy(new_src, new_dest, permissions,
00258 overwrite, false);
00259 connectJob(job);
00260
00261 qApp->eventLoop()->enterLoop();
00262 }
00263 }
00264
00265 void ForwardingSlaveBase::del(const KURL &url, bool isfile)
00266 {
00267 kdDebug() << "ForwardingSlaveBase::del: " << url << endl;
00268
00269 KURL new_url;
00270 if ( internalRewriteURL(url, new_url) )
00271 {
00272 if (isfile)
00273 {
00274 KIO::DeleteJob *job = KIO::del(new_url, false, false);
00275 connectJob(job);
00276 }
00277 else
00278 {
00279 KIO::SimpleJob *job = KIO::rmdir(new_url);
00280 connectSimpleJob(job);
00281 }
00282
00283 qApp->eventLoop()->enterLoop();
00284 }
00285 }
00286
00287
00289
00290 void ForwardingSlaveBase::connectJob(KIO::Job *job)
00291 {
00292
00293
00294 job->setInteractive(false);
00295
00296
00297 job->setMetaData( allMetaData() );
00298 #if 0 // debug code
00299 kdDebug() << k_funcinfo << "transferring metadata:" << endl;
00300 const MetaData md = allMetaData();
00301 for ( MetaData::const_iterator it = md.begin(); it != md.end(); ++it )
00302 kdDebug() << it.key() << " = " << it.data() << endl;
00303 #endif
00304
00305 connect( job, SIGNAL( result(KIO::Job *) ),
00306 this, SLOT( slotResult(KIO::Job *) ) );
00307 connect( job, SIGNAL( warning(KIO::Job *, const QString &) ),
00308 this, SLOT( slotWarning(KIO::Job *, const QString &) ) );
00309 connect( job, SIGNAL( infoMessage(KIO::Job *, const QString &) ),
00310 this, SLOT( slotInfoMessage(KIO::Job *, const QString &) ) );
00311 connect( job, SIGNAL( totalSize(KIO::Job *, KIO::filesize_t) ),
00312 this, SLOT( slotTotalSize(KIO::Job *, KIO::filesize_t) ) );
00313 connect( job, SIGNAL( processedSize(KIO::Job *, KIO::filesize_t) ),
00314 this, SLOT( slotProcessedSize(KIO::Job *, KIO::filesize_t) ) );
00315 connect( job, SIGNAL( speed(KIO::Job *, unsigned long) ),
00316 this, SLOT( slotSpeed(KIO::Job *, unsigned long) ) );
00317 }
00318
00319 void ForwardingSlaveBase::connectSimpleJob(KIO::SimpleJob *job)
00320 {
00321 connectJob(job);
00322 connect( job, SIGNAL( redirection(KIO::Job *, const KURL &) ),
00323 this, SLOT( slotRedirection(KIO::Job *, const KURL &) ) );
00324 }
00325
00326 void ForwardingSlaveBase::connectListJob(KIO::ListJob *job)
00327 {
00328 connectSimpleJob(job);
00329 connect( job, SIGNAL( entries(KIO::Job *, const KIO::UDSEntryList &) ),
00330 this, SLOT( slotEntries(KIO::Job *, const KIO::UDSEntryList &) ) );
00331 }
00332
00333 void ForwardingSlaveBase::connectTransferJob(KIO::TransferJob *job)
00334 {
00335 connectSimpleJob(job);
00336 connect( job, SIGNAL( data(KIO::Job *, const QByteArray &) ),
00337 this, SLOT( slotData(KIO::Job *, const QByteArray &) ) );
00338 connect( job, SIGNAL( dataReq(KIO::Job *, QByteArray &) ),
00339 this, SLOT( slotDataReq(KIO::Job *, QByteArray &) ) );
00340 connect( job, SIGNAL( mimetype(KIO::Job *, const QString &) ),
00341 this, SLOT( slotMimetype(KIO::Job *, const QString &) ) );
00342 connect( job, SIGNAL( canResume(KIO::Job *, KIO::filesize_t) ),
00343 this, SLOT( slotCanResume(KIO::Job *, KIO::filesize_t) ) );
00344 }
00345
00347
00348 void ForwardingSlaveBase::slotResult(KIO::Job *job)
00349 {
00350 if ( job->error() != 0)
00351 {
00352 error( job->error(), job->errorText() );
00353 }
00354 else
00355 {
00356 KIO::StatJob *stat_job = dynamic_cast<KIO::StatJob *>(job);
00357 if ( stat_job!=0L )
00358 {
00359 KIO::UDSEntry entry = stat_job->statResult();
00360 prepareUDSEntry(entry);
00361 statEntry( entry );
00362 }
00363 finished();
00364 }
00365
00366 qApp->eventLoop()->exitLoop();
00367 }
00368
00369 void ForwardingSlaveBase::slotWarning(KIO::Job* , const QString &msg)
00370 {
00371 warning(msg);
00372 }
00373
00374 void ForwardingSlaveBase::slotInfoMessage(KIO::Job* , const QString &msg)
00375 {
00376 infoMessage(msg);
00377 }
00378
00379 void ForwardingSlaveBase::slotTotalSize(KIO::Job* , KIO::filesize_t size)
00380 {
00381 totalSize(size);
00382 }
00383
00384 void ForwardingSlaveBase::slotProcessedSize(KIO::Job* , KIO::filesize_t size)
00385 {
00386 processedSize(size);
00387 }
00388
00389 void ForwardingSlaveBase::slotSpeed(KIO::Job* , unsigned long bytesPerSecond)
00390 {
00391 speed(bytesPerSecond);
00392 }
00393
00394 void ForwardingSlaveBase::slotRedirection(KIO::Job *job, const KURL &url)
00395 {
00396 redirection(url);
00397
00398
00399 job->kill( true );
00400 finished();
00401
00402 qApp->eventLoop()->exitLoop();
00403 }
00404
00405 void ForwardingSlaveBase::slotEntries(KIO::Job* ,
00406 const KIO::UDSEntryList &entries)
00407 {
00408 KIO::UDSEntryList final_entries = entries;
00409
00410 KIO::UDSEntryList::iterator it = final_entries.begin();
00411 KIO::UDSEntryList::iterator end = final_entries.end();
00412
00413 for(; it!=end; ++it)
00414 {
00415 prepareUDSEntry(*it, true);
00416 }
00417
00418 listEntries( final_entries );
00419 }
00420
00421 void ForwardingSlaveBase::slotData(KIO::Job* , const QByteArray &d)
00422 {
00423 data(d);
00424 }
00425
00426 void ForwardingSlaveBase::slotDataReq(KIO::Job* , QByteArray &data)
00427 {
00428 dataReq();
00429 readData(data);
00430 }
00431
00432 void ForwardingSlaveBase::slotMimetype (KIO::Job* , const QString &type)
00433 {
00434 mimeType(type);
00435 }
00436
00437 void ForwardingSlaveBase::slotCanResume (KIO::Job* , KIO::filesize_t offset)
00438 {
00439 canResume(offset);
00440 }
00441
00442 }
00443
00444 #include "forwardingslavebase.moc"
00445