00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef __kio_jobclasses_h__
00023 #define __kio_jobclasses_h__
00024
00025 #include <qobject.h>
00026 #include <qptrlist.h>
00027 #include <qstring.h>
00028 #include <qstringlist.h>
00029 #include <qguardedptr.h>
00030
00031 #include <sys/types.h>
00032 #include <sys/stat.h>
00033
00034 #include <kurl.h>
00035 #include <kio/global.h>
00036
00037 class Observer;
00038 class QTimer;
00039
00040 #define KIO_COPYJOB_HAS_SETINTERACTIVE // new in 3.4. Used by kio_trash.
00041
00042 namespace KIO {
00043
00044 class Slave;
00045 class SlaveInterface;
00046
00047
00068 class KIO_EXPORT Job : public QObject {
00069 Q_OBJECT
00070
00071 protected:
00072 Job( bool showProgressInfo );
00073
00074 public:
00075 virtual ~Job();
00076
00087 virtual void kill( bool quietly = true );
00088
00095 int error() const { return m_error; }
00096
00101 int progressId() const { return m_progressId; }
00102
00111 const QString & errorText() const { return m_errorText; }
00112
00130 QString errorString() const;
00131
00142 QStringList detailedErrorStrings(const KURL *reqUrl = 0L,
00143 int method = -1) const;
00144
00153 void showErrorDialog( QWidget * parent = 0L );
00154
00170 void setAutoErrorHandlingEnabled( bool enable, QWidget *parentWidget = 0 );
00171
00178 bool isAutoErrorHandlingEnabled() const;
00179
00187 void setInteractive(bool enable);
00188
00196 bool isInteractive() const;
00202 void setWindow(QWidget *window);
00203
00209 QWidget *window() const;
00210
00221 void setParentJob( Job* parentJob );
00222
00229 Job* parentJob() const;
00230
00238 void setMetaData( const KIO::MetaData &metaData);
00239
00247 void addMetaData(const QString &key, const QString &value);
00248
00256 void addMetaData(const QMap<QString,QString> &values);
00257
00265 void mergeMetaData(const QMap<QString,QString> &values);
00266
00270 MetaData outgoingMetaData() const;
00271
00277 MetaData metaData() const;
00278
00286 QString queryMetaData(const QString &key);
00287
00293 KIO::filesize_t getProcessedSize();
00294
00295 signals:
00301 void result( KIO::Job *job );
00302
00310 void canceled( KIO::Job *job );
00311
00318 void infoMessage( KIO::Job *job, const QString & msg );
00319
00320
00327 void connected( KIO::Job *job );
00328
00337 void percent( KIO::Job *job, unsigned long percent );
00338
00345 void totalSize( KIO::Job *job, KIO::filesize_t size );
00346
00353 void processedSize( KIO::Job *job, KIO::filesize_t size );
00354
00360 void speed( KIO::Job *job, unsigned long bytes_per_second );
00361
00362 protected slots:
00371 virtual void slotResult( KIO::Job *job );
00372
00379 void slotSpeed( KIO::Job *job, unsigned long bytes_per_second );
00386 void slotInfoMessage( KIO::Job *job, const QString &msg );
00387
00391 void slotSpeedTimeout();
00392
00393 protected:
00403 virtual void addSubjob( Job *job, bool inheritMetaData=true );
00404
00413 virtual void removeSubjob( Job *job );
00422 void removeSubjob( Job *job, bool mergeMetaData, bool emitResultIfLast );
00423
00432 void emitPercent( KIO::filesize_t processedSize, KIO::filesize_t totalSize );
00433
00440 void emitSpeed( unsigned long bytes_per_second );
00441
00446 void emitResult();
00447
00452 void setProcessedSize(KIO::filesize_t size);
00453
00459 enum { EF_TransferJobAsync = (1 << 0),
00460 EF_TransferJobNeedData = (1 << 1),
00461 EF_TransferJobDataSent = (1 << 2),
00462 EF_ListJobUnrestricted = (1 << 3) };
00463 int &extraFlags();
00464
00465 QPtrList<Job> subjobs;
00466 int m_error;
00467 QString m_errorText;
00468 unsigned long m_percent;
00469 int m_progressId;
00470 QTimer *m_speedTimer;
00471 QGuardedPtr<QWidget> m_window;
00472 MetaData m_outgoingMetaData;
00473 MetaData m_incomingMetaData;
00474 protected:
00475 virtual void virtual_hook( int id, void* data );
00476 private:
00477 class JobPrivate;
00478 JobPrivate *d;
00479 };
00480
00487 class KIO_EXPORT SimpleJob : public KIO::Job {
00488 Q_OBJECT
00489
00490 public:
00499 SimpleJob(const KURL& url, int command, const QByteArray &packedArgs,
00500 bool showProgressInfo);
00501
00502 ~SimpleJob();
00503
00508 const KURL& url() const { return m_url; }
00509
00517 virtual void kill( bool quietly = true );
00518
00523 virtual void putOnHold();
00524
00528 static void removeOnHold();
00529
00535 virtual void start( Slave *slave );
00536
00541 void slaveDone();
00542
00547 Slave *slave() const { return m_slave; }
00548
00552 int command() const { return m_command; }
00553
00554 public slots:
00560 void slotTotalSize( KIO::filesize_t data_size );
00561
00562 protected slots:
00567 virtual void slotFinished( );
00568
00573 void slotWarning( const QString & );
00574
00580 void slotInfoMessage( const QString &s );
00581
00586 void slotConnected();
00587
00593 void slotProcessedSize( KIO::filesize_t data_size );
00599 void slotSpeed( unsigned long bytes_per_second );
00600
00606 virtual void slotMetaData( const KIO::MetaData &_metaData);
00607
00608 public slots:
00614 virtual void slotError( int , const QString & );
00615
00616 protected slots:
00620 void slotNeedProgressId();
00621
00622 protected:
00623 Slave * m_slave;
00624 QByteArray m_packedArgs;
00625 KURL m_url;
00626 KURL m_subUrl;
00627 int m_command;
00628 KIO::filesize_t m_totalSize;
00629 protected:
00630 virtual void virtual_hook( int id, void* data );
00631
00632
00633
00634
00635
00636
00637
00638 void storeSSLSessionFromJob(const KURL &m_redirectionURL);
00639 private:
00640 class SimpleJobPrivate* d;
00641 };
00642
00647 class KIO_EXPORT StatJob : public SimpleJob {
00648
00649 Q_OBJECT
00650
00651 public:
00659 StatJob(const KURL& url, int command, const QByteArray &packedArgs, bool showProgressInfo);
00660
00668 void setSide( bool source ) { m_bSource = source; }
00669
00679 void setDetails( short int details ) { m_details = details; }
00680
00686 const UDSEntry & statResult() const { return m_statResult; }
00687
00694 virtual void start( Slave *slave );
00695
00696 signals:
00704 void redirection( KIO::Job *job, const KURL &url );
00705
00714 void permanentRedirection( KIO::Job *job, const KURL &fromUrl, const KURL &toUrl );
00715
00716 protected slots:
00717 void slotStatEntry( const KIO::UDSEntry & entry );
00718 void slotRedirection( const KURL &url);
00719 virtual void slotFinished();
00720 virtual void slotMetaData( const KIO::MetaData &_metaData);
00721
00722 protected:
00723 UDSEntry m_statResult;
00724 KURL m_redirectionURL;
00725 bool m_bSource;
00726 short int m_details;
00727 protected:
00728 virtual void virtual_hook( int id, void* data );
00729 private:
00730 class StatJobPrivate;
00731 StatJobPrivate *d;
00732 };
00733
00739 class KIO_EXPORT MkdirJob : public SimpleJob {
00740
00741 Q_OBJECT
00742
00743 public:
00751 MkdirJob(const KURL& url, int command, const QByteArray &packedArgs, bool showProgressInfo);
00752
00759 virtual void start( Slave *slave );
00760
00761 signals:
00769 void redirection( KIO::Job *job, const KURL &url );
00770
00778 void permanentRedirection( KIO::Job *job, const KURL &fromUrl, const KURL &toUrl );
00779
00780 protected slots:
00781 void slotRedirection( const KURL &url);
00782 virtual void slotFinished();
00783
00784 protected:
00785 KURL m_redirectionURL;
00786
00787 protected:
00788 virtual void virtual_hook( int id, void* data );
00789 private:
00790 class MkdirJobPrivate;
00791 MkdirJobPrivate *d;
00792 };
00793
00798 class KIO_EXPORT DirectCopyJob : public SimpleJob {
00799 Q_OBJECT
00800
00801 public:
00805 DirectCopyJob(const KURL& url, int command, const QByteArray &packedArgs,
00806 bool showProgressInfo);
00813 virtual void start(Slave *slave);
00814
00815 signals:
00821 void canResume( KIO::Job *job, KIO::filesize_t offset );
00822
00823 private slots:
00824 void slotCanResume( KIO::filesize_t offset );
00825 };
00826
00827
00834 class KIO_EXPORT TransferJob : public SimpleJob {
00835 Q_OBJECT
00836
00837 public:
00847 TransferJob(const KURL& url, int command,
00848 const QByteArray &packedArgs,
00849 const QByteArray &_staticData,
00850 bool showProgressInfo);
00851
00858 virtual void start(Slave *slave);
00859
00864 virtual void slotResult( KIO::Job *job );
00865
00869 void suspend();
00870
00874 void resume();
00875
00880 bool isSuspended() const { return m_suspended; }
00881
00882
00890 bool isErrorPage() const { return m_errorPage; }
00891
00899 void setAsyncDataEnabled(bool enabled);
00900
00907 void sendAsyncData(const QByteArray &data);
00908
00916 void setReportDataSent(bool enabled);
00917
00924 bool reportDataSent();
00925
00926 signals:
00936 void data( KIO::Job *job, const QByteArray &data );
00937
00949 void dataReq( KIO::Job *job, QByteArray &data );
00950
00958 void redirection( KIO::Job *job, const KURL &url );
00959
00968 void permanentRedirection( KIO::Job *job, const KURL &fromUrl, const KURL &toUrl );
00969
00975 void mimetype( KIO::Job *job, const QString &type );
00976
00984 void canResume( KIO::Job *job, KIO::filesize_t offset );
00985
00986
00987 protected slots:
00988 virtual void slotRedirection( const KURL &url);
00989 virtual void slotFinished();
00990 virtual void slotData( const QByteArray &data);
00991 virtual void slotDataReq();
00992 virtual void slotMimetype( const QString &mimetype );
00993 virtual void slotNeedSubURLData();
00994 virtual void slotSubURLData(KIO::Job*, const QByteArray &);
00995 virtual void slotMetaData( const KIO::MetaData &_metaData);
00996 void slotErrorPage();
00997 void slotCanResume( KIO::filesize_t offset );
00998 void slotPostRedirection();
00999
01000 protected:
01001 bool m_suspended;
01002 bool m_errorPage;
01003 QByteArray staticData;
01004 KURL m_redirectionURL;
01005 KURL::List m_redirectionList;
01006 QString m_mimetype;
01007 TransferJob *m_subJob;
01008 protected:
01009 virtual void virtual_hook( int id, void* data );
01010 private:
01011 class TransferJobPrivate *d;
01012 };
01013
01034 class KIO_EXPORT StoredTransferJob : public KIO::TransferJob {
01035 Q_OBJECT
01036
01037 public:
01047 StoredTransferJob(const KURL& url, int command,
01048 const QByteArray &packedArgs,
01049 const QByteArray &_staticData,
01050 bool showProgressInfo);
01051
01057 void setData( const QByteArray& arr );
01058
01063 QByteArray data() const { return m_data; }
01064
01065 private slots:
01066 void slotStoredData( KIO::Job *job, const QByteArray &data );
01067 void slotStoredDataReq( KIO::Job *job, QByteArray &data );
01068 private:
01069 QByteArray m_data;
01070 int m_uploadOffset;
01071 };
01072
01079 class KIO_EXPORT MultiGetJob : public TransferJob {
01080 Q_OBJECT
01081
01082 public:
01090 MultiGetJob(const KURL& url, bool showProgressInfo);
01091
01098 virtual void start(Slave *slave);
01099
01107 void get(long id, const KURL &url, const MetaData &metaData);
01108
01109 signals:
01116 void data( long id, const QByteArray &data);
01117
01123 void mimetype( long id, const QString &type );
01124
01132 void result( long id);
01133
01134 protected slots:
01135 virtual void slotRedirection( const KURL &url);
01136 virtual void slotFinished();
01137 virtual void slotData( const QByteArray &data);
01138 virtual void slotMimetype( const QString &mimetype );
01139 private:
01140 struct GetRequest {
01141 public:
01142 GetRequest(long _id, const KURL &_url, const MetaData &_metaData)
01143 : id(_id), url(_url), metaData(_metaData) { }
01144 long id;
01145 KURL url;
01146 MetaData metaData;
01147 };
01148 bool findCurrentEntry();
01149 void flushQueue(QPtrList<GetRequest> &queue);
01150
01151 QPtrList<GetRequest> m_waitQueue;
01152 QPtrList<GetRequest> m_activeQueue;
01153 bool b_multiGetActive;
01154 GetRequest *m_currentEntry;
01155 protected:
01156 virtual void virtual_hook( int id, void* data );
01157 private:
01158 class MultiGetJobPrivate* d;
01159 };
01160
01167 class KIO_EXPORT MimetypeJob : public TransferJob {
01168 Q_OBJECT
01169
01170 public:
01179 MimetypeJob(const KURL& url, int command, const QByteArray &packedArgs, bool showProgressInfo);
01180
01186 QString mimetype() const { return m_mimetype; }
01187
01194 virtual void start( Slave *slave );
01195
01196 protected slots:
01197 virtual void slotFinished( );
01198 protected:
01199 virtual void virtual_hook( int id, void* data );
01200 private:
01201 class MimetypeJobPrivate* d;
01202 };
01203
01209 class KIO_EXPORT FileCopyJob : public Job {
01210 Q_OBJECT
01211
01212 public:
01224 FileCopyJob( const KURL& src, const KURL& dest, int permissions,
01225 bool move, bool overwrite, bool resume, bool showProgressInfo);
01226
01227 ~FileCopyJob();
01234 void setSourceSize64(KIO::filesize_t size);
01235
01239 void setSourceSize( off_t size ) KDE_DEPRECATED;
01240
01245 KURL srcURL() const { return m_src; }
01246
01251 KURL destURL() const { return m_dest; }
01252
01253 public slots:
01254 void slotStart();
01255 void slotData( KIO::Job *, const QByteArray &data);
01256 void slotDataReq( KIO::Job *, QByteArray &data);
01257
01258 protected slots:
01263 virtual void slotResult( KIO::Job *job );
01264
01270 void slotProcessedSize( KIO::Job *job, KIO::filesize_t size );
01276 void slotTotalSize( KIO::Job *job, KIO::filesize_t size );
01282 void slotPercent( KIO::Job *job, unsigned long pct );
01288 void slotCanResume( KIO::Job *job, KIO::filesize_t offset );
01289
01290 protected:
01291 void startCopyJob();
01292 void startCopyJob(const KURL &slave_url);
01293 void startRenameJob(const KURL &slave_url);
01294 void startDataPump();
01295 void connectSubjob( SimpleJob * job );
01296
01297 private:
01298 void startBestCopyMethod();
01299
01300 protected:
01301 KURL m_src;
01302 KURL m_dest;
01303 int m_permissions;
01304 bool m_move:1;
01305 bool m_overwrite:1;
01306 bool m_resume:1;
01307 bool m_canResume:1;
01308 bool m_resumeAnswerSent:1;
01309 QByteArray m_buffer;
01310 SimpleJob *m_moveJob;
01311 SimpleJob *m_copyJob;
01312 TransferJob *m_getJob;
01313 TransferJob *m_putJob;
01314 KIO::filesize_t m_totalSize;
01315 protected:
01316 virtual void virtual_hook( int id, void* data );
01317 private:
01318 class FileCopyJobPrivate;
01319 FileCopyJobPrivate* d;
01320 };
01321
01329 class KIO_EXPORT ListJob : public SimpleJob {
01330 Q_OBJECT
01331
01332 public:
01343 ListJob(const KURL& url, bool showProgressInfo,
01344 bool recursive = false, QString prefix = QString::null,
01345 bool includeHidden = true);
01346
01353 virtual void start( Slave *slave );
01354
01361 const KURL& redirectionURL() const { return m_redirectionURL; }
01362
01367 void setUnrestricted(bool unrestricted);
01368
01369 signals:
01379 void entries( KIO::Job *job, const KIO::UDSEntryList& list);
01380
01388 void redirection( KIO::Job *job, const KURL &url );
01389
01398 void permanentRedirection( KIO::Job *job, const KURL &fromUrl, const KURL &toUrl );
01399
01400 protected slots:
01401 virtual void slotFinished( );
01402 virtual void slotMetaData( const KIO::MetaData &_metaData);
01403 virtual void slotResult( KIO::Job *job );
01404 void slotListEntries( const KIO::UDSEntryList& list );
01405 void slotRedirection( const KURL &url );
01406 void gotEntries( KIO::Job * subjob, const KIO::UDSEntryList& list );
01407
01408 private:
01409 bool recursive;
01410 bool includeHidden;
01411 QString prefix;
01412 unsigned long m_processedEntries;
01413 KURL m_redirectionURL;
01414 protected:
01415 virtual void virtual_hook( int id, void* data );
01416 private:
01417 class ListJobPrivate* d;
01418 };
01419
01421 struct KIO_EXPORT CopyInfo
01422 {
01423 KURL uSource;
01424 KURL uDest;
01425 QString linkDest;
01426 int permissions;
01427
01428 time_t ctime;
01429 time_t mtime;
01430 KIO::filesize_t size;
01431 };
01432
01445 class KIO_EXPORT CopyJob : public Job {
01446 Q_OBJECT
01447
01448 public:
01452 enum CopyMode{ Copy, Move, Link };
01453
01471 CopyJob( const KURL::List& src, const KURL& dest, CopyMode mode, bool asMethod, bool showProgressInfo );
01472
01473 virtual ~CopyJob();
01474
01479 KURL::List srcURLs() const { return m_srcList; }
01480
01485 KURL destURL() const { return m_dest; }
01486
01497 void setDefaultPermissions( bool b );
01498
01510 void setInteractive( bool b );
01511
01512 signals:
01513
01519 void totalFiles( KIO::Job *job, unsigned long files );
01525 void totalDirs( KIO::Job *job, unsigned long dirs );
01526
01534 void aboutToCreate( KIO::Job *job, const QValueList<KIO::CopyInfo> &files);
01535
01541 void processedFiles( KIO::Job *job, unsigned long files );
01547 void processedDirs( KIO::Job *job, unsigned long dirs );
01548
01556 void copying( KIO::Job *job, const KURL& from, const KURL& to );
01564 void linking( KIO::Job *job, const QString& target, const KURL& to );
01572 void moving( KIO::Job *job, const KURL& from, const KURL& to );
01578 void creatingDir( KIO::Job *job, const KURL& dir );
01585 void renamed( KIO::Job *job, const KURL& from, const KURL& to );
01586
01599 void copyingDone( KIO::Job *job, const KURL &from, const KURL &to, bool directory, bool renamed );
01609 void copyingLinkDone( KIO::Job *job, const KURL &from, const QString& target, const KURL& to );
01610
01611 protected:
01612 void statCurrentSrc();
01613 void statNextSrc();
01614
01615
01616 void slotResultStating( KIO::Job * job );
01617 void startListing( const KURL & src );
01618 void slotResultCreatingDirs( KIO::Job * job );
01619 void slotResultConflictCreatingDirs( KIO::Job * job );
01620 void createNextDir();
01621 void slotResultCopyingFiles( KIO::Job * job );
01622 void slotResultConflictCopyingFiles( KIO::Job * job );
01623 void copyNextFile();
01624 void slotResultDeletingDirs( KIO::Job * job );
01625 void deleteNextDir();
01626 void skip( const KURL & sourceURL );
01627 void slotResultRenaming( KIO::Job * job );
01628 private:
01629 void startRenameJob(const KURL &slave_url);
01630 bool shouldOverwrite( const QString& path ) const;
01631 bool shouldSkip( const QString& path ) const;
01632 void skipSrc();
01633
01634 protected slots:
01635 void slotStart();
01636 void slotEntries( KIO::Job*, const KIO::UDSEntryList& list );
01637 virtual void slotResult( KIO::Job *job );
01641 void slotProcessedSize( KIO::Job*, KIO::filesize_t data_size );
01646 void slotTotalSize( KIO::Job*, KIO::filesize_t size );
01647
01648 void slotReport();
01649 private:
01650 CopyMode m_mode;
01651 bool m_asMethod;
01652 enum DestinationState { DEST_NOT_STATED, DEST_IS_DIR, DEST_IS_FILE, DEST_DOESNT_EXIST };
01653 DestinationState destinationState;
01654 enum { STATE_STATING, STATE_RENAMING, STATE_LISTING, STATE_CREATING_DIRS,
01655 STATE_CONFLICT_CREATING_DIRS, STATE_COPYING_FILES, STATE_CONFLICT_COPYING_FILES,
01656 STATE_DELETING_DIRS } state;
01657 KIO::filesize_t m_totalSize;
01658 KIO::filesize_t m_processedSize;
01659 KIO::filesize_t m_fileProcessedSize;
01660 int m_processedFiles;
01661 int m_processedDirs;
01662 QValueList<CopyInfo> files;
01663 QValueList<CopyInfo> dirs;
01664 KURL::List dirsToRemove;
01665 KURL::List m_srcList;
01666 KURL::List::Iterator m_currentStatSrc;
01667 bool m_bCurrentSrcIsDir;
01668 bool m_bCurrentOperationIsLink;
01669 bool m_bSingleFileCopy;
01670 bool m_bOnlyRenames;
01671 KURL m_dest;
01672 KURL m_currentDest;
01673
01674 QStringList m_skipList;
01675 QStringList m_overwriteList;
01676 bool m_bAutoSkip;
01677 bool m_bOverwriteAll;
01678 int m_conflictError;
01679
01680 QTimer *m_reportTimer;
01681
01682 KURL m_currentSrcURL;
01683 KURL m_currentDestURL;
01684 protected:
01685 virtual void virtual_hook( int id, void* data );
01686 private:
01687 class CopyJobPrivate;
01688 CopyJobPrivate* d;
01689 friend class CopyJobPrivate;
01690 };
01691
01698 class KIO_EXPORT DeleteJob : public Job {
01699 Q_OBJECT
01700
01701 public:
01711 DeleteJob( const KURL::List& src, bool shred, bool showProgressInfo );
01712
01717 KURL::List urls() const { return m_srcList; }
01718
01719 signals:
01720
01726 void totalFiles( KIO::Job *job, unsigned long files );
01732 void totalDirs( KIO::Job *job, unsigned long dirs );
01733
01739 void processedFiles( KIO::Job *job, unsigned long files );
01745 void processedDirs( KIO::Job *job, unsigned long dirs );
01746
01753 void deleting( KIO::Job *job, const KURL& file );
01754
01755 protected slots:
01756 void slotStart();
01757 void slotEntries( KIO::Job*, const KIO::UDSEntryList& list );
01758 virtual void slotResult( KIO::Job *job );
01759
01763 void slotProcessedSize( KIO::Job*, KIO::filesize_t data_size );
01764 void slotReport();
01765
01766 private:
01767 void statNextSrc();
01768 void deleteNextFile();
01769 void deleteNextDir();
01770
01771 private:
01772 enum { STATE_STATING, STATE_LISTING,
01773 STATE_DELETING_FILES, STATE_DELETING_DIRS } state;
01774 KIO::filesize_t m_totalSize;
01775 KIO::filesize_t m_processedSize;
01776 KIO::filesize_t m_fileProcessedSize;
01777 int m_processedFiles;
01778 int m_processedDirs;
01779 int m_totalFilesDirs;
01780 KURL m_currentURL;
01781 KURL::List files;
01782 KURL::List symlinks;
01783 KURL::List dirs;
01784 KURL::List m_srcList;
01785 KURL::List::Iterator m_currentStat;
01786 QStringList m_parentDirs;
01787 bool m_shred;
01788 QTimer *m_reportTimer;
01789 protected:
01791 virtual void virtual_hook( int id, void* data );
01792 private:
01793 class DeleteJobPrivate* d;
01794 };
01795
01796 }
01797
01798 #endif