Files
qt-migration-legatus/qt6-after/qt6-migrated-legatus/Z/src/tcpserver/cbi_recvfile.cpp
T

87 lines
1.7 KiB
C++
Executable File

#include "cbi_recvfile.h"
#include "workerbase.h"
#include <QtNetwork/QAbstractSocket>
#include <QtCore/QList>
#include <QtCore/QFile>
#include <stdio.h>
CBI_Recvfile::CBI_Recvfile(unsigned short port)
: CommandInterface(port, "RECV_FILE")
{}
void CBI_Recvfile::handleCommandInternal(const QVector<QByteArray> &args)
{
if (args.count() != 2)
{
writeError(QLatin1String("Invalid arg count: RECV_FILE <filename> <filesize>"));
return;
}
QString fn = QString::fromUtf8(args[0]);
int size;
getValue(args[1], size);
QFile *f = new QFile(fn);
if (!f->open(QIODevice::WriteOnly | QIODevice::Truncate))
{
writeError(QStringLiteral("Could not open %1 for writing").arg(fn));
return;
}
m_wbMap.insert(workerBase(), QPair<QIODevice *, int>(f, size));
workerBase()->redirectDataHandling(true, this);
}
void CBI_Recvfile::newPlainData()
{
WorkerBase *wb = workerBase();
QAbstractSocket *in = socket();
QIODevice *out = m_wbMap[ wb ].first;
if (!out)
{
in->write("ERROR\n");
wb->redirectDataHandling(false);
return;
}
int size = m_wbMap[ wb ].second;
QByteArray ba(10, 0);
do
{
qint64 bytesRead = in->read(ba.data(), ba.size() < size ? ba.size() : size);
if (bytesRead < 0)
{
in->write("ERROR\n");
m_wbMap.remove(wb);
wb->redirectDataHandling(false);
return;
}
size -= bytesRead;
out->write(ba.constData(), bytesRead);
}
while (size > 0 && in->bytesAvailable());
if (size != 0)
{
m_wbMap[ wb ].second = size;
return;
}
out->close();
delete out;
m_wbMap.remove(wb);
wb->redirectDataHandling(false);
}
QString CBI_Recvfile::help() const
{
return QLatin1String("RECV_FILE <filename> <filesize>");
}