87 lines
1.7 KiB
C++
Executable File
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>");
|
|
}
|