diff --git a/YSFGateway/YSFNetwork.cpp b/YSFGateway/YSFNetwork.cpp index e58c832..3e75afa 100644 --- a/YSFGateway/YSFNetwork.cpp +++ b/YSFGateway/YSFNetwork.cpp @@ -34,6 +34,7 @@ m_addr(), m_addrLen(0U), m_poll(NULL), m_options(NULL), +m_opt(), m_unlink(NULL), m_buffer(1000U, "YSF Network Buffer"), m_pollTimer(1000U, 5U), @@ -66,6 +67,7 @@ m_addr(), m_addrLen(0U), m_poll(NULL), m_options(NULL), +m_opt(), m_unlink(NULL), m_buffer(1000U, "YSF Network Buffer"), m_pollTimer(1000U, 5U), @@ -94,6 +96,8 @@ m_linked(false) CYSFNetwork::~CYSFNetwork() { delete[] m_poll; + delete[] m_unlink; + delete[] m_options; } bool CYSFNetwork::open() @@ -147,21 +151,23 @@ void CYSFNetwork::writePoll(unsigned int count) for (unsigned int i = 0U; i < count; i++) m_socket.write(m_poll, 14U, m_addr, m_addrLen); - if (m_options != NULL) + if (!m_opt.empty()) m_socket.write(m_options, 50U, m_addr, m_addrLen); } void CYSFNetwork::setOptions(const std::string& options) { - std::string opt = options; - - if (opt.size() < 1) + if (options.empty()) { + m_opt.clear(); return; + } + + m_opt = options; - opt.resize(50, ' '); + m_opt.resize(50, ' '); - for (unsigned int i = 0U; i < (50 - 4 - YSF_CALLSIGN_LENGTH); i++) - m_options[i + 4U + YSF_CALLSIGN_LENGTH] = opt.at(i); + for (unsigned int i = 0U; i < (50U - 4U - YSF_CALLSIGN_LENGTH); i++) + m_options[i + 4U + YSF_CALLSIGN_LENGTH] = m_opt.at(i); } void CYSFNetwork::writeUnlink(unsigned int count) @@ -204,7 +210,7 @@ void CYSFNetwork::clock(unsigned int ms) m_linked = true; - if (m_options != NULL) + if (!m_opt.empty()) m_socket.write(m_options, 50U, m_addr, m_addrLen); } diff --git a/YSFGateway/YSFNetwork.h b/YSFGateway/YSFNetwork.h index 3411aa8..418af4b 100644 --- a/YSFGateway/YSFNetwork.h +++ b/YSFGateway/YSFNetwork.h @@ -41,7 +41,7 @@ public: void write(const unsigned char* data); void writePoll(unsigned int count = 1U); - void setOptions(const std::string& options = NULL); + void setOptions(const std::string& options = ""); void writeUnlink(unsigned int count = 1U); unsigned int read(unsigned char* data); @@ -57,6 +57,7 @@ private: unsigned int m_addrLen; unsigned char* m_poll; unsigned char* m_options; + std::string m_opt; unsigned char* m_unlink; CRingBuffer m_buffer; CTimer m_pollTimer; diff --git a/YSFParrot/Network.cpp b/YSFParrot/Network.cpp index ad41c85..48a2664 100644 --- a/YSFParrot/Network.cpp +++ b/YSFParrot/Network.cpp @@ -89,6 +89,10 @@ unsigned int CNetwork::read(unsigned char* data) return 0U; } + // Throw away incoming options messages + if (::memcmp(data, "YSFO", 4U) == 0) + return 0U; + // Handle incoming unlinks if (::memcmp(data, "YSFU", 4U) == 0) return 0U; diff --git a/YSFReflector/Network.cpp b/YSFReflector/Network.cpp index 1c1b5e4..4947892 100644 --- a/YSFReflector/Network.cpp +++ b/YSFReflector/Network.cpp @@ -104,15 +104,19 @@ unsigned int CNetwork::readData(unsigned char* data, unsigned int length, sockad if (len <= 0) return 0U; + if (m_debug) + CUtils::dump(1U, "YSF Network Data Received", data, len); + + // Throw away any options messages + if (::memcmp(data, "YSFO", 4U) == 0) + return 0U; + // Handle incoming status requests if (::memcmp(data, "YSFS", 4U) == 0) { m_socket.write(m_status, 42U, addr, addrLen); return 0U; } - if (m_debug) - CUtils::dump(1U, "YSF Network Data Received", data, len); - return len; }