File indexing completed on 2024-05-12 05:22:09

0001 /*
0002     SPDX-FileCopyrightText: 2020 David Barchiesi <david@barchie.si>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005 */
0006 
0007 #include "mainwindow.h"
0008 
0009 #include "core/account.h"
0010 #include "core/authjob.h"
0011 #include "drive/file.h"
0012 
0013 #include <QDebug>
0014 #include <QFileDialog>
0015 
0016 MainWindow::MainWindow(QWidget *parent)
0017     : QMainWindow(parent)
0018 {
0019     /* Initialize GUI */
0020     ui.setupUi(this);
0021     connect(ui.authButton, &QAbstractButton::clicked, this, &MainWindow::authenticate);
0022     connect(ui.browseButton, &QAbstractButton::clicked, this, &MainWindow::browseFiles);
0023     connect(ui.uploadButton, &QAbstractButton::clicked, this, &MainWindow::uploadFile);
0024     setInputsEnabled(false);
0025 }
0026 
0027 void MainWindow::authenticate()
0028 {
0029     auto account = KGAPI2::AccountPtr::create();
0030     account->setScopes({KGAPI2::Account::driveScopeUrl()});
0031 
0032     /* Create AuthJob to retrieve OAuth tokens for the account */
0033     auto *authJob = new KGAPI2::AuthJob(account, QStringLiteral("554041944266.apps.googleusercontent.com"), QStringLiteral("mdT1DjzohxN3npUUzkENT0gO"));
0034     connect(authJob, &KGAPI2::Job::finished, this, [this, authJob]() {
0035         /* Always remember to delete the jobs, otherwise your application will
0036          * leak memory. */
0037         authJob->deleteLater();
0038 
0039         if (authJob->error() != KGAPI2::NoError) {
0040             ui.statusbar->showMessage(QStringLiteral("Error: %1").arg(authJob->errorString()));
0041             return;
0042         }
0043 
0044         m_account = authJob->account();
0045 
0046         ui.authStatusLabel->setText(QStringLiteral("Authenticated"));
0047         ui.authButton->setEnabled(false);
0048         setInputsEnabled(true);
0049     });
0050 }
0051 
0052 void MainWindow::browseFiles()
0053 {
0054     const auto fileName = QFileDialog::getOpenFileName(this, tr("Select file"));
0055     ui.sourceLineEdit->setText(fileName);
0056 }
0057 
0058 void MainWindow::uploadFile()
0059 {
0060     if (ui.sourceLineEdit->text().isEmpty()) {
0061         ui.statusbar->showMessage(QStringLiteral("Error: must specify source file."));
0062         return;
0063     }
0064 
0065     m_uploadingFile = std::make_unique<QFile>(ui.sourceLineEdit->text());
0066     if (!m_uploadingFile->open(QIODevice::ReadOnly)) {
0067         ui.statusbar->showMessage(QStringLiteral("Error: source file not valid."));
0068         return;
0069     }
0070 
0071     auto uploadFile = KGAPI2::Drive::FilePtr::create();
0072     QFileInfo fileInfo(m_uploadingFile->fileName());
0073     uploadFile->setTitle(fileInfo.fileName());
0074 
0075     KGAPI2::Drive::FileResumableCreateJob *fileCreateJob = nullptr;
0076     if (ui.writeOnSignalRadioButton->isChecked()) {
0077         fileCreateJob = new KGAPI2::Drive::FileResumableCreateJob(uploadFile, m_account, this);
0078         connect(fileCreateJob, &KGAPI2::Drive::FileResumableCreateJob::readyWrite, this, &MainWindow::slotFileCreateJobReadyWrite);
0079     } else {
0080         fileCreateJob = new KGAPI2::Drive::FileResumableCreateJob(m_uploadingFile.get(), uploadFile, m_account, this);
0081     }
0082     fileCreateJob->setUploadSize(m_uploadingFile->size());
0083     connect(fileCreateJob, &KGAPI2::Drive::FileResumableCreateJob::finished, this, &MainWindow::slotFileCreateJobFinished);
0084     connect(fileCreateJob, &KGAPI2::Drive::FileResumableCreateJob::progress, this, &MainWindow::slotFileCreateJobProgress);
0085 
0086     ui.statusbar->clearMessage();
0087     m_bytesUploaded = 0;
0088     if (ui.writeOnSignalRadioButton->isChecked()) {
0089         m_fileUploadProgressBar = std::make_unique<QProgressBar>(ui.statusbar);
0090         m_fileUploadProgressBar->setFormat(QStringLiteral("Sent to Job: %v bytes [%p%]"));
0091         m_fileUploadProgressBar->setMaximum(m_uploadingFile->size());
0092         ui.statusbar->addWidget(m_fileUploadProgressBar.get());
0093     }
0094 
0095     m_jobUploadProgressBar = std::make_unique<QProgressBar>(ui.statusbar);
0096     m_jobUploadProgressBar->setFormat(QStringLiteral("Job progress: %v bytes [%p%]"));
0097     ui.statusbar->addWidget(m_jobUploadProgressBar.get());
0098 
0099     setInputsEnabled(false);
0100 }
0101 
0102 void MainWindow::slotFileCreateJobFinished(KGAPI2::Job *job)
0103 {
0104     qDebug() << "Completed job" << job << "error code:" << job->error() << "- message:" << job->errorString();
0105 
0106     auto fileCreateJob = qobject_cast<KGAPI2::Drive::FileResumableCreateJob *>(job);
0107     Q_ASSERT(fileCreateJob);
0108     fileCreateJob->deleteLater();
0109 
0110     if (fileCreateJob->error() != KGAPI2::NoError) {
0111         ui.statusbar->showMessage(QStringLiteral("Error: %1").arg(fileCreateJob->errorString()));
0112     } else {
0113         auto file = fileCreateJob->metadata();
0114         ui.statusbar->showMessage(QStringLiteral("Upload complete, id %1, size %2 (uploaded %3), mimeType %4")
0115                                       .arg(file->id())
0116                                       .arg(file->fileSize())
0117                                       .arg(m_bytesUploaded)
0118                                       .arg(file->mimeType()));
0119     }
0120 
0121     m_fileUploadProgressBar.reset();
0122     m_jobUploadProgressBar.reset();
0123 
0124     setInputsEnabled(true);
0125 }
0126 
0127 void MainWindow::slotFileCreateJobReadyWrite(KGAPI2::Drive::FileAbstractResumableJob *job)
0128 {
0129     const auto data = m_uploadingFile->read(50000);
0130     m_bytesUploaded += data.size();
0131     job->write(data);
0132 
0133     m_fileUploadProgressBar->setValue(m_bytesUploaded);
0134 }
0135 
0136 void MainWindow::slotFileCreateJobProgress(KGAPI2::Job *job, int base, int total)
0137 {
0138     Q_UNUSED(job)
0139 
0140     m_jobUploadProgressBar->setValue(base);
0141     m_jobUploadProgressBar->setMaximum(total);
0142 }
0143 
0144 void MainWindow::setInputsEnabled(bool enabled)
0145 {
0146     ui.sourceLineEdit->setEnabled(enabled);
0147     ui.browseButton->setEnabled(enabled);
0148     ui.writeOnSignalRadioButton->setEnabled(enabled);
0149     ui.passFileToJobRadioButton->setEnabled(enabled);
0150     ui.uploadButton->setEnabled(enabled);
0151 }
0152 
0153 #include "moc_mainwindow.cpp"