Warning, file /maui/mauikit-filebrowsing/src/code/downloader.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 #include "downloader.h"
0002 #include <QNetworkAccessManager>
0003 #include <QNetworkReply>
0004 #include <QFile>
0005 
0006 // #if defined Q_OS_LINUX && !defined Q_OS_ANDROID
0007 // #include <KIO/CopyJob>
0008 // #include <KJob>
0009 // #endif
0010 
0011 // QNetworkAccessManager *FMH::Downloader::manager = new QNetworkAccessManager(); 
0012 
0013 FMH::Downloader::Downloader(QObject *parent)
0014 : QObject(parent)    
0015 , reply(nullptr)
0016 , manager( new QNetworkAccessManager(this))
0017 , file(nullptr)
0018 , array(new QByteArray)
0019 {        
0020 }
0021 
0022 void FMH::Downloader::setConnections()
0023 {
0024     if(!reply)
0025     {
0026         return;
0027     }
0028     
0029     reply->disconnect();
0030     connect(reply, &QNetworkReply::downloadProgress, this, &Downloader::onDownloadProgress);    
0031     connect(reply, &QIODevice::readyRead, this, &Downloader::onReadyRead);     
0032     connect(reply, &QNetworkReply::finished, this, &Downloader::onReplyFinished);
0033     connect(reply, &QNetworkReply::errorOccurred, [this](QNetworkReply::NetworkError)
0034     {
0035         Q_EMIT this->warning(reply->errorString());
0036     });
0037     
0038     //     connect(reply, &QNetworkReply::sslErrors, [this](const QList<QSslError> &errors)
0039     //     {
0040     //         Q_EMIT this->warning(reply->sslErrors().);
0041     //     });
0042 }
0043 
0044 FMH::Downloader::~Downloader()
0045 {
0046     qDebug() << "DELETEING DOWNLOADER";
0047     this->array->clear();
0048 }
0049 
0050 bool FMH::Downloader::isFinished() const
0051 {
0052     if(!reply)
0053     {
0054         return false;
0055     }
0056     
0057    return reply->isFinished();
0058 }
0059 
0060 bool FMH::Downloader::isRunning() const
0061 {
0062     if(!reply)
0063     {
0064         return false;
0065     }
0066     
0067    return reply->isRunning();
0068 }
0069 
0070 
0071 void FMH::Downloader::stop()
0072 {
0073     if(!reply)
0074     {
0075         return;
0076     }
0077     
0078     if(this->reply->isRunning())
0079     {
0080         this->reply->abort();
0081         this->reply->close();
0082         Q_EMIT this->aborted();        
0083         
0084         if(m_saveToFile)
0085         {
0086             if(this->file)
0087             {
0088                 this->file->remove();
0089             }
0090         }else
0091         {
0092             this->array->clear();    
0093         }
0094     }    
0095 }
0096 
0097 void FMH::Downloader::downloadFile(const QUrl &source, const QUrl &destination)
0098 {
0099     #ifdef KIO_COPYJOB_H
0100     KIO::CopyJob *downloadJob = KIO::copy(source, destination);
0101     
0102     connect(downloadJob, &KIO::CopyJob::warning, [=](KJob *job, QString message)
0103     {
0104         Q_UNUSED(job)
0105         Q_EMIT this->warning(message);
0106     });
0107     
0108     connect(downloadJob, &KIO::CopyJob::processedSize, [=](KJob *job, qulonglong size)
0109     {
0110         Q_EMIT this->progress(size, job->percent());
0111     });
0112     
0113     connect(downloadJob, &KIO::CopyJob::finished, [=](KJob *job) 
0114     {
0115         Q_EMIT this->downloadReady();
0116         Q_EMIT this->done();
0117     });
0118     
0119     #else
0120     if (destination.isEmpty() || source.isEmpty())
0121         return;
0122     
0123     QNetworkRequest request;
0124     request.setAttribute(QNetworkRequest::RedirectPolicyAttribute, true);
0125     request.setUrl(source);
0126     
0127     m_saveToFile = true;
0128     
0129     file = new QFile;
0130     file->setFileName(destination.toLocalFile());
0131     if (!file->open(QIODevice::WriteOnly))
0132     {
0133         Q_EMIT this->warning(QStringLiteral("Can not open file to write download"));
0134         return;
0135     }
0136     
0137     this->reply = manager->get(request);    
0138     this->setConnections();
0139     
0140     #endif
0141 }
0142 
0143 void FMH::Downloader::getArray(const QUrl &fileURL, const QMap<QString, QString> &headers)
0144 {
0145     if (fileURL.isEmpty())
0146         return;
0147     
0148     QNetworkRequest request;
0149     request.setUrl(fileURL);
0150     if (!headers.isEmpty()) 
0151     {
0152         const auto keys = headers.keys();
0153         for (const auto &key : keys)
0154             request.setRawHeader(key.toLocal8Bit(), headers[key].toLocal8Bit());
0155     }
0156     
0157     m_saveToFile = false;
0158     reply = manager->get(request);
0159     this->setConnections();
0160 }
0161 
0162 void FMH::Downloader::onDownloadProgress(qint64 bytesRead, qint64 bytesTotal)
0163 {
0164     if(bytesTotal <= 0)
0165     {
0166         return;
0167     }
0168     
0169     qDebug() << "DOWNLOAD PROGRESS" << ((bytesRead * 100) / bytesTotal);
0170     Q_EMIT this->progress((bytesRead * 100) / bytesTotal);
0171 }
0172 
0173 void FMH::Downloader::onReadyRead()
0174 {
0175     switch (reply->error()) 
0176     {
0177         case QNetworkReply::NoError: 
0178         {            
0179             if(m_saveToFile)
0180             {
0181                 this->file->write(reply->readAll());
0182                 
0183             }else
0184             {
0185                 this->array->append(reply->readAll());
0186             }
0187             
0188             break;
0189         }
0190         
0191         default: 
0192         {
0193             qDebug() << reply->errorString();
0194             Q_EMIT this->warning(reply->errorString());
0195         }
0196     }
0197 }
0198 
0199 void FMH::Downloader::onReplyFinished()
0200 {   
0201    switch (reply->error()) 
0202    {
0203        case QNetworkReply::NoError:
0204        {           
0205            if(m_saveToFile)
0206            {        
0207                if (file->isOpen())
0208                {
0209                    file->close();            
0210                }   
0211                
0212                Q_EMIT this->fileSaved(this->file->fileName());        
0213                file->deleteLater();
0214                
0215            }else
0216            {
0217                Q_EMIT this->dataReady(*this->array);
0218            }
0219            
0220            Q_EMIT this->done();           
0221            Q_EMIT this->downloadReady();
0222            break;
0223        }
0224        
0225        default:
0226        {
0227            Q_EMIT this->warning(reply->errorString());
0228        }
0229    }    
0230 }