77 lines
1.7 KiB
C++
77 lines
1.7 KiB
C++
#include "iomuliplexer.h"
|
|
#include<QDebug>
|
|
|
|
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<VirutalIODevice*>(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);
|
|
}
|