threadedRead now const uchar *
pipacketextractor Header mode now more flexible fix splitTime mode more refactoring add virtual override to functions remove piforeach replace 0 to nullptr iterate over pimap via iterators replace CONNECTU to CONNECT# with compile time check
This commit is contained in:
@@ -91,7 +91,9 @@ PIPacketExtractor::PIPacketExtractor(PIIODevice * device_, PIPacketExtractor::Sp
|
||||
|
||||
|
||||
void PIPacketExtractor::construct() {
|
||||
ret_func_header = ret_func_footer = 0;
|
||||
func_header = nullptr;
|
||||
func_footer = nullptr;
|
||||
func_payload = nullptr;
|
||||
setPayloadSize(0);
|
||||
setTimeout(100);
|
||||
#ifdef MICRO_PIP
|
||||
@@ -113,13 +115,25 @@ void PIPacketExtractor::propertyChanged(const char *) {
|
||||
dataSize = property("payloadSize").toInt();
|
||||
src_header = property("header").toByteArray();
|
||||
src_footer = property("footer").toByteArray();
|
||||
time_ = property("timeout").toDouble();
|
||||
packetSize_hf = src_header.size_s() + src_footer.size_s() + payloadSize();
|
||||
}
|
||||
|
||||
|
||||
int PIPacketExtractor::readDevice(void * read_to, int max_size) {
|
||||
if (dev) return dev->read(read_to, max_size);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
int PIPacketExtractor::writeDevice(const void * data, int max_size) {
|
||||
if (dev) return dev->write(data, max_size);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
void PIPacketExtractor::setDevice(PIIODevice * device_) {
|
||||
dev = device_;
|
||||
if (dev == 0) return;
|
||||
}
|
||||
|
||||
|
||||
@@ -152,23 +166,51 @@ void PIPacketExtractor::setFooter(const PIByteArray & data) {
|
||||
}
|
||||
|
||||
|
||||
bool PIPacketExtractor::threadedRead(uchar * readed, int size_) {
|
||||
int PIPacketExtractor::validateHeader(const uchar * src, const uchar * rec, int size) {
|
||||
if (func_header) return func_header(src, rec, size);
|
||||
for (int i = 0; i < size; ++i) {
|
||||
if (src[i] != rec[i]) return -1;
|
||||
}
|
||||
return dataSize;
|
||||
}
|
||||
|
||||
|
||||
bool PIPacketExtractor::validateFooter(const uchar * src, const uchar * rec, int size) {
|
||||
if (func_footer) return func_footer(src, rec, size);
|
||||
for (int i = 0; i < size; ++i) {
|
||||
if (src[i] != rec[i]) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool PIPacketExtractor::validatePayload(const uchar * rec, int size) {
|
||||
if (func_payload) return func_payload(rec, size);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool PIPacketExtractor::threadedRead(const uchar * readed, int size_) {
|
||||
//piCoutObj << "readed" << size_;
|
||||
int ss;
|
||||
switch (mode_) {
|
||||
case PIPacketExtractor::None:
|
||||
if (validatePayload(readed, size_))
|
||||
if (validatePayload(readed, size_)) {
|
||||
packetReceived(readed, size_);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case PIPacketExtractor::Header:
|
||||
tmpbuf.append(readed, size_);
|
||||
ss = src_header.size_s() + dataSize;
|
||||
ss = src_header.size_s();
|
||||
while (tmpbuf.size_s() >= ss) {
|
||||
while (!validateHeader(src_header.data(), tmpbuf.data(), src_header.size_s())) {
|
||||
int ns = validateHeader(src_header.data(), tmpbuf.data(), src_header.size_s());
|
||||
while (ns < 0) {
|
||||
tmpbuf.pop_front();
|
||||
++missed;
|
||||
if (tmpbuf.size_s() < ss) return true;
|
||||
if (tmpbuf.size() < src_header.size()) return true;
|
||||
ns = validateHeader(src_header.data(), tmpbuf.data(), src_header.size_s());
|
||||
}
|
||||
ss = src_header.size_s() + ns;
|
||||
while (!validatePayload(tmpbuf.data(src_header.size_s()), dataSize)) {
|
||||
tmpbuf.pop_front();
|
||||
++missed;
|
||||
@@ -179,56 +221,6 @@ bool PIPacketExtractor::threadedRead(uchar * readed, int size_) {
|
||||
}
|
||||
break;
|
||||
case PIPacketExtractor::Footer:
|
||||
/*memcpy(buffer.data(allReaded), readed, size_);
|
||||
allReaded += size_;
|
||||
footer_ = (mode_ == PIPacketExtractor::Footer);
|
||||
while (allReaded >= packetSize_hf + addSize && allReaded > 0) {
|
||||
if (!src_header.isEmpty()) {
|
||||
if (allReaded + curInd >= buffer_size) {
|
||||
memcpy(sbuffer.data(), buffer.data(), buffer_size);
|
||||
memcpy(buffer.data(), sbuffer.data(buffer_size - packetSize_hf), allReaded);
|
||||
allReaded = packetSize_hf;
|
||||
addSize = curInd = 0;
|
||||
}
|
||||
bool brk = false;
|
||||
while (!validateHeader((uchar * )(footer_ ? src_footer.data() : src_header.data()), buffer.data(curInd + (footer_ ? dataSize : 0)), footer_ ? src_footer.size_s() : src_header.size_s())) {
|
||||
++curInd; ++missed;
|
||||
if (packetSize_hf > 0) missed_packets = missed / packetSize_hf;
|
||||
if (curInd > addSize) {
|
||||
addSize += packetSize_hf;
|
||||
brk = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (brk) continue;
|
||||
//memcpy(mheader.data(), buffer.data(curInd + (footer_ ? dataSize : 0)), src_header.size_s());
|
||||
if (!src_header.isEmpty()) memcpy(src_header.data(), buffer.data(curInd), src_header.size_s());
|
||||
if (!validatePayload(buffer.data(curInd + src_header.size_s()), dataSize)) {
|
||||
++curInd; ++missed;
|
||||
if (packetSize_hf > 0) missed_packets = missed / packetSize_hf;
|
||||
continue;
|
||||
}
|
||||
packetReceived(buffer.data(curInd), packetSize_hf);
|
||||
memcpy(sbuffer.data(), buffer.data(), allReaded);
|
||||
memcpy(buffer.data(), sbuffer.data(packetSize_hf + curInd), allReaded);
|
||||
allReaded -= packetSize_hf + curInd;
|
||||
curInd = addSize = 0;
|
||||
} else {
|
||||
if (dataSize == 0) {
|
||||
if (validatePayload(buffer.data(), size_))
|
||||
packetReceived(buffer.data(), size_);
|
||||
memcpy(sbuffer.data(), buffer.data(), allReaded);
|
||||
memcpy(buffer.data(), sbuffer.data(size_), allReaded);
|
||||
allReaded -= size_;
|
||||
} else {
|
||||
if (validatePayload(buffer.data(), dataSize))
|
||||
packetReceived(buffer.data(), dataSize);
|
||||
memcpy(sbuffer.data(), buffer.data(), allReaded);
|
||||
memcpy(buffer.data(), sbuffer.data(packetSize_hf), allReaded);
|
||||
allReaded -= packetSize_hf;
|
||||
}
|
||||
}
|
||||
}*/
|
||||
tmpbuf.append(readed, size_);
|
||||
ss = src_footer.size_s() + dataSize;
|
||||
while (tmpbuf.size_s() >= ss) {
|
||||
@@ -252,7 +244,7 @@ bool PIPacketExtractor::threadedRead(uchar * readed, int size_) {
|
||||
while (tmpbuf.size_s() >= ss) {
|
||||
if (!header_found) {
|
||||
if (tmpbuf.size_s() < ss) return true;
|
||||
while (!validateHeader(src_header.data(), tmpbuf.data(), src_header.size_s())) {
|
||||
while (validateHeader(src_header.data(), tmpbuf.data(), src_header.size_s()) < 0) {
|
||||
tmpbuf.pop_front();
|
||||
++missed;
|
||||
if (tmpbuf.size_s() < ss) return true;
|
||||
@@ -310,3 +302,21 @@ bool PIPacketExtractor::threadedRead(uchar * readed, int size_) {
|
||||
PIString PIPacketExtractor::constructFullPathDevice() const {
|
||||
return "";
|
||||
}
|
||||
|
||||
|
||||
bool PIPacketExtractor::openDevice() {
|
||||
if (dev) return dev->open();
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool PIPacketExtractor::closeDevice() {
|
||||
if (dev) return dev->close();
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
PIIODevice::DeviceInfoFlags PIPacketExtractor::deviceInfoFlags() const {
|
||||
if (dev) return dev->infoFlags();
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user