10#include "connection_p.h"
11#include "connectionbackend_p.h"
12#include "kiocoredebug.h"
19void ConnectionPrivate::dequeue()
21 if (!backend || suspended) {
25 for (
const Task &task :
std::as_const(outgoingTasks)) {
28 outgoingTasks.clear();
30 if (!incomingTasks.isEmpty()) {
31 Q_EMIT q->readyRead();
35void ConnectionPrivate::commandReceived(
const Task &task)
38 if (!suspended && incomingTasks.isEmpty() && readMode == Connection::ReadMode::EventDriven) {
39 auto dequeueFunc = [
this]() {
44 incomingTasks.append(task);
47void ConnectionPrivate::disconnected()
50 if (readMode == Connection::ReadMode::EventDriven) {
55void ConnectionPrivate::setBackend(ConnectionBackend *b)
60 q->connect(backend, &ConnectionBackend::commandReceived, q, [
this](
const Task &task) {
61 commandReceived(task);
63 q->connect(backend, &ConnectionBackend::disconnected, q, [
this]() {
66 backend->setSuspended(suspended);
70Connection::Connection(
QObject *parent)
72 , d(new ConnectionPrivate)
77Connection::~Connection()
82void Connection::suspend()
87 d->backend->setSuspended(
true);
91void Connection::resume()
94 if (d->readMode == Connection::ReadMode::EventDriven) {
95 auto dequeueFunc = [
this]() {
102 d->suspended =
false;
104 d->backend->setSuspended(
false);
108void Connection::close()
111 d->backend->disconnect(
this);
112 d->backend->deleteLater();
113 d->backend =
nullptr;
115 d->outgoingTasks.clear();
116 d->incomingTasks.clear();
119bool Connection::isConnected()
const
121 return d->backend && d->backend->state == ConnectionBackend::Connected;
124bool Connection::inited()
const
129bool Connection::suspended()
const
134void Connection::connectToRemote(
const QUrl &address)
140 d->setBackend(
new ConnectionBackend(
this));
142 qCWarning(KIO_CORE) <<
"Unknown protocol requested:" << scheme <<
"(" <<
address <<
")";
148 if (!d->backend->connectToRemote(address)) {
151 d->backend =
nullptr;
158QString Connection::errorString()
const
161 return d->backend->errorString;
166bool Connection::send(
int cmd,
const QByteArray &data)
168 if (!inited() || !d->outgoingTasks.isEmpty()) {
172 d->outgoingTasks.
append(std::move(task));
175 return sendnow(cmd, data);
179bool Connection::sendnow(
int cmd,
const QByteArray &data)
181 if (!d->backend || data.
size() > 0xffffff || !isConnected()) {
186 return d->backend->sendCommand(cmd, data);
189bool Connection::hasTaskAvailable()
const
191 return !d->incomingTasks.isEmpty();
194bool Connection::waitForIncomingTask(
int ms)
196 if (!isConnected()) {
201 return d->backend->waitForIncomingTask(ms);
206int Connection::read(
int *_cmd,
QByteArray &data)
209 if (d->incomingTasks.isEmpty()) {
213 const Task &
task = d->incomingTasks.constFirst();
218 d->incomingTasks.removeFirst();
221 if (!d->suspended && !d->incomingTasks.isEmpty() && d->readMode == Connection::ReadMode::EventDriven) {
222 auto dequeueFunc = [
this]() {
231void Connection::setReadMode(ReadMode readMode)
233 d->readMode = readMode;
236#include "moc_connection_p.cpp"
A namespace for KIO globals.
PostalAddress address(const QVariant &location)
const QList< QKeySequence > & close()
QByteArray & append(QByteArrayView data)
qsizetype size() const const
QTaskBuilder< Task > task(Task &&task)