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"