QString EQPacketFormat::headerFlags(const QString& prefix, bool brief) const { QString tmp; if (m_isValid) { if (brief) tmp = prefix + ": "; else tmp = prefix + " Hdr (" + QString::number(flagsHi(), 16) + ", " + QString::number(flagsLo(), 16) + "): "; tmp += m_packet->headerFlags("", true); if (!brief) { if (isARQ()) tmp += QString("arq: ") + QString::number(arq(), 16) + ", "; if (isFragment()) tmp += QString("FragSeq: ") + QString::number(fragSeq(), 16) + ", FragCur: " + QString::number(fragCur(), 16) + ", FragTot: " + QString::number(fragTot(), 16) + ", "; tmp += QString("Opcode: ") + QString::number(eqntohuint16(payload()), 16); } } else tmp = prefix + ": INVALID CRC32! Possible non-EQ packet?!"; return tmp; }
uint16_t getFragmentOffset() { if (isFragment()) return m_FragHeader->getFragmentOffset(); return 0; }
bool isLastFragment() { if (isFragment()) return m_FragHeader->isLastFragment(); return false; }
// ---------------------------------------------------------------------------- bool xpcc::CanConnectorBase::convertToHeader(const uint32_t & identifier, xpcc::Header & header) { const uint8_t *ptr = reinterpret_cast<const uint8_t *>(&identifier); header.packetIdentifier = ptr[0]; header.source = ptr[1]; header.destination = ptr[2]; uint8_t flags = ptr[3]; if (flags & 0x04) { header.isAcknowledge = true; } else { header.isAcknowledge = false; } switch (flags & 0x18) { case 0x00: header.type = xpcc::Header::REQUEST; break; case 0x08: header.type = xpcc::Header::RESPONSE; break; case 0x10: header.type = xpcc::Header::NEGATIVE_RESPONSE; break; default: // unknown type //XPCC_LOG_ERROR << "Unknown Type" << xpcc::flush; header.type = xpcc::Header::REQUEST; } // check if the message is a fragment return isFragment(identifier); }
//---------------------------------------------------------------------- // EQPacketFormatRaw class methods QString EQPacketFormatRaw::headerFlags(const QString& prefix, bool brief) const { QString tmp; if (!prefix.isEmpty()) { if (brief) tmp = prefix + ": "; else tmp = prefix + "[Hdr (" + QString::number(flagsHi(), 16) + ", " + QString::number(flagsLo(), 16) + "): "; } else if (!brief) tmp = "[Hdr (" + QString::number(flagsHi(), 16) + ", " + QString::number(flagsLo(), 16) + "): "; if (isARQ()) tmp += "ARQ, "; if (isClosingLo()) tmp += "closingLo, "; if (isFragment()) tmp += "Fragment, "; if (isASQ()) tmp += "ASQ, "; if (isSEQStart()) tmp += "SEQStart, "; if (isClosingHi()) tmp += "closingHi, "; if (isSEQEnd()) tmp += "SEQEnd, "; if (isARSP()) tmp += "ARSP, "; if (isNAK()) tmp += "NAK, "; if (isSpecARQ()) tmp += "SpecARQ, "; if (m_flagsHi.m_unknown1) tmp += "HiUnknown1, "; if (skip() != 0) tmp += QString("Skip: ") + QString::number(skip(), 16) + ", "; tmp += QString("seq: ") + QString::number(seq(), 16); tmp += "] "; if (!brief) { if (isARQ()) tmp += QString("[ARQ: ") + QString::number(arq(), 16) + "] "; if (isFragment()) { tmp += QString("[FragSeq: ") + QString::number(fragSeq(), 16) + ", FragCur: " + QString::number(fragCur(), 16) + ", FragTot: " + QString::number(fragTot(), 16) + "] "; } } return tmp; }
bool BasicModem::processInput(std::string& str) { bool got_line = false; while (!m_chars.empty()) { char c = m_chars.front(); m_chars.pop(); m_line.push_back(c); //!@fixme: concurrency hazard. if (c == m_line_term_in[m_line_term_idx]) { ++m_line_term_idx; if (m_line_term_idx == m_line_term_in.size()) { m_line_term_idx = 0; got_line = true; break; } } else { } } if (isFragment(m_line)) { getTask()->inf("fragment: %s", Streams::sanitize(m_line).c_str()); return false; } // No complete line is available. if (!got_line) return false; if (m_line.size() <= m_line_term_in.size()) { str = ""; return true; } // Remove termination characters. str = m_line; str.resize(m_line.size() - m_line_term_in.size()); if (m_line_trim) str = Utils::String::trim(str); // Got a complete line, but it's empty. if (str.empty()) return true; m_task->spew("recv: %s", Streams::sanitize(str).c_str()); m_line.clear(); if (!m_skip_line.empty()) { if (m_skip_line == str) { str.clear(); m_skip_line.clear(); } } return true; }