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