2015-07-23 01:23:09 -07:00
|
|
|
#include "networktables/NetworkTable.h"
|
|
|
|
|
|
|
|
|
|
#include <algorithm>
|
|
|
|
|
|
|
|
|
|
#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 = '/';
|
|
|
|
|
std::string NetworkTable::s_ip_address;
|
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;
|
|
|
|
|
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();
|
2015-07-23 01:23:09 -07:00
|
|
|
if (s_client)
|
2015-09-19 11:44:14 -07:00
|
|
|
nt::StartClient(s_ip_address.c_str(), s_port);
|
2015-07-23 01:23:09 -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;
|
2015-07-23 01:23:09 -07:00
|
|
|
if (s_client)
|
|
|
|
|
nt::StopClient();
|
|
|
|
|
else
|
|
|
|
|
nt::StopServer();
|
|
|
|
|
s_running = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void NetworkTable::SetClientMode() { s_client = true; }
|
|
|
|
|
|
|
|
|
|
void NetworkTable::SetServerMode() { s_client = false; }
|
|
|
|
|
|
|
|
|
|
void NetworkTable::SetTeam(int team) {
|
|
|
|
|
char tmp[30];
|
2015-08-28 14:16:49 -07:00
|
|
|
#ifdef _MSC_VER
|
2015-11-19 23:02:39 -08:00
|
|
|
sprintf_s(tmp, "roboRIO-%d-FRC.local\n", team);
|
2015-08-28 14:16:49 -07:00
|
|
|
#else
|
2015-11-19 23:02:39 -08:00
|
|
|
std::snprintf(tmp, 30, "roboRIO-%d-FRC.local\n",team);
|
2015-08-28 14:16:49 -07:00
|
|
|
#endif
|
2015-07-23 01:23:09 -07:00
|
|
|
SetIPAddress(tmp);
|
|
|
|
|
}
|
|
|
|
|
|
2015-09-15 23:28:41 -07:00
|
|
|
void NetworkTable::SetIPAddress(StringRef address) { s_ip_address = address; }
|
|
|
|
|
|
2015-09-19 11:44:14 -07:00
|
|
|
void NetworkTable::SetPort(unsigned int port) { s_port = port; }
|
|
|
|
|
|
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();
|
|
|
|
|
llvm::SmallString<128> path;
|
2015-08-28 12:24:33 -07:00
|
|
|
if (!key.empty()) {
|
|
|
|
|
path += PATH_SEPARATOR_CHAR;
|
|
|
|
|
path += key;
|
|
|
|
|
}
|
2015-07-23 01:23:09 -07:00
|
|
|
return std::make_shared<NetworkTable>(path, private_init());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
NetworkTable::NetworkTable(StringRef path, const private_init&)
|
|
|
|
|
: m_path(path) {}
|
|
|
|
|
|
|
|
|
|
NetworkTable::~NetworkTable() {
|
|
|
|
|
for (auto& i : m_listeners)
|
|
|
|
|
nt::RemoveEntryListener(i.second);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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,
|
2015-11-28 13:12:30 -08:00
|
|
|
[=](unsigned int /*uid*/, StringRef name, std::shared_ptr<nt::Value> value,
|
2015-09-25 11:54:17 -07:00
|
|
|
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;
|
|
|
|
|
return !nt::GetEntryValue(path);
|
|
|
|
|
}
|
|
|
|
|
|
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());
|
|
|
|
|
if (relative_key.find(PATH_SEPARATOR_CHAR) != StringRef::npos)
|
|
|
|
|
continue;
|
|
|
|
|
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;
|
|
|
|
|
nt::SetEntryFlags(path, nt::GetEntryFlags(key) | flags);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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
|
|
|
}
|
|
|
|
|
|
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);
|
|
|
|
|
if (!value || value->type() != NT_DOUBLE)
|
|
|
|
|
return defaultValue;
|
|
|
|
|
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
|
|
|
}
|
|
|
|
|
|
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);
|
|
|
|
|
if (!value || value->type() != NT_STRING)
|
|
|
|
|
return defaultValue;
|
|
|
|
|
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
|
|
|
}
|
|
|
|
|
|
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);
|
|
|
|
|
if (!value || value->type() != NT_BOOLEAN)
|
|
|
|
|
return defaultValue;
|
|
|
|
|
return value->GetBoolean();
|
|
|
|
|
}
|
|
|
|
|
|
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
|
|
|
}
|
|
|
|
|
|
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);
|
|
|
|
|
}
|