#include "cbi_recvfile.h" #include "workerbase.h" #include #include #include #include CBI_Recvfile::CBI_Recvfile(unsigned short port) : CommandInterface(port, "RECV_FILE") {} void CBI_Recvfile::handleCommandInternal(const QVector &args) { if (args.count() != 2) { writeError(QLatin1String("Invalid arg count: RECV_FILE ")); 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(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 "); }