2015-07-23 01:23:09 -07:00
|
|
|
#include "networktables/NetworkTable.h"
|
|
|
|
|
|
|
|
|
|
#include <algorithm>
|
|
|
|
|
|
2016-11-04 16:01:42 -07:00
|
|
|
#include "llvm/raw_ostream.h"
|
2015-07-23 01:23:09 -07:00
|
|
|
#include "llvm/SmallString.h"
|
2015-09-19 12:18:25 -07:00
|
|
|
#include "llvm/StringMap.h"
|
2015-07-23 01:23:09 -07:00
|
|
|
#include "tables/ITableListener.h"
|
2015-12-06 22:39:38 -08:00
|
|
|
#include "tables/TableKeyNotDefinedException.h"
|
2015-07-23 01:23:09 -07:00
|
|
|
#include "ntcore.h"
|
|
|
|
|
|
|
|
|
|
using llvm::StringRef;
|
|
|
|
|
|
|
|
|
|
const char NetworkTable::PATH_SEPARATOR_CHAR = '/';
|
2015-09-19 11:40:31 -07:00
|
|
|
std::string NetworkTable::s_persistent_filename = "networktables.ini";
|
2015-07-23 01:23:09 -07:00
|
|
|
bool NetworkTable::s_client = false;
|
2016-11-04 16:01:42 -07:00
|
|
|
bool NetworkTable::s_enable_ds = true;
|
2015-07-23 01:23:09 -07:00
|
|
|
bool NetworkTable::s_running = false;
|
2015-09-19 11:44:14 -07:00
|
|
|
unsigned int NetworkTable::s_port = NT_DEFAULT_PORT;
|
2015-07-23 01:23:09 -07:00
|
|
|
|
|
|
|
|
void NetworkTable::Initialize() {
|
2015-09-15 23:28:41 -07:00
|
|
|
if (s_running) Shutdown();
|
2016-04-08 13:31:35 -07:00
|
|
|
if (s_client) {
|
2016-11-04 16:01:42 -07:00
|
|
|
nt::StartClient();
|
|
|
|
|
if (s_enable_ds) nt::StartDSClient(s_port);
|
2016-04-08 13:31:35 -07:00
|
|
|
} else
|
2015-09-19 11:44:14 -07:00
|
|
|
nt::StartServer(s_persistent_filename, "", s_port);
|
2015-07-23 01:23:09 -07:00
|
|
|
s_running = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void NetworkTable::Shutdown() {
|
2015-09-15 23:28:41 -07:00
|
|
|
if (!s_running) return;
|
2016-11-04 16:01:42 -07:00
|
|
|
if (s_client) {
|
|
|
|
|
nt::StopDSClient();
|
2015-07-23 01:23:09 -07:00
|
|
|
nt::StopClient();
|
2016-11-04 16:01:42 -07:00
|
|
|
} else
|
2015-07-23 01:23:09 -07:00
|
|
|
nt::StopServer();
|
|
|
|
|
s_running = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void NetworkTable::SetClientMode() { s_client = true; }
|
|
|
|
|
|
|
|
|
|
void NetworkTable::SetServerMode() { s_client = false; }
|
|
|
|
|
|
|
|
|
|
void NetworkTable::SetTeam(int team) {
|
2017-02-09 00:55:01 -08:00
|
|
|
std::pair<StringRef, unsigned int> servers[5];
|
2016-11-04 16:01:42 -07:00
|
|
|
|
|
|
|
|
// 10.te.am.2
|
|
|
|
|
llvm::SmallString<32> fixed;
|
|
|
|
|
{
|
|
|
|
|
llvm::raw_svector_ostream oss{fixed};
|
|
|
|
|
oss << "10." << static_cast<int>(team / 100) << '.'
|
|
|
|
|
<< static_cast<int>(team % 100) << ".2";
|
|
|
|
|
servers[0] = std::make_pair(oss.str(), s_port);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 172.22.11.2
|
|
|
|
|
servers[1] = std::make_pair("172.22.11.2", s_port);
|
|
|
|
|
|
|
|
|
|
// roboRIO-<team>-FRC.local
|
|
|
|
|
llvm::SmallString<32> mdns;
|
|
|
|
|
{
|
|
|
|
|
llvm::raw_svector_ostream oss{mdns};
|
|
|
|
|
oss << "roboRIO-" << team << "-FRC.local";
|
|
|
|
|
servers[2] = std::make_pair(oss.str(), s_port);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// roboRIO-<team>-FRC.lan
|
|
|
|
|
llvm::SmallString<32> mdns_lan;
|
|
|
|
|
{
|
|
|
|
|
llvm::raw_svector_ostream oss{mdns_lan};
|
|
|
|
|
oss << "roboRIO-" << team << "-FRC.lan";
|
|
|
|
|
servers[3] = std::make_pair(oss.str(), s_port);
|
|
|
|
|
}
|
|
|
|
|
|
2017-02-09 00:55:01 -08:00
|
|
|
// roboRIO-<team>-FRC.frc-field.local
|
|
|
|
|
llvm::SmallString<64> field_local;
|
|
|
|
|
{
|
|
|
|
|
llvm::raw_svector_ostream oss{field_local};
|
|
|
|
|
oss << "roboRIO-" << team << "-FRC.frc-field.local";
|
|
|
|
|
servers[4] = std::make_pair(oss.str(), s_port);
|
|
|
|
|
}
|
|
|
|
|
|
2016-11-04 16:01:42 -07:00
|
|
|
nt::SetServer(servers);
|
2015-07-23 01:23:09 -07:00
|
|
|
}
|
|
|
|
|
|
2016-04-08 13:31:35 -07:00
|
|
|
void NetworkTable::SetIPAddress(StringRef address) {
|
2016-11-04 16:01:42 -07:00
|
|
|
llvm::SmallString<32> addr_copy{address};
|
|
|
|
|
nt::SetServer(addr_copy.c_str(), s_port);
|
|
|
|
|
|
|
|
|
|
// Stop the DS client if we're explicitly connecting to localhost
|
|
|
|
|
if (address == "localhost" || address == "127.0.0.1")
|
|
|
|
|
nt::StopDSClient();
|
|
|
|
|
else if (s_enable_ds)
|
|
|
|
|
nt::StartDSClient(s_port);
|
2016-04-08 13:31:35 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void NetworkTable::SetIPAddress(llvm::ArrayRef<std::string> addresses) {
|
2016-11-04 16:01:42 -07:00
|
|
|
llvm::SmallVector<std::pair<StringRef, unsigned int>, 8> servers;
|
|
|
|
|
for (const auto& ip_address : addresses)
|
|
|
|
|
servers.emplace_back(std::make_pair(ip_address, s_port));
|
|
|
|
|
nt::SetServer(servers);
|
|
|
|
|
|
|
|
|
|
// Stop the DS client if we're explicitly connecting to localhost
|
|
|
|
|
if (!addresses.empty() &&
|
|
|
|
|
(addresses[0] == "localhost" || addresses[0] == "127.0.0.1"))
|
|
|
|
|
nt::StopDSClient();
|
|
|
|
|
else if (s_enable_ds)
|
|
|
|
|
nt::StartDSClient(s_port);
|
2016-04-08 13:31:35 -07:00
|
|
|
}
|
2015-09-15 23:28:41 -07:00
|
|
|
|
2015-09-19 11:44:14 -07:00
|
|
|
void NetworkTable::SetPort(unsigned int port) { s_port = port; }
|
|
|
|
|
|
2016-11-04 16:01:42 -07:00
|
|
|
void NetworkTable::SetDSClientEnabled(bool enabled) {
|
|
|
|
|
s_enable_ds = enabled;
|
|
|
|
|
if (s_enable_ds)
|
|
|
|
|
nt::StartDSClient(s_port);
|
|
|
|
|
else
|
|
|
|
|
nt::StopDSClient();
|
|
|
|
|
}
|
|
|
|
|
|
2015-09-19 11:40:31 -07:00
|
|
|
void NetworkTable::SetPersistentFilename(StringRef filename) {
|
|
|
|
|
s_persistent_filename = filename;
|
|
|
|
|
}
|
|
|
|
|
|
2015-09-15 23:28:41 -07:00
|
|
|
void NetworkTable::SetNetworkIdentity(StringRef name) {
|
|
|
|
|
nt::SetNetworkIdentity(name);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void NetworkTable::GlobalDeleteAll() { nt::DeleteAllEntries(); }
|
|
|
|
|
|
|
|
|
|
void NetworkTable::Flush() { nt::Flush(); }
|
|
|
|
|
|
|
|
|
|
void NetworkTable::SetUpdateRate(double interval) {
|
|
|
|
|
nt::SetUpdateRate(interval);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const char* NetworkTable::SavePersistent(llvm::StringRef filename) {
|
|
|
|
|
return nt::SavePersistent(filename);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const char* NetworkTable::LoadPersistent(
|
|
|
|
|
llvm::StringRef filename,
|
|
|
|
|
std::function<void(size_t line, const char* msg)> warn) {
|
|
|
|
|
return nt::LoadPersistent(filename, warn);
|
2015-07-23 01:23:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::shared_ptr<NetworkTable> NetworkTable::GetTable(StringRef key) {
|
|
|
|
|
if (!s_running) Initialize();
|
2016-01-14 21:38:04 -08:00
|
|
|
if (key.empty() || key[0] == PATH_SEPARATOR_CHAR) {
|
|
|
|
|
return std::make_shared<NetworkTable>(key, private_init());
|
|
|
|
|
} else {
|
|
|
|
|
llvm::SmallString<128> path;
|
2015-08-28 12:24:33 -07:00
|
|
|
path += PATH_SEPARATOR_CHAR;
|
|
|
|
|
path += key;
|
2016-01-14 21:38:04 -08:00
|
|
|
return std::make_shared<NetworkTable>(path, private_init());
|
2015-08-28 12:24:33 -07:00
|
|
|
}
|
2015-07-23 01:23:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
NetworkTable::NetworkTable(StringRef path, const private_init&)
|
|
|
|
|
: m_path(path) {}
|
|
|
|
|
|
|
|
|
|
NetworkTable::~NetworkTable() {
|
2016-11-03 21:03:45 -07:00
|
|
|
for (auto& i : m_listeners) nt::RemoveEntryListener(i.second);
|
2015-07-23 01:23:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void NetworkTable::AddTableListener(ITableListener* listener) {
|
2015-09-25 11:54:17 -07:00
|
|
|
AddTableListenerEx(listener, NT_NOTIFY_NEW | NT_NOTIFY_UPDATE);
|
2015-07-23 01:23:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void NetworkTable::AddTableListener(ITableListener* listener,
|
|
|
|
|
bool immediateNotify) {
|
2015-09-25 11:54:17 -07:00
|
|
|
unsigned int flags = NT_NOTIFY_NEW | NT_NOTIFY_UPDATE;
|
|
|
|
|
if (immediateNotify) flags |= NT_NOTIFY_IMMEDIATE;
|
|
|
|
|
AddTableListenerEx(listener, flags);
|
2015-09-23 00:56:08 -07:00
|
|
|
}
|
|
|
|
|
|
2015-09-25 11:54:17 -07:00
|
|
|
void NetworkTable::AddTableListenerEx(ITableListener* listener,
|
|
|
|
|
unsigned int flags) {
|
2015-08-27 23:39:52 -07:00
|
|
|
std::lock_guard<std::mutex> lock(m_mutex);
|
2015-07-23 01:23:09 -07:00
|
|
|
llvm::SmallString<128> path(m_path);
|
|
|
|
|
path += PATH_SEPARATOR_CHAR;
|
2015-08-27 22:22:51 -07:00
|
|
|
std::size_t prefix_len = path.size();
|
2015-07-23 01:23:09 -07:00
|
|
|
unsigned int id = nt::AddEntryListener(
|
|
|
|
|
path,
|
2015-11-28 13:12:30 -08:00
|
|
|
[=](unsigned int /*uid*/, StringRef name,
|
|
|
|
|
std::shared_ptr<nt::Value> value, unsigned int flags_) {
|
2015-08-27 22:22:51 -07:00
|
|
|
StringRef relative_key = name.substr(prefix_len);
|
|
|
|
|
if (relative_key.find(PATH_SEPARATOR_CHAR) != StringRef::npos) return;
|
2015-09-25 11:54:17 -07:00
|
|
|
listener->ValueChangedEx(this, relative_key, value, flags_);
|
2015-08-27 22:22:51 -07:00
|
|
|
},
|
2015-09-25 11:54:17 -07:00
|
|
|
flags);
|
2015-07-23 01:23:09 -07:00
|
|
|
m_listeners.emplace_back(listener, id);
|
|
|
|
|
}
|
|
|
|
|
|
2015-09-23 00:56:08 -07:00
|
|
|
void NetworkTable::AddTableListener(StringRef key, ITableListener* listener,
|
2015-07-23 01:23:09 -07:00
|
|
|
bool immediateNotify) {
|
2015-09-25 11:54:17 -07:00
|
|
|
unsigned int flags = NT_NOTIFY_NEW | NT_NOTIFY_UPDATE;
|
|
|
|
|
if (immediateNotify) flags |= NT_NOTIFY_IMMEDIATE;
|
|
|
|
|
AddTableListenerEx(key, listener, flags);
|
2015-09-23 00:56:08 -07:00
|
|
|
}
|
|
|
|
|
|
2015-09-25 11:54:17 -07:00
|
|
|
void NetworkTable::AddTableListenerEx(StringRef key, ITableListener* listener,
|
|
|
|
|
unsigned int flags) {
|
2015-08-27 23:39:52 -07:00
|
|
|
std::lock_guard<std::mutex> lock(m_mutex);
|
2015-07-23 01:23:09 -07:00
|
|
|
llvm::SmallString<128> path(m_path);
|
|
|
|
|
path += PATH_SEPARATOR_CHAR;
|
2015-08-27 22:22:51 -07:00
|
|
|
std::size_t prefix_len = path.size();
|
2015-07-23 01:23:09 -07:00
|
|
|
path += key;
|
|
|
|
|
unsigned int id = nt::AddEntryListener(
|
|
|
|
|
path,
|
2016-11-03 21:03:45 -07:00
|
|
|
[=](unsigned int /*uid*/, StringRef name,
|
|
|
|
|
std::shared_ptr<nt::Value> value, unsigned int flags_) {
|
2015-08-27 22:22:51 -07:00
|
|
|
if (name != path) return;
|
2015-09-25 11:54:17 -07:00
|
|
|
listener->ValueChangedEx(this, name.substr(prefix_len), value, flags_);
|
2015-08-27 22:22:51 -07:00
|
|
|
},
|
2015-09-25 11:54:17 -07:00
|
|
|
flags);
|
2015-07-23 01:23:09 -07:00
|
|
|
m_listeners.emplace_back(listener, id);
|
|
|
|
|
}
|
|
|
|
|
|
2015-09-19 12:18:25 -07:00
|
|
|
void NetworkTable::AddSubTableListener(ITableListener* listener) {
|
2015-09-23 00:56:08 -07:00
|
|
|
AddSubTableListener(listener, false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void NetworkTable::AddSubTableListener(ITableListener* listener,
|
|
|
|
|
bool localNotify) {
|
2015-09-19 12:18:25 -07:00
|
|
|
std::lock_guard<std::mutex> lock(m_mutex);
|
|
|
|
|
llvm::SmallString<128> path(m_path);
|
|
|
|
|
path += PATH_SEPARATOR_CHAR;
|
|
|
|
|
std::size_t prefix_len = path.size();
|
|
|
|
|
|
|
|
|
|
// The lambda needs to be copyable, but StringMap is not, so use
|
|
|
|
|
// a shared_ptr to it.
|
|
|
|
|
auto notified_tables = std::make_shared<llvm::StringMap<char>>();
|
|
|
|
|
|
2015-09-25 11:54:17 -07:00
|
|
|
unsigned int flags = NT_NOTIFY_NEW | NT_NOTIFY_IMMEDIATE;
|
|
|
|
|
if (localNotify) flags |= NT_NOTIFY_LOCAL;
|
2015-09-19 12:18:25 -07:00
|
|
|
unsigned int id = nt::AddEntryListener(
|
|
|
|
|
path,
|
2015-11-28 13:12:30 -08:00
|
|
|
[=](unsigned int /*uid*/, StringRef name,
|
|
|
|
|
std::shared_ptr<nt::Value> /*value*/, unsigned int flags_) mutable {
|
2015-09-19 12:18:25 -07:00
|
|
|
StringRef relative_key = name.substr(prefix_len);
|
|
|
|
|
auto end_sub_table = relative_key.find(PATH_SEPARATOR_CHAR);
|
|
|
|
|
if (end_sub_table == StringRef::npos) return;
|
|
|
|
|
StringRef sub_table_key = relative_key.substr(0, end_sub_table);
|
|
|
|
|
if (notified_tables->find(sub_table_key) == notified_tables->end())
|
|
|
|
|
return;
|
|
|
|
|
notified_tables->insert(std::make_pair(sub_table_key, '\0'));
|
2015-09-25 11:54:17 -07:00
|
|
|
listener->ValueChangedEx(this, sub_table_key, nullptr, flags_);
|
2015-09-19 12:18:25 -07:00
|
|
|
},
|
2015-09-25 11:54:17 -07:00
|
|
|
flags);
|
2015-09-19 12:18:25 -07:00
|
|
|
m_listeners.emplace_back(listener, id);
|
|
|
|
|
}
|
|
|
|
|
|
2015-07-23 01:23:09 -07:00
|
|
|
void NetworkTable::RemoveTableListener(ITableListener* listener) {
|
2015-08-27 23:39:52 -07:00
|
|
|
std::lock_guard<std::mutex> lock(m_mutex);
|
2015-07-23 01:23:09 -07:00
|
|
|
auto matches_begin =
|
|
|
|
|
std::remove_if(m_listeners.begin(), m_listeners.end(),
|
2015-08-03 01:23:42 -07:00
|
|
|
[=](const Listener& x) { return x.first == listener; });
|
2015-07-23 01:23:09 -07:00
|
|
|
|
|
|
|
|
for (auto i = matches_begin; i != m_listeners.end(); ++i)
|
|
|
|
|
nt::RemoveEntryListener(i->second);
|
|
|
|
|
m_listeners.erase(matches_begin, m_listeners.end());
|
|
|
|
|
}
|
|
|
|
|
|
2015-07-23 21:46:30 -07:00
|
|
|
std::shared_ptr<ITable> NetworkTable::GetSubTable(StringRef key) const {
|
2015-07-23 01:23:09 -07:00
|
|
|
llvm::SmallString<128> path(m_path);
|
|
|
|
|
path += PATH_SEPARATOR_CHAR;
|
|
|
|
|
path += key;
|
|
|
|
|
return std::make_shared<NetworkTable>(path, private_init());
|
|
|
|
|
}
|
|
|
|
|
|
2015-07-23 21:46:30 -07:00
|
|
|
bool NetworkTable::ContainsKey(StringRef key) const {
|
2015-07-23 01:23:09 -07:00
|
|
|
llvm::SmallString<128> path(m_path);
|
|
|
|
|
path += PATH_SEPARATOR_CHAR;
|
|
|
|
|
path += key;
|
2015-12-19 22:36:32 -08:00
|
|
|
return nt::GetEntryValue(path) != nullptr;
|
2015-07-23 01:23:09 -07:00
|
|
|
}
|
|
|
|
|
|
2015-07-23 21:46:30 -07:00
|
|
|
bool NetworkTable::ContainsSubTable(StringRef key) const {
|
2015-07-23 01:23:09 -07:00
|
|
|
llvm::SmallString<128> path(m_path);
|
|
|
|
|
path += PATH_SEPARATOR_CHAR;
|
|
|
|
|
path += key;
|
|
|
|
|
path += PATH_SEPARATOR_CHAR;
|
|
|
|
|
return !nt::GetEntryInfo(path, 0).empty();
|
|
|
|
|
}
|
|
|
|
|
|
2015-09-16 00:50:31 -07:00
|
|
|
std::vector<std::string> NetworkTable::GetKeys(int types) const {
|
|
|
|
|
std::vector<std::string> keys;
|
|
|
|
|
llvm::SmallString<128> path(m_path);
|
|
|
|
|
path += PATH_SEPARATOR_CHAR;
|
|
|
|
|
for (auto& entry : nt::GetEntryInfo(path, types)) {
|
|
|
|
|
auto relative_key = StringRef(entry.name).substr(path.size());
|
2016-11-03 21:03:45 -07:00
|
|
|
if (relative_key.find(PATH_SEPARATOR_CHAR) != StringRef::npos) continue;
|
2015-09-16 00:50:31 -07:00
|
|
|
keys.push_back(relative_key);
|
|
|
|
|
}
|
|
|
|
|
return keys;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::vector<std::string> NetworkTable::GetSubTables() const {
|
|
|
|
|
std::vector<std::string> keys;
|
|
|
|
|
llvm::SmallString<128> path(m_path);
|
|
|
|
|
path += PATH_SEPARATOR_CHAR;
|
|
|
|
|
for (auto& entry : nt::GetEntryInfo(path, 0)) {
|
|
|
|
|
auto relative_key = StringRef(entry.name).substr(path.size());
|
|
|
|
|
std::size_t end_subtable = relative_key.find(PATH_SEPARATOR_CHAR);
|
|
|
|
|
if (end_subtable == StringRef::npos) continue;
|
|
|
|
|
keys.push_back(relative_key.substr(0, end_subtable));
|
|
|
|
|
}
|
|
|
|
|
return keys;
|
|
|
|
|
}
|
|
|
|
|
|
2015-09-15 23:28:41 -07:00
|
|
|
void NetworkTable::SetPersistent(StringRef key) {
|
|
|
|
|
SetFlags(key, NT_PERSISTENT);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void NetworkTable::ClearPersistent(StringRef key) {
|
|
|
|
|
ClearFlags(key, NT_PERSISTENT);
|
|
|
|
|
}
|
|
|
|
|
|
2015-12-06 22:39:38 -08:00
|
|
|
bool NetworkTable::IsPersistent(StringRef key) const {
|
2015-09-15 23:28:41 -07:00
|
|
|
return (GetFlags(key) & NT_PERSISTENT) != 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void NetworkTable::SetFlags(StringRef key, unsigned int flags) {
|
|
|
|
|
llvm::SmallString<128> path(m_path);
|
|
|
|
|
path += PATH_SEPARATOR_CHAR;
|
|
|
|
|
path += key;
|
2016-10-16 20:28:35 -04:00
|
|
|
nt::SetEntryFlags(path, nt::GetEntryFlags(path) | flags);
|
2015-09-15 23:28:41 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void NetworkTable::ClearFlags(StringRef key, unsigned int flags) {
|
|
|
|
|
llvm::SmallString<128> path(m_path);
|
|
|
|
|
path += PATH_SEPARATOR_CHAR;
|
|
|
|
|
path += key;
|
|
|
|
|
nt::SetEntryFlags(path, nt::GetEntryFlags(path) & ~flags);
|
|
|
|
|
}
|
|
|
|
|
|
2015-12-06 22:39:38 -08:00
|
|
|
unsigned int NetworkTable::GetFlags(StringRef key) const {
|
2015-09-15 23:28:41 -07:00
|
|
|
llvm::SmallString<128> path(m_path);
|
|
|
|
|
path += PATH_SEPARATOR_CHAR;
|
|
|
|
|
path += key;
|
|
|
|
|
return nt::GetEntryFlags(path);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void NetworkTable::Delete(StringRef key) {
|
2015-07-23 21:53:33 -07:00
|
|
|
llvm::SmallString<128> path(m_path);
|
|
|
|
|
path += PATH_SEPARATOR_CHAR;
|
|
|
|
|
path += key;
|
2015-09-15 23:28:41 -07:00
|
|
|
nt::DeleteEntry(path);
|
2015-07-23 21:53:33 -07:00
|
|
|
}
|
|
|
|
|
|
2015-09-15 23:28:41 -07:00
|
|
|
bool NetworkTable::PutNumber(StringRef key, double value) {
|
2015-07-23 01:23:09 -07:00
|
|
|
llvm::SmallString<128> path(m_path);
|
|
|
|
|
path += PATH_SEPARATOR_CHAR;
|
|
|
|
|
path += key;
|
2015-09-15 23:28:41 -07:00
|
|
|
return nt::SetEntryValue(path, nt::Value::MakeDouble(value));
|
2015-07-23 01:23:09 -07:00
|
|
|
}
|
|
|
|
|
|
2016-07-13 00:31:03 -07:00
|
|
|
bool NetworkTable::SetDefaultNumber(StringRef key, double defaultValue) {
|
|
|
|
|
llvm::SmallString<128> path(m_path);
|
|
|
|
|
path += PATH_SEPARATOR_CHAR;
|
|
|
|
|
path += key;
|
|
|
|
|
return nt::SetDefaultEntryValue(path, nt::Value::MakeDouble(defaultValue));
|
|
|
|
|
}
|
|
|
|
|
|
2015-12-06 22:39:38 -08:00
|
|
|
double NetworkTable::GetNumber(StringRef key) const {
|
|
|
|
|
llvm::SmallString<128> path(m_path);
|
|
|
|
|
path += PATH_SEPARATOR_CHAR;
|
|
|
|
|
path += key;
|
|
|
|
|
auto value = nt::GetEntryValue(path);
|
|
|
|
|
if (!value || value->type() != NT_DOUBLE)
|
|
|
|
|
throw TableKeyNotDefinedException(path);
|
|
|
|
|
return value->GetDouble();
|
|
|
|
|
}
|
|
|
|
|
|
2015-07-23 21:46:30 -07:00
|
|
|
double NetworkTable::GetNumber(StringRef key, double defaultValue) const {
|
2015-07-23 01:23:09 -07:00
|
|
|
llvm::SmallString<128> path(m_path);
|
|
|
|
|
path += PATH_SEPARATOR_CHAR;
|
|
|
|
|
path += key;
|
|
|
|
|
auto value = nt::GetEntryValue(path);
|
2016-11-03 21:03:45 -07:00
|
|
|
if (!value || value->type() != NT_DOUBLE) return defaultValue;
|
2015-07-23 01:23:09 -07:00
|
|
|
return value->GetDouble();
|
|
|
|
|
}
|
|
|
|
|
|
2015-09-15 23:28:41 -07:00
|
|
|
bool NetworkTable::PutString(StringRef key, StringRef value) {
|
2015-07-23 01:23:09 -07:00
|
|
|
llvm::SmallString<128> path(m_path);
|
|
|
|
|
path += PATH_SEPARATOR_CHAR;
|
|
|
|
|
path += key;
|
2015-09-15 23:28:41 -07:00
|
|
|
return nt::SetEntryValue(path, nt::Value::MakeString(value));
|
2015-07-23 01:23:09 -07:00
|
|
|
}
|
|
|
|
|
|
2016-07-13 00:31:03 -07:00
|
|
|
bool NetworkTable::SetDefaultString(StringRef key, StringRef defaultValue) {
|
|
|
|
|
llvm::SmallString<128> path(m_path);
|
|
|
|
|
path += PATH_SEPARATOR_CHAR;
|
|
|
|
|
path += key;
|
|
|
|
|
return nt::SetDefaultEntryValue(path, nt::Value::MakeString(defaultValue));
|
|
|
|
|
}
|
|
|
|
|
|
2015-12-06 22:39:38 -08:00
|
|
|
std::string NetworkTable::GetString(StringRef key) const {
|
|
|
|
|
llvm::SmallString<128> path(m_path);
|
|
|
|
|
path += PATH_SEPARATOR_CHAR;
|
|
|
|
|
path += key;
|
|
|
|
|
auto value = nt::GetEntryValue(path);
|
|
|
|
|
if (!value || value->type() != NT_STRING)
|
|
|
|
|
throw TableKeyNotDefinedException(path);
|
|
|
|
|
return value->GetString();
|
|
|
|
|
}
|
|
|
|
|
|
2015-07-23 21:46:30 -07:00
|
|
|
std::string NetworkTable::GetString(StringRef key,
|
|
|
|
|
StringRef defaultValue) const {
|
2015-07-23 01:23:09 -07:00
|
|
|
llvm::SmallString<128> path(m_path);
|
|
|
|
|
path += PATH_SEPARATOR_CHAR;
|
|
|
|
|
path += key;
|
|
|
|
|
auto value = nt::GetEntryValue(path);
|
2016-11-03 21:03:45 -07:00
|
|
|
if (!value || value->type() != NT_STRING) return defaultValue;
|
2015-07-23 01:23:09 -07:00
|
|
|
return value->GetString();
|
|
|
|
|
}
|
|
|
|
|
|
2015-09-15 23:28:41 -07:00
|
|
|
bool NetworkTable::PutBoolean(StringRef key, bool value) {
|
2015-07-23 01:23:09 -07:00
|
|
|
llvm::SmallString<128> path(m_path);
|
|
|
|
|
path += PATH_SEPARATOR_CHAR;
|
|
|
|
|
path += key;
|
2015-09-15 23:28:41 -07:00
|
|
|
return nt::SetEntryValue(path, nt::Value::MakeBoolean(value));
|
2015-07-23 01:23:09 -07:00
|
|
|
}
|
|
|
|
|
|
2016-07-13 00:31:03 -07:00
|
|
|
bool NetworkTable::SetDefaultBoolean(StringRef key, bool defaultValue) {
|
|
|
|
|
llvm::SmallString<128> path(m_path);
|
|
|
|
|
path += PATH_SEPARATOR_CHAR;
|
|
|
|
|
path += key;
|
|
|
|
|
return nt::SetDefaultEntryValue(path, nt::Value::MakeBoolean(defaultValue));
|
|
|
|
|
}
|
|
|
|
|
|
2015-12-06 22:39:38 -08:00
|
|
|
bool NetworkTable::GetBoolean(StringRef key) const {
|
|
|
|
|
llvm::SmallString<128> path(m_path);
|
|
|
|
|
path += PATH_SEPARATOR_CHAR;
|
|
|
|
|
path += key;
|
|
|
|
|
auto value = nt::GetEntryValue(path);
|
|
|
|
|
if (!value || value->type() != NT_BOOLEAN)
|
|
|
|
|
throw TableKeyNotDefinedException(path);
|
|
|
|
|
return value->GetBoolean();
|
|
|
|
|
}
|
|
|
|
|
|
2015-07-23 21:46:30 -07:00
|
|
|
bool NetworkTable::GetBoolean(StringRef key, bool defaultValue) const {
|
2015-07-23 01:23:09 -07:00
|
|
|
llvm::SmallString<128> path(m_path);
|
|
|
|
|
path += PATH_SEPARATOR_CHAR;
|
|
|
|
|
path += key;
|
|
|
|
|
auto value = nt::GetEntryValue(path);
|
2016-11-03 21:03:45 -07:00
|
|
|
if (!value || value->type() != NT_BOOLEAN) return defaultValue;
|
2015-07-23 01:23:09 -07:00
|
|
|
return value->GetBoolean();
|
|
|
|
|
}
|
|
|
|
|
|
2016-01-04 09:37:29 -08:00
|
|
|
bool NetworkTable::PutBooleanArray(llvm::StringRef key,
|
|
|
|
|
llvm::ArrayRef<int> value) {
|
|
|
|
|
llvm::SmallString<128> path(m_path);
|
|
|
|
|
path += PATH_SEPARATOR_CHAR;
|
|
|
|
|
path += key;
|
|
|
|
|
return nt::SetEntryValue(path, nt::Value::MakeBooleanArray(value));
|
|
|
|
|
}
|
|
|
|
|
|
2016-07-13 00:31:03 -07:00
|
|
|
bool NetworkTable::SetDefaultBooleanArray(StringRef key,
|
|
|
|
|
llvm::ArrayRef<int> defaultValue) {
|
|
|
|
|
llvm::SmallString<128> path(m_path);
|
|
|
|
|
path += PATH_SEPARATOR_CHAR;
|
|
|
|
|
path += key;
|
2016-11-03 21:03:45 -07:00
|
|
|
return nt::SetDefaultEntryValue(path,
|
|
|
|
|
nt::Value::MakeBooleanArray(defaultValue));
|
2016-07-13 00:31:03 -07:00
|
|
|
}
|
|
|
|
|
|
2016-01-04 09:37:29 -08:00
|
|
|
std::vector<int> NetworkTable::GetBooleanArray(
|
|
|
|
|
llvm::StringRef key, llvm::ArrayRef<int> defaultValue) const {
|
|
|
|
|
llvm::SmallString<128> path(m_path);
|
|
|
|
|
path += PATH_SEPARATOR_CHAR;
|
|
|
|
|
path += key;
|
|
|
|
|
auto value = nt::GetEntryValue(path);
|
2016-11-03 21:03:45 -07:00
|
|
|
if (!value || value->type() != NT_BOOLEAN_ARRAY) return defaultValue;
|
2016-01-04 09:37:29 -08:00
|
|
|
return value->GetBooleanArray();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool NetworkTable::PutNumberArray(llvm::StringRef key,
|
|
|
|
|
llvm::ArrayRef<double> value) {
|
|
|
|
|
llvm::SmallString<128> path(m_path);
|
|
|
|
|
path += PATH_SEPARATOR_CHAR;
|
|
|
|
|
path += key;
|
|
|
|
|
return nt::SetEntryValue(path, nt::Value::MakeDoubleArray(value));
|
|
|
|
|
}
|
|
|
|
|
|
2016-07-13 00:31:03 -07:00
|
|
|
bool NetworkTable::SetDefaultNumberArray(StringRef key,
|
|
|
|
|
llvm::ArrayRef<double> defaultValue) {
|
|
|
|
|
llvm::SmallString<128> path(m_path);
|
|
|
|
|
path += PATH_SEPARATOR_CHAR;
|
|
|
|
|
path += key;
|
2016-11-03 21:03:45 -07:00
|
|
|
return nt::SetDefaultEntryValue(path,
|
|
|
|
|
nt::Value::MakeDoubleArray(defaultValue));
|
2016-07-13 00:31:03 -07:00
|
|
|
}
|
|
|
|
|
|
2016-01-04 09:37:29 -08:00
|
|
|
std::vector<double> NetworkTable::GetNumberArray(
|
|
|
|
|
llvm::StringRef key, llvm::ArrayRef<double> defaultValue) const {
|
|
|
|
|
llvm::SmallString<128> path(m_path);
|
|
|
|
|
path += PATH_SEPARATOR_CHAR;
|
|
|
|
|
path += key;
|
|
|
|
|
auto value = nt::GetEntryValue(path);
|
2016-11-03 21:03:45 -07:00
|
|
|
if (!value || value->type() != NT_DOUBLE_ARRAY) return defaultValue;
|
2016-01-04 09:37:29 -08:00
|
|
|
return value->GetDoubleArray();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool NetworkTable::PutStringArray(llvm::StringRef key,
|
|
|
|
|
llvm::ArrayRef<std::string> value) {
|
|
|
|
|
llvm::SmallString<128> path(m_path);
|
|
|
|
|
path += PATH_SEPARATOR_CHAR;
|
|
|
|
|
path += key;
|
|
|
|
|
return nt::SetEntryValue(path, nt::Value::MakeStringArray(value));
|
|
|
|
|
}
|
|
|
|
|
|
2016-11-03 21:03:45 -07:00
|
|
|
bool NetworkTable::SetDefaultStringArray(
|
|
|
|
|
StringRef key, llvm::ArrayRef<std::string> defaultValue) {
|
2016-07-13 00:31:03 -07:00
|
|
|
llvm::SmallString<128> path(m_path);
|
|
|
|
|
path += PATH_SEPARATOR_CHAR;
|
|
|
|
|
path += key;
|
2016-11-03 21:03:45 -07:00
|
|
|
return nt::SetDefaultEntryValue(path,
|
|
|
|
|
nt::Value::MakeStringArray(defaultValue));
|
2016-07-13 00:31:03 -07:00
|
|
|
}
|
|
|
|
|
|
2016-01-04 09:37:29 -08:00
|
|
|
std::vector<std::string> NetworkTable::GetStringArray(
|
|
|
|
|
llvm::StringRef key, llvm::ArrayRef<std::string> defaultValue) const {
|
|
|
|
|
llvm::SmallString<128> path(m_path);
|
|
|
|
|
path += PATH_SEPARATOR_CHAR;
|
|
|
|
|
path += key;
|
|
|
|
|
auto value = nt::GetEntryValue(path);
|
2016-11-03 21:03:45 -07:00
|
|
|
if (!value || value->type() != NT_STRING_ARRAY) return defaultValue;
|
2016-01-04 09:37:29 -08:00
|
|
|
return value->GetStringArray();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool NetworkTable::PutRaw(llvm::StringRef key, llvm::StringRef value) {
|
|
|
|
|
llvm::SmallString<128> path(m_path);
|
|
|
|
|
path += PATH_SEPARATOR_CHAR;
|
|
|
|
|
path += key;
|
|
|
|
|
return nt::SetEntryValue(path, nt::Value::MakeRaw(value));
|
|
|
|
|
}
|
|
|
|
|
|
2016-11-03 21:03:45 -07:00
|
|
|
bool NetworkTable::SetDefaultRaw(StringRef key, StringRef defaultValue) {
|
2016-07-13 00:31:03 -07:00
|
|
|
llvm::SmallString<128> path(m_path);
|
|
|
|
|
path += PATH_SEPARATOR_CHAR;
|
|
|
|
|
path += key;
|
|
|
|
|
return nt::SetDefaultEntryValue(path, nt::Value::MakeRaw(defaultValue));
|
|
|
|
|
}
|
|
|
|
|
|
2016-01-04 09:37:29 -08:00
|
|
|
std::string NetworkTable::GetRaw(llvm::StringRef key,
|
|
|
|
|
llvm::StringRef defaultValue) const {
|
|
|
|
|
llvm::SmallString<128> path(m_path);
|
|
|
|
|
path += PATH_SEPARATOR_CHAR;
|
|
|
|
|
path += key;
|
|
|
|
|
auto value = nt::GetEntryValue(path);
|
2016-11-03 21:03:45 -07:00
|
|
|
if (!value || value->type() != NT_RAW) return defaultValue;
|
2016-01-04 09:37:29 -08:00
|
|
|
return value->GetRaw();
|
|
|
|
|
}
|
|
|
|
|
|
2015-09-15 23:28:41 -07:00
|
|
|
bool NetworkTable::PutValue(StringRef key, std::shared_ptr<nt::Value> value) {
|
2015-07-23 01:23:09 -07:00
|
|
|
llvm::SmallString<128> path(m_path);
|
|
|
|
|
path += PATH_SEPARATOR_CHAR;
|
|
|
|
|
path += key;
|
2015-09-15 23:28:41 -07:00
|
|
|
return nt::SetEntryValue(path, value);
|
2015-07-23 01:23:09 -07:00
|
|
|
}
|
|
|
|
|
|
2016-07-13 00:31:03 -07:00
|
|
|
bool NetworkTable::SetDefaultValue(StringRef key,
|
|
|
|
|
std::shared_ptr<nt::Value> defaultValue) {
|
|
|
|
|
llvm::SmallString<128> path(m_path);
|
|
|
|
|
path += PATH_SEPARATOR_CHAR;
|
|
|
|
|
path += key;
|
|
|
|
|
return nt::SetDefaultEntryValue(path, defaultValue);
|
|
|
|
|
}
|
|
|
|
|
|
2015-07-23 21:46:30 -07:00
|
|
|
std::shared_ptr<nt::Value> NetworkTable::GetValue(StringRef key) const {
|
2015-07-23 01:23:09 -07:00
|
|
|
llvm::SmallString<128> path(m_path);
|
|
|
|
|
path += PATH_SEPARATOR_CHAR;
|
|
|
|
|
path += key;
|
|
|
|
|
return nt::GetEntryValue(path);
|
|
|
|
|
}
|
2017-05-27 00:02:45 -04:00
|
|
|
|
|
|
|
|
StringRef NetworkTable::GetPath() const {
|
|
|
|
|
return m_path;
|
|
|
|
|
}
|