From 6c8a5935c9b7b13e611cfbf826ac6c245ee13b7c Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Thu, 27 Aug 2015 22:22:51 -0700 Subject: [PATCH] NetworkTable: Fix table and key listener behavior. The implemented behavior didn't match the old networktables implementation. --- src/networktables/NetworkTable.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/networktables/NetworkTable.cpp b/src/networktables/NetworkTable.cpp index 8c68b1ed52..200ec5631f 100644 --- a/src/networktables/NetworkTable.cpp +++ b/src/networktables/NetworkTable.cpp @@ -67,10 +67,15 @@ void NetworkTable::AddTableListener(ITableListener* listener, bool immediateNotify) { llvm::SmallString<128> path(m_path); path += PATH_SEPARATOR_CHAR; + std::size_t prefix_len = path.size(); unsigned int id = nt::AddEntryListener( path, [=](unsigned int uid, StringRef name, std::shared_ptr value, - bool is_new) { listener->ValueChanged(this, name, value, is_new); }, + bool is_new) { + StringRef relative_key = name.substr(prefix_len); + if (relative_key.find(PATH_SEPARATOR_CHAR) != StringRef::npos) return; + listener->ValueChanged(this, relative_key, value, is_new); + }, immediateNotify); m_listeners.emplace_back(listener, id); } @@ -80,11 +85,15 @@ void NetworkTable::AddTableListener(StringRef key, bool immediateNotify) { llvm::SmallString<128> path(m_path); path += PATH_SEPARATOR_CHAR; + std::size_t prefix_len = path.size(); path += key; unsigned int id = nt::AddEntryListener( path, [=](unsigned int uid, StringRef name, std::shared_ptr value, - bool is_new) { listener->ValueChanged(this, name, value, is_new); }, + bool is_new) { + if (name != path) return; + listener->ValueChanged(this, name.substr(prefix_len), value, is_new); + }, immediateNotify); m_listeners.emplace_back(listener, id); }