open62541pp 0.19.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::makeBrowseRequest(bd, maxReferences);
80 return browseAsync(
81 connection,
82 asWrapper<BrowseRequest>(request),
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::makeBrowseNextRequest(releaseContinuationPoint, continuationPoint);
145 return browseNextAsync(
146 connection,
147 asWrapper<BrowseNextRequest>(request),
148 detail::TransformToken(
149 detail::wrapSingleResultWithStatus<BrowseResult, UA_BrowseNextResponse>,
150 std::forward<CompletionToken>(token)
151 )
152 );
153}
154
155/**
156 * @}
157 * @defgroup TranslateBrowsePathsToNodeIds TranslateBrowsePathsToNodeIds service
158 * Request that the server translates browse paths to node ids.
159 * @see https://reference.opcfoundation.org/Core/Part4/v105/docs/5.9.4
160 * @{
161 */
162
163/**
164 * Translate browse paths to NodeIds (client only).
165 * @param connection Instance of type Client
166 * @param request Request
167 */
169 Client& connection, const TranslateBrowsePathsToNodeIdsRequest& request
170) noexcept;
171
172/**
173 * @copydoc translateBrowsePathsToNodeIds
174 * @param token @completiontoken{void(TranslateBrowsePathsToNodeIdsResponse&)}
175 * @return @asyncresult{TranslateBrowsePathsToNodeIdsResponse}
176 */
177template <typename CompletionToken>
179 Client& connection, const TranslateBrowsePathsToNodeIdsRequest& request, CompletionToken&& token
180) {
181 return detail::sendRequestAsync<
184 connection, request, std::forward<CompletionToken>(token)
185 );
186}
187
188/**
189 * Translate a browse path to NodeIds.
190 * @param connection Instance of type Server or Client
191 * @param browsePath Browse path (starting node & relative path)
192 */
193template <typename T>
194BrowsePathResult translateBrowsePathToNodeIds(T& connection, const BrowsePath& browsePath) noexcept;
195
196/**
197 * @copydoc translateBrowsePathToNodeIds
198 * @param token @completiontoken{void(BrowsePathResult&)}
199 * @return @asyncresult{BrowsePathResult}
200 */
201template <typename CompletionToken>
203 Client& connection, const BrowsePath& browsePath, CompletionToken&& token
204) {
205 const auto request = detail::makeTranslateBrowsePathsToNodeIdsRequest(browsePath);
207 connection,
208 asWrapper<TranslateBrowsePathsToNodeIdsRequest>(request),
209 detail::TransformToken(
210 detail::wrapSingleResultWithStatus<
213 std::forward<CompletionToken>(token)
214 )
215 );
216}
217
218/**
219 * A simplified version of @ref translateBrowsePathToNodeIds.
220 *
221 * The relative path is specified using browse names instead of the RelativePath structure.
222 * The list of browse names is equivalent to a RelativePath that specifies forward references which
223 * are subtypes of the HierarchicalReferences ReferenceTypeId.
224 *
225 * @param connection Instance of type Server or Client
226 * @param origin Starting node of the browse path
227 * @param browsePath Browse path as a list of browse names
228 */
229template <typename T>
231 T& connection, const NodeId& origin, Span<const QualifiedName> browsePath
232) {
233 return translateBrowsePathToNodeIds(connection, detail::makeBrowsePath(origin, browsePath));
234}
235
236/**
237 * @copydoc browseSimplifiedBrowsePath
238 * @param token @completiontoken{void(BrowsePathResult&)}
239 * @return @asyncresult{BrowsePathResult}
240 */
241template <typename CompletionToken>
243 Client& connection,
244 const NodeId& origin,
245 Span<const QualifiedName> browsePath,
246 CompletionToken&& token
247) {
249 connection, detail::makeBrowsePath(origin, browsePath), std::forward<CompletionToken>(token)
250 );
251}
252
253/**
254 * @}
255 * @defgroup RegisterNodes RegisterNodes service
256 * Register nodes for efficient access operations.
257 * Clients shall unregister unneeded nodes immediately to free up resources.
258 * @see https://reference.opcfoundation.org/Core/Part4/v105/docs/5.9.5
259 * @{
260 */
261
262/**
263 * Register nodes for efficient access operations (client only).
264 * @param connection Instance of type Client
265 * @param request Request
266 */
268 Client& connection, const RegisterNodesRequest& request
269) noexcept;
270
271/**
272 * @copydoc registerNodes
273 * @param token @completiontoken{void(RegisterNodesResponse&)}
274 * @return @asyncresult{RegisterNodesResponse}
275 */
276template <typename CompletionToken>
278 Client& connection, const RegisterNodesRequest& request, CompletionToken&& token
279) {
280 return detail::sendRequestAsync<RegisterNodesRequest, RegisterNodesResponse>(
281 connection, request, std::forward<CompletionToken>(token)
282 );
283}
284
285/**
286 * @}
287 * @defgroup UnregisterNodes UnregisterNodes service
288 * Unregister nodes that have been obtained via the RegisterNodes service.
289 * @see https://reference.opcfoundation.org/Core/Part4/v105/docs/5.9.6
290 * @{
291 */
292
293/**
294 * Unregister nodes (client only).
295 * @param connection Instance of type Client
296 * @param request Request
297 */
299 Client& connection, const UnregisterNodesRequest& request
300) noexcept;
301
302/**
303 * @copydoc unregisterNodes
304 * @param token @completiontoken{void(UnregisterNodesResponse&)}
305 * @return @asyncresult{UnregisterNodesResponse}
306 */
307template <typename CompletionToken>
309 Client& connection, const UnregisterNodesRequest& request, CompletionToken&& token
310) {
311 return detail::sendRequestAsync<UnregisterNodesRequest, UnregisterNodesResponse>(
312 connection, request, std::forward<CompletionToken>(token)
313 );
314}
315
316/**
317 * @}
318 */
319
320/* ----------------------------------- Non-standard functions ----------------------------------- */
321
322/**
323 * @ingroup Browse
324 * @{
325 */
326
327/**
328 * Discover all the references of a specified node (without calling @ref browseNext).
329 * @param connection Instance of type Server or Client
330 * @param bd Browse description
331 */
332template <typename T>
334 std::vector<ReferenceDescription> refs;
335 auto handler = [&](BrowseResult& result) {
336 refs.insert(
337 refs.end(),
338 std::make_move_iterator(result.references().begin()),
339 std::make_move_iterator(result.references().end())
340 );
341 };
342 BrowseResult result = browse(connection, bd, 0U);
343 handler(result);
344 while (!result.continuationPoint().empty()) {
345 result = browseNext(connection, false, result.continuationPoint());
346 handler(result);
347 }
348 return {std::move(refs), result.statusCode()};
349}
350
351/**
352 * @}
353 */
354
355/**
356 * @}
357 */
358
359} // namespace opcua::services
UA_ByteString wrapper class.
Definition types.hpp:537
High-level client class.
Definition client.hpp:130
UA_NodeId wrapper class.
Definition types.hpp:641
The template class Result encapsulates a StatusCode and optionally a value.
Definition result.hpp:53
View to a contiguous sequence of objects, similar to std::span in C++20.
Definition span.hpp:29
UA_BrowseDescription wrapper class.
Definition types.hpp:1036
UA_BrowseNextRequest wrapper class.
Definition types.hpp:1136
UA_BrowseNextResponse wrapper class.
Definition types.hpp:1160
UA_BrowsePathResult wrapper class.
Definition types.hpp:1240
UA_BrowsePath wrapper class.
Definition types.hpp:1213
UA_BrowseRequest wrapper class.
Definition types.hpp:1067
UA_BrowseResponse wrapper class.
Definition types.hpp:1124
UA_BrowseResult wrapper class.
Definition types.hpp:1112
StatusCode statusCode() const noexcept
Definition types.hpp:1116
const ByteString & continuationPoint() const noexcept
Definition types.hpp:1117
UA_RegisterNodesRequest wrapper class.
Definition types.hpp:1289
UA_RegisterNodesResponse wrapper class.
Definition types.hpp:1307
UA_TranslateBrowsePathsToNodeIdsRequest wrapper class.
Definition types.hpp:1254
UA_TranslateBrowsePathsToNodeIdsResponse wrapper class.
Definition types.hpp:1276
UA_UnregisterNodesRequest wrapper class.
Definition types.hpp:1319
UA_UnregisterNodesResponse wrapper class.
Definition types.hpp:1337
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< ReferenceDescription > > browseAll(T &connection, const BrowseDescription &bd)
Discover all the references of a specified node (without calling browseNext).
Definition view.hpp:333
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:277
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:178
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:202
auto browseSimplifiedBrowsePathAsync(Client &connection, const NodeId &origin, Span< const QualifiedName > browsePath, CompletionToken &&token)
A simplified version of translateBrowsePathToNodeIds.
Definition view.hpp:242
BrowsePathResult browseSimplifiedBrowsePath(T &connection, const NodeId &origin, Span< const QualifiedName > browsePath)
A simplified version of translateBrowsePathToNodeIds.
Definition view.hpp:230
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:308
OPC UA services as free functions.
Definition attribute.hpp:21