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 <kurl.h>
00026
00027 #include <qobject.h>
00028 #include <qptrlist.h>
00029 #include <qstring.h>
00030 #include <qstringlist.h>
00031 #include <qguardedptr.h>
00032
00033 #include <sys/types.h>
00034 #include <sys/stat.h>
00035
00036 #include <kio/global.h>
00037
00038 class Observer;
00039 class QTimer;
00040
00041 namespace KIO {
00042
00043 class Slave;
00044 class SlaveInterface;
00045
00046
00066 class Job : public QObject {
00067 Q_OBJECT
00068
00069 protected:
00070 Job( bool showProgressInfo );
00071
00072 public:
00073 virtual ~Job();
00074
00084 virtual void kill( bool quietly = true );
00085
00091 int error() const { return m_error; }
00092
00096 int progressId() const { return m_progressId; }
00097
00104 const QString & errorText() const { return m_errorText; }
00105
00117 QString errorString() const;
00118
00129 QStringList detailedErrorStrings(const KURL *reqUrl = 0L,
00130 int method = -1) const;
00131
00139 void showErrorDialog( QWidget * parent = 0L );
00140
00154 void setAutoErrorHandlingEnabled( bool enable, QWidget *parentWidget = 0 );
00155
00160 bool isAutoErrorHandlingEnabled() const;
00161
00165 void setWindow(QWidget *window);
00166
00170 QWidget *window() const;
00171
00179 void setParentJob( Job* parentJob );
00180
00185 Job* parentJob() const;
00186
00190 void setMetaData( const KIO::MetaData &);
00191
00195 void addMetaData(const QString &key, const QString &value);
00196
00201 void addMetaData(const QMap<QString,QString> &values);
00202
00207 void mergeMetaData(const QMap<QString,QString> &values);
00208
00212 MetaData outgoingMetaData() const;
00213
00218 MetaData metaData() const;
00219
00224 QString queryMetaData(const QString &key);
00225
00226 signals:
00231 void result( KIO::Job *job );
00232
00239 void canceled( KIO::Job *job );
00240
00245 void infoMessage( KIO::Job *, const QString & msg );
00246
00247
00253 void connected( KIO::Job * );
00254
00262 void percent( KIO::Job *job, unsigned long percent );
00263
00268 void totalSize( KIO::Job *, KIO::filesize_t size );
00269
00274 void processedSize( KIO::Job *, KIO::filesize_t size );
00275
00279 void speed( KIO::Job *, unsigned long bytes_per_second );
00280
00281 protected slots:
00288 virtual void slotResult( KIO::Job *job );
00289
00293 void slotSpeed( KIO::Job*, unsigned long bytes_per_second );
00297 void slotInfoMessage( KIO::Job*, const QString & );
00298
00302 void slotSpeedTimeout();
00303
00304 protected:
00313 virtual void addSubjob( Job *job, bool inheritMetaData=true );
00314
00321 virtual void removeSubjob( Job *job );
00322
00328 void emitPercent( KIO::filesize_t processedSize, KIO::filesize_t totalSize );
00329
00334 void emitSpeed( unsigned long bytes_per_second );
00335
00340 void emitResult();
00341
00342 QPtrList<Job> subjobs;
00343 int m_error;
00344 QString m_errorText;
00345 unsigned long m_percent;
00346 int m_progressId;
00347 QTimer *m_speedTimer;
00348 QGuardedPtr<QWidget> m_window;
00349 MetaData m_outgoingMetaData;
00350 MetaData m_incomingMetaData;
00351 protected:
00352 virtual void virtual_hook( int id, void* data );
00353 private:
00354 class JobPrivate;
00355 JobPrivate *d;
00356 };
00357
00364 class SimpleJob : public KIO::Job {
00365 Q_OBJECT
00366
00367 public:
00368 SimpleJob(const KURL& url, int command, const QByteArray &packedArgs,
00369 bool showProgressInfo);
00370
00371 ~SimpleJob();
00372
00373 const KURL& url() const { return m_url; }
00374
00382 virtual void kill( bool quietly = true );
00383
00388 virtual void putOnHold();
00389
00393 static void removeOnHold();
00394
00400 virtual void start( Slave *slave );
00401
00406 void slaveDone();
00407
00412 Slave *slave() const { return m_slave; }
00413
00417 int command() const { return m_command; }
00418
00419 public slots:
00424 void slotTotalSize( KIO::filesize_t data_size );
00425
00426 protected slots:
00431 virtual void slotFinished( );
00432
00437 void slotWarning( const QString & );
00438
00442 void slotInfoMessage( const QString & );
00443
00447 void slotConnected();
00448
00452 void slotProcessedSize( KIO::filesize_t data_size );
00456 void slotSpeed( unsigned long bytes_per_second );
00457
00461 virtual void slotMetaData( const KIO::MetaData &_metaData);
00462
00463 public slots:
00469 virtual void slotError( int , const QString & );
00470
00471 protected slots:
00475 void slotNeedProgressId();
00476
00477 protected:
00478 Slave * m_slave;
00479 QByteArray m_packedArgs;
00480 KURL m_url;
00481 KURL m_subUrl;
00482 int m_command;
00483 KIO::filesize_t m_totalSize;
00484 protected:
00485 virtual void virtual_hook( int id, void* data );
00486 private:
00487 class SimpleJobPrivate* d;
00488 };
00489
00490
00491 class StatJob : public SimpleJob {
00492
00493 Q_OBJECT
00494
00495 public:
00496 StatJob(const KURL& url, int command, const QByteArray &packedArgs, bool showProgressInfo);
00497
00503 void setSide( bool source ) { m_bSource = source; }
00504
00513 void setDetails( short int details ) { m_details = details; }
00514
00519 const UDSEntry & statResult() const { return m_statResult; }
00520
00525 virtual void start( Slave *slave );
00526
00527 signals:
00533 void redirection( KIO::Job *, const KURL &url );
00534
00540 void permanentRedirection( KIO::Job *, const KURL &fromUrl, const KURL &toUrl );
00541
00542 protected slots:
00543 void slotStatEntry( const KIO::UDSEntry & entry );
00544 void slotRedirection( const KURL &url);
00545 virtual void slotFinished();
00546
00547 protected:
00548 UDSEntry m_statResult;
00549 KURL m_redirectionURL;
00550 bool m_bSource;
00551 short int m_details;
00552 protected:
00553 virtual void virtual_hook( int id, void* data );
00554 private:
00555 class StatJobPrivate;
00556 StatJobPrivate *d;
00557 };
00558
00565 class TransferJob : public SimpleJob {
00566 Q_OBJECT
00567
00568 public:
00569 TransferJob(const KURL& url, int command,
00570 const QByteArray &packedArgs,
00571 const QByteArray &_staticData,
00572 bool showProgressInfo);
00573
00574 virtual void start(Slave *slave);
00575
00579 virtual void slotResult( KIO::Job *job );
00580
00584 void suspend();
00585
00589 void resume();
00590
00594 bool isSuspended() const { return m_suspended; }
00595
00596
00602 bool isErrorPage() const { return m_errorPage; }
00603
00604
00605 signals:
00611 void data( KIO::Job *, const QByteArray &data);
00612
00624 void dataReq( KIO::Job *, QByteArray &data);
00625
00631 void redirection( KIO::Job *, const KURL &url );
00632
00638 void permanentRedirection( KIO::Job *, const KURL &fromUrl, const KURL &toUrl );
00639
00643 void mimetype( KIO::Job *, const QString &type );
00644
00652 void canResume( KIO::Job *, KIO::filesize_t offset );
00653
00654
00655 protected slots:
00656 virtual void slotRedirection( const KURL &url);
00657 virtual void slotFinished();
00658 virtual void slotData( const QByteArray &data);
00659 virtual void slotDataReq();
00660 virtual void slotMimetype( const QString &mimetype );
00661 virtual void slotNeedSubURLData();
00662 virtual void slotSubURLData(KIO::Job*, const QByteArray &);
00663 void slotErrorPage();
00664 void slotCanResume( KIO::filesize_t offset );
00665
00666 protected:
00667 bool m_suspended;
00668 bool m_errorPage;
00669 QByteArray staticData;
00670 KURL m_redirectionURL;
00671 KURL::List m_redirectionList;
00672 QString m_mimetype;
00673 TransferJob *m_subJob;
00674 protected:
00675 virtual void virtual_hook( int id, void* data );
00676 private:
00677 class TransferJobPrivate* d;
00678 };
00679
00680
00681 class MultiGetJob : public TransferJob {
00682 Q_OBJECT
00683
00684 public:
00685 MultiGetJob(const KURL& url, bool showProgressInfo);
00686
00687 virtual void start(Slave *slave);
00688
00689 void get(long id, const KURL &url, const MetaData &metaData);
00690
00691 signals:
00697 void data( long id, const QByteArray &data);
00698
00702 void mimetype( long id, const QString &type );
00703
00710 void result( long id);
00711
00712 protected slots:
00713 virtual void slotRedirection( const KURL &url);
00714 virtual void slotFinished();
00715 virtual void slotData( const QByteArray &data);
00716 virtual void slotMimetype( const QString &mimetype );
00717 private:
00718 struct GetRequest {
00719 public:
00720 GetRequest(long _id, const KURL &_url, const MetaData &_metaData)
00721 : id(_id), url(_url), metaData(_metaData) { }
00722 long id;
00723 KURL url;
00724 MetaData metaData;
00725 };
00726 bool findCurrentEntry();
00727 void flushQueue(QPtrList<GetRequest> &queue);
00728
00729 QPtrList<GetRequest> m_waitQueue;
00730 QPtrList<GetRequest> m_activeQueue;
00731 bool b_multiGetActive;
00732 GetRequest *m_currentEntry;
00733 protected:
00734 virtual void virtual_hook( int id, void* data );
00735 private:
00736 class MultiGetJobPrivate* d;
00737 };
00738
00739
00740 class MimetypeJob : public TransferJob {
00741 Q_OBJECT
00742
00743 public:
00744 MimetypeJob(const KURL& url, int command, const QByteArray &packedArgs, bool showProgressInfo);
00745
00750 QString mimetype() const { return m_mimetype; }
00751
00756 virtual void start( Slave *slave );
00757
00758 protected slots:
00759 virtual void slotFinished( );
00760 protected:
00761 virtual void virtual_hook( int id, void* data );
00762 private:
00763 class MimetypeJobPrivate* d;
00764 };
00765
00769 class FileCopyJob : public Job {
00770 Q_OBJECT
00771
00772 public:
00773 FileCopyJob( const KURL& src, const KURL& dest, int permissions,
00774 bool move, bool overwrite, bool resume, bool showProgressInfo);
00775
00776 ~FileCopyJob();
00781 void setSourceSize( off_t size );
00782
00783 KURL srcURL() const { return m_src; }
00784 KURL destURL() const { return m_dest; }
00785
00786 public slots:
00787 void slotStart();
00788 void slotData( KIO::Job *, const QByteArray &data);
00789 void slotDataReq( KIO::Job *, QByteArray &data);
00790
00791 protected slots:
00795 virtual void slotResult( KIO::Job *job );
00796
00800 void slotProcessedSize( KIO::Job*, KIO::filesize_t size );
00804 void slotTotalSize( KIO::Job*, KIO::filesize_t size );
00808 void slotPercent( KIO::Job*, unsigned long pct );
00812 void slotCanResume( KIO::Job*, KIO::filesize_t offset );
00813
00814 protected:
00815 void startCopyJob();
00816 void startCopyJob(const KURL &slave_url);
00817 void startDataPump();
00818 void connectSubjob( SimpleJob * job );
00819
00820 KURL m_src;
00821 KURL m_dest;
00822 int m_permissions;
00823 bool m_move:1;
00824 bool m_overwrite:1;
00825 bool m_resume:1;
00826 bool m_canResume:1;
00827 bool m_resumeAnswerSent:1;
00828 QByteArray m_buffer;
00829 SimpleJob *m_moveJob;
00830 SimpleJob *m_copyJob;
00831 TransferJob *m_getJob;
00832 TransferJob *m_putJob;
00833 KIO::filesize_t m_totalSize;
00834 protected:
00835 virtual void virtual_hook( int id, void* data );
00836 private:
00837 class FileCopyJobPrivate;
00838 FileCopyJobPrivate* d;
00839 };
00840
00841 class ListJob : public SimpleJob {
00842 Q_OBJECT
00843
00844 public:
00845 ListJob(const KURL& url, bool showProgressInfo,
00846 bool recursive = false, QString prefix = QString::null,
00847 bool includeHidden = true);
00848
00849 virtual void start( Slave *slave );
00850
00851 signals:
00859 void entries( KIO::Job *, const KIO::UDSEntryList& );
00860
00866 void redirection( KIO::Job *, const KURL &url );
00867
00873 void permanentRedirection( KIO::Job *, const KURL &fromUrl, const KURL &toUrl );
00874
00875 protected slots:
00876 virtual void slotFinished( );
00877 virtual void slotResult( KIO::Job *job );
00878 void slotListEntries( const KIO::UDSEntryList& list );
00879 void slotRedirection( const KURL &url );
00880 void gotEntries( KIO::Job * subjob, const KIO::UDSEntryList& list );
00881
00882 private:
00883 bool recursive;
00884 bool includeHidden;
00885 QString prefix;
00886 unsigned long m_processedEntries;
00887 KURL m_redirectionURL;
00888 protected:
00889 virtual void virtual_hook( int id, void* data );
00890 private:
00891 class ListJobPrivate* d;
00892 };
00893
00894 struct CopyInfo
00895 {
00896 KURL uSource;
00897 KURL uDest;
00898 QString linkDest;
00899 int permissions;
00900
00901 time_t ctime;
00902 time_t mtime;
00903 off_t size;
00904 };
00905
00906
00907 class CopyJob : public Job {
00908 Q_OBJECT
00909
00910 public:
00911 enum CopyMode{ Copy, Move, Link };
00912 CopyJob( const KURL::List& src, const KURL& dest, CopyMode mode, bool asMethod, bool showProgressInfo );
00913
00914 KURL::List srcURLs() const { return m_srcList; }
00915 KURL destURL() const { return m_dest; }
00916
00917 signals:
00918
00919 void totalFiles( KIO::Job *, unsigned long files );
00920 void totalDirs( KIO::Job *, unsigned long dirs );
00921
00922 void processedFiles( KIO::Job *, unsigned long files );
00923 void processedDirs( KIO::Job *, unsigned long dirs );
00924
00928 void copying( KIO::Job *, const KURL& from, const KURL& to );
00932 void linking( KIO::Job *, const QString& target, const KURL& to );
00936 void moving( KIO::Job *, const KURL& from, const KURL& to );
00940 void creatingDir( KIO::Job *, const KURL& dir );
00944 void renamed( KIO::Job *, const KURL& from, const KURL& to );
00945
00955 void copyingDone( KIO::Job *, const KURL &from, const KURL &to, bool directory, bool renamed );
00961 void copyingLinkDone( KIO::Job *, const KURL &from, const QString& target, const KURL& to );
00962
00963 protected:
00964 void statNextSrc();
00965
00966
00967 void slotResultStating( KIO::Job * job );
00968 void startListing( const KURL & src );
00969 void slotResultCreatingDirs( KIO::Job * job );
00970 void slotResultConflictCreatingDirs( KIO::Job * job );
00971 void createNextDir();
00972 void slotResultCopyingFiles( KIO::Job * job );
00973 void slotResultConflictCopyingFiles( KIO::Job * job );
00974 void copyNextFile();
00975 void slotResultDeletingDirs( KIO::Job * job );
00976 void deleteNextDir();
00977 void skip( const KURL & sourceURL );
00978
00979 protected slots:
00980 void slotStart();
00981 void slotEntries( KIO::Job*, const KIO::UDSEntryList& list );
00982 virtual void slotResult( KIO::Job *job );
00986 void slotProcessedSize( KIO::Job*, KIO::filesize_t data_size );
00990 void slotTotalSize( KIO::Job*, KIO::filesize_t size );
00991
00992 void slotReport();
00993 private:
00994 CopyMode m_mode;
00995 bool m_asMethod;
00996 enum { DEST_NOT_STATED, DEST_IS_DIR, DEST_IS_FILE, DEST_DOESNT_EXIST } destinationState;
00997 enum { STATE_STATING, STATE_RENAMING, STATE_LISTING, STATE_CREATING_DIRS,
00998 STATE_CONFLICT_CREATING_DIRS, STATE_COPYING_FILES, STATE_CONFLICT_COPYING_FILES,
00999 STATE_DELETING_DIRS } state;
01000 KIO::filesize_t m_totalSize;
01001 KIO::filesize_t m_processedSize;
01002 KIO::filesize_t m_fileProcessedSize;
01003 int m_processedFiles;
01004 int m_processedDirs;
01005 QValueList<CopyInfo> files;
01006 QValueList<CopyInfo> dirs;
01007 KURL::List dirsToRemove;
01008 KURL::List m_srcList;
01009 KURL::List::Iterator m_currentStatSrc;
01010 bool m_bCurrentSrcIsDir;
01011 bool m_bCurrentOperationIsLink;
01012 bool m_bSingleFileCopy;
01013 bool m_bOnlyRenames;
01014 KURL m_dest;
01015 KURL m_currentDest;
01016
01017 QStringList m_skipList;
01018 QStringList m_overwriteList;
01019 bool m_bAutoSkip;
01020 bool m_bOverwriteAll;
01021 int m_conflictError;
01022
01023 QTimer *m_reportTimer;
01024
01025 KURL m_currentSrcURL;
01026 KURL m_currentDestURL;
01027 protected:
01028 virtual void virtual_hook( int id, void* data );
01029 private:
01030 class CopyJobPrivate* d;
01031 };
01032
01036 class DeleteJob : public Job {
01037 Q_OBJECT
01038
01039 public:
01040 DeleteJob( const KURL::List& src, bool shred, bool showProgressInfo );
01041
01042 KURL::List urls() const { return m_srcList; }
01043
01044 signals:
01045
01046 void totalFiles( KIO::Job *, unsigned long files );
01047 void totalDirs( KIO::Job *, unsigned long dirs );
01048
01049 void processedFiles( KIO::Job *, unsigned long files );
01050 void processedDirs( KIO::Job *, unsigned long dirs );
01051
01052 void deleting( KIO::Job *, const KURL& file );
01053
01054 protected slots:
01055 void slotStart();
01056 void slotEntries( KIO::Job*, const KIO::UDSEntryList& list );
01057 virtual void slotResult( KIO::Job *job );
01058
01062 void slotProcessedSize( KIO::Job*, KIO::filesize_t data_size );
01063 void slotReport();
01064
01065 private:
01066 void statNextSrc();
01067 void deleteNextFile();
01068 void deleteNextDir();
01069
01070 private:
01071 enum { STATE_STATING, STATE_LISTING,
01072 STATE_DELETING_FILES, STATE_DELETING_DIRS } state;
01073 KIO::filesize_t m_totalSize;
01074 KIO::filesize_t m_processedSize;
01075 KIO::filesize_t m_fileProcessedSize;
01076 int m_processedFiles;
01077 int m_processedDirs;
01078 int m_totalFilesDirs;
01079 KURL m_currentURL;
01080 KURL::List files;
01081 KURL::List symlinks;
01082 KURL::List dirs;
01083 KURL::List m_srcList;
01084 KURL::List::Iterator m_currentStat;
01085 QStringList m_parentDirs;
01086 bool m_shred;
01087 QTimer *m_reportTimer;
01088 protected:
01090 virtual void virtual_hook( int id, void* data );
01091 private:
01092 class DeleteJobPrivate* d;
01093 };
01094
01095 };
01096
01097 #endif