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"