Changeset View
Changeset View
Standalone View
Standalone View
core/backends/lan/uploadjob.cpp
Context not available. | |||||
28 | 28 | | |||
---|---|---|---|---|---|
29 | UploadJob::UploadJob(const QSharedPointer<QIODevice>& source, const QString& deviceId) | 29 | UploadJob::UploadJob(const QSharedPointer<QIODevice>& source, const QString& deviceId) | ||
30 | : KJob() | 30 | : KJob() | ||
31 | , mInput(source) | 31 | , m_input(source) | ||
32 | , mServer(new Server(this)) | 32 | , m_server(new Server(this)) | ||
33 | , mSocket(nullptr) | 33 | , m_socket(nullptr) | ||
34 | , mPort(0) | 34 | , m_port(0) | ||
35 | , mDeviceId(deviceId) // We will use this info if link is on ssl, to send encrypted payload | 35 | , m_deviceId(deviceId) // We will use this info if link is on ssl, to send encrypted payload | ||
36 | { | 36 | { | ||
37 | connect(mInput.data(), &QIODevice::readyRead, this, &UploadJob::startUploading); | 37 | connect(m_input.data(), &QIODevice::readyRead, this, &UploadJob::startUploading); | ||
38 | connect(mInput.data(), &QIODevice::aboutToClose, this, &UploadJob::aboutToClose); | 38 | connect(m_input.data(), &QIODevice::aboutToClose, this, &UploadJob::aboutToClose); | ||
39 | } | 39 | } | ||
40 | 40 | | |||
41 | void UploadJob::start() | 41 | void UploadJob::start() | ||
42 | { | 42 | { | ||
43 | mPort = MIN_PORT; | 43 | m_port = MIN_PORT; | ||
44 | while (!mServer->listen(QHostAddress::Any, mPort)) { | 44 | while (!m_server->listen(QHostAddress::Any, m_port)) { | ||
45 | mPort++; | 45 | m_port++; | ||
46 | if (mPort > MAX_PORT) { //No ports available? | 46 | if (m_port > MAX_PORT) { //No ports available? | ||
47 | qCWarning(KDECONNECT_CORE) << "Error opening a port in range" << MIN_PORT << "-" << MAX_PORT; | 47 | qCWarning(KDECONNECT_CORE) << "Error opening a port in range" << MIN_PORT << "-" << MAX_PORT; | ||
48 | mPort = 0; | 48 | m_port = 0; | ||
49 | setError(1); | 49 | setError(1); | ||
50 | setErrorText(i18n("Couldn't find an available port")); | 50 | setErrorText(i18n("Couldn't find an available port")); | ||
51 | emitResult(); | 51 | emitResult(); | ||
52 | return; | 52 | return; | ||
53 | } | 53 | } | ||
54 | } | 54 | } | ||
55 | connect(mServer, &QTcpServer::newConnection, this, &UploadJob::newConnection); | 55 | connect(m_server, &QTcpServer::newConnection, this, &UploadJob::newConnection); | ||
56 | } | 56 | } | ||
57 | 57 | | |||
58 | void UploadJob::newConnection() | 58 | void UploadJob::newConnection() | ||
59 | { | 59 | { | ||
60 | if (!mInput->open(QIODevice::ReadOnly)) { | 60 | if (!m_input->open(QIODevice::ReadOnly)) { | ||
61 | qCWarning(KDECONNECT_CORE) << "error when opening the input to upload"; | 61 | qCWarning(KDECONNECT_CORE) << "error when opening the input to upload"; | ||
62 | return; //TODO: Handle error, clean up... | 62 | return; //TODO: Handle error, clean up... | ||
63 | } | 63 | } | ||
64 | 64 | | |||
65 | Server* server = qobject_cast<Server*>(sender()); | 65 | Server* server = qobject_cast<Server*>(sender()); | ||
66 | // FIXME : It is called again when payload sending is finished. Unsolved mystery :( | 66 | // FIXME : It is called again when payload sending is finished. Unsolved mystery :( | ||
67 | disconnect(mServer, &QTcpServer::newConnection, this, &UploadJob::newConnection); | 67 | disconnect(m_server, &QTcpServer::newConnection, this, &UploadJob::newConnection); | ||
68 | 68 | | |||
69 | mSocket = server->nextPendingConnection(); | 69 | m_socket = server->nextPendingConnection(); | ||
70 | mSocket->setParent(this); | 70 | m_socket->setParent(this); | ||
71 | connect(mSocket, &QSslSocket::disconnected, this, &UploadJob::cleanup); | 71 | connect(m_socket, &QSslSocket::disconnected, this, &UploadJob::cleanup); | ||
72 | connect(mSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(socketFailed(QAbstractSocket::SocketError))); | 72 | connect(m_socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(socketFailed(QAbstractSocket::SocketError))); | ||
73 | connect(mSocket, SIGNAL(sslErrors(QList<QSslError>)), this, SLOT(sslErrors(QList<QSslError>))); | 73 | connect(m_socket, SIGNAL(sslErrors(QList<QSslError>)), this, SLOT(sslErrors(QList<QSslError>))); | ||
74 | connect(mSocket, &QSslSocket::encrypted, this, &UploadJob::startUploading); | 74 | connect(m_socket, &QSslSocket::encrypted, this, &UploadJob::startUploading); | ||
75 | // connect(mSocket, &QAbstractSocket::stateChanged, [](QAbstractSocket::SocketState state){ qDebug() << "statechange" << state; }); | 75 | // connect(mSocket, &QAbstractSocket::stateChanged, [](QAbstractSocket::SocketState state){ qDebug() << "statechange" << state; }); | ||
76 | 76 | | |||
77 | LanLinkProvider::configureSslSocket(mSocket, mDeviceId, true); | 77 | LanLinkProvider::configureSslSocket(m_socket, m_deviceId, true); | ||
78 | 78 | | |||
79 | mSocket->startServerEncryption(); | 79 | m_socket->startServerEncryption(); | ||
80 | } | 80 | } | ||
81 | 81 | | |||
82 | void UploadJob::startUploading() | 82 | void UploadJob::startUploading() | ||
83 | { | 83 | { | ||
84 | while ( mInput->bytesAvailable() > 0 ) | 84 | while ( m_input->bytesAvailable() > 0 ) | ||
85 | { | 85 | { | ||
86 | qint64 bytes = qMin(mInput->bytesAvailable(), (qint64)4096); | 86 | qint64 bytes = qMin(m_input->bytesAvailable(), (qint64)4096); | ||
87 | int w = mSocket->write(mInput->read(bytes)); | 87 | int w = m_socket->write(m_input->read(bytes)); | ||
88 | if (w<0) { | 88 | if (w<0) { | ||
89 | qCWarning(KDECONNECT_CORE) << "error when writing data to upload" << bytes << mInput->bytesAvailable(); | 89 | qCWarning(KDECONNECT_CORE) << "error when writing data to upload" << bytes << m_input->bytesAvailable(); | ||
90 | break; | 90 | break; | ||
91 | } | 91 | } | ||
92 | else | 92 | else | ||
93 | { | 93 | { | ||
94 | while ( mSocket->flush() ); | 94 | while ( m_socket->flush() ); | ||
95 | } | 95 | } | ||
96 | } | 96 | } | ||
97 | mInput->close(); | 97 | m_input->close(); | ||
98 | } | 98 | } | ||
99 | 99 | | |||
100 | void UploadJob::aboutToClose() | 100 | void UploadJob::aboutToClose() | ||
101 | { | 101 | { | ||
102 | // qDebug() << "closing..."; | 102 | // qDebug() << "closing..."; | ||
103 | mSocket->disconnectFromHost(); | 103 | m_socket->disconnectFromHost(); | ||
104 | } | 104 | } | ||
105 | 105 | | |||
106 | void UploadJob::cleanup() | 106 | void UploadJob::cleanup() | ||
107 | { | 107 | { | ||
108 | mSocket->close(); | 108 | m_socket->close(); | ||
109 | // qDebug() << "closed!"; | 109 | // qDebug() << "closed!"; | ||
110 | emitResult(); | 110 | emitResult(); | ||
111 | } | 111 | } | ||
112 | 112 | | |||
113 | QVariantMap UploadJob::transferInfo() | 113 | QVariantMap UploadJob::transferInfo() | ||
114 | { | 114 | { | ||
115 | Q_ASSERT(mPort != 0); | 115 | Q_ASSERT(m_port != 0); | ||
116 | return {{"port", mPort}}; | 116 | return {{"port", m_port}}; | ||
117 | } | 117 | } | ||
118 | 118 | | |||
119 | void UploadJob::socketFailed(QAbstractSocket::SocketError error) | 119 | void UploadJob::socketFailed(QAbstractSocket::SocketError error) | ||
Context not available. | |||||
121 | qWarning() << "error uploading" << error; | 121 | qWarning() << "error uploading" << error; | ||
122 | setError(2); | 122 | setError(2); | ||
123 | emitResult(); | 123 | emitResult(); | ||
124 | mSocket->close(); | 124 | m_socket->close(); | ||
125 | } | 125 | } | ||
126 | 126 | | |||
127 | void UploadJob::sslErrors(const QList<QSslError>& errors) | 127 | void UploadJob::sslErrors(const QList<QSslError>& errors) | ||
Context not available. | |||||
129 | qWarning() << "ssl errors" << errors; | 129 | qWarning() << "ssl errors" << errors; | ||
130 | setError(1); | 130 | setError(1); | ||
131 | emitResult(); | 131 | emitResult(); | ||
132 | mSocket->close(); | 132 | m_socket->close(); | ||
133 | } | 133 | } | ||
Context not available. |