File indexing completed on 2024-12-01 04:33:15

0001 /* This file is part of the KDE project
0002 
0003    Copyright (C) 2004 Dario Massarin <nekkar@libero.it>
0004    Copyright (C) 2008 - 2011 Lukas Appelhans <l.appelhans@gmx.de>
0005 
0006    This program is free software; you can redistribute it and/or
0007    modify it under the terms of the GNU General Public
0008    License as published by the Free Software Foundation; either
0009    version 2 of the License, or (at your option) any later version.
0010 */
0011 
0012 #ifndef TRANSFER_H
0013 #define TRANSFER_H
0014 
0015 #include "job.h"
0016 #include "kget_export.h"
0017 
0018 #include <QElapsedTimer>
0019 #include <QUrl>
0020 
0021 #include <KIO/Global>
0022 
0023 class QDomElement;
0024 
0025 class Signature;
0026 class TransferHandler;
0027 class TransferFactory;
0028 class TransferGroup;
0029 class Scheduler;
0030 class TransferTreeModel;
0031 class FileModel;
0032 class Verifier;
0033 
0034 class KGET_EXPORT Transfer : public Job
0035 {
0036     Q_OBJECT
0037     friend class TransferHandler;
0038     friend class TransferTreeModel;
0039 
0040 public:
0041     /**
0042      * Here we define the flags that should be shared by all the transfers.
0043      * A transfer should also be able to define additional flags, in the future.
0044      */
0045     enum TransferChange {
0046         Tc_None = 0x00000000,
0047         // These flags respect the Model columns order NOTE: The model only checks the last 8 bits, so all values which need to be updated by the model should
0048         // look like: 0x000000xx
0049         Tc_Source = 0x00000001,
0050         Tc_FileName = 0x00000002,
0051         Tc_Status = 0x00000004,
0052         Tc_TotalSize = 0x00000008,
0053         Tc_Percent = 0x00000010,
0054         Tc_DownloadSpeed = 0x00000020,
0055         Tc_RemainingTime = 0x00000040,
0056         // Misc
0057         Tc_UploadSpeed = 0x00000100,
0058         Tc_UploadLimit = 0x00000200,
0059         Tc_DownloadLimit = 0x00000400,
0060         Tc_CanResume = 0x00000800,
0061         Tc_DownloadedSize = 0x00001000,
0062         Tc_UploadedSize = 0x00002000,
0063         Tc_Log = 0x00004000,
0064         Tc_Group = 0x00008000,
0065         Tc_Selection = 0x00010000,
0066     };
0067 
0068     enum Capability {
0069         Cap_SpeedLimit = 0x00000001,
0070         Cap_MultipleMirrors = 0x00000002,
0071         Cap_Resuming = 0x00000004,
0072         Cap_Renaming = 0x00000008,
0073         Cap_Moving = 0x00000010,
0074         Cap_FindFilesize = 0x00000020,
0075     };
0076     Q_DECLARE_FLAGS(Capabilities, Capability)
0077 
0078     enum LogLevel {
0079         Log_Info,
0080         Log_Warning,
0081         Log_Error,
0082     };
0083 
0084     enum SpeedLimit {
0085         VisibleSpeedLimit = 0x01,
0086         InvisibleSpeedLimit = 0x02,
0087     };
0088 
0089     enum DeleteOption {
0090         DeleteTemporaryFiles = 0x00000001,
0091         DeleteFiles = 0x00000002,
0092     };
0093     Q_DECLARE_FLAGS(DeleteOptions, DeleteOption)
0094     typedef int ChangesFlags;
0095 
0096     Transfer(TransferGroup *parent, TransferFactory *factory, Scheduler *scheduler, const QUrl &src, const QUrl &dest, const QDomElement *e = nullptr);
0097 
0098     ~Transfer() override;
0099 
0100     /**
0101      * Returns the capabilities this Transfer supports
0102      */
0103     Capabilities capabilities() const
0104     {
0105         return m_capabilities;
0106     }
0107 
0108     /**
0109      * This functions gets called whenever a Transfer gets created. As opposed
0110      * to init(), this isn't a virtual function and is not meant to be used in
0111      * transfer plugins
0112      */
0113     void create();
0114 
0115     /**
0116      * This functions gets called whenever a Transfer is going to be deleted. As opposed
0117      * to deinit(), this isn't a virtual function and is not meant to be used in
0118      * transfer plugins
0119      */
0120     void destroy(DeleteOptions options);
0121 
0122     /**
0123      * This function is called after the creation of a Transfer
0124      * In transfer plugins you can put here whatever needs to be initialized
0125      * @note this function creates a NepomukHandler
0126      */
0127     virtual void init();
0128 
0129     /**
0130      * This function is called before the deletion of a Transfer
0131      * In transfer plugins you can put here whatever needs to be deinitialized
0132      */
0133     virtual void deinit(DeleteOptions options)
0134     {
0135         Q_UNUSED(options);
0136     }
0137 
0138     /**
0139      * Tries to repair file
0140      * @param file the file of a download that should be repaired,
0141      * if not defined all files of a download are going to be repaired
0142      * @return true if a repair started, false if it was not necessary
0143      */
0144     virtual bool repair(const QUrl &file = QUrl())
0145     {
0146         Q_UNUSED(file)
0147         return false;
0148     }
0149 
0150     const QUrl &source() const
0151     {
0152         return m_source;
0153     }
0154     const QUrl &dest() const
0155     {
0156         return m_dest;
0157     }
0158 
0159     /**
0160      * @returns all files of this transfer
0161      */
0162     virtual QList<QUrl> files() const
0163     {
0164         return QList<QUrl>() << m_dest;
0165     }
0166 
0167     /**
0168      * @returns the directory the Transfer will be stored to
0169      */
0170     virtual QUrl directory() const
0171     {
0172         return KIO::upUrl(m_dest);
0173     }
0174 
0175     /**
0176      * Move the download to the new destination
0177      * @param newDirectory is a directory where the download should be stored
0178      * @returns true if newDestination can be used
0179      */
0180     virtual bool setDirectory(const QUrl &newDirectory);
0181 
0182     // Transfer status
0183     KIO::filesize_t totalSize() const
0184     {
0185         return m_totalSize;
0186     }
0187     KIO::filesize_t downloadedSize() const
0188     {
0189         return m_downloadedSize;
0190     }
0191     KIO::filesize_t uploadedSize() const
0192     {
0193         return m_uploadedSize;
0194     }
0195     QString statusText() const
0196     {
0197         return m_statusText;
0198     }
0199     QString statusIconName() const
0200     {
0201         return (error().iconName.isEmpty() ? m_statusIconName : error().iconName);
0202     }
0203 
0204     static QString statusText(Job::Status status);
0205     static QString statusIconName(Job::Status status);
0206 
0207     int percent() const
0208     {
0209         return m_percent;
0210     }
0211     int downloadSpeed() const
0212     {
0213         return m_downloadSpeed;
0214     }
0215     int averageDownloadSpeed() const;
0216     int uploadSpeed() const
0217     {
0218         return m_uploadSpeed;
0219     }
0220     int remainingTime() const override
0221     {
0222         return KIO::calculateRemainingSeconds(totalSize(), downloadedSize(), downloadSpeed());
0223     }
0224     int elapsedTime() const override;
0225     bool isStalled() const override
0226     {
0227         return (status() == Job::Running && downloadSpeed() == 0);
0228     }
0229     bool isWorking() const override
0230     {
0231         return downloadSpeed() > 0;
0232     }
0233 
0234     /**
0235      * The mirrors that are available
0236      * bool if it is used, int how many parallel connections are allowed
0237      * to the mirror
0238      * @param file the file for which the availableMirrors should be get
0239      */
0240     virtual QHash<QUrl, QPair<bool, int>> availableMirrors(const QUrl &file) const;
0241 
0242     /**
0243      * Set the mirrors, int the number of parallel connections to the mirror
0244      * bool if the mirror should be used
0245      * @param file the file for which the availableMirrors should be set
0246      * @param mirrors the mirrors
0247      */
0248     virtual void setAvailableMirrors(const QUrl &file, const QHash<QUrl, QPair<bool, int>> &mirrors)
0249     {
0250         Q_UNUSED(file)
0251         Q_UNUSED(mirrors)
0252     }
0253 
0254     /**
0255      * Set the Transfer's UploadLimit
0256      * @note this is not displayed in any GUI, use setVisibleUploadLimit(int) instead
0257      * @param ulLimit upload Limit
0258      * @param limit speed limit
0259      */
0260     void setUploadLimit(int ulLimit, SpeedLimit limit);
0261 
0262     /**
0263      * Set the Transfer's UploadLimit, which are displayed in the GUI
0264      * @note this is not displayed in any GUI, use setVisibleDownloadLimit(int) instead
0265      * @param dlLimit upload Limit
0266      * @param limit speed limit
0267      */
0268     void setDownloadLimit(int dlLimit, SpeedLimit limit);
0269 
0270     /**
0271      * @return the UploadLimit, which is invisible in the GUI
0272      */
0273     int uploadLimit(SpeedLimit limit) const;
0274 
0275     /**
0276      * @return the DownloadLimit, which is invisible in the GUI
0277      */
0278     int downloadLimit(SpeedLimit limit) const;
0279 
0280     /**
0281      * Set the maximum share-ratio
0282      * @param ratio the new maximum share-ratio
0283      */
0284     void setMaximumShareRatio(double ratio);
0285 
0286     /**
0287      * @return the maximum share-ratio
0288      */
0289     double maximumShareRatio()
0290     {
0291         return m_ratio;
0292     }
0293 
0294     /**
0295      * Recalculate the share ratio
0296      */
0297     void checkShareRatio();
0298 
0299     bool isSelected() const
0300     {
0301         return m_isSelected;
0302     }
0303 
0304     /**
0305      * Transfer history
0306      */
0307     const QStringList log() const;
0308 
0309     /**
0310      * The owner group
0311      */
0312     TransferGroup *group() const
0313     {
0314         return (TransferGroup *)m_jobQueue;
0315     }
0316 
0317     /**
0318      * @return the associated TransferHandler
0319      */
0320     TransferHandler *handler();
0321 
0322     /**
0323      * @returns the TransferTreeModel that owns this group
0324      */
0325     TransferTreeModel *model();
0326 
0327     /**
0328      * @returns a pointer to the TransferFactory object
0329      */
0330     TransferFactory *factory() const
0331     {
0332         return m_factory;
0333     }
0334 
0335     /**
0336      * @returns a pointer to the FileModel containing all files of this download
0337      */
0338     virtual FileModel *fileModel()
0339     {
0340         return nullptr;
0341     }
0342 
0343     /**
0344      * @param file for which to get the verifier
0345      * @return Verifier that allows you to add checksums manually verify a file etc.
0346      */
0347     virtual Verifier *verifier(const QUrl &file)
0348     {
0349         Q_UNUSED(file)
0350         return nullptr;
0351     }
0352 
0353     /**
0354      * @param file for which to get the signature
0355      * @return Signature that allows you to add signatures and verify them
0356      */
0357     virtual Signature *signature(const QUrl &file)
0358     {
0359         Q_UNUSED(file)
0360         return nullptr;
0361     }
0362 
0363     /**
0364      * Saves this transfer to the given QDomNode
0365      *
0366      * @param element The pointer to the QDomNode where the transfer will be saved
0367      */
0368     virtual void save(const QDomElement &element);
0369 
0370     /**
0371      * Loads the transfer's info from the QDomElement
0372      *
0373      * @param element The pointer to the QDomNode where info will be loaded from
0374      */
0375     virtual void load(const QDomElement *element);
0376 
0377 Q_SIGNALS:
0378     /**
0379      * Emitted when the capabilities of the Transfer change
0380      */
0381     void capabilitiesChanged();
0382 
0383 public Q_SLOTS:
0384     /**
0385      * Set Transfer history
0386      */
0387     void setLog(const QString &message, Transfer::LogLevel level = Log_Info);
0388 
0389 protected:
0390     /**
0391      * Sets the Job status to jobStatus, the status text to text and
0392      * the status icon to iconName.
0393      */
0394     void setStatus(Job::Status jobStatus, const QString &text = QString(), const QString &iconName = QString());
0395 
0396     /**
0397      * Sets the capabilities and automatically emits capabilitiesChanged
0398      */
0399     void setCapabilities(Capabilities capabilities);
0400 
0401     /**
0402      * Makes the TransferHandler associated with this transfer know that
0403      * a change in this transfer has occurred.
0404      *
0405      * @param change the TransferChange flags to be set
0406      * @param postEvent whether the post event is taken into account
0407      */
0408     virtual void setTransferChange(ChangesFlags change, bool postEvent = false);
0409 
0410     /**
0411      * Function used to set the SpeedLimits to the transfer
0412      */
0413     virtual void setSpeedLimits(int uploadLimit, int downloadLimit)
0414     {
0415         Q_UNUSED(uploadLimit)
0416         Q_UNUSED(downloadLimit)
0417     }
0418 
0419     // --- Transfer information ---
0420     QUrl m_source;
0421     QUrl m_dest;
0422 
0423     QStringList m_log;
0424     KIO::filesize_t m_totalSize;
0425     KIO::filesize_t m_downloadedSize;
0426     KIO::filesize_t m_uploadedSize;
0427     int m_percent;
0428     int m_downloadSpeed;
0429     int m_uploadSpeed;
0430 
0431     int m_uploadLimit;
0432     int m_downloadLimit;
0433 
0434     bool m_isSelected;
0435 
0436 private:
0437     Capabilities m_capabilities;
0438     int m_visibleUploadLimit;
0439     int m_visibleDownloadLimit;
0440     int m_runningSeconds;
0441     double m_ratio;
0442 
0443     QString m_statusText;
0444     QString m_statusIconName;
0445     QElapsedTimer m_runningTime;
0446 
0447     TransferHandler *m_handler;
0448     TransferFactory *m_factory;
0449 };
0450 
0451 Q_DECLARE_OPERATORS_FOR_FLAGS(Transfer::Capabilities)
0452 Q_DECLARE_OPERATORS_FOR_FLAGS(Transfer::DeleteOptions)
0453 
0454 #endif