open62541pp 0.17.0
C++ wrapper of open62541
Loading...
Searching...
No Matches
view.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cstdint>
4#include <iterator> // make_move_iterator
5#include <type_traits>
6#include <utility>
7#include <vector>
8
16#include "open62541pp/span.hpp"
17#include "open62541pp/types.hpp"
19
20namespace opcua {
21class Client;
22class Server;
23} // namespace opcua
24
25namespace opcua::services {
26
27/**
28 * @defgroup View View service set
29 * Browse the address space / view created by a server.
30 * @see https://reference.opcfoundation.org/Core/Part4/v105/docs/5.9
31 * @ingroup Services
32 * @{
33 */
34
35/**
36 * @defgroup Browse Browse service
37 * Discover references of nodes.
38 * @see https://reference.opcfoundation.org/Core/Part4/v105/docs/5.9.2
39 * @{
40 */
41
42/**
43 * Discover the references of one or more nodes (client only).
44 * @param connection Instance of type Client
45 * @param request Browse request
46 */
47BrowseResponse browse(Client& connection, const BrowseRequest& request) noexcept;
48
49/**
50 * @copydoc browse
51 * @param token @completiontoken{void(BrowseResponse&)}
52 * @return @asyncresult{BrowseResponse}
53 */
54template <typename CompletionToken>
55auto browseAsync(Client& connection, const BrowseRequest& request, CompletionToken&& token) {
56 return detail::sendRequestAsync<BrowseRequest, BrowseResponse>(
57 connection, request, std::forward<CompletionToken>(token)
58 );
59}
60
61/**
62 * Discover the references of a specified node.
63 * @param connection Instance of type Server or Client
64 * @param bd Browse description
65 * @param maxReferences The maximum number of references to return (0 if no limit)
66 */
67template <typename T>
68BrowseResult browse(T& connection, const BrowseDescription& bd, uint32_t maxReferences) noexcept;
69
70/**
71 * @copydoc browse(T&, const BrowseDescription&, uint32_t)
72 * @param token @completiontoken{void(BrowseResult&)}
73 * @return @asyncresult{BrowseResult}
74 */
75template <typename CompletionToken>
77 Client& connection, const BrowseDescription& bd, uint32_t maxReferences, CompletionToken&& token
78) {
79 const auto request = detail::createBrowseRequest(bd, maxReferences);
80 return browseAsync(
81 connection,
83 detail::TransformToken(
84 detail::wrapSingleResultWithStatus<BrowseResult, UA_BrowseResponse>,
85 std::forward<CompletionToken>(token)
86 )
87 );
88}
89
90/**
91 * @}
92 * @defgroup BrowseNext BrowseNext service
93 * Request the next set of a Browse or BrowseNext response information that is too large to be sent
94 * in a single response. Discover references of nodes.
95 * @see https://reference.opcfoundation.org/Core/Part4/v105/docs/5.9.3
96 * @{
97 */
98
99/**
100 * Request the next sets of @ref browse / @ref browseNext responses (client only).
101 * @param connection Instance of type Client
102 * @param request Browse request
103 */
104BrowseNextResponse browseNext(Client& connection, const BrowseNextRequest& request) noexcept;
105
106/**
107 * @copydoc browseNext
108 * @param token @completiontoken{void(BrowseNextResponse&)}
109 * @return @asyncresult{BrowseNextResponse}
110 */
111template <typename CompletionToken>
113 Client& connection, const BrowseNextRequest& request, CompletionToken&& token
114) {
115 return detail::sendRequestAsync<BrowseNextRequest, BrowseNextResponse>(
116 connection, request, std::forward<CompletionToken>(token)
117 );
118}
119
120/**
121 * Request the next set of a @ref browse or @ref browseNext response.
122 * The response might get split up if the information is too large to be sent in a single response.
123 * @param connection Instance of type Server or Client
124 * @param releaseContinuationPoint Free resources in server if `true`, get next result if `false`
125 * @param continuationPoint Continuation point from a preview browse/browseNext request
126 */
127template <typename T>
129 T& connection, bool releaseContinuationPoint, const ByteString& continuationPoint
130) noexcept;
131
132/**
133 * @copydoc browseNext(T&, bool, const ByteString&)
134 * @param token @completiontoken{void(BrowseResult&)}
135 * @return @asyncresult{BrowseResult}
136 */
137template <typename CompletionToken>
139 Client& connection,
140 bool releaseContinuationPoint,
141 const ByteString& continuationPoint,
142 CompletionToken&& token
143) {
144 const auto request = detail::createBrowseNextRequest(
145 releaseContinuationPoint, continuationPoint
146 );
147 return browseNextAsync(
148 connection,
150 detail::TransformToken(
151 detail::wrapSingleResultWithStatus<BrowseResult, UA_BrowseNextResponse>,
152 std::forward<CompletionToken>(token)
153 )
154 );
155}
156
157/**
158 * @}
159 * @defgroup TranslateBrowsePathsToNodeIds TranslateBrowsePathsToNodeIds service
160 * Request that the server translates browse paths to node ids.
161 * @see https://reference.opcfoundation.org/Core/Part4/v105/docs/5.9.4
162 * @{
163 */
164
165/**
166 * Translate browse paths to NodeIds (client only).
167 * @param connection Instance of type Client
168 * @param request Request
169 */
171 Client& connection, const TranslateBrowsePathsToNodeIdsRequest& request
172) noexcept;
173
174/**
175 * @copydoc translateBrowsePathsToNodeIds
176 * @param token @completiontoken{void(TranslateBrowsePathsToNodeIdsResponse&)}
177 * @return @asyncresult{TranslateBrowsePathsToNodeIdsResponse}
178 */
179template <typename CompletionToken>
181 Client& connection, const TranslateBrowsePathsToNodeIdsRequest& request, CompletionToken&& token
182) {
183 return detail::sendRequestAsync<
186 connection, request, std::forward<CompletionToken>(token)
187 );
188}
189
190/**
191 * Translate a browse path to NodeIds.
192 * @param connection Instance of type Server or Client
193 * @param browsePath Browse path (starting node & relative path)
194 */
195template <typename T>
196BrowsePathResult translateBrowsePathToNodeIds(T& connection, const BrowsePath& browsePath) noexcept;
197
198/**
199 * @copydoc translateBrowsePathToNodeIds
200 * @param token @completiontoken{void(BrowsePathResult&)}
201 * @return @asyncresult{BrowsePathResult}
202 */
203template <typename CompletionToken>
205 Client& connection, const BrowsePath& browsePath, CompletionToken&& token
206) {
207 const auto request = detail::createTranslateBrowsePathsToNodeIdsRequest(browsePath);
209 connection,
211 detail::TransformToken(
212 detail::wrapSingleResultWithStatus<
215 std::forward<CompletionToken>(token)
216 )
217 );
218}
219
220/**
221 * A simplified version of @ref translateBrowsePathToNodeIds.
222 *
223 * The relative path is specified using browse names instead of the RelativePath structure.
224 * The list of browse names is equivalent to a RelativePath that specifies forward references which
225 * are subtypes of the HierarchicalReferences ReferenceTypeId.
226 *
227 * @param connection Instance of type Server or Client
228 * @param origin Starting node of the browse path
229 * @param browsePath Browse path as a list of browse names
230 */
231template <typename T>
233 T& connection, const NodeId& origin, Span<const QualifiedName> browsePath
234) {
235 return translateBrowsePathToNodeIds(connection, detail::createBrowsePath(origin, browsePath));
236}
237
238/**
239 * @copydoc browseSimplifiedBrowsePath
240 * @param token @completiontoken{void(BrowsePathResult&)}
241 * @return @asyncresult{BrowsePathResult}
242 */
243template <typename CompletionToken>
245 Client& connection,
246 const NodeId& origin,
247 Span<const QualifiedName> browsePath,
248 CompletionToken&& token
249) {
251 connection,
252 detail::createBrowsePath(origin, browsePath),
253 std::forward<CompletionToken>(token)
254 );
255}
256
257/**
258 * @}
259 * @defgroup RegisterNodes RegisterNodes service
260 * Register nodes for efficient access operations.
261 * Clients shall unregister unneeded nodes immediately to free up resources.
262 * @see https://reference.opcfoundation.org/Core/Part4/v105/docs/5.9.5
263 * @{
264 */
265
266/**
267 * Register nodes for efficient access operations (client only).
268 * @param connection Instance of type Client
269 * @param request Request
270 */
272 Client& connection, const RegisterNodesRequest& request
273) noexcept;
274
275/**
276 * @copydoc registerNodes
277 * @param token @completiontoken{void(RegisterNodesResponse&)}
278 * @return @asyncresult{RegisterNodesResponse}
279 */
280template <typename CompletionToken>
282 Client& connection, const RegisterNodesRequest& request, CompletionToken&& token
283) {
284 return detail::sendRequestAsync<RegisterNodesRequest, RegisterNodesResponse>(
285 connection, request, std::forward<CompletionToken>(token)
286 );
287}
288
289/**
290 * @}
291 * @defgroup UnregisterNodes UnregisterNodes service
292 * Unregister nodes that have been obtained via the RegisterNodes service.
293 * @see https://reference.opcfoundation.org/Core/Part4/v105/docs/5.9.6
294 * @{
295 */
296
297/**
298 * Unregister nodes (client only).
299 * @param connection Instance of type Client
300 * @param request Request
301 */
303 Client& connection, const UnregisterNodesRequest& request
304) noexcept;
305
306/**
307 * @copydoc unregisterNodes
308 * @param token @completiontoken{void(UnregisterNodesResponse&)}
309 * @return @asyncresult{UnregisterNodesResponse}
310 */
311template <typename CompletionToken>
313 Client& connection, const UnregisterNodesRequest& request, CompletionToken&& token
314) {
315 return detail::sendRequestAsync<UnregisterNodesRequest, UnregisterNodesResponse>(
316 connection, request, std::forward<CompletionToken>(token)
317 );
318}
319
320/**
321 * @}
322 */
323
324/* ----------------------------------- Non-standard functions ----------------------------------- */
325
326/**
327 * @ingroup Browse
328 * @{
329 */
330
331/**
332 * Discover all the references of a specified node (without calling @ref browseNext).
333 * @param connection Instance of type Server or Client
334 * @param bd Browse description
335 */
336template <typename T>
338 std::vector<ReferenceDescription> refs;
339 auto handler = [&](BrowseResult& result) {
340 refs.insert(
341 refs.end(),
342 std::make_move_iterator(result.references().begin()),
343 std::make_move_iterator(result.references().end())
344 );
345 };
346 BrowseResult result = browse(connection, bd, 0U);
347 handler(result);
348 while (!result.continuationPoint().empty()) {
349 result = browseNext(connection, false, result.continuationPoint());
350 handler(result);
351 }
352 return {std::move(refs), result.statusCode()};
353}
354
355/**
356 * Discover child nodes recursively (non-standard).
357 *
358 * Possible loops (that can occur for non-hierarchical references) are handled internally. Every
359 * node is added at most once to the results array. Nodes are only added if they match the
360 * `nodeClassMask` in the BrowseDescription. However, child nodes are still recursed into if the
361 * NodeClass does not match. So it is possible, for example, to get all VariableNodes below a
362 * certain ObjectNode, with additional objects in the hierarchy below.
363 *
364 * @note No implementation for `Client`.
365 *
366 * @param connection Instance of type Server
367 * @param bd Browse description
368 * @see UA_Server_browseRecursive
369 * @ingroup Browse
370 */
371[[deprecated("will be removed in the future, use UA_Server_browseRecursive instead")]]
373 Server& connection, const BrowseDescription& bd
374);
375
376/**
377 * @}
378 */
379
380/**
381 * @}
382 */
383
384} // namespace opcua::services
UA_ByteString wrapper class.
Definition types.hpp:531
High-level client class.
Definition client.hpp:122
Client * asWrapper(UA_Client *client) noexcept
Convert native UA_Client pointer to its wrapper instance.
UA_NodeId wrapper class.
Definition types.hpp:666
The template class Result encapsulates a StatusCode and optionally a value.
Definition result.hpp:53
High-level server class.
Definition server.hpp:132
View to a contiguous sequence of objects, similar to std::span in C++20.
Definition span.hpp:28
UA_BrowseDescription wrapper class.
Definition types.hpp:1059
UA_BrowseNextRequest wrapper class.
Definition types.hpp:1161
UA_BrowseNextResponse wrapper class.
Definition types.hpp:1186
UA_BrowsePathResult wrapper class.
Definition types.hpp:1268
UA_BrowsePath wrapper class.
Definition types.hpp:1241
UA_BrowseRequest wrapper class.
Definition types.hpp:1090
UA_BrowseResponse wrapper class.
Definition types.hpp:1147
UA_BrowseResult wrapper class.
Definition types.hpp:1135
StatusCode statusCode() const noexcept
Definition types.hpp:1139
const ByteString & continuationPoint() const noexcept
Definition types.hpp:1140
UA_RegisterNodesRequest wrapper class.
Definition types.hpp:1319
UA_RegisterNodesResponse wrapper class.
Definition types.hpp:1337
UA_TranslateBrowsePathsToNodeIdsRequest wrapper class.
Definition types.hpp:1282
UA_TranslateBrowsePathsToNodeIdsResponse wrapper class.
Definition types.hpp:1304
UA_UnregisterNodesRequest wrapper class.
Definition types.hpp:1349
UA_UnregisterNodesResponse wrapper class.
Definition types.hpp:1367
BrowseNextResponse browseNext(Client &connection, const BrowseNextRequest &request) noexcept
Request the next sets of browse / browseNext responses (client only).
auto browseNextAsync(Client &connection, const BrowseNextRequest &request, CompletionToken &&token)
Request the next sets of browse / browseNext responses (client only).
Definition view.hpp:112
auto browseAsync(Client &connection, const BrowseRequest &request, CompletionToken &&token)
Discover the references of one or more nodes (client only).
Definition view.hpp:55
BrowseResponse browse(Client &connection, const BrowseRequest &request) noexcept
Discover the references of one or more nodes (client only).
Result< std::vector< ExpandedNodeId > > browseRecursive(Server &connection, const BrowseDescription &bd)
Discover child nodes recursively (non-standard).
Result< std::vector< ReferenceDescription > > browseAll(T &connection, const BrowseDescription &bd)
Discover all the references of a specified node (without calling browseNext).
Definition view.hpp:337
RegisterNodesResponse registerNodes(Client &connection, const RegisterNodesRequest &request) noexcept
Register nodes for efficient access operations (client only).
auto registerNodesAsync(Client &connection, const RegisterNodesRequest &request, CompletionToken &&token)
Register nodes for efficient access operations (client only).
Definition view.hpp:281
BrowsePathResult translateBrowsePathToNodeIds(T &connection, const BrowsePath &browsePath) noexcept
Translate a browse path to NodeIds.
auto translateBrowsePathsToNodeIdsAsync(Client &connection, const TranslateBrowsePathsToNodeIdsRequest &request, CompletionToken &&token)
Translate browse paths to NodeIds (client only).
Definition view.hpp:180
TranslateBrowsePathsToNodeIdsResponse translateBrowsePathsToNodeIds(Client &connection, const TranslateBrowsePathsToNodeIdsRequest &request) noexcept
Translate browse paths to NodeIds (client only).
auto translateBrowsePathToNodeIdsAsync(Client &connection, const BrowsePath &browsePath, CompletionToken &&token)
Translate a browse path to NodeIds.
Definition view.hpp:204
auto browseSimplifiedBrowsePathAsync(Client &connection, const NodeId &origin, Span< const QualifiedName > browsePath, CompletionToken &&token)
A simplified version of translateBrowsePathToNodeIds.
Definition view.hpp:244
BrowsePathResult browseSimplifiedBrowsePath(T &connection, const NodeId &origin, Span< const QualifiedName > browsePath)
A simplified version of translateBrowsePathToNodeIds.
Definition view.hpp:232
UnregisterNodesResponse unregisterNodes(Client &connection, const UnregisterNodesRequest &request) noexcept
Unregister nodes (client only).
auto unregisterNodesAsync(Client &connection, const UnregisterNodesRequest &request, CompletionToken &&token)
Unregister nodes (client only).
Definition view.hpp:312
OPC UA services as free functions.
Definition attribute.hpp:21