#include "iomuliplexer.h" #include VirutalIODevice::VirutalIODevice(QObject* parent): QBuffer(parent) { } qint64 VirutalIODevice::writeData(const char *data, qint64 len) { blockSignals(true); qint64 ret = QBuffer::writeData(data, len); blockSignals(false); masterReadyRead(); return ret; } qint64 VirutalIODevice::masterWrite(const QByteArray &byteArray) { return masterWrite(byteArray.data(), byteArray.length()); } qint64 VirutalIODevice::masterWrite(const char *data, qint64 maxSize) { blockSignals(true); qint64 ret = QBuffer::writeData(data, maxSize); blockSignals(false); readyRead(); return ret; } IoMuliplexer::IoMuliplexer(QIODevice* mainDevice, QObject* Parent): IoMuliplexer(Parent) { setIoDevice(mainDevice); } IoMuliplexer::IoMuliplexer(QObject* Parent): QObject(Parent) { } IoMuliplexer::~IoMuliplexer() { for(size_t i = 0; i < ioDevices_.size(); ++i) delete ioDevices_[i]; ioDevices_.clear(); } void IoMuliplexer::setIoDevice(QIODevice* mainDevice) { mainDevice_ = mainDevice; connect(mainDevice_, &QIODevice::readyRead, this, &IoMuliplexer::mainIsReadyRead); } QIODevice* IoMuliplexer::getIoDevice() { ioDevices_.push_back(new VirutalIODevice); ioDevices_.back()->open(QIODevice::ReadWrite); connect(ioDevices_.back(), &VirutalIODevice::masterReadyRead, this, &IoMuliplexer::clientIsReadyRead); return ioDevices_.back(); } void IoMuliplexer::clientIsReadyRead() { VirutalIODevice* device = dynamic_cast(sender()); if(device) { QByteArray array = device->readAll(); mainDevice_->write(array); } } void IoMuliplexer::mainIsReadyRead() { QByteArray array = mainDevice_->readAll(); for(size_t i = 0; i < ioDevices_.size(); ++i) ioDevices_[i]->masterWrite(array); }