File indexing completed on 2024-05-12 04:58:53

0001 /*
0002  * SPDX-FileCopyrightText: 2013 Albert Vaca <albertvaka@gmail.com>
0003  *
0004  * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005  */
0006 
0007 #include "uploadjob.h"
0008 
0009 #include <KLocalizedString>
0010 
0011 #include "core_debug.h"
0012 #include "kdeconnectconfig.h"
0013 #include "lanlinkprovider.h"
0014 #include <daemon.h>
0015 
0016 UploadJob::UploadJob(const NetworkPacket &networkPacket)
0017     : KJob()
0018     , m_networkPacket(networkPacket)
0019     , m_input(networkPacket.payload())
0020     , m_socket(nullptr)
0021 {
0022 }
0023 
0024 void UploadJob::setSocket(QSslSocket *socket)
0025 {
0026     m_socket = socket;
0027     m_socket->setParent(this);
0028 }
0029 
0030 void UploadJob::start()
0031 {
0032     if (!m_input->open(QIODevice::ReadOnly)) {
0033         qCWarning(KDECONNECT_CORE) << "error when opening the input to upload";
0034         return; // TODO: Handle error, clean up...
0035     }
0036 
0037     if (!m_socket) {
0038         qCWarning(KDECONNECT_CORE) << "you must call setSocket() before calling start()";
0039         return;
0040     }
0041 
0042     connect(m_input.data(), &QIODevice::aboutToClose, this, &UploadJob::aboutToClose);
0043 
0044     bytesUploaded = 0;
0045     setProcessedAmount(Bytes, bytesUploaded);
0046 
0047     connect(m_socket, &QSslSocket::encryptedBytesWritten, this, &UploadJob::encryptedBytesWritten);
0048 
0049     uploadNextPacket();
0050 }
0051 
0052 void UploadJob::uploadNextPacket()
0053 {
0054     qint64 bytesAvailable = m_input->bytesAvailable();
0055 
0056     if (bytesAvailable > 0) {
0057         qint64 bytesToSend = qMin(m_input->bytesAvailable(), (qint64)4096);
0058         bytesUploading = m_socket->write(m_input->read(bytesToSend));
0059     }
0060 
0061     if (bytesAvailable <= 0 || bytesUploading < 0) {
0062         m_input->close();
0063         disconnect(m_socket, &QSslSocket::encryptedBytesWritten, this, &UploadJob::encryptedBytesWritten);
0064     }
0065 }
0066 
0067 void UploadJob::encryptedBytesWritten(qint64 /*bytes*/)
0068 {
0069     if (m_socket->encryptedBytesToWrite() == 0) {
0070         bytesUploaded += bytesUploading;
0071         setProcessedAmount(Bytes, bytesUploaded);
0072 
0073         uploadNextPacket();
0074     }
0075 }
0076 
0077 void UploadJob::aboutToClose()
0078 {
0079     m_socket->disconnectFromHost();
0080     emitResult();
0081 }
0082 
0083 bool UploadJob::stop()
0084 {
0085     m_input->close();
0086 
0087     return true;
0088 }
0089 
0090 const NetworkPacket UploadJob::getNetworkPacket()
0091 {
0092     return m_networkPacket;
0093 }
0094 
0095 #include "moc_uploadjob.cpp"