• Skip to content
  • Skip to link menu
Trinity API Reference
  • Trinity API Reference
  • tdeio/tdeio
 

tdeio/tdeio

  • tdeio
  • tdeio
forwardingslavebase.cpp
1 /* This file is part of the KDE project
2  Copyright (c) 2004 Kevin Ottens <ervin ipsquad net>
3 
4  This library is free software; you can redistribute it and/or
5  modify it under the terms of the GNU Library General Public
6  License as published by the Free Software Foundation; either
7  version 2 of the License, or (at your option) any later version.
8 
9  This library is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  Library General Public License for more details.
13 
14  You should have received a copy of the GNU Library General Public License
15  along with this library; see the file COPYING.LIB. If not, write to
16  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  Boston, MA 02110-1301, USA.
18 */
19 
20 #include <kdebug.h>
21 #include <tdeio/job.h>
22 #include <kmimetype.h>
23 #include <kprotocolinfo.h>
24 
25 #include <tqapplication.h>
26 #include <tqeventloop.h>
27 
28 #include "forwardingslavebase.h"
29 
30 namespace TDEIO
31 {
32 
33 class ForwardingSlaveBasePrivate
34 {
35 };
36 
37 ForwardingSlaveBase::ForwardingSlaveBase(const TQCString &protocol,
38  const TQCString &poolSocket,
39  const TQCString &appSocket)
40  : TQObject(), SlaveBase(protocol, poolSocket, appSocket)
41 {
42 }
43 
44 ForwardingSlaveBase::~ForwardingSlaveBase()
45 {
46 }
47 
48 bool ForwardingSlaveBase::internalRewriteURL(const KURL &url, KURL &newURL)
49 {
50  bool result = true;
51 
52  if ( url.protocol().ascii()==mProtocol )
53  {
54  result = rewriteURL(url, newURL);
55  }
56  else
57  {
58  newURL = url;
59  }
60 
61  m_processedURL = newURL;
62  m_requestedURL = url;
63  return result;
64 }
65 
66 void ForwardingSlaveBase::prepareUDSEntry(TDEIO::UDSEntry &entry,
67  bool listing) const
68 {
69  kdDebug() << "ForwardingSlaveBase::prepareUDSEntry: listing=="
70  << listing << endl;
71 
72  TQString name;
73  KURL url;
74 
75  TDEIO::UDSEntry::iterator it = entry.begin();
76  TDEIO::UDSEntry::iterator end = entry.end();
77 
78  for(; it!=end; ++it)
79  {
80  KURL new_url = m_requestedURL;
81 
82  switch( (*it).m_uds )
83  {
84  case TDEIO::UDS_NAME:
85  name = (*it).m_str;
86  kdDebug() << "Name = " << name << endl;
87  break;
88  case TDEIO::UDS_URL:
89  url = (*it).m_str;
90  if (listing)
91  {
92  new_url.addPath(url.fileName());
93  }
94  (*it).m_str = new_url.url();
95  kdDebug() << "URL = " << url << endl;
96  kdDebug() << "New URL = " << (*it).m_str << endl;
97  break;
98  }
99  }
100 
101  if ( m_processedURL.isLocalFile() )
102  {
103  KURL new_url = m_processedURL;
104  if (listing)
105  {
106  new_url.addPath( name );
107  }
108 
109  TDEIO::UDSAtom atom;
110  atom.m_uds = TDEIO::UDS_LOCAL_PATH;
111  atom.m_long = 0;
112  atom.m_str = new_url.path();
113  entry.append(atom);
114  }
115 }
116 
117 void ForwardingSlaveBase::get(const KURL &url)
118 {
119  kdDebug() << "ForwardingSlaveBase::get: " << url << endl;
120 
121  KURL new_url;
122  if ( internalRewriteURL(url, new_url) )
123  {
124  TDEIO::TransferJob *job = TDEIO::get(new_url, false, false);
125  connectTransferJob(job);
126 
127  tqApp->eventLoop()->enterLoop();
128  }
129 }
130 
131 void ForwardingSlaveBase::put(const KURL &url, int permissions,
132  bool overwrite, bool resume )
133 {
134  kdDebug() << "ForwardingSlaveBase::put: " << url << endl;
135 
136  KURL new_url;
137  if ( internalRewriteURL(url, new_url) )
138  {
139  TDEIO::TransferJob *job = TDEIO::put(new_url, permissions, overwrite,
140  resume, false);
141  connectTransferJob(job);
142 
143  tqApp->eventLoop()->enterLoop();
144  }
145 }
146 
147 void ForwardingSlaveBase::stat(const KURL &url)
148 {
149  kdDebug() << "ForwardingSlaveBase::stat: " << url << endl;
150 
151  KURL new_url;
152  if ( internalRewriteURL(url, new_url) )
153  {
154  TDEIO::SimpleJob *job = TDEIO::stat(new_url, false);
155  connectSimpleJob(job);
156 
157  tqApp->eventLoop()->enterLoop();
158  }
159 }
160 
161 void ForwardingSlaveBase::mimetype(const KURL &url)
162 {
163  kdDebug() << "ForwardingSlaveBase::mimetype: " << url << endl;
164 
165  KURL new_url;
166  if ( internalRewriteURL(url, new_url) )
167  {
168  TDEIO::TransferJob *job = TDEIO::mimetype(new_url, false);
169  connectTransferJob(job);
170 
171  tqApp->eventLoop()->enterLoop();
172  }
173 }
174 
175 void ForwardingSlaveBase::listDir(const KURL &url)
176 {
177  kdDebug() << "ForwardingSlaveBase::listDir: " << url << endl;
178 
179  KURL new_url;
180  if ( internalRewriteURL(url, new_url) )
181  {
182  TDEIO::ListJob *job = TDEIO::listDir(new_url, false);
183  connectListJob(job);
184 
185  tqApp->eventLoop()->enterLoop();
186  }
187 }
188 
189 void ForwardingSlaveBase::mkdir(const KURL &url, int permissions)
190 {
191  kdDebug() << "ForwardingSlaveBase::mkdir: " << url << endl;
192 
193  KURL new_url;
194  if ( internalRewriteURL(url, new_url) )
195  {
196  TDEIO::SimpleJob *job = TDEIO::mkdir(new_url, permissions);
197  connectSimpleJob(job);
198 
199  tqApp->eventLoop()->enterLoop();
200  }
201 }
202 
203 void ForwardingSlaveBase::rename(const KURL &src, const KURL &dest,
204  bool overwrite)
205 {
206  kdDebug() << "ForwardingSlaveBase::rename: " << src << ", " << dest << endl;
207 
208  KURL new_src, new_dest;
209  if ( internalRewriteURL(src, new_src) && internalRewriteURL(dest, new_dest) )
210  {
211  TDEIO::Job *job = TDEIO::rename(new_src, new_dest, overwrite);
212  connectJob(job);
213 
214  tqApp->eventLoop()->enterLoop();
215  }
216 }
217 
218 void ForwardingSlaveBase::symlink(const TQString &target, const KURL &dest,
219  bool overwrite)
220 {
221  kdDebug() << "ForwardingSlaveBase::symlink: " << target << ", " << dest << endl;
222 
223  KURL new_dest;
224  if ( internalRewriteURL(dest, new_dest) )
225  {
226  TDEIO::SimpleJob *job = TDEIO::symlink(target, new_dest, overwrite, false);
227  connectSimpleJob(job);
228 
229  tqApp->eventLoop()->enterLoop();
230  }
231 }
232 
233 void ForwardingSlaveBase::chmod(const KURL &url, int permissions)
234 {
235  kdDebug() << "ForwardingSlaveBase::chmod: " << url << endl;
236 
237  KURL new_url;
238  if ( internalRewriteURL(url, new_url) )
239  {
240  TDEIO::SimpleJob *job = TDEIO::chmod(new_url, permissions);
241  connectSimpleJob(job);
242 
243  tqApp->eventLoop()->enterLoop();
244  }
245 }
246 
247 void ForwardingSlaveBase::copy(const KURL &src, const KURL &dest,
248  int permissions, bool overwrite)
249 {
250  kdDebug() << "ForwardingSlaveBase::copy: " << src << ", " << dest << endl;
251 
252  KURL new_src, new_dest;
253  if ( internalRewriteURL(src, new_src) && internalRewriteURL(dest, new_dest) )
254  {
255  TDEIO::Job *job = TDEIO::file_copy(new_src, new_dest, permissions,
256  overwrite, false);
257  connectJob(job);
258 
259  tqApp->eventLoop()->enterLoop();
260  }
261 }
262 
263 void ForwardingSlaveBase::del(const KURL &url, bool isfile)
264 {
265  kdDebug() << "ForwardingSlaveBase::del: " << url << endl;
266 
267  KURL new_url;
268  if ( internalRewriteURL(url, new_url) )
269  {
270  if (isfile)
271  {
272  TDEIO::DeleteJob *job = TDEIO::del(new_url, false, false);
273  connectJob(job);
274  }
275  else
276  {
277  TDEIO::SimpleJob *job = TDEIO::rmdir(new_url);
278  connectSimpleJob(job);
279  }
280 
281  tqApp->eventLoop()->enterLoop();
282  }
283 }
284 
285 void ForwardingSlaveBase::localURL(const KURL& remoteURL)
286 {
287  kdDebug() << "ForwardingSlaveBase::localURL: " << remoteURL << endl;
288 
289  KURL new_url;
290  if ( internalRewriteURL(remoteURL, new_url) )
291  {
292  TDEIO::LocalURLJob *job = TDEIO::localURL(new_url);
293  connectLocalURLJob(job);
294 
295  tqApp->eventLoop()->enterLoop();
296  }
297  else
298  {
299  // Let the slave base emit the required signals
300  SlaveBase::localURL(remoteURL);
301  }
302 }
303 
305 
306 void ForwardingSlaveBase::connectJob(TDEIO::Job *job)
307 {
308  // We will forward the warning message, no need to let the job
309  // display it itself
310  job->setInteractive(false);
311 
312  // Forward metadata (e.g. modification time for put())
313  job->setMetaData( allMetaData() );
314 #if 0 // debug code
315  kdDebug() << k_funcinfo << "transferring metadata:" << endl;
316  const MetaData md = allMetaData();
317  for ( MetaData::const_iterator it = md.begin(); it != md.end(); ++it )
318  kdDebug() << it.key() << " = " << it.data() << endl;
319 #endif
320 
321  connect( job, TQ_SIGNAL( result(TDEIO::Job *) ),
322  this, TQ_SLOT( slotResult(TDEIO::Job *) ) );
323  connect( job, TQ_SIGNAL( warning(TDEIO::Job *, const TQString &) ),
324  this, TQ_SLOT( slotWarning(TDEIO::Job *, const TQString &) ) );
325  connect( job, TQ_SIGNAL( infoMessage(TDEIO::Job *, const TQString &) ),
326  this, TQ_SLOT( slotInfoMessage(TDEIO::Job *, const TQString &) ) );
327  connect( job, TQ_SIGNAL( totalSize(TDEIO::Job *, TDEIO::filesize_t) ),
328  this, TQ_SLOT( slotTotalSize(TDEIO::Job *, TDEIO::filesize_t) ) );
329  connect( job, TQ_SIGNAL( processedSize(TDEIO::Job *, TDEIO::filesize_t) ),
330  this, TQ_SLOT( slotProcessedSize(TDEIO::Job *, TDEIO::filesize_t) ) );
331  connect( job, TQ_SIGNAL( speed(TDEIO::Job *, unsigned long) ),
332  this, TQ_SLOT( slotSpeed(TDEIO::Job *, unsigned long) ) );
333 }
334 
335 void ForwardingSlaveBase::connectSimpleJob(TDEIO::SimpleJob *job)
336 {
337  connectJob(job);
338  connect( job, TQ_SIGNAL( redirection(TDEIO::Job *, const KURL &) ),
339  this, TQ_SLOT( slotRedirection(TDEIO::Job *, const KURL &) ) );
340 }
341 
342 void ForwardingSlaveBase::connectListJob(TDEIO::ListJob *job)
343 {
344  connectSimpleJob(job);
345  connect( job, TQ_SIGNAL( entries(TDEIO::Job *, const TDEIO::UDSEntryList &) ),
346  this, TQ_SLOT( slotEntries(TDEIO::Job *, const TDEIO::UDSEntryList &) ) );
347 }
348 
349 void ForwardingSlaveBase::connectTransferJob(TDEIO::TransferJob *job)
350 {
351  connectSimpleJob(job);
352  connect( job, TQ_SIGNAL( data(TDEIO::Job *, const TQByteArray &) ),
353  this, TQ_SLOT( slotData(TDEIO::Job *, const TQByteArray &) ) );
354  connect( job, TQ_SIGNAL( dataReq(TDEIO::Job *, TQByteArray &) ),
355  this, TQ_SLOT( slotDataReq(TDEIO::Job *, TQByteArray &) ) );
356  connect( job, TQ_SIGNAL( mimetype(TDEIO::Job *, const TQString &) ),
357  this, TQ_SLOT( slotMimetype(TDEIO::Job *, const TQString &) ) );
358  connect( job, TQ_SIGNAL( canResume(TDEIO::Job *, TDEIO::filesize_t) ),
359  this, TQ_SLOT( slotCanResume(TDEIO::Job *, TDEIO::filesize_t) ) );
360 }
361 
362 void ForwardingSlaveBase::connectLocalURLJob(TDEIO::LocalURLJob *job)
363 {
364  connectJob(job);
365  connect( job, TQ_SIGNAL( localURL(TDEIO::LocalURLJob *, const KURL&, bool) ),
366  this, TQ_SLOT( slotLocalURL(TDEIO::LocalURLJob *, const KURL&, bool) ) );
367 }
368 
370 
371 void ForwardingSlaveBase::slotResult(TDEIO::Job *job)
372 {
373  if ( job->error() != 0)
374  {
375  error( job->error(), job->errorText() );
376  }
377  else
378  {
379  TDEIO::StatJob *stat_job = dynamic_cast<TDEIO::StatJob *>(job);
380  if ( stat_job!=0L )
381  {
382  TDEIO::UDSEntry entry = stat_job->statResult();
383  prepareUDSEntry(entry);
384  statEntry( entry );
385  }
386  finished();
387  }
388 
389  tqApp->eventLoop()->exitLoop();
390 }
391 
392 void ForwardingSlaveBase::slotWarning(TDEIO::Job* /*job*/, const TQString &msg)
393 {
394  warning(msg);
395 }
396 
397 void ForwardingSlaveBase::slotInfoMessage(TDEIO::Job* /*job*/, const TQString &msg)
398 {
399  infoMessage(msg);
400 }
401 
402 void ForwardingSlaveBase::slotTotalSize(TDEIO::Job* /*job*/, TDEIO::filesize_t size)
403 {
404  totalSize(size);
405 }
406 
407 void ForwardingSlaveBase::slotProcessedSize(TDEIO::Job* /*job*/, TDEIO::filesize_t size)
408 {
409  processedSize(size);
410 }
411 
412 void ForwardingSlaveBase::slotSpeed(TDEIO::Job* /*job*/, unsigned long bytesPerSecond)
413 {
414  speed(bytesPerSecond);
415 }
416 
417 void ForwardingSlaveBase::slotRedirection(TDEIO::Job *job, const KURL &url)
418 {
419  redirection(url);
420 
421  // We've been redirected stop everything.
422  job->kill( true );
423  finished();
424 
425  tqApp->eventLoop()->exitLoop();
426 }
427 
428 void ForwardingSlaveBase::slotEntries(TDEIO::Job* /*job*/,
429  const TDEIO::UDSEntryList &entries)
430 {
431  TDEIO::UDSEntryList final_entries = entries;
432 
433  TDEIO::UDSEntryList::iterator it = final_entries.begin();
434  TDEIO::UDSEntryList::iterator end = final_entries.end();
435 
436  for(; it!=end; ++it)
437  {
438  prepareUDSEntry(*it, true);
439  }
440 
441  listEntries( final_entries );
442 }
443 
444 void ForwardingSlaveBase::slotData(TDEIO::Job* /*job*/, const TQByteArray &d)
445 {
446  data(d);
447 }
448 
449 void ForwardingSlaveBase::slotDataReq(TDEIO::Job* /*job*/, TQByteArray &data)
450 {
451  dataReq();
452  readData(data);
453 }
454 
455 void ForwardingSlaveBase::slotMimetype (TDEIO::Job* /*job*/, const TQString &type)
456 {
457  mimeType(type);
458 }
459 
460 void ForwardingSlaveBase::slotCanResume (TDEIO::Job* /*job*/, TDEIO::filesize_t offset)
461 {
462  canResume(offset);
463 }
464 
465 void ForwardingSlaveBase::slotLocalURL(TDEIO::LocalURLJob *, const KURL& url, bool)
466 {
467  SlaveBase::localURL(url);
468 }
469 
470 }
471 
472 #include "forwardingslavebase.moc"
473 
TDEIO::DeleteJob
A more complex Job to delete files and directories.
Definition: jobclasses.h:1762
TDEIO::Job
The base class for all jobs.
Definition: jobclasses.h:67
TDEIO::Job::errorText
const TQString & errorText() const
Returns the error text if there has been an error.
Definition: jobclasses.h:110
TDEIO::Job::kill
virtual void kill(bool quietly=true)
Abort this job.
Definition: job.cpp:260
TDEIO::Job::error
int error() const
Returns the error code, if there has been an error.
Definition: jobclasses.h:94
TDEIO::Job::setInteractive
void setInteractive(bool enable)
Enable or disable the message display from the job.
Definition: job.cpp:371
TDEIO::Job::setMetaData
void setMetaData(const TDEIO::MetaData &metaData)
Definition: job.cpp:429
TDEIO::ListJob
A ListJob is allows you to get the get the content of a directory.
Definition: jobclasses.h:1391
TDEIO::LocalURLJob
A TDEIO job that finds a local URL.
Definition: jobclasses.h:1865
TDEIO::MetaData
MetaData is a simple map of key/value strings.
Definition: global.h:516
TDEIO::SimpleJob
A simple job (one url and one command).
Definition: jobclasses.h:527
TDEIO::StatJob
A TDEIO job that retrieves information about a file or directory.
Definition: jobclasses.h:687
TDEIO::StatJob::statResult
const UDSEntry & statResult() const
Definition: jobclasses.h:726
TDEIO::TransferJob
The transfer job pumps data into and/or out of a Slave.
Definition: jobclasses.h:874
TDEIO
A namespace for TDEIO globals.
Definition: authinfo.h:29
TDEIO::chmod
TDEIO_EXPORT ChmodJob * chmod(const KFileItemList &lstItems, int permissions, int mask, TQString newOwner, TQString newGroup, bool recursive, bool showProgressInfo=true)
Creates a job that changes permissions/ownership on several files or directories, optionally recursiv...
Definition: chmodjob.cpp:230
TDEIO::symlink
TDEIO_EXPORT SimpleJob * symlink(const TQString &target, const KURL &dest, bool overwrite, bool showProgressInfo=true)
Create or move a symlink.
Definition: job.cpp:808
TDEIO::file_copy
TDEIO_EXPORT FileCopyJob * file_copy(const KURL &src, const KURL &dest, int permissions=-1, bool overwrite=false, bool resume=false, bool showProgressInfo=true)
Copy a single file.
Definition: job.cpp:2027
TDEIO::del
TDEIO_EXPORT DeleteJob * del(const KURL &src, bool shred=false, bool showProgressInfo=true)
Delete a file or directory.
Definition: job.cpp:4450
TDEIO::localURL
TDEIO_EXPORT LocalURLJob * localURL(const KURL &remoteUrl)
Retrieve local URL if available.
Definition: job.cpp:870
TDEIO::mimetype
TDEIO_EXPORT MimetypeJob * mimetype(const KURL &url, bool showProgressInfo=true)
Find mimetype for one file or directory.
Definition: job.cpp:1573
TDEIO::mkdir
TDEIO_EXPORT SimpleJob * mkdir(const KURL &url, int permissions=-1)
Creates a single directory.
Definition: job.cpp:780
TDEIO::UDS_URL
@ UDS_URL
An alternative URL (If different from the caption)
Definition: global.h:371
TDEIO::UDS_NAME
@ UDS_NAME
Filename - as displayed in directory listings etc.
Definition: global.h:335
TDEIO::UDS_LOCAL_PATH
@ UDS_LOCAL_PATH
A local file path if the ioslave display files sitting on the local filesystem (but in another hierar...
Definition: global.h:338
TDEIO::UDSEntry
TQValueList< UDSAtom > UDSEntry
An entry is the list of atoms containing all the information for a file or URL.
Definition: global.h:507
TDEIO::put
TDEIO_EXPORT TransferJob * put(const KURL &url, int permissions, bool overwrite, bool resume, bool showProgressInfo=true)
Put (a.k.a.
Definition: job.cpp:1444
TDEIO::rename
TDEIO_EXPORT SimpleJob * rename(const KURL &src, const KURL &dest, bool overwrite)
Rename a file or directory.
Definition: job.cpp:801
TDEIO::listDir
TDEIO_EXPORT ListJob * listDir(const KURL &url, bool showProgressInfo=true, bool includeHidden=true)
List the contents of url, which is assumed to be a directory.
Definition: job.cpp:2216
TDEIO::get
TDEIO_EXPORT TransferJob * get(const KURL &url, bool reload=false, bool showProgressInfo=true)
Get (a.k.a.
Definition: job.cpp:1284
TDEIO::filesize_t
TQ_ULLONG filesize_t
64-bit file size
Definition: global.h:39
TDEIO::stat
TDEIO_EXPORT StatJob * stat(const KURL &url, bool showProgressInfo=true)
Find all details for one file or directory.
Definition: job.cpp:950
TDEIO::rmdir
TDEIO_EXPORT SimpleJob * rmdir(const KURL &url)
Removes a single directory.
Definition: job.cpp:787

tdeio/tdeio

Skip menu "tdeio/tdeio"
  • Main Page
  • Modules
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

tdeio/tdeio

Skip menu "tdeio/tdeio"
  • arts
  • dcop
  • dnssd
  • interfaces
  •   kspeech
  •     interface
  •     library
  •   tdetexteditor
  • kate
  • kded
  • kdoctools
  • kimgio
  • kjs
  • libtdemid
  • libtdescreensaver
  • tdeabc
  • tdecmshell
  • tdecore
  • tdefx
  • tdehtml
  • tdeinit
  • tdeio
  •   bookmarks
  •   httpfilter
  •   kpasswdserver
  •   kssl
  •   tdefile
  •   tdeio
  •   tdeioexec
  • tdeioslave
  •   http
  • tdemdi
  •   tdemdi
  • tdenewstuff
  • tdeparts
  • tdeprint
  • tderandr
  • tderesources
  • tdespell2
  • tdesu
  • tdeui
  • tdeunittest
  • tdeutils
  • tdewallet
Generated for tdeio/tdeio by doxygen 1.9.1
This website is maintained by Timothy Pearson.