7#include "../../_cexports/c_gen_api.h"
8#include "../../_cexports/c_driver.h"
10#include "../../global.hpp"
12#include "../_decl/decl_node.hpp"
13#include "../_decl/decl_node_map.hpp"
15#include "../../_decl/decl_device.hpp"
17#include "../value_node.hpp"
36 if (CExports::CanNodeMapHandle2(device.
Handle()))
39 nodeMap = Internal::DoResCallShareOut<NodeMap>(
40 [&](
void *&handle) {
return CVB_CALL_CAPI(NMH2GetNodeMap(device.
Handle(), cname.c_str(), handle)); }, name,
43 else if (name == CVB_LIT(
"Device"))
44 nodeMap = Internal::DoResCallShareOut<NodeMap>(
45 [&](
void *&handle) {
return CVB_CALL_CAPI(NMHGetNodeMap(device.
Handle(), handle)); }, name, device);
47 throw std::runtime_error(
"node map not found");
55 if (nodeKeys_.find(CVB_LIT(
"Cust::FileSelector")) == nodeKeys_.end()
56 && nodeKeys_.find(CVB_LIT(
"Std::FileSelector")) == nodeKeys_.end())
60 auto entries = enumerationNode->Entries();
63 for (
auto entry : entries)
65 if (entry->IsAvailable())
66 availableFiles.push_back(entry->SymbolicValue());
68 return availableFiles;
73 auto element = nodes_.find(name);
75 if (element == nodes_.end())
80 CExports::NODE nodeHandle =
nullptr;
81 const auto result = CExports::NMGetNodeTyped(
Handle(), name.c_str(), nodeHandle);
85 HandleGuard<class Node>(nodeHandle));
95 if (nodeKeys_.find(CVB_LIT(
"Cust::") + name) != nodeKeys_.end())
96 localName =
String(CVB_LIT(
"Cust::")) + name;
97 else if (nodeKeys_.find(CVB_LIT(
"Std::") + name) != nodeKeys_.end())
98 localName =
String(CVB_LIT(
"Std::")) + name;
103 auto node = nodes_[localName].lock();
107 nodes_[localName] = node;
129 for (
const auto &entry : nodeKeys_)
130 nodes[entry.first] =
Node(entry.first);
134 inline NodeMap::NodeMap(HandleGuard<NodeMap> &&guard,
const String &name,
void *provider)
135 : handle_(std::move(guard))
137 , lastPoll_(std::chrono::system_clock::now())
139 if (CExports::CanNodeMapHandle2(provider))
142 provider_.Reset(provider);
146 inline void NodeMap::ReadDescription()
const
148 if (descriptionRead_ || provider_.Handle() ==
nullptr)
152 size_t bufferLength = 0;
153 if (CExports::NMH2GetDescription(provider_.Handle(), cname.c_str(),
nullptr, bufferLength) >= 0
157 auto resultDescription =
158 CExports::NMH2GetDescription(provider_.Handle(), cname.c_str(), &buffer[0], bufferLength);
159 if (resultDescription < 0)
160 std::rethrow_exception(CvbException::FromCvbResult(resultDescription,
"failed to get node map description"));
161 description_ =
String(buffer.begin(), buffer.end() - 1);
164 descriptionRead_ =
true;
167 inline void NodeMap::FillNodeKeys()
const
172 CExports::cvbdim_t numNodes = 0;
173 auto resultNum = CExports::NMNodeCount(
Handle(), numNodes);
175 std::rethrow_exception(CvbException::FromCvbResult(resultNum,
"failed to get node count"));
177 for (CExports::cvbdim_t i = 0; i < numNodes; ++i)
179 size_t nameLength = 0;
180 auto resultNameLength = CExports::NMListNode(
Handle(), i,
nullptr, nameLength);
181 if (resultNameLength < 0)
182 std::rethrow_exception(CvbException::FromCvbResult(resultNameLength,
"failed to get node name length"));
183 std::vector<char> buffer(
static_cast<size_t>(nameLength));
184 auto resultBuffer = CExports::NMListNode(
Handle(), i, &buffer[0], nameLength);
185 if (resultBuffer < 0)
186 std::rethrow_exception(CvbException::FromCvbResult(resultBuffer,
"failed to get node name"));
187 String keyString(buffer.begin(), buffer.end() - 1);
189 nodeKeys_.emplace(std::move(keyString),
true);
192 nodeKeysFilled_ =
true;
198 CExports::NODEMAPSTREAM nodeMapStream;
199 auto res = CExports::NMCreateStream(
Handle(), CExports::TStreamType::ST_JSON, nodeMapStream);
201 Utilities::SystemInfo::ThrowLastError(res);
202 ReleaseObjectGuard guard(nodeMapStream);
204 for (
const auto &node : nodes)
206 res = CExports::NMStreamPush(nodeMapStream, node->Handle());
209 if (serializationErrorCallback)
210 serializationErrorCallback(node, Internal::CastToAscii(node->Name()) +
": "
213 Utilities::SystemInfo::ThrowLastError(res);
218 res = CExports::NMStreamDumpTyped(nodeMapStream,
reinterpret_cast<Char *
>(0), settingsSize);
220 Utilities::SystemInfo::ThrowLastError(res);
221 settingsSize +=
sizeof(
Char);
223 res = CExports::NMStreamDumpTyped(nodeMapStream, &settings[0], settingsSize);
225 Utilities::SystemInfo::ThrowLastError(res);
227 return String(&settings[0]);
Generic CVB physical device.
Definition decl_device.hpp:78
void * Handle() const noexcept
Classic API device handle.
Definition decl_device.hpp:122
std::shared_ptr< T > TryGetNode(const String &name) const noexcept
Tries to get the node with the given name from the node map.
Definition decl_node_map.hpp:642
std::shared_ptr< T > Node(const String &name) const
Get the node with the given name from the node map.
Definition decl_node_map.hpp:575
std::vector< String > AvailableFiles() const
Gets the currently available file identifiers, which can be downloaded or uploaded.
Definition detail_node_map.hpp:52
static NodeMapPtr FromHandle(HandleGuard< NodeMap > &&guard, const String &name, const Device &device)
Creates a node map from a classic API handle.
Definition detail_node_map.hpp:27
Cvb::String ToJson(std::function< void(NodePtr, const std::string &)> serializationErrorCallback=nullptr)
Serializes all nodes of this nodemap to a json string.
Definition decl_node_map.hpp:543
std::map< String, NodePtr > Nodes() const
Get a dictionary contain all nodes of this node map.
Definition detail_node_map.hpp:125
void * Handle() const noexcept
Classic API node map handle.
Definition decl_node_map.hpp:286
cvbbool_t ShareObject(OBJ Object)
Namespace for GenApi based device configuration.
Definition decl_fw_updater.hpp:29
std::shared_ptr< Node > NodePtr
Convenience shared pointer for Node.
Definition genapi.hpp:71
std::shared_ptr< NodeMap > NodeMapPtr
Convenience shared pointer for NodeMap.
Definition genapi.hpp:27
std::string GetLastErrorMessage(int &errorCode)
Returns the last error message and its code.
Definition system_info.hpp:141
Root namespace for the Image Manager interface.
Definition version.hpp:11
char Char
Character type for wide characters or unicode characters.
Definition string.hpp:63
std::string String
String for wide characters or unicode characters.
Definition string.hpp:49
T const_pointer_cast(T... args)
T rethrow_exception(T... args)