Created
March 3, 2020 05:59
-
-
Save spartajet/34f1d210ccc8c9b47cd49b3fe84316a6 to your computer and use it in GitHub Desktop.
Open UA 62541
This file has been truncated, but you can view the full file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* THIS IS A SINGLE-FILE DISTRIBUTION CONCATENATED FROM THE OPEN62541 SOURCES | |
* visit http://open62541.org/ for information about this software | |
* Git-Revision: v1.1-dev-282-g63771722 | |
*/ | |
/* | |
* Copyright (C) 2014-2018 the contributors as stated in the AUTHORS file | |
* | |
* This file is part of open62541. open62541 is free software: you can | |
* redistribute it and/or modify it under the terms of the Mozilla Public | |
* License v2.0 as stated in the LICENSE file provided with open62541. | |
* | |
* open62541 is distributed in the hope that it will be useful, but WITHOUT ANY | |
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR | |
* A PARTICULAR PURPOSE. | |
*/ | |
#ifndef UA_DYNAMIC_LINKING_EXPORT | |
# define UA_DYNAMIC_LINKING_EXPORT | |
# define MDNSD_DYNAMIC_LINKING | |
#endif | |
/* Disable security warnings for BSD sockets on MSVC */ | |
#ifdef _MSC_VER | |
# define _CRT_SECURE_NO_WARNINGS | |
#endif | |
#include "open62541.h" | |
/*********************************** amalgamated original file "E:/Librarys/open62541/deps/open62541_queue.h" ***********************************/ | |
/* $OpenBSD: queue.h,v 1.38 2013/07/03 15:05:21 fgsch Exp $ */ | |
/* $NetBSD: queue.h,v 1.11 1996/05/16 05:17:14 mycroft Exp $ */ | |
/* | |
* Copyright (c) 1991, 1993 | |
* The Regents of the University of California. All rights reserved. | |
* | |
* Redistribution and use in source and binary forms, with or without | |
* modification, are permitted provided that the following conditions | |
* are met: | |
* 1. Redistributions of source code must retain the above copyright | |
* notice, this list of conditions and the following disclaimer. | |
* 2. Redistributions in binary form must reproduce the above copyright | |
* notice, this list of conditions and the following disclaimer in the | |
* documentation and/or other materials provided with the distribution. | |
* 3. Neither the name of the University nor the names of its contributors | |
* may be used to endorse or promote products derived from this software | |
* without specific prior written permission. | |
* | |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
* SUCH DAMAGE. | |
* | |
* @(#)queue.h 8.5 (Berkeley) 8/20/94 | |
*/ | |
/* | |
* This file defines five types of data structures: singly-linked lists, | |
* lists, simple queues, tail queues, and circular queues. | |
* | |
* | |
* A singly-linked list is headed by a single forward pointer. The elements | |
* are singly linked for minimum space and pointer manipulation overhead at | |
* the expense of O(n) removal for arbitrary elements. New elements can be | |
* added to the list after an existing element or at the head of the list. | |
* Elements being removed from the head of the list should use the explicit | |
* macro for this purpose for optimum efficiency. A singly-linked list may | |
* only be traversed in the forward direction. Singly-linked lists are ideal | |
* for applications with large datasets and few or no removals or for | |
* implementing a LIFO queue. | |
* | |
* A list is headed by a single forward pointer (or an array of forward | |
* pointers for a hash table header). The elements are doubly linked | |
* so that an arbitrary element can be removed without a need to | |
* traverse the list. New elements can be added to the list before | |
* or after an existing element or at the head of the list. A list | |
* may only be traversed in the forward direction. | |
* | |
* A simple queue is headed by a pair of pointers, one the head of the | |
* list and the other to the tail of the list. The elements are singly | |
* linked to save space, so elements can only be removed from the | |
* head of the list. New elements can be added to the list before or after | |
* an existing element, at the head of the list, or at the end of the | |
* list. A simple queue may only be traversed in the forward direction. | |
* | |
* A tail queue is headed by a pair of pointers, one to the head of the | |
* list and the other to the tail of the list. The elements are doubly | |
* linked so that an arbitrary element can be removed without a need to | |
* traverse the list. New elements can be added to the list before or | |
* after an existing element, at the head of the list, or at the end of | |
* the list. A tail queue may be traversed in either direction. | |
* | |
* A circle queue is headed by a pair of pointers, one to the head of the | |
* list and the other to the tail of the list. The elements are doubly | |
* linked so that an arbitrary element can be removed without a need to | |
* traverse the list. New elements can be added to the list before or after | |
* an existing element, at the head of the list, or at the end of the list. | |
* A circle queue may be traversed in either direction, but has a more | |
* complex end of list detection. | |
* | |
* For details on the use of these macros, see the queue(3) manual page. | |
*/ | |
#if defined(QUEUE_MACRO_DEBUG) || (defined(_KERNEL) && defined(DIAGNOSTIC)) | |
#define _Q_INVALIDATE(a) (a) = ((void *)-1) | |
#else | |
#define _Q_INVALIDATE(a) | |
#endif | |
/* | |
* Singly-linked List definitions. | |
*/ | |
#define SLIST_HEAD(name, type) \ | |
struct name { \ | |
struct type *slh_first; /* first element */ \ | |
} | |
#define SLIST_HEAD_INITIALIZER(head) \ | |
{ NULL } | |
#define SLIST_ENTRY(type) \ | |
struct { \ | |
struct type *sle_next; /* next element */ \ | |
} | |
/* | |
* Singly-linked List access methods. | |
*/ | |
#define SLIST_FIRST(head) ((head)->slh_first) | |
#define SLIST_END(head) NULL | |
#define SLIST_EMPTY(head) (SLIST_FIRST(head) == SLIST_END(head)) | |
#define SLIST_NEXT(elm, field) ((elm)->field.sle_next) | |
#define SLIST_FOREACH(var, head, field) \ | |
for((var) = SLIST_FIRST(head); \ | |
(var) != SLIST_END(head); \ | |
(var) = SLIST_NEXT(var, field)) | |
#define SLIST_FOREACH_SAFE(var, head, field, tvar) \ | |
for ((var) = SLIST_FIRST(head); \ | |
(var) && ((tvar) = SLIST_NEXT(var, field), 1); \ | |
(var) = (tvar)) | |
/* | |
* Singly-linked List functions. | |
*/ | |
#define SLIST_INIT(head) { \ | |
SLIST_FIRST(head) = SLIST_END(head); \ | |
} | |
#define SLIST_INSERT_AFTER(slistelm, elm, field) do { \ | |
(elm)->field.sle_next = (slistelm)->field.sle_next; \ | |
(slistelm)->field.sle_next = (elm); \ | |
} while (0) | |
#define SLIST_INSERT_HEAD(head, elm, field) do { \ | |
(elm)->field.sle_next = (head)->slh_first; \ | |
(head)->slh_first = (elm); \ | |
} while (0) | |
#define SLIST_REMOVE_AFTER(elm, field) do { \ | |
(elm)->field.sle_next = (elm)->field.sle_next->field.sle_next; \ | |
} while (0) | |
#define SLIST_REMOVE_HEAD(head, field) do { \ | |
(head)->slh_first = (head)->slh_first->field.sle_next; \ | |
} while (0) | |
#define SLIST_REMOVE(head, elm, type, field) do { \ | |
if ((head)->slh_first == (elm)) { \ | |
SLIST_REMOVE_HEAD((head), field); \ | |
} else { \ | |
struct type *curelm = (head)->slh_first; \ | |
\ | |
while (curelm->field.sle_next != (elm)) \ | |
curelm = curelm->field.sle_next; \ | |
curelm->field.sle_next = \ | |
curelm->field.sle_next->field.sle_next; \ | |
_Q_INVALIDATE((elm)->field.sle_next); \ | |
} \ | |
} while (0) | |
/* | |
* List definitions. | |
*/ | |
#define LIST_HEAD(name, type) \ | |
struct name { \ | |
struct type *lh_first; /* first element */ \ | |
} | |
#define LIST_HEAD_INITIALIZER(head) \ | |
{ NULL } | |
#define LIST_ENTRY(type) \ | |
struct { \ | |
struct type *le_next; /* next element */ \ | |
struct type **le_prev; /* address of previous next element */ \ | |
} | |
/* | |
* List access methods | |
*/ | |
#define LIST_FIRST(head) ((head)->lh_first) | |
#define LIST_END(head) NULL | |
#define LIST_EMPTY(head) (LIST_FIRST(head) == LIST_END(head)) | |
#define LIST_NEXT(elm, field) ((elm)->field.le_next) | |
#define LIST_FOREACH(var, head, field) \ | |
for((var) = LIST_FIRST(head); \ | |
(var)!= LIST_END(head); \ | |
(var) = LIST_NEXT(var, field)) | |
#define LIST_FOREACH_SAFE(var, head, field, tvar) \ | |
for ((var) = LIST_FIRST(head); \ | |
(var) && ((tvar) = LIST_NEXT(var, field), 1); \ | |
(var) = (tvar)) | |
/* | |
* List functions. | |
*/ | |
#define LIST_INIT(head) do { \ | |
LIST_FIRST(head) = LIST_END(head); \ | |
} while (0) | |
#define LIST_INSERT_AFTER(listelm, elm, field) do { \ | |
if (((elm)->field.le_next = (listelm)->field.le_next) != NULL) \ | |
(listelm)->field.le_next->field.le_prev = \ | |
&(elm)->field.le_next; \ | |
(listelm)->field.le_next = (elm); \ | |
(elm)->field.le_prev = &(listelm)->field.le_next; \ | |
} while (0) | |
#define LIST_INSERT_BEFORE(listelm, elm, field) do { \ | |
(elm)->field.le_prev = (listelm)->field.le_prev; \ | |
(elm)->field.le_next = (listelm); \ | |
*(listelm)->field.le_prev = (elm); \ | |
(listelm)->field.le_prev = &(elm)->field.le_next; \ | |
} while (0) | |
#define LIST_INSERT_HEAD(head, elm, field) do { \ | |
if (((elm)->field.le_next = (head)->lh_first) != NULL) \ | |
(head)->lh_first->field.le_prev = &(elm)->field.le_next;\ | |
(head)->lh_first = (elm); \ | |
(elm)->field.le_prev = &(head)->lh_first; \ | |
} while (0) | |
#define LIST_REMOVE(elm, field) do { \ | |
if ((elm)->field.le_next != NULL) \ | |
(elm)->field.le_next->field.le_prev = \ | |
(elm)->field.le_prev; \ | |
*(elm)->field.le_prev = (elm)->field.le_next; \ | |
_Q_INVALIDATE((elm)->field.le_prev); \ | |
_Q_INVALIDATE((elm)->field.le_next); \ | |
} while (0) | |
#define LIST_REPLACE(elm, elm2, field) do { \ | |
if (((elm2)->field.le_next = (elm)->field.le_next) != NULL) \ | |
(elm2)->field.le_next->field.le_prev = \ | |
&(elm2)->field.le_next; \ | |
(elm2)->field.le_prev = (elm)->field.le_prev; \ | |
*(elm2)->field.le_prev = (elm2); \ | |
_Q_INVALIDATE((elm)->field.le_prev); \ | |
_Q_INVALIDATE((elm)->field.le_next); \ | |
} while (0) | |
/* | |
* Simple queue definitions. | |
*/ | |
#define SIMPLEQ_HEAD(name, type) \ | |
struct name { \ | |
struct type *sqh_first; /* first element */ \ | |
struct type **sqh_last; /* addr of last next element */ \ | |
} | |
#define SIMPLEQ_HEAD_INITIALIZER(head) \ | |
{ NULL, &(head).sqh_first } | |
#define SIMPLEQ_ENTRY(type) \ | |
struct { \ | |
struct type *sqe_next; /* next element */ \ | |
} | |
/* | |
* Simple queue access methods. | |
*/ | |
#define SIMPLEQ_FIRST(head) ((head)->sqh_first) | |
#define SIMPLEQ_END(head) NULL | |
#define SIMPLEQ_EMPTY(head) (SIMPLEQ_FIRST(head) == SIMPLEQ_END(head)) | |
#define SIMPLEQ_NEXT(elm, field) ((elm)->field.sqe_next) | |
#define SIMPLEQ_FOREACH(var, head, field) \ | |
for((var) = SIMPLEQ_FIRST(head); \ | |
(var) != SIMPLEQ_END(head); \ | |
(var) = SIMPLEQ_NEXT(var, field)) | |
#define SIMPLEQ_FOREACH_SAFE(var, head, field, tvar) \ | |
for ((var) = SIMPLEQ_FIRST(head); \ | |
(var) && ((tvar) = SIMPLEQ_NEXT(var, field), 1); \ | |
(var) = (tvar)) | |
/* | |
* Simple queue functions. | |
*/ | |
#define SIMPLEQ_INIT(head) do { \ | |
(head)->sqh_first = NULL; \ | |
(head)->sqh_last = &(head)->sqh_first; \ | |
} while (0) | |
#define SIMPLEQ_INSERT_HEAD(head, elm, field) do { \ | |
if (((elm)->field.sqe_next = (head)->sqh_first) == NULL) \ | |
(head)->sqh_last = &(elm)->field.sqe_next; \ | |
(head)->sqh_first = (elm); \ | |
} while (0) | |
#define SIMPLEQ_INSERT_TAIL(head, elm, field) do { \ | |
(elm)->field.sqe_next = NULL; \ | |
*(head)->sqh_last = (elm); \ | |
(head)->sqh_last = &(elm)->field.sqe_next; \ | |
} while (0) | |
#define SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do { \ | |
if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL)\ | |
(head)->sqh_last = &(elm)->field.sqe_next; \ | |
(listelm)->field.sqe_next = (elm); \ | |
} while (0) | |
#define SIMPLEQ_REMOVE_HEAD(head, field) do { \ | |
if (((head)->sqh_first = (head)->sqh_first->field.sqe_next) == NULL) \ | |
(head)->sqh_last = &(head)->sqh_first; \ | |
} while (0) | |
#define SIMPLEQ_REMOVE_AFTER(head, elm, field) do { \ | |
if (((elm)->field.sqe_next = (elm)->field.sqe_next->field.sqe_next) \ | |
== NULL) \ | |
(head)->sqh_last = &(elm)->field.sqe_next; \ | |
} while (0) | |
/* | |
* XOR Simple queue definitions. | |
*/ | |
#define XSIMPLEQ_HEAD(name, type) \ | |
struct name { \ | |
struct type *sqx_first; /* first element */ \ | |
struct type **sqx_last; /* addr of last next element */ \ | |
unsigned long sqx_cookie; \ | |
} | |
#define XSIMPLEQ_ENTRY(type) \ | |
struct { \ | |
struct type *sqx_next; /* next element */ \ | |
} | |
/* | |
* XOR Simple queue access methods. | |
*/ | |
#define XSIMPLEQ_XOR(head, ptr) ((__typeof(ptr))((head)->sqx_cookie ^ \ | |
(unsigned long)(ptr))) | |
#define XSIMPLEQ_FIRST(head) XSIMPLEQ_XOR(head, ((head)->sqx_first)) | |
#define XSIMPLEQ_END(head) NULL | |
#define XSIMPLEQ_EMPTY(head) (XSIMPLEQ_FIRST(head) == XSIMPLEQ_END(head)) | |
#define XSIMPLEQ_NEXT(head, elm, field) XSIMPLEQ_XOR(head, ((elm)->field.sqx_next)) | |
#define XSIMPLEQ_FOREACH(var, head, field) \ | |
for ((var) = XSIMPLEQ_FIRST(head); \ | |
(var) != XSIMPLEQ_END(head); \ | |
(var) = XSIMPLEQ_NEXT(head, var, field)) | |
#define XSIMPLEQ_FOREACH_SAFE(var, head, field, tvar) \ | |
for ((var) = XSIMPLEQ_FIRST(head); \ | |
(var) && ((tvar) = XSIMPLEQ_NEXT(head, var, field), 1); \ | |
(var) = (tvar)) | |
/* | |
* XOR Simple queue functions. | |
*/ | |
#define XSIMPLEQ_INIT(head) do { \ | |
arc4random_buf(&(head)->sqx_cookie, sizeof((head)->sqx_cookie)); \ | |
(head)->sqx_first = XSIMPLEQ_XOR(head, NULL); \ | |
(head)->sqx_last = XSIMPLEQ_XOR(head, &(head)->sqx_first); \ | |
} while (0) | |
#define XSIMPLEQ_INSERT_HEAD(head, elm, field) do { \ | |
if (((elm)->field.sqx_next = (head)->sqx_first) == \ | |
XSIMPLEQ_XOR(head, NULL)) \ | |
(head)->sqx_last = XSIMPLEQ_XOR(head, &(elm)->field.sqx_next); \ | |
(head)->sqx_first = XSIMPLEQ_XOR(head, (elm)); \ | |
} while (0) | |
#define XSIMPLEQ_INSERT_TAIL(head, elm, field) do { \ | |
(elm)->field.sqx_next = XSIMPLEQ_XOR(head, NULL); \ | |
*(XSIMPLEQ_XOR(head, (head)->sqx_last)) = XSIMPLEQ_XOR(head, (elm)); \ | |
(head)->sqx_last = XSIMPLEQ_XOR(head, &(elm)->field.sqx_next); \ | |
} while (0) | |
#define XSIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do { \ | |
if (((elm)->field.sqx_next = (listelm)->field.sqx_next) == \ | |
XSIMPLEQ_XOR(head, NULL)) \ | |
(head)->sqx_last = XSIMPLEQ_XOR(head, &(elm)->field.sqx_next); \ | |
(listelm)->field.sqx_next = XSIMPLEQ_XOR(head, (elm)); \ | |
} while (0) | |
#define XSIMPLEQ_REMOVE_HEAD(head, field) do { \ | |
if (((head)->sqx_first = XSIMPLEQ_XOR(head, \ | |
(head)->sqx_first)->field.sqx_next) == XSIMPLEQ_XOR(head, NULL)) \ | |
(head)->sqx_last = XSIMPLEQ_XOR(head, &(head)->sqx_first); \ | |
} while (0) | |
#define XSIMPLEQ_REMOVE_AFTER(head, elm, field) do { \ | |
if (((elm)->field.sqx_next = XSIMPLEQ_XOR(head, \ | |
(elm)->field.sqx_next)->field.sqx_next) \ | |
== XSIMPLEQ_XOR(head, NULL)) \ | |
(head)->sqx_last = \ | |
XSIMPLEQ_XOR(head, &(elm)->field.sqx_next); \ | |
} while (0) | |
/* | |
* Tail queue definitions. | |
*/ | |
#define TAILQ_HEAD(name, type) \ | |
struct name { \ | |
struct type *tqh_first; /* first element */ \ | |
struct type **tqh_last; /* addr of last next element */ \ | |
} | |
#define TAILQ_HEAD_INITIALIZER(head) \ | |
{ NULL, &(head).tqh_first } | |
#define TAILQ_ENTRY(type) \ | |
struct { \ | |
struct type *tqe_next; /* next element */ \ | |
struct type **tqe_prev; /* address of previous next element */ \ | |
} | |
/* | |
* tail queue access methods | |
*/ | |
#define TAILQ_FIRST(head) ((head)->tqh_first) | |
#define TAILQ_END(head) NULL | |
#define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next) | |
#define TAILQ_LAST(head, headname) \ | |
(*(((struct headname *)((head)->tqh_last))->tqh_last)) | |
/* XXX */ | |
#define TAILQ_PREV(elm, headname, field) \ | |
(*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) | |
#define TAILQ_EMPTY(head) \ | |
(TAILQ_FIRST(head) == TAILQ_END(head)) | |
#define TAILQ_FOREACH(var, head, field) \ | |
for((var) = TAILQ_FIRST(head); \ | |
(var) != TAILQ_END(head); \ | |
(var) = TAILQ_NEXT(var, field)) | |
#define TAILQ_FOREACH_SAFE(var, head, field, tvar) \ | |
for ((var) = TAILQ_FIRST(head); \ | |
(var) != TAILQ_END(head) && \ | |
((tvar) = TAILQ_NEXT(var, field), 1); \ | |
(var) = (tvar)) | |
#define TAILQ_FOREACH_REVERSE(var, head, headname, field) \ | |
for((var) = TAILQ_LAST(head, headname); \ | |
(var) != TAILQ_END(head); \ | |
(var) = TAILQ_PREV(var, headname, field)) | |
#define TAILQ_FOREACH_REVERSE_SAFE(var, head, headname, field, tvar) \ | |
for ((var) = TAILQ_LAST(head, headname); \ | |
(var) != TAILQ_END(head) && \ | |
((tvar) = TAILQ_PREV(var, headname, field), 1); \ | |
(var) = (tvar)) | |
/* | |
* Tail queue functions. | |
*/ | |
#define TAILQ_INIT(head) do { \ | |
(head)->tqh_first = NULL; \ | |
(head)->tqh_last = &(head)->tqh_first; \ | |
} while (0) | |
#define TAILQ_INSERT_HEAD(head, elm, field) do { \ | |
if (((elm)->field.tqe_next = (head)->tqh_first) != NULL) \ | |
(head)->tqh_first->field.tqe_prev = \ | |
&(elm)->field.tqe_next; \ | |
else \ | |
(head)->tqh_last = &(elm)->field.tqe_next; \ | |
(head)->tqh_first = (elm); \ | |
(elm)->field.tqe_prev = &(head)->tqh_first; \ | |
} while (0) | |
#define TAILQ_INSERT_TAIL(head, elm, field) do { \ | |
(elm)->field.tqe_next = NULL; \ | |
(elm)->field.tqe_prev = (head)->tqh_last; \ | |
*(head)->tqh_last = (elm); \ | |
(head)->tqh_last = &(elm)->field.tqe_next; \ | |
} while (0) | |
#define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ | |
if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\ | |
(elm)->field.tqe_next->field.tqe_prev = \ | |
&(elm)->field.tqe_next; \ | |
else \ | |
(head)->tqh_last = &(elm)->field.tqe_next; \ | |
(listelm)->field.tqe_next = (elm); \ | |
(elm)->field.tqe_prev = &(listelm)->field.tqe_next; \ | |
} while (0) | |
#define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \ | |
(elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ | |
(elm)->field.tqe_next = (listelm); \ | |
*(listelm)->field.tqe_prev = (elm); \ | |
(listelm)->field.tqe_prev = &(elm)->field.tqe_next; \ | |
} while (0) | |
#define TAILQ_REMOVE(head, elm, field) do { \ | |
if (((elm)->field.tqe_next) != NULL) \ | |
(elm)->field.tqe_next->field.tqe_prev = \ | |
(elm)->field.tqe_prev; \ | |
else \ | |
(head)->tqh_last = (elm)->field.tqe_prev; \ | |
*(elm)->field.tqe_prev = (elm)->field.tqe_next; \ | |
_Q_INVALIDATE((elm)->field.tqe_prev); \ | |
_Q_INVALIDATE((elm)->field.tqe_next); \ | |
} while (0) | |
#define TAILQ_REPLACE(head, elm, elm2, field) do { \ | |
if (((elm2)->field.tqe_next = (elm)->field.tqe_next) != NULL) \ | |
(elm2)->field.tqe_next->field.tqe_prev = \ | |
&(elm2)->field.tqe_next; \ | |
else \ | |
(head)->tqh_last = &(elm2)->field.tqe_next; \ | |
(elm2)->field.tqe_prev = (elm)->field.tqe_prev; \ | |
*(elm2)->field.tqe_prev = (elm2); \ | |
_Q_INVALIDATE((elm)->field.tqe_prev); \ | |
_Q_INVALIDATE((elm)->field.tqe_next); \ | |
} while (0) | |
/* | |
* Circular queue definitions. | |
*/ | |
#define CIRCLEQ_HEAD(name, type) \ | |
struct name { \ | |
struct type *cqh_first; /* first element */ \ | |
struct type *cqh_last; /* last element */ \ | |
} | |
#define CIRCLEQ_HEAD_INITIALIZER(head) \ | |
{ CIRCLEQ_END(&head), CIRCLEQ_END(&head) } | |
#define CIRCLEQ_ENTRY(type) \ | |
struct { \ | |
struct type *cqe_next; /* next element */ \ | |
struct type *cqe_prev; /* previous element */ \ | |
} | |
/* | |
* Circular queue access methods | |
*/ | |
#define CIRCLEQ_FIRST(head) ((head)->cqh_first) | |
#define CIRCLEQ_LAST(head) ((head)->cqh_last) | |
#define CIRCLEQ_END(head) ((void *)(head)) | |
#define CIRCLEQ_NEXT(elm, field) ((elm)->field.cqe_next) | |
#define CIRCLEQ_PREV(elm, field) ((elm)->field.cqe_prev) | |
#define CIRCLEQ_EMPTY(head) \ | |
(CIRCLEQ_FIRST(head) == CIRCLEQ_END(head)) | |
#define CIRCLEQ_FOREACH(var, head, field) \ | |
for((var) = CIRCLEQ_FIRST(head); \ | |
(var) != CIRCLEQ_END(head); \ | |
(var) = CIRCLEQ_NEXT(var, field)) | |
#define CIRCLEQ_FOREACH_SAFE(var, head, field, tvar) \ | |
for ((var) = CIRCLEQ_FIRST(head); \ | |
(var) != CIRCLEQ_END(head) && \ | |
((tvar) = CIRCLEQ_NEXT(var, field), 1); \ | |
(var) = (tvar)) | |
#define CIRCLEQ_FOREACH_REVERSE(var, head, field) \ | |
for((var) = CIRCLEQ_LAST(head); \ | |
(var) != CIRCLEQ_END(head); \ | |
(var) = CIRCLEQ_PREV(var, field)) | |
#define CIRCLEQ_FOREACH_REVERSE_SAFE(var, head, headname, field, tvar) \ | |
for ((var) = CIRCLEQ_LAST(head, headname); \ | |
(var) != CIRCLEQ_END(head) && \ | |
((tvar) = CIRCLEQ_PREV(var, headname, field), 1); \ | |
(var) = (tvar)) | |
/* | |
* Circular queue functions. | |
*/ | |
#define CIRCLEQ_INIT(head) do { \ | |
(head)->cqh_first = CIRCLEQ_END(head); \ | |
(head)->cqh_last = CIRCLEQ_END(head); \ | |
} while (0) | |
#define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do { \ | |
(elm)->field.cqe_next = (listelm)->field.cqe_next; \ | |
(elm)->field.cqe_prev = (listelm); \ | |
if ((listelm)->field.cqe_next == CIRCLEQ_END(head)) \ | |
(head)->cqh_last = (elm); \ | |
else \ | |
(listelm)->field.cqe_next->field.cqe_prev = (elm); \ | |
(listelm)->field.cqe_next = (elm); \ | |
} while (0) | |
#define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do { \ | |
(elm)->field.cqe_next = (listelm); \ | |
(elm)->field.cqe_prev = (listelm)->field.cqe_prev; \ | |
if ((listelm)->field.cqe_prev == CIRCLEQ_END(head)) \ | |
(head)->cqh_first = (elm); \ | |
else \ | |
(listelm)->field.cqe_prev->field.cqe_next = (elm); \ | |
(listelm)->field.cqe_prev = (elm); \ | |
} while (0) | |
#define CIRCLEQ_INSERT_HEAD(head, elm, field) do { \ | |
(elm)->field.cqe_next = (head)->cqh_first; \ | |
(elm)->field.cqe_prev = CIRCLEQ_END(head); \ | |
if ((head)->cqh_last == CIRCLEQ_END(head)) \ | |
(head)->cqh_last = (elm); \ | |
else \ | |
(head)->cqh_first->field.cqe_prev = (elm); \ | |
(head)->cqh_first = (elm); \ | |
} while (0) | |
#define CIRCLEQ_INSERT_TAIL(head, elm, field) do { \ | |
(elm)->field.cqe_next = CIRCLEQ_END(head); \ | |
(elm)->field.cqe_prev = (head)->cqh_last; \ | |
if ((head)->cqh_first == CIRCLEQ_END(head)) \ | |
(head)->cqh_first = (elm); \ | |
else \ | |
(head)->cqh_last->field.cqe_next = (elm); \ | |
(head)->cqh_last = (elm); \ | |
} while (0) | |
#define CIRCLEQ_REMOVE(head, elm, field) do { \ | |
if ((elm)->field.cqe_next == CIRCLEQ_END(head)) \ | |
(head)->cqh_last = (elm)->field.cqe_prev; \ | |
else \ | |
(elm)->field.cqe_next->field.cqe_prev = \ | |
(elm)->field.cqe_prev; \ | |
if ((elm)->field.cqe_prev == CIRCLEQ_END(head)) \ | |
(head)->cqh_first = (elm)->field.cqe_next; \ | |
else \ | |
(elm)->field.cqe_prev->field.cqe_next = \ | |
(elm)->field.cqe_next; \ | |
_Q_INVALIDATE((elm)->field.cqe_prev); \ | |
_Q_INVALIDATE((elm)->field.cqe_next); \ | |
} while (0) | |
#define CIRCLEQ_REPLACE(head, elm, elm2, field) do { \ | |
if (((elm2)->field.cqe_next = (elm)->field.cqe_next) == \ | |
CIRCLEQ_END(head)) \ | |
(head)->cqh_last = (elm2); \ | |
else \ | |
(elm2)->field.cqe_next->field.cqe_prev = (elm2); \ | |
if (((elm2)->field.cqe_prev = (elm)->field.cqe_prev) == \ | |
CIRCLEQ_END(head)) \ | |
(head)->cqh_first = (elm2); \ | |
else \ | |
(elm2)->field.cqe_prev->field.cqe_next = (elm2); \ | |
_Q_INVALIDATE((elm)->field.cqe_prev); \ | |
_Q_INVALIDATE((elm)->field.cqe_next); \ | |
} while (0) | |
/*********************************** amalgamated original file "E:/Librarys/open62541/deps/pcg_basic.h" ***********************************/ | |
/* | |
* PCG Random Number Generation for C. | |
* | |
* Copyright 2014 Melissa O'Neill <oneill@pcg-random.org> | |
* | |
* Licensed under the Apache License, Version 2.0 (the "License"); | |
* you may not use this file except in compliance with the License. | |
* You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
* | |
* For additional information about the PCG random number generation scheme, | |
* including its license and other licensing options, visit | |
* | |
* http://www.pcg-random.org | |
*/ | |
#ifdef __cplusplus | |
extern "C" { | |
#endif | |
typedef struct pcg_state_setseq_64 { | |
uint64_t state; /* RNG state. All values are possible. */ | |
uint64_t inc; /* Controls which RNG sequence (stream) is selected. Must | |
* *always* be odd. */ | |
} pcg32_random_t; | |
#define PCG32_INITIALIZER { 0x853c49e6748fea9bULL, 0xda3e39cb94b95bdbULL } | |
void pcg32_srandom_r(pcg32_random_t* rng, uint64_t initial_state, uint64_t initseq); | |
uint32_t pcg32_random_r(pcg32_random_t* rng); | |
#ifdef __cplusplus | |
} | |
#endif | |
/*********************************** amalgamated original file "E:/Librarys/open62541/deps/libc_time.h" ***********************************/ | |
struct mytm { | |
int tm_sec; | |
int tm_min; | |
int tm_hour; | |
int tm_mday; | |
int tm_mon; | |
int tm_year; | |
}; | |
int __secs_to_tm(long long t, struct mytm *tm); | |
long long __tm_to_secs(const struct mytm *tm); | |
/*********************************** amalgamated original file "E:/Librarys/open62541/deps/base64.h" ***********************************/ | |
#ifndef UA_BASE64_H_ | |
#define UA_BASE64_H_ | |
_UA_BEGIN_DECLS | |
#include <stddef.h> | |
/** | |
* base64_encode - Base64 encode | |
* @src: Data to be encoded | |
* @len: Length of the data to be encoded | |
* @out_len: Pointer to output length variable | |
* Returns: Allocated buffer of out_len bytes of encoded data, | |
* or %NULL on failure. The output is NOT Null-terminated. */ | |
unsigned char * | |
UA_base64(const unsigned char *src, size_t len, size_t *out_len); | |
/** | |
* base64_decode - Base64 decode | |
* @src: Data to be decoded | |
* @len: Length of the data to be decoded | |
* @out_len: Pointer to output length variable | |
* Returns: Allocated buffer of out_len bytes of decoded data, | |
* or %NULL on failure. */ | |
unsigned char * | |
UA_unbase64(const unsigned char *src, size_t len, size_t *out_len); | |
_UA_END_DECLS | |
#endif /* UA_BASE64_H_ */ | |
/*********************************** amalgamated original file "E:/Librarys/open62541/src/ua_util_internal.h" ***********************************/ | |
/* This Source Code Form is subject to the terms of the Mozilla Public | |
* License, v. 2.0. If a copy of the MPL was not distributed with this | |
* file, You can obtain one at http://mozilla.org/MPL/2.0/. | |
* | |
* Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) | |
* Copyright 2014, 2017 (c) Florian Palm | |
* Copyright 2015 (c) LEvertz | |
* Copyright 2015-2016 (c) Sten Grüner | |
* Copyright 2015 (c) Chris Iatrou | |
* Copyright 2015-2016 (c) Oleksiy Vasylyev | |
* Copyright 2017 (c) Stefan Profanter, fortiss GmbH | |
*/ | |
#define UA_INTERNAL | |
_UA_BEGIN_DECLS | |
/* Macro-Expand for MSVC workarounds */ | |
#define UA_MACRO_EXPAND(x) x | |
/* Print a NodeId in logs */ | |
#define UA_LOG_NODEID_WRAP(NODEID, LOG) { \ | |
UA_String nodeIdStr = UA_STRING_NULL; \ | |
UA_NodeId_toString(NODEID, &nodeIdStr); \ | |
LOG; \ | |
UA_String_clear(&nodeIdStr); \ | |
} | |
/* Integer Shortnames | |
* ------------------ | |
* These are not exposed on the public API, since many user-applications make | |
* the same definitions in their headers. */ | |
typedef UA_Byte u8; | |
typedef UA_SByte i8; | |
typedef UA_UInt16 u16; | |
typedef UA_Int16 i16; | |
typedef UA_UInt32 u32; | |
typedef UA_Int32 i32; | |
typedef UA_UInt64 u64; | |
typedef UA_Int64 i64; | |
typedef UA_StatusCode status; | |
/* Utility Functions | |
* ----------------- */ | |
#ifdef UA_DEBUG_DUMP_PKGS | |
void UA_EXPORT UA_dump_hex_pkg(UA_Byte* buffer, size_t bufferLen); | |
#endif | |
_UA_END_DECLS | |
/*********************************** amalgamated original file "E:/Librarys/open62541/src/ua_types_encoding_binary.h" ***********************************/ | |
/* This Source Code Form is subject to the terms of the Mozilla Public | |
* License, v. 2.0. If a copy of the MPL was not distributed with this | |
* file, You can obtain one at http://mozilla.org/MPL/2.0/. | |
* | |
* Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) | |
* Copyright 2015 (c) Sten Grüner | |
* Copyright 2014, 2017 (c) Florian Palm | |
* Copyright 2017 (c) Stefan Profanter, fortiss GmbH | |
* Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB | |
*/ | |
_UA_BEGIN_DECLS | |
typedef UA_StatusCode (*UA_exchangeEncodeBuffer)(void *handle, UA_Byte **bufPos, | |
const UA_Byte **bufEnd); | |
/* Encodes the scalar value described by type in the binary encoding. Encoding | |
* is thread-safe if thread-local variables are enabled. Encoding is also | |
* reentrant and can be safely called from signal handlers or interrupts. | |
* | |
* @param src The value. Must not be NULL. | |
* @param type The value type. Must not be NULL. | |
* @param bufPos Points to a pointer to the current position in the encoding | |
* buffer. Must not be NULL. The pointer is advanced by the number of | |
* encoded bytes, or, if the buffer is exchanged, to the position in the | |
* new buffer. | |
* @param bufEnd Points to a pointer to the end of the encoding buffer (encoding | |
* always stops before *buf_end). Must not be NULL. The pointer is | |
* changed when the buffer is exchanged. | |
* @param exchangeCallback Called when the end of the buffer is reached. This is | |
used to send out a message chunk before continuing with the encoding. | |
Is ignored if NULL. | |
* @param exchangeHandle Custom data passed into the exchangeCallback. | |
* @return Returns a statuscode whether encoding succeeded. */ | |
UA_StatusCode | |
UA_encodeBinary(const void *src, const UA_DataType *type, | |
UA_Byte **bufPos, const UA_Byte **bufEnd, | |
UA_exchangeEncodeBuffer exchangeCallback, | |
void *exchangeHandle) UA_FUNC_ATTR_WARN_UNUSED_RESULT; | |
/* Decodes a scalar value described by type from binary encoding. Decoding | |
* is thread-safe if thread-local variables are enabled. Decoding is also | |
* reentrant and can be safely called from signal handlers or interrupts. | |
* | |
* @param src The buffer with the binary encoded value. Must not be NULL. | |
* @param offset The current position in the buffer. Must not be NULL. The value | |
* is advanced as decoding progresses. | |
* @param dst The target value. Must not be NULL. The target is assumed to have | |
* size type->memSize. The value is reset to zero before decoding. If | |
* decoding fails, members are deleted and the value is reset (zeroed) | |
* again. | |
* @param type The value type. Must not be NULL. | |
* @param customTypesSize The number of non-standard datatypes contained in the | |
* customTypes array. | |
* @param customTypes An array of non-standard datatypes (not included in | |
* UA_TYPES). Can be NULL if customTypesSize is zero. | |
* @return Returns a statuscode whether decoding succeeded. */ | |
UA_StatusCode | |
UA_decodeBinary(const UA_ByteString *src, size_t *offset, void *dst, | |
const UA_DataType *type, const UA_DataTypeArray *customTypes) | |
UA_FUNC_ATTR_WARN_UNUSED_RESULT; | |
/* Returns the number of bytes the value p takes in binary encoding. Returns | |
* zero if an error occurs. UA_calcSizeBinary is thread-safe and reentrant since | |
* it does not access global (thread-local) variables. */ | |
size_t | |
UA_calcSizeBinary(const void *p, const UA_DataType *type); | |
const UA_DataType * | |
UA_findDataTypeByBinary(const UA_NodeId *typeId); | |
_UA_END_DECLS | |
/*********************************** amalgamated original file "E:/Librarys/open62541/build32/src_generated/open62541/types_generated_encoding_binary.h" ***********************************/ | |
/* Generated from Opc.Ua.Types.bsd with script E:/Librarys/open62541/tools/generate_datatypes.py | |
* on host DESKTOP-GDCIE62 by user guoxi at 2019-12-20 06:20:38 */ | |
#ifdef UA_ENABLE_AMALGAMATION | |
#else | |
#endif | |
/* Boolean */ | |
static UA_INLINE size_t | |
UA_Boolean_calcSizeBinary(const UA_Boolean *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_BOOLEAN]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_Boolean_encodeBinary(const UA_Boolean *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BOOLEAN], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_Boolean_decodeBinary(const UA_ByteString *src, size_t *offset, UA_Boolean *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BOOLEAN], NULL); | |
} | |
/* SByte */ | |
static UA_INLINE size_t | |
UA_SByte_calcSizeBinary(const UA_SByte *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_SBYTE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_SByte_encodeBinary(const UA_SByte *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SBYTE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_SByte_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SByte *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SBYTE], NULL); | |
} | |
/* Byte */ | |
static UA_INLINE size_t | |
UA_Byte_calcSizeBinary(const UA_Byte *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_BYTE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_Byte_encodeBinary(const UA_Byte *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BYTE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_Byte_decodeBinary(const UA_ByteString *src, size_t *offset, UA_Byte *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BYTE], NULL); | |
} | |
/* Int16 */ | |
static UA_INLINE size_t | |
UA_Int16_calcSizeBinary(const UA_Int16 *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_INT16]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_Int16_encodeBinary(const UA_Int16 *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_INT16], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_Int16_decodeBinary(const UA_ByteString *src, size_t *offset, UA_Int16 *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_INT16], NULL); | |
} | |
/* UInt16 */ | |
static UA_INLINE size_t | |
UA_UInt16_calcSizeBinary(const UA_UInt16 *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_UINT16]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_UInt16_encodeBinary(const UA_UInt16 *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_UINT16], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_UInt16_decodeBinary(const UA_ByteString *src, size_t *offset, UA_UInt16 *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_UINT16], NULL); | |
} | |
/* Int32 */ | |
static UA_INLINE size_t | |
UA_Int32_calcSizeBinary(const UA_Int32 *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_INT32]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_Int32_encodeBinary(const UA_Int32 *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_INT32], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_Int32_decodeBinary(const UA_ByteString *src, size_t *offset, UA_Int32 *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_INT32], NULL); | |
} | |
/* UInt32 */ | |
static UA_INLINE size_t | |
UA_UInt32_calcSizeBinary(const UA_UInt32 *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_UINT32]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_UInt32_encodeBinary(const UA_UInt32 *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_UINT32], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_UInt32_decodeBinary(const UA_ByteString *src, size_t *offset, UA_UInt32 *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_UINT32], NULL); | |
} | |
/* Int64 */ | |
static UA_INLINE size_t | |
UA_Int64_calcSizeBinary(const UA_Int64 *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_INT64]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_Int64_encodeBinary(const UA_Int64 *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_INT64], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_Int64_decodeBinary(const UA_ByteString *src, size_t *offset, UA_Int64 *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_INT64], NULL); | |
} | |
/* UInt64 */ | |
static UA_INLINE size_t | |
UA_UInt64_calcSizeBinary(const UA_UInt64 *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_UINT64]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_UInt64_encodeBinary(const UA_UInt64 *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_UINT64], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_UInt64_decodeBinary(const UA_ByteString *src, size_t *offset, UA_UInt64 *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_UINT64], NULL); | |
} | |
/* Float */ | |
static UA_INLINE size_t | |
UA_Float_calcSizeBinary(const UA_Float *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_FLOAT]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_Float_encodeBinary(const UA_Float *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_FLOAT], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_Float_decodeBinary(const UA_ByteString *src, size_t *offset, UA_Float *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_FLOAT], NULL); | |
} | |
/* Double */ | |
static UA_INLINE size_t | |
UA_Double_calcSizeBinary(const UA_Double *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DOUBLE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_Double_encodeBinary(const UA_Double *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DOUBLE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_Double_decodeBinary(const UA_ByteString *src, size_t *offset, UA_Double *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DOUBLE], NULL); | |
} | |
/* String */ | |
static UA_INLINE size_t | |
UA_String_calcSizeBinary(const UA_String *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_STRING]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_String_encodeBinary(const UA_String *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_STRING], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_String_decodeBinary(const UA_ByteString *src, size_t *offset, UA_String *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_STRING], NULL); | |
} | |
/* DateTime */ | |
static UA_INLINE size_t | |
UA_DateTime_calcSizeBinary(const UA_DateTime *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DATETIME]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_DateTime_encodeBinary(const UA_DateTime *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DATETIME], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_DateTime_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DateTime *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DATETIME], NULL); | |
} | |
/* Guid */ | |
static UA_INLINE size_t | |
UA_Guid_calcSizeBinary(const UA_Guid *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_GUID]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_Guid_encodeBinary(const UA_Guid *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_GUID], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_Guid_decodeBinary(const UA_ByteString *src, size_t *offset, UA_Guid *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_GUID], NULL); | |
} | |
/* ByteString */ | |
static UA_INLINE size_t | |
UA_ByteString_calcSizeBinary(const UA_ByteString *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_BYTESTRING]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ByteString_encodeBinary(const UA_ByteString *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BYTESTRING], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ByteString_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ByteString *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BYTESTRING], NULL); | |
} | |
/* XmlElement */ | |
static UA_INLINE size_t | |
UA_XmlElement_calcSizeBinary(const UA_XmlElement *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_XMLELEMENT]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_XmlElement_encodeBinary(const UA_XmlElement *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_XMLELEMENT], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_XmlElement_decodeBinary(const UA_ByteString *src, size_t *offset, UA_XmlElement *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_XMLELEMENT], NULL); | |
} | |
/* NodeId */ | |
static UA_INLINE size_t | |
UA_NodeId_calcSizeBinary(const UA_NodeId *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_NODEID]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_NodeId_encodeBinary(const UA_NodeId *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_NODEID], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_NodeId_decodeBinary(const UA_ByteString *src, size_t *offset, UA_NodeId *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_NODEID], NULL); | |
} | |
/* ExpandedNodeId */ | |
static UA_INLINE size_t | |
UA_ExpandedNodeId_calcSizeBinary(const UA_ExpandedNodeId *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ExpandedNodeId_encodeBinary(const UA_ExpandedNodeId *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_EXPANDEDNODEID], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ExpandedNodeId_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ExpandedNodeId *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_EXPANDEDNODEID], NULL); | |
} | |
/* StatusCode */ | |
static UA_INLINE size_t | |
UA_StatusCode_calcSizeBinary(const UA_StatusCode *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_STATUSCODE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_StatusCode_encodeBinary(const UA_StatusCode *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_STATUSCODE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_StatusCode_decodeBinary(const UA_ByteString *src, size_t *offset, UA_StatusCode *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_STATUSCODE], NULL); | |
} | |
/* QualifiedName */ | |
static UA_INLINE size_t | |
UA_QualifiedName_calcSizeBinary(const UA_QualifiedName *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_QUALIFIEDNAME]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_QualifiedName_encodeBinary(const UA_QualifiedName *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_QUALIFIEDNAME], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_QualifiedName_decodeBinary(const UA_ByteString *src, size_t *offset, UA_QualifiedName *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_QUALIFIEDNAME], NULL); | |
} | |
/* LocalizedText */ | |
static UA_INLINE size_t | |
UA_LocalizedText_calcSizeBinary(const UA_LocalizedText *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_LocalizedText_encodeBinary(const UA_LocalizedText *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_LocalizedText_decodeBinary(const UA_ByteString *src, size_t *offset, UA_LocalizedText *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT], NULL); | |
} | |
/* ExtensionObject */ | |
static UA_INLINE size_t | |
UA_ExtensionObject_calcSizeBinary(const UA_ExtensionObject *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ExtensionObject_encodeBinary(const UA_ExtensionObject *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ExtensionObject_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ExtensionObject *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT], NULL); | |
} | |
/* DataValue */ | |
static UA_INLINE size_t | |
UA_DataValue_calcSizeBinary(const UA_DataValue *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DATAVALUE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_DataValue_encodeBinary(const UA_DataValue *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DATAVALUE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_DataValue_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DataValue *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DATAVALUE], NULL); | |
} | |
/* Variant */ | |
static UA_INLINE size_t | |
UA_Variant_calcSizeBinary(const UA_Variant *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_VARIANT]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_Variant_encodeBinary(const UA_Variant *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_VARIANT], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_Variant_decodeBinary(const UA_ByteString *src, size_t *offset, UA_Variant *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_VARIANT], NULL); | |
} | |
/* DiagnosticInfo */ | |
static UA_INLINE size_t | |
UA_DiagnosticInfo_calcSizeBinary(const UA_DiagnosticInfo *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DIAGNOSTICINFO]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_DiagnosticInfo_encodeBinary(const UA_DiagnosticInfo *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DIAGNOSTICINFO], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_DiagnosticInfo_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DiagnosticInfo *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DIAGNOSTICINFO], NULL); | |
} | |
/* NodeClass */ | |
static UA_INLINE size_t | |
UA_NodeClass_calcSizeBinary(const UA_NodeClass *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_NODECLASS]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_NodeClass_encodeBinary(const UA_NodeClass *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_NODECLASS], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_NodeClass_decodeBinary(const UA_ByteString *src, size_t *offset, UA_NodeClass *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_NODECLASS], NULL); | |
} | |
/* StructureType */ | |
static UA_INLINE size_t | |
UA_StructureType_calcSizeBinary(const UA_StructureType *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_STRUCTURETYPE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_StructureType_encodeBinary(const UA_StructureType *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_STRUCTURETYPE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_StructureType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_StructureType *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_STRUCTURETYPE], NULL); | |
} | |
/* StructureField */ | |
static UA_INLINE size_t | |
UA_StructureField_calcSizeBinary(const UA_StructureField *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_STRUCTUREFIELD]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_StructureField_encodeBinary(const UA_StructureField *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_STRUCTUREFIELD], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_StructureField_decodeBinary(const UA_ByteString *src, size_t *offset, UA_StructureField *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_STRUCTUREFIELD], NULL); | |
} | |
/* StructureDefinition */ | |
static UA_INLINE size_t | |
UA_StructureDefinition_calcSizeBinary(const UA_StructureDefinition *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_STRUCTUREDEFINITION]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_StructureDefinition_encodeBinary(const UA_StructureDefinition *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_STRUCTUREDEFINITION], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_StructureDefinition_decodeBinary(const UA_ByteString *src, size_t *offset, UA_StructureDefinition *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_STRUCTUREDEFINITION], NULL); | |
} | |
/* Argument */ | |
static UA_INLINE size_t | |
UA_Argument_calcSizeBinary(const UA_Argument *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_ARGUMENT]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_Argument_encodeBinary(const UA_Argument *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ARGUMENT], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_Argument_decodeBinary(const UA_ByteString *src, size_t *offset, UA_Argument *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ARGUMENT], NULL); | |
} | |
/* EnumValueType */ | |
static UA_INLINE size_t | |
UA_EnumValueType_calcSizeBinary(const UA_EnumValueType *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_ENUMVALUETYPE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_EnumValueType_encodeBinary(const UA_EnumValueType *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ENUMVALUETYPE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_EnumValueType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_EnumValueType *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ENUMVALUETYPE], NULL); | |
} | |
/* EnumField */ | |
static UA_INLINE size_t | |
UA_EnumField_calcSizeBinary(const UA_EnumField *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_ENUMFIELD]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_EnumField_encodeBinary(const UA_EnumField *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ENUMFIELD], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_EnumField_decodeBinary(const UA_ByteString *src, size_t *offset, UA_EnumField *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ENUMFIELD], NULL); | |
} | |
/* Duration */ | |
static UA_INLINE size_t | |
UA_Duration_calcSizeBinary(const UA_Duration *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DURATION]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_Duration_encodeBinary(const UA_Duration *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DURATION], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_Duration_decodeBinary(const UA_ByteString *src, size_t *offset, UA_Duration *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DURATION], NULL); | |
} | |
/* UtcTime */ | |
static UA_INLINE size_t | |
UA_UtcTime_calcSizeBinary(const UA_UtcTime *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_UTCTIME]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_UtcTime_encodeBinary(const UA_UtcTime *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_UTCTIME], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_UtcTime_decodeBinary(const UA_ByteString *src, size_t *offset, UA_UtcTime *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_UTCTIME], NULL); | |
} | |
/* LocaleId */ | |
static UA_INLINE size_t | |
UA_LocaleId_calcSizeBinary(const UA_LocaleId *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_LOCALEID]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_LocaleId_encodeBinary(const UA_LocaleId *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_LOCALEID], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_LocaleId_decodeBinary(const UA_ByteString *src, size_t *offset, UA_LocaleId *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_LOCALEID], NULL); | |
} | |
/* ApplicationType */ | |
static UA_INLINE size_t | |
UA_ApplicationType_calcSizeBinary(const UA_ApplicationType *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_APPLICATIONTYPE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ApplicationType_encodeBinary(const UA_ApplicationType *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_APPLICATIONTYPE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ApplicationType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ApplicationType *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_APPLICATIONTYPE], NULL); | |
} | |
/* ApplicationDescription */ | |
static UA_INLINE size_t | |
UA_ApplicationDescription_calcSizeBinary(const UA_ApplicationDescription *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_APPLICATIONDESCRIPTION]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ApplicationDescription_encodeBinary(const UA_ApplicationDescription *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_APPLICATIONDESCRIPTION], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ApplicationDescription_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ApplicationDescription *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_APPLICATIONDESCRIPTION], NULL); | |
} | |
/* RequestHeader */ | |
static UA_INLINE size_t | |
UA_RequestHeader_calcSizeBinary(const UA_RequestHeader *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_REQUESTHEADER]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_RequestHeader_encodeBinary(const UA_RequestHeader *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_REQUESTHEADER], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_RequestHeader_decodeBinary(const UA_ByteString *src, size_t *offset, UA_RequestHeader *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_REQUESTHEADER], NULL); | |
} | |
/* ResponseHeader */ | |
static UA_INLINE size_t | |
UA_ResponseHeader_calcSizeBinary(const UA_ResponseHeader *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_RESPONSEHEADER]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ResponseHeader_encodeBinary(const UA_ResponseHeader *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_RESPONSEHEADER], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ResponseHeader_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ResponseHeader *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_RESPONSEHEADER], NULL); | |
} | |
/* ServiceFault */ | |
static UA_INLINE size_t | |
UA_ServiceFault_calcSizeBinary(const UA_ServiceFault *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_SERVICEFAULT]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ServiceFault_encodeBinary(const UA_ServiceFault *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SERVICEFAULT], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ServiceFault_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ServiceFault *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SERVICEFAULT], NULL); | |
} | |
/* FindServersRequest */ | |
static UA_INLINE size_t | |
UA_FindServersRequest_calcSizeBinary(const UA_FindServersRequest *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_FINDSERVERSREQUEST]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_FindServersRequest_encodeBinary(const UA_FindServersRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_FINDSERVERSREQUEST], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_FindServersRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_FindServersRequest *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_FINDSERVERSREQUEST], NULL); | |
} | |
/* FindServersResponse */ | |
static UA_INLINE size_t | |
UA_FindServersResponse_calcSizeBinary(const UA_FindServersResponse *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_FINDSERVERSRESPONSE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_FindServersResponse_encodeBinary(const UA_FindServersResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_FINDSERVERSRESPONSE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_FindServersResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_FindServersResponse *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_FINDSERVERSRESPONSE], NULL); | |
} | |
/* ServerOnNetwork */ | |
static UA_INLINE size_t | |
UA_ServerOnNetwork_calcSizeBinary(const UA_ServerOnNetwork *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_SERVERONNETWORK]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ServerOnNetwork_encodeBinary(const UA_ServerOnNetwork *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SERVERONNETWORK], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ServerOnNetwork_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ServerOnNetwork *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SERVERONNETWORK], NULL); | |
} | |
/* FindServersOnNetworkRequest */ | |
static UA_INLINE size_t | |
UA_FindServersOnNetworkRequest_calcSizeBinary(const UA_FindServersOnNetworkRequest *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKREQUEST]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_FindServersOnNetworkRequest_encodeBinary(const UA_FindServersOnNetworkRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKREQUEST], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_FindServersOnNetworkRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_FindServersOnNetworkRequest *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKREQUEST], NULL); | |
} | |
/* FindServersOnNetworkResponse */ | |
static UA_INLINE size_t | |
UA_FindServersOnNetworkResponse_calcSizeBinary(const UA_FindServersOnNetworkResponse *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKRESPONSE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_FindServersOnNetworkResponse_encodeBinary(const UA_FindServersOnNetworkResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKRESPONSE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_FindServersOnNetworkResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_FindServersOnNetworkResponse *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKRESPONSE], NULL); | |
} | |
/* MessageSecurityMode */ | |
static UA_INLINE size_t | |
UA_MessageSecurityMode_calcSizeBinary(const UA_MessageSecurityMode *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_MESSAGESECURITYMODE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_MessageSecurityMode_encodeBinary(const UA_MessageSecurityMode *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_MESSAGESECURITYMODE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_MessageSecurityMode_decodeBinary(const UA_ByteString *src, size_t *offset, UA_MessageSecurityMode *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_MESSAGESECURITYMODE], NULL); | |
} | |
/* UserTokenType */ | |
static UA_INLINE size_t | |
UA_UserTokenType_calcSizeBinary(const UA_UserTokenType *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_USERTOKENTYPE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_UserTokenType_encodeBinary(const UA_UserTokenType *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_USERTOKENTYPE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_UserTokenType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_UserTokenType *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_USERTOKENTYPE], NULL); | |
} | |
/* UserTokenPolicy */ | |
static UA_INLINE size_t | |
UA_UserTokenPolicy_calcSizeBinary(const UA_UserTokenPolicy *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_USERTOKENPOLICY]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_UserTokenPolicy_encodeBinary(const UA_UserTokenPolicy *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_USERTOKENPOLICY], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_UserTokenPolicy_decodeBinary(const UA_ByteString *src, size_t *offset, UA_UserTokenPolicy *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_USERTOKENPOLICY], NULL); | |
} | |
/* EndpointDescription */ | |
static UA_INLINE size_t | |
UA_EndpointDescription_calcSizeBinary(const UA_EndpointDescription *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_EndpointDescription_encodeBinary(const UA_EndpointDescription *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_EndpointDescription_decodeBinary(const UA_ByteString *src, size_t *offset, UA_EndpointDescription *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION], NULL); | |
} | |
/* GetEndpointsRequest */ | |
static UA_INLINE size_t | |
UA_GetEndpointsRequest_calcSizeBinary(const UA_GetEndpointsRequest *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_GETENDPOINTSREQUEST]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_GetEndpointsRequest_encodeBinary(const UA_GetEndpointsRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_GETENDPOINTSREQUEST], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_GetEndpointsRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_GetEndpointsRequest *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_GETENDPOINTSREQUEST], NULL); | |
} | |
/* GetEndpointsResponse */ | |
static UA_INLINE size_t | |
UA_GetEndpointsResponse_calcSizeBinary(const UA_GetEndpointsResponse *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_GETENDPOINTSRESPONSE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_GetEndpointsResponse_encodeBinary(const UA_GetEndpointsResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_GETENDPOINTSRESPONSE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_GetEndpointsResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_GetEndpointsResponse *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_GETENDPOINTSRESPONSE], NULL); | |
} | |
/* RegisteredServer */ | |
static UA_INLINE size_t | |
UA_RegisteredServer_calcSizeBinary(const UA_RegisteredServer *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_REGISTEREDSERVER]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_RegisteredServer_encodeBinary(const UA_RegisteredServer *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_REGISTEREDSERVER], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_RegisteredServer_decodeBinary(const UA_ByteString *src, size_t *offset, UA_RegisteredServer *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_REGISTEREDSERVER], NULL); | |
} | |
/* RegisterServerRequest */ | |
static UA_INLINE size_t | |
UA_RegisterServerRequest_calcSizeBinary(const UA_RegisterServerRequest *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_REGISTERSERVERREQUEST]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_RegisterServerRequest_encodeBinary(const UA_RegisterServerRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_REGISTERSERVERREQUEST], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_RegisterServerRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_RegisterServerRequest *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_REGISTERSERVERREQUEST], NULL); | |
} | |
/* RegisterServerResponse */ | |
static UA_INLINE size_t | |
UA_RegisterServerResponse_calcSizeBinary(const UA_RegisterServerResponse *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_REGISTERSERVERRESPONSE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_RegisterServerResponse_encodeBinary(const UA_RegisterServerResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_REGISTERSERVERRESPONSE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_RegisterServerResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_RegisterServerResponse *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_REGISTERSERVERRESPONSE], NULL); | |
} | |
/* DiscoveryConfiguration */ | |
static UA_INLINE size_t | |
UA_DiscoveryConfiguration_calcSizeBinary(const UA_DiscoveryConfiguration *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DISCOVERYCONFIGURATION]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_DiscoveryConfiguration_encodeBinary(const UA_DiscoveryConfiguration *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DISCOVERYCONFIGURATION], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_DiscoveryConfiguration_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DiscoveryConfiguration *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DISCOVERYCONFIGURATION], NULL); | |
} | |
/* MdnsDiscoveryConfiguration */ | |
static UA_INLINE size_t | |
UA_MdnsDiscoveryConfiguration_calcSizeBinary(const UA_MdnsDiscoveryConfiguration *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_MDNSDISCOVERYCONFIGURATION]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_MdnsDiscoveryConfiguration_encodeBinary(const UA_MdnsDiscoveryConfiguration *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_MDNSDISCOVERYCONFIGURATION], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_MdnsDiscoveryConfiguration_decodeBinary(const UA_ByteString *src, size_t *offset, UA_MdnsDiscoveryConfiguration *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_MDNSDISCOVERYCONFIGURATION], NULL); | |
} | |
/* RegisterServer2Request */ | |
static UA_INLINE size_t | |
UA_RegisterServer2Request_calcSizeBinary(const UA_RegisterServer2Request *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_REGISTERSERVER2REQUEST]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_RegisterServer2Request_encodeBinary(const UA_RegisterServer2Request *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_REGISTERSERVER2REQUEST], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_RegisterServer2Request_decodeBinary(const UA_ByteString *src, size_t *offset, UA_RegisterServer2Request *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_REGISTERSERVER2REQUEST], NULL); | |
} | |
/* RegisterServer2Response */ | |
static UA_INLINE size_t | |
UA_RegisterServer2Response_calcSizeBinary(const UA_RegisterServer2Response *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_REGISTERSERVER2RESPONSE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_RegisterServer2Response_encodeBinary(const UA_RegisterServer2Response *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_REGISTERSERVER2RESPONSE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_RegisterServer2Response_decodeBinary(const UA_ByteString *src, size_t *offset, UA_RegisterServer2Response *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_REGISTERSERVER2RESPONSE], NULL); | |
} | |
/* SecurityTokenRequestType */ | |
static UA_INLINE size_t | |
UA_SecurityTokenRequestType_calcSizeBinary(const UA_SecurityTokenRequestType *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_SECURITYTOKENREQUESTTYPE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_SecurityTokenRequestType_encodeBinary(const UA_SecurityTokenRequestType *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SECURITYTOKENREQUESTTYPE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_SecurityTokenRequestType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SecurityTokenRequestType *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SECURITYTOKENREQUESTTYPE], NULL); | |
} | |
/* ChannelSecurityToken */ | |
static UA_INLINE size_t | |
UA_ChannelSecurityToken_calcSizeBinary(const UA_ChannelSecurityToken *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_CHANNELSECURITYTOKEN]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ChannelSecurityToken_encodeBinary(const UA_ChannelSecurityToken *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CHANNELSECURITYTOKEN], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ChannelSecurityToken_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ChannelSecurityToken *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CHANNELSECURITYTOKEN], NULL); | |
} | |
/* OpenSecureChannelRequest */ | |
static UA_INLINE size_t | |
UA_OpenSecureChannelRequest_calcSizeBinary(const UA_OpenSecureChannelRequest *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_OPENSECURECHANNELREQUEST]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_OpenSecureChannelRequest_encodeBinary(const UA_OpenSecureChannelRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_OPENSECURECHANNELREQUEST], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_OpenSecureChannelRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_OpenSecureChannelRequest *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_OPENSECURECHANNELREQUEST], NULL); | |
} | |
/* OpenSecureChannelResponse */ | |
static UA_INLINE size_t | |
UA_OpenSecureChannelResponse_calcSizeBinary(const UA_OpenSecureChannelResponse *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_OpenSecureChannelResponse_encodeBinary(const UA_OpenSecureChannelResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_OpenSecureChannelResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_OpenSecureChannelResponse *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE], NULL); | |
} | |
/* CloseSecureChannelRequest */ | |
static UA_INLINE size_t | |
UA_CloseSecureChannelRequest_calcSizeBinary(const UA_CloseSecureChannelRequest *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_CLOSESECURECHANNELREQUEST]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_CloseSecureChannelRequest_encodeBinary(const UA_CloseSecureChannelRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CLOSESECURECHANNELREQUEST], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_CloseSecureChannelRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_CloseSecureChannelRequest *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CLOSESECURECHANNELREQUEST], NULL); | |
} | |
/* CloseSecureChannelResponse */ | |
static UA_INLINE size_t | |
UA_CloseSecureChannelResponse_calcSizeBinary(const UA_CloseSecureChannelResponse *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_CLOSESECURECHANNELRESPONSE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_CloseSecureChannelResponse_encodeBinary(const UA_CloseSecureChannelResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CLOSESECURECHANNELRESPONSE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_CloseSecureChannelResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_CloseSecureChannelResponse *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CLOSESECURECHANNELRESPONSE], NULL); | |
} | |
/* SignedSoftwareCertificate */ | |
static UA_INLINE size_t | |
UA_SignedSoftwareCertificate_calcSizeBinary(const UA_SignedSoftwareCertificate *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_SIGNEDSOFTWARECERTIFICATE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_SignedSoftwareCertificate_encodeBinary(const UA_SignedSoftwareCertificate *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SIGNEDSOFTWARECERTIFICATE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_SignedSoftwareCertificate_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SignedSoftwareCertificate *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SIGNEDSOFTWARECERTIFICATE], NULL); | |
} | |
/* SignatureData */ | |
static UA_INLINE size_t | |
UA_SignatureData_calcSizeBinary(const UA_SignatureData *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_SIGNATUREDATA]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_SignatureData_encodeBinary(const UA_SignatureData *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SIGNATUREDATA], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_SignatureData_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SignatureData *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SIGNATUREDATA], NULL); | |
} | |
/* CreateSessionRequest */ | |
static UA_INLINE size_t | |
UA_CreateSessionRequest_calcSizeBinary(const UA_CreateSessionRequest *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_CREATESESSIONREQUEST]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_CreateSessionRequest_encodeBinary(const UA_CreateSessionRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CREATESESSIONREQUEST], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_CreateSessionRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_CreateSessionRequest *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CREATESESSIONREQUEST], NULL); | |
} | |
/* CreateSessionResponse */ | |
static UA_INLINE size_t | |
UA_CreateSessionResponse_calcSizeBinary(const UA_CreateSessionResponse *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_CREATESESSIONRESPONSE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_CreateSessionResponse_encodeBinary(const UA_CreateSessionResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CREATESESSIONRESPONSE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_CreateSessionResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_CreateSessionResponse *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CREATESESSIONRESPONSE], NULL); | |
} | |
/* UserIdentityToken */ | |
static UA_INLINE size_t | |
UA_UserIdentityToken_calcSizeBinary(const UA_UserIdentityToken *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_USERIDENTITYTOKEN]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_UserIdentityToken_encodeBinary(const UA_UserIdentityToken *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_USERIDENTITYTOKEN], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_UserIdentityToken_decodeBinary(const UA_ByteString *src, size_t *offset, UA_UserIdentityToken *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_USERIDENTITYTOKEN], NULL); | |
} | |
/* AnonymousIdentityToken */ | |
static UA_INLINE size_t | |
UA_AnonymousIdentityToken_calcSizeBinary(const UA_AnonymousIdentityToken *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_ANONYMOUSIDENTITYTOKEN]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_AnonymousIdentityToken_encodeBinary(const UA_AnonymousIdentityToken *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ANONYMOUSIDENTITYTOKEN], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_AnonymousIdentityToken_decodeBinary(const UA_ByteString *src, size_t *offset, UA_AnonymousIdentityToken *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ANONYMOUSIDENTITYTOKEN], NULL); | |
} | |
/* UserNameIdentityToken */ | |
static UA_INLINE size_t | |
UA_UserNameIdentityToken_calcSizeBinary(const UA_UserNameIdentityToken *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_USERNAMEIDENTITYTOKEN]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_UserNameIdentityToken_encodeBinary(const UA_UserNameIdentityToken *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_USERNAMEIDENTITYTOKEN], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_UserNameIdentityToken_decodeBinary(const UA_ByteString *src, size_t *offset, UA_UserNameIdentityToken *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_USERNAMEIDENTITYTOKEN], NULL); | |
} | |
/* X509IdentityToken */ | |
static UA_INLINE size_t | |
UA_X509IdentityToken_calcSizeBinary(const UA_X509IdentityToken *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_X509IDENTITYTOKEN]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_X509IdentityToken_encodeBinary(const UA_X509IdentityToken *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_X509IDENTITYTOKEN], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_X509IdentityToken_decodeBinary(const UA_ByteString *src, size_t *offset, UA_X509IdentityToken *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_X509IDENTITYTOKEN], NULL); | |
} | |
/* IssuedIdentityToken */ | |
static UA_INLINE size_t | |
UA_IssuedIdentityToken_calcSizeBinary(const UA_IssuedIdentityToken *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_ISSUEDIDENTITYTOKEN]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_IssuedIdentityToken_encodeBinary(const UA_IssuedIdentityToken *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ISSUEDIDENTITYTOKEN], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_IssuedIdentityToken_decodeBinary(const UA_ByteString *src, size_t *offset, UA_IssuedIdentityToken *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ISSUEDIDENTITYTOKEN], NULL); | |
} | |
/* ActivateSessionRequest */ | |
static UA_INLINE size_t | |
UA_ActivateSessionRequest_calcSizeBinary(const UA_ActivateSessionRequest *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_ACTIVATESESSIONREQUEST]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ActivateSessionRequest_encodeBinary(const UA_ActivateSessionRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ACTIVATESESSIONREQUEST], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ActivateSessionRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ActivateSessionRequest *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ACTIVATESESSIONREQUEST], NULL); | |
} | |
/* ActivateSessionResponse */ | |
static UA_INLINE size_t | |
UA_ActivateSessionResponse_calcSizeBinary(const UA_ActivateSessionResponse *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_ACTIVATESESSIONRESPONSE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ActivateSessionResponse_encodeBinary(const UA_ActivateSessionResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ACTIVATESESSIONRESPONSE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ActivateSessionResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ActivateSessionResponse *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ACTIVATESESSIONRESPONSE], NULL); | |
} | |
/* CloseSessionRequest */ | |
static UA_INLINE size_t | |
UA_CloseSessionRequest_calcSizeBinary(const UA_CloseSessionRequest *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_CLOSESESSIONREQUEST]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_CloseSessionRequest_encodeBinary(const UA_CloseSessionRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CLOSESESSIONREQUEST], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_CloseSessionRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_CloseSessionRequest *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CLOSESESSIONREQUEST], NULL); | |
} | |
/* CloseSessionResponse */ | |
static UA_INLINE size_t | |
UA_CloseSessionResponse_calcSizeBinary(const UA_CloseSessionResponse *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_CLOSESESSIONRESPONSE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_CloseSessionResponse_encodeBinary(const UA_CloseSessionResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CLOSESESSIONRESPONSE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_CloseSessionResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_CloseSessionResponse *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CLOSESESSIONRESPONSE], NULL); | |
} | |
/* NodeAttributesMask */ | |
static UA_INLINE size_t | |
UA_NodeAttributesMask_calcSizeBinary(const UA_NodeAttributesMask *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_NODEATTRIBUTESMASK]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_NodeAttributesMask_encodeBinary(const UA_NodeAttributesMask *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_NODEATTRIBUTESMASK], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_NodeAttributesMask_decodeBinary(const UA_ByteString *src, size_t *offset, UA_NodeAttributesMask *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_NODEATTRIBUTESMASK], NULL); | |
} | |
/* NodeAttributes */ | |
static UA_INLINE size_t | |
UA_NodeAttributes_calcSizeBinary(const UA_NodeAttributes *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_NODEATTRIBUTES]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_NodeAttributes_encodeBinary(const UA_NodeAttributes *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_NODEATTRIBUTES], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_NodeAttributes_decodeBinary(const UA_ByteString *src, size_t *offset, UA_NodeAttributes *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_NODEATTRIBUTES], NULL); | |
} | |
/* ObjectAttributes */ | |
static UA_INLINE size_t | |
UA_ObjectAttributes_calcSizeBinary(const UA_ObjectAttributes *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ObjectAttributes_encodeBinary(const UA_ObjectAttributes *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ObjectAttributes_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ObjectAttributes *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES], NULL); | |
} | |
/* VariableAttributes */ | |
static UA_INLINE size_t | |
UA_VariableAttributes_calcSizeBinary(const UA_VariableAttributes *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_VariableAttributes_encodeBinary(const UA_VariableAttributes *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_VariableAttributes_decodeBinary(const UA_ByteString *src, size_t *offset, UA_VariableAttributes *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES], NULL); | |
} | |
/* MethodAttributes */ | |
static UA_INLINE size_t | |
UA_MethodAttributes_calcSizeBinary(const UA_MethodAttributes *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_METHODATTRIBUTES]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_MethodAttributes_encodeBinary(const UA_MethodAttributes *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_METHODATTRIBUTES], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_MethodAttributes_decodeBinary(const UA_ByteString *src, size_t *offset, UA_MethodAttributes *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_METHODATTRIBUTES], NULL); | |
} | |
/* ObjectTypeAttributes */ | |
static UA_INLINE size_t | |
UA_ObjectTypeAttributes_calcSizeBinary(const UA_ObjectTypeAttributes *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ObjectTypeAttributes_encodeBinary(const UA_ObjectTypeAttributes *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ObjectTypeAttributes_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ObjectTypeAttributes *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES], NULL); | |
} | |
/* VariableTypeAttributes */ | |
static UA_INLINE size_t | |
UA_VariableTypeAttributes_calcSizeBinary(const UA_VariableTypeAttributes *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_VariableTypeAttributes_encodeBinary(const UA_VariableTypeAttributes *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_VariableTypeAttributes_decodeBinary(const UA_ByteString *src, size_t *offset, UA_VariableTypeAttributes *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES], NULL); | |
} | |
/* ReferenceTypeAttributes */ | |
static UA_INLINE size_t | |
UA_ReferenceTypeAttributes_calcSizeBinary(const UA_ReferenceTypeAttributes *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ReferenceTypeAttributes_encodeBinary(const UA_ReferenceTypeAttributes *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ReferenceTypeAttributes_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ReferenceTypeAttributes *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES], NULL); | |
} | |
/* DataTypeAttributes */ | |
static UA_INLINE size_t | |
UA_DataTypeAttributes_calcSizeBinary(const UA_DataTypeAttributes *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_DataTypeAttributes_encodeBinary(const UA_DataTypeAttributes *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_DataTypeAttributes_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DataTypeAttributes *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES], NULL); | |
} | |
/* ViewAttributes */ | |
static UA_INLINE size_t | |
UA_ViewAttributes_calcSizeBinary(const UA_ViewAttributes *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_VIEWATTRIBUTES]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ViewAttributes_encodeBinary(const UA_ViewAttributes *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_VIEWATTRIBUTES], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ViewAttributes_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ViewAttributes *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_VIEWATTRIBUTES], NULL); | |
} | |
/* AddNodesItem */ | |
static UA_INLINE size_t | |
UA_AddNodesItem_calcSizeBinary(const UA_AddNodesItem *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_ADDNODESITEM]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_AddNodesItem_encodeBinary(const UA_AddNodesItem *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ADDNODESITEM], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_AddNodesItem_decodeBinary(const UA_ByteString *src, size_t *offset, UA_AddNodesItem *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ADDNODESITEM], NULL); | |
} | |
/* AddNodesResult */ | |
static UA_INLINE size_t | |
UA_AddNodesResult_calcSizeBinary(const UA_AddNodesResult *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_ADDNODESRESULT]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_AddNodesResult_encodeBinary(const UA_AddNodesResult *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ADDNODESRESULT], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_AddNodesResult_decodeBinary(const UA_ByteString *src, size_t *offset, UA_AddNodesResult *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ADDNODESRESULT], NULL); | |
} | |
/* AddNodesRequest */ | |
static UA_INLINE size_t | |
UA_AddNodesRequest_calcSizeBinary(const UA_AddNodesRequest *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_ADDNODESREQUEST]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_AddNodesRequest_encodeBinary(const UA_AddNodesRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ADDNODESREQUEST], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_AddNodesRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_AddNodesRequest *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ADDNODESREQUEST], NULL); | |
} | |
/* AddNodesResponse */ | |
static UA_INLINE size_t | |
UA_AddNodesResponse_calcSizeBinary(const UA_AddNodesResponse *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_ADDNODESRESPONSE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_AddNodesResponse_encodeBinary(const UA_AddNodesResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ADDNODESRESPONSE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_AddNodesResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_AddNodesResponse *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ADDNODESRESPONSE], NULL); | |
} | |
/* AddReferencesItem */ | |
static UA_INLINE size_t | |
UA_AddReferencesItem_calcSizeBinary(const UA_AddReferencesItem *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_ADDREFERENCESITEM]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_AddReferencesItem_encodeBinary(const UA_AddReferencesItem *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ADDREFERENCESITEM], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_AddReferencesItem_decodeBinary(const UA_ByteString *src, size_t *offset, UA_AddReferencesItem *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ADDREFERENCESITEM], NULL); | |
} | |
/* AddReferencesRequest */ | |
static UA_INLINE size_t | |
UA_AddReferencesRequest_calcSizeBinary(const UA_AddReferencesRequest *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_ADDREFERENCESREQUEST]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_AddReferencesRequest_encodeBinary(const UA_AddReferencesRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ADDREFERENCESREQUEST], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_AddReferencesRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_AddReferencesRequest *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ADDREFERENCESREQUEST], NULL); | |
} | |
/* AddReferencesResponse */ | |
static UA_INLINE size_t | |
UA_AddReferencesResponse_calcSizeBinary(const UA_AddReferencesResponse *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_ADDREFERENCESRESPONSE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_AddReferencesResponse_encodeBinary(const UA_AddReferencesResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ADDREFERENCESRESPONSE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_AddReferencesResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_AddReferencesResponse *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ADDREFERENCESRESPONSE], NULL); | |
} | |
/* DeleteNodesItem */ | |
static UA_INLINE size_t | |
UA_DeleteNodesItem_calcSizeBinary(const UA_DeleteNodesItem *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DELETENODESITEM]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_DeleteNodesItem_encodeBinary(const UA_DeleteNodesItem *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DELETENODESITEM], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_DeleteNodesItem_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DeleteNodesItem *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DELETENODESITEM], NULL); | |
} | |
/* DeleteNodesRequest */ | |
static UA_INLINE size_t | |
UA_DeleteNodesRequest_calcSizeBinary(const UA_DeleteNodesRequest *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DELETENODESREQUEST]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_DeleteNodesRequest_encodeBinary(const UA_DeleteNodesRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DELETENODESREQUEST], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_DeleteNodesRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DeleteNodesRequest *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DELETENODESREQUEST], NULL); | |
} | |
/* DeleteNodesResponse */ | |
static UA_INLINE size_t | |
UA_DeleteNodesResponse_calcSizeBinary(const UA_DeleteNodesResponse *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DELETENODESRESPONSE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_DeleteNodesResponse_encodeBinary(const UA_DeleteNodesResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DELETENODESRESPONSE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_DeleteNodesResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DeleteNodesResponse *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DELETENODESRESPONSE], NULL); | |
} | |
/* DeleteReferencesItem */ | |
static UA_INLINE size_t | |
UA_DeleteReferencesItem_calcSizeBinary(const UA_DeleteReferencesItem *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DELETEREFERENCESITEM]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_DeleteReferencesItem_encodeBinary(const UA_DeleteReferencesItem *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DELETEREFERENCESITEM], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_DeleteReferencesItem_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DeleteReferencesItem *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DELETEREFERENCESITEM], NULL); | |
} | |
/* DeleteReferencesRequest */ | |
static UA_INLINE size_t | |
UA_DeleteReferencesRequest_calcSizeBinary(const UA_DeleteReferencesRequest *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DELETEREFERENCESREQUEST]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_DeleteReferencesRequest_encodeBinary(const UA_DeleteReferencesRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DELETEREFERENCESREQUEST], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_DeleteReferencesRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DeleteReferencesRequest *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DELETEREFERENCESREQUEST], NULL); | |
} | |
/* DeleteReferencesResponse */ | |
static UA_INLINE size_t | |
UA_DeleteReferencesResponse_calcSizeBinary(const UA_DeleteReferencesResponse *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DELETEREFERENCESRESPONSE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_DeleteReferencesResponse_encodeBinary(const UA_DeleteReferencesResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DELETEREFERENCESRESPONSE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_DeleteReferencesResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DeleteReferencesResponse *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DELETEREFERENCESRESPONSE], NULL); | |
} | |
/* BrowseDirection */ | |
static UA_INLINE size_t | |
UA_BrowseDirection_calcSizeBinary(const UA_BrowseDirection *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_BROWSEDIRECTION]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_BrowseDirection_encodeBinary(const UA_BrowseDirection *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BROWSEDIRECTION], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_BrowseDirection_decodeBinary(const UA_ByteString *src, size_t *offset, UA_BrowseDirection *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BROWSEDIRECTION], NULL); | |
} | |
/* ViewDescription */ | |
static UA_INLINE size_t | |
UA_ViewDescription_calcSizeBinary(const UA_ViewDescription *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_VIEWDESCRIPTION]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ViewDescription_encodeBinary(const UA_ViewDescription *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_VIEWDESCRIPTION], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ViewDescription_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ViewDescription *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_VIEWDESCRIPTION], NULL); | |
} | |
/* BrowseDescription */ | |
static UA_INLINE size_t | |
UA_BrowseDescription_calcSizeBinary(const UA_BrowseDescription *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_BROWSEDESCRIPTION]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_BrowseDescription_encodeBinary(const UA_BrowseDescription *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BROWSEDESCRIPTION], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_BrowseDescription_decodeBinary(const UA_ByteString *src, size_t *offset, UA_BrowseDescription *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BROWSEDESCRIPTION], NULL); | |
} | |
/* BrowseResultMask */ | |
static UA_INLINE size_t | |
UA_BrowseResultMask_calcSizeBinary(const UA_BrowseResultMask *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_BROWSERESULTMASK]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_BrowseResultMask_encodeBinary(const UA_BrowseResultMask *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BROWSERESULTMASK], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_BrowseResultMask_decodeBinary(const UA_ByteString *src, size_t *offset, UA_BrowseResultMask *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BROWSERESULTMASK], NULL); | |
} | |
/* ReferenceDescription */ | |
static UA_INLINE size_t | |
UA_ReferenceDescription_calcSizeBinary(const UA_ReferenceDescription *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_REFERENCEDESCRIPTION]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ReferenceDescription_encodeBinary(const UA_ReferenceDescription *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_REFERENCEDESCRIPTION], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ReferenceDescription_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ReferenceDescription *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_REFERENCEDESCRIPTION], NULL); | |
} | |
/* BrowseResult */ | |
static UA_INLINE size_t | |
UA_BrowseResult_calcSizeBinary(const UA_BrowseResult *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_BROWSERESULT]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_BrowseResult_encodeBinary(const UA_BrowseResult *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BROWSERESULT], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_BrowseResult_decodeBinary(const UA_ByteString *src, size_t *offset, UA_BrowseResult *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BROWSERESULT], NULL); | |
} | |
/* BrowseRequest */ | |
static UA_INLINE size_t | |
UA_BrowseRequest_calcSizeBinary(const UA_BrowseRequest *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_BROWSEREQUEST]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_BrowseRequest_encodeBinary(const UA_BrowseRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BROWSEREQUEST], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_BrowseRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_BrowseRequest *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BROWSEREQUEST], NULL); | |
} | |
/* BrowseResponse */ | |
static UA_INLINE size_t | |
UA_BrowseResponse_calcSizeBinary(const UA_BrowseResponse *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_BROWSERESPONSE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_BrowseResponse_encodeBinary(const UA_BrowseResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BROWSERESPONSE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_BrowseResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_BrowseResponse *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BROWSERESPONSE], NULL); | |
} | |
/* BrowseNextRequest */ | |
static UA_INLINE size_t | |
UA_BrowseNextRequest_calcSizeBinary(const UA_BrowseNextRequest *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_BROWSENEXTREQUEST]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_BrowseNextRequest_encodeBinary(const UA_BrowseNextRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BROWSENEXTREQUEST], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_BrowseNextRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_BrowseNextRequest *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BROWSENEXTREQUEST], NULL); | |
} | |
/* BrowseNextResponse */ | |
static UA_INLINE size_t | |
UA_BrowseNextResponse_calcSizeBinary(const UA_BrowseNextResponse *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_BROWSENEXTRESPONSE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_BrowseNextResponse_encodeBinary(const UA_BrowseNextResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BROWSENEXTRESPONSE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_BrowseNextResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_BrowseNextResponse *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BROWSENEXTRESPONSE], NULL); | |
} | |
/* RelativePathElement */ | |
static UA_INLINE size_t | |
UA_RelativePathElement_calcSizeBinary(const UA_RelativePathElement *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_RELATIVEPATHELEMENT]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_RelativePathElement_encodeBinary(const UA_RelativePathElement *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_RELATIVEPATHELEMENT], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_RelativePathElement_decodeBinary(const UA_ByteString *src, size_t *offset, UA_RelativePathElement *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_RELATIVEPATHELEMENT], NULL); | |
} | |
/* RelativePath */ | |
static UA_INLINE size_t | |
UA_RelativePath_calcSizeBinary(const UA_RelativePath *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_RELATIVEPATH]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_RelativePath_encodeBinary(const UA_RelativePath *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_RELATIVEPATH], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_RelativePath_decodeBinary(const UA_ByteString *src, size_t *offset, UA_RelativePath *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_RELATIVEPATH], NULL); | |
} | |
/* BrowsePath */ | |
static UA_INLINE size_t | |
UA_BrowsePath_calcSizeBinary(const UA_BrowsePath *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_BROWSEPATH]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_BrowsePath_encodeBinary(const UA_BrowsePath *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BROWSEPATH], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_BrowsePath_decodeBinary(const UA_ByteString *src, size_t *offset, UA_BrowsePath *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BROWSEPATH], NULL); | |
} | |
/* BrowsePathTarget */ | |
static UA_INLINE size_t | |
UA_BrowsePathTarget_calcSizeBinary(const UA_BrowsePathTarget *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_BROWSEPATHTARGET]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_BrowsePathTarget_encodeBinary(const UA_BrowsePathTarget *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BROWSEPATHTARGET], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_BrowsePathTarget_decodeBinary(const UA_ByteString *src, size_t *offset, UA_BrowsePathTarget *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BROWSEPATHTARGET], NULL); | |
} | |
/* BrowsePathResult */ | |
static UA_INLINE size_t | |
UA_BrowsePathResult_calcSizeBinary(const UA_BrowsePathResult *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_BROWSEPATHRESULT]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_BrowsePathResult_encodeBinary(const UA_BrowsePathResult *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BROWSEPATHRESULT], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_BrowsePathResult_decodeBinary(const UA_ByteString *src, size_t *offset, UA_BrowsePathResult *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BROWSEPATHRESULT], NULL); | |
} | |
/* TranslateBrowsePathsToNodeIdsRequest */ | |
static UA_INLINE size_t | |
UA_TranslateBrowsePathsToNodeIdsRequest_calcSizeBinary(const UA_TranslateBrowsePathsToNodeIdsRequest *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSREQUEST]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_TranslateBrowsePathsToNodeIdsRequest_encodeBinary(const UA_TranslateBrowsePathsToNodeIdsRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSREQUEST], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_TranslateBrowsePathsToNodeIdsRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_TranslateBrowsePathsToNodeIdsRequest *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSREQUEST], NULL); | |
} | |
/* TranslateBrowsePathsToNodeIdsResponse */ | |
static UA_INLINE size_t | |
UA_TranslateBrowsePathsToNodeIdsResponse_calcSizeBinary(const UA_TranslateBrowsePathsToNodeIdsResponse *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSRESPONSE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_TranslateBrowsePathsToNodeIdsResponse_encodeBinary(const UA_TranslateBrowsePathsToNodeIdsResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSRESPONSE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_TranslateBrowsePathsToNodeIdsResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_TranslateBrowsePathsToNodeIdsResponse *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSRESPONSE], NULL); | |
} | |
/* RegisterNodesRequest */ | |
static UA_INLINE size_t | |
UA_RegisterNodesRequest_calcSizeBinary(const UA_RegisterNodesRequest *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_REGISTERNODESREQUEST]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_RegisterNodesRequest_encodeBinary(const UA_RegisterNodesRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_REGISTERNODESREQUEST], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_RegisterNodesRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_RegisterNodesRequest *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_REGISTERNODESREQUEST], NULL); | |
} | |
/* RegisterNodesResponse */ | |
static UA_INLINE size_t | |
UA_RegisterNodesResponse_calcSizeBinary(const UA_RegisterNodesResponse *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_REGISTERNODESRESPONSE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_RegisterNodesResponse_encodeBinary(const UA_RegisterNodesResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_REGISTERNODESRESPONSE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_RegisterNodesResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_RegisterNodesResponse *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_REGISTERNODESRESPONSE], NULL); | |
} | |
/* UnregisterNodesRequest */ | |
static UA_INLINE size_t | |
UA_UnregisterNodesRequest_calcSizeBinary(const UA_UnregisterNodesRequest *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_UNREGISTERNODESREQUEST]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_UnregisterNodesRequest_encodeBinary(const UA_UnregisterNodesRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_UNREGISTERNODESREQUEST], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_UnregisterNodesRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_UnregisterNodesRequest *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_UNREGISTERNODESREQUEST], NULL); | |
} | |
/* UnregisterNodesResponse */ | |
static UA_INLINE size_t | |
UA_UnregisterNodesResponse_calcSizeBinary(const UA_UnregisterNodesResponse *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_UNREGISTERNODESRESPONSE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_UnregisterNodesResponse_encodeBinary(const UA_UnregisterNodesResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_UNREGISTERNODESRESPONSE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_UnregisterNodesResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_UnregisterNodesResponse *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_UNREGISTERNODESRESPONSE], NULL); | |
} | |
/* FilterOperator */ | |
static UA_INLINE size_t | |
UA_FilterOperator_calcSizeBinary(const UA_FilterOperator *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_FILTEROPERATOR]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_FilterOperator_encodeBinary(const UA_FilterOperator *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_FILTEROPERATOR], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_FilterOperator_decodeBinary(const UA_ByteString *src, size_t *offset, UA_FilterOperator *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_FILTEROPERATOR], NULL); | |
} | |
/* ContentFilterElement */ | |
static UA_INLINE size_t | |
UA_ContentFilterElement_calcSizeBinary(const UA_ContentFilterElement *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_CONTENTFILTERELEMENT]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ContentFilterElement_encodeBinary(const UA_ContentFilterElement *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CONTENTFILTERELEMENT], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ContentFilterElement_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ContentFilterElement *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CONTENTFILTERELEMENT], NULL); | |
} | |
/* ContentFilter */ | |
static UA_INLINE size_t | |
UA_ContentFilter_calcSizeBinary(const UA_ContentFilter *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_CONTENTFILTER]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ContentFilter_encodeBinary(const UA_ContentFilter *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CONTENTFILTER], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ContentFilter_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ContentFilter *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CONTENTFILTER], NULL); | |
} | |
/* FilterOperand */ | |
static UA_INLINE size_t | |
UA_FilterOperand_calcSizeBinary(const UA_FilterOperand *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_FILTEROPERAND]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_FilterOperand_encodeBinary(const UA_FilterOperand *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_FILTEROPERAND], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_FilterOperand_decodeBinary(const UA_ByteString *src, size_t *offset, UA_FilterOperand *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_FILTEROPERAND], NULL); | |
} | |
/* ElementOperand */ | |
static UA_INLINE size_t | |
UA_ElementOperand_calcSizeBinary(const UA_ElementOperand *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_ELEMENTOPERAND]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ElementOperand_encodeBinary(const UA_ElementOperand *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ELEMENTOPERAND], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ElementOperand_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ElementOperand *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ELEMENTOPERAND], NULL); | |
} | |
/* LiteralOperand */ | |
static UA_INLINE size_t | |
UA_LiteralOperand_calcSizeBinary(const UA_LiteralOperand *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_LITERALOPERAND]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_LiteralOperand_encodeBinary(const UA_LiteralOperand *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_LITERALOPERAND], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_LiteralOperand_decodeBinary(const UA_ByteString *src, size_t *offset, UA_LiteralOperand *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_LITERALOPERAND], NULL); | |
} | |
/* AttributeOperand */ | |
static UA_INLINE size_t | |
UA_AttributeOperand_calcSizeBinary(const UA_AttributeOperand *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_ATTRIBUTEOPERAND]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_AttributeOperand_encodeBinary(const UA_AttributeOperand *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ATTRIBUTEOPERAND], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_AttributeOperand_decodeBinary(const UA_ByteString *src, size_t *offset, UA_AttributeOperand *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ATTRIBUTEOPERAND], NULL); | |
} | |
/* SimpleAttributeOperand */ | |
static UA_INLINE size_t | |
UA_SimpleAttributeOperand_calcSizeBinary(const UA_SimpleAttributeOperand *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_SIMPLEATTRIBUTEOPERAND]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_SimpleAttributeOperand_encodeBinary(const UA_SimpleAttributeOperand *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SIMPLEATTRIBUTEOPERAND], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_SimpleAttributeOperand_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SimpleAttributeOperand *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SIMPLEATTRIBUTEOPERAND], NULL); | |
} | |
/* ContentFilterElementResult */ | |
static UA_INLINE size_t | |
UA_ContentFilterElementResult_calcSizeBinary(const UA_ContentFilterElementResult *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_CONTENTFILTERELEMENTRESULT]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ContentFilterElementResult_encodeBinary(const UA_ContentFilterElementResult *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CONTENTFILTERELEMENTRESULT], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ContentFilterElementResult_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ContentFilterElementResult *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CONTENTFILTERELEMENTRESULT], NULL); | |
} | |
/* ContentFilterResult */ | |
static UA_INLINE size_t | |
UA_ContentFilterResult_calcSizeBinary(const UA_ContentFilterResult *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_CONTENTFILTERRESULT]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ContentFilterResult_encodeBinary(const UA_ContentFilterResult *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CONTENTFILTERRESULT], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ContentFilterResult_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ContentFilterResult *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CONTENTFILTERRESULT], NULL); | |
} | |
/* TimestampsToReturn */ | |
static UA_INLINE size_t | |
UA_TimestampsToReturn_calcSizeBinary(const UA_TimestampsToReturn *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_TIMESTAMPSTORETURN]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_TimestampsToReturn_encodeBinary(const UA_TimestampsToReturn *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_TIMESTAMPSTORETURN], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_TimestampsToReturn_decodeBinary(const UA_ByteString *src, size_t *offset, UA_TimestampsToReturn *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_TIMESTAMPSTORETURN], NULL); | |
} | |
/* ReadValueId */ | |
static UA_INLINE size_t | |
UA_ReadValueId_calcSizeBinary(const UA_ReadValueId *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_READVALUEID]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ReadValueId_encodeBinary(const UA_ReadValueId *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_READVALUEID], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ReadValueId_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ReadValueId *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_READVALUEID], NULL); | |
} | |
/* ReadRequest */ | |
static UA_INLINE size_t | |
UA_ReadRequest_calcSizeBinary(const UA_ReadRequest *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_READREQUEST]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ReadRequest_encodeBinary(const UA_ReadRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_READREQUEST], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ReadRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ReadRequest *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_READREQUEST], NULL); | |
} | |
/* ReadResponse */ | |
static UA_INLINE size_t | |
UA_ReadResponse_calcSizeBinary(const UA_ReadResponse *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_READRESPONSE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ReadResponse_encodeBinary(const UA_ReadResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_READRESPONSE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ReadResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ReadResponse *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_READRESPONSE], NULL); | |
} | |
/* WriteValue */ | |
static UA_INLINE size_t | |
UA_WriteValue_calcSizeBinary(const UA_WriteValue *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_WRITEVALUE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_WriteValue_encodeBinary(const UA_WriteValue *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_WRITEVALUE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_WriteValue_decodeBinary(const UA_ByteString *src, size_t *offset, UA_WriteValue *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_WRITEVALUE], NULL); | |
} | |
/* WriteRequest */ | |
static UA_INLINE size_t | |
UA_WriteRequest_calcSizeBinary(const UA_WriteRequest *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_WRITEREQUEST]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_WriteRequest_encodeBinary(const UA_WriteRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_WRITEREQUEST], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_WriteRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_WriteRequest *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_WRITEREQUEST], NULL); | |
} | |
/* WriteResponse */ | |
static UA_INLINE size_t | |
UA_WriteResponse_calcSizeBinary(const UA_WriteResponse *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_WRITERESPONSE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_WriteResponse_encodeBinary(const UA_WriteResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_WRITERESPONSE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_WriteResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_WriteResponse *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_WRITERESPONSE], NULL); | |
} | |
/* CallMethodRequest */ | |
static UA_INLINE size_t | |
UA_CallMethodRequest_calcSizeBinary(const UA_CallMethodRequest *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_CALLMETHODREQUEST]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_CallMethodRequest_encodeBinary(const UA_CallMethodRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CALLMETHODREQUEST], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_CallMethodRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_CallMethodRequest *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CALLMETHODREQUEST], NULL); | |
} | |
/* CallMethodResult */ | |
static UA_INLINE size_t | |
UA_CallMethodResult_calcSizeBinary(const UA_CallMethodResult *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_CALLMETHODRESULT]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_CallMethodResult_encodeBinary(const UA_CallMethodResult *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CALLMETHODRESULT], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_CallMethodResult_decodeBinary(const UA_ByteString *src, size_t *offset, UA_CallMethodResult *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CALLMETHODRESULT], NULL); | |
} | |
/* CallRequest */ | |
static UA_INLINE size_t | |
UA_CallRequest_calcSizeBinary(const UA_CallRequest *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_CALLREQUEST]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_CallRequest_encodeBinary(const UA_CallRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CALLREQUEST], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_CallRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_CallRequest *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CALLREQUEST], NULL); | |
} | |
/* CallResponse */ | |
static UA_INLINE size_t | |
UA_CallResponse_calcSizeBinary(const UA_CallResponse *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_CALLRESPONSE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_CallResponse_encodeBinary(const UA_CallResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CALLRESPONSE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_CallResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_CallResponse *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CALLRESPONSE], NULL); | |
} | |
/* MonitoringMode */ | |
static UA_INLINE size_t | |
UA_MonitoringMode_calcSizeBinary(const UA_MonitoringMode *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_MONITORINGMODE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_MonitoringMode_encodeBinary(const UA_MonitoringMode *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_MONITORINGMODE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_MonitoringMode_decodeBinary(const UA_ByteString *src, size_t *offset, UA_MonitoringMode *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_MONITORINGMODE], NULL); | |
} | |
/* DataChangeTrigger */ | |
static UA_INLINE size_t | |
UA_DataChangeTrigger_calcSizeBinary(const UA_DataChangeTrigger *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DATACHANGETRIGGER]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_DataChangeTrigger_encodeBinary(const UA_DataChangeTrigger *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DATACHANGETRIGGER], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_DataChangeTrigger_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DataChangeTrigger *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DATACHANGETRIGGER], NULL); | |
} | |
/* DeadbandType */ | |
static UA_INLINE size_t | |
UA_DeadbandType_calcSizeBinary(const UA_DeadbandType *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DEADBANDTYPE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_DeadbandType_encodeBinary(const UA_DeadbandType *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DEADBANDTYPE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_DeadbandType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DeadbandType *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DEADBANDTYPE], NULL); | |
} | |
/* DataChangeFilter */ | |
static UA_INLINE size_t | |
UA_DataChangeFilter_calcSizeBinary(const UA_DataChangeFilter *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DATACHANGEFILTER]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_DataChangeFilter_encodeBinary(const UA_DataChangeFilter *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DATACHANGEFILTER], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_DataChangeFilter_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DataChangeFilter *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DATACHANGEFILTER], NULL); | |
} | |
/* EventFilter */ | |
static UA_INLINE size_t | |
UA_EventFilter_calcSizeBinary(const UA_EventFilter *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_EVENTFILTER]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_EventFilter_encodeBinary(const UA_EventFilter *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_EVENTFILTER], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_EventFilter_decodeBinary(const UA_ByteString *src, size_t *offset, UA_EventFilter *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_EVENTFILTER], NULL); | |
} | |
/* AggregateConfiguration */ | |
static UA_INLINE size_t | |
UA_AggregateConfiguration_calcSizeBinary(const UA_AggregateConfiguration *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_AGGREGATECONFIGURATION]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_AggregateConfiguration_encodeBinary(const UA_AggregateConfiguration *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_AGGREGATECONFIGURATION], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_AggregateConfiguration_decodeBinary(const UA_ByteString *src, size_t *offset, UA_AggregateConfiguration *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_AGGREGATECONFIGURATION], NULL); | |
} | |
/* AggregateFilter */ | |
static UA_INLINE size_t | |
UA_AggregateFilter_calcSizeBinary(const UA_AggregateFilter *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_AGGREGATEFILTER]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_AggregateFilter_encodeBinary(const UA_AggregateFilter *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_AGGREGATEFILTER], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_AggregateFilter_decodeBinary(const UA_ByteString *src, size_t *offset, UA_AggregateFilter *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_AGGREGATEFILTER], NULL); | |
} | |
/* EventFilterResult */ | |
static UA_INLINE size_t | |
UA_EventFilterResult_calcSizeBinary(const UA_EventFilterResult *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_EVENTFILTERRESULT]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_EventFilterResult_encodeBinary(const UA_EventFilterResult *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_EVENTFILTERRESULT], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_EventFilterResult_decodeBinary(const UA_ByteString *src, size_t *offset, UA_EventFilterResult *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_EVENTFILTERRESULT], NULL); | |
} | |
/* MonitoringParameters */ | |
static UA_INLINE size_t | |
UA_MonitoringParameters_calcSizeBinary(const UA_MonitoringParameters *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_MONITORINGPARAMETERS]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_MonitoringParameters_encodeBinary(const UA_MonitoringParameters *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_MONITORINGPARAMETERS], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_MonitoringParameters_decodeBinary(const UA_ByteString *src, size_t *offset, UA_MonitoringParameters *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_MONITORINGPARAMETERS], NULL); | |
} | |
/* MonitoredItemCreateRequest */ | |
static UA_INLINE size_t | |
UA_MonitoredItemCreateRequest_calcSizeBinary(const UA_MonitoredItemCreateRequest *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_MONITOREDITEMCREATEREQUEST]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_MonitoredItemCreateRequest_encodeBinary(const UA_MonitoredItemCreateRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_MONITOREDITEMCREATEREQUEST], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_MonitoredItemCreateRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_MonitoredItemCreateRequest *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_MONITOREDITEMCREATEREQUEST], NULL); | |
} | |
/* MonitoredItemCreateResult */ | |
static UA_INLINE size_t | |
UA_MonitoredItemCreateResult_calcSizeBinary(const UA_MonitoredItemCreateResult *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_MONITOREDITEMCREATERESULT]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_MonitoredItemCreateResult_encodeBinary(const UA_MonitoredItemCreateResult *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_MONITOREDITEMCREATERESULT], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_MonitoredItemCreateResult_decodeBinary(const UA_ByteString *src, size_t *offset, UA_MonitoredItemCreateResult *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_MONITOREDITEMCREATERESULT], NULL); | |
} | |
/* CreateMonitoredItemsRequest */ | |
static UA_INLINE size_t | |
UA_CreateMonitoredItemsRequest_calcSizeBinary(const UA_CreateMonitoredItemsRequest *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSREQUEST]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_CreateMonitoredItemsRequest_encodeBinary(const UA_CreateMonitoredItemsRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSREQUEST], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_CreateMonitoredItemsRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_CreateMonitoredItemsRequest *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSREQUEST], NULL); | |
} | |
/* CreateMonitoredItemsResponse */ | |
static UA_INLINE size_t | |
UA_CreateMonitoredItemsResponse_calcSizeBinary(const UA_CreateMonitoredItemsResponse *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSRESPONSE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_CreateMonitoredItemsResponse_encodeBinary(const UA_CreateMonitoredItemsResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSRESPONSE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_CreateMonitoredItemsResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_CreateMonitoredItemsResponse *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CREATEMONITOREDITEMSRESPONSE], NULL); | |
} | |
/* MonitoredItemModifyRequest */ | |
static UA_INLINE size_t | |
UA_MonitoredItemModifyRequest_calcSizeBinary(const UA_MonitoredItemModifyRequest *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_MONITOREDITEMMODIFYREQUEST]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_MonitoredItemModifyRequest_encodeBinary(const UA_MonitoredItemModifyRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_MONITOREDITEMMODIFYREQUEST], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_MonitoredItemModifyRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_MonitoredItemModifyRequest *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_MONITOREDITEMMODIFYREQUEST], NULL); | |
} | |
/* MonitoredItemModifyResult */ | |
static UA_INLINE size_t | |
UA_MonitoredItemModifyResult_calcSizeBinary(const UA_MonitoredItemModifyResult *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_MONITOREDITEMMODIFYRESULT]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_MonitoredItemModifyResult_encodeBinary(const UA_MonitoredItemModifyResult *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_MONITOREDITEMMODIFYRESULT], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_MonitoredItemModifyResult_decodeBinary(const UA_ByteString *src, size_t *offset, UA_MonitoredItemModifyResult *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_MONITOREDITEMMODIFYRESULT], NULL); | |
} | |
/* ModifyMonitoredItemsRequest */ | |
static UA_INLINE size_t | |
UA_ModifyMonitoredItemsRequest_calcSizeBinary(const UA_ModifyMonitoredItemsRequest *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSREQUEST]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ModifyMonitoredItemsRequest_encodeBinary(const UA_ModifyMonitoredItemsRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSREQUEST], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ModifyMonitoredItemsRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ModifyMonitoredItemsRequest *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSREQUEST], NULL); | |
} | |
/* ModifyMonitoredItemsResponse */ | |
static UA_INLINE size_t | |
UA_ModifyMonitoredItemsResponse_calcSizeBinary(const UA_ModifyMonitoredItemsResponse *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSRESPONSE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ModifyMonitoredItemsResponse_encodeBinary(const UA_ModifyMonitoredItemsResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSRESPONSE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ModifyMonitoredItemsResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ModifyMonitoredItemsResponse *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSRESPONSE], NULL); | |
} | |
/* SetMonitoringModeRequest */ | |
static UA_INLINE size_t | |
UA_SetMonitoringModeRequest_calcSizeBinary(const UA_SetMonitoringModeRequest *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_SETMONITORINGMODEREQUEST]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_SetMonitoringModeRequest_encodeBinary(const UA_SetMonitoringModeRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SETMONITORINGMODEREQUEST], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_SetMonitoringModeRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SetMonitoringModeRequest *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SETMONITORINGMODEREQUEST], NULL); | |
} | |
/* SetMonitoringModeResponse */ | |
static UA_INLINE size_t | |
UA_SetMonitoringModeResponse_calcSizeBinary(const UA_SetMonitoringModeResponse *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_SETMONITORINGMODERESPONSE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_SetMonitoringModeResponse_encodeBinary(const UA_SetMonitoringModeResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SETMONITORINGMODERESPONSE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_SetMonitoringModeResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SetMonitoringModeResponse *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SETMONITORINGMODERESPONSE], NULL); | |
} | |
/* SetTriggeringRequest */ | |
static UA_INLINE size_t | |
UA_SetTriggeringRequest_calcSizeBinary(const UA_SetTriggeringRequest *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_SETTRIGGERINGREQUEST]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_SetTriggeringRequest_encodeBinary(const UA_SetTriggeringRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SETTRIGGERINGREQUEST], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_SetTriggeringRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SetTriggeringRequest *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SETTRIGGERINGREQUEST], NULL); | |
} | |
/* SetTriggeringResponse */ | |
static UA_INLINE size_t | |
UA_SetTriggeringResponse_calcSizeBinary(const UA_SetTriggeringResponse *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_SETTRIGGERINGRESPONSE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_SetTriggeringResponse_encodeBinary(const UA_SetTriggeringResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SETTRIGGERINGRESPONSE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_SetTriggeringResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SetTriggeringResponse *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SETTRIGGERINGRESPONSE], NULL); | |
} | |
/* DeleteMonitoredItemsRequest */ | |
static UA_INLINE size_t | |
UA_DeleteMonitoredItemsRequest_calcSizeBinary(const UA_DeleteMonitoredItemsRequest *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSREQUEST]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_DeleteMonitoredItemsRequest_encodeBinary(const UA_DeleteMonitoredItemsRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSREQUEST], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_DeleteMonitoredItemsRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DeleteMonitoredItemsRequest *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSREQUEST], NULL); | |
} | |
/* DeleteMonitoredItemsResponse */ | |
static UA_INLINE size_t | |
UA_DeleteMonitoredItemsResponse_calcSizeBinary(const UA_DeleteMonitoredItemsResponse *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSRESPONSE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_DeleteMonitoredItemsResponse_encodeBinary(const UA_DeleteMonitoredItemsResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSRESPONSE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_DeleteMonitoredItemsResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DeleteMonitoredItemsResponse *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DELETEMONITOREDITEMSRESPONSE], NULL); | |
} | |
/* CreateSubscriptionRequest */ | |
static UA_INLINE size_t | |
UA_CreateSubscriptionRequest_calcSizeBinary(const UA_CreateSubscriptionRequest *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONREQUEST]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_CreateSubscriptionRequest_encodeBinary(const UA_CreateSubscriptionRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONREQUEST], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_CreateSubscriptionRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_CreateSubscriptionRequest *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONREQUEST], NULL); | |
} | |
/* CreateSubscriptionResponse */ | |
static UA_INLINE size_t | |
UA_CreateSubscriptionResponse_calcSizeBinary(const UA_CreateSubscriptionResponse *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONRESPONSE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_CreateSubscriptionResponse_encodeBinary(const UA_CreateSubscriptionResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONRESPONSE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_CreateSubscriptionResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_CreateSubscriptionResponse *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_CREATESUBSCRIPTIONRESPONSE], NULL); | |
} | |
/* ModifySubscriptionRequest */ | |
static UA_INLINE size_t | |
UA_ModifySubscriptionRequest_calcSizeBinary(const UA_ModifySubscriptionRequest *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONREQUEST]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ModifySubscriptionRequest_encodeBinary(const UA_ModifySubscriptionRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONREQUEST], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ModifySubscriptionRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ModifySubscriptionRequest *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONREQUEST], NULL); | |
} | |
/* ModifySubscriptionResponse */ | |
static UA_INLINE size_t | |
UA_ModifySubscriptionResponse_calcSizeBinary(const UA_ModifySubscriptionResponse *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONRESPONSE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ModifySubscriptionResponse_encodeBinary(const UA_ModifySubscriptionResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONRESPONSE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ModifySubscriptionResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ModifySubscriptionResponse *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_MODIFYSUBSCRIPTIONRESPONSE], NULL); | |
} | |
/* SetPublishingModeRequest */ | |
static UA_INLINE size_t | |
UA_SetPublishingModeRequest_calcSizeBinary(const UA_SetPublishingModeRequest *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_SETPUBLISHINGMODEREQUEST]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_SetPublishingModeRequest_encodeBinary(const UA_SetPublishingModeRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SETPUBLISHINGMODEREQUEST], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_SetPublishingModeRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SetPublishingModeRequest *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SETPUBLISHINGMODEREQUEST], NULL); | |
} | |
/* SetPublishingModeResponse */ | |
static UA_INLINE size_t | |
UA_SetPublishingModeResponse_calcSizeBinary(const UA_SetPublishingModeResponse *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_SETPUBLISHINGMODERESPONSE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_SetPublishingModeResponse_encodeBinary(const UA_SetPublishingModeResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SETPUBLISHINGMODERESPONSE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_SetPublishingModeResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SetPublishingModeResponse *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SETPUBLISHINGMODERESPONSE], NULL); | |
} | |
/* NotificationMessage */ | |
static UA_INLINE size_t | |
UA_NotificationMessage_calcSizeBinary(const UA_NotificationMessage *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_NOTIFICATIONMESSAGE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_NotificationMessage_encodeBinary(const UA_NotificationMessage *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_NOTIFICATIONMESSAGE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_NotificationMessage_decodeBinary(const UA_ByteString *src, size_t *offset, UA_NotificationMessage *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_NOTIFICATIONMESSAGE], NULL); | |
} | |
/* MonitoredItemNotification */ | |
static UA_INLINE size_t | |
UA_MonitoredItemNotification_calcSizeBinary(const UA_MonitoredItemNotification *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_MONITOREDITEMNOTIFICATION]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_MonitoredItemNotification_encodeBinary(const UA_MonitoredItemNotification *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_MONITOREDITEMNOTIFICATION], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_MonitoredItemNotification_decodeBinary(const UA_ByteString *src, size_t *offset, UA_MonitoredItemNotification *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_MONITOREDITEMNOTIFICATION], NULL); | |
} | |
/* EventFieldList */ | |
static UA_INLINE size_t | |
UA_EventFieldList_calcSizeBinary(const UA_EventFieldList *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_EVENTFIELDLIST]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_EventFieldList_encodeBinary(const UA_EventFieldList *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_EVENTFIELDLIST], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_EventFieldList_decodeBinary(const UA_ByteString *src, size_t *offset, UA_EventFieldList *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_EVENTFIELDLIST], NULL); | |
} | |
/* StatusChangeNotification */ | |
static UA_INLINE size_t | |
UA_StatusChangeNotification_calcSizeBinary(const UA_StatusChangeNotification *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_STATUSCHANGENOTIFICATION]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_StatusChangeNotification_encodeBinary(const UA_StatusChangeNotification *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_STATUSCHANGENOTIFICATION], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_StatusChangeNotification_decodeBinary(const UA_ByteString *src, size_t *offset, UA_StatusChangeNotification *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_STATUSCHANGENOTIFICATION], NULL); | |
} | |
/* SubscriptionAcknowledgement */ | |
static UA_INLINE size_t | |
UA_SubscriptionAcknowledgement_calcSizeBinary(const UA_SubscriptionAcknowledgement *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_SUBSCRIPTIONACKNOWLEDGEMENT]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_SubscriptionAcknowledgement_encodeBinary(const UA_SubscriptionAcknowledgement *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SUBSCRIPTIONACKNOWLEDGEMENT], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_SubscriptionAcknowledgement_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SubscriptionAcknowledgement *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SUBSCRIPTIONACKNOWLEDGEMENT], NULL); | |
} | |
/* PublishRequest */ | |
static UA_INLINE size_t | |
UA_PublishRequest_calcSizeBinary(const UA_PublishRequest *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_PUBLISHREQUEST]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_PublishRequest_encodeBinary(const UA_PublishRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_PUBLISHREQUEST], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_PublishRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_PublishRequest *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_PUBLISHREQUEST], NULL); | |
} | |
/* PublishResponse */ | |
static UA_INLINE size_t | |
UA_PublishResponse_calcSizeBinary(const UA_PublishResponse *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_PUBLISHRESPONSE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_PublishResponse_encodeBinary(const UA_PublishResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_PUBLISHRESPONSE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_PublishResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_PublishResponse *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_PUBLISHRESPONSE], NULL); | |
} | |
/* RepublishRequest */ | |
static UA_INLINE size_t | |
UA_RepublishRequest_calcSizeBinary(const UA_RepublishRequest *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_REPUBLISHREQUEST]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_RepublishRequest_encodeBinary(const UA_RepublishRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_REPUBLISHREQUEST], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_RepublishRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_RepublishRequest *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_REPUBLISHREQUEST], NULL); | |
} | |
/* RepublishResponse */ | |
static UA_INLINE size_t | |
UA_RepublishResponse_calcSizeBinary(const UA_RepublishResponse *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_REPUBLISHRESPONSE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_RepublishResponse_encodeBinary(const UA_RepublishResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_REPUBLISHRESPONSE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_RepublishResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_RepublishResponse *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_REPUBLISHRESPONSE], NULL); | |
} | |
/* DeleteSubscriptionsRequest */ | |
static UA_INLINE size_t | |
UA_DeleteSubscriptionsRequest_calcSizeBinary(const UA_DeleteSubscriptionsRequest *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSREQUEST]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_DeleteSubscriptionsRequest_encodeBinary(const UA_DeleteSubscriptionsRequest *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSREQUEST], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_DeleteSubscriptionsRequest_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DeleteSubscriptionsRequest *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSREQUEST], NULL); | |
} | |
/* DeleteSubscriptionsResponse */ | |
static UA_INLINE size_t | |
UA_DeleteSubscriptionsResponse_calcSizeBinary(const UA_DeleteSubscriptionsResponse *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSRESPONSE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_DeleteSubscriptionsResponse_encodeBinary(const UA_DeleteSubscriptionsResponse *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSRESPONSE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_DeleteSubscriptionsResponse_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DeleteSubscriptionsResponse *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DELETESUBSCRIPTIONSRESPONSE], NULL); | |
} | |
/* BuildInfo */ | |
static UA_INLINE size_t | |
UA_BuildInfo_calcSizeBinary(const UA_BuildInfo *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_BUILDINFO]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_BuildInfo_encodeBinary(const UA_BuildInfo *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_BUILDINFO], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_BuildInfo_decodeBinary(const UA_ByteString *src, size_t *offset, UA_BuildInfo *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_BUILDINFO], NULL); | |
} | |
/* RedundancySupport */ | |
static UA_INLINE size_t | |
UA_RedundancySupport_calcSizeBinary(const UA_RedundancySupport *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_REDUNDANCYSUPPORT]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_RedundancySupport_encodeBinary(const UA_RedundancySupport *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_REDUNDANCYSUPPORT], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_RedundancySupport_decodeBinary(const UA_ByteString *src, size_t *offset, UA_RedundancySupport *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_REDUNDANCYSUPPORT], NULL); | |
} | |
/* ServerState */ | |
static UA_INLINE size_t | |
UA_ServerState_calcSizeBinary(const UA_ServerState *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_SERVERSTATE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ServerState_encodeBinary(const UA_ServerState *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SERVERSTATE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ServerState_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ServerState *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SERVERSTATE], NULL); | |
} | |
/* ServerDiagnosticsSummaryDataType */ | |
static UA_INLINE size_t | |
UA_ServerDiagnosticsSummaryDataType_calcSizeBinary(const UA_ServerDiagnosticsSummaryDataType *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_SERVERDIAGNOSTICSSUMMARYDATATYPE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ServerDiagnosticsSummaryDataType_encodeBinary(const UA_ServerDiagnosticsSummaryDataType *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SERVERDIAGNOSTICSSUMMARYDATATYPE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ServerDiagnosticsSummaryDataType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ServerDiagnosticsSummaryDataType *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SERVERDIAGNOSTICSSUMMARYDATATYPE], NULL); | |
} | |
/* ServerStatusDataType */ | |
static UA_INLINE size_t | |
UA_ServerStatusDataType_calcSizeBinary(const UA_ServerStatusDataType *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_SERVERSTATUSDATATYPE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ServerStatusDataType_encodeBinary(const UA_ServerStatusDataType *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_SERVERSTATUSDATATYPE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ServerStatusDataType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ServerStatusDataType *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_SERVERSTATUSDATATYPE], NULL); | |
} | |
/* Range */ | |
static UA_INLINE size_t | |
UA_Range_calcSizeBinary(const UA_Range *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_RANGE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_Range_encodeBinary(const UA_Range *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_RANGE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_Range_decodeBinary(const UA_ByteString *src, size_t *offset, UA_Range *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_RANGE], NULL); | |
} | |
/* EUInformation */ | |
static UA_INLINE size_t | |
UA_EUInformation_calcSizeBinary(const UA_EUInformation *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_EUINFORMATION]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_EUInformation_encodeBinary(const UA_EUInformation *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_EUINFORMATION], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_EUInformation_decodeBinary(const UA_ByteString *src, size_t *offset, UA_EUInformation *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_EUINFORMATION], NULL); | |
} | |
/* AxisScaleEnumeration */ | |
static UA_INLINE size_t | |
UA_AxisScaleEnumeration_calcSizeBinary(const UA_AxisScaleEnumeration *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_AXISSCALEENUMERATION]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_AxisScaleEnumeration_encodeBinary(const UA_AxisScaleEnumeration *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_AXISSCALEENUMERATION], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_AxisScaleEnumeration_decodeBinary(const UA_ByteString *src, size_t *offset, UA_AxisScaleEnumeration *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_AXISSCALEENUMERATION], NULL); | |
} | |
/* ComplexNumberType */ | |
static UA_INLINE size_t | |
UA_ComplexNumberType_calcSizeBinary(const UA_ComplexNumberType *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_COMPLEXNUMBERTYPE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ComplexNumberType_encodeBinary(const UA_ComplexNumberType *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_COMPLEXNUMBERTYPE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ComplexNumberType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ComplexNumberType *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_COMPLEXNUMBERTYPE], NULL); | |
} | |
/* DoubleComplexNumberType */ | |
static UA_INLINE size_t | |
UA_DoubleComplexNumberType_calcSizeBinary(const UA_DoubleComplexNumberType *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DOUBLECOMPLEXNUMBERTYPE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_DoubleComplexNumberType_encodeBinary(const UA_DoubleComplexNumberType *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DOUBLECOMPLEXNUMBERTYPE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_DoubleComplexNumberType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DoubleComplexNumberType *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DOUBLECOMPLEXNUMBERTYPE], NULL); | |
} | |
/* AxisInformation */ | |
static UA_INLINE size_t | |
UA_AxisInformation_calcSizeBinary(const UA_AxisInformation *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_AXISINFORMATION]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_AxisInformation_encodeBinary(const UA_AxisInformation *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_AXISINFORMATION], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_AxisInformation_decodeBinary(const UA_ByteString *src, size_t *offset, UA_AxisInformation *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_AXISINFORMATION], NULL); | |
} | |
/* XVType */ | |
static UA_INLINE size_t | |
UA_XVType_calcSizeBinary(const UA_XVType *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_XVTYPE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_XVType_encodeBinary(const UA_XVType *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_XVTYPE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_XVType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_XVType *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_XVTYPE], NULL); | |
} | |
/* EnumDefinition */ | |
static UA_INLINE size_t | |
UA_EnumDefinition_calcSizeBinary(const UA_EnumDefinition *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_ENUMDEFINITION]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_EnumDefinition_encodeBinary(const UA_EnumDefinition *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_ENUMDEFINITION], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_EnumDefinition_decodeBinary(const UA_ByteString *src, size_t *offset, UA_EnumDefinition *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_ENUMDEFINITION], NULL); | |
} | |
/* DataChangeNotification */ | |
static UA_INLINE size_t | |
UA_DataChangeNotification_calcSizeBinary(const UA_DataChangeNotification *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_DATACHANGENOTIFICATION]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_DataChangeNotification_encodeBinary(const UA_DataChangeNotification *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_DATACHANGENOTIFICATION], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_DataChangeNotification_decodeBinary(const UA_ByteString *src, size_t *offset, UA_DataChangeNotification *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_DATACHANGENOTIFICATION], NULL); | |
} | |
/* EventNotificationList */ | |
static UA_INLINE size_t | |
UA_EventNotificationList_calcSizeBinary(const UA_EventNotificationList *src) { | |
return UA_calcSizeBinary(src, &UA_TYPES[UA_TYPES_EVENTNOTIFICATIONLIST]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_EventNotificationList_encodeBinary(const UA_EventNotificationList *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TYPES[UA_TYPES_EVENTNOTIFICATIONLIST], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_EventNotificationList_decodeBinary(const UA_ByteString *src, size_t *offset, UA_EventNotificationList *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TYPES[UA_TYPES_EVENTNOTIFICATIONLIST], NULL); | |
} | |
/*********************************** amalgamated original file "E:/Librarys/open62541/build32/src_generated/open62541/transport_generated.h" ***********************************/ | |
/* Generated from Opc.Ua.Types.bsd, Custom.Opc.Ua.Transport.bsd with script E:/Librarys/open62541/tools/generate_datatypes.py | |
* on host DESKTOP-GDCIE62 by user guoxi at 2019-12-20 06:20:38 */ | |
#ifdef UA_ENABLE_AMALGAMATION | |
#else | |
#endif | |
_UA_BEGIN_DECLS | |
/** | |
* Every type is assigned an index in an array containing the type descriptions. | |
* These descriptions are used during type handling (copying, deletion, | |
* binary encoding, ...). */ | |
#define UA_TRANSPORT_COUNT 12 | |
extern UA_EXPORT const UA_DataType UA_TRANSPORT[UA_TRANSPORT_COUNT]; | |
/** | |
* MessageType | |
* ^^^^^^^^^^^ | |
* Message Type and whether the message contains an intermediate chunk */ | |
typedef enum { | |
UA_MESSAGETYPE_ACK = 0x4B4341, | |
UA_MESSAGETYPE_HEL = 0x4C4548, | |
UA_MESSAGETYPE_MSG = 0x47534D, | |
UA_MESSAGETYPE_OPN = 0x4E504F, | |
UA_MESSAGETYPE_CLO = 0x4F4C43, | |
UA_MESSAGETYPE_ERR = 0x525245, | |
__UA_MESSAGETYPE_FORCE32BIT = 0x7fffffff | |
} UA_MessageType; | |
UA_STATIC_ASSERT(sizeof(UA_MessageType) == sizeof(UA_Int32), enum_must_be_32bit); | |
#define UA_TRANSPORT_MESSAGETYPE 0 | |
/** | |
* ChunkType | |
* ^^^^^^^^^ | |
* Type of the chunk */ | |
typedef enum { | |
UA_CHUNKTYPE_FINAL = 0x46000000, | |
UA_CHUNKTYPE_INTERMEDIATE = 0x43000000, | |
UA_CHUNKTYPE_ABORT = 0x41000000, | |
__UA_CHUNKTYPE_FORCE32BIT = 0x7fffffff | |
} UA_ChunkType; | |
UA_STATIC_ASSERT(sizeof(UA_ChunkType) == sizeof(UA_Int32), enum_must_be_32bit); | |
#define UA_TRANSPORT_CHUNKTYPE 1 | |
/** | |
* TcpMessageHeader | |
* ^^^^^^^^^^^^^^^^ | |
* TCP Header */ | |
typedef struct { | |
UA_UInt32 messageTypeAndChunkType; | |
UA_UInt32 messageSize; | |
} UA_TcpMessageHeader; | |
#define UA_TRANSPORT_TCPMESSAGEHEADER 2 | |
/** | |
* TcpHelloMessage | |
* ^^^^^^^^^^^^^^^ | |
* Hello Message */ | |
typedef struct { | |
UA_UInt32 protocolVersion; | |
UA_UInt32 receiveBufferSize; | |
UA_UInt32 sendBufferSize; | |
UA_UInt32 maxMessageSize; | |
UA_UInt32 maxChunkCount; | |
UA_String endpointUrl; | |
} UA_TcpHelloMessage; | |
#define UA_TRANSPORT_TCPHELLOMESSAGE 3 | |
/** | |
* TcpAcknowledgeMessage | |
* ^^^^^^^^^^^^^^^^^^^^^ | |
* Acknowledge Message */ | |
typedef struct { | |
UA_UInt32 protocolVersion; | |
UA_UInt32 receiveBufferSize; | |
UA_UInt32 sendBufferSize; | |
UA_UInt32 maxMessageSize; | |
UA_UInt32 maxChunkCount; | |
} UA_TcpAcknowledgeMessage; | |
#define UA_TRANSPORT_TCPACKNOWLEDGEMESSAGE 4 | |
/** | |
* TcpErrorMessage | |
* ^^^^^^^^^^^^^^^ | |
* Error Message */ | |
typedef struct { | |
UA_UInt32 error; | |
UA_String reason; | |
} UA_TcpErrorMessage; | |
#define UA_TRANSPORT_TCPERRORMESSAGE 5 | |
/** | |
* SecureConversationMessageHeader | |
* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
* Secure Layer Sequence Header */ | |
typedef struct { | |
UA_TcpMessageHeader messageHeader; | |
UA_UInt32 secureChannelId; | |
} UA_SecureConversationMessageHeader; | |
#define UA_TRANSPORT_SECURECONVERSATIONMESSAGEHEADER 6 | |
/** | |
* AsymmetricAlgorithmSecurityHeader | |
* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
* Security Header */ | |
typedef struct { | |
UA_ByteString securityPolicyUri; | |
UA_ByteString senderCertificate; | |
UA_ByteString receiverCertificateThumbprint; | |
} UA_AsymmetricAlgorithmSecurityHeader; | |
#define UA_TRANSPORT_ASYMMETRICALGORITHMSECURITYHEADER 7 | |
/** | |
* SymmetricAlgorithmSecurityHeader | |
* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
* Secure Layer Symmetric Algorithm Header */ | |
typedef struct { | |
UA_UInt32 tokenId; | |
} UA_SymmetricAlgorithmSecurityHeader; | |
#define UA_TRANSPORT_SYMMETRICALGORITHMSECURITYHEADER 8 | |
/** | |
* SequenceHeader | |
* ^^^^^^^^^^^^^^ | |
* Secure Layer Sequence Header */ | |
typedef struct { | |
UA_UInt32 sequenceNumber; | |
UA_UInt32 requestId; | |
} UA_SequenceHeader; | |
#define UA_TRANSPORT_SEQUENCEHEADER 9 | |
/** | |
* SecureConversationMessageFooter | |
* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
* Secure Conversation Message Footer */ | |
typedef struct { | |
size_t paddingSize; | |
UA_Byte *padding; | |
UA_Byte signature; | |
} UA_SecureConversationMessageFooter; | |
#define UA_TRANSPORT_SECURECONVERSATIONMESSAGEFOOTER 10 | |
/** | |
* SecureConversationMessageAbortBody | |
* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
* Secure Conversation Message Abort Body */ | |
typedef struct { | |
UA_UInt32 error; | |
UA_String reason; | |
} UA_SecureConversationMessageAbortBody; | |
#define UA_TRANSPORT_SECURECONVERSATIONMESSAGEABORTBODY 11 | |
_UA_END_DECLS | |
/*********************************** amalgamated original file "E:/Librarys/open62541/build32/src_generated/open62541/transport_generated_handling.h" ***********************************/ | |
/* Generated from Opc.Ua.Types.bsd, Custom.Opc.Ua.Transport.bsd with script E:/Librarys/open62541/tools/generate_datatypes.py | |
* on host DESKTOP-GDCIE62 by user guoxi at 2019-12-20 06:20:38 */ | |
_UA_BEGIN_DECLS | |
#if defined(__GNUC__) && __GNUC__ >= 4 && __GNUC_MINOR__ >= 6 | |
# pragma GCC diagnostic push | |
# pragma GCC diagnostic ignored "-Wmissing-field-initializers" | |
# pragma GCC diagnostic ignored "-Wmissing-braces" | |
#endif | |
/* MessageType */ | |
static UA_INLINE void | |
UA_MessageType_init(UA_MessageType *p) { | |
memset(p, 0, sizeof(UA_MessageType)); | |
} | |
static UA_INLINE UA_MessageType * | |
UA_MessageType_new(void) { | |
return (UA_MessageType*)UA_new(&UA_TRANSPORT[UA_TRANSPORT_MESSAGETYPE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_MessageType_copy(const UA_MessageType *src, UA_MessageType *dst) { | |
return UA_copy(src, dst, &UA_TRANSPORT[UA_TRANSPORT_MESSAGETYPE]); | |
} | |
static UA_INLINE void | |
UA_MessageType_deleteMembers(UA_MessageType *p) { | |
UA_clear(p, &UA_TRANSPORT[UA_TRANSPORT_MESSAGETYPE]); | |
} | |
static UA_INLINE void | |
UA_MessageType_clear(UA_MessageType *p) { | |
UA_clear(p, &UA_TRANSPORT[UA_TRANSPORT_MESSAGETYPE]); | |
} | |
static UA_INLINE void | |
UA_MessageType_delete(UA_MessageType *p) { | |
UA_delete(p, &UA_TRANSPORT[UA_TRANSPORT_MESSAGETYPE]); | |
} | |
/* ChunkType */ | |
static UA_INLINE void | |
UA_ChunkType_init(UA_ChunkType *p) { | |
memset(p, 0, sizeof(UA_ChunkType)); | |
} | |
static UA_INLINE UA_ChunkType * | |
UA_ChunkType_new(void) { | |
return (UA_ChunkType*)UA_new(&UA_TRANSPORT[UA_TRANSPORT_CHUNKTYPE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ChunkType_copy(const UA_ChunkType *src, UA_ChunkType *dst) { | |
return UA_copy(src, dst, &UA_TRANSPORT[UA_TRANSPORT_CHUNKTYPE]); | |
} | |
static UA_INLINE void | |
UA_ChunkType_deleteMembers(UA_ChunkType *p) { | |
UA_clear(p, &UA_TRANSPORT[UA_TRANSPORT_CHUNKTYPE]); | |
} | |
static UA_INLINE void | |
UA_ChunkType_clear(UA_ChunkType *p) { | |
UA_clear(p, &UA_TRANSPORT[UA_TRANSPORT_CHUNKTYPE]); | |
} | |
static UA_INLINE void | |
UA_ChunkType_delete(UA_ChunkType *p) { | |
UA_delete(p, &UA_TRANSPORT[UA_TRANSPORT_CHUNKTYPE]); | |
} | |
/* TcpMessageHeader */ | |
static UA_INLINE void | |
UA_TcpMessageHeader_init(UA_TcpMessageHeader *p) { | |
memset(p, 0, sizeof(UA_TcpMessageHeader)); | |
} | |
static UA_INLINE UA_TcpMessageHeader * | |
UA_TcpMessageHeader_new(void) { | |
return (UA_TcpMessageHeader*)UA_new(&UA_TRANSPORT[UA_TRANSPORT_TCPMESSAGEHEADER]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_TcpMessageHeader_copy(const UA_TcpMessageHeader *src, UA_TcpMessageHeader *dst) { | |
return UA_copy(src, dst, &UA_TRANSPORT[UA_TRANSPORT_TCPMESSAGEHEADER]); | |
} | |
static UA_INLINE void | |
UA_TcpMessageHeader_deleteMembers(UA_TcpMessageHeader *p) { | |
UA_clear(p, &UA_TRANSPORT[UA_TRANSPORT_TCPMESSAGEHEADER]); | |
} | |
static UA_INLINE void | |
UA_TcpMessageHeader_clear(UA_TcpMessageHeader *p) { | |
UA_clear(p, &UA_TRANSPORT[UA_TRANSPORT_TCPMESSAGEHEADER]); | |
} | |
static UA_INLINE void | |
UA_TcpMessageHeader_delete(UA_TcpMessageHeader *p) { | |
UA_delete(p, &UA_TRANSPORT[UA_TRANSPORT_TCPMESSAGEHEADER]); | |
} | |
/* TcpHelloMessage */ | |
static UA_INLINE void | |
UA_TcpHelloMessage_init(UA_TcpHelloMessage *p) { | |
memset(p, 0, sizeof(UA_TcpHelloMessage)); | |
} | |
static UA_INLINE UA_TcpHelloMessage * | |
UA_TcpHelloMessage_new(void) { | |
return (UA_TcpHelloMessage*)UA_new(&UA_TRANSPORT[UA_TRANSPORT_TCPHELLOMESSAGE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_TcpHelloMessage_copy(const UA_TcpHelloMessage *src, UA_TcpHelloMessage *dst) { | |
return UA_copy(src, dst, &UA_TRANSPORT[UA_TRANSPORT_TCPHELLOMESSAGE]); | |
} | |
static UA_INLINE void | |
UA_TcpHelloMessage_deleteMembers(UA_TcpHelloMessage *p) { | |
UA_clear(p, &UA_TRANSPORT[UA_TRANSPORT_TCPHELLOMESSAGE]); | |
} | |
static UA_INLINE void | |
UA_TcpHelloMessage_clear(UA_TcpHelloMessage *p) { | |
UA_clear(p, &UA_TRANSPORT[UA_TRANSPORT_TCPHELLOMESSAGE]); | |
} | |
static UA_INLINE void | |
UA_TcpHelloMessage_delete(UA_TcpHelloMessage *p) { | |
UA_delete(p, &UA_TRANSPORT[UA_TRANSPORT_TCPHELLOMESSAGE]); | |
} | |
/* TcpAcknowledgeMessage */ | |
static UA_INLINE void | |
UA_TcpAcknowledgeMessage_init(UA_TcpAcknowledgeMessage *p) { | |
memset(p, 0, sizeof(UA_TcpAcknowledgeMessage)); | |
} | |
static UA_INLINE UA_TcpAcknowledgeMessage * | |
UA_TcpAcknowledgeMessage_new(void) { | |
return (UA_TcpAcknowledgeMessage*)UA_new(&UA_TRANSPORT[UA_TRANSPORT_TCPACKNOWLEDGEMESSAGE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_TcpAcknowledgeMessage_copy(const UA_TcpAcknowledgeMessage *src, UA_TcpAcknowledgeMessage *dst) { | |
return UA_copy(src, dst, &UA_TRANSPORT[UA_TRANSPORT_TCPACKNOWLEDGEMESSAGE]); | |
} | |
static UA_INLINE void | |
UA_TcpAcknowledgeMessage_deleteMembers(UA_TcpAcknowledgeMessage *p) { | |
UA_clear(p, &UA_TRANSPORT[UA_TRANSPORT_TCPACKNOWLEDGEMESSAGE]); | |
} | |
static UA_INLINE void | |
UA_TcpAcknowledgeMessage_clear(UA_TcpAcknowledgeMessage *p) { | |
UA_clear(p, &UA_TRANSPORT[UA_TRANSPORT_TCPACKNOWLEDGEMESSAGE]); | |
} | |
static UA_INLINE void | |
UA_TcpAcknowledgeMessage_delete(UA_TcpAcknowledgeMessage *p) { | |
UA_delete(p, &UA_TRANSPORT[UA_TRANSPORT_TCPACKNOWLEDGEMESSAGE]); | |
} | |
/* TcpErrorMessage */ | |
static UA_INLINE void | |
UA_TcpErrorMessage_init(UA_TcpErrorMessage *p) { | |
memset(p, 0, sizeof(UA_TcpErrorMessage)); | |
} | |
static UA_INLINE UA_TcpErrorMessage * | |
UA_TcpErrorMessage_new(void) { | |
return (UA_TcpErrorMessage*)UA_new(&UA_TRANSPORT[UA_TRANSPORT_TCPERRORMESSAGE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_TcpErrorMessage_copy(const UA_TcpErrorMessage *src, UA_TcpErrorMessage *dst) { | |
return UA_copy(src, dst, &UA_TRANSPORT[UA_TRANSPORT_TCPERRORMESSAGE]); | |
} | |
static UA_INLINE void | |
UA_TcpErrorMessage_deleteMembers(UA_TcpErrorMessage *p) { | |
UA_clear(p, &UA_TRANSPORT[UA_TRANSPORT_TCPERRORMESSAGE]); | |
} | |
static UA_INLINE void | |
UA_TcpErrorMessage_clear(UA_TcpErrorMessage *p) { | |
UA_clear(p, &UA_TRANSPORT[UA_TRANSPORT_TCPERRORMESSAGE]); | |
} | |
static UA_INLINE void | |
UA_TcpErrorMessage_delete(UA_TcpErrorMessage *p) { | |
UA_delete(p, &UA_TRANSPORT[UA_TRANSPORT_TCPERRORMESSAGE]); | |
} | |
/* SecureConversationMessageHeader */ | |
static UA_INLINE void | |
UA_SecureConversationMessageHeader_init(UA_SecureConversationMessageHeader *p) { | |
memset(p, 0, sizeof(UA_SecureConversationMessageHeader)); | |
} | |
static UA_INLINE UA_SecureConversationMessageHeader * | |
UA_SecureConversationMessageHeader_new(void) { | |
return (UA_SecureConversationMessageHeader*)UA_new(&UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEHEADER]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_SecureConversationMessageHeader_copy(const UA_SecureConversationMessageHeader *src, UA_SecureConversationMessageHeader *dst) { | |
return UA_copy(src, dst, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEHEADER]); | |
} | |
static UA_INLINE void | |
UA_SecureConversationMessageHeader_deleteMembers(UA_SecureConversationMessageHeader *p) { | |
UA_clear(p, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEHEADER]); | |
} | |
static UA_INLINE void | |
UA_SecureConversationMessageHeader_clear(UA_SecureConversationMessageHeader *p) { | |
UA_clear(p, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEHEADER]); | |
} | |
static UA_INLINE void | |
UA_SecureConversationMessageHeader_delete(UA_SecureConversationMessageHeader *p) { | |
UA_delete(p, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEHEADER]); | |
} | |
/* AsymmetricAlgorithmSecurityHeader */ | |
static UA_INLINE void | |
UA_AsymmetricAlgorithmSecurityHeader_init(UA_AsymmetricAlgorithmSecurityHeader *p) { | |
memset(p, 0, sizeof(UA_AsymmetricAlgorithmSecurityHeader)); | |
} | |
static UA_INLINE UA_AsymmetricAlgorithmSecurityHeader * | |
UA_AsymmetricAlgorithmSecurityHeader_new(void) { | |
return (UA_AsymmetricAlgorithmSecurityHeader*)UA_new(&UA_TRANSPORT[UA_TRANSPORT_ASYMMETRICALGORITHMSECURITYHEADER]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_AsymmetricAlgorithmSecurityHeader_copy(const UA_AsymmetricAlgorithmSecurityHeader *src, UA_AsymmetricAlgorithmSecurityHeader *dst) { | |
return UA_copy(src, dst, &UA_TRANSPORT[UA_TRANSPORT_ASYMMETRICALGORITHMSECURITYHEADER]); | |
} | |
static UA_INLINE void | |
UA_AsymmetricAlgorithmSecurityHeader_deleteMembers(UA_AsymmetricAlgorithmSecurityHeader *p) { | |
UA_clear(p, &UA_TRANSPORT[UA_TRANSPORT_ASYMMETRICALGORITHMSECURITYHEADER]); | |
} | |
static UA_INLINE void | |
UA_AsymmetricAlgorithmSecurityHeader_clear(UA_AsymmetricAlgorithmSecurityHeader *p) { | |
UA_clear(p, &UA_TRANSPORT[UA_TRANSPORT_ASYMMETRICALGORITHMSECURITYHEADER]); | |
} | |
static UA_INLINE void | |
UA_AsymmetricAlgorithmSecurityHeader_delete(UA_AsymmetricAlgorithmSecurityHeader *p) { | |
UA_delete(p, &UA_TRANSPORT[UA_TRANSPORT_ASYMMETRICALGORITHMSECURITYHEADER]); | |
} | |
/* SymmetricAlgorithmSecurityHeader */ | |
static UA_INLINE void | |
UA_SymmetricAlgorithmSecurityHeader_init(UA_SymmetricAlgorithmSecurityHeader *p) { | |
memset(p, 0, sizeof(UA_SymmetricAlgorithmSecurityHeader)); | |
} | |
static UA_INLINE UA_SymmetricAlgorithmSecurityHeader * | |
UA_SymmetricAlgorithmSecurityHeader_new(void) { | |
return (UA_SymmetricAlgorithmSecurityHeader*)UA_new(&UA_TRANSPORT[UA_TRANSPORT_SYMMETRICALGORITHMSECURITYHEADER]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_SymmetricAlgorithmSecurityHeader_copy(const UA_SymmetricAlgorithmSecurityHeader *src, UA_SymmetricAlgorithmSecurityHeader *dst) { | |
return UA_copy(src, dst, &UA_TRANSPORT[UA_TRANSPORT_SYMMETRICALGORITHMSECURITYHEADER]); | |
} | |
static UA_INLINE void | |
UA_SymmetricAlgorithmSecurityHeader_deleteMembers(UA_SymmetricAlgorithmSecurityHeader *p) { | |
UA_clear(p, &UA_TRANSPORT[UA_TRANSPORT_SYMMETRICALGORITHMSECURITYHEADER]); | |
} | |
static UA_INLINE void | |
UA_SymmetricAlgorithmSecurityHeader_clear(UA_SymmetricAlgorithmSecurityHeader *p) { | |
UA_clear(p, &UA_TRANSPORT[UA_TRANSPORT_SYMMETRICALGORITHMSECURITYHEADER]); | |
} | |
static UA_INLINE void | |
UA_SymmetricAlgorithmSecurityHeader_delete(UA_SymmetricAlgorithmSecurityHeader *p) { | |
UA_delete(p, &UA_TRANSPORT[UA_TRANSPORT_SYMMETRICALGORITHMSECURITYHEADER]); | |
} | |
/* SequenceHeader */ | |
static UA_INLINE void | |
UA_SequenceHeader_init(UA_SequenceHeader *p) { | |
memset(p, 0, sizeof(UA_SequenceHeader)); | |
} | |
static UA_INLINE UA_SequenceHeader * | |
UA_SequenceHeader_new(void) { | |
return (UA_SequenceHeader*)UA_new(&UA_TRANSPORT[UA_TRANSPORT_SEQUENCEHEADER]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_SequenceHeader_copy(const UA_SequenceHeader *src, UA_SequenceHeader *dst) { | |
return UA_copy(src, dst, &UA_TRANSPORT[UA_TRANSPORT_SEQUENCEHEADER]); | |
} | |
static UA_INLINE void | |
UA_SequenceHeader_deleteMembers(UA_SequenceHeader *p) { | |
UA_clear(p, &UA_TRANSPORT[UA_TRANSPORT_SEQUENCEHEADER]); | |
} | |
static UA_INLINE void | |
UA_SequenceHeader_clear(UA_SequenceHeader *p) { | |
UA_clear(p, &UA_TRANSPORT[UA_TRANSPORT_SEQUENCEHEADER]); | |
} | |
static UA_INLINE void | |
UA_SequenceHeader_delete(UA_SequenceHeader *p) { | |
UA_delete(p, &UA_TRANSPORT[UA_TRANSPORT_SEQUENCEHEADER]); | |
} | |
/* SecureConversationMessageFooter */ | |
static UA_INLINE void | |
UA_SecureConversationMessageFooter_init(UA_SecureConversationMessageFooter *p) { | |
memset(p, 0, sizeof(UA_SecureConversationMessageFooter)); | |
} | |
static UA_INLINE UA_SecureConversationMessageFooter * | |
UA_SecureConversationMessageFooter_new(void) { | |
return (UA_SecureConversationMessageFooter*)UA_new(&UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEFOOTER]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_SecureConversationMessageFooter_copy(const UA_SecureConversationMessageFooter *src, UA_SecureConversationMessageFooter *dst) { | |
return UA_copy(src, dst, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEFOOTER]); | |
} | |
static UA_INLINE void | |
UA_SecureConversationMessageFooter_deleteMembers(UA_SecureConversationMessageFooter *p) { | |
UA_clear(p, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEFOOTER]); | |
} | |
static UA_INLINE void | |
UA_SecureConversationMessageFooter_clear(UA_SecureConversationMessageFooter *p) { | |
UA_clear(p, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEFOOTER]); | |
} | |
static UA_INLINE void | |
UA_SecureConversationMessageFooter_delete(UA_SecureConversationMessageFooter *p) { | |
UA_delete(p, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEFOOTER]); | |
} | |
/* SecureConversationMessageAbortBody */ | |
static UA_INLINE void | |
UA_SecureConversationMessageAbortBody_init(UA_SecureConversationMessageAbortBody *p) { | |
memset(p, 0, sizeof(UA_SecureConversationMessageAbortBody)); | |
} | |
static UA_INLINE UA_SecureConversationMessageAbortBody * | |
UA_SecureConversationMessageAbortBody_new(void) { | |
return (UA_SecureConversationMessageAbortBody*)UA_new(&UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEABORTBODY]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_SecureConversationMessageAbortBody_copy(const UA_SecureConversationMessageAbortBody *src, UA_SecureConversationMessageAbortBody *dst) { | |
return UA_copy(src, dst, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEABORTBODY]); | |
} | |
static UA_INLINE void | |
UA_SecureConversationMessageAbortBody_deleteMembers(UA_SecureConversationMessageAbortBody *p) { | |
UA_clear(p, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEABORTBODY]); | |
} | |
static UA_INLINE void | |
UA_SecureConversationMessageAbortBody_clear(UA_SecureConversationMessageAbortBody *p) { | |
UA_clear(p, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEABORTBODY]); | |
} | |
static UA_INLINE void | |
UA_SecureConversationMessageAbortBody_delete(UA_SecureConversationMessageAbortBody *p) { | |
UA_delete(p, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEABORTBODY]); | |
} | |
#if defined(__GNUC__) && __GNUC__ >= 4 && __GNUC_MINOR__ >= 6 | |
# pragma GCC diagnostic pop | |
#endif | |
_UA_END_DECLS | |
/*********************************** amalgamated original file "E:/Librarys/open62541/build32/src_generated/open62541/transport_generated_encoding_binary.h" ***********************************/ | |
/* Generated from Opc.Ua.Types.bsd, Custom.Opc.Ua.Transport.bsd with script E:/Librarys/open62541/tools/generate_datatypes.py | |
* on host DESKTOP-GDCIE62 by user guoxi at 2019-12-20 06:20:38 */ | |
#ifdef UA_ENABLE_AMALGAMATION | |
#else | |
#endif | |
/* MessageType */ | |
static UA_INLINE size_t | |
UA_MessageType_calcSizeBinary(const UA_MessageType *src) { | |
return UA_calcSizeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_MESSAGETYPE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_MessageType_encodeBinary(const UA_MessageType *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_MESSAGETYPE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_MessageType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_MessageType *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TRANSPORT[UA_TRANSPORT_MESSAGETYPE], NULL); | |
} | |
/* ChunkType */ | |
static UA_INLINE size_t | |
UA_ChunkType_calcSizeBinary(const UA_ChunkType *src) { | |
return UA_calcSizeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_CHUNKTYPE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ChunkType_encodeBinary(const UA_ChunkType *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_CHUNKTYPE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_ChunkType_decodeBinary(const UA_ByteString *src, size_t *offset, UA_ChunkType *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TRANSPORT[UA_TRANSPORT_CHUNKTYPE], NULL); | |
} | |
/* TcpMessageHeader */ | |
static UA_INLINE size_t | |
UA_TcpMessageHeader_calcSizeBinary(const UA_TcpMessageHeader *src) { | |
return UA_calcSizeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_TCPMESSAGEHEADER]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_TcpMessageHeader_encodeBinary(const UA_TcpMessageHeader *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_TCPMESSAGEHEADER], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_TcpMessageHeader_decodeBinary(const UA_ByteString *src, size_t *offset, UA_TcpMessageHeader *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TRANSPORT[UA_TRANSPORT_TCPMESSAGEHEADER], NULL); | |
} | |
/* TcpHelloMessage */ | |
static UA_INLINE size_t | |
UA_TcpHelloMessage_calcSizeBinary(const UA_TcpHelloMessage *src) { | |
return UA_calcSizeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_TCPHELLOMESSAGE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_TcpHelloMessage_encodeBinary(const UA_TcpHelloMessage *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_TCPHELLOMESSAGE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_TcpHelloMessage_decodeBinary(const UA_ByteString *src, size_t *offset, UA_TcpHelloMessage *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TRANSPORT[UA_TRANSPORT_TCPHELLOMESSAGE], NULL); | |
} | |
/* TcpAcknowledgeMessage */ | |
static UA_INLINE size_t | |
UA_TcpAcknowledgeMessage_calcSizeBinary(const UA_TcpAcknowledgeMessage *src) { | |
return UA_calcSizeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_TCPACKNOWLEDGEMESSAGE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_TcpAcknowledgeMessage_encodeBinary(const UA_TcpAcknowledgeMessage *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_TCPACKNOWLEDGEMESSAGE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_TcpAcknowledgeMessage_decodeBinary(const UA_ByteString *src, size_t *offset, UA_TcpAcknowledgeMessage *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TRANSPORT[UA_TRANSPORT_TCPACKNOWLEDGEMESSAGE], NULL); | |
} | |
/* TcpErrorMessage */ | |
static UA_INLINE size_t | |
UA_TcpErrorMessage_calcSizeBinary(const UA_TcpErrorMessage *src) { | |
return UA_calcSizeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_TCPERRORMESSAGE]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_TcpErrorMessage_encodeBinary(const UA_TcpErrorMessage *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_TCPERRORMESSAGE], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_TcpErrorMessage_decodeBinary(const UA_ByteString *src, size_t *offset, UA_TcpErrorMessage *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TRANSPORT[UA_TRANSPORT_TCPERRORMESSAGE], NULL); | |
} | |
/* SecureConversationMessageHeader */ | |
static UA_INLINE size_t | |
UA_SecureConversationMessageHeader_calcSizeBinary(const UA_SecureConversationMessageHeader *src) { | |
return UA_calcSizeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEHEADER]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_SecureConversationMessageHeader_encodeBinary(const UA_SecureConversationMessageHeader *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEHEADER], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_SecureConversationMessageHeader_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SecureConversationMessageHeader *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEHEADER], NULL); | |
} | |
/* AsymmetricAlgorithmSecurityHeader */ | |
static UA_INLINE size_t | |
UA_AsymmetricAlgorithmSecurityHeader_calcSizeBinary(const UA_AsymmetricAlgorithmSecurityHeader *src) { | |
return UA_calcSizeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_ASYMMETRICALGORITHMSECURITYHEADER]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_AsymmetricAlgorithmSecurityHeader_encodeBinary(const UA_AsymmetricAlgorithmSecurityHeader *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_ASYMMETRICALGORITHMSECURITYHEADER], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_AsymmetricAlgorithmSecurityHeader_decodeBinary(const UA_ByteString *src, size_t *offset, UA_AsymmetricAlgorithmSecurityHeader *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TRANSPORT[UA_TRANSPORT_ASYMMETRICALGORITHMSECURITYHEADER], NULL); | |
} | |
/* SymmetricAlgorithmSecurityHeader */ | |
static UA_INLINE size_t | |
UA_SymmetricAlgorithmSecurityHeader_calcSizeBinary(const UA_SymmetricAlgorithmSecurityHeader *src) { | |
return UA_calcSizeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_SYMMETRICALGORITHMSECURITYHEADER]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_SymmetricAlgorithmSecurityHeader_encodeBinary(const UA_SymmetricAlgorithmSecurityHeader *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_SYMMETRICALGORITHMSECURITYHEADER], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_SymmetricAlgorithmSecurityHeader_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SymmetricAlgorithmSecurityHeader *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TRANSPORT[UA_TRANSPORT_SYMMETRICALGORITHMSECURITYHEADER], NULL); | |
} | |
/* SequenceHeader */ | |
static UA_INLINE size_t | |
UA_SequenceHeader_calcSizeBinary(const UA_SequenceHeader *src) { | |
return UA_calcSizeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_SEQUENCEHEADER]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_SequenceHeader_encodeBinary(const UA_SequenceHeader *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_SEQUENCEHEADER], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_SequenceHeader_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SequenceHeader *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TRANSPORT[UA_TRANSPORT_SEQUENCEHEADER], NULL); | |
} | |
/* SecureConversationMessageFooter */ | |
static UA_INLINE size_t | |
UA_SecureConversationMessageFooter_calcSizeBinary(const UA_SecureConversationMessageFooter *src) { | |
return UA_calcSizeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEFOOTER]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_SecureConversationMessageFooter_encodeBinary(const UA_SecureConversationMessageFooter *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEFOOTER], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_SecureConversationMessageFooter_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SecureConversationMessageFooter *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEFOOTER], NULL); | |
} | |
/* SecureConversationMessageAbortBody */ | |
static UA_INLINE size_t | |
UA_SecureConversationMessageAbortBody_calcSizeBinary(const UA_SecureConversationMessageAbortBody *src) { | |
return UA_calcSizeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEABORTBODY]); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_SecureConversationMessageAbortBody_encodeBinary(const UA_SecureConversationMessageAbortBody *src, UA_Byte **bufPos, const UA_Byte *bufEnd) { | |
return UA_encodeBinary(src, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEABORTBODY], bufPos, &bufEnd, NULL, NULL); | |
} | |
static UA_INLINE UA_StatusCode | |
UA_SecureConversationMessageAbortBody_decodeBinary(const UA_ByteString *src, size_t *offset, UA_SecureConversationMessageAbortBody *dst) { | |
return UA_decodeBinary(src, offset, dst, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEABORTBODY], NULL); | |
} | |
/*********************************** amalgamated original file "E:/Librarys/open62541/src/ua_connection_internal.h" ***********************************/ | |
/* This Source Code Form is subject to the terms of the Mozilla Public | |
* License, v. 2.0. If a copy of the MPL was not distributed with this | |
* file, You can obtain one at http://mozilla.org/MPL/2.0/. | |
* | |
* Copyright 2016-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) | |
* Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH | |
* Copyright 2017 (c) Florian Palm | |
* Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB | |
*/ | |
_UA_BEGIN_DECLS | |
/* Process the remote configuration in the HEL/ACK handshake. The connection | |
* config is initialized with the local settings. */ | |
UA_StatusCode | |
UA_Connection_processHELACK(UA_Connection *connection, | |
const UA_ConnectionConfig *localConfig, | |
const UA_ConnectionConfig *remoteConfig); | |
/* The application can be the client or the server */ | |
typedef UA_StatusCode (*UA_Connection_processChunk)(void *application, | |
UA_Connection *connection, | |
UA_ByteString *chunk); | |
/* The network layer may receive several chunks in one packet since TCP is a | |
* streaming protocol. The last chunk in the packet may be only partial. This | |
* method calls the processChunk callback on all full chunks that were received. | |
* The last incomplete chunk is buffered in the connection for the next | |
* iteration. | |
* | |
* The packet itself is not edited in this method. But possibly in the callback | |
* that is executed on complete chunks. | |
* | |
* @param connection The connection | |
* @param application The client or server application | |
* @param processCallback The function pointer for processing each chunk | |
* @param packet The received packet. | |
* @return Returns UA_STATUSCODE_GOOD or an error code. When an error occurs, | |
* the current buffer in the connection are | |
* freed. */ | |
UA_StatusCode | |
UA_Connection_processChunks(UA_Connection *connection, void *application, | |
UA_Connection_processChunk processCallback, | |
const UA_ByteString *packet); | |
/* Try to receive at least one complete chunk on the connection. This blocks the | |
* current thread up to the given timeout. | |
* | |
* @param connection The connection | |
* @param application The client or server application | |
* @param processCallback The function pointer for processing each chunk | |
* @param timeout The timeout (in milliseconds) the method will block at most. | |
* @return Returns UA_STATUSCODE_GOOD or an error code. When an timeout occurs, | |
* UA_STATUSCODE_GOODNONCRITICALTIMEOUT is returned. */ | |
UA_StatusCode | |
UA_Connection_receiveChunksBlocking(UA_Connection *connection, void *application, | |
UA_Connection_processChunk processCallback, | |
UA_UInt32 timeout); | |
UA_StatusCode | |
UA_Connection_receiveChunksNonBlocking(UA_Connection *connection, void *application, | |
UA_Connection_processChunk processCallback); | |
/* When a fatal error occurs the Server shall send an Error Message to the | |
* Client and close the socket. When a Client encounters one of these errors, it | |
* shall also close the socket but does not send an Error Message. After the | |
* socket is closed a Client shall try to reconnect automatically using the | |
* mechanisms described in [...]. */ | |
void | |
UA_Connection_sendError(UA_Connection *connection, | |
UA_TcpErrorMessage *error); | |
void UA_Connection_detachSecureChannel(UA_Connection *connection); | |
void UA_Connection_attachSecureChannel(UA_Connection *connection, | |
UA_SecureChannel *channel); | |
_UA_END_DECLS | |
/*********************************** amalgamated original file "E:/Librarys/open62541/src/ua_securechannel.h" ***********************************/ | |
/* This Source Code Form is subject to the terms of the Mozilla Public | |
* License, v. 2.0. If a copy of the MPL was not distributed with this | |
* file, You can obtain one at http://mozilla.org/MPL/2.0/. | |
* | |
* Copyright 2014-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) | |
* Copyright 2017 (c) Florian Palm | |
* Copyright 2017 (c) Stefan Profanter, fortiss GmbH | |
* Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB | |
*/ | |
_UA_BEGIN_DECLS | |
#define UA_SECURE_CONVERSATION_MESSAGE_HEADER_LENGTH 12 | |
#define UA_SECURE_MESSAGE_HEADER_LENGTH 24 | |
/* Thread-local variables to force failure modes during testing */ | |
#ifdef UA_ENABLE_UNIT_TEST_FAILURE_HOOKS | |
extern UA_StatusCode decrypt_verifySignatureFailure; | |
extern UA_StatusCode sendAsym_sendFailure; | |
extern UA_StatusCode processSym_seqNumberFailure; | |
#endif | |
/* The Session implementation differs between client and server. Still, it is | |
* expected that the Session structure begins with the SessionHeader. This is | |
* the interface that will be used by the SecureChannel. The lifecycle of | |
* Sessions is independent of the underlying SecureChannel. But every Session | |
* can be attached to only one SecureChannel. */ | |
typedef struct UA_SessionHeader { | |
LIST_ENTRY(UA_SessionHeader) pointers; | |
UA_NodeId authenticationToken; | |
UA_SecureChannel *channel; /* The pointer back to the SecureChannel in the session. */ | |
} UA_SessionHeader; | |
/* For chunked requests */ | |
typedef struct UA_ChunkPayload { | |
SIMPLEQ_ENTRY(UA_ChunkPayload) pointers; | |
UA_ByteString bytes; | |
UA_Boolean copied; /* Do the bytes point to a buffer from the network or was | |
memory allocated for the chunk separately */ | |
} UA_ChunkPayload; | |
/* Receieved messages. Process them only in order. The Chunk payload has all | |
* headers and the padding stripped out. The payload begins at the | |
* ExtensionObject prefix.*/ | |
typedef struct UA_Message { | |
TAILQ_ENTRY(UA_Message) pointers; | |
UA_UInt32 requestId; | |
UA_MessageType messageType; | |
SIMPLEQ_HEAD(pp, UA_ChunkPayload) chunkPayloads; | |
size_t chunkPayloadsSize; /* No of chunks received so far */ | |
size_t messageSize; /* Total length of the chunks received so far */ | |
UA_Boolean final; /* All chunks for the message have been received */ | |
} UA_Message; | |
typedef enum { | |
UA_SECURECHANNELSTATE_FRESH, | |
UA_SECURECHANNELSTATE_OPEN, | |
UA_SECURECHANNELSTATE_CLOSED | |
} UA_SecureChannelState; | |
typedef TAILQ_HEAD(UA_MessageQueue, UA_Message) UA_MessageQueue; | |
struct UA_SecureChannel { | |
UA_SecureChannelState state; | |
UA_MessageSecurityMode securityMode; | |
/* We use three tokens because when switching tokens the client is allowed to accept | |
* messages with the old token for up to 25% of the lifetime after the token would have timed out. | |
* For messages that are sent, the new token is already used, which is contained in the securityToken | |
* variable. The nextSecurityToken variable holds a newly issued token, that will be automatically | |
* revolved into the securityToken variable. This could be done with two variables, but would require | |
* greater changes to the current code. This could be done in the future after the client and networking | |
* structure has been reworked, which would make this easier to implement. */ | |
UA_ChannelSecurityToken securityToken; /* the channelId is contained in the securityToken */ | |
UA_ChannelSecurityToken nextSecurityToken; | |
UA_ChannelSecurityToken previousSecurityToken; | |
/* The endpoint and context of the channel */ | |
const UA_SecurityPolicy *securityPolicy; | |
void *channelContext; /* For interaction with the security policy */ | |
UA_Connection *connection; | |
/* Asymmetric encryption info */ | |
UA_ByteString remoteCertificate; | |
UA_Byte remoteCertificateThumbprint[20]; /* The thumbprint of the remote certificate */ | |
/* Symmetric encryption info */ | |
UA_ByteString remoteNonce; | |
UA_ByteString localNonce; | |
UA_UInt32 receiveSequenceNumber; | |
UA_UInt32 sendSequenceNumber; | |
LIST_HEAD(, UA_SessionHeader) sessions; | |
UA_MessageQueue messages; | |
}; | |
void UA_SecureChannel_init(UA_SecureChannel *channel); | |
void UA_SecureChannel_close(UA_SecureChannel *channel); | |
UA_StatusCode | |
UA_SecureChannel_setSecurityPolicy(UA_SecureChannel *channel, | |
const UA_SecurityPolicy *securityPolicy, | |
const UA_ByteString *remoteCertificate); | |
/* Remove (partially) received unprocessed messages */ | |
void UA_SecureChannel_deleteMessages(UA_SecureChannel *channel); | |
void UA_SecureChannel_deleteMembers(UA_SecureChannel *channel); | |
/* Generates new keys and sets them in the channel context */ | |
UA_StatusCode | |
UA_SecureChannel_generateNewKeys(UA_SecureChannel* channel); | |
/* Wrapper function for generating a local nonce for the supplied channel. Uses | |
* the random generator of the channels security policy to allocate and generate | |
* a nonce with the specified length. */ | |
UA_StatusCode | |
UA_SecureChannel_generateLocalNonce(UA_SecureChannel *channel); | |
UA_SessionHeader * | |
UA_SecureChannel_getSession(UA_SecureChannel *channel, | |
const UA_NodeId *authenticationToken); | |
UA_StatusCode | |
UA_SecureChannel_revolveTokens(UA_SecureChannel *channel); | |
/** | |
* Sending Messages | |
* ---------------- */ | |
UA_StatusCode | |
UA_SecureChannel_sendAsymmetricOPNMessage(UA_SecureChannel *channel, UA_UInt32 requestId, | |
const void *content, const UA_DataType *contentType); | |
UA_StatusCode | |
UA_SecureChannel_sendSymmetricMessage(UA_SecureChannel *channel, UA_UInt32 requestId, | |
UA_MessageType messageType, void *payload, | |
const UA_DataType *payloadType); | |
/* The MessageContext is forwarded into the encoding layer so that we can send | |
* chunks before continuing to encode. This lets us reuse a fixed chunk-sized | |
* messages buffer. */ | |
typedef struct { | |
UA_SecureChannel *channel; | |
UA_UInt32 requestId; | |
UA_UInt32 messageType; | |
UA_UInt16 chunksSoFar; | |
size_t messageSizeSoFar; | |
UA_ByteString messageBuffer; | |
UA_Byte *buf_pos; | |
const UA_Byte *buf_end; | |
UA_Boolean final; | |
} UA_MessageContext; | |
/* Start the context of a new symmetric message. */ | |
UA_StatusCode | |
UA_MessageContext_begin(UA_MessageContext *mc, UA_SecureChannel *channel, | |
UA_UInt32 requestId, UA_MessageType messageType); | |
/* Encode the content and send out full chunks. If the return code is good, then | |
* the ChunkInfo contains encoded content that has not been sent. If the return | |
* code is bad, then the ChunkInfo has been cleaned up internally. */ | |
UA_StatusCode | |
UA_MessageContext_encode(UA_MessageContext *mc, const void *content, | |
const UA_DataType *contentType); | |
/* Sends a symmetric message already encoded in the context. The context is | |
* cleaned up, also in case of errors. */ | |
UA_StatusCode | |
UA_MessageContext_finish(UA_MessageContext *mc); | |
/* To be used when a failure occures when a MessageContext is open. Note that | |
* the _encode and _finish methods will clean up internally. _abort can be run | |
* on a MessageContext that has already been cleaned up before. */ | |
void | |
UA_MessageContext_abort(UA_MessageContext *mc); | |
/** | |
* Receive Message | |
* --------------- */ | |
/* Decrypt a chunk and add it to the message. Create a new message if necessary. */ | |
UA_StatusCode | |
UA_SecureChannel_decryptAddChunk(UA_SecureChannel *channel, const UA_ByteString *chunk, | |
UA_Boolean allowPreviousToken); | |
/* The network buffer is about to be cleared. Copy all chunks that point into | |
* the network buffer into dedicated memory. */ | |
UA_StatusCode | |
UA_SecureChannel_persistIncompleteMessages(UA_SecureChannel *channel); | |
typedef void | |
(UA_ProcessMessageCallback)(void *application, UA_SecureChannel *channel, | |
UA_MessageType messageType, UA_UInt32 requestId, | |
const UA_ByteString *message); | |
/* Process received complete messages in-order. The callback function is called | |
* with the complete message body if the message is complete. The message is | |
* removed afterwards. | |
* | |
* Symmetric callback is ERR, MSG, CLO only | |
* Asymmetric callback is OPN only | |
* | |
* @param channel the channel the chunks were received on. | |
* @param application data pointer to application specific data that gets passed | |
* on to the callback function. | |
* @param callback the callback function that gets called with the complete | |
* message body, once a final chunk is processed. | |
* @return Returns if an irrecoverable error occured. Maybe close the channel. */ | |
UA_StatusCode | |
UA_SecureChannel_processCompleteMessages(UA_SecureChannel *channel, void *application, | |
UA_ProcessMessageCallback callback); | |
/** | |
* Log Helper | |
* ---------- | |
* C99 requires at least one element for the variadic argument. If the log | |
* statement has no variable arguments, supply an additional NULL. It will be | |
* ignored by printf. | |
* | |
* We have to jump through some hoops to enable the use of format strings | |
* without arguments since (pedantic) C99 does not allow variadic macros with | |
* zero arguments. So we add a dummy argument that is not printed (%.0s is | |
* string of length zero). */ | |
#define UA_LOG_TRACE_CHANNEL_INTERNAL(LOGGER, CHANNEL, MSG, ...) \ | |
UA_LOG_TRACE(LOGGER, UA_LOGCATEGORY_SECURECHANNEL, \ | |
"Connection %i | SecureChannel %i | " MSG "%.0s", \ | |
((CHANNEL)->connection ? (int)((CHANNEL)->connection->sockfd) : 0), \ | |
(CHANNEL)->securityToken.channelId, __VA_ARGS__) | |
#define UA_LOG_TRACE_CHANNEL(LOGGER, CHANNEL, ...) \ | |
UA_MACRO_EXPAND(UA_LOG_TRACE_CHANNEL_INTERNAL(LOGGER, CHANNEL, __VA_ARGS__, "")) | |
#define UA_LOG_DEBUG_CHANNEL_INTERNAL(LOGGER, CHANNEL, MSG, ...) \ | |
UA_LOG_DEBUG(LOGGER, UA_LOGCATEGORY_SECURECHANNEL, \ | |
"Connection %i | SecureChannel %i | " MSG "%.0s", \ | |
((CHANNEL)->connection ? (int)((CHANNEL)->connection->sockfd) : 0), \ | |
(CHANNEL)->securityToken.channelId, __VA_ARGS__) | |
#define UA_LOG_DEBUG_CHANNEL(LOGGER, CHANNEL, ...) \ | |
UA_MACRO_EXPAND(UA_LOG_DEBUG_CHANNEL_INTERNAL(LOGGER, CHANNEL, __VA_ARGS__, "")) | |
#define UA_LOG_INFO_CHANNEL_INTERNAL(LOGGER, CHANNEL, MSG, ...) \ | |
UA_LOG_INFO(LOGGER, UA_LOGCATEGORY_SECURECHANNEL, \ | |
"Connection %i | SecureChannel %i | " MSG "%.0s", \ | |
((CHANNEL)->connection ? (int)((CHANNEL)->connection->sockfd) : 0), \ | |
(CHANNEL)->securityToken.channelId, __VA_ARGS__) | |
#define UA_LOG_INFO_CHANNEL(LOGGER, CHANNEL, ...) \ | |
UA_MACRO_EXPAND(UA_LOG_INFO_CHANNEL_INTERNAL(LOGGER, CHANNEL, __VA_ARGS__, "")) | |
#define UA_LOG_WARNING_CHANNEL_INTERNAL(LOGGER, CHANNEL, MSG, ...) \ | |
UA_LOG_WARNING(LOGGER, UA_LOGCATEGORY_SECURECHANNEL, \ | |
"Connection %i | SecureChannel %i | " MSG "%.0s", \ | |
((CHANNEL)->connection ? (int)((CHANNEL)->connection->sockfd) : 0), \ | |
(CHANNEL)->securityToken.channelId, __VA_ARGS__) | |
#define UA_LOG_WARNING_CHANNEL(LOGGER, CHANNEL, ...) \ | |
UA_MACRO_EXPAND(UA_LOG_WARNING_CHANNEL_INTERNAL(LOGGER, CHANNEL, __VA_ARGS__, "")) | |
#define UA_LOG_ERROR_CHANNEL_INTERNAL(LOGGER, CHANNEL, MSG, ...) \ | |
UA_LOG_ERROR(LOGGER, UA_LOGCATEGORY_SECURECHANNEL, \ | |
"Connection %i | SecureChannel %i | " MSG "%.0s", \ | |
((CHANNEL)->connection ? (int)((CHANNEL)->connection->sockfd) : 0), \ | |
(CHANNEL)->securityToken.channelId, __VA_ARGS__) | |
#define UA_LOG_ERROR_CHANNEL(LOGGER, CHANNEL, ...) \ | |
UA_MACRO_EXPAND(UA_LOG_ERROR_CHANNEL_INTERNAL(LOGGER, CHANNEL, __VA_ARGS__, "")) | |
#define UA_LOG_FATAL_CHANNEL_INTERNAL(LOGGER, CHANNEL, MSG, ...) \ | |
UA_LOG_FATAL(LOGGER, UA_LOGCATEGORY_SECURECHANNEL, \ | |
"Connection %i | SecureChannel %i | " MSG "%.0s", \ | |
((CHANNEL)->connection ? (CHANNEL)->connection->sockfd : 0), \ | |
(CHANNEL)->securityToken.channelId, __VA_ARGS__) | |
#define UA_LOG_FATAL_CHANNEL(LOGGER, CHANNEL, ...) \ | |
UA_MACRO_EXPAND(UA_LOG_FATAL_CHANNEL_INTERNAL(LOGGER, CHANNEL, __VA_ARGS__, "")) | |
_UA_END_DECLS | |
/*********************************** amalgamated original file "E:/Librarys/open62541/src/ua_workqueue.h" ***********************************/ | |
/* This Source Code Form is subject to the terms of the Mozilla Public | |
* License, v. 2.0. If a copy of the MPL was not distributed with this | |
* file, You can obtain one at http://mozilla.org/MPL/2.0/. | |
* | |
* Copyright 2014-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) | |
* Copyright 2014-2016 (c) Sten Grüner | |
* Copyright 2015 (c) Chris Iatrou | |
* Copyright 2015 (c) Nick Goossens | |
* Copyright 2015 (c) Jörg Schüler-Maroldt | |
* Copyright 2015-2016 (c) Oleksiy Vasylyev | |
* Copyright 2016-2017 (c) Florian Palm | |
* Copyright 2017 (c) Stefan Profanter, fortiss GmbH | |
* Copyright 2016 (c) Lorenz Haas | |
* Copyright 2017 (c) Jonas Green | |
*/ | |
#if UA_MULTITHREADING >= 200 | |
#include <pthread.h> | |
#endif | |
_UA_BEGIN_DECLS | |
/* Callback where the application is either a client or a server */ | |
typedef void (*UA_ApplicationCallback)(void *application, void *data); | |
/* Delayed callbacks are executed when all previously enqueue work is finished. | |
* This is used to free memory that might used by a parallel worker or where the | |
* current threat has remaining pointers to until the current operation | |
* finishes. */ | |
typedef struct UA_DelayedCallback { | |
SIMPLEQ_ENTRY(UA_DelayedCallback) next; | |
UA_ApplicationCallback callback; | |
void *application; | |
void *data; | |
} UA_DelayedCallback; | |
struct UA_WorkQueue; | |
typedef struct UA_WorkQueue UA_WorkQueue; | |
#if UA_MULTITHREADING >= 200 | |
/* Workers take out callbacks from the work queue and execute them. | |
* | |
* Future Plans: Use work-stealing to load-balance between cores. | |
* Le, Nhat Minh, et al. "Correct and efficient work-stealing for weak memory | |
* models." ACM SIGPLAN Notices. Vol. 48. No. 8. ACM, 2013. */ | |
typedef struct { | |
pthread_t thread; | |
volatile UA_Boolean running; | |
UA_WorkQueue *queue; | |
UA_UInt32 counter; | |
UA_UInt32 checkpointCounter; /* Counter when the last checkpoint was made | |
* for the delayed callbacks */ | |
/* separate cache lines */ | |
char padding[64 - sizeof(void*) - sizeof(pthread_t) - | |
sizeof(UA_UInt32) - sizeof(UA_Boolean)]; | |
} UA_Worker; | |
#endif | |
struct UA_WorkQueue { | |
/* Worker threads and work queue. Without multithreading, work is executed | |
immediately. */ | |
#if UA_MULTITHREADING >= 200 | |
UA_Worker *workers; | |
size_t workersSize; | |
/* Work queue */ | |
SIMPLEQ_HEAD(, UA_DelayedCallback) dispatchQueue; /* Dispatch queue for the worker threads */ | |
UA_LOCK_TYPE(dispatchQueue_accessMutex) /* mutex for access to queue */ | |
pthread_cond_t dispatchQueue_condition; /* so the workers don't spin if the queue is empty */ | |
UA_LOCK_TYPE(dispatchQueue_conditionMutex) /* mutex for access to condition variable */ | |
#endif | |
/* Delayed callbacks | |
* To be executed after all curretly dispatched works has finished */ | |
SIMPLEQ_HEAD(, UA_DelayedCallback) delayedCallbacks; | |
#if UA_MULTITHREADING >= 200 | |
UA_LOCK_TYPE(delayedCallbacks_accessMutex) | |
UA_DelayedCallback *delayedCallbacks_checkpoint; | |
size_t delayedCallbacks_sinceDispatch; /* How many have been added since we | |
* tried to dispatch callbacks? */ | |
#endif | |
}; | |
void UA_WorkQueue_init(UA_WorkQueue *wq); | |
/* Enqueue a delayed callback. It is executed when all previous work in the | |
* queue has been finished. The ``cb`` pointer is freed afterwards. ``cb`` can | |
* have a NULL callback that is not executed. | |
* | |
* This method checks internally if existing delayed work can be moved from the | |
* delayed queue to the worker dispatch queue. */ | |
void UA_WorkQueue_enqueueDelayed(UA_WorkQueue *wq, UA_DelayedCallback *cb); | |
/* Stop the workers, process all enqueued work in the calling thread, clean up | |
* mutexes etc. */ | |
void UA_WorkQueue_cleanup(UA_WorkQueue *wq); | |
#if UA_MULTITHREADING >= 200 | |
/* Spin up a number of worker threads that listen on the work queue */ | |
UA_StatusCode UA_WorkQueue_start(UA_WorkQueue *wq, size_t workersCount); | |
void UA_WorkQueue_stop(UA_WorkQueue *wq); | |
/* Enqueue work for the worker threads */ | |
void UA_WorkQueue_enqueue(UA_WorkQueue *wq, UA_ApplicationCallback cb, | |
void *application, void *data); | |
#else | |
/* Process all enqueued delayed work. This is not needed when workers are | |
* running for the multithreading case. (UA_WorkQueue_cleanup still calls this | |
* method during cleanup when the workers are shut down.) */ | |
void UA_WorkQueue_manuallyProcessDelayed(UA_WorkQueue *wq); | |
#endif | |
_UA_END_DECLS | |
/*********************************** amalgamated original file "E:/Librarys/open62541/src/server/ua_discovery_manager.h" ***********************************/ | |
/* This Source Code Form is subject to the terms of the Mozilla Public | |
* License, v. 2.0. If a copy of the MPL was not distributed with this | |
* file, You can obtain one at http://mozilla.org/MPL/2.0/. | |
* | |
* Copyright 2014-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) | |
* Copyright 2014, 2017 (c) Florian Palm | |
* Copyright 2015-2016 (c) Sten Grüner | |
* Copyright 2015 (c) Chris Iatrou | |
* Copyright 2015-2016 (c) Oleksiy Vasylyev | |
* Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH | |
* Copyright 2017 (c) Julian Grothoff | |
*/ | |
_UA_BEGIN_DECLS | |
#ifdef UA_ENABLE_DISCOVERY | |
typedef struct registeredServer_list_entry { | |
#if UA_MULTITHREADING >= 200 | |
UA_DelayedCallback delayedCleanup; | |
#endif | |
LIST_ENTRY(registeredServer_list_entry) pointers; | |
UA_RegisteredServer registeredServer; | |
UA_DateTime lastSeen; | |
} registeredServer_list_entry; | |
struct PeriodicServerRegisterCallback { | |
UA_UInt64 id; | |
UA_Double this_interval; | |
UA_Double default_interval; | |
UA_Boolean registered; | |
struct UA_Client* client; | |
char* discovery_server_url; | |
}; | |
typedef struct periodicServerRegisterCallback_entry { | |
#if UA_MULTITHREADING >= 200 | |
UA_DelayedCallback delayedCleanup; | |
#endif | |
LIST_ENTRY(periodicServerRegisterCallback_entry) pointers; | |
struct PeriodicServerRegisterCallback *callback; | |
} periodicServerRegisterCallback_entry; | |
#ifdef UA_ENABLE_DISCOVERY_MULTICAST | |
/** | |
* TXT record: | |
* [servername]-[hostname]._opcua-tcp._tcp.local. TXT path=/ caps=NA,DA,... | |
* | |
* A/AAAA record for all ip addresses: | |
* [servername]-[hostname]._opcua-tcp._tcp.local. A [ip]. | |
* [hostname]. A [ip]. | |
*/ | |
typedef struct serverOnNetwork_list_entry { | |
#if UA_MULTITHREADING >= 200 | |
UA_DelayedCallback delayedCleanup; | |
#endif | |
LIST_ENTRY(serverOnNetwork_list_entry) pointers; | |
UA_ServerOnNetwork serverOnNetwork; | |
UA_DateTime created; | |
UA_DateTime lastSeen; | |
UA_Boolean txtSet; | |
UA_Boolean srvSet; | |
char* pathTmp; | |
} serverOnNetwork_list_entry; | |
#define SERVER_ON_NETWORK_HASH_SIZE 1000 | |
typedef struct serverOnNetwork_hash_entry { | |
serverOnNetwork_list_entry* entry; | |
struct serverOnNetwork_hash_entry* next; | |
} serverOnNetwork_hash_entry; | |
#endif | |
typedef struct { | |
LIST_HEAD(, periodicServerRegisterCallback_entry) periodicServerRegisterCallbacks; | |
LIST_HEAD(, registeredServer_list_entry) registeredServers; | |
size_t registeredServersSize; | |
UA_Server_registerServerCallback registerServerCallback; | |
void* registerServerCallbackData; | |
# ifdef UA_ENABLE_DISCOVERY_MULTICAST | |
mdns_daemon_t *mdnsDaemon; | |
UA_SOCKET mdnsSocket; | |
UA_Boolean mdnsMainSrvAdded; | |
/* Full Domain Name of server itself. Used to detect if received mDNS message was from itself */ | |
UA_String selfFqdnMdnsRecord; | |
LIST_HEAD(, serverOnNetwork_list_entry) serverOnNetwork; | |
UA_UInt32 serverOnNetworkRecordIdCounter; | |
UA_DateTime serverOnNetworkRecordIdLastReset; | |
/* hash mapping domain name to serverOnNetwork list entry */ | |
struct serverOnNetwork_hash_entry* serverOnNetworkHash[SERVER_ON_NETWORK_HASH_SIZE]; | |
UA_Server_serverOnNetworkCallback serverOnNetworkCallback; | |
void* serverOnNetworkCallbackData; | |
#if UA_MULTITHREADING >= 200 | |
pthread_t mdnsThread; | |
UA_Boolean mdnsRunning; | |
# endif | |
# endif /* UA_ENABLE_DISCOVERY_MULTICAST */ | |
} UA_DiscoveryManager; | |
void UA_DiscoveryManager_init(UA_DiscoveryManager *dm, UA_Server *server); | |
void UA_DiscoveryManager_deleteMembers(UA_DiscoveryManager *dm, UA_Server *server); | |
/* Checks if a registration timed out and removes that registration. | |
* Should be called periodically in main loop */ | |
void UA_Discovery_cleanupTimedOut(UA_Server *server, UA_DateTime nowMonotonic); | |
#ifdef UA_ENABLE_DISCOVERY_MULTICAST | |
/** | |
* Sends out a new mDNS package for the given server data. | |
* This Method is normally called when another server calls the RegisterServer Service on this server. | |
* Then this server is responsible to send out a new mDNS package to announce it. | |
* | |
* Additionally this method also adds the given server to the internal serversOnNetwork list so that | |
* a client finds it when calling FindServersOnNetwork. | |
*/ | |
void | |
UA_Server_updateMdnsForDiscoveryUrl(UA_Server *server, const UA_String *serverName, | |
const UA_MdnsDiscoveryConfiguration *mdnsConfig, | |
const UA_String *discoveryUrl, | |
UA_Boolean isOnline, UA_Boolean updateTxt); | |
void mdns_record_received(const struct resource *r, void *data); | |
void mdns_create_txt(UA_Server *server, const char *fullServiceDomain, | |
const char *path, const UA_String *capabilites, | |
const size_t capabilitiesSize, | |
void (*conflict)(char *host, int type, void *arg)); | |
void mdns_set_address_record(UA_Server *server, | |
const char *fullServiceDomain, | |
const char *localDomain); | |
mdns_record_t * | |
mdns_find_record(mdns_daemon_t *mdnsDaemon, unsigned short type, | |
const char *host, const char *rdname); | |
void startMulticastDiscoveryServer(UA_Server *server); | |
void stopMulticastDiscoveryServer(UA_Server *server); | |
UA_StatusCode | |
iterateMulticastDiscoveryServer(UA_Server* server, UA_DateTime *nextRepeat, | |
UA_Boolean processIn); | |
typedef enum { | |
UA_DISCOVERY_TCP, /* OPC UA TCP mapping */ | |
UA_DISCOVERY_TLS /* OPC UA HTTPS mapping */ | |
} UA_DiscoveryProtocol; | |
/* Send a multicast probe to find any other OPC UA server on the network through mDNS. */ | |
UA_StatusCode | |
UA_Discovery_multicastQuery(UA_Server* server); | |
/** | |
* Create a mDNS Record for the given server info and adds it to the mDNS output queue. | |
* | |
* Additionally this method also adds the given server to the internal serversOnNetwork list so that | |
* a client finds it when calling FindServersOnNetwork. | |
*/ | |
UA_StatusCode | |
UA_Discovery_addRecord(UA_Server *server, const UA_String *servername, | |
const UA_String *hostname, UA_UInt16 port, | |
const UA_String *path, const UA_DiscoveryProtocol protocol, | |
UA_Boolean createTxt, const UA_String* capabilites, | |
const size_t capabilitiesSize, | |
UA_Boolean isSelf); | |
UA_StatusCode | |
UA_DiscoveryManager_addEntryToServersOnNetwork(UA_Server *server, const char *fqdnMdnsRecord, const char *serverName, | |
size_t serverNameLen, struct serverOnNetwork_list_entry **addedEntry); | |
/** | |
* Create a mDNS Record for the given server info with TTL=0 and adds it to the mDNS output queue. | |
* | |
* Additionally this method also removes the given server from the internal serversOnNetwork list so that | |
* a client gets the updated data when calling FindServersOnNetwork. | |
*/ | |
UA_StatusCode | |
UA_Discovery_removeRecord(UA_Server *server, const UA_String *servername, | |
const UA_String *hostname, UA_UInt16 port, | |
UA_Boolean removeTxt); | |
UA_StatusCode | |
UA_DiscoveryManager_removeEntryFromServersOnNetwork(UA_Server *server, const char *fqdnMdnsRecord, const char *serverName, | |
size_t serverNameLen); | |
#endif /* UA_ENABLE_DISCOVERY_MULTICAST */ | |
#endif /* UA_ENABLE_DISCOVERY */ | |
_UA_END_DECLS | |
/*********************************** amalgamated original file "E:/Librarys/open62541/src/ua_timer.h" ***********************************/ | |
/* This Source Code Form is subject to the terms of the Mozilla Public | |
* License, v. 2.0. If a copy of the MPL was not distributed with this | |
* file, You can obtain one at http://mozilla.org/MPL/2.0/. | |
* | |
* Copyright 2017, 2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) | |
* Copyright 2017 (c) Stefan Profanter, fortiss GmbH | |
*/ | |
_UA_BEGIN_DECLS | |
struct UA_TimerEntry; | |
typedef struct UA_TimerEntry UA_TimerEntry; | |
ZIP_HEAD(UA_TimerZip, UA_TimerEntry); | |
typedef struct UA_TimerZip UA_TimerZip; | |
ZIP_HEAD(UA_TimerIdZip, UA_TimerEntry); | |
typedef struct UA_TimerIdZip UA_TimerIdZip; | |
/* Only for a single thread. Protect by a mutex if required. */ | |
typedef struct { | |
UA_TimerZip root; /* The root of the time-sorted zip tree */ | |
UA_TimerIdZip idRoot; /* The root of the id-sorted zip tree */ | |
UA_UInt64 idCounter; | |
} UA_Timer; | |
void UA_Timer_init(UA_Timer *t); | |
UA_StatusCode | |
UA_Timer_addTimedCallback(UA_Timer *t, UA_ApplicationCallback callback, | |
void *application, void *data, UA_DateTime date, | |
UA_UInt64 *callbackId); | |
UA_StatusCode | |
UA_Timer_addRepeatedCallback(UA_Timer *t, UA_ApplicationCallback callback, | |
void *application, void *data, UA_Double interval_ms, | |
UA_UInt64 *callbackId); | |
/* Change the callback interval. If this is called from within the callback. The | |
* adjustment is made during the next _process call. */ | |
UA_StatusCode | |
UA_Timer_changeRepeatedCallbackInterval(UA_Timer *t, UA_UInt64 callbackId, | |
UA_Double interval_ms); | |
void | |
UA_Timer_removeCallback(UA_Timer *t, UA_UInt64 callbackId); | |
/* Process (dispatch) the repeated callbacks that have timed out. Returns the | |
* timestamp of the next scheduled repeated callback. Not thread-safe. | |
* Application is a pointer to the client / server environment for the callback. | |
* Dispatched is set to true when at least one callback was run / dispatched. */ | |
typedef void | |
(*UA_TimerExecutionCallback)(void *executionApplication, UA_ApplicationCallback cb, | |
void *callbackApplication, void *data); | |
UA_DateTime | |
UA_Timer_process(UA_Timer *t, UA_DateTime nowMonotonic, | |
UA_TimerExecutionCallback executionCallback, | |
void *executionApplication); | |
void UA_Timer_deleteMembers(UA_Timer *t); | |
_UA_END_DECLS | |
/*********************************** amalgamated original file "E:/Librarys/open62541/src/server/ua_session.h" ***********************************/ | |
/* This Source Code Form is subject to the terms of the Mozilla Public | |
* License, v. 2.0. If a copy of the MPL was not distributed with this | |
* file, You can obtain one at http://mozilla.org/MPL/2.0/. | |
* | |
* Copyright 2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) | |
*/ | |
_UA_BEGIN_DECLS | |
#define UA_MAXCONTINUATIONPOINTS 5 | |
struct ContinuationPoint; | |
typedef struct ContinuationPoint ContinuationPoint; | |
/* Returns the next entry in the linked list */ | |
ContinuationPoint * | |
ContinuationPoint_clear(ContinuationPoint *cp); | |
struct UA_Subscription; | |
typedef struct UA_Subscription UA_Subscription; | |
#ifdef UA_ENABLE_SUBSCRIPTIONS | |
typedef struct UA_PublishResponseEntry { | |
SIMPLEQ_ENTRY(UA_PublishResponseEntry) listEntry; | |
UA_UInt32 requestId; | |
UA_PublishResponse response; | |
} UA_PublishResponseEntry; | |
#endif | |
typedef struct { | |
UA_SessionHeader header; | |
UA_ApplicationDescription clientDescription; | |
UA_String sessionName; | |
UA_Boolean activated; | |
void *sessionHandle; // pointer assigned in userland-callback | |
UA_NodeId sessionId; | |
UA_UInt32 maxRequestMessageSize; | |
UA_UInt32 maxResponseMessageSize; | |
UA_Double timeout; // [ms] | |
UA_DateTime validTill; | |
UA_ByteString serverNonce; | |
UA_UInt16 availableContinuationPoints; | |
ContinuationPoint *continuationPoints; | |
#ifdef UA_ENABLE_SUBSCRIPTIONS | |
UA_UInt32 lastSubscriptionId; | |
UA_UInt32 lastSeenSubscriptionId; | |
LIST_HEAD(UA_ListOfUASubscriptions, UA_Subscription) serverSubscriptions; | |
SIMPLEQ_HEAD(UA_ListOfQueuedPublishResponses, UA_PublishResponseEntry) responseQueue; | |
UA_UInt32 numSubscriptions; | |
UA_UInt32 numPublishReq; | |
size_t totalRetransmissionQueueSize; /* Retransmissions of all subscriptions */ | |
#endif | |
} UA_Session; | |
/** | |
* Session Lifecycle | |
* ----------------- */ | |
void UA_Session_init(UA_Session *session); | |
void UA_Session_deleteMembersCleanup(UA_Session *session, UA_Server *server); | |
void UA_Session_attachToSecureChannel(UA_Session *session, UA_SecureChannel *channel); | |
void UA_Session_detachFromSecureChannel(UA_Session *session); | |
UA_StatusCode UA_Session_generateNonce(UA_Session *session); | |
/* If any activity on a session happens, the timeout is extended */ | |
void UA_Session_updateLifetime(UA_Session *session); | |
/** | |
* Subscription handling | |
* --------------------- */ | |
#ifdef UA_ENABLE_SUBSCRIPTIONS | |
void | |
UA_Session_addSubscription(UA_Server *server, | |
UA_Session *session, | |
UA_Subscription *newSubscription); | |
UA_Subscription * | |
UA_Session_getSubscriptionById(UA_Session *session, | |
UA_UInt32 subscriptionId); | |
UA_StatusCode | |
UA_Session_deleteSubscription(UA_Server *server, UA_Session *session, | |
UA_UInt32 subscriptionId); | |
void | |
UA_Session_queuePublishReq(UA_Session *session, | |
UA_PublishResponseEntry* entry, | |
UA_Boolean head); | |
UA_PublishResponseEntry * | |
UA_Session_dequeuePublishReq(UA_Session *session); | |
#endif | |
/** | |
* Log Helper | |
* ---------- | |
* We have to jump through some hoops to enable the use of format strings | |
* without arguments since (pedantic) C99 does not allow variadic macros with | |
* zero arguments. So we add a dummy argument that is not printed (%.0s is | |
* string of length zero). */ | |
#define UA_LOG_SESSION_INTERNAL(LOGGER, LEVEL, SESSION, MSG, ...) do { \ | |
UA_String idString = UA_STRING_NULL; \ | |
UA_NodeId_toString(&(SESSION)->sessionId, &idString); \ | |
UA_LOG_##LEVEL(LOGGER, UA_LOGCATEGORY_SESSION, \ | |
"Connection %i | SecureChannel %i | Session %.*s | " MSG "%.0s", \ | |
((SESSION)->header.channel ? \ | |
((SESSION)->header.channel->connection ? \ | |
(int)((SESSION)->header.channel->connection->sockfd) : 0) : 0), \ | |
((SESSION)->header.channel ? \ | |
(SESSION)->header.channel->securityToken.channelId : 0), \ | |
(int)idString.length, idString.data, __VA_ARGS__); \ | |
UA_String_deleteMembers(&idString); \ | |
} while(0) | |
#if UA_LOGLEVEL <= 100 | |
#define UA_LOG_TRACE_SESSION(LOGGER, SESSION, ...) \ | |
UA_MACRO_EXPAND(UA_LOG_SESSION_INTERNAL(LOGGER, TRACE, SESSION, __VA_ARGS__, "")) | |
#else | |
#define UA_LOG_TRACE_SESSION(LOGGER, SESSION, ...) do {} while(0) | |
#endif | |
#if UA_LOGLEVEL <= 200 | |
#define UA_LOG_DEBUG_SESSION(LOGGER, SESSION, ...) \ | |
UA_MACRO_EXPAND(UA_LOG_SESSION_INTERNAL(LOGGER, DEBUG, SESSION, __VA_ARGS__, "")) | |
#else | |
#define UA_LOG_DEBUG_SESSION(LOGGER, SESSION, ...) do {} while(0) | |
#endif | |
#if UA_LOGLEVEL <= 300 | |
#define UA_LOG_INFO_SESSION(LOGGER, SESSION, ...) \ | |
UA_MACRO_EXPAND(UA_LOG_SESSION_INTERNAL(LOGGER, INFO, SESSION, __VA_ARGS__, "")) | |
#else | |
#define UA_LOG_INFO_SESSION(LOGGER, SESSION, ...) do {} while(0) | |
#endif | |
#if UA_LOGLEVEL <= 400 | |
#define UA_LOG_WARNING_SESSION(LOGGER, SESSION, ...) \ | |
UA_MACRO_EXPAND(UA_LOG_SESSION_INTERNAL(LOGGER, WARNING, SESSION, __VA_ARGS__, "")) | |
#else | |
#define UA_LOG_WARNING_SESSION(LOGGER, SESSION, ...) do {} while(0) | |
#endif | |
#if UA_LOGLEVEL <= 500 | |
#define UA_LOG_ERROR_SESSION(LOGGER, SESSION, ...) \ | |
UA_MACRO_EXPAND(UA_LOG_SESSION_INTERNAL(LOGGER, ERROR, SESSION, __VA_ARGS__, "")) | |
#else | |
#define UA_LOG_ERROR_SESSION(LOGGER, SESSION, ...) do {} while(0) | |
#endif | |
#if UA_LOGLEVEL <= 600 | |
#define UA_LOG_FATAL_SESSION(LOGGER, SESSION, ...) \ | |
UA_MACRO_EXPAND(UA_LOG_SESSION_INTERNAL(LOGGER, FATAL, SESSION, __VA_ARGS__, "")) | |
#else | |
#define UA_LOG_FATAL_SESSION(LOGGER, SESSION, ...) do {} while(0) | |
#endif | |
_UA_END_DECLS | |
/*********************************** amalgamated original file "E:/Librarys/open62541/src/server/ua_subscription.h" ***********************************/ | |
/* This Source Code Form is subject to the terms of the Mozilla Public | |
* License, v. 2.0. If a copy of the MPL was not distributed with this | |
* file, You can obtain one at http://mozilla.org/MPL/2.0/. | |
* | |
* Copyright 2015-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) | |
* Copyright 2015 (c) Chris Iatrou | |
* Copyright 2015-2016 (c) Sten Grüner | |
* Copyright 2015 (c) Oleksiy Vasylyev | |
* Copyright 2017 (c) Florian Palm | |
* Copyright 2017 (c) Stefan Profanter, fortiss GmbH | |
* Copyright 2017 (c) Mattias Bornhager | |
*/ | |
_UA_BEGIN_DECLS | |
#ifdef UA_ENABLE_SUBSCRIPTIONS | |
#define UA_BOUNDEDVALUE_SETWBOUNDS(BOUNDS, SRC, DST) { \ | |
if(SRC > BOUNDS.max) DST = BOUNDS.max; \ | |
else if(SRC < BOUNDS.min) DST = BOUNDS.min; \ | |
else DST = SRC; \ | |
} | |
/* Set to the TAILQ_NEXT pointer of a notification, the sentinel that the | |
* notification was not added to the global queue */ | |
#define UA_SUBSCRIPTION_QUEUE_SENTINEL ((UA_Notification*)0x01) | |
/** | |
* MonitoredItems create Notifications. Subscriptions collect Notifications from | |
* (several) MonitoredItems and publish them to the client. | |
* | |
* Notifications are put into two queues at the same time. One for the | |
* MonitoredItem that generated the notification. Here we can remove it if the | |
* space reserved for the MonitoredItem runs full. The second queue is the | |
* "global" queue for all Notifications generated in a Subscription. For | |
* publication, the notifications are taken out of the "global" queue in the | |
* order of their creation. | |
*/ | |
/*****************/ | |
/* MonitoredItem */ | |
/*****************/ | |
struct UA_MonitoredItem; | |
typedef struct UA_MonitoredItem UA_MonitoredItem; | |
#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS | |
typedef struct UA_EventNotification { | |
UA_EventFieldList fields; | |
/* EventFilterResult currently isn't being used | |
UA_EventFilterResult result; */ | |
} UA_EventNotification; | |
#ifdef UA_ENABLE_SUBSCRIPTIONS_ALARMS_CONDITIONS | |
typedef enum { | |
UA_INACTIVE, | |
UA_ACTIVE, | |
UA_ACTIVE_HIGHHIGH, | |
UA_ACTIVE_HIGH, | |
UA_ACTIVE_LOW, | |
UA_ACTIVE_LOWLOW | |
} UA_ActiveState; | |
typedef struct UA_SpecificCallbacks_Data { | |
UA_TwoStateVariableChangeCallback enteringEnabledStateCallback; | |
UA_TwoStateVariableChangeCallback enteringAckedStateCallback; | |
UA_Boolean ackedRemoveBranch; | |
UA_TwoStateVariableChangeCallback enteringConfirmedStateCallback; | |
UA_Boolean confirmedRemoveBranch; | |
UA_TwoStateVariableChangeCallback enteringActiveStateCallback; | |
} UA_SpecificCallbacks_Data; | |
typedef struct UA_LastSverity_Data { | |
UA_UInt16 lastSeverity; | |
UA_DateTime sourceTimeStamp; | |
} UA_LastSverity_Data; | |
/* in the first implementation there will be only one entry in this list | |
* conditionBranchId is always NULL. | |
*/ | |
typedef struct UA_ConditionBranch_nodeListElement { | |
LIST_ENTRY(UA_ConditionBranch_nodeListElement) listEntry; | |
UA_NodeId* conditionBranchId; | |
UA_ByteString lastEventId; | |
UA_Boolean isCallerAC; | |
} UA_ConditionBranch_nodeListElement; | |
typedef struct UA_Condition_nodeListElement { | |
LIST_ENTRY(UA_Condition_nodeListElement) listEntry; | |
LIST_HEAD(conditionbranchlisthead, UA_ConditionBranch_nodeListElement) conditionBranchHead; | |
UA_NodeId conditionId; | |
UA_LastSverity_Data lastSevertyData; | |
UA_SpecificCallbacks_Data specificCallbacksData; | |
UA_ActiveState lastActiveState; | |
UA_ActiveState currentActiveState; | |
UA_Boolean isLimitAlarm; | |
} UA_Condition_nodeListElement; | |
typedef struct UA_ConditionSource_nodeListElement { | |
LIST_ENTRY(UA_ConditionSource_nodeListElement) listEntry; | |
LIST_HEAD(conditionlisthead, UA_Condition_nodeListElement) conditionHead; | |
UA_NodeId conditionSourceId; | |
} UA_ConditionSource_nodeListElement; | |
#endif | |
#endif | |
typedef struct UA_Notification { | |
TAILQ_ENTRY(UA_Notification) listEntry; /* Notification list for the MonitoredItem */ | |
TAILQ_ENTRY(UA_Notification) globalEntry; /* Notification list for the Subscription */ | |
UA_MonitoredItem *mon; | |
/* See the monitoredItemType of the MonitoredItem */ | |
union { | |
#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS | |
UA_EventNotification event; | |
#endif | |
UA_DataValue value; | |
} data; | |
} UA_Notification; | |
/* Ensure enough space is available; Add notification to the linked lists; | |
* Increase the counters */ | |
void UA_Notification_enqueue(UA_Server *server, UA_Subscription *sub, | |
UA_MonitoredItem *mon, UA_Notification *n); | |
/* Remove the notification from the MonitoredItem's queue and the Subscriptions | |
* global queue. Reduce the respective counters. */ | |
void UA_Notification_dequeue(UA_Server *server, UA_Notification *n); | |
/* Delete the notification. Must be dequeued first. */ | |
void UA_Notification_delete(UA_Notification *n); | |
typedef TAILQ_HEAD(NotificationQueue, UA_Notification) NotificationQueue; | |
struct UA_MonitoredItem { | |
UA_DelayedCallback delayedFreePointers; | |
LIST_ENTRY(UA_MonitoredItem) listEntry; | |
UA_Subscription *subscription; /* Local MonitoredItem if the subscription is NULL */ | |
UA_UInt32 monitoredItemId; | |
UA_UInt32 clientHandle; | |
UA_Boolean registered; /* Was the MonitoredItem registered in Userland with | |
the callback? */ | |
/* Settings */ | |
UA_TimestampsToReturn timestampsToReturn; | |
UA_MonitoringMode monitoringMode; | |
UA_NodeId monitoredNodeId; | |
UA_UInt32 attributeId; | |
UA_String indexRange; | |
UA_Double samplingInterval; // [ms] | |
UA_Boolean discardOldest; | |
union { | |
#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS | |
/* If attributeId == UA_ATTRIBUTEID_EVENTNOTIFIER */ | |
UA_EventFilter eventFilter; | |
#endif | |
/* The DataChangeFilter always contains an absolute deadband definition. | |
* Part 8, §6.2 gives the following formula to test for percentage | |
* deadbands: | |
* | |
* DataChange if (absolute value of (last cached value - current value) | |
* > (deadbandValue/100.0) * ((high–low) of EURange))) | |
* | |
* So we can convert from a percentage to an absolute deadband and keep | |
* the hot code path simple. | |
* | |
* TODO: Store the percentage deadband to recompute when the UARange is | |
* changed at runtime of the MonitoredItem */ | |
UA_DataChangeFilter dataChangeFilter; | |
} filter; | |
UA_Variant lastValue; // TODO: dataEncoding is hardcoded to UA binary | |
/* Sample Callback */ | |
UA_UInt64 sampleCallbackId; | |
UA_ByteString lastSampledValue; | |
UA_Boolean sampleCallbackIsRegistered; | |
/* Notification Queue */ | |
NotificationQueue queue; | |
UA_UInt32 maxQueueSize; /* The max number of enqueued notifications (not | |
* counting overflow events) */ | |
UA_UInt32 queueSize; | |
UA_UInt32 eventOverflows; /* Separate counter for the queue. Can at most | |
* double the queue size */ | |
#ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS | |
UA_MonitoredItem *next; | |
#endif | |
#ifdef UA_ENABLE_DA | |
UA_StatusCode lastStatus; | |
#endif | |
}; | |
void UA_MonitoredItem_init(UA_MonitoredItem *mon, UA_Subscription *sub); | |
void UA_MonitoredItem_delete(UA_Server *server, UA_MonitoredItem *monitoredItem); | |
void UA_MonitoredItem_sampleCallback(UA_Server *server, UA_MonitoredItem *monitoredItem); | |
UA_StatusCode UA_MonitoredItem_registerSampleCallback(UA_Server *server, UA_MonitoredItem *mon); | |
void UA_MonitoredItem_unregisterSampleCallback(UA_Server *server, UA_MonitoredItem *mon); | |
UA_StatusCode UA_Event_addEventToMonitoredItem(UA_Server *server, const UA_NodeId *event, UA_MonitoredItem *mon); | |
UA_StatusCode UA_Event_generateEventId(UA_ByteString *generatedId); | |
/* Remove entries until mon->maxQueueSize is reached. Sets infobits for lost | |
* data if required. */ | |
UA_StatusCode UA_MonitoredItem_ensureQueueSpace(UA_Server *server, UA_MonitoredItem *mon); | |
UA_StatusCode UA_MonitoredItem_removeNodeEventCallback(UA_Server *server, UA_Session *session, | |
UA_Node *node, void *data); | |
/****************/ | |
/* Subscription */ | |
/****************/ | |
typedef struct UA_NotificationMessageEntry { | |
TAILQ_ENTRY(UA_NotificationMessageEntry) listEntry; | |
UA_NotificationMessage message; | |
} UA_NotificationMessageEntry; | |
/* We use only a subset of the states defined in the standard */ | |
typedef enum { | |
/* UA_SUBSCRIPTIONSTATE_CLOSED */ | |
/* UA_SUBSCRIPTIONSTATE_CREATING */ | |
UA_SUBSCRIPTIONSTATE_NORMAL, | |
UA_SUBSCRIPTIONSTATE_LATE, | |
UA_SUBSCRIPTIONSTATE_KEEPALIVE | |
} UA_SubscriptionState; | |
typedef TAILQ_HEAD(ListOfNotificationMessages, UA_NotificationMessageEntry) ListOfNotificationMessages; | |
struct UA_Subscription { | |
UA_DelayedCallback delayedFreePointers; | |
LIST_ENTRY(UA_Subscription) listEntry; | |
UA_Session *session; | |
UA_UInt32 subscriptionId; | |
/* Settings */ | |
UA_UInt32 lifeTimeCount; | |
UA_UInt32 maxKeepAliveCount; | |
UA_Double publishingInterval; /* in ms */ | |
UA_UInt32 notificationsPerPublish; | |
UA_Boolean publishingEnabled; | |
UA_UInt32 priority; | |
/* Runtime information */ | |
UA_SubscriptionState state; | |
UA_UInt32 nextSequenceNumber; | |
UA_UInt32 currentKeepAliveCount; | |
UA_UInt32 currentLifetimeCount; | |
/* Publish Callback */ | |
UA_UInt64 publishCallbackId; | |
UA_Boolean publishCallbackIsRegistered; | |
/* MonitoredItems */ | |
UA_UInt32 lastMonitoredItemId; /* increase the identifiers */ | |
LIST_HEAD(, UA_MonitoredItem) monitoredItems; | |
UA_UInt32 monitoredItemsSize; | |
/* Global list of notifications from the MonitoredItems */ | |
NotificationQueue notificationQueue; | |
UA_UInt32 notificationQueueSize; /* Total queue size */ | |
UA_UInt32 dataChangeNotifications; | |
UA_UInt32 eventNotifications; | |
UA_UInt32 statusChangeNotifications; | |
/* Notifications to be sent out now (already late). In a regular publish | |
* callback, all queued notifications are sent out. In a late publish | |
* response, only the notifications left from the last regular publish | |
* callback are sent. */ | |
UA_UInt32 readyNotifications; | |
/* Retransmission Queue */ | |
ListOfNotificationMessages retransmissionQueue; | |
size_t retransmissionQueueSize; | |
}; | |
UA_Subscription * UA_Subscription_new(UA_Session *session, UA_UInt32 subscriptionId); | |
void UA_Subscription_deleteMembers(UA_Server *server, UA_Subscription *sub); | |
UA_StatusCode Subscription_registerPublishCallback(UA_Server *server, UA_Subscription *sub); | |
void Subscription_unregisterPublishCallback(UA_Server *server, UA_Subscription *sub); | |
void UA_Subscription_addMonitoredItem(UA_Server *server, UA_Subscription *sub, UA_MonitoredItem *newMon); | |
UA_MonitoredItem * UA_Subscription_getMonitoredItem(UA_Subscription *sub, UA_UInt32 monitoredItemId); | |
UA_StatusCode | |
UA_Subscription_deleteMonitoredItem(UA_Server *server, UA_Subscription *sub, | |
UA_UInt32 monitoredItemId); | |
void UA_Subscription_publish(UA_Server *server, UA_Subscription *sub); | |
UA_StatusCode UA_Subscription_removeRetransmissionMessage(UA_Subscription *sub, | |
UA_UInt32 sequenceNumber); | |
void UA_Subscription_answerPublishRequestsNoSubscription(UA_Server *server, UA_Session *session); | |
UA_Boolean UA_Subscription_reachedPublishReqLimit(UA_Server *server, UA_Session *session); | |
#endif /* UA_ENABLE_SUBSCRIPTIONS */ | |
_UA_END_DECLS | |
/*********************************** amalgamated original file "E:/Librarys/open62541/src/server/ua_session_manager.h" ***********************************/ | |
/* This Source Code Form is subject to the terms of the Mozilla Public | |
* License, v. 2.0. If a copy of the MPL was not distributed with this | |
* file, You can obtain one at http://mozilla.org/MPL/2.0/. | |
* | |
* Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) | |
* Copyright 2014, 2017 (c) Florian Palm | |
* Copyright 2015 (c) Sten Grüner | |
* Copyright 2015 (c) Oleksiy Vasylyev | |
* Copyright 2017 (c) Stefan Profanter, fortiss GmbH | |
*/ | |
_UA_BEGIN_DECLS | |
typedef struct session_list_entry { | |
UA_DelayedCallback cleanupCallback; | |
LIST_ENTRY(session_list_entry) pointers; | |
UA_Session session; | |
} session_list_entry; | |
typedef struct UA_SessionManager { | |
LIST_HEAD(session_list, session_list_entry) sessions; // doubly-linked list of sessions | |
UA_UInt32 currentSessionCount; | |
UA_Server *server; | |
} UA_SessionManager; | |
UA_StatusCode | |
UA_SessionManager_init(UA_SessionManager *sm, UA_Server *server); | |
/* Deletes all sessions */ | |
void UA_SessionManager_deleteMembers(UA_SessionManager *sm); | |
/* Deletes all sessions that have timed out. Deletion is implemented via a | |
* delayed callback. So all currently scheduled jobs with a pointer to the | |
* session can complete. */ | |
void UA_SessionManager_cleanupTimedOut(UA_SessionManager *sm, | |
UA_DateTime nowMonotonic); | |
UA_StatusCode | |
UA_SessionManager_createSession(UA_SessionManager *sm, UA_SecureChannel *channel, | |
const UA_CreateSessionRequest *request, UA_Session **session); | |
UA_StatusCode | |
UA_SessionManager_removeSession(UA_SessionManager *sm, const UA_NodeId *token); | |
UA_Session * | |
UA_SessionManager_getSessionByToken(UA_SessionManager *sm, const UA_NodeId *token); | |
UA_Session * | |
UA_SessionManager_getSessionById(UA_SessionManager *sm, const UA_NodeId *sessionId); | |
_UA_END_DECLS | |
/*********************************** amalgamated original file "E:/Librarys/open62541/src/server/ua_securechannel_manager.h" ***********************************/ | |
/* This Source Code Form is subject to the terms of the Mozilla Public | |
* License, v. 2.0. If a copy of the MPL was not distributed with this | |
* file, You can obtain one at http://mozilla.org/MPL/2.0/. | |
* | |
* Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) | |
* Copyright 2014, 2017 (c) Florian Palm | |
* Copyright 2015 (c) Oleksiy Vasylyev | |
* Copyright 2017 (c) Stefan Profanter, fortiss GmbH | |
*/ | |
_UA_BEGIN_DECLS | |
typedef struct channel_entry { | |
UA_DelayedCallback cleanupCallback; | |
TAILQ_ENTRY(channel_entry) pointers; | |
UA_SecureChannel channel; | |
} channel_entry; | |
typedef struct { | |
TAILQ_HEAD(, channel_entry) channels; // doubly-linked list of channels | |
UA_UInt32 currentChannelCount; | |
UA_UInt32 lastChannelId; | |
UA_UInt32 lastTokenId; | |
UA_Server *server; | |
} UA_SecureChannelManager; | |
UA_StatusCode | |
UA_SecureChannelManager_init(UA_SecureChannelManager *cm, UA_Server *server); | |
/* Remove a all securechannels */ | |
void | |
UA_SecureChannelManager_deleteMembers(UA_SecureChannelManager *cm); | |
/* Remove timed out securechannels with a delayed callback. So all currently | |
* scheduled jobs with a pointer to a securechannel can finish first. */ | |
void | |
UA_SecureChannelManager_cleanupTimedOut(UA_SecureChannelManager *cm, | |
UA_DateTime nowMonotonic); | |
UA_StatusCode | |
UA_SecureChannelManager_create(UA_SecureChannelManager *const cm, UA_Connection *const connection, | |
const UA_SecurityPolicy *const securityPolicy, | |
const UA_AsymmetricAlgorithmSecurityHeader *const asymHeader); | |
UA_StatusCode | |
UA_SecureChannelManager_open(UA_SecureChannelManager *cm, UA_SecureChannel *channel, | |
const UA_OpenSecureChannelRequest *request, | |
UA_OpenSecureChannelResponse *response); | |
UA_StatusCode | |
UA_SecureChannelManager_renew(UA_SecureChannelManager *cm, UA_SecureChannel *channel, | |
const UA_OpenSecureChannelRequest *request, | |
UA_OpenSecureChannelResponse *response); | |
UA_SecureChannel * | |
UA_SecureChannelManager_get(UA_SecureChannelManager *cm, UA_UInt32 channelId); | |
UA_StatusCode | |
UA_SecureChannelManager_close(UA_SecureChannelManager *cm, UA_UInt32 channelId); | |
_UA_END_DECLS | |
/*********************************** amalgamated original file "E:/Librarys/open62541/src/pubsub/ua_pubsub_networkmessage.h" ***********************************/ | |
/* This Source Code Form is subject to the terms of the Mozilla Public | |
* License, v. 2.0. If a copy of the MPL was not distributed with this | |
* file, You can obtain one at http://mozilla.org/MPL/2.0/. | |
* | |
* Copyright (c) 2017 - 2018 Fraunhofer IOSB (Author: Tino Bischoff) | |
* Copyright (c) 2017-2019 Fraunhofer IOSB (Author: Andreas Ebner) | |
*/ | |
_UA_BEGIN_DECLS | |
/* DataSet Payload Header */ | |
typedef struct { | |
UA_Byte count; | |
UA_UInt16* dataSetWriterIds; | |
} UA_DataSetPayloadHeader; | |
/* FieldEncoding Enum */ | |
typedef enum { | |
UA_FIELDENCODING_VARIANT = 0, | |
UA_FIELDENCODING_RAWDATA = 1, | |
UA_FIELDENCODING_DATAVALUE = 2 | |
} UA_FieldEncoding; | |
/* DataSetMessage Type */ | |
typedef enum { | |
UA_DATASETMESSAGE_DATAKEYFRAME = 0, | |
UA_DATASETMESSAGE_DATADELTAFRAME = 1, | |
UA_DATASETMESSAGE_EVENT = 2, | |
UA_DATASETMESSAGE_KEEPALIVE = 3 | |
} UA_DataSetMessageType; | |
/* DataSetMessage Header */ | |
typedef struct { | |
UA_Boolean dataSetMessageValid; | |
UA_FieldEncoding fieldEncoding; | |
UA_Boolean dataSetMessageSequenceNrEnabled; | |
UA_Boolean timestampEnabled; | |
UA_Boolean statusEnabled; | |
UA_Boolean configVersionMajorVersionEnabled; | |
UA_Boolean configVersionMinorVersionEnabled; | |
UA_DataSetMessageType dataSetMessageType; | |
UA_Boolean picoSecondsIncluded; | |
UA_UInt16 dataSetMessageSequenceNr; | |
UA_UtcTime timestamp; | |
UA_UInt16 picoSeconds; | |
UA_UInt16 status; | |
UA_UInt32 configVersionMajorVersion; | |
UA_UInt32 configVersionMinorVersion; | |
} UA_DataSetMessageHeader; | |
UA_StatusCode | |
UA_DataSetMessageHeader_encodeBinary(const UA_DataSetMessageHeader* src, | |
UA_Byte **bufPos, const UA_Byte *bufEnd); | |
UA_StatusCode | |
UA_DataSetMessageHeader_decodeBinary(const UA_ByteString *src, size_t *offset, | |
UA_DataSetMessageHeader* dst); | |
size_t | |
UA_DataSetMessageHeader_calcSizeBinary(const UA_DataSetMessageHeader* p); | |
/**********************************************/ | |
/* Network Message Offsets */ | |
/**********************************************/ | |
/* Offsets for buffered messages in the PubSub fast path. */ | |
typedef enum { | |
UA_PUBSUB_OFFSETTYPE_DATASETMESSAGE_SEQUENCENUMBER, | |
UA_PUBSUB_OFFSETTYPE_NETWORKMESSAGE_SEQUENCENUMBER, | |
UA_PUBSUB_OFFSETTYPE_TIMESTAMP_PICOSECONDS, | |
UA_PUBSUB_OFFSETTYPE_TIMESTAMP, /* source pointer */ | |
UA_PUBSUB_OFFSETTYPE_TIMESTAMP_NOW, /* no source */ | |
UA_PUBSUB_OFFSETTYPE_PAYLOAD_DATAVALUE, | |
UA_PUBSUB_OFFSETTYPE_PAYLOAD_VARIANT, | |
UA_PUBSUB_OFFSETTYPE_PAYLOAD_RAW | |
/* Add more offset types as needed */ | |
} UA_NetworkMessageOffsetType; | |
typedef struct { | |
UA_NetworkMessageOffsetType contentType; | |
union { | |
union { | |
UA_DataValue *value; | |
size_t valueBinarySize; | |
} value; | |
UA_DateTime *timestamp; | |
} offsetData; | |
size_t offset; | |
} UA_NetworkMessageOffset; | |
typedef struct { | |
UA_ByteString buffer; /* The precomputed message buffer */ | |
UA_NetworkMessageOffset *offsets; /* Offsets for changes in the message buffer */ | |
size_t offsetsSize; | |
} UA_NetworkMessageOffsetBuffer; | |
/** | |
* DataSetMessage | |
* ^^^^^^^^^^^^^^ */ | |
typedef struct { | |
UA_UInt16 fieldCount; | |
UA_DataValue* dataSetFields; | |
/* Json keys for the dataSetFields: TODO: own dataSetMessageType for json? */ | |
UA_String* fieldNames; | |
} UA_DataSetMessage_DataKeyFrameData; | |
typedef struct { | |
UA_UInt16 fieldIndex; | |
UA_DataValue fieldValue; | |
} UA_DataSetMessage_DeltaFrameField; | |
typedef struct { | |
UA_UInt16 fieldCount; | |
UA_DataSetMessage_DeltaFrameField* deltaFrameFields; | |
} UA_DataSetMessage_DataDeltaFrameData; | |
typedef struct { | |
UA_DataSetMessageHeader header; | |
union { | |
UA_DataSetMessage_DataKeyFrameData keyFrameData; | |
UA_DataSetMessage_DataDeltaFrameData deltaFrameData; | |
} data; | |
} UA_DataSetMessage; | |
UA_StatusCode | |
UA_DataSetMessage_encodeBinary(const UA_DataSetMessage* src, UA_Byte **bufPos, | |
const UA_Byte *bufEnd); | |
UA_StatusCode | |
UA_DataSetMessage_decodeBinary(const UA_ByteString *src, size_t *offset, | |
UA_DataSetMessage* dst); | |
size_t | |
UA_DataSetMessage_calcSizeBinary(UA_DataSetMessage *p, UA_NetworkMessageOffsetBuffer *offsetBuffer, | |
size_t currentOffset); | |
void UA_DataSetMessage_free(const UA_DataSetMessage* p); | |
typedef struct { | |
UA_UInt16* sizes; | |
UA_DataSetMessage* dataSetMessages; | |
} UA_DataSetPayload; | |
typedef enum { | |
UA_PUBLISHERDATATYPE_BYTE = 0, | |
UA_PUBLISHERDATATYPE_UINT16 = 1, | |
UA_PUBLISHERDATATYPE_UINT32 = 2, | |
UA_PUBLISHERDATATYPE_UINT64 = 3, | |
UA_PUBLISHERDATATYPE_STRING = 4 | |
} UA_PublisherIdDatatype; | |
typedef enum { | |
UA_NETWORKMESSAGE_DATASET = 0, | |
UA_NETWORKMESSAGE_DISCOVERY_REQUEST = 1, | |
UA_NETWORKMESSAGE_DISCOVERY_RESPONSE = 2 | |
} UA_NetworkMessageType; | |
/** | |
* UA_NetworkMessageGroupHeader | |
* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */ | |
typedef struct { | |
UA_Boolean writerGroupIdEnabled; | |
UA_Boolean groupVersionEnabled; | |
UA_Boolean networkMessageNumberEnabled; | |
UA_Boolean sequenceNumberEnabled; | |
UA_UInt16 writerGroupId; | |
UA_UInt32 groupVersion; // spec: type "VersionTime" | |
UA_UInt16 networkMessageNumber; | |
UA_UInt16 sequenceNumber; | |
} UA_NetworkMessageGroupHeader; | |
/** | |
* UA_NetworkMessageSecurityHeader | |
* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */ | |
typedef struct { | |
UA_Boolean networkMessageSigned; | |
UA_Boolean networkMessageEncrypted; | |
UA_Boolean securityFooterEnabled; | |
UA_Boolean forceKeyReset; | |
UA_UInt32 securityTokenId; // spec: IntegerId | |
UA_Byte nonceLength; | |
UA_ByteString messageNonce; | |
UA_UInt16 securityFooterSize; | |
} UA_NetworkMessageSecurityHeader; | |
/** | |
* UA_NetworkMessage | |
* ^^^^^^^^^^^^^^^^^ */ | |
typedef struct { | |
UA_Byte version; | |
UA_Boolean messageIdEnabled; | |
UA_String messageId; /* For Json NetworkMessage */ | |
UA_Boolean publisherIdEnabled; | |
UA_Boolean groupHeaderEnabled; | |
UA_Boolean payloadHeaderEnabled; | |
UA_PublisherIdDatatype publisherIdType; | |
UA_Boolean dataSetClassIdEnabled; | |
UA_Boolean securityEnabled; | |
UA_Boolean timestampEnabled; | |
UA_Boolean picosecondsEnabled; | |
UA_Boolean chunkMessage; | |
UA_Boolean promotedFieldsEnabled; | |
UA_NetworkMessageType networkMessageType; | |
union { | |
UA_Byte publisherIdByte; | |
UA_UInt16 publisherIdUInt16; | |
UA_UInt32 publisherIdUInt32; | |
UA_UInt64 publisherIdUInt64; | |
UA_Guid publisherIdGuid; | |
UA_String publisherIdString; | |
} publisherId; | |
UA_Guid dataSetClassId; | |
UA_NetworkMessageGroupHeader groupHeader; | |
union { | |
UA_DataSetPayloadHeader dataSetPayloadHeader; | |
} payloadHeader; | |
UA_DateTime timestamp; | |
UA_UInt16 picoseconds; | |
UA_UInt16 promotedFieldsSize; | |
UA_Variant* promotedFields; /* BaseDataType */ | |
UA_NetworkMessageSecurityHeader securityHeader; | |
union { | |
UA_DataSetPayload dataSetPayload; | |
} payload; | |
UA_ByteString securityFooter; | |
UA_ByteString signature; | |
} UA_NetworkMessage; | |
UA_StatusCode | |
UA_NetworkMessage_updateBufferedMessage(UA_NetworkMessageOffsetBuffer *buffer); | |
UA_StatusCode | |
UA_NetworkMessage_encodeBinary(const UA_NetworkMessage* src, | |
UA_Byte **bufPos, const UA_Byte *bufEnd); | |
UA_StatusCode | |
UA_NetworkMessage_decodeBinary(const UA_ByteString *src, size_t *offset, | |
UA_NetworkMessage* dst); | |
size_t | |
UA_NetworkMessage_calcSizeBinary(UA_NetworkMessage *p, UA_NetworkMessageOffsetBuffer *offsetBuffer); | |
void | |
UA_NetworkMessage_deleteMembers(UA_NetworkMessage* p); | |
#define UA_NetworkMessage_clear(p) UA_NetworkMessage_deleteMembers(p) | |
void | |
UA_NetworkMessage_delete(UA_NetworkMessage* p); | |
#ifdef UA_ENABLE_JSON_ENCODING | |
UA_StatusCode | |
UA_NetworkMessage_encodeJson(const UA_NetworkMessage *src, | |
UA_Byte **bufPos, const UA_Byte **bufEnd, UA_String *namespaces, | |
size_t namespaceSize, UA_String *serverUris, | |
size_t serverUriSize, UA_Boolean useReversible); | |
size_t | |
UA_NetworkMessage_calcSizeJson(const UA_NetworkMessage *src, | |
UA_String *namespaces, size_t namespaceSize, | |
UA_String *serverUris, size_t serverUriSize, | |
UA_Boolean useReversible); | |
UA_StatusCode UA_NetworkMessage_decodeJson(UA_NetworkMessage *dst, const UA_ByteString *src); | |
#endif | |
_UA_END_DECLS | |
/*********************************** amalgamated original file "E:/Librarys/open62541/src/pubsub/ua_pubsub.h" ***********************************/ | |
/* This Source Code Form is subject to the terms of the Mozilla Public | |
* License, v. 2.0. If a copy of the MPL was not distributed with this | |
* file, You can obtain one at http://mozilla.org/MPL/2.0/. | |
* | |
* Copyright (c) 2017-2018 Fraunhofer IOSB (Author: Andreas Ebner) | |
* Copyright (c) 2019 Kalycito Infotech Private Limited | |
*/ | |
_UA_BEGIN_DECLS | |
#ifdef UA_ENABLE_PUBSUB /* conditional compilation */ | |
/* forward declarations */ | |
struct UA_WriterGroup; | |
typedef struct UA_WriterGroup UA_WriterGroup; | |
/* Declaration for ReaderGroup */ | |
struct UA_ReaderGroup; | |
typedef struct UA_ReaderGroup UA_ReaderGroup; | |
/* The configuration structs (public part of PubSub entities) are defined in include/ua_plugin_pubsub.h */ | |
/**********************************************/ | |
/* PublishedDataSet */ | |
/**********************************************/ | |
typedef struct UA_PublishedDataSet{ | |
UA_PublishedDataSetConfig config; | |
UA_DataSetMetaDataType dataSetMetaData; | |
TAILQ_HEAD(UA_ListOfDataSetField, UA_DataSetField) fields; | |
UA_NodeId identifier; | |
UA_UInt16 fieldSize; | |
UA_UInt16 promotedFieldsCount; | |
UA_UInt16 configurationFreezeCounter; | |
TAILQ_ENTRY(UA_PublishedDataSet) listEntry; | |
} UA_PublishedDataSet; | |
UA_StatusCode | |
UA_PublishedDataSetConfig_copy(const UA_PublishedDataSetConfig *src, UA_PublishedDataSetConfig *dst); | |
UA_PublishedDataSet * | |
UA_PublishedDataSet_findPDSbyId(UA_Server *server, UA_NodeId identifier); | |
void | |
UA_PublishedDataSet_clear(UA_Server *server, UA_PublishedDataSet *publishedDataSet); | |
/**********************************************/ | |
/* Connection */ | |
/**********************************************/ | |
//the connection config (public part of connection) object is defined in include/ua_plugin_pubsub.h | |
typedef struct UA_PubSubConnection{ | |
UA_PubSubConnectionConfig *config; | |
//internal fields | |
UA_PubSubChannel *channel; | |
UA_NodeId identifier; | |
LIST_HEAD(UA_ListOfWriterGroup, UA_WriterGroup) writerGroups; | |
LIST_HEAD(UA_ListOfPubSubReaderGroup, UA_ReaderGroup) readerGroups; | |
size_t readerGroupsSize; | |
TAILQ_ENTRY(UA_PubSubConnection) listEntry; | |
UA_UInt16 configurationFreezeCounter; | |
} UA_PubSubConnection; | |
UA_StatusCode | |
UA_PubSubConnectionConfig_copy(const UA_PubSubConnectionConfig *src, UA_PubSubConnectionConfig *dst); | |
UA_PubSubConnection * | |
UA_PubSubConnection_findConnectionbyId(UA_Server *server, UA_NodeId connectionIdentifier); | |
void | |
UA_PubSubConnectionConfig_clear(UA_PubSubConnectionConfig *connectionConfig); | |
void | |
UA_PubSubConnection_clear(UA_Server *server, UA_PubSubConnection *connection); | |
/* Register channel for given connectionIdentifier */ | |
UA_StatusCode | |
UA_PubSubConnection_regist(UA_Server *server, UA_NodeId *connectionIdentifier); | |
/**********************************************/ | |
/* DataSetWriter */ | |
/**********************************************/ | |
#ifdef UA_ENABLE_PUBSUB_DELTAFRAMES | |
typedef struct UA_DataSetWriterSample{ | |
UA_Boolean valueChanged; | |
UA_DataValue value; | |
} UA_DataSetWriterSample; | |
#endif | |
typedef struct UA_DataSetWriter{ | |
UA_DataSetWriterConfig config; | |
//internal fields | |
LIST_ENTRY(UA_DataSetWriter) listEntry; | |
UA_NodeId identifier; | |
UA_NodeId linkedWriterGroup; | |
UA_NodeId connectedDataSet; | |
UA_ConfigurationVersionDataType connectedDataSetVersion; | |
UA_PubSubState state; | |
#ifdef UA_ENABLE_PUBSUB_DELTAFRAMES | |
UA_UInt16 deltaFrameCounter; //actual count of sent deltaFrames | |
size_t lastSamplesCount; | |
UA_DataSetWriterSample *lastSamples; | |
#endif | |
UA_UInt16 actualDataSetMessageSequenceCount; | |
} UA_DataSetWriter; | |
UA_StatusCode | |
UA_DataSetWriterConfig_copy(const UA_DataSetWriterConfig *src, UA_DataSetWriterConfig *dst); | |
UA_DataSetWriter * | |
UA_DataSetWriter_findDSWbyId(UA_Server *server, UA_NodeId identifier); | |
UA_StatusCode | |
UA_DataSetWriter_setPubSubState(UA_Server *server, UA_PubSubState state, UA_DataSetWriter *dataSetWriter); | |
/**********************************************/ | |
/* WriterGroup */ | |
/**********************************************/ | |
struct UA_WriterGroup{ | |
UA_WriterGroupConfig config; | |
//internal fields | |
LIST_ENTRY(UA_WriterGroup) listEntry; | |
UA_NodeId identifier; | |
UA_PubSubConnection *linkedConnection; | |
LIST_HEAD(UA_ListOfDataSetWriter, UA_DataSetWriter) writers; | |
UA_UInt32 writersCount; | |
UA_UInt64 publishCallbackId; | |
UA_Boolean publishCallbackIsRegistered; | |
UA_PubSubState state; | |
UA_NetworkMessageOffsetBuffer bufferedMessage; | |
UA_UInt16 sequenceNumber; /* Increased after every succressuly sent message */ | |
}; | |
UA_StatusCode | |
UA_WriterGroupConfig_copy(const UA_WriterGroupConfig *src, UA_WriterGroupConfig *dst); | |
UA_WriterGroup * | |
UA_WriterGroup_findWGbyId(UA_Server *server, UA_NodeId identifier); | |
UA_StatusCode | |
UA_WriterGroup_setPubSubState(UA_Server *server, UA_PubSubState state, UA_WriterGroup *writerGroup); | |
/**********************************************/ | |
/* DataSetField */ | |
/**********************************************/ | |
typedef struct UA_DataSetField{ | |
UA_DataSetFieldConfig config; | |
//internal fields | |
TAILQ_ENTRY(UA_DataSetField) listEntry; | |
UA_NodeId identifier; | |
UA_NodeId publishedDataSet; //ref to parent pds | |
UA_FieldMetaData fieldMetaData; | |
UA_UInt64 sampleCallbackId; | |
UA_Boolean sampleCallbackIsRegistered; | |
} UA_DataSetField; | |
UA_StatusCode | |
UA_DataSetFieldConfig_copy(const UA_DataSetFieldConfig *src, UA_DataSetFieldConfig *dst); | |
UA_DataSetField * | |
UA_DataSetField_findDSFbyId(UA_Server *server, UA_NodeId identifier); | |
/**********************************************/ | |
/* DataSetReader */ | |
/**********************************************/ | |
/* SubscribedDataSetDataType Definition */ | |
typedef enum { | |
UA_PUBSUB_SDS_TARGET, | |
UA_PUBSUB_SDS_MIRROR | |
}UA_SubscribedDataSetEnumType; | |
/* DataSetReader Type definition */ | |
typedef struct UA_DataSetReader { | |
UA_DataSetReaderConfig config; | |
/* implementation defined fields */ | |
UA_NodeId identifier; | |
UA_NodeId linkedReaderGroup; | |
LIST_ENTRY(UA_DataSetReader) listEntry; | |
UA_SubscribedDataSetEnumType subscribedDataSetType; | |
UA_TargetVariablesDataType subscribedDataSetTarget; | |
/* To Do UA_SubscribedDataSetMirrorDataType subscribedDataSetMirror */ | |
}UA_DataSetReader; | |
/* Delete DataSetReader */ | |
void UA_DataSetReader_delete(UA_Server *server, UA_DataSetReader *dataSetReader); | |
/* Process Network Message using DataSetReader */ | |
void UA_Server_DataSetReader_process(UA_Server *server, UA_DataSetReader *dataSetReader, UA_DataSetMessage* dataSetMsg); | |
/* Copy the configuration of DataSetReader */ | |
UA_StatusCode UA_DataSetReaderConfig_copy(const UA_DataSetReaderConfig *src, UA_DataSetReaderConfig *dst); | |
/* Add TargetVariables */ | |
UA_StatusCode | |
UA_Server_DataSetReader_addTargetVariables(UA_Server* server, UA_NodeId* parentNode, UA_NodeId dataSetReaderIdentifier, UA_SubscribedDataSetEnumType sdsType); | |
/**********************************************/ | |
/* ReaderGroup */ | |
/**********************************************/ | |
/* ReaderGroup Type Definition*/ | |
struct UA_ReaderGroup { | |
UA_ReaderGroupConfig config; | |
UA_NodeId identifier; | |
UA_NodeId linkedConnection; | |
LIST_ENTRY(UA_ReaderGroup) listEntry; | |
LIST_HEAD(UA_ListOfPubSubDataSetReader, UA_DataSetReader) readers; | |
/* for simplified information access */ | |
UA_UInt32 readersCount; | |
UA_UInt64 subscribeCallbackId; | |
UA_Boolean subscribeCallbackIsRegistered; | |
}; | |
/* Delete ReaderGroup */ | |
void UA_Server_ReaderGroup_delete(UA_Server *server, UA_ReaderGroup *readerGroup); | |
/* Copy configuration of ReaderGroup */ | |
UA_StatusCode | |
UA_ReaderGroupConfig_copy(const UA_ReaderGroupConfig *src, UA_ReaderGroupConfig *dst); | |
/* Process Network Message */ | |
UA_StatusCode | |
UA_Server_processNetworkMessage(UA_Server *server, UA_NetworkMessage* pMsg, UA_PubSubConnection *pConnection); | |
/* Prototypes for internal util functions - some functions maybe removed later | |
*(currently moved from public to internal)*/ | |
UA_ReaderGroup *UA_ReaderGroup_findRGbyId(UA_Server *server, UA_NodeId identifier); | |
UA_DataSetReader *UA_ReaderGroup_findDSRbyId(UA_Server *server, UA_NodeId identifier); | |
/*********************************************************/ | |
/* PublishValues handling */ | |
/*********************************************************/ | |
UA_StatusCode | |
UA_WriterGroup_addPublishCallback(UA_Server *server, UA_WriterGroup *writerGroup); | |
void | |
UA_WriterGroup_publishCallback(UA_Server *server, UA_WriterGroup *writerGroup); | |
/*********************************************************/ | |
/* SubscribeValues handling */ | |
/*********************************************************/ | |
UA_StatusCode | |
UA_ReaderGroup_addSubscribeCallback(UA_Server *server, UA_ReaderGroup *readerGroup); | |
void | |
UA_ReaderGroup_subscribeCallback(UA_Server *server, UA_ReaderGroup *readerGroup); | |
#endif /* UA_ENABLE_PUBSUB */ | |
_UA_END_DECLS | |
/*********************************** amalgamated original file "E:/Librarys/open62541/src/pubsub/ua_pubsub_manager.h" ***********************************/ | |
/* This Source Code Form is subject to the terms of the Mozilla Public | |
* License, v. 2.0. If a copy of the MPL was not distributed with this | |
* file, You can obtain one at http://mozilla.org/MPL/2.0/. | |
* | |
* Copyright (c) 2017-2019 Fraunhofer IOSB (Author: Andreas Ebner) | |
*/ | |
_UA_BEGIN_DECLS | |
#ifdef UA_ENABLE_PUBSUB /* conditional compilation */ | |
typedef struct UA_PubSubManager{ | |
//Connections and PublishedDataSets can exist alone (own lifecycle) -> top level components | |
size_t connectionsSize; | |
TAILQ_HEAD(UA_ListOfPubSubConnection, UA_PubSubConnection) connections; | |
size_t publishedDataSetsSize; | |
TAILQ_HEAD(UA_ListOfPublishedDataSet, UA_PublishedDataSet) publishedDataSets; | |
} UA_PubSubManager; | |
void | |
UA_PubSubManager_delete(UA_Server *server, UA_PubSubManager *pubSubManager); | |
void | |
UA_PubSubManager_generateUniqueNodeId(UA_Server *server, UA_NodeId *nodeId); | |
UA_UInt32 | |
UA_PubSubConfigurationVersionTimeDifference(void); | |
/***********************************/ | |
/* PubSub Jobs abstraction */ | |
/***********************************/ | |
UA_StatusCode | |
UA_PubSubManager_addRepeatedCallback(UA_Server *server, UA_ServerCallback callback, | |
void *data, UA_Double interval_ms, UA_UInt64 *callbackId); | |
UA_StatusCode | |
UA_PubSubManager_changeRepeatedCallbackInterval(UA_Server *server, UA_UInt64 callbackId, | |
UA_Double interval_ms); | |
void | |
UA_PubSubManager_removeRepeatedPubSubCallback(UA_Server *server, UA_UInt64 callbackId); | |
#endif /* UA_ENABLE_PUBSUB */ | |
_UA_END_DECLS | |
/*********************************** amalgamated original file "E:/Librarys/open62541/src/pubsub/ua_pubsub_ns0.h" ***********************************/ | |
/* This Source Code Form is subject to the terms of the Mozilla Public | |
* License, v. 2.0. If a copy of the MPL was not distributed with this | |
* file, You can obtain one at http://mozilla.org/MPL/2.0/. | |
* | |
* Copyright (c) 2017-2018 Fraunhofer IOSB (Author: Andreas Ebner) | |
* Copyright (c) 2019 Kalycito Infotech Private Limited | |
*/ | |
#ifndef UA_PUBSUB_NS0_H_ | |
#define UA_PUBSUB_NS0_H_ | |
_UA_BEGIN_DECLS | |
#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL /* conditional compilation */ | |
UA_StatusCode | |
UA_Server_initPubSubNS0(UA_Server *server); | |
UA_StatusCode | |
addPubSubConnectionRepresentation(UA_Server *server, UA_PubSubConnection *connection); | |
UA_StatusCode | |
removePubSubConnectionRepresentation(UA_Server *server, UA_PubSubConnection *connection); | |
UA_StatusCode | |
addWriterGroupRepresentation(UA_Server *server, UA_WriterGroup *writerGroup); | |
UA_StatusCode | |
addReaderGroupRepresentation(UA_Server *server, UA_ReaderGroup *readerGroup); | |
UA_StatusCode | |
removeGroupRepresentation(UA_Server *server, UA_WriterGroup *writerGroup); | |
UA_StatusCode | |
addDataSetWriterRepresentation(UA_Server *server, UA_DataSetWriter *dataSetWriter); | |
UA_StatusCode | |
removeDataSetWriterRepresentation(UA_Server *server, UA_DataSetWriter *dataSetWriter); | |
UA_StatusCode | |
addPublishedDataItemsRepresentation(UA_Server *server, UA_PublishedDataSet *publishedDataSet); | |
UA_StatusCode | |
removePublishedDataSetRepresentation(UA_Server *server, UA_PublishedDataSet *publishedDataSet); | |
UA_StatusCode | |
addDataSetReaderRepresentation(UA_Server *server, UA_DataSetReader *dataSetReader); | |
UA_StatusCode | |
removeDataSetReaderRepresentation(UA_Server *server, UA_DataSetReader *dataSetReader); | |
#endif /* UA_ENABLE_PUBSUB_INFORMATIONMODEL */ | |
_UA_END_DECLS | |
#endif /* UA_PUBSUB_NS0_H_ */ | |
/*********************************** amalgamated original file "E:/Librarys/open62541/src/server/ua_server_internal.h" ***********************************/ | |
/* This Source Code Form is subject to the terms of the Mozilla Public | |
* License, v. 2.0. If a copy of the MPL was not distributed with this | |
* file, You can obtain one at http://mozilla.org/MPL/2.0/. | |
* | |
* Copyright 2019 (c) Fraunhofer IOSB (Author: Klaus Schick) | |
* Copyright 2014-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) | |
* Copyright 2014, 2017 (c) Florian Palm | |
* Copyright 2015-2016 (c) Sten Grüner | |
* Copyright 2015 (c) Chris Iatrou | |
* Copyright 2015-2016 (c) Oleksiy Vasylyev | |
* Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH | |
* Copyright 2017 (c) Julian Grothoff | |
* Copyright 2019 (c) Kalycito Infotech Private Limited | |
*/ | |
_UA_BEGIN_DECLS | |
#if UA_MULTITHREADING >= 100 | |
#undef UA_THREADSAFE | |
#define UA_THREADSAFE UA_DEPRECATED | |
#endif | |
#ifdef UA_ENABLE_PUBSUB | |
#endif | |
#ifdef UA_ENABLE_DISCOVERY | |
#endif | |
#ifdef UA_ENABLE_SUBSCRIPTIONS | |
typedef struct { | |
UA_MonitoredItem monitoredItem; | |
void *context; | |
union { | |
UA_Server_DataChangeNotificationCallback dataChangeCallback; | |
/* UA_Server_EventNotificationCallback eventCallback; */ | |
} callback; | |
} UA_LocalMonitoredItem; | |
#endif | |
typedef enum { | |
UA_SERVERLIFECYCLE_FRESH, | |
UA_SERVERLIFECYLE_RUNNING | |
} UA_ServerLifecycle; | |
struct UA_Server { | |
/* Config */ | |
UA_ServerConfig config; | |
UA_DateTime startTime; | |
UA_DateTime endTime; /* Zeroed out. If a time is set, then the server shuts | |
* down once the time has been reached */ | |
UA_ServerLifecycle state; | |
/* Security */ | |
UA_SecureChannelManager secureChannelManager; | |
UA_SessionManager sessionManager; | |
#if UA_MULTITHREADING >= 100 | |
UA_AsyncManager asyncManager; | |
#endif | |
UA_Session adminSession; /* Local access to the services (for startup and | |
* maintenance) uses this Session with all possible | |
* access rights (Session Id: 1) */ | |
/* Namespaces */ | |
size_t namespacesSize; | |
UA_String *namespaces; | |
/* Callbacks with a repetition interval */ | |
UA_Timer timer; | |
/* WorkQueue and worker threads */ | |
UA_WorkQueue workQueue; | |
/* For bootstrapping, omit some consistency checks, creating a reference to | |
* the parent and member instantiation */ | |
UA_Boolean bootstrapNS0; | |
/* Discovery */ | |
#ifdef UA_ENABLE_DISCOVERY | |
UA_DiscoveryManager discoveryManager; | |
#endif | |
/* DataChange Subscriptions */ | |
#ifdef UA_ENABLE_SUBSCRIPTIONS | |
/* Num active subscriptions */ | |
UA_UInt32 numSubscriptions; | |
/* Num active monitored items */ | |
UA_UInt32 numMonitoredItems; | |
/* To be cast to UA_LocalMonitoredItem to get the callback and context */ | |
LIST_HEAD(LocalMonitoredItems, UA_MonitoredItem) localMonitoredItems; | |
UA_UInt32 lastLocalMonitoredItemId; | |
#ifdef UA_ENABLE_SUBSCRIPTIONS_ALARMS_CONDITIONS | |
LIST_HEAD(conditionSourcelisthead, UA_ConditionSource_nodeListElement) headConditionSource; | |
#endif//UA_ENABLE_SUBSCRIPTIONS_ALARMS_CONDITIONS | |
#endif | |
/* Publish/Subscribe */ | |
#ifdef UA_ENABLE_PUBSUB | |
UA_PubSubManager pubSubManager; | |
#endif | |
#if UA_MULTITHREADING >= 100 | |
UA_LOCK_TYPE(networkMutex) | |
UA_LOCK_TYPE(serviceMutex) | |
#endif | |
}; | |
/*****************/ | |
/* Node Handling */ | |
/*****************/ | |
/* Deletes references from the node which are not matching any type in the given | |
* array. Could be used to e.g. delete all the references, except | |
* 'HASMODELINGRULE' */ | |
void UA_Node_deleteReferencesSubset(UA_Node *node, size_t referencesSkipSize, | |
UA_NodeId* referencesSkip); | |
/* Calls the callback with the node retrieved from the nodestore on top of the | |
* stack. Either a copy or the original node for in-situ editing. Depends on | |
* multithreading and the nodestore.*/ | |
typedef UA_StatusCode (*UA_EditNodeCallback)(UA_Server*, UA_Session*, | |
UA_Node *node, void*); | |
UA_StatusCode UA_Server_editNode(UA_Server *server, UA_Session *session, | |
const UA_NodeId *nodeId, | |
UA_EditNodeCallback callback, | |
void *data); | |
/*********************/ | |
/* Utility Functions */ | |
/*********************/ | |
/* A few global NodeId definitions */ | |
extern const UA_NodeId subtypeId; | |
extern const UA_NodeId hierarchicalReferences; | |
void setupNs1Uri(UA_Server *server); | |
UA_UInt16 addNamespace(UA_Server *server, const UA_String name); | |
UA_Boolean | |
UA_Node_hasSubTypeOrInstances(const UA_Node *node); | |
/* Recursively searches "upwards" in the tree following specific reference types */ | |
UA_Boolean | |
isNodeInTree(UA_Server *server, const UA_NodeId *leafNode, | |
const UA_NodeId *nodeToFind, const UA_NodeId *referenceTypeIds, | |
size_t referenceTypeIdsSize); | |
/* Returns an array with the hierarchy of nodes. The start nodes can be returned | |
* as well. The returned array starts at the leaf and continues "upwards" or | |
* "downwards". Duplicate entries are removed. The parameter `walkDownwards` | |
* indicates the direction of search. */ | |
UA_StatusCode | |
browseRecursive(UA_Server *server, | |
size_t startNodesSize, const UA_NodeId *startNodes, | |
size_t refTypesSize, const UA_NodeId *refTypes, | |
UA_BrowseDirection browseDirection, UA_Boolean includeStartNodes, | |
size_t *resultsSize, UA_ExpandedNodeId **results); | |
/* If refTypes is non-NULL, tries to realloc and increase the length */ | |
UA_StatusCode | |
referenceSubtypes(UA_Server *server, const UA_NodeId *refType, | |
size_t *refTypesSize, UA_NodeId **refTypes); | |
/* Returns the recursive type and interface hierarchy of the node */ | |
UA_StatusCode | |
getParentTypeAndInterfaceHierarchy(UA_Server *server, const UA_NodeId *typeNode, | |
UA_NodeId **typeHierarchy, size_t *typeHierarchySize); | |
#ifdef UA_ENABLE_SUBSCRIPTIONS_ALARMS_CONDITIONS | |
UA_StatusCode UA_EXPORT | |
UA_getConditionId(UA_Server *server, const UA_NodeId *conditionNodeId, UA_NodeId *outConditionId); | |
void UA_EXPORT | |
UA_ConditionList_delete(UA_Server *server); | |
UA_Boolean | |
isConditionOrBranch(UA_Server *server, | |
const UA_NodeId *condition, | |
const UA_NodeId *conditionSource, | |
UA_Boolean *isCallerAC); | |
#endif//UA_ENABLE_SUBSCRIPTIONS_ALARMS_CONDITIONS | |
/* Returns the type node from the node on the stack top. The type node is pushed | |
* on the stack and returned. */ | |
const UA_Node * getNodeType(UA_Server *server, const UA_Node *node); | |
/* Write a node attribute with a defined session */ | |
UA_StatusCode | |
writeWithSession(UA_Server *server, UA_Session *session, | |
const UA_WriteValue *value); | |
UA_StatusCode | |
sendResponse(UA_SecureChannel *channel, UA_UInt32 requestId, UA_UInt32 requestHandle, | |
UA_ResponseHeader *responseHeader, const UA_DataType *responseType); | |
/* Many services come as an array of operations. This function generalizes the | |
* processing of the operations. */ | |
typedef void (*UA_ServiceOperation)(UA_Server *server, UA_Session *session, | |
const void *context, | |
const void *requestOperation, | |
void *responseOperation); | |
UA_StatusCode | |
UA_Server_processServiceOperations(UA_Server *server, UA_Session *session, | |
UA_ServiceOperation operationCallback, | |
const void *context, | |
const size_t *requestOperations, | |
const UA_DataType *requestOperationsType, | |
size_t *responseOperations, | |
const UA_DataType *responseOperationsType) | |
UA_FUNC_ATTR_WARN_UNUSED_RESULT; | |
/******************************************/ | |
/* Internal function calls, without locks */ | |
/******************************************/ | |
UA_StatusCode | |
deleteNode(UA_Server *server, const UA_NodeId nodeId, | |
UA_Boolean deleteReferences); | |
UA_StatusCode | |
addNode(UA_Server *server, const UA_NodeClass nodeClass, const UA_NodeId *requestedNewNodeId, | |
const UA_NodeId *parentNodeId, const UA_NodeId *referenceTypeId, | |
const UA_QualifiedName browseName, const UA_NodeId *typeDefinition, | |
const UA_NodeAttributes *attr, const UA_DataType *attributeType, | |
void *nodeContext, UA_NodeId *outNewNodeId); | |
UA_StatusCode | |
setVariableNode_dataSource(UA_Server *server, const UA_NodeId nodeId, | |
const UA_DataSource dataSource); | |
UA_StatusCode | |
setMethodNode_callback(UA_Server *server, | |
const UA_NodeId methodNodeId, | |
UA_MethodCallback methodCallback); | |
UA_StatusCode | |
writeAttribute(UA_Server *server, const UA_WriteValue *value); | |
UA_StatusCode | |
writeWithWriteValue(UA_Server *server, const UA_NodeId *nodeId, | |
const UA_AttributeId attributeId, | |
const UA_DataType *attr_type, | |
const void *attr); | |
UA_DataValue | |
readAttribute(UA_Server *server, const UA_ReadValueId *item, | |
UA_TimestampsToReturn timestamps); | |
UA_StatusCode | |
readWithReadValue(UA_Server *server, const UA_NodeId *nodeId, | |
const UA_AttributeId attributeId, void *v); | |
UA_StatusCode | |
readObjectProperty(UA_Server *server, const UA_NodeId objectId, | |
const UA_QualifiedName propertyName, | |
UA_Variant *value); | |
UA_BrowsePathResult | |
translateBrowsePathToNodeIds(UA_Server *server, const UA_BrowsePath *browsePath); | |
#ifdef UA_ENABLE_SUBSCRIPTIONS | |
void | |
monitoredItem_sampleCallback(UA_Server *server, UA_MonitoredItem *monitoredItem); | |
#endif | |
UA_BrowsePathResult | |
browseSimplifiedBrowsePath(UA_Server *server, const UA_NodeId origin, | |
size_t browsePathSize, const UA_QualifiedName *browsePath); | |
UA_StatusCode | |
writeObjectProperty(UA_Server *server, const UA_NodeId objectId, | |
const UA_QualifiedName propertyName, const UA_Variant value); | |
UA_StatusCode | |
getNodeContext(UA_Server *server, UA_NodeId nodeId, void **nodeContext); | |
void | |
removeCallback(UA_Server *server, UA_UInt64 callbackId); | |
UA_StatusCode | |
changeRepeatedCallbackInterval(UA_Server *server, UA_UInt64 callbackId, UA_Double interval_ms); | |
UA_StatusCode | |
addRepeatedCallback(UA_Server *server, UA_ServerCallback callback, | |
void *data, UA_Double interval_ms, UA_UInt64 *callbackId); | |
#ifdef UA_ENABLE_DISCOVERY | |
UA_StatusCode | |
register_server_with_discovery_server(UA_Server *server, | |
void *client, | |
const UA_Boolean isUnregister, | |
const char* semaphoreFilePath); | |
#endif | |
/***************************************/ | |
/* Check Information Model Consistency */ | |
/***************************************/ | |
/* Read a node attribute in the context of a "checked-out" node. So the | |
* attribute will not be copied when possible. The variant then points into the | |
* node and has UA_VARIANT_DATA_NODELETE set. */ | |
void | |
ReadWithNode(const UA_Node *node, UA_Server *server, UA_Session *session, | |
UA_TimestampsToReturn timestampsToReturn, | |
const UA_ReadValueId *id, UA_DataValue *v); | |
UA_StatusCode | |
readValueAttribute(UA_Server *server, UA_Session *session, | |
const UA_VariableNode *vn, UA_DataValue *v); | |
/* Test whether the value matches a variable definition given by | |
* - datatype | |
* - valueranke | |
* - array dimensions. | |
* Sometimes it can be necessary to transform the content of the value, e.g. | |
* byte array to bytestring or uint32 to some enum. If editableValue is non-NULL, | |
* we try to create a matching variant that points to the original data. */ | |
UA_Boolean | |
compatibleValue(UA_Server *server, UA_Session *session, const UA_NodeId *targetDataTypeId, | |
UA_Int32 targetValueRank, size_t targetArrayDimensionsSize, | |
const UA_UInt32 *targetArrayDimensions, const UA_Variant *value, | |
const UA_NumericRange *range); | |
UA_Boolean | |
compatibleArrayDimensions(size_t constraintArrayDimensionsSize, | |
const UA_UInt32 *constraintArrayDimensions, | |
size_t testArrayDimensionsSize, | |
const UA_UInt32 *testArrayDimensions); | |
UA_Boolean | |
compatibleValueArrayDimensions(const UA_Variant *value, size_t targetArrayDimensionsSize, | |
const UA_UInt32 *targetArrayDimensions); | |
UA_Boolean | |
compatibleValueRankArrayDimensions(UA_Server *server, UA_Session *session, | |
UA_Int32 valueRank, size_t arrayDimensionsSize); | |
UA_Boolean | |
compatibleDataType(UA_Server *server, const UA_NodeId *dataType, | |
const UA_NodeId *constraintDataType, UA_Boolean isValue); | |
UA_Boolean | |
compatibleValueRanks(UA_Int32 valueRank, UA_Int32 constraintValueRank); | |
struct BrowseOpts { | |
UA_UInt32 maxReferences; | |
UA_Boolean recursive; | |
}; | |
void | |
Operation_Browse(UA_Server *server, UA_Session *session, const UA_UInt32 *maxrefs, | |
const UA_BrowseDescription *descr, UA_BrowseResult *result); | |
UA_DataValue | |
UA_Server_readWithSession(UA_Server *server, UA_Session *session, | |
const UA_ReadValueId *item, | |
UA_TimestampsToReturn timestampsToReturn); | |
/*****************************/ | |
/* AddNodes Begin and Finish */ | |
/*****************************/ | |
/* Creates a new node in the nodestore. */ | |
UA_StatusCode | |
AddNode_raw(UA_Server *server, UA_Session *session, void *nodeContext, | |
const UA_AddNodesItem *item, UA_NodeId *outNewNodeId); | |
/* Check the reference to the parent node; Add references. */ | |
UA_StatusCode | |
AddNode_addRefs(UA_Server *server, UA_Session *session, const UA_NodeId *nodeId, | |
const UA_NodeId *parentNodeId, const UA_NodeId *referenceTypeId, | |
const UA_NodeId *typeDefinitionId); | |
/* Type-check type-definition; Run the constructors */ | |
UA_StatusCode | |
AddNode_finish(UA_Server *server, UA_Session *session, const UA_NodeId *nodeId); | |
/**********************/ | |
/* Create Namespace 0 */ | |
/**********************/ | |
UA_StatusCode UA_Server_initNS0(UA_Server *server); | |
UA_StatusCode writeNs0VariableArray(UA_Server *server, UA_UInt32 id, void *v, | |
size_t length, const UA_DataType *type); | |
/***************************/ | |
/* Nodestore Access Macros */ | |
/***************************/ | |
#define UA_NODESTORE_NEW(server, nodeClass) \ | |
server->config.nodestore.newNode(server->config.nodestore.context, nodeClass) | |
#define UA_NODESTORE_DELETE(server, node) \ | |
server->config.nodestore.deleteNode(server->config.nodestore.context, node) | |
#define UA_NODESTORE_GET(server, nodeid) \ | |
server->config.nodestore.getNode(server->config.nodestore.context, nodeid) | |
#define UA_NODESTORE_RELEASE(server, node) \ | |
server->config.nodestore.releaseNode(server->config.nodestore.context, node) | |
#define UA_NODESTORE_GETCOPY(server, nodeid, outnode) \ | |
server->config.nodestore.getNodeCopy(server->config.nodestore.context, \ | |
nodeid, outnode) | |
#define UA_NODESTORE_INSERT(server, node, addedNodeId) \ | |
server->config.nodestore.insertNode(server->config.nodestore.context, \ | |
node, addedNodeId) | |
#define UA_NODESTORE_REPLACE(server, node) \ | |
server->config.nodestore.replaceNode(server->config.nodestore.context, node) | |
#define UA_NODESTORE_REMOVE(server, nodeId) \ | |
server->config.nodestore.removeNode(server->config.nodestore.context, nodeId) | |
_UA_END_DECLS | |
/*********************************** amalgamated original file "E:/Librarys/open62541/src/server/ua_services.h" ***********************************/ | |
/* This Source Code Form is subject to the terms of the Mozilla Public | |
* License, v. 2.0. If a copy of the MPL was not distributed with this | |
* file, You can obtain one at http://mozilla.org/MPL/2.0/. | |
* | |
* Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) | |
* Copyright 2014-2017 (c) Florian Palm | |
* Copyright 2015 (c) Sten Grüner | |
* Copyright 2014 (c) LEvertz | |
* Copyright 2015 (c) Chris Iatrou | |
* Copyright 2015 (c) Christian Fimmers | |
* Copyright 2015-2016 (c) Oleksiy Vasylyev | |
* Copyright 2017 (c) Stefan Profanter, fortiss GmbH | |
*/ | |
_UA_BEGIN_DECLS | |
/** | |
* .. _services: | |
* | |
* Services | |
* ======== | |
* | |
* In OPC UA, all communication is based on service calls, each consisting of a | |
* request and a response message. These messages are defined as data structures | |
* with a binary encoding and listed in :ref:`generated-types`. Since all | |
* Services are pre-defined in the standard, they cannot be modified by the | |
* user. But you can use the :ref:`Call <method-services>` service to invoke | |
* user-defined methods on the server. | |
* | |
* The following service signatures are internal and *not visible to users*. | |
* Still, we present them here for an overview of the capabilities of OPC UA. | |
* Please refer to the :ref:`client` and :ref:`server` API where the services | |
* are exposed to end users. Please see part 4 of the OPC UA standard for the | |
* authoritative definition of the service and their behaviour. | |
* | |
* Most services take as input the server, the current session and pointers to | |
* the request and response structures. Possible error codes are returned as | |
* part of the response. */ | |
typedef void (*UA_Service)(UA_Server*, UA_Session*, | |
const void *request, void *response); | |
/** | |
* Discovery Service Set | |
* --------------------- | |
* This Service Set defines Services used to discover the Endpoints implemented | |
* by a Server and to read the security configuration for those Endpoints. | |
* | |
* FindServers Service | |
* ^^^^^^^^^^^^^^^^^^^ | |
* Returns the Servers known to a Server or Discovery Server. The Client may | |
* reduce the number of results returned by specifying filter criteria */ | |
void Service_FindServers(UA_Server *server, UA_Session *session, | |
const UA_FindServersRequest *request, | |
UA_FindServersResponse *response); | |
/** | |
* GetEndpoints Service | |
* ^^^^^^^^^^^^^^^^^^^^ | |
* Returns the Endpoints supported by a Server and all of the configuration | |
* information required to establish a SecureChannel and a Session. */ | |
void Service_GetEndpoints(UA_Server *server, UA_Session *session, | |
const UA_GetEndpointsRequest *request, | |
UA_GetEndpointsResponse *response); | |
#ifdef UA_ENABLE_DISCOVERY | |
# ifdef UA_ENABLE_DISCOVERY_MULTICAST | |
/** | |
* FindServersOnNetwork Service | |
* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
* Returns the Servers known to a Discovery Server. Unlike FindServer, | |
* this Service is only implemented by Discovery Servers. It additionally | |
* returns servers which may have been detected through Multicast. */ | |
void Service_FindServersOnNetwork(UA_Server *server, UA_Session *session, | |
const UA_FindServersOnNetworkRequest *request, | |
UA_FindServersOnNetworkResponse *response); | |
# endif /* UA_ENABLE_DISCOVERY_MULTICAST */ | |
/** | |
* RegisterServer | |
* ^^^^^^^^^^^^^^ | |
* Registers a remote server in the local discovery service. */ | |
void Service_RegisterServer(UA_Server *server, UA_Session *session, | |
const UA_RegisterServerRequest *request, | |
UA_RegisterServerResponse *response); | |
/** | |
* RegisterServer2 | |
* ^^^^^^^^^^^^^^^ | |
* This Service allows a Server to register its DiscoveryUrls and capabilities | |
* with a Discovery Server. It extends the registration information from | |
* RegisterServer with information necessary for FindServersOnNetwork. */ | |
void Service_RegisterServer2(UA_Server *server, UA_Session *session, | |
const UA_RegisterServer2Request *request, | |
UA_RegisterServer2Response *response); | |
#endif /* UA_ENABLE_DISCOVERY */ | |
/** | |
* SecureChannel Service Set | |
* ------------------------- | |
* This Service Set defines Services used to open a communication channel that | |
* ensures the confidentiality and Integrity of all Messages exchanged with the | |
* Server. | |
* | |
* OpenSecureChannel Service | |
* ^^^^^^^^^^^^^^^^^^^^^^^^^ | |
* Open or renew a SecureChannel that can be used to ensure Confidentiality and | |
* Integrity for Message exchange during a Session. */ | |
void Service_OpenSecureChannel(UA_Server *server, UA_SecureChannel* channel, | |
const UA_OpenSecureChannelRequest *request, | |
UA_OpenSecureChannelResponse *response); | |
/** | |
* CloseSecureChannel Service | |
* ^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
* Used to terminate a SecureChannel. */ | |
void Service_CloseSecureChannel(UA_Server *server, UA_SecureChannel *channel); | |
/** | |
* Session Service Set | |
* ------------------- | |
* This Service Set defines Services for an application layer connection | |
* establishment in the context of a Session. | |
* | |
* CreateSession Service | |
* ^^^^^^^^^^^^^^^^^^^^^ | |
* Used by an OPC UA Client to create a Session and the Server returns two | |
* values which uniquely identify the Session. The first value is the sessionId | |
* which is used to identify the Session in the audit logs and in the Server's | |
* address space. The second is the authenticationToken which is used to | |
* associate an incoming request with a Session. */ | |
void Service_CreateSession(UA_Server *server, UA_SecureChannel *channel, | |
const UA_CreateSessionRequest *request, | |
UA_CreateSessionResponse *response); | |
/** | |
* ActivateSession | |
* ^^^^^^^^^^^^^^^ | |
* Used by the Client to submit its SoftwareCertificates to the Server for | |
* validation and to specify the identity of the user associated with the | |
* Session. This Service request shall be issued by the Client before it issues | |
* any other Service request after CreateSession. Failure to do so shall cause | |
* the Server to close the Session. */ | |
void Service_ActivateSession(UA_Server *server, UA_SecureChannel *channel, | |
UA_Session *session, | |
const UA_ActivateSessionRequest *request, | |
UA_ActivateSessionResponse *response); | |
/** | |
* CloseSession | |
* ^^^^^^^^^^^^ | |
* Used to terminate a Session. */ | |
void Service_CloseSession(UA_Server *server, UA_Session *session, | |
const UA_CloseSessionRequest *request, | |
UA_CloseSessionResponse *response); | |
/** | |
* Cancel Service | |
* ^^^^^^^^^^^^^^ | |
* Used to cancel outstanding Service requests. Successfully cancelled service | |
* requests shall respond with Bad_RequestCancelledByClient. */ | |
/* Not Implemented */ | |
/** | |
* NodeManagement Service Set | |
* -------------------------- | |
* This Service Set defines Services to add and delete AddressSpace Nodes and | |
* References between them. All added Nodes continue to exist in the | |
* AddressSpace even if the Client that created them disconnects from the | |
* Server. | |
* | |
* AddNodes Service | |
* ^^^^^^^^^^^^^^^^ | |
* Used to add one or more Nodes into the AddressSpace hierarchy. */ | |
void Service_AddNodes(UA_Server *server, UA_Session *session, | |
const UA_AddNodesRequest *request, | |
UA_AddNodesResponse *response); | |
/** | |
* AddReferences Service | |
* ^^^^^^^^^^^^^^^^^^^^^ | |
* Used to add one or more References to one or more Nodes. */ | |
void Service_AddReferences(UA_Server *server, UA_Session *session, | |
const UA_AddReferencesRequest *request, | |
UA_AddReferencesResponse *response); | |
/** | |
* DeleteNodes Service | |
* ^^^^^^^^^^^^^^^^^^^ | |
* Used to delete one or more Nodes from the AddressSpace. */ | |
void Service_DeleteNodes(UA_Server *server, UA_Session *session, | |
const UA_DeleteNodesRequest *request, | |
UA_DeleteNodesResponse *response); | |
/** | |
* DeleteReferences | |
* ^^^^^^^^^^^^^^^^ | |
* Used to delete one or more References of a Node. */ | |
void Service_DeleteReferences(UA_Server *server, UA_Session *session, | |
const UA_DeleteReferencesRequest *request, | |
UA_DeleteReferencesResponse *response); | |
/** | |
* .. _view-services: | |
* | |
* View Service Set | |
* ---------------- | |
* Clients use the browse Services of the View Service Set to navigate through | |
* the AddressSpace or through a View which is a subset of the AddressSpace. | |
* | |
* Browse Service | |
* ^^^^^^^^^^^^^^ | |
* Used to discover the References of a specified Node. The browse can be | |
* further limited by the use of a View. This Browse Service also supports a | |
* primitive filtering capability. */ | |
void Service_Browse(UA_Server *server, UA_Session *session, | |
const UA_BrowseRequest *request, | |
UA_BrowseResponse *response); | |
/** | |
* BrowseNext Service | |
* ^^^^^^^^^^^^^^^^^^ | |
* Used to request the next set of Browse or BrowseNext response information | |
* that is too large to be sent in a single response. "Too large" in this | |
* context means that the Server is not able to return a larger response or that | |
* the number of results to return exceeds the maximum number of results to | |
* return that was specified by the Client in the original Browse request. */ | |
void Service_BrowseNext(UA_Server *server, UA_Session *session, | |
const UA_BrowseNextRequest *request, | |
UA_BrowseNextResponse *response); | |
/** | |
* TranslateBrowsePathsToNodeIds Service | |
* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
* Used to translate textual node paths to their respective ids. */ | |
void Service_TranslateBrowsePathsToNodeIds(UA_Server *server, UA_Session *session, | |
const UA_TranslateBrowsePathsToNodeIdsRequest *request, | |
UA_TranslateBrowsePathsToNodeIdsResponse *response); | |
/** | |
* RegisterNodes Service | |
* ^^^^^^^^^^^^^^^^^^^^^ | |
* Used by Clients to register the Nodes that they know they will access | |
* repeatedly (e.g. Write, Call). It allows Servers to set up anything needed so | |
* that the access operations will be more efficient. */ | |
void Service_RegisterNodes(UA_Server *server, UA_Session *session, | |
const UA_RegisterNodesRequest *request, | |
UA_RegisterNodesResponse *response); | |
/** | |
* UnregisterNodes Service | |
* ^^^^^^^^^^^^^^^^^^^^^^^ | |
* This Service is used to unregister NodeIds that have been obtained via the | |
* RegisterNodes service. */ | |
void Service_UnregisterNodes(UA_Server *server, UA_Session *session, | |
const UA_UnregisterNodesRequest *request, | |
UA_UnregisterNodesResponse *response); | |
/** | |
* Query Service Set | |
* ----------------- | |
* This Service Set is used to issue a Query to a Server. OPC UA Query is | |
* generic in that it provides an underlying storage mechanism independent Query | |
* capability that can be used to access a wide variety of OPC UA data stores | |
* and information management systems. OPC UA Query permits a Client to access | |
* data maintained by a Server without any knowledge of the logical schema used | |
* for internal storage of the data. Knowledge of the AddressSpace is | |
* sufficient. | |
* | |
* QueryFirst Service | |
* ^^^^^^^^^^^^^^^^^^ | |
* This Service is used to issue a Query request to the Server. */ | |
/* Not Implemented */ | |
/** | |
* QueryNext Service | |
* ^^^^^^^^^^^^^^^^^ | |
* This Service is used to request the next set of QueryFirst or QueryNext | |
* response information that is too large to be sent in a single response. */ | |
/* Not Impelemented */ | |
/** | |
* Attribute Service Set | |
* --------------------- | |
* This Service Set provides Services to access Attributes that are part of | |
* Nodes. | |
* | |
* Read Service | |
* ^^^^^^^^^^^^ | |
* Used to read attributes of nodes. For constructed attribute values whose | |
* elements are indexed, such as an array, this Service allows Clients to read | |
* the entire set of indexed values as a composite, to read individual elements | |
* or to read ranges of elements of the composite. */ | |
void Service_Read(UA_Server *server, UA_Session *session, | |
const UA_ReadRequest *request, UA_ReadResponse *response); | |
/** | |
* Write Service | |
* ^^^^^^^^^^^^^ | |
* Used to write attributes of nodes. For constructed attribute values whose | |
* elements are indexed, such as an array, this Service allows Clients to write | |
* the entire set of indexed values as a composite, to write individual elements | |
* or to write ranges of elements of the composite. */ | |
void Service_Write(UA_Server *server, UA_Session *session, | |
const UA_WriteRequest *request, UA_WriteResponse *response); | |
/** | |
* HistoryRead Service | |
* ^^^^^^^^^^^^^^^^^^^ | |
* Used to read historical values or Events of one or more Nodes. Servers may | |
* make historical values available to Clients using this Service, although the | |
* historical values themselves are not visible in the AddressSpace. */ | |
#ifdef UA_ENABLE_HISTORIZING | |
void Service_HistoryRead(UA_Server *server, UA_Session *session, | |
const UA_HistoryReadRequest *request, | |
UA_HistoryReadResponse *response); | |
/** | |
* HistoryUpdate Service | |
* ^^^^^^^^^^^^^^^^^^^^^ | |
* Used to update historical values or Events of one or more Nodes. Several | |
* request parameters indicate how the Server is to update the historical value | |
* or Event. Valid actions are Insert, Replace or Delete. */ | |
void | |
Service_HistoryUpdate(UA_Server *server, UA_Session *session, | |
const UA_HistoryUpdateRequest *request, | |
UA_HistoryUpdateResponse *response); | |
#endif | |
/** | |
* .. _method-services: | |
* | |
* Method Service Set | |
* ------------------ | |
* The Method Service Set defines the means to invoke methods. A method shall be | |
* a component of an Object. See the section on :ref:`MethodNodes <methodnode>` | |
* for more information. | |
* | |
* Call Service | |
* ^^^^^^^^^^^^ | |
* Used to call (invoke) a methods. Each method call is invoked within the | |
* context of an existing Session. If the Session is terminated, the results of | |
* the method's execution cannot be returned to the Client and are discarded. */ | |
#ifdef UA_ENABLE_METHODCALLS | |
void Service_Call(UA_Server *server, UA_Session *session, | |
const UA_CallRequest *request, | |
UA_CallResponse *response); | |
# if UA_MULTITHREADING >= 100 | |
void Service_CallAsync(UA_Server *server, UA_Session *session, UA_UInt32 requestId, | |
const UA_CallRequest *request, UA_CallResponse *response, | |
UA_Boolean *finished); | |
#endif | |
#endif | |
#ifdef UA_ENABLE_SUBSCRIPTIONS | |
/** | |
* MonitoredItem Service Set | |
* ------------------------- | |
* Clients define MonitoredItems to subscribe to data and Events. Each | |
* MonitoredItem identifies the item to be monitored and the Subscription to use | |
* to send Notifications. The item to be monitored may be any Node Attribute. | |
* | |
* CreateMonitoredItems Service | |
* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
* Used to create and add one or more MonitoredItems to a Subscription. A | |
* MonitoredItem is deleted automatically by the Server when the Subscription is | |
* deleted. Deleting a MonitoredItem causes its entire set of triggered item | |
* links to be deleted, but has no effect on the MonitoredItems referenced by | |
* the triggered items. */ | |
void Service_CreateMonitoredItems(UA_Server *server, UA_Session *session, | |
const UA_CreateMonitoredItemsRequest *request, | |
UA_CreateMonitoredItemsResponse *response); | |
/** | |
* DeleteMonitoredItems Service | |
* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
* Used to remove one or more MonitoredItems of a Subscription. When a | |
* MonitoredItem is deleted, its triggered item links are also deleted. */ | |
void Service_DeleteMonitoredItems(UA_Server *server, UA_Session *session, | |
const UA_DeleteMonitoredItemsRequest *request, | |
UA_DeleteMonitoredItemsResponse *response); | |
/** | |
* ModifyMonitoredItems Service | |
* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
* Used to modify MonitoredItems of a Subscription. Changes to the MonitoredItem | |
* settings shall be applied immediately by the Server. They take effect as soon | |
* as practical but not later than twice the new revisedSamplingInterval. | |
* | |
* Illegal request values for parameters that can be revised do not generate | |
* errors. Instead the server will choose default values and indicate them in | |
* the corresponding revised parameter. */ | |
void Service_ModifyMonitoredItems(UA_Server *server, UA_Session *session, | |
const UA_ModifyMonitoredItemsRequest *request, | |
UA_ModifyMonitoredItemsResponse *response); | |
/** | |
* SetMonitoringMode Service | |
* ^^^^^^^^^^^^^^^^^^^^^^^^^ | |
* Used to set the monitoring mode for one or more MonitoredItems of a | |
* Subscription. */ | |
void Service_SetMonitoringMode(UA_Server *server, UA_Session *session, | |
const UA_SetMonitoringModeRequest *request, | |
UA_SetMonitoringModeResponse *response); | |
/** | |
* SetTriggering Service | |
* ^^^^^^^^^^^^^^^^^^^^^ | |
* Used to create and delete triggering links for a triggering item. */ | |
/* Not Implemented */ | |
/** | |
* Subscription Service Set | |
* ------------------------ | |
* Subscriptions are used to report Notifications to the Client. | |
* | |
* CreateSubscription Service | |
* ^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
* Used to create a Subscription. Subscriptions monitor a set of MonitoredItems | |
* for Notifications and return them to the Client in response to Publish | |
* requests. */ | |
void Service_CreateSubscription(UA_Server *server, UA_Session *session, | |
const UA_CreateSubscriptionRequest *request, | |
UA_CreateSubscriptionResponse *response); | |
/** | |
* ModifySubscription Service | |
* ^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
* Used to modify a Subscription. */ | |
void Service_ModifySubscription(UA_Server *server, UA_Session *session, | |
const UA_ModifySubscriptionRequest *request, | |
UA_ModifySubscriptionResponse *response); | |
/** | |
* SetPublishingMode Service | |
* ^^^^^^^^^^^^^^^^^^^^^^^^^ | |
* Used to enable sending of Notifications on one or more Subscriptions. */ | |
void Service_SetPublishingMode(UA_Server *server, UA_Session *session, | |
const UA_SetPublishingModeRequest *request, | |
UA_SetPublishingModeResponse *response); | |
/** | |
* Publish Service | |
* ^^^^^^^^^^^^^^^ | |
* Used for two purposes. First, it is used to acknowledge the receipt of | |
* NotificationMessages for one or more Subscriptions. Second, it is used to | |
* request the Server to return a NotificationMessage or a keep-alive | |
* Message. | |
* | |
* Note that the service signature is an exception and does not contain a | |
* pointer to a PublishResponse. That is because the service queues up publish | |
* requests internally and sends responses asynchronously based on timeouts. */ | |
void Service_Publish(UA_Server *server, UA_Session *session, | |
const UA_PublishRequest *request, UA_UInt32 requestId); | |
/** | |
* Republish Service | |
* ^^^^^^^^^^^^^^^^^ | |
* Requests the Subscription to republish a NotificationMessage from its | |
* retransmission queue. */ | |
void Service_Republish(UA_Server *server, UA_Session *session, | |
const UA_RepublishRequest *request, | |
UA_RepublishResponse *response); | |
/** | |
* DeleteSubscriptions Service | |
* ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
* Invoked to delete one or more Subscriptions that belong to the Client's | |
* Session. */ | |
void Service_DeleteSubscriptions(UA_Server *server, UA_Session *session, | |
const UA_DeleteSubscriptionsRequest *request, | |
UA_DeleteSubscriptionsResponse *response); | |
/** | |
* TransferSubscription Service | |
* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
* Used to transfer a Subscription and its MonitoredItems from one Session to | |
* another. For example, a Client may need to reopen a Session and then transfer | |
* its Subscriptions to that Session. It may also be used by one Client to take | |
* over a Subscription from another Client by transferring the Subscription to | |
* its Session. */ | |
/* Not Implemented */ | |
#endif /* UA_ENABLE_SUBSCRIPTIONS */ | |
_UA_END_DECLS | |
/*********************************** amalgamated original file "E:/Librarys/open62541/src/client/ua_client_internal.h" ***********************************/ | |
/* This Source Code Form is subject to the terms of the Mozilla Public | |
* License, v. 2.0. If a copy of the MPL was not distributed with this | |
* file, You can obtain one at http://mozilla.org/MPL/2.0/. | |
* | |
* Copyright 2015-2016 (c) Sten Grüner | |
* Copyright 2015-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) | |
* Copyright 2015 (c) Oleksiy Vasylyev | |
* Copyright 2016-2017 (c) Florian Palm | |
* Copyright 2017 (c) Stefan Profanter, fortiss GmbH | |
* Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB | |
*/ | |
#define UA_INTERNAL | |
_UA_BEGIN_DECLS | |
/**************************/ | |
/* Subscriptions Handling */ | |
/**************************/ | |
#ifdef UA_ENABLE_SUBSCRIPTIONS | |
typedef struct UA_Client_NotificationsAckNumber { | |
LIST_ENTRY(UA_Client_NotificationsAckNumber) listEntry; | |
UA_SubscriptionAcknowledgement subAck; | |
} UA_Client_NotificationsAckNumber; | |
typedef struct UA_Client_MonitoredItem { | |
LIST_ENTRY(UA_Client_MonitoredItem) listEntry; | |
UA_UInt32 monitoredItemId; | |
UA_UInt32 clientHandle; | |
void *context; | |
UA_Client_DeleteMonitoredItemCallback deleteCallback; | |
union { | |
UA_Client_DataChangeNotificationCallback dataChangeCallback; | |
UA_Client_EventNotificationCallback eventCallback; | |
} handler; | |
UA_Boolean isEventMonitoredItem; /* Otherwise a DataChange MoniitoredItem */ | |
} UA_Client_MonitoredItem; | |
typedef struct UA_Client_Subscription { | |
LIST_ENTRY(UA_Client_Subscription) listEntry; | |
UA_UInt32 subscriptionId; | |
void *context; | |
UA_Double publishingInterval; | |
UA_UInt32 maxKeepAliveCount; | |
UA_Client_StatusChangeNotificationCallback statusChangeCallback; | |
UA_Client_DeleteSubscriptionCallback deleteCallback; | |
UA_UInt32 sequenceNumber; | |
UA_DateTime lastActivity; | |
LIST_HEAD(UA_ListOfClientMonitoredItems, UA_Client_MonitoredItem) monitoredItems; | |
} UA_Client_Subscription; | |
void | |
UA_Client_Subscriptions_clean(UA_Client *client); | |
void | |
UA_Client_MonitoredItem_remove(UA_Client *client, UA_Client_Subscription *sub, | |
UA_Client_MonitoredItem *mon); | |
void | |
UA_Client_Subscriptions_processPublishResponse(UA_Client *client, | |
UA_PublishRequest *request, | |
UA_PublishResponse *response); | |
UA_StatusCode | |
UA_Client_preparePublishRequest(UA_Client *client, UA_PublishRequest *request); | |
UA_StatusCode | |
UA_Client_Subscriptions_backgroundPublish(UA_Client *client); | |
void | |
UA_Client_Subscriptions_backgroundPublishInactivityCheck(UA_Client *client); | |
#endif /* UA_ENABLE_SUBSCRIPTIONS */ | |
/**************/ | |
/* Encryption */ | |
/**************/ | |
UA_StatusCode | |
signActivateSessionRequest(UA_SecureChannel *channel, | |
UA_ActivateSessionRequest *request); | |
/**********/ | |
/* Client */ | |
/**********/ | |
typedef struct AsyncServiceCall { | |
LIST_ENTRY(AsyncServiceCall) pointers; | |
UA_UInt32 requestId; | |
UA_ClientAsyncServiceCallback callback; | |
const UA_DataType *responseType; | |
void *userdata; | |
UA_DateTime start; | |
UA_UInt32 timeout; | |
void *responsedata; | |
} AsyncServiceCall; | |
void UA_Client_AsyncService_cancel(UA_Client *client, AsyncServiceCall *ac, | |
UA_StatusCode statusCode); | |
void UA_Client_AsyncService_removeAll(UA_Client *client, UA_StatusCode statusCode); | |
typedef struct CustomCallback { | |
LIST_ENTRY(CustomCallback) | |
pointers; | |
//to find the correct callback | |
UA_UInt32 callbackId; | |
UA_ClientAsyncServiceCallback userCallback; | |
void *userData; | |
bool isAsync; | |
void *clientData; | |
} CustomCallback; | |
struct UA_Client { | |
/* State */ | |
UA_ClientState state; | |
UA_ClientConfig config; | |
UA_Timer timer; | |
UA_StatusCode connectStatus; | |
/* Connection */ | |
UA_Connection connection; | |
/* SecureChannel */ | |
UA_SecureChannel channel; | |
UA_UInt32 requestId; | |
UA_DateTime nextChannelRenewal; | |
/* Session */ | |
UA_NodeId authenticationToken; | |
UA_UInt32 requestHandle; | |
UA_Boolean endpointsHandshake; | |
UA_String endpointUrl; /* Only for the async connect */ | |
/* Async Service */ | |
AsyncServiceCall asyncConnectCall; | |
LIST_HEAD(ListOfAsyncServiceCall, AsyncServiceCall) asyncServiceCalls; | |
/*When using highlevel functions these are the callbacks that can be accessed by the user*/ | |
LIST_HEAD(ListOfCustomCallback, CustomCallback) customCallbacks; | |
/* Work queue */ | |
UA_WorkQueue workQueue; | |
/* Subscriptions */ | |
#ifdef UA_ENABLE_SUBSCRIPTIONS | |
UA_UInt32 monitoredItemHandles; | |
LIST_HEAD(, UA_Client_NotificationsAckNumber) pendingNotificationsAcks; | |
LIST_HEAD(, UA_Client_Subscription) subscriptions; | |
UA_UInt16 currentlyOutStandingPublishRequests; | |
#endif | |
/* Connectivity check */ | |
UA_DateTime lastConnectivityCheck; | |
UA_Boolean pendingConnectivityCheck; | |
}; | |
static UA_INLINE CustomCallback * | |
UA_Client_findCustomCallback(UA_Client *client, UA_UInt32 requestId) { | |
CustomCallback *cc; | |
LIST_FOREACH(cc, &client->customCallbacks, pointers) { | |
if(cc->callbackId == requestId) | |
break; | |
} | |
return cc; | |
} | |
void | |
setClientState(UA_Client *client, UA_ClientState state); | |
/* The endpointUrl must be set in the configuration. If the complete | |
* endpointdescription is not set, a GetEndpoints is performed. */ | |
UA_StatusCode | |
UA_Client_connectInternal(UA_Client *client, const UA_String endpointUrl); | |
UA_StatusCode | |
UA_Client_connectTCPSecureChannel(UA_Client *client, const UA_String endpointUrl); | |
UA_StatusCode | |
UA_Client_connectSession(UA_Client *client); | |
UA_StatusCode | |
UA_Client_getEndpointsInternal(UA_Client *client, const UA_String endpointUrl, | |
size_t *endpointDescriptionsSize, | |
UA_EndpointDescription **endpointDescriptions); | |
/* Receive and process messages until a synchronous message arrives or the | |
* timout finishes */ | |
UA_StatusCode | |
receivePacketAsync(UA_Client *client); | |
UA_StatusCode | |
processACKResponseAsync(void *application, UA_Connection *connection, | |
UA_ByteString *chunk); | |
UA_StatusCode | |
processOPNResponseAsync(void *application, UA_Connection *connection, | |
UA_ByteString *chunk); | |
UA_StatusCode | |
openSecureChannel(UA_Client *client, UA_Boolean renew); | |
UA_StatusCode | |
receiveServiceResponse(UA_Client *client, void *response, | |
const UA_DataType *responseType, UA_DateTime maxDate, | |
const UA_UInt32 *synchronousRequestId); | |
UA_StatusCode | |
receiveServiceResponseAsync(UA_Client *client, void *response, | |
const UA_DataType *responseType); | |
UA_StatusCode | |
UA_Client_connect_iterate (UA_Client *client); | |
void | |
setUserIdentityPolicyId(const UA_EndpointDescription *endpoint, | |
const UA_DataType *tokenType, | |
UA_String *policyId, UA_String *securityPolicyUri); | |
UA_SecurityPolicy * | |
getSecurityPolicy(UA_Client *client, UA_String policyUri); | |
UA_StatusCode | |
encryptUserIdentityToken(UA_Client *client, const UA_String *userTokenSecurityPolicy, | |
UA_ExtensionObject *userIdentityToken); | |
_UA_END_DECLS | |
/*********************************** amalgamated original file "E:/Librarys/open62541/src/server/ua_server_async.h" ***********************************/ | |
/* This Source Code Form is subject to the terms of the Mozilla Public | |
* License, v. 2.0. If a copy of the MPL was not distributed with this | |
* file, You can obtain one at http://mozilla.org/MPL/2.0/. | |
* | |
* Copyright 2019 (c) Fraunhofer IOSB (Author: Klaus Schick) | |
* based on | |
* Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) | |
* Copyright 2014, 2017 (c) Florian Palm | |
* Copyright 2015 (c) Sten Grüner | |
* Copyright 2015 (c) Oleksiy Vasylyev | |
* Copyright 2017 (c) Stefan Profanter, fortiss GmbH | |
*/ | |
_UA_BEGIN_DECLS | |
#if UA_MULTITHREADING >= 100 | |
struct UA_AsyncResponse; | |
typedef struct UA_AsyncResponse UA_AsyncResponse; | |
/* A single operation (of a larger request) */ | |
typedef struct UA_AsyncOperation { | |
TAILQ_ENTRY(UA_AsyncOperation) pointers; | |
UA_CallMethodRequest request; | |
UA_CallMethodResult response; | |
size_t index; /* Index of the operation in the array of ops in | |
* request/response */ | |
UA_AsyncResponse *parent; /* Always non-NULL. The parent is only removed | |
* when its operations are removed */ | |
} UA_AsyncOperation; | |
struct UA_AsyncResponse { | |
TAILQ_ENTRY(UA_AsyncResponse) pointers; /* Insert new at the end */ | |
UA_UInt32 requestId; | |
UA_NodeId sessionId; | |
UA_UInt32 requestHandle; | |
UA_DateTime timeout; | |
UA_AsyncOperationType operationType; | |
union { | |
UA_CallResponse callResponse; | |
UA_ReadResponse readResponse; | |
UA_WriteResponse writeResponse; | |
} response; | |
UA_UInt32 opCountdown; /* Counter for outstanding operations. The AR can | |
* only be deleted when all have returned. */ | |
}; | |
typedef TAILQ_HEAD(UA_AsyncOperationQueue, UA_AsyncOperation) UA_AsyncOperationQueue; | |
typedef struct { | |
/* Requests / Responses */ | |
TAILQ_HEAD(, UA_AsyncResponse) asyncResponses; | |
size_t asyncResponsesCount; | |
/* Operations for the workers. The queues are all FIFO: Put in at the tail, | |
* take out at the head.*/ | |
UA_LOCK_TYPE(queueLock) | |
UA_AsyncOperationQueue newQueue; /* New operations for the workers */ | |
UA_AsyncOperationQueue dispatchedQueue; /* Operations taken by a worker. When a result is | |
* returned, we search for the op here to see if it | |
* is still "alive" (not timed out). */ | |
UA_AsyncOperationQueue resultQueue; /* Results to be integrated */ | |
size_t opsCount; /* How many operations are transient (in one of the three queues)? */ | |
UA_UInt64 checkTimeoutCallbackId; /* Registered repeated callbacks */ | |
} UA_AsyncManager; | |
void UA_AsyncManager_init(UA_AsyncManager *am, UA_Server *server); | |
void UA_AsyncManager_clear(UA_AsyncManager *am, UA_Server *server); | |
UA_StatusCode | |
UA_AsyncManager_createAsyncResponse(UA_AsyncManager *am, UA_Server *server, | |
const UA_NodeId *sessionId, | |
const UA_UInt32 requestId, | |
const UA_UInt32 requestHandle, | |
const UA_AsyncOperationType operationType, | |
UA_AsyncResponse **outAr); | |
/* Only remove the AsyncResponse when the operation count is zero */ | |
void | |
UA_AsyncManager_removeAsyncResponse(UA_AsyncManager *am, UA_AsyncResponse *ar); | |
UA_StatusCode | |
UA_AsyncManager_createAsyncOp(UA_AsyncManager *am, UA_Server *server, | |
UA_AsyncResponse *ar, size_t opIndex, | |
const UA_CallMethodRequest *opRequest); | |
typedef void (*UA_AsyncServiceOperation)(UA_Server *server, UA_Session *session, | |
UA_UInt32 requestId, UA_UInt32 requestHandle, | |
size_t opIndex, const void *requestOperation, | |
void *responseOperation, UA_AsyncResponse **ar); | |
/* Creates an AsyncResponse in-situ when an async operation is encountered. If | |
* that is the case, the sync responses are moved to the AsyncResponse. */ | |
UA_StatusCode | |
UA_Server_processServiceOperationsAsync(UA_Server *server, UA_Session *session, | |
UA_UInt32 requestId, UA_UInt32 requestHandle, | |
UA_AsyncServiceOperation operationCallback, | |
const size_t *requestOperations, | |
const UA_DataType *requestOperationsType, | |
size_t *responseOperations, | |
const UA_DataType *responseOperationsType, | |
UA_AsyncResponse **ar) | |
UA_FUNC_ATTR_WARN_UNUSED_RESULT; | |
#endif /* UA_MULTITHREADING >= 100 */ | |
_UA_END_DECLS | |
/*********************************** amalgamated original file "E:/Librarys/open62541/build32/src_generated/open62541/namespace0_generated.h" ***********************************/ | |
/* WARNING: This is a generated file. | |
* Any manual changes will be overwritten. */ | |
#ifndef NAMESPACE0_GENERATED_H_ | |
#define NAMESPACE0_GENERATED_H_ | |
#ifdef UA_ENABLE_AMALGAMATION | |
/* The following declarations are in the open62541.c file so here's needed when compiling nodesets externally */ | |
# ifndef UA_INTERNAL //this definition is needed to hide this code in the amalgamated .c file | |
typedef UA_StatusCode (*UA_exchangeEncodeBuffer)(void *handle, UA_Byte **bufPos, | |
const UA_Byte **bufEnd); | |
UA_StatusCode | |
UA_encodeBinary(const void *src, const UA_DataType *type, | |
UA_Byte **bufPos, const UA_Byte **bufEnd, | |
UA_exchangeEncodeBuffer exchangeCallback, | |
void *exchangeHandle) UA_FUNC_ATTR_WARN_UNUSED_RESULT; | |
UA_StatusCode | |
UA_decodeBinary(const UA_ByteString *src, size_t *offset, void *dst, | |
const UA_DataType *type, size_t customTypesSize, | |
const UA_DataType *customTypes) UA_FUNC_ATTR_WARN_UNUSED_RESULT; | |
size_t | |
UA_calcSizeBinary(void *p, const UA_DataType *type); | |
const UA_DataType * | |
UA_findDataTypeByBinary(const UA_NodeId *typeId); | |
# endif // UA_INTERNAL | |
#else // UA_ENABLE_AMALGAMATION | |
#endif | |
_UA_BEGIN_DECLS | |
extern UA_StatusCode namespace0_generated(UA_Server *server); | |
_UA_END_DECLS | |
#endif /* NAMESPACE0_GENERATED_H_ */ | |
/*********************************** amalgamated original file "E:/Librarys/open62541/src/ua_types.c" ***********************************/ | |
/* This Source Code Form is subject to the terms of the Mozilla Public | |
* License, v. 2.0. If a copy of the MPL was not distributed with this | |
* file, You can obtain one at http://mozilla.org/MPL/2.0/. | |
* | |
* Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) | |
* Copyright 2014, 2016-2017 (c) Florian Palm | |
* Copyright 2014-2016 (c) Sten Grüner | |
* Copyright 2014 (c) Leon Urbas | |
* Copyright 2015 (c) Chris Iatrou | |
* Copyright 2015 (c) Markus Graube | |
* Copyright 2015 (c) Reza Ebrahimi | |
* Copyright 2015-2016 (c) Oleksiy Vasylyev | |
* Copyright 2017 (c) Stefan Profanter, fortiss GmbH | |
* Copyright 2016 (c) Lorenz Haas | |
*/ | |
/* Datatype Handling | |
* ----------------- | |
* This file contains handling functions for the builtin types and functions | |
* handling of structured types and arrays. These need type descriptions in a | |
* UA_DataType structure. The UA_DataType structures as well as all non-builtin | |
* datatypes are autogenerated. */ | |
/* Global definition of NULL type instances. These are always zeroed out, as | |
* mandated by the C/C++ standard for global values with no initializer. */ | |
const UA_String UA_STRING_NULL = {0, NULL}; | |
const UA_ByteString UA_BYTESTRING_NULL = {0, NULL}; | |
const UA_Guid UA_GUID_NULL = {0, 0, 0, {0,0,0,0,0,0,0,0}}; | |
const UA_NodeId UA_NODEID_NULL = {0, UA_NODEIDTYPE_NUMERIC, {0}}; | |
const UA_ExpandedNodeId UA_EXPANDEDNODEID_NULL = {{0, UA_NODEIDTYPE_NUMERIC, {0}}, {0, NULL}, 0}; | |
typedef UA_StatusCode (*UA_copySignature)(const void *src, void *dst, | |
const UA_DataType *type); | |
typedef void (*UA_clearSignature)(void *p, const UA_DataType *type); | |
extern const UA_copySignature copyJumpTable[UA_DATATYPEKINDS]; | |
extern const UA_clearSignature clearJumpTable[UA_DATATYPEKINDS]; | |
/* TODO: The standard-defined types are ordered. See if binary search is | |
* more efficient. */ | |
const UA_DataType * | |
UA_findDataType(const UA_NodeId *typeId) { | |
if(typeId->identifierType != UA_NODEIDTYPE_NUMERIC) | |
return NULL; | |
/* Always look in built-in types first | |
* (may contain data types from all namespaces) */ | |
for(size_t i = 0; i < UA_TYPES_COUNT; ++i) { | |
if(UA_TYPES[i].typeId.identifier.numeric == typeId->identifier.numeric | |
&& UA_TYPES[i].typeId.namespaceIndex == typeId->namespaceIndex) | |
return &UA_TYPES[i]; | |
} | |
/* TODO When other namespace look in custom types, too, requires access to custom types array here! */ | |
/*if(typeId->namespaceIndex != 0) { | |
size_t customTypesArraySize; | |
const UA_DataType *customTypesArray; | |
UA_getCustomTypes(&customTypesArraySize, &customTypesArray); | |
for(size_t i = 0; i < customTypesArraySize; ++i) { | |
if(customTypesArray[i].typeId.identifier.numeric == typeId->identifier.numeric | |
&& customTypesArray[i].typeId.namespaceIndex == typeId->namespaceIndex) | |
return &customTypesArray[i]; | |
} | |
}*/ | |
return NULL; | |
} | |
/***************************/ | |
/* Random Number Generator */ | |
/***************************/ | |
//TODO is this safe for multithreading? | |
static pcg32_random_t UA_rng = PCG32_INITIALIZER; | |
void | |
UA_random_seed(u64 seed) { | |
pcg32_srandom_r(&UA_rng, seed, (u64)UA_DateTime_now()); | |
} | |
u32 | |
UA_UInt32_random(void) { | |
return (u32)pcg32_random_r(&UA_rng); | |
} | |
/*****************/ | |
/* Builtin Types */ | |
/*****************/ | |
UA_String | |
UA_String_fromChars(const char *src) { | |
UA_String s; s.length = 0; s.data = NULL; | |
if(!src) | |
return s; | |
s.length = strlen(src); | |
if(s.length > 0) { | |
s.data = (u8*)UA_malloc(s.length); | |
if(!s.data) { | |
s.length = 0; | |
return s; | |
} | |
memcpy(s.data, src, s.length); | |
} else { | |
s.data = (u8*)UA_EMPTY_ARRAY_SENTINEL; | |
} | |
return s; | |
} | |
UA_Boolean | |
UA_String_equal(const UA_String *s1, const UA_String *s2) { | |
if(s1->length != s2->length) | |
return false; | |
if(s1->length == 0) | |
return true; | |
i32 is = memcmp((char const*)s1->data, | |
(char const*)s2->data, s1->length); | |
return (is == 0) ? true : false; | |
} | |
static UA_StatusCode | |
String_copy(UA_String const *src, UA_String *dst, const UA_DataType *_) { | |
UA_StatusCode retval = UA_Array_copy(src->data, src->length, (void**)&dst->data, | |
&UA_TYPES[UA_TYPES_BYTE]); | |
if(retval == UA_STATUSCODE_GOOD) | |
dst->length = src->length; | |
return retval; | |
} | |
static void | |
String_clear(UA_String *s, const UA_DataType *_) { | |
UA_Array_delete(s->data, s->length, &UA_TYPES[UA_TYPES_BYTE]); | |
} | |
/* QualifiedName */ | |
static UA_StatusCode | |
QualifiedName_copy(const UA_QualifiedName *src, UA_QualifiedName *dst, const UA_DataType *_) { | |
dst->namespaceIndex = src->namespaceIndex; | |
return String_copy(&src->name, &dst->name, NULL); | |
} | |
static void | |
QualifiedName_clear(UA_QualifiedName *p, const UA_DataType *_) { | |
String_clear(&p->name, NULL); | |
} | |
UA_Boolean | |
UA_QualifiedName_equal(const UA_QualifiedName *qn1, | |
const UA_QualifiedName *qn2) { | |
if(qn1 == NULL || qn2 == NULL) | |
return false; | |
if(qn1->namespaceIndex != qn2->namespaceIndex) | |
return false; | |
if(qn1->name.length != qn2->name.length) | |
return false; | |
return (memcmp((char const*)qn1->name.data, | |
(char const*)qn2->name.data, qn1->name.length) == 0); | |
} | |
/* DateTime */ | |
UA_DateTimeStruct | |
UA_DateTime_toStruct(UA_DateTime t) { | |
/* Calculating the the milli-, micro- and nanoseconds */ | |
UA_DateTimeStruct dateTimeStruct; | |
if(t >= 0) { | |
dateTimeStruct.nanoSec = (u16)((t % 10) * 100); | |
dateTimeStruct.microSec = (u16)((t % 10000) / 10); | |
dateTimeStruct.milliSec = (u16)((t % 10000000) / 10000); | |
} else { | |
dateTimeStruct.nanoSec = (u16)(((t % 10 + t) % 10) * 100); | |
dateTimeStruct.microSec = (u16)(((t % 10000 + t) % 10000) / 10); | |
dateTimeStruct.milliSec = (u16)(((t % 10000000 + t) % 10000000) / 10000); | |
} | |
/* Calculating the unix time with #include <time.h> */ | |
long long secSinceUnixEpoch = (long long)(t / UA_DATETIME_SEC) | |
- (long long)(UA_DATETIME_UNIX_EPOCH / UA_DATETIME_SEC); | |
struct mytm ts; | |
memset(&ts, 0, sizeof(struct mytm)); | |
__secs_to_tm(secSinceUnixEpoch, &ts); | |
dateTimeStruct.sec = (u16)ts.tm_sec; | |
dateTimeStruct.min = (u16)ts.tm_min; | |
dateTimeStruct.hour = (u16)ts.tm_hour; | |
dateTimeStruct.day = (u16)ts.tm_mday; | |
dateTimeStruct.month = (u16)(ts.tm_mon + 1); | |
dateTimeStruct.year = (u16)(ts.tm_year + 1900); | |
return dateTimeStruct; | |
} | |
UA_DateTime | |
UA_DateTime_fromStruct(UA_DateTimeStruct ts) { | |
/* Seconds since the Unix epoch */ | |
struct mytm tm; | |
memset(&tm, 0, sizeof(struct mytm)); | |
tm.tm_year = ts.year - 1900; | |
tm.tm_mon = ts.month - 1; | |
tm.tm_mday = ts.day; | |
tm.tm_hour = ts.hour; | |
tm.tm_min = ts.min; | |
tm.tm_sec = ts.sec; | |
long long sec_epoch = __tm_to_secs(&tm); | |
UA_DateTime t = UA_DATETIME_UNIX_EPOCH; | |
t += sec_epoch * UA_DATETIME_SEC; | |
t += ts.milliSec * UA_DATETIME_MSEC; | |
t += ts.microSec * UA_DATETIME_USEC; | |
t += ts.nanoSec / 100; | |
return t; | |
} | |
/* Guid */ | |
UA_Boolean | |
UA_Guid_equal(const UA_Guid *g1, const UA_Guid *g2) { | |
if(memcmp(g1, g2, sizeof(UA_Guid)) == 0) | |
return true; | |
return false; | |
} | |
UA_Guid | |
UA_Guid_random(void) { | |
UA_Guid result; | |
result.data1 = (u32)pcg32_random_r(&UA_rng); | |
u32 r = (u32)pcg32_random_r(&UA_rng); | |
result.data2 = (u16) r; | |
result.data3 = (u16) (r >> 16); | |
r = (u32)pcg32_random_r(&UA_rng); | |
result.data4[0] = (u8)r; | |
result.data4[1] = (u8)(r >> 4); | |
result.data4[2] = (u8)(r >> 8); | |
result.data4[3] = (u8)(r >> 12); | |
r = (u32)pcg32_random_r(&UA_rng); | |
result.data4[4] = (u8)r; | |
result.data4[5] = (u8)(r >> 4); | |
result.data4[6] = (u8)(r >> 8); | |
result.data4[7] = (u8)(r >> 12); | |
return result; | |
} | |
/* ByteString */ | |
UA_StatusCode | |
UA_ByteString_allocBuffer(UA_ByteString *bs, size_t length) { | |
UA_ByteString_init(bs); | |
if(length == 0) | |
return UA_STATUSCODE_GOOD; | |
bs->data = (u8*)UA_malloc(length); | |
if(!bs->data) | |
return UA_STATUSCODE_BADOUTOFMEMORY; | |
bs->length = length; | |
return UA_STATUSCODE_GOOD; | |
} | |
/* NodeId */ | |
static void | |
NodeId_clear(UA_NodeId *p, const UA_DataType *_) { | |
switch(p->identifierType) { | |
case UA_NODEIDTYPE_STRING: | |
case UA_NODEIDTYPE_BYTESTRING: | |
String_clear(&p->identifier.string, NULL); | |
break; | |
default: break; | |
} | |
} | |
static UA_StatusCode | |
NodeId_copy(UA_NodeId const *src, UA_NodeId *dst, const UA_DataType *_) { | |
UA_StatusCode retval = UA_STATUSCODE_GOOD; | |
switch(src->identifierType) { | |
case UA_NODEIDTYPE_NUMERIC: | |
*dst = *src; | |
return UA_STATUSCODE_GOOD; | |
case UA_NODEIDTYPE_STRING: | |
retval |= UA_String_copy(&src->identifier.string, | |
&dst->identifier.string); | |
break; | |
case UA_NODEIDTYPE_GUID: | |
retval |= UA_Guid_copy(&src->identifier.guid, &dst->identifier.guid); | |
break; | |
case UA_NODEIDTYPE_BYTESTRING: | |
retval |= UA_ByteString_copy(&src->identifier.byteString, | |
&dst->identifier.byteString); | |
break; | |
default: | |
return UA_STATUSCODE_BADINTERNALERROR; | |
} | |
dst->namespaceIndex = src->namespaceIndex; | |
dst->identifierType = src->identifierType; | |
return retval; | |
} | |
UA_Boolean | |
UA_NodeId_isNull(const UA_NodeId *p) { | |
if(p->namespaceIndex != 0) | |
return false; | |
switch (p->identifierType) { | |
case UA_NODEIDTYPE_NUMERIC: | |
return (p->identifier.numeric == 0); | |
case UA_NODEIDTYPE_STRING: | |
return UA_String_equal(&p->identifier.string, &UA_STRING_NULL); | |
case UA_NODEIDTYPE_GUID: | |
return UA_Guid_equal(&p->identifier.guid, &UA_GUID_NULL); | |
case UA_NODEIDTYPE_BYTESTRING: | |
return UA_ByteString_equal(&p->identifier.byteString, &UA_BYTESTRING_NULL); | |
} | |
return false; | |
} | |
/* Absolute ordering for NodeIds */ | |
UA_Order | |
UA_NodeId_order(const UA_NodeId *n1, const UA_NodeId *n2) { | |
/* Compare namespaceIndex */ | |
if(n1->namespaceIndex < n2->namespaceIndex) | |
return UA_ORDER_LESS; | |
if(n1->namespaceIndex > n2->namespaceIndex) | |
return UA_ORDER_MORE; | |
/* Compare identifierType */ | |
if(n1->identifierType < n2->identifierType) | |
return UA_ORDER_LESS; | |
if(n1->identifierType > n2->identifierType) | |
return UA_ORDER_MORE; | |
/* Compare the identifier */ | |
switch(n1->identifierType) { | |
case UA_NODEIDTYPE_NUMERIC: | |
if(n1->identifier.numeric < n2->identifier.numeric) | |
return UA_ORDER_LESS; | |
if(n1->identifier.numeric > n2->identifier.numeric) | |
return UA_ORDER_MORE; | |
break; | |
case UA_NODEIDTYPE_GUID: | |
if(n1->identifier.guid.data1 < n2->identifier.guid.data1) { | |
return UA_ORDER_LESS; | |
} else if(n1->identifier.guid.data1 > n2->identifier.guid.data1) { | |
return UA_ORDER_MORE; | |
} else if(n1->identifier.guid.data2 < n2->identifier.guid.data2) { | |
return UA_ORDER_LESS; | |
} else if(n1->identifier.guid.data2 > n2->identifier.guid.data2) { | |
return UA_ORDER_MORE; | |
} else if(n1->identifier.guid.data3 < n2->identifier.guid.data3) { | |
return UA_ORDER_LESS; | |
} else if(n1->identifier.guid.data3 > n2->identifier.guid.data3) { | |
return UA_ORDER_MORE; | |
} else { | |
int cmp = memcmp(n1->identifier.guid.data4, n2->identifier.guid.data4, 8); | |
if(cmp < 0) return UA_ORDER_LESS; | |
if(cmp > 0) return UA_ORDER_MORE; | |
} | |
break; | |
case UA_NODEIDTYPE_STRING: | |
case UA_NODEIDTYPE_BYTESTRING: { | |
size_t minLength = UA_MIN(n1->identifier.string.length, n2->identifier.string.length); | |
int cmp = strncmp((const char*)n1->identifier.string.data, | |
(const char*)n2->identifier.string.data, | |
minLength); | |
if(cmp < 0) | |
return UA_ORDER_LESS; | |
if(cmp > 0) | |
return UA_ORDER_MORE; | |
if(n1->identifier.string.length < n2->identifier.string.length) | |
return UA_ORDER_LESS; | |
if(n1->identifier.string.length > n2->identifier.string.length) | |
return UA_ORDER_MORE; | |
break; | |
} | |
default: | |
break; | |
} | |
return UA_ORDER_EQ; | |
} | |
/* FNV non-cryptographic hash function. See | |
* https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function */ | |
#define FNV_PRIME_32 16777619 | |
u32 | |
UA_ByteString_hash(u32 fnv, const u8 *buf, size_t size) { | |
for(size_t i = 0; i < size; ++i) { | |
fnv = fnv ^ (buf[i]); | |
fnv = fnv * FNV_PRIME_32; | |
} | |
return fnv; | |
} | |
u32 | |
UA_NodeId_hash(const UA_NodeId *n) { | |
switch(n->identifierType) { | |
case UA_NODEIDTYPE_NUMERIC: | |
default: | |
// shift knuth multiplication to use highest 32 bits and after addition make sure we don't have an integer overflow | |
return (u32)((n->namespaceIndex + ((n->identifier.numeric * (u64)2654435761) >> (32))) & UINT32_C(4294967295)); /* Knuth's multiplicative hashing */ | |
case UA_NODEIDTYPE_STRING: | |
case UA_NODEIDTYPE_BYTESTRING: | |
return UA_ByteString_hash(n->namespaceIndex, n->identifier.string.data, n->identifier.string.length); | |
case UA_NODEIDTYPE_GUID: | |
return UA_ByteString_hash(n->namespaceIndex, (const u8*)&n->identifier.guid, sizeof(UA_Guid)); | |
} | |
} | |
/* ExpandedNodeId */ | |
static void | |
ExpandedNodeId_clear(UA_ExpandedNodeId *p, const UA_DataType *_) { | |
NodeId_clear(&p->nodeId, _); | |
String_clear(&p->namespaceUri, NULL); | |
} | |
static UA_StatusCode | |
ExpandedNodeId_copy(UA_ExpandedNodeId const *src, UA_ExpandedNodeId *dst, | |
const UA_DataType *_) { | |
UA_StatusCode retval = NodeId_copy(&src->nodeId, &dst->nodeId, NULL); | |
retval |= UA_String_copy(&src->namespaceUri, &dst->namespaceUri); | |
dst->serverIndex = src->serverIndex; | |
return retval; | |
} | |
UA_Order | |
UA_ExpandedNodeId_order(const UA_ExpandedNodeId *n1, | |
const UA_ExpandedNodeId *n2) { | |
if(n1->serverIndex > n2->serverIndex) | |
return UA_ORDER_MORE; | |
if(n1->serverIndex < n2->serverIndex) | |
return UA_ORDER_LESS; | |
if(n1->namespaceUri.length > 0) { | |
if(n1->namespaceUri.length > n2->namespaceUri.length) | |
return UA_ORDER_MORE; | |
if(n1->namespaceUri.length < n2->namespaceUri.length) | |
return UA_ORDER_LESS; | |
int cmp = strncmp((const char*)n1->namespaceUri.data, | |
(const char*)n2->namespaceUri.data, | |
n1->namespaceUri.length); | |
if(cmp < 0) | |
return UA_ORDER_LESS; | |
if(cmp > 0) | |
return UA_ORDER_MORE; | |
} | |
return UA_NodeId_order(&n1->nodeId, &n2->nodeId); | |
} | |
u32 | |
UA_ExpandedNodeId_hash(const UA_ExpandedNodeId *n) { | |
u32 h = UA_NodeId_hash(&n->nodeId); | |
h = UA_ByteString_hash(h, (const UA_Byte*)&n->serverIndex, 4); | |
return UA_ByteString_hash(h, n->namespaceUri.data, n->namespaceUri.length); | |
} | |
/* ExtensionObject */ | |
static void | |
ExtensionObject_clear(UA_ExtensionObject *p, const UA_DataType *_) { | |
switch(p->encoding) { | |
case UA_EXTENSIONOBJECT_ENCODED_NOBODY: | |
case UA_EXTENSIONOBJECT_ENCODED_BYTESTRING: | |
case UA_EXTENSIONOBJECT_ENCODED_XML: | |
NodeId_clear(&p->content.encoded.typeId, NULL); | |
String_clear(&p->content.encoded.body, NULL); | |
break; | |
case UA_EXTENSIONOBJECT_DECODED: | |
if(p->content.decoded.data) | |
UA_delete(p->content.decoded.data, p->content.decoded.type); | |
break; | |
default: | |
break; | |
} | |
} | |
static UA_StatusCode | |
ExtensionObject_copy(UA_ExtensionObject const *src, UA_ExtensionObject *dst, | |
const UA_DataType *_) { | |
UA_StatusCode retval = UA_STATUSCODE_GOOD; | |
switch(src->encoding) { | |
case UA_EXTENSIONOBJECT_ENCODED_NOBODY: | |
case UA_EXTENSIONOBJECT_ENCODED_BYTESTRING: | |
case UA_EXTENSIONOBJECT_ENCODED_XML: | |
dst->encoding = src->encoding; | |
retval = NodeId_copy(&src->content.encoded.typeId, | |
&dst->content.encoded.typeId, NULL); | |
retval |= UA_ByteString_copy(&src->content.encoded.body, | |
&dst->content.encoded.body); | |
break; | |
case UA_EXTENSIONOBJECT_DECODED: | |
case UA_EXTENSIONOBJECT_DECODED_NODELETE: | |
if(!src->content.decoded.type || !src->content.decoded.data) | |
return UA_STATUSCODE_BADINTERNALERROR; | |
dst->encoding = UA_EXTENSIONOBJECT_DECODED; | |
dst->content.decoded.type = src->content.decoded.type; | |
retval = UA_Array_copy(src->content.decoded.data, 1, | |
&dst->content.decoded.data, src->content.decoded.type); | |
break; | |
default: | |
break; | |
} | |
return retval; | |
} | |
/* Variant */ | |
static void | |
Variant_clear(UA_Variant *p, const UA_DataType *_) { | |
if(p->storageType != UA_VARIANT_DATA) | |
return; | |
if(p->type && p->data > UA_EMPTY_ARRAY_SENTINEL) { | |
if(p->arrayLength == 0) | |
p->arrayLength = 1; | |
UA_Array_delete(p->data, p->arrayLength, p->type); | |
p->data = NULL; | |
} | |
if((void*)p->arrayDimensions > UA_EMPTY_ARRAY_SENTINEL) | |
UA_free(p->arrayDimensions); | |
} | |
static UA_StatusCode | |
Variant_copy(UA_Variant const *src, UA_Variant *dst, const UA_DataType *_) { | |
size_t length = src->arrayLength; | |
if(UA_Variant_isScalar(src)) | |
length = 1; | |
UA_StatusCode retval = UA_Array_copy(src->data, length, | |
&dst->data, src->type); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
dst->arrayLength = src->arrayLength; | |
dst->type = src->type; | |
if(src->arrayDimensions) { | |
retval = UA_Array_copy(src->arrayDimensions, src->arrayDimensionsSize, | |
(void**)&dst->arrayDimensions, &UA_TYPES[UA_TYPES_INT32]); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
dst->arrayDimensionsSize = src->arrayDimensionsSize; | |
} | |
return UA_STATUSCODE_GOOD; | |
} | |
void | |
UA_Variant_setScalar(UA_Variant *v, void * UA_RESTRICT p, | |
const UA_DataType *type) { | |
UA_Variant_init(v); | |
v->type = type; | |
v->arrayLength = 0; | |
v->data = p; | |
} | |
UA_StatusCode | |
UA_Variant_setScalarCopy(UA_Variant *v, const void *p, | |
const UA_DataType *type) { | |
void *n = UA_malloc(type->memSize); | |
if(!n) | |
return UA_STATUSCODE_BADOUTOFMEMORY; | |
UA_StatusCode retval = UA_copy(p, n, type); | |
if(retval != UA_STATUSCODE_GOOD) { | |
UA_free(n); | |
//cppcheck-suppress memleak | |
return retval; | |
} | |
UA_Variant_setScalar(v, n, type); | |
//cppcheck-suppress memleak | |
return UA_STATUSCODE_GOOD; | |
} | |
void UA_Variant_setArray(UA_Variant *v, void * UA_RESTRICT array, | |
size_t arraySize, const UA_DataType *type) { | |
UA_Variant_init(v); | |
v->data = array; | |
v->arrayLength = arraySize; | |
v->type = type; | |
} | |
UA_StatusCode | |
UA_Variant_setArrayCopy(UA_Variant *v, const void *array, | |
size_t arraySize, const UA_DataType *type) { | |
UA_Variant_init(v); | |
UA_StatusCode retval = UA_Array_copy(array, arraySize, &v->data, type); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
v->arrayLength = arraySize; | |
v->type = type; | |
return UA_STATUSCODE_GOOD; | |
} | |
/* Test if a range is compatible with a variant. If yes, the following values | |
* are set: | |
* - total: how many elements are in the range | |
* - block: how big is each contiguous block of elements in the variant that | |
* maps into the range | |
* - stride: how many elements are between the blocks (beginning to beginning) | |
* - first: where does the first block begin */ | |
static UA_StatusCode | |
computeStrides(const UA_Variant *v, const UA_NumericRange range, | |
size_t *total, size_t *block, size_t *stride, size_t *first) { | |
/* Test for max array size (64bit only) */ | |
#if (SIZE_MAX > 0xffffffff) | |
if(v->arrayLength > UA_UINT32_MAX) | |
return UA_STATUSCODE_BADINTERNALERROR; | |
#endif | |
/* Test the integrity of the source variant dimensions, make dimensions | |
* vector of one dimension if none defined */ | |
u32 arrayLength = (u32)v->arrayLength; | |
const u32 *dims = &arrayLength; | |
size_t dims_count = 1; | |
if(v->arrayDimensionsSize > 0) { | |
size_t elements = 1; | |
dims_count = v->arrayDimensionsSize; | |
dims = (u32*)v->arrayDimensions; | |
for(size_t i = 0; i < dims_count; ++i) | |
elements *= dims[i]; | |
if(elements != v->arrayLength) | |
return UA_STATUSCODE_BADINTERNALERROR; | |
} | |
UA_assert(dims_count > 0); | |
/* Test the integrity of the range and compute the max index used for every | |
* dimension. The standard says in Part 4, Section 7.22: | |
* | |
* When reading a value, the indexes may not specify a range that is within | |
* the bounds of the array. The Server shall return a partial result if some | |
* elements exist within the range. */ | |
size_t count = 1; | |
UA_STACKARRAY(UA_UInt32, realmax, dims_count); | |
if(range.dimensionsSize != dims_count) | |
return UA_STATUSCODE_BADINDEXRANGENODATA; | |
for(size_t i = 0; i < dims_count; ++i) { | |
if(range.dimensions[i].min > range.dimensions[i].max) | |
return UA_STATUSCODE_BADINDEXRANGEINVALID; | |
if(range.dimensions[i].min >= dims[i]) | |
return UA_STATUSCODE_BADINDEXRANGENODATA; | |
if(range.dimensions[i].max < dims[i]) | |
realmax[i] = range.dimensions[i].max; | |
else | |
realmax[i] = dims[i] - 1; | |
count *= (realmax[i] - range.dimensions[i].min) + 1; | |
} | |
*total = count; | |
/* Compute the stride length and the position of the first element */ | |
*block = count; /* Assume the range describes the entire array. */ | |
*stride = v->arrayLength; /* So it can be copied as a contiguous block. */ | |
*first = 0; | |
size_t running_dimssize = 1; | |
UA_Boolean found_contiguous = false; | |
for(size_t k = dims_count; k > 0;) { | |
--k; | |
size_t dimrange = 1 + realmax[k] - range.dimensions[k].min; | |
if(!found_contiguous && dimrange != dims[k]) { | |
/* Found the maximum block that can be copied contiguously */ | |
found_contiguous = true; | |
*block = running_dimssize * dimrange; | |
*stride = running_dimssize * dims[k]; | |
} | |
*first += running_dimssize * range.dimensions[k].min; | |
running_dimssize *= dims[k]; | |
} | |
return UA_STATUSCODE_GOOD; | |
} | |
/* Is the type string-like? */ | |
static UA_Boolean | |
isStringLike(const UA_DataType *type) { | |
if(type == &UA_TYPES[UA_TYPES_STRING] || | |
type == &UA_TYPES[UA_TYPES_BYTESTRING] || | |
type == &UA_TYPES[UA_TYPES_XMLELEMENT]) | |
return true; | |
return false; | |
} | |
/* Returns the part of the string that lies within the rangedimension */ | |
static UA_StatusCode | |
copySubString(const UA_String *src, UA_String *dst, | |
const UA_NumericRangeDimension *dim) { | |
if(dim->min > dim->max) | |
return UA_STATUSCODE_BADINDEXRANGEINVALID; | |
if(dim->min >= src->length) | |
return UA_STATUSCODE_BADINDEXRANGENODATA; | |
size_t length; | |
if(dim->max < src->length) | |
length = dim->max - dim->min + 1; | |
else | |
length = src->length - dim->min; | |
UA_StatusCode retval = UA_ByteString_allocBuffer(dst, length); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
memcpy(dst->data, &src->data[dim->min], length); | |
return UA_STATUSCODE_GOOD; | |
} | |
UA_StatusCode | |
UA_Variant_copyRange(const UA_Variant *src, UA_Variant *dst, | |
const UA_NumericRange range) { | |
if(!src->type) | |
return UA_STATUSCODE_BADINVALIDARGUMENT; | |
UA_Boolean isScalar = UA_Variant_isScalar(src); | |
UA_Boolean stringLike = isStringLike(src->type); | |
UA_Variant arraySrc; | |
/* Extract the range for copying at this level. The remaining range is dealt | |
* with in the "scalar" type that may define an array by itself (string, | |
* variant, ...). */ | |
UA_NumericRange thisrange, nextrange; | |
UA_NumericRangeDimension scalarThisDimension = {0,0}; /* a single entry */ | |
if(isScalar) { | |
/* Replace scalar src with array of length 1 */ | |
arraySrc = *src; | |
arraySrc.arrayLength = 1; | |
src = &arraySrc; | |
/* Deal with all range dimensions within the scalar */ | |
thisrange.dimensions = &scalarThisDimension; | |
thisrange.dimensionsSize = 1; | |
nextrange = range; | |
} else { | |
/* Deal with as many range dimensions as possible right now */ | |
size_t dims = src->arrayDimensionsSize; | |
if(dims == 0) | |
dims = 1; | |
if(dims > range.dimensionsSize) | |
return UA_STATUSCODE_BADINDEXRANGEINVALID; | |
thisrange = range; | |
thisrange.dimensionsSize = dims; | |
nextrange.dimensions = &range.dimensions[dims]; | |
nextrange.dimensionsSize = range.dimensionsSize - dims; | |
} | |
/* Compute the strides */ | |
size_t count, block, stride, first; | |
UA_StatusCode retval = computeStrides(src, thisrange, &count, | |
&block, &stride, &first); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
/* Allocate the array */ | |
UA_Variant_init(dst); | |
dst->data = UA_Array_new(count, src->type); | |
if(!dst->data) | |
return UA_STATUSCODE_BADOUTOFMEMORY; | |
/* Copy the range */ | |
size_t block_count = count / block; | |
size_t elem_size = src->type->memSize; | |
uintptr_t nextdst = (uintptr_t)dst->data; | |
uintptr_t nextsrc = (uintptr_t)src->data + (elem_size * first); | |
if(nextrange.dimensionsSize == 0) { | |
/* no nextrange */ | |
if(src->type->pointerFree) { | |
for(size_t i = 0; i < block_count; ++i) { | |
memcpy((void*)nextdst, (void*)nextsrc, elem_size * block); | |
nextdst += block * elem_size; | |
nextsrc += stride * elem_size; | |
} | |
} else { | |
for(size_t i = 0; i < block_count; ++i) { | |
for(size_t j = 0; j < block; ++j) { | |
retval = UA_copy((const void*)nextsrc, | |
(void*)nextdst, src->type); | |
nextdst += elem_size; | |
nextsrc += elem_size; | |
} | |
nextsrc += (stride - block) * elem_size; | |
} | |
} | |
} else { | |
/* nextrange can only be used for variants and stringlike with remaining | |
* range of dimension 1 */ | |
if(src->type != &UA_TYPES[UA_TYPES_VARIANT]) { | |
if(!stringLike) | |
retval = UA_STATUSCODE_BADINDEXRANGENODATA; | |
if(nextrange.dimensionsSize != 1) | |
retval = UA_STATUSCODE_BADINDEXRANGENODATA; | |
} | |
/* Copy the content */ | |
for(size_t i = 0; i < block_count; ++i) { | |
for(size_t j = 0; j < block && retval == UA_STATUSCODE_GOOD; ++j) { | |
if(stringLike) | |
retval = copySubString((const UA_String*)nextsrc, | |
(UA_String*)nextdst, | |
nextrange.dimensions); | |
else | |
retval = UA_Variant_copyRange((const UA_Variant*)nextsrc, | |
(UA_Variant*)nextdst, | |
nextrange); | |
nextdst += elem_size; | |
nextsrc += elem_size; | |
} | |
nextsrc += (stride - block) * elem_size; | |
} | |
} | |
/* Clean up if copying failed */ | |
if(retval != UA_STATUSCODE_GOOD) { | |
UA_Array_delete(dst->data, count, src->type); | |
dst->data = NULL; | |
return retval; | |
} | |
/* Done if scalar */ | |
dst->type = src->type; | |
if(isScalar) | |
return retval; | |
/* Copy array dimensions */ | |
dst->arrayLength = count; | |
if(src->arrayDimensionsSize > 0) { | |
dst->arrayDimensions = | |
(u32*)UA_Array_new(thisrange.dimensionsSize, &UA_TYPES[UA_TYPES_UINT32]); | |
if(!dst->arrayDimensions) { | |
Variant_clear(dst, NULL); | |
return UA_STATUSCODE_BADOUTOFMEMORY; | |
} | |
dst->arrayDimensionsSize = thisrange.dimensionsSize; | |
for(size_t k = 0; k < thisrange.dimensionsSize; ++k) | |
dst->arrayDimensions[k] = | |
thisrange.dimensions[k].max - thisrange.dimensions[k].min + 1; | |
} | |
return UA_STATUSCODE_GOOD; | |
} | |
/* TODO: Allow ranges to reach inside a scalars that are array-like, e.g. | |
* variant and strings. This is already possible for reading... */ | |
static UA_StatusCode | |
Variant_setRange(UA_Variant *v, void *array, size_t arraySize, | |
const UA_NumericRange range, UA_Boolean copy) { | |
/* Compute the strides */ | |
size_t count, block, stride, first; | |
UA_StatusCode retval = computeStrides(v, range, &count, | |
&block, &stride, &first); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
if(count != arraySize) | |
return UA_STATUSCODE_BADINDEXRANGEINVALID; | |
/* Move/copy the elements */ | |
size_t block_count = count / block; | |
size_t elem_size = v->type->memSize; | |
uintptr_t nextdst = (uintptr_t)v->data + (first * elem_size); | |
uintptr_t nextsrc = (uintptr_t)array; | |
if(v->type->pointerFree || !copy) { | |
for(size_t i = 0; i < block_count; ++i) { | |
memcpy((void*)nextdst, (void*)nextsrc, elem_size * block); | |
nextsrc += block * elem_size; | |
nextdst += stride * elem_size; | |
} | |
} else { | |
for(size_t i = 0; i < block_count; ++i) { | |
for(size_t j = 0; j < block; ++j) { | |
clearJumpTable[v->type->typeKind]((void*)nextdst, v->type); | |
retval |= UA_copy((void*)nextsrc, (void*)nextdst, v->type); | |
nextdst += elem_size; | |
nextsrc += elem_size; | |
} | |
nextdst += (stride - block) * elem_size; | |
} | |
} | |
/* If members were moved, initialize original array to prevent reuse */ | |
if(!copy && !v->type->pointerFree) | |
memset(array, 0, sizeof(elem_size)*arraySize); | |
return retval; | |
} | |
UA_StatusCode | |
UA_Variant_setRange(UA_Variant *v, void * UA_RESTRICT array, | |
size_t arraySize, const UA_NumericRange range) { | |
return Variant_setRange(v, array, arraySize, range, false); | |
} | |
UA_StatusCode | |
UA_Variant_setRangeCopy(UA_Variant *v, const void *array, | |
size_t arraySize, const UA_NumericRange range) { | |
return Variant_setRange(v, (void*)(uintptr_t)array, | |
arraySize, range, true); | |
} | |
/* LocalizedText */ | |
static void | |
LocalizedText_clear(UA_LocalizedText *p, const UA_DataType *_) { | |
String_clear(&p->locale, NULL); | |
String_clear(&p->text, NULL); | |
} | |
static UA_StatusCode | |
LocalizedText_copy(UA_LocalizedText const *src, UA_LocalizedText *dst, | |
const UA_DataType *_) { | |
UA_StatusCode retval = UA_String_copy(&src->locale, &dst->locale); | |
retval |= UA_String_copy(&src->text, &dst->text); | |
return retval; | |
} | |
/* DataValue */ | |
static void | |
DataValue_clear(UA_DataValue *p, const UA_DataType *_) { | |
Variant_clear(&p->value, NULL); | |
} | |
static UA_StatusCode | |
DataValue_copy(UA_DataValue const *src, UA_DataValue *dst, | |
const UA_DataType *_) { | |
memcpy(dst, src, sizeof(UA_DataValue)); | |
UA_Variant_init(&dst->value); | |
UA_StatusCode retval = Variant_copy(&src->value, &dst->value, NULL); | |
if(retval != UA_STATUSCODE_GOOD) | |
DataValue_clear(dst, NULL); | |
return retval; | |
} | |
/* DiagnosticInfo */ | |
static void | |
DiagnosticInfo_clear(UA_DiagnosticInfo *p, const UA_DataType *_) { | |
String_clear(&p->additionalInfo, NULL); | |
if(p->hasInnerDiagnosticInfo && p->innerDiagnosticInfo) { | |
DiagnosticInfo_clear(p->innerDiagnosticInfo, NULL); | |
UA_free(p->innerDiagnosticInfo); | |
} | |
} | |
static UA_StatusCode | |
DiagnosticInfo_copy(UA_DiagnosticInfo const *src, UA_DiagnosticInfo *dst, | |
const UA_DataType *_) { | |
memcpy(dst, src, sizeof(UA_DiagnosticInfo)); | |
UA_String_init(&dst->additionalInfo); | |
dst->innerDiagnosticInfo = NULL; | |
UA_StatusCode retval = UA_STATUSCODE_GOOD; | |
if(src->hasAdditionalInfo) | |
retval = UA_String_copy(&src->additionalInfo, &dst->additionalInfo); | |
if(src->hasInnerDiagnosticInfo && src->innerDiagnosticInfo) { | |
dst->innerDiagnosticInfo = (UA_DiagnosticInfo*)UA_malloc(sizeof(UA_DiagnosticInfo)); | |
if(dst->innerDiagnosticInfo) { | |
retval |= DiagnosticInfo_copy(src->innerDiagnosticInfo, | |
dst->innerDiagnosticInfo, NULL); | |
dst->hasInnerDiagnosticInfo = true; | |
} else { | |
dst->hasInnerDiagnosticInfo = false; | |
retval |= UA_STATUSCODE_BADOUTOFMEMORY; | |
} | |
} | |
return retval; | |
} | |
/********************/ | |
/* Structured Types */ | |
/********************/ | |
void * | |
UA_new(const UA_DataType *type) { | |
void *p = UA_calloc(1, type->memSize); | |
return p; | |
} | |
static UA_StatusCode | |
copyByte(const u8 *src, u8 *dst, const UA_DataType *_) { | |
*dst = *src; | |
return UA_STATUSCODE_GOOD; | |
} | |
static UA_StatusCode | |
copy2Byte(const u16 *src, u16 *dst, const UA_DataType *_) { | |
*dst = *src; | |
return UA_STATUSCODE_GOOD; | |
} | |
static UA_StatusCode | |
copy4Byte(const u32 *src, u32 *dst, const UA_DataType *_) { | |
*dst = *src; | |
return UA_STATUSCODE_GOOD; | |
} | |
static UA_StatusCode | |
copy8Byte(const u64 *src, u64 *dst, const UA_DataType *_) { | |
*dst = *src; | |
return UA_STATUSCODE_GOOD; | |
} | |
static UA_StatusCode | |
copyGuid(const UA_Guid *src, UA_Guid *dst, const UA_DataType *_) { | |
*dst = *src; | |
return UA_STATUSCODE_GOOD; | |
} | |
static UA_StatusCode | |
copyStructure(const void *src, void *dst, const UA_DataType *type) { | |
UA_StatusCode retval = UA_STATUSCODE_GOOD; | |
uintptr_t ptrs = (uintptr_t)src; | |
uintptr_t ptrd = (uintptr_t)dst; | |
const UA_DataType *typelists[2] = { UA_TYPES, &type[-type->typeIndex] }; | |
for(size_t i = 0; i < type->membersSize; ++i) { | |
const UA_DataTypeMember *m= &type->members[i]; | |
const UA_DataType *mt = &typelists[!m->namespaceZero][m->memberTypeIndex]; | |
if(!m->isArray) { | |
ptrs += m->padding; | |
ptrd += m->padding; | |
retval |= copyJumpTable[mt->typeKind]((const void*)ptrs, (void*)ptrd, mt); | |
ptrs += mt->memSize; | |
ptrd += mt->memSize; | |
} else { | |
ptrs += m->padding; | |
ptrd += m->padding; | |
size_t *dst_size = (size_t*)ptrd; | |
const size_t size = *((const size_t*)ptrs); | |
ptrs += sizeof(size_t); | |
ptrd += sizeof(size_t); | |
retval |= UA_Array_copy(*(void* const*)ptrs, size, (void**)ptrd, mt); | |
if(retval == UA_STATUSCODE_GOOD) | |
*dst_size = size; | |
else | |
*dst_size = 0; | |
ptrs += sizeof(void*); | |
ptrd += sizeof(void*); | |
} | |
} | |
return retval; | |
} | |
static UA_StatusCode | |
copyNotImplemented(const void *src, void *dst, const UA_DataType *type) { | |
return UA_STATUSCODE_BADNOTIMPLEMENTED; | |
} | |
const UA_copySignature copyJumpTable[UA_DATATYPEKINDS] = { | |
(UA_copySignature)copyByte, /* Boolean */ | |
(UA_copySignature)copyByte, /* SByte */ | |
(UA_copySignature)copyByte, /* Byte */ | |
(UA_copySignature)copy2Byte, /* Int16 */ | |
(UA_copySignature)copy2Byte, /* UInt16 */ | |
(UA_copySignature)copy4Byte, /* Int32 */ | |
(UA_copySignature)copy4Byte, /* UInt32 */ | |
(UA_copySignature)copy8Byte, /* Int64 */ | |
(UA_copySignature)copy8Byte, /* UInt64 */ | |
(UA_copySignature)copy4Byte, /* Float */ | |
(UA_copySignature)copy8Byte, /* Double */ | |
(UA_copySignature)String_copy, | |
(UA_copySignature)copy8Byte, /* DateTime */ | |
(UA_copySignature)copyGuid, /* Guid */ | |
(UA_copySignature)String_copy, /* ByteString */ | |
(UA_copySignature)String_copy, /* XmlElement */ | |
(UA_copySignature)NodeId_copy, | |
(UA_copySignature)ExpandedNodeId_copy, | |
(UA_copySignature)copy4Byte, /* StatusCode */ | |
(UA_copySignature)QualifiedName_copy, | |
(UA_copySignature)LocalizedText_copy, | |
(UA_copySignature)ExtensionObject_copy, | |
(UA_copySignature)DataValue_copy, | |
(UA_copySignature)Variant_copy, | |
(UA_copySignature)DiagnosticInfo_copy, | |
(UA_copySignature)copyNotImplemented, /* Decimal */ | |
(UA_copySignature)copy4Byte, /* Enumeration */ | |
(UA_copySignature)copyStructure, | |
(UA_copySignature)copyNotImplemented, /* Structure with Optional Fields */ | |
(UA_copySignature)copyNotImplemented, /* Union */ | |
(UA_copySignature)copyNotImplemented /* BitfieldCluster*/ | |
}; | |
UA_StatusCode | |
UA_copy(const void *src, void *dst, const UA_DataType *type) { | |
memset(dst, 0, type->memSize); /* init */ | |
UA_StatusCode retval = copyJumpTable[type->typeKind](src, dst, type); | |
if(retval != UA_STATUSCODE_GOOD) | |
UA_clear(dst, type); | |
return retval; | |
} | |
static void | |
clearStructure(void *p, const UA_DataType *type) { | |
uintptr_t ptr = (uintptr_t)p; | |
const UA_DataType *typelists[2] = { UA_TYPES, &type[-type->typeIndex] }; | |
for(size_t i = 0; i < type->membersSize; ++i) { | |
const UA_DataTypeMember *m = &type->members[i]; | |
const UA_DataType *mt = &typelists[!m->namespaceZero][m->memberTypeIndex]; | |
if(!m->isArray) { | |
ptr += m->padding; | |
clearJumpTable[mt->typeKind]((void*)ptr, mt); | |
ptr += mt->memSize; | |
} else { | |
ptr += m->padding; | |
size_t length = *(size_t*)ptr; | |
ptr += sizeof(size_t); | |
UA_Array_delete(*(void**)ptr, length, mt); | |
ptr += sizeof(void*); | |
} | |
} | |
} | |
static void nopClear(void *p, const UA_DataType *type) { } | |
const | |
UA_clearSignature clearJumpTable[UA_DATATYPEKINDS] = { | |
(UA_clearSignature)nopClear, /* Boolean */ | |
(UA_clearSignature)nopClear, /* SByte */ | |
(UA_clearSignature)nopClear, /* Byte */ | |
(UA_clearSignature)nopClear, /* Int16 */ | |
(UA_clearSignature)nopClear, /* UInt16 */ | |
(UA_clearSignature)nopClear, /* Int32 */ | |
(UA_clearSignature)nopClear, /* UInt32 */ | |
(UA_clearSignature)nopClear, /* Int64 */ | |
(UA_clearSignature)nopClear, /* UInt64 */ | |
(UA_clearSignature)nopClear, /* Float */ | |
(UA_clearSignature)nopClear, /* Double */ | |
(UA_clearSignature)String_clear, /* String */ | |
(UA_clearSignature)nopClear, /* DateTime */ | |
(UA_clearSignature)nopClear, /* Guid */ | |
(UA_clearSignature)String_clear, /* ByteString */ | |
(UA_clearSignature)String_clear, /* XmlElement */ | |
(UA_clearSignature)NodeId_clear, | |
(UA_clearSignature)ExpandedNodeId_clear, | |
(UA_clearSignature)nopClear, /* StatusCode */ | |
(UA_clearSignature)QualifiedName_clear, | |
(UA_clearSignature)LocalizedText_clear, | |
(UA_clearSignature)ExtensionObject_clear, | |
(UA_clearSignature)DataValue_clear, | |
(UA_clearSignature)Variant_clear, | |
(UA_clearSignature)DiagnosticInfo_clear, | |
(UA_clearSignature)nopClear, /* Decimal, not implemented */ | |
(UA_clearSignature)nopClear, /* Enumeration */ | |
(UA_clearSignature)clearStructure, | |
(UA_clearSignature)nopClear, /* Struct with Optional Fields, not implemented*/ | |
(UA_clearSignature)nopClear, /* Union, not implemented*/ | |
(UA_clearSignature)nopClear /* BitfieldCluster, not implemented*/ | |
}; | |
void | |
UA_clear(void *p, const UA_DataType *type) { | |
clearJumpTable[type->typeKind](p, type); | |
memset(p, 0, type->memSize); /* init */ | |
} | |
void | |
UA_delete(void *p, const UA_DataType *type) { | |
clearJumpTable[type->typeKind](p, type); | |
UA_free(p); | |
} | |
/******************/ | |
/* Array Handling */ | |
/******************/ | |
void * | |
UA_Array_new(size_t size, const UA_DataType *type) { | |
if(size > UA_INT32_MAX) | |
return NULL; | |
if(size == 0) | |
return UA_EMPTY_ARRAY_SENTINEL; | |
return UA_calloc(size, type->memSize); | |
} | |
UA_StatusCode | |
UA_Array_copy(const void *src, size_t size, | |
void **dst, const UA_DataType *type) { | |
if(size == 0) { | |
if(src == NULL) | |
*dst = NULL; | |
else | |
*dst= UA_EMPTY_ARRAY_SENTINEL; | |
return UA_STATUSCODE_GOOD; | |
} | |
if(!type) | |
return UA_STATUSCODE_BADINTERNALERROR; | |
/* calloc, so we don't have to check retval in every iteration of copying */ | |
*dst = UA_calloc(size, type->memSize); | |
if(!*dst) | |
return UA_STATUSCODE_BADOUTOFMEMORY; | |
if(type->pointerFree) { | |
memcpy(*dst, src, type->memSize * size); | |
return UA_STATUSCODE_GOOD; | |
} | |
uintptr_t ptrs = (uintptr_t)src; | |
uintptr_t ptrd = (uintptr_t)*dst; | |
UA_StatusCode retval = UA_STATUSCODE_GOOD; | |
for(size_t i = 0; i < size; ++i) { | |
retval |= UA_copy((void*)ptrs, (void*)ptrd, type); | |
ptrs += type->memSize; | |
ptrd += type->memSize; | |
} | |
if(retval != UA_STATUSCODE_GOOD) { | |
UA_Array_delete(*dst, size, type); | |
*dst = NULL; | |
} | |
return retval; | |
} | |
void | |
UA_Array_delete(void *p, size_t size, const UA_DataType *type) { | |
if(!type->pointerFree) { | |
uintptr_t ptr = (uintptr_t)p; | |
for(size_t i = 0; i < size; ++i) { | |
UA_clear((void*)ptr, type); | |
ptr += type->memSize; | |
} | |
} | |
UA_free((void*)((uintptr_t)p & ~(uintptr_t)UA_EMPTY_ARRAY_SENTINEL)); | |
} | |
UA_Boolean | |
UA_DataType_isNumeric(const UA_DataType *type) { | |
/* All data types between UA_TYPES_BOOLEAN and UA_TYPES_DOUBLE are numeric */ | |
for(size_t i = UA_TYPES_BOOLEAN; i <= UA_TYPES_DOUBLE; ++i) | |
if(&UA_TYPES[i] == type) | |
return true; | |
return false; | |
} | |
/**********************/ | |
/* Parse NumericRange */ | |
/**********************/ | |
static size_t | |
readDimension(UA_Byte *buf, size_t buflen, UA_NumericRangeDimension *dim) { | |
size_t progress = UA_readNumber(buf, buflen, &dim->min); | |
if(progress == 0) | |
return 0; | |
if(buflen <= progress + 1 || buf[progress] != ':') { | |
dim->max = dim->min; | |
return progress; | |
} | |
++progress; | |
size_t progress2 = UA_readNumber(&buf[progress], buflen - progress, &dim->max); | |
if(progress2 == 0) | |
return 0; | |
/* invalid range */ | |
if(dim->min >= dim->max) | |
return 0; | |
return progress + progress2; | |
} | |
UA_StatusCode | |
UA_NumericRange_parseFromString(UA_NumericRange *range, const UA_String *str) { | |
size_t idx = 0; | |
size_t dimensionsMax = 0; | |
UA_NumericRangeDimension *dimensions = NULL; | |
UA_StatusCode retval = UA_STATUSCODE_GOOD; | |
size_t offset = 0; | |
while(true) { | |
/* alloc dimensions */ | |
if(idx >= dimensionsMax) { | |
UA_NumericRangeDimension *newds; | |
size_t newdssize = sizeof(UA_NumericRangeDimension) * (dimensionsMax + 2); | |
newds = (UA_NumericRangeDimension*)UA_realloc(dimensions, newdssize); | |
if(!newds) { | |
retval = UA_STATUSCODE_BADOUTOFMEMORY; | |
break; | |
} | |
dimensions = newds; | |
dimensionsMax = dimensionsMax + 2; | |
} | |
/* read the dimension */ | |
size_t progress = readDimension(&str->data[offset], str->length - offset, | |
&dimensions[idx]); | |
if(progress == 0) { | |
retval = UA_STATUSCODE_BADINDEXRANGEINVALID; | |
break; | |
} | |
offset += progress; | |
++idx; | |
/* loop into the next dimension */ | |
if(offset >= str->length) | |
break; | |
if(str->data[offset] != ',') { | |
retval = UA_STATUSCODE_BADINDEXRANGEINVALID; | |
break; | |
} | |
++offset; | |
} | |
if(retval == UA_STATUSCODE_GOOD && idx > 0) { | |
range->dimensions = dimensions; | |
range->dimensionsSize = idx; | |
} else | |
UA_free(dimensions); | |
return retval; | |
} | |
/*********************************** amalgamated original file "E:/Librarys/open62541/src/ua_types_encoding_binary.c" ***********************************/ | |
/* This Source Code Form is subject to the terms of the Mozilla Public | |
* License, v. 2.0. If a copy of the MPL was not distributed with this | |
* file, You can obtain one at http://mozilla.org/MPL/2.0/. | |
* | |
* Copyright 2014-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) | |
* Copyright 2014-2017 (c) Florian Palm | |
* Copyright 2014-2016 (c) Sten Grüner | |
* Copyright 2014 (c) Leon Urbas | |
* Copyright 2015 (c) LEvertz | |
* Copyright 2015 (c) Chris Iatrou | |
* Copyright 2015-2016 (c) Oleksiy Vasylyev | |
* Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH | |
* Copyright 2016 (c) Lorenz Haas | |
* Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB | |
* Copyright 2017 (c) Henrik Norrman | |
*/ | |
/** | |
* Type Encoding and Decoding | |
* -------------------------- | |
* The following methods contain encoding and decoding functions for the builtin | |
* data types and generic functions that operate on all types and arrays. This | |
* requires the type description from a UA_DataType structure. | |
* | |
* Encoding Context | |
* ^^^^^^^^^^^^^^^^ | |
* If possible, the encoding context is stored in a thread-local variable to | |
* speed up encoding. If thread-local variables are not supported, the context | |
* is "looped through" every method call. The ``_``-macro accesses either the | |
* thread-local or the "looped through" context . */ | |
/* Part 6 §5.1.5: Decoders shall support at least 100 nesting levels */ | |
#define UA_ENCODING_MAX_RECURSION 100 | |
typedef struct { | |
/* Pointers to the current position and the last position in the buffer */ | |
u8 *pos; | |
const u8 *end; | |
u8 **oldpos; /* Sentinel for a lower stacktrace exchanging the buffer */ | |
u16 depth; /* How often did we en-/decoding recurse? */ | |
const UA_DataTypeArray *customTypes; | |
UA_exchangeEncodeBuffer exchangeBufferCallback; | |
void *exchangeBufferCallbackHandle; | |
} Ctx; | |
typedef status | |
(*encodeBinarySignature)(const void *UA_RESTRICT src, const UA_DataType *type, | |
Ctx *UA_RESTRICT ctx); | |
typedef status | |
(*decodeBinarySignature)(void *UA_RESTRICT dst, const UA_DataType *type, | |
Ctx *UA_RESTRICT ctx); | |
typedef size_t | |
(*calcSizeBinarySignature)(const void *UA_RESTRICT p, const UA_DataType *contenttype); | |
#define ENCODE_BINARY(TYPE) static status \ | |
TYPE##_encodeBinary(const UA_##TYPE *UA_RESTRICT src, \ | |
const UA_DataType *type, Ctx *UA_RESTRICT ctx) | |
#define DECODE_BINARY(TYPE) static status \ | |
TYPE##_decodeBinary(UA_##TYPE *UA_RESTRICT dst, \ | |
const UA_DataType *type, Ctx *UA_RESTRICT ctx) | |
#define CALCSIZE_BINARY(TYPE) static size_t \ | |
TYPE##_calcSizeBinary(const UA_##TYPE *UA_RESTRICT src, \ | |
const UA_DataType *_) | |
#define ENCODE_DIRECT(SRC, TYPE) TYPE##_encodeBinary((const UA_##TYPE*)SRC, NULL, ctx) | |
#define DECODE_DIRECT(DST, TYPE) TYPE##_decodeBinary((UA_##TYPE*)DST, NULL, ctx) | |
/* Jumptables for de-/encoding and computing the buffer length. The methods in | |
* the decoding jumptable do not all clean up their allocated memory when an | |
* error occurs. So a final _clear needs to be called before returning to the | |
* user. */ | |
extern const encodeBinarySignature encodeBinaryJumpTable[UA_DATATYPEKINDS]; | |
extern const decodeBinarySignature decodeBinaryJumpTable[UA_DATATYPEKINDS]; | |
extern const calcSizeBinarySignature calcSizeBinaryJumpTable[UA_DATATYPEKINDS]; | |
/* Breaking a message up into chunks is integrated with the encoding. When the | |
* end of a buffer is reached, a callback is executed that sends the current | |
* buffer as a chunk and exchanges the encoding buffer "underneath" the ongoing | |
* encoding. This reduces the RAM requirements and unnecessary copying. */ | |
/* Send the current chunk and replace the buffer */ | |
static status exchangeBuffer(Ctx *ctx) { | |
if(!ctx->exchangeBufferCallback) | |
return UA_STATUSCODE_BADENCODINGERROR; | |
return ctx->exchangeBufferCallback(ctx->exchangeBufferCallbackHandle, | |
&ctx->pos, &ctx->end); | |
} | |
/* If encoding fails, exchange the buffer and try again. */ | |
static status | |
encodeWithExchangeBuffer(const void *ptr, const UA_DataType *type, Ctx *ctx) { | |
u8 *oldpos = ctx->pos; /* Last known good position */ | |
ctx->oldpos = &oldpos; | |
status ret = encodeBinaryJumpTable[type->typeKind](ptr, type, ctx); | |
if(ret == UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED && ctx->oldpos == &oldpos) { | |
ctx->pos = oldpos; /* Send the position to the last known good position | |
* and switch */ | |
ret = exchangeBuffer(ctx); | |
if(ret != UA_STATUSCODE_GOOD) | |
return ret; | |
ret = encodeBinaryJumpTable[type->typeKind](ptr, type, ctx); | |
} | |
return ret; | |
} | |
#define ENCODE_WITHEXCHANGE(VAR, TYPE) \ | |
encodeWithExchangeBuffer((const void*)VAR, &UA_TYPES[TYPE], ctx) | |
/*****************/ | |
/* Integer Types */ | |
/*****************/ | |
#if !UA_BINARY_OVERLAYABLE_INTEGER | |
#pragma message "Integer endianness could not be detected to be little endian. Use slow generic encoding." | |
/* These en/decoding functions are only used when the architecture isn't little-endian. */ | |
static void | |
UA_encode16(const u16 v, u8 buf[2]) { | |
buf[0] = (u8)v; | |
buf[1] = (u8)(v >> 8); | |
} | |
static void | |
UA_decode16(const u8 buf[2], u16 *v) { | |
*v = (u16)((u16)buf[0] + (((u16)buf[1]) << 8)); | |
} | |
static void | |
UA_encode32(const u32 v, u8 buf[4]) { | |
buf[0] = (u8)v; | |
buf[1] = (u8)(v >> 8); | |
buf[2] = (u8)(v >> 16); | |
buf[3] = (u8)(v >> 24); | |
} | |
static void | |
UA_decode32(const u8 buf[4], u32 *v) { | |
*v = (u32)((u32)buf[0] + (((u32)buf[1]) << 8) + | |
(((u32)buf[2]) << 16) + (((u32)buf[3]) << 24)); | |
} | |
static void | |
UA_encode64(const u64 v, u8 buf[8]) { | |
buf[0] = (u8)v; | |
buf[1] = (u8)(v >> 8); | |
buf[2] = (u8)(v >> 16); | |
buf[3] = (u8)(v >> 24); | |
buf[4] = (u8)(v >> 32); | |
buf[5] = (u8)(v >> 40); | |
buf[6] = (u8)(v >> 48); | |
buf[7] = (u8)(v >> 56); | |
} | |
static void | |
UA_decode64(const u8 buf[8], u64 *v) { | |
*v = (u64)((u64)buf[0] + (((u64)buf[1]) << 8) + | |
(((u64)buf[2]) << 16) + (((u64)buf[3]) << 24) + | |
(((u64)buf[4]) << 32) + (((u64)buf[5]) << 40) + | |
(((u64)buf[6]) << 48) + (((u64)buf[7]) << 56)); | |
} | |
#endif /* !UA_BINARY_OVERLAYABLE_INTEGER */ | |
/* Boolean */ | |
/* Note that sizeof(bool) != 1 on some platforms. Overlayable integer encoding | |
* is disabled in those cases. */ | |
ENCODE_BINARY(Boolean) { | |
if(ctx->pos + 1 > ctx->end) | |
return UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED; | |
*ctx->pos = *(const u8*)src; | |
++ctx->pos; | |
return UA_STATUSCODE_GOOD; | |
} | |
DECODE_BINARY(Boolean) { | |
if(ctx->pos + 1 > ctx->end) | |
return UA_STATUSCODE_BADDECODINGERROR; | |
*dst = (*ctx->pos > 0) ? true : false; | |
++ctx->pos; | |
return UA_STATUSCODE_GOOD; | |
} | |
/* Byte */ | |
ENCODE_BINARY(Byte) { | |
if(ctx->pos + sizeof(u8) > ctx->end) | |
return UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED; | |
*ctx->pos = *(const u8*)src; | |
++ctx->pos; | |
return UA_STATUSCODE_GOOD; | |
} | |
DECODE_BINARY(Byte) { | |
if(ctx->pos + sizeof(u8) > ctx->end) | |
return UA_STATUSCODE_BADDECODINGERROR; | |
*dst = *ctx->pos; | |
++ctx->pos; | |
return UA_STATUSCODE_GOOD; | |
} | |
/* UInt16 */ | |
ENCODE_BINARY(UInt16) { | |
if(ctx->pos + sizeof(u16) > ctx->end) | |
return UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED; | |
#if UA_BINARY_OVERLAYABLE_INTEGER | |
memcpy(ctx->pos, src, sizeof(u16)); | |
#else | |
UA_encode16(*src, ctx->pos); | |
#endif | |
ctx->pos += 2; | |
return UA_STATUSCODE_GOOD; | |
} | |
DECODE_BINARY(UInt16) { | |
if(ctx->pos + sizeof(u16) > ctx->end) | |
return UA_STATUSCODE_BADDECODINGERROR; | |
#if UA_BINARY_OVERLAYABLE_INTEGER | |
memcpy(dst, ctx->pos, sizeof(u16)); | |
#else | |
UA_decode16(ctx->pos, dst); | |
#endif | |
ctx->pos += 2; | |
return UA_STATUSCODE_GOOD; | |
} | |
/* UInt32 */ | |
ENCODE_BINARY(UInt32) { | |
if(ctx->pos + sizeof(u32) > ctx->end) | |
return UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED; | |
#if UA_BINARY_OVERLAYABLE_INTEGER | |
memcpy(ctx->pos, src, sizeof(u32)); | |
#else | |
UA_encode32(*src, ctx->pos); | |
#endif | |
ctx->pos += 4; | |
return UA_STATUSCODE_GOOD; | |
} | |
DECODE_BINARY(UInt32) { | |
if(ctx->pos + sizeof(u32) > ctx->end) | |
return UA_STATUSCODE_BADDECODINGERROR; | |
#if UA_BINARY_OVERLAYABLE_INTEGER | |
memcpy(dst, ctx->pos, sizeof(u32)); | |
#else | |
UA_decode32(ctx->pos, dst); | |
#endif | |
ctx->pos += 4; | |
return UA_STATUSCODE_GOOD; | |
} | |
/* UInt64 */ | |
ENCODE_BINARY(UInt64) { | |
if(ctx->pos + sizeof(u64) > ctx->end) | |
return UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED; | |
#if UA_BINARY_OVERLAYABLE_INTEGER | |
memcpy(ctx->pos, src, sizeof(u64)); | |
#else | |
UA_encode64(*src, ctx->pos); | |
#endif | |
ctx->pos += 8; | |
return UA_STATUSCODE_GOOD; | |
} | |
DECODE_BINARY(UInt64) { | |
if(ctx->pos + sizeof(u64) > ctx->end) | |
return UA_STATUSCODE_BADDECODINGERROR; | |
#if UA_BINARY_OVERLAYABLE_INTEGER | |
memcpy(dst, ctx->pos, sizeof(u64)); | |
#else | |
UA_decode64(ctx->pos, dst); | |
#endif | |
ctx->pos += 8; | |
return UA_STATUSCODE_GOOD; | |
} | |
/************************/ | |
/* Floating Point Types */ | |
/************************/ | |
/* Can we reuse the integer encoding mechanism by casting floating point | |
* values? */ | |
#if (UA_FLOAT_IEEE754 == 1) && (UA_LITTLE_ENDIAN == UA_FLOAT_LITTLE_ENDIAN) | |
# define Float_encodeBinary UInt32_encodeBinary | |
# define Float_decodeBinary UInt32_decodeBinary | |
# define Double_encodeBinary UInt64_encodeBinary | |
# define Double_decodeBinary UInt64_decodeBinary | |
#else | |
#include <math.h> | |
#pragma message "No native IEEE 754 format detected. Use slow generic encoding." | |
/* Handling of IEEE754 floating point values was taken from Beej's Guide to | |
* Network Programming (http://beej.us/guide/bgnet/) and enhanced to cover the | |
* edge cases +/-0, +/-inf and nan. */ | |
static uint64_t | |
pack754(long double f, unsigned bits, unsigned expbits) { | |
unsigned significandbits = bits - expbits - 1; | |
long double fnorm; | |
long long sign; | |
if(f < 0) { sign = 1; fnorm = -f; } | |
else { sign = 0; fnorm = f; } | |
int shift = 0; | |
while(fnorm >= 2.0) { fnorm /= 2.0; ++shift; } | |
while(fnorm < 1.0) { fnorm *= 2.0; --shift; } | |
fnorm = fnorm - 1.0; | |
long long significand = (long long)(fnorm * ((float)(1LL<<significandbits) + 0.5f)); | |
long long exponent = shift + ((1<<(expbits-1)) - 1); | |
return (uint64_t)((sign<<(bits-1)) | (exponent<<(bits-expbits-1)) | significand); | |
} | |
static long double | |
unpack754(uint64_t i, unsigned bits, unsigned expbits) { | |
unsigned significandbits = bits - expbits - 1; | |
long double result = (long double)(i&(uint64_t)((1LL<<significandbits)-1)); | |
result /= (1LL<<significandbits); | |
result += 1.0f; | |
unsigned bias = (unsigned)(1<<(expbits-1)) - 1; | |
long long shift = (long long)((i>>significandbits) & (uint64_t)((1LL<<expbits)-1)) - bias; | |
while(shift > 0) { result *= 2.0; --shift; } | |
while(shift < 0) { result /= 2.0; ++shift; } | |
result *= ((i>>(bits-1))&1)? -1.0: 1.0; | |
return result; | |
} | |
/* Float */ | |
#define FLOAT_NAN 0xffc00000 | |
#define FLOAT_INF 0x7f800000 | |
#define FLOAT_NEG_INF 0xff800000 | |
#define FLOAT_NEG_ZERO 0x80000000 | |
ENCODE_BINARY(Float) { | |
UA_Float f = *src; | |
u32 encoded; | |
/* cppcheck-suppress duplicateExpression */ | |
if(f != f) encoded = FLOAT_NAN; | |
else if(f == 0.0f) encoded = signbit(f) ? FLOAT_NEG_ZERO : 0; | |
else if(f/f != f/f) encoded = f > 0 ? FLOAT_INF : FLOAT_NEG_INF; | |
else encoded = (u32)pack754(f, 32, 8); | |
return ENCODE_DIRECT(&encoded, UInt32); | |
} | |
DECODE_BINARY(Float) { | |
u32 decoded; | |
status ret = DECODE_DIRECT(&decoded, UInt32); | |
if(ret != UA_STATUSCODE_GOOD) | |
return ret; | |
if(decoded == 0) *dst = 0.0f; | |
else if(decoded == FLOAT_NEG_ZERO) *dst = -0.0f; | |
else if(decoded == FLOAT_INF) *dst = INFINITY; | |
else if(decoded == FLOAT_NEG_INF) *dst = -INFINITY; | |
else if((decoded >= 0x7f800001 && decoded <= 0x7fffffff) || | |
(decoded >= 0xff800001)) *dst = NAN; | |
else *dst = (UA_Float)unpack754(decoded, 32, 8); | |
return UA_STATUSCODE_GOOD; | |
} | |
/* Double */ | |
#define DOUBLE_NAN 0xfff8000000000000L | |
#define DOUBLE_INF 0x7ff0000000000000L | |
#define DOUBLE_NEG_INF 0xfff0000000000000L | |
#define DOUBLE_NEG_ZERO 0x8000000000000000L | |
ENCODE_BINARY(Double) { | |
UA_Double d = *src; | |
u64 encoded; | |
/* cppcheck-suppress duplicateExpression */ | |
if(d != d) encoded = DOUBLE_NAN; | |
else if(d == 0.0) encoded = signbit(d) ? DOUBLE_NEG_ZERO : 0; | |
else if(d/d != d/d) encoded = d > 0 ? DOUBLE_INF : DOUBLE_NEG_INF; | |
else encoded = pack754(d, 64, 11); | |
return ENCODE_DIRECT(&encoded, UInt64); | |
} | |
DECODE_BINARY(Double) { | |
u64 decoded; | |
status ret = DECODE_DIRECT(&decoded, UInt64); | |
if(ret != UA_STATUSCODE_GOOD) | |
return ret; | |
if(decoded == 0) *dst = 0.0; | |
else if(decoded == DOUBLE_NEG_ZERO) *dst = -0.0; | |
else if(decoded == DOUBLE_INF) *dst = INFINITY; | |
else if(decoded == DOUBLE_NEG_INF) *dst = -INFINITY; | |
else if((decoded >= 0x7ff0000000000001L && decoded <= 0x7fffffffffffffffL) || | |
(decoded >= 0xfff0000000000001L)) *dst = NAN; | |
else *dst = (UA_Double)unpack754(decoded, 64, 11); | |
return UA_STATUSCODE_GOOD; | |
} | |
#endif | |
/******************/ | |
/* Array Handling */ | |
/******************/ | |
static status | |
Array_encodeBinaryOverlayable(uintptr_t ptr, size_t length, | |
size_t elementMemSize, Ctx *ctx) { | |
/* Store the number of already encoded elements */ | |
size_t finished = 0; | |
/* Loop as long as more elements remain than fit into the chunk */ | |
while(ctx->end < ctx->pos + (elementMemSize * (length-finished))) { | |
size_t possible = ((uintptr_t)ctx->end - (uintptr_t)ctx->pos) / (sizeof(u8) * elementMemSize); | |
size_t possibleMem = possible * elementMemSize; | |
memcpy(ctx->pos, (void*)ptr, possibleMem); | |
ctx->pos += possibleMem; | |
ptr += possibleMem; | |
finished += possible; | |
status ret = exchangeBuffer(ctx); | |
ctx->oldpos = NULL; /* Set the sentinel so that no upper stack frame | |
* with a saved pos attempts to exchange from an | |
* invalid position in the old buffer. */ | |
if(ret != UA_STATUSCODE_GOOD) | |
return ret; | |
} | |
/* Encode the remaining elements */ | |
memcpy(ctx->pos, (void*)ptr, elementMemSize * (length-finished)); | |
ctx->pos += elementMemSize * (length-finished); | |
return UA_STATUSCODE_GOOD; | |
} | |
static status | |
Array_encodeBinaryComplex(uintptr_t ptr, size_t length, | |
const UA_DataType *type, Ctx *ctx) { | |
/* Encode every element */ | |
for(size_t i = 0; i < length; ++i) { | |
status ret = encodeWithExchangeBuffer((const void*)ptr, type, ctx); | |
ptr += type->memSize; | |
if(ret != UA_STATUSCODE_GOOD) | |
return ret; /* Unrecoverable fail */ | |
} | |
return UA_STATUSCODE_GOOD; | |
} | |
static status | |
Array_encodeBinary(const void *src, size_t length, | |
const UA_DataType *type, Ctx *ctx) { | |
/* Check and convert the array length to int32 */ | |
i32 signed_length = -1; | |
if(length > UA_INT32_MAX) | |
return UA_STATUSCODE_BADINTERNALERROR; | |
if(length > 0) | |
signed_length = (i32)length; | |
else if(src == UA_EMPTY_ARRAY_SENTINEL) | |
signed_length = 0; | |
/* Encode the array length */ | |
status ret = ENCODE_WITHEXCHANGE(&signed_length, UA_TYPES_INT32); | |
/* Quit early? */ | |
if(ret != UA_STATUSCODE_GOOD || length == 0) | |
return ret; | |
/* Encode the content */ | |
if(!type->overlayable) | |
return Array_encodeBinaryComplex((uintptr_t)src, length, type, ctx); | |
return Array_encodeBinaryOverlayable((uintptr_t)src, length, type->memSize, ctx); | |
} | |
static status | |
Array_decodeBinary(void *UA_RESTRICT *UA_RESTRICT dst, size_t *out_length, | |
const UA_DataType *type, Ctx *ctx) { | |
/* Decode the length */ | |
i32 signed_length; | |
status ret = DECODE_DIRECT(&signed_length, UInt32); /* Int32 */ | |
if(ret != UA_STATUSCODE_GOOD) | |
return ret; | |
/* Return early for empty arrays */ | |
if(signed_length <= 0) { | |
*out_length = 0; | |
if(signed_length < 0) | |
*dst = NULL; | |
else | |
*dst = UA_EMPTY_ARRAY_SENTINEL; | |
return UA_STATUSCODE_GOOD; | |
} | |
/* Filter out arrays that can obviously not be decoded, because the message | |
* is too small for the array length. This prevents the allocation of very | |
* long arrays for bogus messages.*/ | |
size_t length = (size_t)signed_length; | |
if(ctx->pos + ((type->memSize * length) / 32) > ctx->end) | |
return UA_STATUSCODE_BADDECODINGERROR; | |
/* Allocate memory */ | |
*dst = UA_calloc(length, type->memSize); | |
if(!*dst) | |
return UA_STATUSCODE_BADOUTOFMEMORY; | |
if(type->overlayable) { | |
/* memcpy overlayable array */ | |
if(ctx->end < ctx->pos + (type->memSize * length)) { | |
UA_free(*dst); | |
*dst = NULL; | |
return UA_STATUSCODE_BADDECODINGERROR; | |
} | |
memcpy(*dst, ctx->pos, type->memSize * length); | |
ctx->pos += type->memSize * length; | |
} else { | |
/* Decode array members */ | |
uintptr_t ptr = (uintptr_t)*dst; | |
for(size_t i = 0; i < length; ++i) { | |
ret = decodeBinaryJumpTable[type->typeKind]((void*)ptr, type, ctx); | |
if(ret != UA_STATUSCODE_GOOD) { | |
/* +1 because last element is also already initialized */ | |
UA_Array_delete(*dst, i+1, type); | |
*dst = NULL; | |
return ret; | |
} | |
ptr += type->memSize; | |
} | |
} | |
*out_length = length; | |
return UA_STATUSCODE_GOOD; | |
} | |
/*****************/ | |
/* Builtin Types */ | |
/*****************/ | |
ENCODE_BINARY(String) { | |
return Array_encodeBinary(src->data, src->length, &UA_TYPES[UA_TYPES_BYTE], ctx); | |
} | |
DECODE_BINARY(String) { | |
return Array_decodeBinary((void**)&dst->data, &dst->length, &UA_TYPES[UA_TYPES_BYTE], ctx); | |
} | |
/* Guid */ | |
ENCODE_BINARY(Guid) { | |
status ret = UA_STATUSCODE_GOOD; | |
ret |= ENCODE_DIRECT(&src->data1, UInt32); | |
ret |= ENCODE_DIRECT(&src->data2, UInt16); | |
ret |= ENCODE_DIRECT(&src->data3, UInt16); | |
if(ctx->pos + (8*sizeof(u8)) > ctx->end) | |
return UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED; | |
memcpy(ctx->pos, src->data4, 8*sizeof(u8)); | |
ctx->pos += 8; | |
return ret; | |
} | |
DECODE_BINARY(Guid) { | |
status ret = UA_STATUSCODE_GOOD; | |
ret |= DECODE_DIRECT(&dst->data1, UInt32); | |
ret |= DECODE_DIRECT(&dst->data2, UInt16); | |
ret |= DECODE_DIRECT(&dst->data3, UInt16); | |
if(ctx->pos + (8*sizeof(u8)) > ctx->end) | |
return UA_STATUSCODE_BADDECODINGERROR; | |
memcpy(dst->data4, ctx->pos, 8*sizeof(u8)); | |
ctx->pos += 8; | |
return ret; | |
} | |
/* NodeId */ | |
#define UA_NODEIDTYPE_NUMERIC_TWOBYTE 0u | |
#define UA_NODEIDTYPE_NUMERIC_FOURBYTE 1u | |
#define UA_NODEIDTYPE_NUMERIC_COMPLETE 2u | |
#define UA_EXPANDEDNODEID_SERVERINDEX_FLAG 0x40u | |
#define UA_EXPANDEDNODEID_NAMESPACEURI_FLAG 0x80u | |
/* For ExpandedNodeId, we prefill the encoding mask. */ | |
static status | |
NodeId_encodeBinaryWithEncodingMask(UA_NodeId const *src, u8 encoding, Ctx *ctx) { | |
status ret = UA_STATUSCODE_GOOD; | |
switch(src->identifierType) { | |
case UA_NODEIDTYPE_NUMERIC: | |
if(src->identifier.numeric > UA_UINT16_MAX || src->namespaceIndex > UA_BYTE_MAX) { | |
encoding |= UA_NODEIDTYPE_NUMERIC_COMPLETE; | |
ret |= ENCODE_DIRECT(&encoding, Byte); | |
ret |= ENCODE_DIRECT(&src->namespaceIndex, UInt16); | |
ret |= ENCODE_DIRECT(&src->identifier.numeric, UInt32); | |
} else if(src->identifier.numeric > UA_BYTE_MAX || src->namespaceIndex > 0) { | |
encoding |= UA_NODEIDTYPE_NUMERIC_FOURBYTE; | |
ret |= ENCODE_DIRECT(&encoding, Byte); | |
u8 nsindex = (u8)src->namespaceIndex; | |
ret |= ENCODE_DIRECT(&nsindex, Byte); | |
u16 identifier16 = (u16)src->identifier.numeric; | |
ret |= ENCODE_DIRECT(&identifier16, UInt16); | |
} else { | |
encoding |= UA_NODEIDTYPE_NUMERIC_TWOBYTE; | |
ret |= ENCODE_DIRECT(&encoding, Byte); | |
u8 identifier8 = (u8)src->identifier.numeric; | |
ret |= ENCODE_DIRECT(&identifier8, Byte); | |
} | |
break; | |
case UA_NODEIDTYPE_STRING:encoding |= (u8)UA_NODEIDTYPE_STRING; | |
ret |= ENCODE_DIRECT(&encoding, Byte); | |
ret |= ENCODE_DIRECT(&src->namespaceIndex, UInt16); | |
if(ret != UA_STATUSCODE_GOOD) | |
return ret; | |
ret = ENCODE_DIRECT(&src->identifier.string, String); | |
break; | |
case UA_NODEIDTYPE_GUID:encoding |= (u8)UA_NODEIDTYPE_GUID; | |
ret |= ENCODE_DIRECT(&encoding, Byte); | |
ret |= ENCODE_DIRECT(&src->namespaceIndex, UInt16); | |
ret |= ENCODE_DIRECT(&src->identifier.guid, Guid); | |
break; | |
case UA_NODEIDTYPE_BYTESTRING:encoding |= (u8)UA_NODEIDTYPE_BYTESTRING; | |
ret |= ENCODE_DIRECT(&encoding, Byte); | |
ret |= ENCODE_DIRECT(&src->namespaceIndex, UInt16); | |
if(ret != UA_STATUSCODE_GOOD) | |
return ret; | |
ret = ENCODE_DIRECT(&src->identifier.byteString, String); /* ByteString */ | |
break; | |
default: | |
return UA_STATUSCODE_BADINTERNALERROR; | |
} | |
return ret; | |
} | |
ENCODE_BINARY(NodeId) { | |
return NodeId_encodeBinaryWithEncodingMask(src, 0, ctx); | |
} | |
DECODE_BINARY(NodeId) { | |
u8 dstByte = 0, encodingByte = 0; | |
u16 dstUInt16 = 0; | |
/* Decode the encoding bitfield */ | |
status ret = DECODE_DIRECT(&encodingByte, Byte); | |
if(ret != UA_STATUSCODE_GOOD) | |
return ret; | |
/* Filter out the bits used only for ExpandedNodeIds */ | |
encodingByte &= (u8)~(u8)(UA_EXPANDEDNODEID_SERVERINDEX_FLAG | | |
UA_EXPANDEDNODEID_NAMESPACEURI_FLAG); | |
/* Decode the namespace and identifier */ | |
switch(encodingByte) { | |
case UA_NODEIDTYPE_NUMERIC_TWOBYTE: | |
dst->identifierType = UA_NODEIDTYPE_NUMERIC; | |
ret = DECODE_DIRECT(&dstByte, Byte); | |
dst->identifier.numeric = dstByte; | |
dst->namespaceIndex = 0; | |
break; | |
case UA_NODEIDTYPE_NUMERIC_FOURBYTE: | |
dst->identifierType = UA_NODEIDTYPE_NUMERIC; | |
ret |= DECODE_DIRECT(&dstByte, Byte); | |
dst->namespaceIndex = dstByte; | |
ret |= DECODE_DIRECT(&dstUInt16, UInt16); | |
dst->identifier.numeric = dstUInt16; | |
break; | |
case UA_NODEIDTYPE_NUMERIC_COMPLETE: | |
dst->identifierType = UA_NODEIDTYPE_NUMERIC; | |
ret |= DECODE_DIRECT(&dst->namespaceIndex, UInt16); | |
ret |= DECODE_DIRECT(&dst->identifier.numeric, UInt32); | |
break; | |
case UA_NODEIDTYPE_STRING: | |
dst->identifierType = UA_NODEIDTYPE_STRING; | |
ret |= DECODE_DIRECT(&dst->namespaceIndex, UInt16); | |
ret |= DECODE_DIRECT(&dst->identifier.string, String); | |
break; | |
case UA_NODEIDTYPE_GUID: | |
dst->identifierType = UA_NODEIDTYPE_GUID; | |
ret |= DECODE_DIRECT(&dst->namespaceIndex, UInt16); | |
ret |= DECODE_DIRECT(&dst->identifier.guid, Guid); | |
break; | |
case UA_NODEIDTYPE_BYTESTRING: | |
dst->identifierType = UA_NODEIDTYPE_BYTESTRING; | |
ret |= DECODE_DIRECT(&dst->namespaceIndex, UInt16); | |
ret |= DECODE_DIRECT(&dst->identifier.byteString, String); /* ByteString */ | |
break; | |
default: | |
ret |= UA_STATUSCODE_BADINTERNALERROR; | |
break; | |
} | |
return ret; | |
} | |
/* ExpandedNodeId */ | |
ENCODE_BINARY(ExpandedNodeId) { | |
/* Set up the encoding mask */ | |
u8 encoding = 0; | |
if((void*)src->namespaceUri.data > UA_EMPTY_ARRAY_SENTINEL) | |
encoding |= UA_EXPANDEDNODEID_NAMESPACEURI_FLAG; | |
if(src->serverIndex > 0) | |
encoding |= UA_EXPANDEDNODEID_SERVERINDEX_FLAG; | |
/* Encode the NodeId */ | |
status ret = NodeId_encodeBinaryWithEncodingMask(&src->nodeId, encoding, ctx); | |
if(ret != UA_STATUSCODE_GOOD) | |
return ret; | |
/* Encode the namespace. */ | |
if((void*)src->namespaceUri.data > UA_EMPTY_ARRAY_SENTINEL) { | |
ret = ENCODE_DIRECT(&src->namespaceUri, String); | |
if(ret != UA_STATUSCODE_GOOD) | |
return ret; | |
} | |
/* Encode the serverIndex */ | |
if(src->serverIndex > 0) | |
ret = ENCODE_WITHEXCHANGE(&src->serverIndex, UA_TYPES_UINT32); | |
return ret; | |
} | |
DECODE_BINARY(ExpandedNodeId) { | |
/* Decode the encoding mask */ | |
if(ctx->pos >= ctx->end) | |
return UA_STATUSCODE_BADDECODINGERROR; | |
u8 encoding = *ctx->pos; | |
/* Decode the NodeId */ | |
status ret = DECODE_DIRECT(&dst->nodeId, NodeId); | |
/* Decode the NamespaceUri */ | |
if(encoding & UA_EXPANDEDNODEID_NAMESPACEURI_FLAG) { | |
dst->nodeId.namespaceIndex = 0; | |
ret |= DECODE_DIRECT(&dst->namespaceUri, String); | |
} | |
/* Decode the ServerIndex */ | |
if(encoding & UA_EXPANDEDNODEID_SERVERINDEX_FLAG) | |
ret |= DECODE_DIRECT(&dst->serverIndex, UInt32); | |
return ret; | |
} | |
/* QualifiedName */ | |
ENCODE_BINARY(QualifiedName) { | |
status ret = ENCODE_DIRECT(&src->namespaceIndex, UInt16); | |
ret |= ENCODE_DIRECT(&src->name, String); | |
return ret; | |
} | |
DECODE_BINARY(QualifiedName) { | |
status ret = DECODE_DIRECT(&dst->namespaceIndex, UInt16); | |
ret |= DECODE_DIRECT(&dst->name, String); | |
return ret; | |
} | |
/* LocalizedText */ | |
#define UA_LOCALIZEDTEXT_ENCODINGMASKTYPE_LOCALE 0x01u | |
#define UA_LOCALIZEDTEXT_ENCODINGMASKTYPE_TEXT 0x02u | |
ENCODE_BINARY(LocalizedText) { | |
/* Set up the encoding mask */ | |
u8 encoding = 0; | |
if(src->locale.data) | |
encoding |= UA_LOCALIZEDTEXT_ENCODINGMASKTYPE_LOCALE; | |
if(src->text.data) | |
encoding |= UA_LOCALIZEDTEXT_ENCODINGMASKTYPE_TEXT; | |
/* Encode the encoding byte */ | |
status ret = ENCODE_DIRECT(&encoding, Byte); | |
if(ret != UA_STATUSCODE_GOOD) | |
return ret; | |
/* Encode the strings */ | |
if(encoding & UA_LOCALIZEDTEXT_ENCODINGMASKTYPE_LOCALE) | |
ret |= ENCODE_DIRECT(&src->locale, String); | |
if(encoding & UA_LOCALIZEDTEXT_ENCODINGMASKTYPE_TEXT) | |
ret |= ENCODE_DIRECT(&src->text, String); | |
return ret; | |
} | |
DECODE_BINARY(LocalizedText) { | |
/* Decode the encoding mask */ | |
u8 encoding = 0; | |
status ret = DECODE_DIRECT(&encoding, Byte); | |
/* Decode the content */ | |
if(encoding & UA_LOCALIZEDTEXT_ENCODINGMASKTYPE_LOCALE) | |
ret |= DECODE_DIRECT(&dst->locale, String); | |
if(encoding & UA_LOCALIZEDTEXT_ENCODINGMASKTYPE_TEXT) | |
ret |= DECODE_DIRECT(&dst->text, String); | |
return ret; | |
} | |
/* The binary encoding has a different nodeid from the data type. So it is not | |
* possible to reuse UA_findDataType */ | |
static const UA_DataType * | |
UA_findDataTypeByBinaryInternal(const UA_NodeId *typeId, Ctx *ctx) { | |
/* We only store a numeric identifier for the encoding nodeid of data types */ | |
if(typeId->identifierType != UA_NODEIDTYPE_NUMERIC) | |
return NULL; | |
/* Always look in built-in types first | |
* (may contain data types from all namespaces) */ | |
for(size_t i = 0; i < UA_TYPES_COUNT; ++i) { | |
if(UA_TYPES[i].binaryEncodingId == typeId->identifier.numeric && | |
UA_TYPES[i].typeId.namespaceIndex == typeId->namespaceIndex) | |
return &UA_TYPES[i]; | |
} | |
const UA_DataTypeArray *customTypes = ctx->customTypes; | |
while(customTypes) { | |
for(size_t i = 0; i < customTypes->typesSize; ++i) { | |
if(customTypes->types[i].binaryEncodingId == typeId->identifier.numeric && | |
customTypes->types[i].typeId.namespaceIndex == typeId->namespaceIndex) | |
return &customTypes->types[i]; | |
} | |
customTypes = customTypes->next; | |
} | |
return NULL; | |
} | |
const UA_DataType * | |
UA_findDataTypeByBinary(const UA_NodeId *typeId) { | |
Ctx ctx; | |
ctx.customTypes = NULL; | |
return UA_findDataTypeByBinaryInternal(typeId, &ctx); | |
} | |
/* ExtensionObject */ | |
ENCODE_BINARY(ExtensionObject) { | |
u8 encoding = (u8)src->encoding; | |
/* No content or already encoded content. */ | |
if(encoding <= UA_EXTENSIONOBJECT_ENCODED_XML) { | |
status ret = ENCODE_DIRECT(&src->content.encoded.typeId, NodeId); | |
if(ret != UA_STATUSCODE_GOOD) | |
return ret; | |
ret = ENCODE_WITHEXCHANGE(&encoding, UA_TYPES_BYTE); | |
if(ret != UA_STATUSCODE_GOOD) | |
return ret; | |
switch(src->encoding) { | |
case UA_EXTENSIONOBJECT_ENCODED_NOBODY: | |
break; | |
case UA_EXTENSIONOBJECT_ENCODED_BYTESTRING: | |
case UA_EXTENSIONOBJECT_ENCODED_XML: | |
ret = ENCODE_DIRECT(&src->content.encoded.body, String); /* ByteString */ | |
break; | |
default: | |
ret = UA_STATUSCODE_BADINTERNALERROR; | |
} | |
return ret; | |
} | |
/* Cannot encode with no data or no type description */ | |
if(!src->content.decoded.type || !src->content.decoded.data) | |
return UA_STATUSCODE_BADENCODINGERROR; | |
/* Write the NodeId for the binary encoded type. The NodeId is always | |
* numeric, so no buffer replacement is taking place. */ | |
UA_NodeId typeId = src->content.decoded.type->typeId; | |
if(typeId.identifierType != UA_NODEIDTYPE_NUMERIC) | |
return UA_STATUSCODE_BADENCODINGERROR; | |
typeId.identifier.numeric = src->content.decoded.type->binaryEncodingId; | |
status ret = ENCODE_DIRECT(&typeId, NodeId); | |
/* Write the encoding byte */ | |
encoding = UA_EXTENSIONOBJECT_ENCODED_BYTESTRING; | |
ret |= ENCODE_DIRECT(&encoding, Byte); | |
/* Compute the content length */ | |
const UA_DataType *contentType = src->content.decoded.type; | |
size_t len = UA_calcSizeBinary(src->content.decoded.data, contentType); | |
/* Encode the content length */ | |
if(len > UA_INT32_MAX) | |
return UA_STATUSCODE_BADENCODINGERROR; | |
i32 signed_len = (i32)len; | |
ret |= ENCODE_DIRECT(&signed_len, UInt32); /* Int32 */ | |
/* Return early upon failures (no buffer exchange until here) */ | |
if(ret != UA_STATUSCODE_GOOD) | |
return ret; | |
/* Encode the content */ | |
return encodeWithExchangeBuffer(src->content.decoded.data, contentType, ctx); | |
} | |
static status | |
ExtensionObject_decodeBinaryContent(UA_ExtensionObject *dst, const UA_NodeId *typeId, Ctx *ctx) { | |
/* Lookup the datatype */ | |
const UA_DataType *type = UA_findDataTypeByBinaryInternal(typeId, ctx); | |
/* Unknown type, just take the binary content */ | |
if(!type) { | |
dst->encoding = UA_EXTENSIONOBJECT_ENCODED_BYTESTRING; | |
UA_NodeId_copy(typeId, &dst->content.encoded.typeId); | |
return DECODE_DIRECT(&dst->content.encoded.body, String); /* ByteString */ | |
} | |
/* Allocate memory */ | |
dst->content.decoded.data = UA_new(type); | |
if(!dst->content.decoded.data) | |
return UA_STATUSCODE_BADOUTOFMEMORY; | |
/* Jump over the length field (TODO: check if the decoded length matches) */ | |
ctx->pos += 4; | |
/* Decode */ | |
dst->encoding = UA_EXTENSIONOBJECT_DECODED; | |
dst->content.decoded.type = type; | |
return decodeBinaryJumpTable[type->typeKind](dst->content.decoded.data, type, ctx); | |
} | |
DECODE_BINARY(ExtensionObject) { | |
u8 encoding = 0; | |
UA_NodeId binTypeId; /* Can contain a string nodeid. But no corresponding | |
* type is then found in open62541. We only store | |
* numerical nodeids of the binary encoding identifier. | |
* The extenionobject will be decoded to contain a | |
* binary blob. */ | |
UA_NodeId_init(&binTypeId); | |
status ret = UA_STATUSCODE_GOOD; | |
ret |= DECODE_DIRECT(&binTypeId, NodeId); | |
ret |= DECODE_DIRECT(&encoding, Byte); | |
if(ret != UA_STATUSCODE_GOOD) { | |
UA_NodeId_clear(&binTypeId); | |
return ret; | |
} | |
switch(encoding) { | |
case UA_EXTENSIONOBJECT_ENCODED_BYTESTRING: | |
ret = ExtensionObject_decodeBinaryContent(dst, &binTypeId, ctx); | |
UA_NodeId_deleteMembers(&binTypeId); | |
break; | |
case UA_EXTENSIONOBJECT_ENCODED_NOBODY: | |
dst->encoding = (UA_ExtensionObjectEncoding)encoding; | |
dst->content.encoded.typeId = binTypeId; /* move to dst */ | |
dst->content.encoded.body = UA_BYTESTRING_NULL; | |
break; | |
case UA_EXTENSIONOBJECT_ENCODED_XML: | |
dst->encoding = (UA_ExtensionObjectEncoding)encoding; | |
dst->content.encoded.typeId = binTypeId; /* move to dst */ | |
ret = DECODE_DIRECT(&dst->content.encoded.body, String); /* ByteString */ | |
if(ret != UA_STATUSCODE_GOOD) | |
UA_NodeId_clear(&dst->content.encoded.typeId); | |
break; | |
default: | |
UA_NodeId_clear(&binTypeId); | |
ret = UA_STATUSCODE_BADDECODINGERROR; | |
break; | |
} | |
return ret; | |
} | |
/* Variant */ | |
static status | |
Variant_encodeBinaryWrapExtensionObject(const UA_Variant *src, | |
const UA_Boolean isArray, Ctx *ctx) { | |
/* Default to 1 for a scalar. */ | |
size_t length = 1; | |
/* Encode the array length if required */ | |
status ret = UA_STATUSCODE_GOOD; | |
if(isArray) { | |
if(src->arrayLength > UA_INT32_MAX) | |
return UA_STATUSCODE_BADENCODINGERROR; | |
length = src->arrayLength; | |
i32 encodedLength = (i32)src->arrayLength; | |
ret = ENCODE_DIRECT(&encodedLength, UInt32); /* Int32 */ | |
if(ret != UA_STATUSCODE_GOOD) | |
return ret; | |
} | |
/* Set up the ExtensionObject */ | |
UA_ExtensionObject eo; | |
UA_ExtensionObject_init(&eo); | |
eo.encoding = UA_EXTENSIONOBJECT_DECODED; | |
eo.content.decoded.type = src->type; | |
const u16 memSize = src->type->memSize; | |
uintptr_t ptr = (uintptr_t)src->data; | |
/* Iterate over the array */ | |
for(size_t i = 0; i < length && ret == UA_STATUSCODE_GOOD; ++i) { | |
eo.content.decoded.data = (void*)ptr; | |
ret = encodeWithExchangeBuffer(&eo, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT], ctx); | |
ptr += memSize; | |
} | |
return ret; | |
} | |
enum UA_VARIANT_ENCODINGMASKTYPE { | |
UA_VARIANT_ENCODINGMASKTYPE_TYPEID_MASK = 0x3Fu, /* bits 0:5 */ | |
UA_VARIANT_ENCODINGMASKTYPE_DIMENSIONS = (u8)(0x01u << 6u), /* bit 6 */ | |
UA_VARIANT_ENCODINGMASKTYPE_ARRAY = (u8)(0x01u << 7u) /* bit 7 */ | |
}; | |
ENCODE_BINARY(Variant) { | |
/* Quit early for the empty variant */ | |
u8 encoding = 0; | |
if(!src->type) | |
return ENCODE_DIRECT(&encoding, Byte); | |
/* Set the content type in the encoding mask */ | |
const UA_Boolean isBuiltin = (src->type->typeKind <= UA_DATATYPEKIND_DIAGNOSTICINFO); | |
const UA_Boolean isEnum = (src->type->typeKind == UA_DATATYPEKIND_ENUM); | |
if(isBuiltin) | |
encoding = (u8)(encoding | (u8)((u8)UA_VARIANT_ENCODINGMASKTYPE_TYPEID_MASK & (u8)(src->type->typeKind + 1u))); | |
else if(isEnum) | |
encoding = (u8)(encoding | (u8)((u8)UA_VARIANT_ENCODINGMASKTYPE_TYPEID_MASK & (u8)(UA_TYPES_INT32 + 1u))); | |
else | |
encoding = (u8)(encoding | (u8)((u8)UA_VARIANT_ENCODINGMASKTYPE_TYPEID_MASK & (u8)(UA_TYPES_EXTENSIONOBJECT + 1u))); | |
/* Set the array type in the encoding mask */ | |
const UA_Boolean isArray = src->arrayLength > 0 || src->data <= UA_EMPTY_ARRAY_SENTINEL; | |
const UA_Boolean hasDimensions = isArray && src->arrayDimensionsSize > 0; | |
if(isArray) { | |
encoding |= (u8)UA_VARIANT_ENCODINGMASKTYPE_ARRAY; | |
if(hasDimensions) | |
encoding |= (u8)UA_VARIANT_ENCODINGMASKTYPE_DIMENSIONS; | |
} | |
/* Encode the encoding byte */ | |
status ret = ENCODE_DIRECT(&encoding, Byte); | |
if(ret != UA_STATUSCODE_GOOD) | |
return ret; | |
/* Encode the content */ | |
if(!isBuiltin && !isEnum) | |
ret = Variant_encodeBinaryWrapExtensionObject(src, isArray, ctx); | |
else if(!isArray) | |
ret = encodeWithExchangeBuffer(src->data, src->type, ctx); | |
else | |
ret = Array_encodeBinary(src->data, src->arrayLength, src->type, ctx); | |
/* Encode the array dimensions */ | |
if(hasDimensions && ret == UA_STATUSCODE_GOOD) | |
ret = Array_encodeBinary(src->arrayDimensions, src->arrayDimensionsSize, | |
&UA_TYPES[UA_TYPES_INT32], ctx); | |
return ret; | |
} | |
static status | |
Variant_decodeBinaryUnwrapExtensionObject(UA_Variant *dst, Ctx *ctx) { | |
/* Save the position in the ByteString. If unwrapping is not possible, start | |
* from here to decode a normal ExtensionObject. */ | |
u8 *old_pos = ctx->pos; | |
/* Decode the DataType */ | |
UA_NodeId typeId; | |
UA_NodeId_init(&typeId); | |
status ret = DECODE_DIRECT(&typeId, NodeId); | |
if(ret != UA_STATUSCODE_GOOD) | |
return ret; | |
/* Decode the EncodingByte */ | |
u8 encoding; | |
ret = DECODE_DIRECT(&encoding, Byte); | |
if(ret != UA_STATUSCODE_GOOD) { | |
UA_NodeId_clear(&typeId); | |
return ret; | |
} | |
/* Search for the datatype. Default to ExtensionObject. */ | |
if(encoding == UA_EXTENSIONOBJECT_ENCODED_BYTESTRING && | |
(dst->type = UA_findDataTypeByBinaryInternal(&typeId, ctx)) != NULL) { | |
/* Jump over the length field (TODO: check if length matches) */ | |
ctx->pos += 4; | |
} else { | |
/* Reset and decode as ExtensionObject */ | |
dst->type = &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]; | |
ctx->pos = old_pos; | |
UA_NodeId_clear(&typeId); | |
} | |
/* Allocate memory */ | |
dst->data = UA_new(dst->type); | |
if(!dst->data) | |
return UA_STATUSCODE_BADOUTOFMEMORY; | |
/* Decode the content */ | |
return decodeBinaryJumpTable[dst->type->typeKind](dst->data, dst->type, ctx); | |
} | |
/* The resulting variant always has the storagetype UA_VARIANT_DATA. */ | |
DECODE_BINARY(Variant) { | |
/* Decode the encoding byte */ | |
u8 encodingByte; | |
status ret = DECODE_DIRECT(&encodingByte, Byte); | |
if(ret != UA_STATUSCODE_GOOD) | |
return ret; | |
/* Return early for an empty variant (was already _inited) */ | |
if(encodingByte == 0) | |
return UA_STATUSCODE_GOOD; | |
/* Does the variant contain an array? */ | |
const UA_Boolean isArray = (encodingByte & (u8)UA_VARIANT_ENCODINGMASKTYPE_ARRAY) > 0; | |
/* Get the datatype of the content. The type must be a builtin data type. | |
* All not-builtin types are wrapped in an ExtensionObject. The "type kind" | |
* for types up to DiagnsticInfo equals to the index in the encoding | |
* byte. */ | |
size_t typeKind = (size_t)((encodingByte & (u8)UA_VARIANT_ENCODINGMASKTYPE_TYPEID_MASK) - 1); | |
if(typeKind > UA_DATATYPEKIND_DIAGNOSTICINFO) | |
return UA_STATUSCODE_BADDECODINGERROR; | |
/* A variant cannot contain a variant. But it can contain an array of | |
* variants */ | |
if(typeKind == UA_DATATYPEKIND_VARIANT && !isArray) | |
return UA_STATUSCODE_BADDECODINGERROR; | |
/* Check the recursion limit */ | |
if(ctx->depth > UA_ENCODING_MAX_RECURSION) | |
return UA_STATUSCODE_BADENCODINGERROR; | |
ctx->depth++; | |
/* Decode the content */ | |
dst->type = &UA_TYPES[typeKind]; | |
if(isArray) { | |
ret = Array_decodeBinary(&dst->data, &dst->arrayLength, dst->type, ctx); | |
} else if(typeKind != UA_DATATYPEKIND_EXTENSIONOBJECT) { | |
dst->data = UA_new(dst->type); | |
if(!dst->data) | |
return UA_STATUSCODE_BADOUTOFMEMORY; | |
ret = decodeBinaryJumpTable[typeKind](dst->data, dst->type, ctx); | |
} else { | |
ret = Variant_decodeBinaryUnwrapExtensionObject(dst, ctx); | |
} | |
/* Decode array dimensions */ | |
if(isArray && (encodingByte & (u8)UA_VARIANT_ENCODINGMASKTYPE_DIMENSIONS) > 0) | |
ret |= Array_decodeBinary((void**)&dst->arrayDimensions, &dst->arrayDimensionsSize, | |
&UA_TYPES[UA_TYPES_INT32], ctx); | |
ctx->depth--; | |
return ret; | |
} | |
/* DataValue */ | |
ENCODE_BINARY(DataValue) { | |
/* Set up the encoding mask */ | |
u8 encodingMask = src->hasValue; | |
encodingMask |= (u8)(src->hasStatus << 1u); | |
encodingMask |= (u8)(src->hasSourceTimestamp << 2u); | |
encodingMask |= (u8)(src->hasServerTimestamp << 3u); | |
encodingMask |= (u8)(src->hasSourcePicoseconds << 4u); | |
encodingMask |= (u8)(src->hasServerPicoseconds << 5u); | |
/* Encode the encoding byte */ | |
status ret = ENCODE_DIRECT(&encodingMask, Byte); | |
if(ret != UA_STATUSCODE_GOOD) | |
return ret; | |
/* Encode the variant. */ | |
if(src->hasValue) { | |
ret = ENCODE_DIRECT(&src->value, Variant); | |
if(ret != UA_STATUSCODE_GOOD) | |
return ret; | |
} | |
if(src->hasStatus) | |
ret |= ENCODE_WITHEXCHANGE(&src->status, UA_TYPES_STATUSCODE); | |
if(src->hasSourceTimestamp) | |
ret |= ENCODE_WITHEXCHANGE(&src->sourceTimestamp, UA_TYPES_DATETIME); | |
if(src->hasSourcePicoseconds) | |
ret |= ENCODE_WITHEXCHANGE(&src->sourcePicoseconds, UA_TYPES_UINT16); | |
if(src->hasServerTimestamp) | |
ret |= ENCODE_WITHEXCHANGE(&src->serverTimestamp, UA_TYPES_DATETIME); | |
if(src->hasServerPicoseconds) | |
ret |= ENCODE_WITHEXCHANGE(&src->serverPicoseconds, UA_TYPES_UINT16); | |
return ret; | |
} | |
#define MAX_PICO_SECONDS 9999 | |
DECODE_BINARY(DataValue) { | |
/* Decode the encoding mask */ | |
u8 encodingMask; | |
status ret = DECODE_DIRECT(&encodingMask, Byte); | |
if(ret != UA_STATUSCODE_GOOD) | |
return ret; | |
/* Check the recursion limit */ | |
if(ctx->depth > UA_ENCODING_MAX_RECURSION) | |
return UA_STATUSCODE_BADENCODINGERROR; | |
ctx->depth++; | |
/* Decode the content */ | |
if(encodingMask & 0x01u) { | |
dst->hasValue = true; | |
ret |= DECODE_DIRECT(&dst->value, Variant); | |
} | |
if(encodingMask & 0x02u) { | |
dst->hasStatus = true; | |
ret |= DECODE_DIRECT(&dst->status, UInt32); /* StatusCode */ | |
} | |
if(encodingMask & 0x04u) { | |
dst->hasSourceTimestamp = true; | |
ret |= DECODE_DIRECT(&dst->sourceTimestamp, UInt64); /* DateTime */ | |
} | |
if(encodingMask & 0x10u) { | |
dst->hasSourcePicoseconds = true; | |
ret |= DECODE_DIRECT(&dst->sourcePicoseconds, UInt16); | |
if(dst->sourcePicoseconds > MAX_PICO_SECONDS) | |
dst->sourcePicoseconds = MAX_PICO_SECONDS; | |
} | |
if(encodingMask & 0x08u) { | |
dst->hasServerTimestamp = true; | |
ret |= DECODE_DIRECT(&dst->serverTimestamp, UInt64); /* DateTime */ | |
} | |
if(encodingMask & 0x20u) { | |
dst->hasServerPicoseconds = true; | |
ret |= DECODE_DIRECT(&dst->serverPicoseconds, UInt16); | |
if(dst->serverPicoseconds > MAX_PICO_SECONDS) | |
dst->serverPicoseconds = MAX_PICO_SECONDS; | |
} | |
ctx->depth--; | |
return ret; | |
} | |
/* DiagnosticInfo */ | |
ENCODE_BINARY(DiagnosticInfo) { | |
/* Set up the encoding mask */ | |
u8 encodingMask = src->hasSymbolicId; | |
encodingMask |= (u8)(src->hasNamespaceUri << 1u); | |
encodingMask |= (u8)(src->hasLocalizedText << 2u); | |
encodingMask |= (u8)(src->hasLocale << 3u); | |
encodingMask |= (u8)(src->hasAdditionalInfo << 4u); | |
encodingMask |= (u8)(src->hasInnerDiagnosticInfo << 5u); | |
/* Encode the numeric content */ | |
status ret = ENCODE_DIRECT(&encodingMask, Byte); | |
if(src->hasSymbolicId) | |
ret |= ENCODE_DIRECT(&src->symbolicId, UInt32); /* Int32 */ | |
if(src->hasNamespaceUri) | |
ret |= ENCODE_DIRECT(&src->namespaceUri, UInt32); /* Int32 */ | |
if(src->hasLocalizedText) | |
ret |= ENCODE_DIRECT(&src->localizedText, UInt32); /* Int32 */ | |
if(src->hasLocale) | |
ret |= ENCODE_DIRECT(&src->locale, UInt32); /* Int32 */ | |
if(ret != UA_STATUSCODE_GOOD) | |
return ret; | |
/* Encode the additional info */ | |
if(src->hasAdditionalInfo) { | |
ret = ENCODE_DIRECT(&src->additionalInfo, String); | |
if(ret != UA_STATUSCODE_GOOD) | |
return ret; | |
} | |
/* Encode the inner status code */ | |
if(src->hasInnerStatusCode) { | |
ret = ENCODE_WITHEXCHANGE(&src->innerStatusCode, UA_TYPES_UINT32); | |
if(ret != UA_STATUSCODE_GOOD) | |
return ret; | |
} | |
/* Encode the inner diagnostic info */ | |
if(src->hasInnerDiagnosticInfo) | |
// innerDiagnosticInfo is already a pointer, so don't use the & reference here | |
ret = ENCODE_WITHEXCHANGE(src->innerDiagnosticInfo, | |
UA_TYPES_DIAGNOSTICINFO); | |
return ret; | |
} | |
DECODE_BINARY(DiagnosticInfo) { | |
/* Decode the encoding mask */ | |
u8 encodingMask; | |
status ret = DECODE_DIRECT(&encodingMask, Byte); | |
if(ret != UA_STATUSCODE_GOOD) | |
return ret; | |
/* Decode the content */ | |
if(encodingMask & 0x01u) { | |
dst->hasSymbolicId = true; | |
ret |= DECODE_DIRECT(&dst->symbolicId, UInt32); /* Int32 */ | |
} | |
if(encodingMask & 0x02u) { | |
dst->hasNamespaceUri = true; | |
ret |= DECODE_DIRECT(&dst->namespaceUri, UInt32); /* Int32 */ | |
} | |
if(encodingMask & 0x04u) { | |
dst->hasLocalizedText = true; | |
ret |= DECODE_DIRECT(&dst->localizedText, UInt32); /* Int32 */ | |
} | |
if(encodingMask & 0x08u) { | |
dst->hasLocale = true; | |
ret |= DECODE_DIRECT(&dst->locale, UInt32); /* Int32 */ | |
} | |
if(encodingMask & 0x10u) { | |
dst->hasAdditionalInfo = true; | |
ret |= DECODE_DIRECT(&dst->additionalInfo, String); | |
} | |
if(encodingMask & 0x20u) { | |
dst->hasInnerStatusCode = true; | |
ret |= DECODE_DIRECT(&dst->innerStatusCode, UInt32); /* StatusCode */ | |
} | |
if(encodingMask & 0x40u) { | |
/* innerDiagnosticInfo is allocated on the heap */ | |
dst->innerDiagnosticInfo = (UA_DiagnosticInfo*) | |
UA_calloc(1, sizeof(UA_DiagnosticInfo)); | |
if(!dst->innerDiagnosticInfo) | |
return UA_STATUSCODE_BADOUTOFMEMORY; | |
dst->hasInnerDiagnosticInfo = true; | |
/* Check the recursion limit */ | |
if(ctx->depth > UA_ENCODING_MAX_RECURSION) | |
return UA_STATUSCODE_BADENCODINGERROR; | |
ctx->depth++; | |
ret |= DECODE_DIRECT(dst->innerDiagnosticInfo, DiagnosticInfo); | |
ctx->depth--; | |
} | |
return ret; | |
} | |
static status | |
encodeBinaryStruct(const void *src, const UA_DataType *type, Ctx *ctx) { | |
/* Check the recursion limit */ | |
if(ctx->depth > UA_ENCODING_MAX_RECURSION) | |
return UA_STATUSCODE_BADENCODINGERROR; | |
ctx->depth++; | |
uintptr_t ptr = (uintptr_t)src; | |
status ret = UA_STATUSCODE_GOOD; | |
u8 membersSize = type->membersSize; | |
const UA_DataType *typelists[2] = { UA_TYPES, &type[-type->typeIndex] }; | |
/* Loop over members */ | |
for(size_t i = 0; i < membersSize; ++i) { | |
const UA_DataTypeMember *m = &type->members[i]; | |
const UA_DataType *mt = &typelists[!m->namespaceZero][m->memberTypeIndex]; | |
ptr += m->padding; | |
/* Array. Buffer-exchange is done inside Array_encodeBinary if required. */ | |
if(m->isArray) { | |
const size_t length = *((const size_t*)ptr); | |
ptr += sizeof(size_t); | |
ret = Array_encodeBinary(*(void *UA_RESTRICT const *)ptr, length, mt, ctx); | |
ptr += sizeof(void*); | |
continue; | |
} | |
/* Scalar */ | |
ret = encodeWithExchangeBuffer((const void*)ptr, mt, ctx); | |
ptr += mt->memSize; | |
} | |
ctx->depth--; | |
return ret; | |
} | |
static status | |
encodeBinaryNotImplemented(const void *src, const UA_DataType *type, Ctx *ctx) { | |
(void)src, (void)type, (void)ctx; | |
return UA_STATUSCODE_BADNOTIMPLEMENTED; | |
} | |
/********************/ | |
/* Structured Types */ | |
/********************/ | |
const encodeBinarySignature encodeBinaryJumpTable[UA_DATATYPEKINDS] = { | |
(encodeBinarySignature)Boolean_encodeBinary, | |
(encodeBinarySignature)Byte_encodeBinary, /* SByte */ | |
(encodeBinarySignature)Byte_encodeBinary, | |
(encodeBinarySignature)UInt16_encodeBinary, /* Int16 */ | |
(encodeBinarySignature)UInt16_encodeBinary, | |
(encodeBinarySignature)UInt32_encodeBinary, /* Int32 */ | |
(encodeBinarySignature)UInt32_encodeBinary, | |
(encodeBinarySignature)UInt64_encodeBinary, /* Int64 */ | |
(encodeBinarySignature)UInt64_encodeBinary, | |
(encodeBinarySignature)Float_encodeBinary, | |
(encodeBinarySignature)Double_encodeBinary, | |
(encodeBinarySignature)String_encodeBinary, | |
(encodeBinarySignature)UInt64_encodeBinary, /* DateTime */ | |
(encodeBinarySignature)Guid_encodeBinary, | |
(encodeBinarySignature)String_encodeBinary, /* ByteString */ | |
(encodeBinarySignature)String_encodeBinary, /* XmlElement */ | |
(encodeBinarySignature)NodeId_encodeBinary, | |
(encodeBinarySignature)ExpandedNodeId_encodeBinary, | |
(encodeBinarySignature)UInt32_encodeBinary, /* StatusCode */ | |
(encodeBinarySignature)QualifiedName_encodeBinary, | |
(encodeBinarySignature)LocalizedText_encodeBinary, | |
(encodeBinarySignature)ExtensionObject_encodeBinary, | |
(encodeBinarySignature)DataValue_encodeBinary, | |
(encodeBinarySignature)Variant_encodeBinary, | |
(encodeBinarySignature)DiagnosticInfo_encodeBinary, | |
(encodeBinarySignature)encodeBinaryNotImplemented, /* Decimal */ | |
(encodeBinarySignature)UInt32_encodeBinary, /* Enumeration */ | |
(encodeBinarySignature)encodeBinaryStruct, | |
(encodeBinarySignature)encodeBinaryNotImplemented, /* Structure with Optional Fields */ | |
(encodeBinarySignature)encodeBinaryStruct, /* Union */ | |
(encodeBinarySignature)encodeBinaryStruct /* BitfieldCluster */ | |
}; | |
status | |
UA_encodeBinary(const void *src, const UA_DataType *type, | |
u8 **bufPos, const u8 **bufEnd, | |
UA_exchangeEncodeBuffer exchangeCallback, void *exchangeHandle) { | |
/* Set up the context */ | |
Ctx ctx; | |
ctx.pos = *bufPos; | |
ctx.end = *bufEnd; | |
ctx.depth = 0; | |
ctx.exchangeBufferCallback = exchangeCallback; | |
ctx.exchangeBufferCallbackHandle = exchangeHandle; | |
if(!ctx.pos) | |
return UA_STATUSCODE_BADINVALIDARGUMENT; | |
/* Encode */ | |
status ret = encodeWithExchangeBuffer(src, type, &ctx); | |
/* Set the new buffer position for the output. Beware that the buffer might | |
* have been exchanged internally. */ | |
*bufPos = ctx.pos; | |
*bufEnd = ctx.end; | |
return ret; | |
} | |
static status | |
decodeBinaryNotImplemented(void *dst, const UA_DataType *type, Ctx *ctx) { | |
(void)dst, (void)type, (void)ctx; | |
return UA_STATUSCODE_BADNOTIMPLEMENTED; | |
} | |
static status | |
decodeBinaryStructure(void *dst, const UA_DataType *type, Ctx *ctx) { | |
/* Check the recursion limit */ | |
if(ctx->depth > UA_ENCODING_MAX_RECURSION) | |
return UA_STATUSCODE_BADENCODINGERROR; | |
ctx->depth++; | |
uintptr_t ptr = (uintptr_t)dst; | |
status ret = UA_STATUSCODE_GOOD; | |
u8 membersSize = type->membersSize; | |
const UA_DataType *typelists[2] = { UA_TYPES, &type[-type->typeIndex] }; | |
/* Loop over members */ | |
for(size_t i = 0; i < membersSize && ret == UA_STATUSCODE_GOOD; ++i) { | |
const UA_DataTypeMember *m = &type->members[i]; | |
const UA_DataType *mt = &typelists[!m->namespaceZero][m->memberTypeIndex]; | |
ptr += m->padding; | |
/* Array */ | |
if(m->isArray) { | |
size_t *length = (size_t*)ptr; | |
ptr += sizeof(size_t); | |
ret = Array_decodeBinary((void *UA_RESTRICT *UA_RESTRICT)ptr, length, mt , ctx); | |
ptr += sizeof(void*); | |
continue; | |
} | |
/* Scalar */ | |
ret = decodeBinaryJumpTable[mt->typeKind]((void *UA_RESTRICT)ptr, mt, ctx); | |
ptr += mt->memSize; | |
} | |
ctx->depth--; | |
return ret; | |
} | |
const decodeBinarySignature decodeBinaryJumpTable[UA_DATATYPEKINDS] = { | |
(decodeBinarySignature)Boolean_decodeBinary, | |
(decodeBinarySignature)Byte_decodeBinary, /* SByte */ | |
(decodeBinarySignature)Byte_decodeBinary, | |
(decodeBinarySignature)UInt16_decodeBinary, /* Int16 */ | |
(decodeBinarySignature)UInt16_decodeBinary, | |
(decodeBinarySignature)UInt32_decodeBinary, /* Int32 */ | |
(decodeBinarySignature)UInt32_decodeBinary, | |
(decodeBinarySignature)UInt64_decodeBinary, /* Int64 */ | |
(decodeBinarySignature)UInt64_decodeBinary, | |
(decodeBinarySignature)Float_decodeBinary, | |
(decodeBinarySignature)Double_decodeBinary, | |
(decodeBinarySignature)String_decodeBinary, | |
(decodeBinarySignature)UInt64_decodeBinary, /* DateTime */ | |
(decodeBinarySignature)Guid_decodeBinary, | |
(decodeBinarySignature)String_decodeBinary, /* ByteString */ | |
(decodeBinarySignature)String_decodeBinary, /* XmlElement */ | |
(decodeBinarySignature)NodeId_decodeBinary, | |
(decodeBinarySignature)ExpandedNodeId_decodeBinary, | |
(decodeBinarySignature)UInt32_decodeBinary, /* StatusCode */ | |
(decodeBinarySignature)QualifiedName_decodeBinary, | |
(decodeBinarySignature)LocalizedText_decodeBinary, | |
(decodeBinarySignature)ExtensionObject_decodeBinary, | |
(decodeBinarySignature)DataValue_decodeBinary, | |
(decodeBinarySignature)Variant_decodeBinary, | |
(decodeBinarySignature)DiagnosticInfo_decodeBinary, | |
(decodeBinarySignature)decodeBinaryNotImplemented, /* Decimal */ | |
(decodeBinarySignature)UInt32_decodeBinary, /* Enumeration */ | |
(decodeBinarySignature)decodeBinaryStructure, | |
(decodeBinarySignature)decodeBinaryNotImplemented, /* Structure with optional fields */ | |
(decodeBinarySignature)decodeBinaryNotImplemented, /* Union */ | |
(decodeBinarySignature)decodeBinaryNotImplemented /* BitfieldCluster */ | |
}; | |
status | |
UA_decodeBinary(const UA_ByteString *src, size_t *offset, void *dst, | |
const UA_DataType *type, const UA_DataTypeArray *customTypes) { | |
/* Set up the context */ | |
Ctx ctx; | |
ctx.pos = &src->data[*offset]; | |
ctx.end = &src->data[src->length]; | |
ctx.depth = 0; | |
ctx.customTypes = customTypes; | |
/* Decode */ | |
memset(dst, 0, type->memSize); /* Initialize the value */ | |
status ret = decodeBinaryJumpTable[type->typeKind](dst, type, &ctx); | |
if(ret == UA_STATUSCODE_GOOD) { | |
/* Set the new offset */ | |
*offset = (size_t)(ctx.pos - src->data) / sizeof(u8); | |
} else { | |
/* Clean up */ | |
UA_clear(dst, type); | |
memset(dst, 0, type->memSize); | |
} | |
return ret; | |
} | |
/** | |
* Compute the Message Size | |
* ------------------------ | |
* The following methods are used to compute the length of a datum in binary | |
* encoding. */ | |
static size_t | |
Array_calcSizeBinary(const void *src, size_t length, const UA_DataType *type) { | |
size_t s = 4; /* length */ | |
if(type->overlayable) { | |
s += type->memSize * length; | |
return s; | |
} | |
uintptr_t ptr = (uintptr_t)src; | |
for(size_t i = 0; i < length; ++i) { | |
s += calcSizeBinaryJumpTable[type->typeKind]((const void*)ptr, type); | |
ptr += type->memSize; | |
} | |
return s; | |
} | |
static size_t calcSizeBinary1(const void *_, const UA_DataType *__) { (void)_, (void)__; return 1; } | |
static size_t calcSizeBinary2(const void *_, const UA_DataType *__) { (void)_, (void)__; return 2; } | |
static size_t calcSizeBinary4(const void *_, const UA_DataType *__) { (void)_, (void)__; return 4; } | |
static size_t calcSizeBinary8(const void *_, const UA_DataType *__) { (void)_, (void)__; return 8; } | |
CALCSIZE_BINARY(String) { return 4 + src->length; } | |
CALCSIZE_BINARY(Guid) { return 16; } | |
CALCSIZE_BINARY(NodeId) { | |
size_t s = 1; /* Encoding byte */ | |
switch(src->identifierType) { | |
case UA_NODEIDTYPE_NUMERIC: | |
if(src->identifier.numeric > UA_UINT16_MAX || src->namespaceIndex > UA_BYTE_MAX) { | |
s += 6; | |
} else if(src->identifier.numeric > UA_BYTE_MAX || src->namespaceIndex > 0) { | |
s += 3; | |
} else { | |
s += 1; | |
} | |
break; | |
case UA_NODEIDTYPE_BYTESTRING: | |
case UA_NODEIDTYPE_STRING: | |
s += 2; | |
s += String_calcSizeBinary(&src->identifier.string, NULL); | |
break; | |
case UA_NODEIDTYPE_GUID: | |
s += 18; | |
break; | |
default: | |
return 0; | |
} | |
return s; | |
} | |
CALCSIZE_BINARY(ExpandedNodeId) { | |
size_t s = NodeId_calcSizeBinary(&src->nodeId, NULL); | |
if(src->namespaceUri.length > 0) | |
s += String_calcSizeBinary(&src->namespaceUri, NULL); | |
if(src->serverIndex > 0) | |
s += 4; | |
return s; | |
} | |
CALCSIZE_BINARY(QualifiedName) { | |
return 2 + String_calcSizeBinary(&src->name, NULL); | |
} | |
CALCSIZE_BINARY(LocalizedText) { | |
size_t s = 1; /* Encoding byte */ | |
if(src->locale.data) | |
s += String_calcSizeBinary(&src->locale, NULL); | |
if(src->text.data) | |
s += String_calcSizeBinary(&src->text, NULL); | |
return s; | |
} | |
CALCSIZE_BINARY(ExtensionObject) { | |
size_t s = 1; /* Encoding byte */ | |
/* Encoded content */ | |
if(src->encoding <= UA_EXTENSIONOBJECT_ENCODED_XML) { | |
s += NodeId_calcSizeBinary(&src->content.encoded.typeId, NULL); | |
switch(src->encoding) { | |
case UA_EXTENSIONOBJECT_ENCODED_NOBODY: | |
break; | |
case UA_EXTENSIONOBJECT_ENCODED_BYTESTRING: | |
case UA_EXTENSIONOBJECT_ENCODED_XML: | |
s += String_calcSizeBinary(&src->content.encoded.body, NULL); | |
break; | |
default: | |
return 0; | |
} | |
return s; | |
} | |
/* Decoded content */ | |
if(!src->content.decoded.type || !src->content.decoded.data) | |
return 0; | |
if(src->content.decoded.type->typeId.identifierType != UA_NODEIDTYPE_NUMERIC) | |
return 0; | |
s += NodeId_calcSizeBinary(&src->content.decoded.type->typeId, NULL); /* Type encoding length */ | |
s += 4; /* Encoding length field */ | |
const UA_DataType *type = src->content.decoded.type; | |
s += calcSizeBinaryJumpTable[type->typeKind](src->content.decoded.data, type); /* Encoding length */ | |
return s; | |
} | |
CALCSIZE_BINARY(Variant) { | |
size_t s = 1; /* Encoding byte */ | |
if(!src->type) | |
return s; | |
const UA_Boolean isArray = src->arrayLength > 0 || src->data <= UA_EMPTY_ARRAY_SENTINEL; | |
if(isArray) | |
s += Array_calcSizeBinary(src->data, src->arrayLength, src->type); | |
else | |
s += calcSizeBinaryJumpTable[src->type->typeKind](src->data, src->type); | |
const UA_Boolean isBuiltin = (src->type->typeKind <= UA_DATATYPEKIND_DIAGNOSTICINFO); | |
const UA_Boolean isEnum = (src->type->typeKind == UA_DATATYPEKIND_ENUM); | |
if(!isBuiltin && !isEnum) { | |
/* The type is wrapped inside an extensionobject */ | |
/* (NodeId + encoding byte + extension object length) * array length */ | |
size_t length = isArray ? src->arrayLength : 1; | |
s += (NodeId_calcSizeBinary(&src->type->typeId, NULL) + 1 + 4) * length; | |
} | |
const UA_Boolean hasDimensions = isArray && src->arrayDimensionsSize > 0; | |
if(hasDimensions) | |
s += Array_calcSizeBinary(src->arrayDimensions, src->arrayDimensionsSize, | |
&UA_TYPES[UA_TYPES_INT32]); | |
return s; | |
} | |
CALCSIZE_BINARY(DataValue) { | |
size_t s = 1; /* Encoding byte */ | |
if(src->hasValue) | |
s += Variant_calcSizeBinary(&src->value, NULL); | |
if(src->hasStatus) | |
s += 4; | |
if(src->hasSourceTimestamp) | |
s += 8; | |
if(src->hasSourcePicoseconds) | |
s += 2; | |
if(src->hasServerTimestamp) | |
s += 8; | |
if(src->hasServerPicoseconds) | |
s += 2; | |
return s; | |
} | |
CALCSIZE_BINARY(DiagnosticInfo) { | |
size_t s = 1; /* Encoding byte */ | |
if(src->hasSymbolicId) | |
s += 4; | |
if(src->hasNamespaceUri) | |
s += 4; | |
if(src->hasLocalizedText) | |
s += 4; | |
if(src->hasLocale) | |
s += 4; | |
if(src->hasAdditionalInfo) | |
s += String_calcSizeBinary(&src->additionalInfo, NULL); | |
if(src->hasInnerStatusCode) | |
s += 4; | |
if(src->hasInnerDiagnosticInfo) | |
s += DiagnosticInfo_calcSizeBinary(src->innerDiagnosticInfo, NULL); | |
return s; | |
} | |
static size_t | |
calcSizeBinaryStructure(const void *p, const UA_DataType *type) { | |
size_t s = 0; | |
uintptr_t ptr = (uintptr_t)p; | |
u8 membersSize = type->membersSize; | |
const UA_DataType *typelists[2] = { UA_TYPES, &type[-type->typeIndex] }; | |
/* Loop over members */ | |
for(size_t i = 0; i < membersSize; ++i) { | |
const UA_DataTypeMember *member = &type->members[i]; | |
const UA_DataType *membertype = &typelists[!member->namespaceZero][member->memberTypeIndex]; | |
ptr += member->padding; | |
/* Array */ | |
if(member->isArray) { | |
const size_t length = *((const size_t*)ptr); | |
ptr += sizeof(size_t); | |
s += Array_calcSizeBinary(*(void *UA_RESTRICT const *)ptr, length, membertype); | |
ptr += sizeof(void*); | |
continue; | |
} | |
/* Scalar */ | |
s += calcSizeBinaryJumpTable[membertype->typeKind]((const void*)ptr, membertype); | |
ptr += membertype->memSize; | |
} | |
return s; | |
} | |
static size_t | |
calcSizeBinaryNotImplemented(const void *p, const UA_DataType *type) { | |
(void)p, (void)type; | |
return 0; | |
} | |
const calcSizeBinarySignature calcSizeBinaryJumpTable[UA_DATATYPEKINDS] = { | |
(calcSizeBinarySignature)calcSizeBinary1, /* Boolean */ | |
(calcSizeBinarySignature)calcSizeBinary1, /* SByte */ | |
(calcSizeBinarySignature)calcSizeBinary1, /* Byte */ | |
(calcSizeBinarySignature)calcSizeBinary2, /* Int16 */ | |
(calcSizeBinarySignature)calcSizeBinary2, /* UInt16 */ | |
(calcSizeBinarySignature)calcSizeBinary4, /* Int32 */ | |
(calcSizeBinarySignature)calcSizeBinary4, /* UInt32 */ | |
(calcSizeBinarySignature)calcSizeBinary8, /* Int64 */ | |
(calcSizeBinarySignature)calcSizeBinary8, /* UInt64 */ | |
(calcSizeBinarySignature)calcSizeBinary4, /* Float */ | |
(calcSizeBinarySignature)calcSizeBinary8, /* Double */ | |
(calcSizeBinarySignature)String_calcSizeBinary, | |
(calcSizeBinarySignature)calcSizeBinary8, /* DateTime */ | |
(calcSizeBinarySignature)Guid_calcSizeBinary, | |
(calcSizeBinarySignature)String_calcSizeBinary, /* ByteString */ | |
(calcSizeBinarySignature)String_calcSizeBinary, /* XmlElement */ | |
(calcSizeBinarySignature)NodeId_calcSizeBinary, | |
(calcSizeBinarySignature)ExpandedNodeId_calcSizeBinary, | |
(calcSizeBinarySignature)calcSizeBinary4, /* StatusCode */ | |
(calcSizeBinarySignature)QualifiedName_calcSizeBinary, | |
(calcSizeBinarySignature)LocalizedText_calcSizeBinary, | |
(calcSizeBinarySignature)ExtensionObject_calcSizeBinary, | |
(calcSizeBinarySignature)DataValue_calcSizeBinary, | |
(calcSizeBinarySignature)Variant_calcSizeBinary, | |
(calcSizeBinarySignature)DiagnosticInfo_calcSizeBinary, | |
(calcSizeBinarySignature)calcSizeBinaryNotImplemented, /* Decimal */ | |
(calcSizeBinarySignature)calcSizeBinary4, /* Enumeration */ | |
(calcSizeBinarySignature)calcSizeBinaryStructure, | |
(calcSizeBinarySignature)calcSizeBinaryNotImplemented, /* Structure with Optional Fields */ | |
(calcSizeBinarySignature)calcSizeBinaryNotImplemented, /* Union */ | |
(calcSizeBinarySignature)calcSizeBinaryNotImplemented /* BitfieldCluster */ | |
}; | |
size_t | |
UA_calcSizeBinary(const void *p, const UA_DataType *type) { | |
return calcSizeBinaryJumpTable[type->typeKind](p, type); | |
} | |
/*********************************** amalgamated original file "E:/Librarys/open62541/build32/src_generated/open62541/types_generated.c" ***********************************/ | |
/* Generated from Opc.Ua.Types.bsd with script E:/Librarys/open62541/tools/generate_datatypes.py | |
* on host DESKTOP-GDCIE62 by user guoxi at 2019-12-20 06:20:38 */ | |
/* Boolean */ | |
#define Boolean_members NULL | |
/* SByte */ | |
#define SByte_members NULL | |
/* Byte */ | |
#define Byte_members NULL | |
/* Int16 */ | |
#define Int16_members NULL | |
/* UInt16 */ | |
#define UInt16_members NULL | |
/* Int32 */ | |
#define Int32_members NULL | |
/* UInt32 */ | |
#define UInt32_members NULL | |
/* Int64 */ | |
#define Int64_members NULL | |
/* UInt64 */ | |
#define UInt64_members NULL | |
/* Float */ | |
#define Float_members NULL | |
/* Double */ | |
#define Double_members NULL | |
/* String */ | |
#define String_members NULL | |
/* DateTime */ | |
#define DateTime_members NULL | |
/* Guid */ | |
#define Guid_members NULL | |
/* ByteString */ | |
#define ByteString_members NULL | |
/* XmlElement */ | |
#define XmlElement_members NULL | |
/* NodeId */ | |
#define NodeId_members NULL | |
/* ExpandedNodeId */ | |
#define ExpandedNodeId_members NULL | |
/* StatusCode */ | |
#define StatusCode_members NULL | |
/* QualifiedName */ | |
#define QualifiedName_members NULL | |
/* LocalizedText */ | |
#define LocalizedText_members NULL | |
/* ExtensionObject */ | |
#define ExtensionObject_members NULL | |
/* DataValue */ | |
#define DataValue_members NULL | |
/* Variant */ | |
#define Variant_members NULL | |
/* DiagnosticInfo */ | |
#define DiagnosticInfo_members NULL | |
/* NodeClass */ | |
#define NodeClass_members NULL | |
/* StructureType */ | |
#define StructureType_members NULL | |
/* StructureField */ | |
static UA_DataTypeMember StructureField_members[7] = { | |
{ | |
UA_TYPENAME("Name") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Description") /* .memberName */ | |
UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ | |
offsetof(UA_StructureField, description) - offsetof(UA_StructureField, name) - sizeof(UA_String), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DataType") /* .memberName */ | |
UA_TYPES_NODEID, /* .memberTypeIndex */ | |
offsetof(UA_StructureField, dataType) - offsetof(UA_StructureField, description) - sizeof(UA_LocalizedText), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ValueRank") /* .memberName */ | |
UA_TYPES_INT32, /* .memberTypeIndex */ | |
offsetof(UA_StructureField, valueRank) - offsetof(UA_StructureField, dataType) - sizeof(UA_NodeId), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ArrayDimensions") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_StructureField, arrayDimensionsSize) - offsetof(UA_StructureField, valueRank) - sizeof(UA_Int32), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("MaxStringLength") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_StructureField, maxStringLength) - offsetof(UA_StructureField, arrayDimensions) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("IsOptional") /* .memberName */ | |
UA_TYPES_BOOLEAN, /* .memberTypeIndex */ | |
offsetof(UA_StructureField, isOptional) - offsetof(UA_StructureField, maxStringLength) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* StructureDefinition */ | |
static UA_DataTypeMember StructureDefinition_members[4] = { | |
{ | |
UA_TYPENAME("DefaultEncodingId") /* .memberName */ | |
UA_TYPES_NODEID, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("BaseDataType") /* .memberName */ | |
UA_TYPES_NODEID, /* .memberTypeIndex */ | |
offsetof(UA_StructureDefinition, baseDataType) - offsetof(UA_StructureDefinition, defaultEncodingId) - sizeof(UA_NodeId), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("StructureType") /* .memberName */ | |
UA_TYPES_STRUCTURETYPE, /* .memberTypeIndex */ | |
offsetof(UA_StructureDefinition, structureType) - offsetof(UA_StructureDefinition, baseDataType) - sizeof(UA_NodeId), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Fields") /* .memberName */ | |
UA_TYPES_STRUCTUREFIELD, /* .memberTypeIndex */ | |
offsetof(UA_StructureDefinition, fieldsSize) - offsetof(UA_StructureDefinition, structureType) - sizeof(UA_StructureType), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* Argument */ | |
static UA_DataTypeMember Argument_members[5] = { | |
{ | |
UA_TYPENAME("Name") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DataType") /* .memberName */ | |
UA_TYPES_NODEID, /* .memberTypeIndex */ | |
offsetof(UA_Argument, dataType) - offsetof(UA_Argument, name) - sizeof(UA_String), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ValueRank") /* .memberName */ | |
UA_TYPES_INT32, /* .memberTypeIndex */ | |
offsetof(UA_Argument, valueRank) - offsetof(UA_Argument, dataType) - sizeof(UA_NodeId), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ArrayDimensions") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_Argument, arrayDimensionsSize) - offsetof(UA_Argument, valueRank) - sizeof(UA_Int32), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Description") /* .memberName */ | |
UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ | |
offsetof(UA_Argument, description) - offsetof(UA_Argument, arrayDimensions) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* EnumValueType */ | |
static UA_DataTypeMember EnumValueType_members[3] = { | |
{ | |
UA_TYPENAME("Value") /* .memberName */ | |
UA_TYPES_INT64, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DisplayName") /* .memberName */ | |
UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ | |
offsetof(UA_EnumValueType, displayName) - offsetof(UA_EnumValueType, value) - sizeof(UA_Int64), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Description") /* .memberName */ | |
UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ | |
offsetof(UA_EnumValueType, description) - offsetof(UA_EnumValueType, displayName) - sizeof(UA_LocalizedText), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* EnumField */ | |
static UA_DataTypeMember EnumField_members[4] = { | |
{ | |
UA_TYPENAME("Value") /* .memberName */ | |
UA_TYPES_INT64, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DisplayName") /* .memberName */ | |
UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ | |
offsetof(UA_EnumField, displayName) - offsetof(UA_EnumField, value) - sizeof(UA_Int64), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Description") /* .memberName */ | |
UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ | |
offsetof(UA_EnumField, description) - offsetof(UA_EnumField, displayName) - sizeof(UA_LocalizedText), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Name") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_EnumField, name) - offsetof(UA_EnumField, description) - sizeof(UA_LocalizedText), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* Duration */ | |
#define Duration_members NULL | |
/* UtcTime */ | |
#define UtcTime_members NULL | |
/* LocaleId */ | |
#define LocaleId_members NULL | |
/* ApplicationType */ | |
#define ApplicationType_members NULL | |
/* ApplicationDescription */ | |
static UA_DataTypeMember ApplicationDescription_members[7] = { | |
{ | |
UA_TYPENAME("ApplicationUri") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ProductUri") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_ApplicationDescription, productUri) - offsetof(UA_ApplicationDescription, applicationUri) - sizeof(UA_String), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ApplicationName") /* .memberName */ | |
UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ | |
offsetof(UA_ApplicationDescription, applicationName) - offsetof(UA_ApplicationDescription, productUri) - sizeof(UA_String), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ApplicationType") /* .memberName */ | |
UA_TYPES_APPLICATIONTYPE, /* .memberTypeIndex */ | |
offsetof(UA_ApplicationDescription, applicationType) - offsetof(UA_ApplicationDescription, applicationName) - sizeof(UA_LocalizedText), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("GatewayServerUri") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_ApplicationDescription, gatewayServerUri) - offsetof(UA_ApplicationDescription, applicationType) - sizeof(UA_ApplicationType), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DiscoveryProfileUri") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_ApplicationDescription, discoveryProfileUri) - offsetof(UA_ApplicationDescription, gatewayServerUri) - sizeof(UA_String), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DiscoveryUrls") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_ApplicationDescription, discoveryUrlsSize) - offsetof(UA_ApplicationDescription, discoveryProfileUri) - sizeof(UA_String), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* RequestHeader */ | |
static UA_DataTypeMember RequestHeader_members[7] = { | |
{ | |
UA_TYPENAME("AuthenticationToken") /* .memberName */ | |
UA_TYPES_NODEID, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Timestamp") /* .memberName */ | |
UA_TYPES_DATETIME, /* .memberTypeIndex */ | |
offsetof(UA_RequestHeader, timestamp) - offsetof(UA_RequestHeader, authenticationToken) - sizeof(UA_NodeId), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("RequestHandle") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_RequestHeader, requestHandle) - offsetof(UA_RequestHeader, timestamp) - sizeof(UA_DateTime), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ReturnDiagnostics") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_RequestHeader, returnDiagnostics) - offsetof(UA_RequestHeader, requestHandle) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("AuditEntryId") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_RequestHeader, auditEntryId) - offsetof(UA_RequestHeader, returnDiagnostics) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("TimeoutHint") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_RequestHeader, timeoutHint) - offsetof(UA_RequestHeader, auditEntryId) - sizeof(UA_String), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("AdditionalHeader") /* .memberName */ | |
UA_TYPES_EXTENSIONOBJECT, /* .memberTypeIndex */ | |
offsetof(UA_RequestHeader, additionalHeader) - offsetof(UA_RequestHeader, timeoutHint) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* ResponseHeader */ | |
static UA_DataTypeMember ResponseHeader_members[6] = { | |
{ | |
UA_TYPENAME("Timestamp") /* .memberName */ | |
UA_TYPES_DATETIME, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("RequestHandle") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_ResponseHeader, requestHandle) - offsetof(UA_ResponseHeader, timestamp) - sizeof(UA_DateTime), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ServiceResult") /* .memberName */ | |
UA_TYPES_STATUSCODE, /* .memberTypeIndex */ | |
offsetof(UA_ResponseHeader, serviceResult) - offsetof(UA_ResponseHeader, requestHandle) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ServiceDiagnostics") /* .memberName */ | |
UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ | |
offsetof(UA_ResponseHeader, serviceDiagnostics) - offsetof(UA_ResponseHeader, serviceResult) - sizeof(UA_StatusCode), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("StringTable") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_ResponseHeader, stringTableSize) - offsetof(UA_ResponseHeader, serviceDiagnostics) - sizeof(UA_DiagnosticInfo), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("AdditionalHeader") /* .memberName */ | |
UA_TYPES_EXTENSIONOBJECT, /* .memberTypeIndex */ | |
offsetof(UA_ResponseHeader, additionalHeader) - offsetof(UA_ResponseHeader, stringTable) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* ServiceFault */ | |
static UA_DataTypeMember ServiceFault_members[1] = { | |
{ | |
UA_TYPENAME("ResponseHeader") /* .memberName */ | |
UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* FindServersRequest */ | |
static UA_DataTypeMember FindServersRequest_members[4] = { | |
{ | |
UA_TYPENAME("RequestHeader") /* .memberName */ | |
UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("EndpointUrl") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_FindServersRequest, endpointUrl) - offsetof(UA_FindServersRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("LocaleIds") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_FindServersRequest, localeIdsSize) - offsetof(UA_FindServersRequest, endpointUrl) - sizeof(UA_String), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ServerUris") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_FindServersRequest, serverUrisSize) - offsetof(UA_FindServersRequest, localeIds) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* FindServersResponse */ | |
static UA_DataTypeMember FindServersResponse_members[2] = { | |
{ | |
UA_TYPENAME("ResponseHeader") /* .memberName */ | |
UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Servers") /* .memberName */ | |
UA_TYPES_APPLICATIONDESCRIPTION, /* .memberTypeIndex */ | |
offsetof(UA_FindServersResponse, serversSize) - offsetof(UA_FindServersResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* ServerOnNetwork */ | |
static UA_DataTypeMember ServerOnNetwork_members[4] = { | |
{ | |
UA_TYPENAME("RecordId") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ServerName") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_ServerOnNetwork, serverName) - offsetof(UA_ServerOnNetwork, recordId) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DiscoveryUrl") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_ServerOnNetwork, discoveryUrl) - offsetof(UA_ServerOnNetwork, serverName) - sizeof(UA_String), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ServerCapabilities") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_ServerOnNetwork, serverCapabilitiesSize) - offsetof(UA_ServerOnNetwork, discoveryUrl) - sizeof(UA_String), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* FindServersOnNetworkRequest */ | |
static UA_DataTypeMember FindServersOnNetworkRequest_members[4] = { | |
{ | |
UA_TYPENAME("RequestHeader") /* .memberName */ | |
UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("StartingRecordId") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_FindServersOnNetworkRequest, startingRecordId) - offsetof(UA_FindServersOnNetworkRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("MaxRecordsToReturn") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_FindServersOnNetworkRequest, maxRecordsToReturn) - offsetof(UA_FindServersOnNetworkRequest, startingRecordId) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ServerCapabilityFilter") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_FindServersOnNetworkRequest, serverCapabilityFilterSize) - offsetof(UA_FindServersOnNetworkRequest, maxRecordsToReturn) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* FindServersOnNetworkResponse */ | |
static UA_DataTypeMember FindServersOnNetworkResponse_members[3] = { | |
{ | |
UA_TYPENAME("ResponseHeader") /* .memberName */ | |
UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("LastCounterResetTime") /* .memberName */ | |
UA_TYPES_DATETIME, /* .memberTypeIndex */ | |
offsetof(UA_FindServersOnNetworkResponse, lastCounterResetTime) - offsetof(UA_FindServersOnNetworkResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Servers") /* .memberName */ | |
UA_TYPES_SERVERONNETWORK, /* .memberTypeIndex */ | |
offsetof(UA_FindServersOnNetworkResponse, serversSize) - offsetof(UA_FindServersOnNetworkResponse, lastCounterResetTime) - sizeof(UA_DateTime), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* MessageSecurityMode */ | |
#define MessageSecurityMode_members NULL | |
/* UserTokenType */ | |
#define UserTokenType_members NULL | |
/* UserTokenPolicy */ | |
static UA_DataTypeMember UserTokenPolicy_members[5] = { | |
{ | |
UA_TYPENAME("PolicyId") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("TokenType") /* .memberName */ | |
UA_TYPES_USERTOKENTYPE, /* .memberTypeIndex */ | |
offsetof(UA_UserTokenPolicy, tokenType) - offsetof(UA_UserTokenPolicy, policyId) - sizeof(UA_String), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("IssuedTokenType") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_UserTokenPolicy, issuedTokenType) - offsetof(UA_UserTokenPolicy, tokenType) - sizeof(UA_UserTokenType), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("IssuerEndpointUrl") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_UserTokenPolicy, issuerEndpointUrl) - offsetof(UA_UserTokenPolicy, issuedTokenType) - sizeof(UA_String), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("SecurityPolicyUri") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_UserTokenPolicy, securityPolicyUri) - offsetof(UA_UserTokenPolicy, issuerEndpointUrl) - sizeof(UA_String), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* EndpointDescription */ | |
static UA_DataTypeMember EndpointDescription_members[8] = { | |
{ | |
UA_TYPENAME("EndpointUrl") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Server") /* .memberName */ | |
UA_TYPES_APPLICATIONDESCRIPTION, /* .memberTypeIndex */ | |
offsetof(UA_EndpointDescription, server) - offsetof(UA_EndpointDescription, endpointUrl) - sizeof(UA_String), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ServerCertificate") /* .memberName */ | |
UA_TYPES_BYTESTRING, /* .memberTypeIndex */ | |
offsetof(UA_EndpointDescription, serverCertificate) - offsetof(UA_EndpointDescription, server) - sizeof(UA_ApplicationDescription), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("SecurityMode") /* .memberName */ | |
UA_TYPES_MESSAGESECURITYMODE, /* .memberTypeIndex */ | |
offsetof(UA_EndpointDescription, securityMode) - offsetof(UA_EndpointDescription, serverCertificate) - sizeof(UA_ByteString), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("SecurityPolicyUri") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_EndpointDescription, securityPolicyUri) - offsetof(UA_EndpointDescription, securityMode) - sizeof(UA_MessageSecurityMode), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("UserIdentityTokens") /* .memberName */ | |
UA_TYPES_USERTOKENPOLICY, /* .memberTypeIndex */ | |
offsetof(UA_EndpointDescription, userIdentityTokensSize) - offsetof(UA_EndpointDescription, securityPolicyUri) - sizeof(UA_String), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("TransportProfileUri") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_EndpointDescription, transportProfileUri) - offsetof(UA_EndpointDescription, userIdentityTokens) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("SecurityLevel") /* .memberName */ | |
UA_TYPES_BYTE, /* .memberTypeIndex */ | |
offsetof(UA_EndpointDescription, securityLevel) - offsetof(UA_EndpointDescription, transportProfileUri) - sizeof(UA_String), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* GetEndpointsRequest */ | |
static UA_DataTypeMember GetEndpointsRequest_members[4] = { | |
{ | |
UA_TYPENAME("RequestHeader") /* .memberName */ | |
UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("EndpointUrl") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_GetEndpointsRequest, endpointUrl) - offsetof(UA_GetEndpointsRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("LocaleIds") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_GetEndpointsRequest, localeIdsSize) - offsetof(UA_GetEndpointsRequest, endpointUrl) - sizeof(UA_String), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ProfileUris") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_GetEndpointsRequest, profileUrisSize) - offsetof(UA_GetEndpointsRequest, localeIds) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* GetEndpointsResponse */ | |
static UA_DataTypeMember GetEndpointsResponse_members[2] = { | |
{ | |
UA_TYPENAME("ResponseHeader") /* .memberName */ | |
UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Endpoints") /* .memberName */ | |
UA_TYPES_ENDPOINTDESCRIPTION, /* .memberTypeIndex */ | |
offsetof(UA_GetEndpointsResponse, endpointsSize) - offsetof(UA_GetEndpointsResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* RegisteredServer */ | |
static UA_DataTypeMember RegisteredServer_members[8] = { | |
{ | |
UA_TYPENAME("ServerUri") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ProductUri") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_RegisteredServer, productUri) - offsetof(UA_RegisteredServer, serverUri) - sizeof(UA_String), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ServerNames") /* .memberName */ | |
UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ | |
offsetof(UA_RegisteredServer, serverNamesSize) - offsetof(UA_RegisteredServer, productUri) - sizeof(UA_String), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ServerType") /* .memberName */ | |
UA_TYPES_APPLICATIONTYPE, /* .memberTypeIndex */ | |
offsetof(UA_RegisteredServer, serverType) - offsetof(UA_RegisteredServer, serverNames) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("GatewayServerUri") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_RegisteredServer, gatewayServerUri) - offsetof(UA_RegisteredServer, serverType) - sizeof(UA_ApplicationType), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DiscoveryUrls") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_RegisteredServer, discoveryUrlsSize) - offsetof(UA_RegisteredServer, gatewayServerUri) - sizeof(UA_String), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("SemaphoreFilePath") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_RegisteredServer, semaphoreFilePath) - offsetof(UA_RegisteredServer, discoveryUrls) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("IsOnline") /* .memberName */ | |
UA_TYPES_BOOLEAN, /* .memberTypeIndex */ | |
offsetof(UA_RegisteredServer, isOnline) - offsetof(UA_RegisteredServer, semaphoreFilePath) - sizeof(UA_String), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* RegisterServerRequest */ | |
static UA_DataTypeMember RegisterServerRequest_members[2] = { | |
{ | |
UA_TYPENAME("RequestHeader") /* .memberName */ | |
UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Server") /* .memberName */ | |
UA_TYPES_REGISTEREDSERVER, /* .memberTypeIndex */ | |
offsetof(UA_RegisterServerRequest, server) - offsetof(UA_RegisterServerRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* RegisterServerResponse */ | |
static UA_DataTypeMember RegisterServerResponse_members[1] = { | |
{ | |
UA_TYPENAME("ResponseHeader") /* .memberName */ | |
UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* DiscoveryConfiguration */ | |
#define DiscoveryConfiguration_members NULL | |
/* MdnsDiscoveryConfiguration */ | |
static UA_DataTypeMember MdnsDiscoveryConfiguration_members[2] = { | |
{ | |
UA_TYPENAME("MdnsServerName") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ServerCapabilities") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_MdnsDiscoveryConfiguration, serverCapabilitiesSize) - offsetof(UA_MdnsDiscoveryConfiguration, mdnsServerName) - sizeof(UA_String), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* RegisterServer2Request */ | |
static UA_DataTypeMember RegisterServer2Request_members[3] = { | |
{ | |
UA_TYPENAME("RequestHeader") /* .memberName */ | |
UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Server") /* .memberName */ | |
UA_TYPES_REGISTEREDSERVER, /* .memberTypeIndex */ | |
offsetof(UA_RegisterServer2Request, server) - offsetof(UA_RegisterServer2Request, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DiscoveryConfiguration") /* .memberName */ | |
UA_TYPES_EXTENSIONOBJECT, /* .memberTypeIndex */ | |
offsetof(UA_RegisterServer2Request, discoveryConfigurationSize) - offsetof(UA_RegisterServer2Request, server) - sizeof(UA_RegisteredServer), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* RegisterServer2Response */ | |
static UA_DataTypeMember RegisterServer2Response_members[3] = { | |
{ | |
UA_TYPENAME("ResponseHeader") /* .memberName */ | |
UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ConfigurationResults") /* .memberName */ | |
UA_TYPES_STATUSCODE, /* .memberTypeIndex */ | |
offsetof(UA_RegisterServer2Response, configurationResultsSize) - offsetof(UA_RegisterServer2Response, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DiagnosticInfos") /* .memberName */ | |
UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ | |
offsetof(UA_RegisterServer2Response, diagnosticInfosSize) - offsetof(UA_RegisterServer2Response, configurationResults) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* SecurityTokenRequestType */ | |
#define SecurityTokenRequestType_members NULL | |
/* ChannelSecurityToken */ | |
static UA_DataTypeMember ChannelSecurityToken_members[4] = { | |
{ | |
UA_TYPENAME("ChannelId") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("TokenId") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_ChannelSecurityToken, tokenId) - offsetof(UA_ChannelSecurityToken, channelId) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("CreatedAt") /* .memberName */ | |
UA_TYPES_DATETIME, /* .memberTypeIndex */ | |
offsetof(UA_ChannelSecurityToken, createdAt) - offsetof(UA_ChannelSecurityToken, tokenId) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("RevisedLifetime") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_ChannelSecurityToken, revisedLifetime) - offsetof(UA_ChannelSecurityToken, createdAt) - sizeof(UA_DateTime), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* OpenSecureChannelRequest */ | |
static UA_DataTypeMember OpenSecureChannelRequest_members[6] = { | |
{ | |
UA_TYPENAME("RequestHeader") /* .memberName */ | |
UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ClientProtocolVersion") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_OpenSecureChannelRequest, clientProtocolVersion) - offsetof(UA_OpenSecureChannelRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("RequestType") /* .memberName */ | |
UA_TYPES_SECURITYTOKENREQUESTTYPE, /* .memberTypeIndex */ | |
offsetof(UA_OpenSecureChannelRequest, requestType) - offsetof(UA_OpenSecureChannelRequest, clientProtocolVersion) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("SecurityMode") /* .memberName */ | |
UA_TYPES_MESSAGESECURITYMODE, /* .memberTypeIndex */ | |
offsetof(UA_OpenSecureChannelRequest, securityMode) - offsetof(UA_OpenSecureChannelRequest, requestType) - sizeof(UA_SecurityTokenRequestType), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ClientNonce") /* .memberName */ | |
UA_TYPES_BYTESTRING, /* .memberTypeIndex */ | |
offsetof(UA_OpenSecureChannelRequest, clientNonce) - offsetof(UA_OpenSecureChannelRequest, securityMode) - sizeof(UA_MessageSecurityMode), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("RequestedLifetime") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_OpenSecureChannelRequest, requestedLifetime) - offsetof(UA_OpenSecureChannelRequest, clientNonce) - sizeof(UA_ByteString), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* OpenSecureChannelResponse */ | |
static UA_DataTypeMember OpenSecureChannelResponse_members[4] = { | |
{ | |
UA_TYPENAME("ResponseHeader") /* .memberName */ | |
UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ServerProtocolVersion") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_OpenSecureChannelResponse, serverProtocolVersion) - offsetof(UA_OpenSecureChannelResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("SecurityToken") /* .memberName */ | |
UA_TYPES_CHANNELSECURITYTOKEN, /* .memberTypeIndex */ | |
offsetof(UA_OpenSecureChannelResponse, securityToken) - offsetof(UA_OpenSecureChannelResponse, serverProtocolVersion) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ServerNonce") /* .memberName */ | |
UA_TYPES_BYTESTRING, /* .memberTypeIndex */ | |
offsetof(UA_OpenSecureChannelResponse, serverNonce) - offsetof(UA_OpenSecureChannelResponse, securityToken) - sizeof(UA_ChannelSecurityToken), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* CloseSecureChannelRequest */ | |
static UA_DataTypeMember CloseSecureChannelRequest_members[1] = { | |
{ | |
UA_TYPENAME("RequestHeader") /* .memberName */ | |
UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* CloseSecureChannelResponse */ | |
static UA_DataTypeMember CloseSecureChannelResponse_members[1] = { | |
{ | |
UA_TYPENAME("ResponseHeader") /* .memberName */ | |
UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* SignedSoftwareCertificate */ | |
static UA_DataTypeMember SignedSoftwareCertificate_members[2] = { | |
{ | |
UA_TYPENAME("CertificateData") /* .memberName */ | |
UA_TYPES_BYTESTRING, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Signature") /* .memberName */ | |
UA_TYPES_BYTESTRING, /* .memberTypeIndex */ | |
offsetof(UA_SignedSoftwareCertificate, signature) - offsetof(UA_SignedSoftwareCertificate, certificateData) - sizeof(UA_ByteString), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* SignatureData */ | |
static UA_DataTypeMember SignatureData_members[2] = { | |
{ | |
UA_TYPENAME("Algorithm") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Signature") /* .memberName */ | |
UA_TYPES_BYTESTRING, /* .memberTypeIndex */ | |
offsetof(UA_SignatureData, signature) - offsetof(UA_SignatureData, algorithm) - sizeof(UA_String), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* CreateSessionRequest */ | |
static UA_DataTypeMember CreateSessionRequest_members[9] = { | |
{ | |
UA_TYPENAME("RequestHeader") /* .memberName */ | |
UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ClientDescription") /* .memberName */ | |
UA_TYPES_APPLICATIONDESCRIPTION, /* .memberTypeIndex */ | |
offsetof(UA_CreateSessionRequest, clientDescription) - offsetof(UA_CreateSessionRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ServerUri") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_CreateSessionRequest, serverUri) - offsetof(UA_CreateSessionRequest, clientDescription) - sizeof(UA_ApplicationDescription), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("EndpointUrl") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_CreateSessionRequest, endpointUrl) - offsetof(UA_CreateSessionRequest, serverUri) - sizeof(UA_String), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("SessionName") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_CreateSessionRequest, sessionName) - offsetof(UA_CreateSessionRequest, endpointUrl) - sizeof(UA_String), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ClientNonce") /* .memberName */ | |
UA_TYPES_BYTESTRING, /* .memberTypeIndex */ | |
offsetof(UA_CreateSessionRequest, clientNonce) - offsetof(UA_CreateSessionRequest, sessionName) - sizeof(UA_String), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ClientCertificate") /* .memberName */ | |
UA_TYPES_BYTESTRING, /* .memberTypeIndex */ | |
offsetof(UA_CreateSessionRequest, clientCertificate) - offsetof(UA_CreateSessionRequest, clientNonce) - sizeof(UA_ByteString), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("RequestedSessionTimeout") /* .memberName */ | |
UA_TYPES_DOUBLE, /* .memberTypeIndex */ | |
offsetof(UA_CreateSessionRequest, requestedSessionTimeout) - offsetof(UA_CreateSessionRequest, clientCertificate) - sizeof(UA_ByteString), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("MaxResponseMessageSize") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_CreateSessionRequest, maxResponseMessageSize) - offsetof(UA_CreateSessionRequest, requestedSessionTimeout) - sizeof(UA_Double), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* CreateSessionResponse */ | |
static UA_DataTypeMember CreateSessionResponse_members[10] = { | |
{ | |
UA_TYPENAME("ResponseHeader") /* .memberName */ | |
UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("SessionId") /* .memberName */ | |
UA_TYPES_NODEID, /* .memberTypeIndex */ | |
offsetof(UA_CreateSessionResponse, sessionId) - offsetof(UA_CreateSessionResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("AuthenticationToken") /* .memberName */ | |
UA_TYPES_NODEID, /* .memberTypeIndex */ | |
offsetof(UA_CreateSessionResponse, authenticationToken) - offsetof(UA_CreateSessionResponse, sessionId) - sizeof(UA_NodeId), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("RevisedSessionTimeout") /* .memberName */ | |
UA_TYPES_DOUBLE, /* .memberTypeIndex */ | |
offsetof(UA_CreateSessionResponse, revisedSessionTimeout) - offsetof(UA_CreateSessionResponse, authenticationToken) - sizeof(UA_NodeId), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ServerNonce") /* .memberName */ | |
UA_TYPES_BYTESTRING, /* .memberTypeIndex */ | |
offsetof(UA_CreateSessionResponse, serverNonce) - offsetof(UA_CreateSessionResponse, revisedSessionTimeout) - sizeof(UA_Double), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ServerCertificate") /* .memberName */ | |
UA_TYPES_BYTESTRING, /* .memberTypeIndex */ | |
offsetof(UA_CreateSessionResponse, serverCertificate) - offsetof(UA_CreateSessionResponse, serverNonce) - sizeof(UA_ByteString), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ServerEndpoints") /* .memberName */ | |
UA_TYPES_ENDPOINTDESCRIPTION, /* .memberTypeIndex */ | |
offsetof(UA_CreateSessionResponse, serverEndpointsSize) - offsetof(UA_CreateSessionResponse, serverCertificate) - sizeof(UA_ByteString), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ServerSoftwareCertificates") /* .memberName */ | |
UA_TYPES_SIGNEDSOFTWARECERTIFICATE, /* .memberTypeIndex */ | |
offsetof(UA_CreateSessionResponse, serverSoftwareCertificatesSize) - offsetof(UA_CreateSessionResponse, serverEndpoints) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ServerSignature") /* .memberName */ | |
UA_TYPES_SIGNATUREDATA, /* .memberTypeIndex */ | |
offsetof(UA_CreateSessionResponse, serverSignature) - offsetof(UA_CreateSessionResponse, serverSoftwareCertificates) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("MaxRequestMessageSize") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_CreateSessionResponse, maxRequestMessageSize) - offsetof(UA_CreateSessionResponse, serverSignature) - sizeof(UA_SignatureData), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* UserIdentityToken */ | |
static UA_DataTypeMember UserIdentityToken_members[1] = { | |
{ | |
UA_TYPENAME("PolicyId") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* AnonymousIdentityToken */ | |
static UA_DataTypeMember AnonymousIdentityToken_members[1] = { | |
{ | |
UA_TYPENAME("PolicyId") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* UserNameIdentityToken */ | |
static UA_DataTypeMember UserNameIdentityToken_members[4] = { | |
{ | |
UA_TYPENAME("PolicyId") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("UserName") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_UserNameIdentityToken, userName) - offsetof(UA_UserNameIdentityToken, policyId) - sizeof(UA_String), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Password") /* .memberName */ | |
UA_TYPES_BYTESTRING, /* .memberTypeIndex */ | |
offsetof(UA_UserNameIdentityToken, password) - offsetof(UA_UserNameIdentityToken, userName) - sizeof(UA_String), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("EncryptionAlgorithm") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_UserNameIdentityToken, encryptionAlgorithm) - offsetof(UA_UserNameIdentityToken, password) - sizeof(UA_ByteString), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* X509IdentityToken */ | |
static UA_DataTypeMember X509IdentityToken_members[2] = { | |
{ | |
UA_TYPENAME("PolicyId") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("CertificateData") /* .memberName */ | |
UA_TYPES_BYTESTRING, /* .memberTypeIndex */ | |
offsetof(UA_X509IdentityToken, certificateData) - offsetof(UA_X509IdentityToken, policyId) - sizeof(UA_String), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* IssuedIdentityToken */ | |
static UA_DataTypeMember IssuedIdentityToken_members[3] = { | |
{ | |
UA_TYPENAME("PolicyId") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("TokenData") /* .memberName */ | |
UA_TYPES_BYTESTRING, /* .memberTypeIndex */ | |
offsetof(UA_IssuedIdentityToken, tokenData) - offsetof(UA_IssuedIdentityToken, policyId) - sizeof(UA_String), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("EncryptionAlgorithm") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_IssuedIdentityToken, encryptionAlgorithm) - offsetof(UA_IssuedIdentityToken, tokenData) - sizeof(UA_ByteString), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* ActivateSessionRequest */ | |
static UA_DataTypeMember ActivateSessionRequest_members[6] = { | |
{ | |
UA_TYPENAME("RequestHeader") /* .memberName */ | |
UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ClientSignature") /* .memberName */ | |
UA_TYPES_SIGNATUREDATA, /* .memberTypeIndex */ | |
offsetof(UA_ActivateSessionRequest, clientSignature) - offsetof(UA_ActivateSessionRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ClientSoftwareCertificates") /* .memberName */ | |
UA_TYPES_SIGNEDSOFTWARECERTIFICATE, /* .memberTypeIndex */ | |
offsetof(UA_ActivateSessionRequest, clientSoftwareCertificatesSize) - offsetof(UA_ActivateSessionRequest, clientSignature) - sizeof(UA_SignatureData), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("LocaleIds") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_ActivateSessionRequest, localeIdsSize) - offsetof(UA_ActivateSessionRequest, clientSoftwareCertificates) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("UserIdentityToken") /* .memberName */ | |
UA_TYPES_EXTENSIONOBJECT, /* .memberTypeIndex */ | |
offsetof(UA_ActivateSessionRequest, userIdentityToken) - offsetof(UA_ActivateSessionRequest, localeIds) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("UserTokenSignature") /* .memberName */ | |
UA_TYPES_SIGNATUREDATA, /* .memberTypeIndex */ | |
offsetof(UA_ActivateSessionRequest, userTokenSignature) - offsetof(UA_ActivateSessionRequest, userIdentityToken) - sizeof(UA_ExtensionObject), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* ActivateSessionResponse */ | |
static UA_DataTypeMember ActivateSessionResponse_members[4] = { | |
{ | |
UA_TYPENAME("ResponseHeader") /* .memberName */ | |
UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ServerNonce") /* .memberName */ | |
UA_TYPES_BYTESTRING, /* .memberTypeIndex */ | |
offsetof(UA_ActivateSessionResponse, serverNonce) - offsetof(UA_ActivateSessionResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Results") /* .memberName */ | |
UA_TYPES_STATUSCODE, /* .memberTypeIndex */ | |
offsetof(UA_ActivateSessionResponse, resultsSize) - offsetof(UA_ActivateSessionResponse, serverNonce) - sizeof(UA_ByteString), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DiagnosticInfos") /* .memberName */ | |
UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ | |
offsetof(UA_ActivateSessionResponse, diagnosticInfosSize) - offsetof(UA_ActivateSessionResponse, results) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* CloseSessionRequest */ | |
static UA_DataTypeMember CloseSessionRequest_members[2] = { | |
{ | |
UA_TYPENAME("RequestHeader") /* .memberName */ | |
UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DeleteSubscriptions") /* .memberName */ | |
UA_TYPES_BOOLEAN, /* .memberTypeIndex */ | |
offsetof(UA_CloseSessionRequest, deleteSubscriptions) - offsetof(UA_CloseSessionRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* CloseSessionResponse */ | |
static UA_DataTypeMember CloseSessionResponse_members[1] = { | |
{ | |
UA_TYPENAME("ResponseHeader") /* .memberName */ | |
UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* NodeAttributesMask */ | |
#define NodeAttributesMask_members NULL | |
/* NodeAttributes */ | |
static UA_DataTypeMember NodeAttributes_members[5] = { | |
{ | |
UA_TYPENAME("SpecifiedAttributes") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DisplayName") /* .memberName */ | |
UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ | |
offsetof(UA_NodeAttributes, displayName) - offsetof(UA_NodeAttributes, specifiedAttributes) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Description") /* .memberName */ | |
UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ | |
offsetof(UA_NodeAttributes, description) - offsetof(UA_NodeAttributes, displayName) - sizeof(UA_LocalizedText), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("WriteMask") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_NodeAttributes, writeMask) - offsetof(UA_NodeAttributes, description) - sizeof(UA_LocalizedText), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("UserWriteMask") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_NodeAttributes, userWriteMask) - offsetof(UA_NodeAttributes, writeMask) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* ObjectAttributes */ | |
static UA_DataTypeMember ObjectAttributes_members[6] = { | |
{ | |
UA_TYPENAME("SpecifiedAttributes") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DisplayName") /* .memberName */ | |
UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ | |
offsetof(UA_ObjectAttributes, displayName) - offsetof(UA_ObjectAttributes, specifiedAttributes) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Description") /* .memberName */ | |
UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ | |
offsetof(UA_ObjectAttributes, description) - offsetof(UA_ObjectAttributes, displayName) - sizeof(UA_LocalizedText), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("WriteMask") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_ObjectAttributes, writeMask) - offsetof(UA_ObjectAttributes, description) - sizeof(UA_LocalizedText), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("UserWriteMask") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_ObjectAttributes, userWriteMask) - offsetof(UA_ObjectAttributes, writeMask) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("EventNotifier") /* .memberName */ | |
UA_TYPES_BYTE, /* .memberTypeIndex */ | |
offsetof(UA_ObjectAttributes, eventNotifier) - offsetof(UA_ObjectAttributes, userWriteMask) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* VariableAttributes */ | |
static UA_DataTypeMember VariableAttributes_members[13] = { | |
{ | |
UA_TYPENAME("SpecifiedAttributes") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DisplayName") /* .memberName */ | |
UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ | |
offsetof(UA_VariableAttributes, displayName) - offsetof(UA_VariableAttributes, specifiedAttributes) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Description") /* .memberName */ | |
UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ | |
offsetof(UA_VariableAttributes, description) - offsetof(UA_VariableAttributes, displayName) - sizeof(UA_LocalizedText), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("WriteMask") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_VariableAttributes, writeMask) - offsetof(UA_VariableAttributes, description) - sizeof(UA_LocalizedText), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("UserWriteMask") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_VariableAttributes, userWriteMask) - offsetof(UA_VariableAttributes, writeMask) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Value") /* .memberName */ | |
UA_TYPES_VARIANT, /* .memberTypeIndex */ | |
offsetof(UA_VariableAttributes, value) - offsetof(UA_VariableAttributes, userWriteMask) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DataType") /* .memberName */ | |
UA_TYPES_NODEID, /* .memberTypeIndex */ | |
offsetof(UA_VariableAttributes, dataType) - offsetof(UA_VariableAttributes, value) - sizeof(UA_Variant), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ValueRank") /* .memberName */ | |
UA_TYPES_INT32, /* .memberTypeIndex */ | |
offsetof(UA_VariableAttributes, valueRank) - offsetof(UA_VariableAttributes, dataType) - sizeof(UA_NodeId), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ArrayDimensions") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_VariableAttributes, arrayDimensionsSize) - offsetof(UA_VariableAttributes, valueRank) - sizeof(UA_Int32), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("AccessLevel") /* .memberName */ | |
UA_TYPES_BYTE, /* .memberTypeIndex */ | |
offsetof(UA_VariableAttributes, accessLevel) - offsetof(UA_VariableAttributes, arrayDimensions) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("UserAccessLevel") /* .memberName */ | |
UA_TYPES_BYTE, /* .memberTypeIndex */ | |
offsetof(UA_VariableAttributes, userAccessLevel) - offsetof(UA_VariableAttributes, accessLevel) - sizeof(UA_Byte), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("MinimumSamplingInterval") /* .memberName */ | |
UA_TYPES_DOUBLE, /* .memberTypeIndex */ | |
offsetof(UA_VariableAttributes, minimumSamplingInterval) - offsetof(UA_VariableAttributes, userAccessLevel) - sizeof(UA_Byte), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Historizing") /* .memberName */ | |
UA_TYPES_BOOLEAN, /* .memberTypeIndex */ | |
offsetof(UA_VariableAttributes, historizing) - offsetof(UA_VariableAttributes, minimumSamplingInterval) - sizeof(UA_Double), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* MethodAttributes */ | |
static UA_DataTypeMember MethodAttributes_members[7] = { | |
{ | |
UA_TYPENAME("SpecifiedAttributes") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DisplayName") /* .memberName */ | |
UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ | |
offsetof(UA_MethodAttributes, displayName) - offsetof(UA_MethodAttributes, specifiedAttributes) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Description") /* .memberName */ | |
UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ | |
offsetof(UA_MethodAttributes, description) - offsetof(UA_MethodAttributes, displayName) - sizeof(UA_LocalizedText), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("WriteMask") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_MethodAttributes, writeMask) - offsetof(UA_MethodAttributes, description) - sizeof(UA_LocalizedText), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("UserWriteMask") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_MethodAttributes, userWriteMask) - offsetof(UA_MethodAttributes, writeMask) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Executable") /* .memberName */ | |
UA_TYPES_BOOLEAN, /* .memberTypeIndex */ | |
offsetof(UA_MethodAttributes, executable) - offsetof(UA_MethodAttributes, userWriteMask) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("UserExecutable") /* .memberName */ | |
UA_TYPES_BOOLEAN, /* .memberTypeIndex */ | |
offsetof(UA_MethodAttributes, userExecutable) - offsetof(UA_MethodAttributes, executable) - sizeof(UA_Boolean), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* ObjectTypeAttributes */ | |
static UA_DataTypeMember ObjectTypeAttributes_members[6] = { | |
{ | |
UA_TYPENAME("SpecifiedAttributes") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DisplayName") /* .memberName */ | |
UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ | |
offsetof(UA_ObjectTypeAttributes, displayName) - offsetof(UA_ObjectTypeAttributes, specifiedAttributes) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Description") /* .memberName */ | |
UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ | |
offsetof(UA_ObjectTypeAttributes, description) - offsetof(UA_ObjectTypeAttributes, displayName) - sizeof(UA_LocalizedText), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("WriteMask") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_ObjectTypeAttributes, writeMask) - offsetof(UA_ObjectTypeAttributes, description) - sizeof(UA_LocalizedText), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("UserWriteMask") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_ObjectTypeAttributes, userWriteMask) - offsetof(UA_ObjectTypeAttributes, writeMask) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("IsAbstract") /* .memberName */ | |
UA_TYPES_BOOLEAN, /* .memberTypeIndex */ | |
offsetof(UA_ObjectTypeAttributes, isAbstract) - offsetof(UA_ObjectTypeAttributes, userWriteMask) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* VariableTypeAttributes */ | |
static UA_DataTypeMember VariableTypeAttributes_members[10] = { | |
{ | |
UA_TYPENAME("SpecifiedAttributes") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DisplayName") /* .memberName */ | |
UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ | |
offsetof(UA_VariableTypeAttributes, displayName) - offsetof(UA_VariableTypeAttributes, specifiedAttributes) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Description") /* .memberName */ | |
UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ | |
offsetof(UA_VariableTypeAttributes, description) - offsetof(UA_VariableTypeAttributes, displayName) - sizeof(UA_LocalizedText), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("WriteMask") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_VariableTypeAttributes, writeMask) - offsetof(UA_VariableTypeAttributes, description) - sizeof(UA_LocalizedText), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("UserWriteMask") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_VariableTypeAttributes, userWriteMask) - offsetof(UA_VariableTypeAttributes, writeMask) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Value") /* .memberName */ | |
UA_TYPES_VARIANT, /* .memberTypeIndex */ | |
offsetof(UA_VariableTypeAttributes, value) - offsetof(UA_VariableTypeAttributes, userWriteMask) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DataType") /* .memberName */ | |
UA_TYPES_NODEID, /* .memberTypeIndex */ | |
offsetof(UA_VariableTypeAttributes, dataType) - offsetof(UA_VariableTypeAttributes, value) - sizeof(UA_Variant), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ValueRank") /* .memberName */ | |
UA_TYPES_INT32, /* .memberTypeIndex */ | |
offsetof(UA_VariableTypeAttributes, valueRank) - offsetof(UA_VariableTypeAttributes, dataType) - sizeof(UA_NodeId), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ArrayDimensions") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_VariableTypeAttributes, arrayDimensionsSize) - offsetof(UA_VariableTypeAttributes, valueRank) - sizeof(UA_Int32), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("IsAbstract") /* .memberName */ | |
UA_TYPES_BOOLEAN, /* .memberTypeIndex */ | |
offsetof(UA_VariableTypeAttributes, isAbstract) - offsetof(UA_VariableTypeAttributes, arrayDimensions) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* ReferenceTypeAttributes */ | |
static UA_DataTypeMember ReferenceTypeAttributes_members[8] = { | |
{ | |
UA_TYPENAME("SpecifiedAttributes") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DisplayName") /* .memberName */ | |
UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ | |
offsetof(UA_ReferenceTypeAttributes, displayName) - offsetof(UA_ReferenceTypeAttributes, specifiedAttributes) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Description") /* .memberName */ | |
UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ | |
offsetof(UA_ReferenceTypeAttributes, description) - offsetof(UA_ReferenceTypeAttributes, displayName) - sizeof(UA_LocalizedText), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("WriteMask") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_ReferenceTypeAttributes, writeMask) - offsetof(UA_ReferenceTypeAttributes, description) - sizeof(UA_LocalizedText), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("UserWriteMask") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_ReferenceTypeAttributes, userWriteMask) - offsetof(UA_ReferenceTypeAttributes, writeMask) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("IsAbstract") /* .memberName */ | |
UA_TYPES_BOOLEAN, /* .memberTypeIndex */ | |
offsetof(UA_ReferenceTypeAttributes, isAbstract) - offsetof(UA_ReferenceTypeAttributes, userWriteMask) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Symmetric") /* .memberName */ | |
UA_TYPES_BOOLEAN, /* .memberTypeIndex */ | |
offsetof(UA_ReferenceTypeAttributes, symmetric) - offsetof(UA_ReferenceTypeAttributes, isAbstract) - sizeof(UA_Boolean), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("InverseName") /* .memberName */ | |
UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ | |
offsetof(UA_ReferenceTypeAttributes, inverseName) - offsetof(UA_ReferenceTypeAttributes, symmetric) - sizeof(UA_Boolean), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* DataTypeAttributes */ | |
static UA_DataTypeMember DataTypeAttributes_members[6] = { | |
{ | |
UA_TYPENAME("SpecifiedAttributes") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DisplayName") /* .memberName */ | |
UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ | |
offsetof(UA_DataTypeAttributes, displayName) - offsetof(UA_DataTypeAttributes, specifiedAttributes) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Description") /* .memberName */ | |
UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ | |
offsetof(UA_DataTypeAttributes, description) - offsetof(UA_DataTypeAttributes, displayName) - sizeof(UA_LocalizedText), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("WriteMask") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_DataTypeAttributes, writeMask) - offsetof(UA_DataTypeAttributes, description) - sizeof(UA_LocalizedText), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("UserWriteMask") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_DataTypeAttributes, userWriteMask) - offsetof(UA_DataTypeAttributes, writeMask) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("IsAbstract") /* .memberName */ | |
UA_TYPES_BOOLEAN, /* .memberTypeIndex */ | |
offsetof(UA_DataTypeAttributes, isAbstract) - offsetof(UA_DataTypeAttributes, userWriteMask) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* ViewAttributes */ | |
static UA_DataTypeMember ViewAttributes_members[7] = { | |
{ | |
UA_TYPENAME("SpecifiedAttributes") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DisplayName") /* .memberName */ | |
UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ | |
offsetof(UA_ViewAttributes, displayName) - offsetof(UA_ViewAttributes, specifiedAttributes) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Description") /* .memberName */ | |
UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ | |
offsetof(UA_ViewAttributes, description) - offsetof(UA_ViewAttributes, displayName) - sizeof(UA_LocalizedText), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("WriteMask") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_ViewAttributes, writeMask) - offsetof(UA_ViewAttributes, description) - sizeof(UA_LocalizedText), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("UserWriteMask") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_ViewAttributes, userWriteMask) - offsetof(UA_ViewAttributes, writeMask) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ContainsNoLoops") /* .memberName */ | |
UA_TYPES_BOOLEAN, /* .memberTypeIndex */ | |
offsetof(UA_ViewAttributes, containsNoLoops) - offsetof(UA_ViewAttributes, userWriteMask) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("EventNotifier") /* .memberName */ | |
UA_TYPES_BYTE, /* .memberTypeIndex */ | |
offsetof(UA_ViewAttributes, eventNotifier) - offsetof(UA_ViewAttributes, containsNoLoops) - sizeof(UA_Boolean), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* AddNodesItem */ | |
static UA_DataTypeMember AddNodesItem_members[7] = { | |
{ | |
UA_TYPENAME("ParentNodeId") /* .memberName */ | |
UA_TYPES_EXPANDEDNODEID, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ReferenceTypeId") /* .memberName */ | |
UA_TYPES_NODEID, /* .memberTypeIndex */ | |
offsetof(UA_AddNodesItem, referenceTypeId) - offsetof(UA_AddNodesItem, parentNodeId) - sizeof(UA_ExpandedNodeId), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("RequestedNewNodeId") /* .memberName */ | |
UA_TYPES_EXPANDEDNODEID, /* .memberTypeIndex */ | |
offsetof(UA_AddNodesItem, requestedNewNodeId) - offsetof(UA_AddNodesItem, referenceTypeId) - sizeof(UA_NodeId), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("BrowseName") /* .memberName */ | |
UA_TYPES_QUALIFIEDNAME, /* .memberTypeIndex */ | |
offsetof(UA_AddNodesItem, browseName) - offsetof(UA_AddNodesItem, requestedNewNodeId) - sizeof(UA_ExpandedNodeId), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("NodeClass") /* .memberName */ | |
UA_TYPES_NODECLASS, /* .memberTypeIndex */ | |
offsetof(UA_AddNodesItem, nodeClass) - offsetof(UA_AddNodesItem, browseName) - sizeof(UA_QualifiedName), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("NodeAttributes") /* .memberName */ | |
UA_TYPES_EXTENSIONOBJECT, /* .memberTypeIndex */ | |
offsetof(UA_AddNodesItem, nodeAttributes) - offsetof(UA_AddNodesItem, nodeClass) - sizeof(UA_NodeClass), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("TypeDefinition") /* .memberName */ | |
UA_TYPES_EXPANDEDNODEID, /* .memberTypeIndex */ | |
offsetof(UA_AddNodesItem, typeDefinition) - offsetof(UA_AddNodesItem, nodeAttributes) - sizeof(UA_ExtensionObject), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* AddNodesResult */ | |
static UA_DataTypeMember AddNodesResult_members[2] = { | |
{ | |
UA_TYPENAME("StatusCode") /* .memberName */ | |
UA_TYPES_STATUSCODE, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("AddedNodeId") /* .memberName */ | |
UA_TYPES_NODEID, /* .memberTypeIndex */ | |
offsetof(UA_AddNodesResult, addedNodeId) - offsetof(UA_AddNodesResult, statusCode) - sizeof(UA_StatusCode), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* AddNodesRequest */ | |
static UA_DataTypeMember AddNodesRequest_members[2] = { | |
{ | |
UA_TYPENAME("RequestHeader") /* .memberName */ | |
UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("NodesToAdd") /* .memberName */ | |
UA_TYPES_ADDNODESITEM, /* .memberTypeIndex */ | |
offsetof(UA_AddNodesRequest, nodesToAddSize) - offsetof(UA_AddNodesRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* AddNodesResponse */ | |
static UA_DataTypeMember AddNodesResponse_members[3] = { | |
{ | |
UA_TYPENAME("ResponseHeader") /* .memberName */ | |
UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Results") /* .memberName */ | |
UA_TYPES_ADDNODESRESULT, /* .memberTypeIndex */ | |
offsetof(UA_AddNodesResponse, resultsSize) - offsetof(UA_AddNodesResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DiagnosticInfos") /* .memberName */ | |
UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ | |
offsetof(UA_AddNodesResponse, diagnosticInfosSize) - offsetof(UA_AddNodesResponse, results) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* AddReferencesItem */ | |
static UA_DataTypeMember AddReferencesItem_members[6] = { | |
{ | |
UA_TYPENAME("SourceNodeId") /* .memberName */ | |
UA_TYPES_NODEID, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ReferenceTypeId") /* .memberName */ | |
UA_TYPES_NODEID, /* .memberTypeIndex */ | |
offsetof(UA_AddReferencesItem, referenceTypeId) - offsetof(UA_AddReferencesItem, sourceNodeId) - sizeof(UA_NodeId), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("IsForward") /* .memberName */ | |
UA_TYPES_BOOLEAN, /* .memberTypeIndex */ | |
offsetof(UA_AddReferencesItem, isForward) - offsetof(UA_AddReferencesItem, referenceTypeId) - sizeof(UA_NodeId), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("TargetServerUri") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_AddReferencesItem, targetServerUri) - offsetof(UA_AddReferencesItem, isForward) - sizeof(UA_Boolean), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("TargetNodeId") /* .memberName */ | |
UA_TYPES_EXPANDEDNODEID, /* .memberTypeIndex */ | |
offsetof(UA_AddReferencesItem, targetNodeId) - offsetof(UA_AddReferencesItem, targetServerUri) - sizeof(UA_String), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("TargetNodeClass") /* .memberName */ | |
UA_TYPES_NODECLASS, /* .memberTypeIndex */ | |
offsetof(UA_AddReferencesItem, targetNodeClass) - offsetof(UA_AddReferencesItem, targetNodeId) - sizeof(UA_ExpandedNodeId), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* AddReferencesRequest */ | |
static UA_DataTypeMember AddReferencesRequest_members[2] = { | |
{ | |
UA_TYPENAME("RequestHeader") /* .memberName */ | |
UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ReferencesToAdd") /* .memberName */ | |
UA_TYPES_ADDREFERENCESITEM, /* .memberTypeIndex */ | |
offsetof(UA_AddReferencesRequest, referencesToAddSize) - offsetof(UA_AddReferencesRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* AddReferencesResponse */ | |
static UA_DataTypeMember AddReferencesResponse_members[3] = { | |
{ | |
UA_TYPENAME("ResponseHeader") /* .memberName */ | |
UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Results") /* .memberName */ | |
UA_TYPES_STATUSCODE, /* .memberTypeIndex */ | |
offsetof(UA_AddReferencesResponse, resultsSize) - offsetof(UA_AddReferencesResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DiagnosticInfos") /* .memberName */ | |
UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ | |
offsetof(UA_AddReferencesResponse, diagnosticInfosSize) - offsetof(UA_AddReferencesResponse, results) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* DeleteNodesItem */ | |
static UA_DataTypeMember DeleteNodesItem_members[2] = { | |
{ | |
UA_TYPENAME("NodeId") /* .memberName */ | |
UA_TYPES_NODEID, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DeleteTargetReferences") /* .memberName */ | |
UA_TYPES_BOOLEAN, /* .memberTypeIndex */ | |
offsetof(UA_DeleteNodesItem, deleteTargetReferences) - offsetof(UA_DeleteNodesItem, nodeId) - sizeof(UA_NodeId), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* DeleteNodesRequest */ | |
static UA_DataTypeMember DeleteNodesRequest_members[2] = { | |
{ | |
UA_TYPENAME("RequestHeader") /* .memberName */ | |
UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("NodesToDelete") /* .memberName */ | |
UA_TYPES_DELETENODESITEM, /* .memberTypeIndex */ | |
offsetof(UA_DeleteNodesRequest, nodesToDeleteSize) - offsetof(UA_DeleteNodesRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* DeleteNodesResponse */ | |
static UA_DataTypeMember DeleteNodesResponse_members[3] = { | |
{ | |
UA_TYPENAME("ResponseHeader") /* .memberName */ | |
UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Results") /* .memberName */ | |
UA_TYPES_STATUSCODE, /* .memberTypeIndex */ | |
offsetof(UA_DeleteNodesResponse, resultsSize) - offsetof(UA_DeleteNodesResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DiagnosticInfos") /* .memberName */ | |
UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ | |
offsetof(UA_DeleteNodesResponse, diagnosticInfosSize) - offsetof(UA_DeleteNodesResponse, results) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* DeleteReferencesItem */ | |
static UA_DataTypeMember DeleteReferencesItem_members[5] = { | |
{ | |
UA_TYPENAME("SourceNodeId") /* .memberName */ | |
UA_TYPES_NODEID, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ReferenceTypeId") /* .memberName */ | |
UA_TYPES_NODEID, /* .memberTypeIndex */ | |
offsetof(UA_DeleteReferencesItem, referenceTypeId) - offsetof(UA_DeleteReferencesItem, sourceNodeId) - sizeof(UA_NodeId), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("IsForward") /* .memberName */ | |
UA_TYPES_BOOLEAN, /* .memberTypeIndex */ | |
offsetof(UA_DeleteReferencesItem, isForward) - offsetof(UA_DeleteReferencesItem, referenceTypeId) - sizeof(UA_NodeId), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("TargetNodeId") /* .memberName */ | |
UA_TYPES_EXPANDEDNODEID, /* .memberTypeIndex */ | |
offsetof(UA_DeleteReferencesItem, targetNodeId) - offsetof(UA_DeleteReferencesItem, isForward) - sizeof(UA_Boolean), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DeleteBidirectional") /* .memberName */ | |
UA_TYPES_BOOLEAN, /* .memberTypeIndex */ | |
offsetof(UA_DeleteReferencesItem, deleteBidirectional) - offsetof(UA_DeleteReferencesItem, targetNodeId) - sizeof(UA_ExpandedNodeId), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* DeleteReferencesRequest */ | |
static UA_DataTypeMember DeleteReferencesRequest_members[2] = { | |
{ | |
UA_TYPENAME("RequestHeader") /* .memberName */ | |
UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ReferencesToDelete") /* .memberName */ | |
UA_TYPES_DELETEREFERENCESITEM, /* .memberTypeIndex */ | |
offsetof(UA_DeleteReferencesRequest, referencesToDeleteSize) - offsetof(UA_DeleteReferencesRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* DeleteReferencesResponse */ | |
static UA_DataTypeMember DeleteReferencesResponse_members[3] = { | |
{ | |
UA_TYPENAME("ResponseHeader") /* .memberName */ | |
UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Results") /* .memberName */ | |
UA_TYPES_STATUSCODE, /* .memberTypeIndex */ | |
offsetof(UA_DeleteReferencesResponse, resultsSize) - offsetof(UA_DeleteReferencesResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DiagnosticInfos") /* .memberName */ | |
UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ | |
offsetof(UA_DeleteReferencesResponse, diagnosticInfosSize) - offsetof(UA_DeleteReferencesResponse, results) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* BrowseDirection */ | |
#define BrowseDirection_members NULL | |
/* ViewDescription */ | |
static UA_DataTypeMember ViewDescription_members[3] = { | |
{ | |
UA_TYPENAME("ViewId") /* .memberName */ | |
UA_TYPES_NODEID, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Timestamp") /* .memberName */ | |
UA_TYPES_DATETIME, /* .memberTypeIndex */ | |
offsetof(UA_ViewDescription, timestamp) - offsetof(UA_ViewDescription, viewId) - sizeof(UA_NodeId), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ViewVersion") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_ViewDescription, viewVersion) - offsetof(UA_ViewDescription, timestamp) - sizeof(UA_DateTime), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* BrowseDescription */ | |
static UA_DataTypeMember BrowseDescription_members[6] = { | |
{ | |
UA_TYPENAME("NodeId") /* .memberName */ | |
UA_TYPES_NODEID, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("BrowseDirection") /* .memberName */ | |
UA_TYPES_BROWSEDIRECTION, /* .memberTypeIndex */ | |
offsetof(UA_BrowseDescription, browseDirection) - offsetof(UA_BrowseDescription, nodeId) - sizeof(UA_NodeId), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ReferenceTypeId") /* .memberName */ | |
UA_TYPES_NODEID, /* .memberTypeIndex */ | |
offsetof(UA_BrowseDescription, referenceTypeId) - offsetof(UA_BrowseDescription, browseDirection) - sizeof(UA_BrowseDirection), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("IncludeSubtypes") /* .memberName */ | |
UA_TYPES_BOOLEAN, /* .memberTypeIndex */ | |
offsetof(UA_BrowseDescription, includeSubtypes) - offsetof(UA_BrowseDescription, referenceTypeId) - sizeof(UA_NodeId), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("NodeClassMask") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_BrowseDescription, nodeClassMask) - offsetof(UA_BrowseDescription, includeSubtypes) - sizeof(UA_Boolean), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ResultMask") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_BrowseDescription, resultMask) - offsetof(UA_BrowseDescription, nodeClassMask) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* BrowseResultMask */ | |
#define BrowseResultMask_members NULL | |
/* ReferenceDescription */ | |
static UA_DataTypeMember ReferenceDescription_members[7] = { | |
{ | |
UA_TYPENAME("ReferenceTypeId") /* .memberName */ | |
UA_TYPES_NODEID, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("IsForward") /* .memberName */ | |
UA_TYPES_BOOLEAN, /* .memberTypeIndex */ | |
offsetof(UA_ReferenceDescription, isForward) - offsetof(UA_ReferenceDescription, referenceTypeId) - sizeof(UA_NodeId), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("NodeId") /* .memberName */ | |
UA_TYPES_EXPANDEDNODEID, /* .memberTypeIndex */ | |
offsetof(UA_ReferenceDescription, nodeId) - offsetof(UA_ReferenceDescription, isForward) - sizeof(UA_Boolean), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("BrowseName") /* .memberName */ | |
UA_TYPES_QUALIFIEDNAME, /* .memberTypeIndex */ | |
offsetof(UA_ReferenceDescription, browseName) - offsetof(UA_ReferenceDescription, nodeId) - sizeof(UA_ExpandedNodeId), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DisplayName") /* .memberName */ | |
UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ | |
offsetof(UA_ReferenceDescription, displayName) - offsetof(UA_ReferenceDescription, browseName) - sizeof(UA_QualifiedName), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("NodeClass") /* .memberName */ | |
UA_TYPES_NODECLASS, /* .memberTypeIndex */ | |
offsetof(UA_ReferenceDescription, nodeClass) - offsetof(UA_ReferenceDescription, displayName) - sizeof(UA_LocalizedText), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("TypeDefinition") /* .memberName */ | |
UA_TYPES_EXPANDEDNODEID, /* .memberTypeIndex */ | |
offsetof(UA_ReferenceDescription, typeDefinition) - offsetof(UA_ReferenceDescription, nodeClass) - sizeof(UA_NodeClass), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* BrowseResult */ | |
static UA_DataTypeMember BrowseResult_members[3] = { | |
{ | |
UA_TYPENAME("StatusCode") /* .memberName */ | |
UA_TYPES_STATUSCODE, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ContinuationPoint") /* .memberName */ | |
UA_TYPES_BYTESTRING, /* .memberTypeIndex */ | |
offsetof(UA_BrowseResult, continuationPoint) - offsetof(UA_BrowseResult, statusCode) - sizeof(UA_StatusCode), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("References") /* .memberName */ | |
UA_TYPES_REFERENCEDESCRIPTION, /* .memberTypeIndex */ | |
offsetof(UA_BrowseResult, referencesSize) - offsetof(UA_BrowseResult, continuationPoint) - sizeof(UA_ByteString), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* BrowseRequest */ | |
static UA_DataTypeMember BrowseRequest_members[4] = { | |
{ | |
UA_TYPENAME("RequestHeader") /* .memberName */ | |
UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("View") /* .memberName */ | |
UA_TYPES_VIEWDESCRIPTION, /* .memberTypeIndex */ | |
offsetof(UA_BrowseRequest, view) - offsetof(UA_BrowseRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("RequestedMaxReferencesPerNode") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_BrowseRequest, requestedMaxReferencesPerNode) - offsetof(UA_BrowseRequest, view) - sizeof(UA_ViewDescription), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("NodesToBrowse") /* .memberName */ | |
UA_TYPES_BROWSEDESCRIPTION, /* .memberTypeIndex */ | |
offsetof(UA_BrowseRequest, nodesToBrowseSize) - offsetof(UA_BrowseRequest, requestedMaxReferencesPerNode) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* BrowseResponse */ | |
static UA_DataTypeMember BrowseResponse_members[3] = { | |
{ | |
UA_TYPENAME("ResponseHeader") /* .memberName */ | |
UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Results") /* .memberName */ | |
UA_TYPES_BROWSERESULT, /* .memberTypeIndex */ | |
offsetof(UA_BrowseResponse, resultsSize) - offsetof(UA_BrowseResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DiagnosticInfos") /* .memberName */ | |
UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ | |
offsetof(UA_BrowseResponse, diagnosticInfosSize) - offsetof(UA_BrowseResponse, results) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* BrowseNextRequest */ | |
static UA_DataTypeMember BrowseNextRequest_members[3] = { | |
{ | |
UA_TYPENAME("RequestHeader") /* .memberName */ | |
UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ReleaseContinuationPoints") /* .memberName */ | |
UA_TYPES_BOOLEAN, /* .memberTypeIndex */ | |
offsetof(UA_BrowseNextRequest, releaseContinuationPoints) - offsetof(UA_BrowseNextRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ContinuationPoints") /* .memberName */ | |
UA_TYPES_BYTESTRING, /* .memberTypeIndex */ | |
offsetof(UA_BrowseNextRequest, continuationPointsSize) - offsetof(UA_BrowseNextRequest, releaseContinuationPoints) - sizeof(UA_Boolean), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* BrowseNextResponse */ | |
static UA_DataTypeMember BrowseNextResponse_members[3] = { | |
{ | |
UA_TYPENAME("ResponseHeader") /* .memberName */ | |
UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Results") /* .memberName */ | |
UA_TYPES_BROWSERESULT, /* .memberTypeIndex */ | |
offsetof(UA_BrowseNextResponse, resultsSize) - offsetof(UA_BrowseNextResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DiagnosticInfos") /* .memberName */ | |
UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ | |
offsetof(UA_BrowseNextResponse, diagnosticInfosSize) - offsetof(UA_BrowseNextResponse, results) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* RelativePathElement */ | |
static UA_DataTypeMember RelativePathElement_members[4] = { | |
{ | |
UA_TYPENAME("ReferenceTypeId") /* .memberName */ | |
UA_TYPES_NODEID, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("IsInverse") /* .memberName */ | |
UA_TYPES_BOOLEAN, /* .memberTypeIndex */ | |
offsetof(UA_RelativePathElement, isInverse) - offsetof(UA_RelativePathElement, referenceTypeId) - sizeof(UA_NodeId), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("IncludeSubtypes") /* .memberName */ | |
UA_TYPES_BOOLEAN, /* .memberTypeIndex */ | |
offsetof(UA_RelativePathElement, includeSubtypes) - offsetof(UA_RelativePathElement, isInverse) - sizeof(UA_Boolean), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("TargetName") /* .memberName */ | |
UA_TYPES_QUALIFIEDNAME, /* .memberTypeIndex */ | |
offsetof(UA_RelativePathElement, targetName) - offsetof(UA_RelativePathElement, includeSubtypes) - sizeof(UA_Boolean), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* RelativePath */ | |
static UA_DataTypeMember RelativePath_members[1] = { | |
{ | |
UA_TYPENAME("Elements") /* .memberName */ | |
UA_TYPES_RELATIVEPATHELEMENT, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* BrowsePath */ | |
static UA_DataTypeMember BrowsePath_members[2] = { | |
{ | |
UA_TYPENAME("StartingNode") /* .memberName */ | |
UA_TYPES_NODEID, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("RelativePath") /* .memberName */ | |
UA_TYPES_RELATIVEPATH, /* .memberTypeIndex */ | |
offsetof(UA_BrowsePath, relativePath) - offsetof(UA_BrowsePath, startingNode) - sizeof(UA_NodeId), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* BrowsePathTarget */ | |
static UA_DataTypeMember BrowsePathTarget_members[2] = { | |
{ | |
UA_TYPENAME("TargetId") /* .memberName */ | |
UA_TYPES_EXPANDEDNODEID, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("RemainingPathIndex") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_BrowsePathTarget, remainingPathIndex) - offsetof(UA_BrowsePathTarget, targetId) - sizeof(UA_ExpandedNodeId), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* BrowsePathResult */ | |
static UA_DataTypeMember BrowsePathResult_members[2] = { | |
{ | |
UA_TYPENAME("StatusCode") /* .memberName */ | |
UA_TYPES_STATUSCODE, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Targets") /* .memberName */ | |
UA_TYPES_BROWSEPATHTARGET, /* .memberTypeIndex */ | |
offsetof(UA_BrowsePathResult, targetsSize) - offsetof(UA_BrowsePathResult, statusCode) - sizeof(UA_StatusCode), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* TranslateBrowsePathsToNodeIdsRequest */ | |
static UA_DataTypeMember TranslateBrowsePathsToNodeIdsRequest_members[2] = { | |
{ | |
UA_TYPENAME("RequestHeader") /* .memberName */ | |
UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("BrowsePaths") /* .memberName */ | |
UA_TYPES_BROWSEPATH, /* .memberTypeIndex */ | |
offsetof(UA_TranslateBrowsePathsToNodeIdsRequest, browsePathsSize) - offsetof(UA_TranslateBrowsePathsToNodeIdsRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* TranslateBrowsePathsToNodeIdsResponse */ | |
static UA_DataTypeMember TranslateBrowsePathsToNodeIdsResponse_members[3] = { | |
{ | |
UA_TYPENAME("ResponseHeader") /* .memberName */ | |
UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Results") /* .memberName */ | |
UA_TYPES_BROWSEPATHRESULT, /* .memberTypeIndex */ | |
offsetof(UA_TranslateBrowsePathsToNodeIdsResponse, resultsSize) - offsetof(UA_TranslateBrowsePathsToNodeIdsResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DiagnosticInfos") /* .memberName */ | |
UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ | |
offsetof(UA_TranslateBrowsePathsToNodeIdsResponse, diagnosticInfosSize) - offsetof(UA_TranslateBrowsePathsToNodeIdsResponse, results) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* RegisterNodesRequest */ | |
static UA_DataTypeMember RegisterNodesRequest_members[2] = { | |
{ | |
UA_TYPENAME("RequestHeader") /* .memberName */ | |
UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("NodesToRegister") /* .memberName */ | |
UA_TYPES_NODEID, /* .memberTypeIndex */ | |
offsetof(UA_RegisterNodesRequest, nodesToRegisterSize) - offsetof(UA_RegisterNodesRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* RegisterNodesResponse */ | |
static UA_DataTypeMember RegisterNodesResponse_members[2] = { | |
{ | |
UA_TYPENAME("ResponseHeader") /* .memberName */ | |
UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("RegisteredNodeIds") /* .memberName */ | |
UA_TYPES_NODEID, /* .memberTypeIndex */ | |
offsetof(UA_RegisterNodesResponse, registeredNodeIdsSize) - offsetof(UA_RegisterNodesResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* UnregisterNodesRequest */ | |
static UA_DataTypeMember UnregisterNodesRequest_members[2] = { | |
{ | |
UA_TYPENAME("RequestHeader") /* .memberName */ | |
UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("NodesToUnregister") /* .memberName */ | |
UA_TYPES_NODEID, /* .memberTypeIndex */ | |
offsetof(UA_UnregisterNodesRequest, nodesToUnregisterSize) - offsetof(UA_UnregisterNodesRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* UnregisterNodesResponse */ | |
static UA_DataTypeMember UnregisterNodesResponse_members[1] = { | |
{ | |
UA_TYPENAME("ResponseHeader") /* .memberName */ | |
UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* FilterOperator */ | |
#define FilterOperator_members NULL | |
/* ContentFilterElement */ | |
static UA_DataTypeMember ContentFilterElement_members[2] = { | |
{ | |
UA_TYPENAME("FilterOperator") /* .memberName */ | |
UA_TYPES_FILTEROPERATOR, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("FilterOperands") /* .memberName */ | |
UA_TYPES_EXTENSIONOBJECT, /* .memberTypeIndex */ | |
offsetof(UA_ContentFilterElement, filterOperandsSize) - offsetof(UA_ContentFilterElement, filterOperator) - sizeof(UA_FilterOperator), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* ContentFilter */ | |
static UA_DataTypeMember ContentFilter_members[1] = { | |
{ | |
UA_TYPENAME("Elements") /* .memberName */ | |
UA_TYPES_CONTENTFILTERELEMENT, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* FilterOperand */ | |
#define FilterOperand_members NULL | |
/* ElementOperand */ | |
static UA_DataTypeMember ElementOperand_members[1] = { | |
{ | |
UA_TYPENAME("Index") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* LiteralOperand */ | |
static UA_DataTypeMember LiteralOperand_members[1] = { | |
{ | |
UA_TYPENAME("Value") /* .memberName */ | |
UA_TYPES_VARIANT, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* AttributeOperand */ | |
static UA_DataTypeMember AttributeOperand_members[5] = { | |
{ | |
UA_TYPENAME("NodeId") /* .memberName */ | |
UA_TYPES_NODEID, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Alias") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_AttributeOperand, alias) - offsetof(UA_AttributeOperand, nodeId) - sizeof(UA_NodeId), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("BrowsePath") /* .memberName */ | |
UA_TYPES_RELATIVEPATH, /* .memberTypeIndex */ | |
offsetof(UA_AttributeOperand, browsePath) - offsetof(UA_AttributeOperand, alias) - sizeof(UA_String), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("AttributeId") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_AttributeOperand, attributeId) - offsetof(UA_AttributeOperand, browsePath) - sizeof(UA_RelativePath), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("IndexRange") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_AttributeOperand, indexRange) - offsetof(UA_AttributeOperand, attributeId) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* SimpleAttributeOperand */ | |
static UA_DataTypeMember SimpleAttributeOperand_members[4] = { | |
{ | |
UA_TYPENAME("TypeDefinitionId") /* .memberName */ | |
UA_TYPES_NODEID, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("BrowsePath") /* .memberName */ | |
UA_TYPES_QUALIFIEDNAME, /* .memberTypeIndex */ | |
offsetof(UA_SimpleAttributeOperand, browsePathSize) - offsetof(UA_SimpleAttributeOperand, typeDefinitionId) - sizeof(UA_NodeId), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("AttributeId") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_SimpleAttributeOperand, attributeId) - offsetof(UA_SimpleAttributeOperand, browsePath) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("IndexRange") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_SimpleAttributeOperand, indexRange) - offsetof(UA_SimpleAttributeOperand, attributeId) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* ContentFilterElementResult */ | |
static UA_DataTypeMember ContentFilterElementResult_members[3] = { | |
{ | |
UA_TYPENAME("StatusCode") /* .memberName */ | |
UA_TYPES_STATUSCODE, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("OperandStatusCodes") /* .memberName */ | |
UA_TYPES_STATUSCODE, /* .memberTypeIndex */ | |
offsetof(UA_ContentFilterElementResult, operandStatusCodesSize) - offsetof(UA_ContentFilterElementResult, statusCode) - sizeof(UA_StatusCode), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("OperandDiagnosticInfos") /* .memberName */ | |
UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ | |
offsetof(UA_ContentFilterElementResult, operandDiagnosticInfosSize) - offsetof(UA_ContentFilterElementResult, operandStatusCodes) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* ContentFilterResult */ | |
static UA_DataTypeMember ContentFilterResult_members[2] = { | |
{ | |
UA_TYPENAME("ElementResults") /* .memberName */ | |
UA_TYPES_CONTENTFILTERELEMENTRESULT, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ElementDiagnosticInfos") /* .memberName */ | |
UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ | |
offsetof(UA_ContentFilterResult, elementDiagnosticInfosSize) - offsetof(UA_ContentFilterResult, elementResults) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* TimestampsToReturn */ | |
#define TimestampsToReturn_members NULL | |
/* ReadValueId */ | |
static UA_DataTypeMember ReadValueId_members[4] = { | |
{ | |
UA_TYPENAME("NodeId") /* .memberName */ | |
UA_TYPES_NODEID, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("AttributeId") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_ReadValueId, attributeId) - offsetof(UA_ReadValueId, nodeId) - sizeof(UA_NodeId), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("IndexRange") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_ReadValueId, indexRange) - offsetof(UA_ReadValueId, attributeId) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DataEncoding") /* .memberName */ | |
UA_TYPES_QUALIFIEDNAME, /* .memberTypeIndex */ | |
offsetof(UA_ReadValueId, dataEncoding) - offsetof(UA_ReadValueId, indexRange) - sizeof(UA_String), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* ReadRequest */ | |
static UA_DataTypeMember ReadRequest_members[4] = { | |
{ | |
UA_TYPENAME("RequestHeader") /* .memberName */ | |
UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("MaxAge") /* .memberName */ | |
UA_TYPES_DOUBLE, /* .memberTypeIndex */ | |
offsetof(UA_ReadRequest, maxAge) - offsetof(UA_ReadRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("TimestampsToReturn") /* .memberName */ | |
UA_TYPES_TIMESTAMPSTORETURN, /* .memberTypeIndex */ | |
offsetof(UA_ReadRequest, timestampsToReturn) - offsetof(UA_ReadRequest, maxAge) - sizeof(UA_Double), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("NodesToRead") /* .memberName */ | |
UA_TYPES_READVALUEID, /* .memberTypeIndex */ | |
offsetof(UA_ReadRequest, nodesToReadSize) - offsetof(UA_ReadRequest, timestampsToReturn) - sizeof(UA_TimestampsToReturn), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* ReadResponse */ | |
static UA_DataTypeMember ReadResponse_members[3] = { | |
{ | |
UA_TYPENAME("ResponseHeader") /* .memberName */ | |
UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Results") /* .memberName */ | |
UA_TYPES_DATAVALUE, /* .memberTypeIndex */ | |
offsetof(UA_ReadResponse, resultsSize) - offsetof(UA_ReadResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DiagnosticInfos") /* .memberName */ | |
UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ | |
offsetof(UA_ReadResponse, diagnosticInfosSize) - offsetof(UA_ReadResponse, results) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* WriteValue */ | |
static UA_DataTypeMember WriteValue_members[4] = { | |
{ | |
UA_TYPENAME("NodeId") /* .memberName */ | |
UA_TYPES_NODEID, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("AttributeId") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_WriteValue, attributeId) - offsetof(UA_WriteValue, nodeId) - sizeof(UA_NodeId), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("IndexRange") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_WriteValue, indexRange) - offsetof(UA_WriteValue, attributeId) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Value") /* .memberName */ | |
UA_TYPES_DATAVALUE, /* .memberTypeIndex */ | |
offsetof(UA_WriteValue, value) - offsetof(UA_WriteValue, indexRange) - sizeof(UA_String), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* WriteRequest */ | |
static UA_DataTypeMember WriteRequest_members[2] = { | |
{ | |
UA_TYPENAME("RequestHeader") /* .memberName */ | |
UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("NodesToWrite") /* .memberName */ | |
UA_TYPES_WRITEVALUE, /* .memberTypeIndex */ | |
offsetof(UA_WriteRequest, nodesToWriteSize) - offsetof(UA_WriteRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* WriteResponse */ | |
static UA_DataTypeMember WriteResponse_members[3] = { | |
{ | |
UA_TYPENAME("ResponseHeader") /* .memberName */ | |
UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Results") /* .memberName */ | |
UA_TYPES_STATUSCODE, /* .memberTypeIndex */ | |
offsetof(UA_WriteResponse, resultsSize) - offsetof(UA_WriteResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DiagnosticInfos") /* .memberName */ | |
UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ | |
offsetof(UA_WriteResponse, diagnosticInfosSize) - offsetof(UA_WriteResponse, results) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* CallMethodRequest */ | |
static UA_DataTypeMember CallMethodRequest_members[3] = { | |
{ | |
UA_TYPENAME("ObjectId") /* .memberName */ | |
UA_TYPES_NODEID, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("MethodId") /* .memberName */ | |
UA_TYPES_NODEID, /* .memberTypeIndex */ | |
offsetof(UA_CallMethodRequest, methodId) - offsetof(UA_CallMethodRequest, objectId) - sizeof(UA_NodeId), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("InputArguments") /* .memberName */ | |
UA_TYPES_VARIANT, /* .memberTypeIndex */ | |
offsetof(UA_CallMethodRequest, inputArgumentsSize) - offsetof(UA_CallMethodRequest, methodId) - sizeof(UA_NodeId), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* CallMethodResult */ | |
static UA_DataTypeMember CallMethodResult_members[4] = { | |
{ | |
UA_TYPENAME("StatusCode") /* .memberName */ | |
UA_TYPES_STATUSCODE, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("InputArgumentResults") /* .memberName */ | |
UA_TYPES_STATUSCODE, /* .memberTypeIndex */ | |
offsetof(UA_CallMethodResult, inputArgumentResultsSize) - offsetof(UA_CallMethodResult, statusCode) - sizeof(UA_StatusCode), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("InputArgumentDiagnosticInfos") /* .memberName */ | |
UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ | |
offsetof(UA_CallMethodResult, inputArgumentDiagnosticInfosSize) - offsetof(UA_CallMethodResult, inputArgumentResults) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("OutputArguments") /* .memberName */ | |
UA_TYPES_VARIANT, /* .memberTypeIndex */ | |
offsetof(UA_CallMethodResult, outputArgumentsSize) - offsetof(UA_CallMethodResult, inputArgumentDiagnosticInfos) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* CallRequest */ | |
static UA_DataTypeMember CallRequest_members[2] = { | |
{ | |
UA_TYPENAME("RequestHeader") /* .memberName */ | |
UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("MethodsToCall") /* .memberName */ | |
UA_TYPES_CALLMETHODREQUEST, /* .memberTypeIndex */ | |
offsetof(UA_CallRequest, methodsToCallSize) - offsetof(UA_CallRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* CallResponse */ | |
static UA_DataTypeMember CallResponse_members[3] = { | |
{ | |
UA_TYPENAME("ResponseHeader") /* .memberName */ | |
UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Results") /* .memberName */ | |
UA_TYPES_CALLMETHODRESULT, /* .memberTypeIndex */ | |
offsetof(UA_CallResponse, resultsSize) - offsetof(UA_CallResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DiagnosticInfos") /* .memberName */ | |
UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ | |
offsetof(UA_CallResponse, diagnosticInfosSize) - offsetof(UA_CallResponse, results) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* MonitoringMode */ | |
#define MonitoringMode_members NULL | |
/* DataChangeTrigger */ | |
#define DataChangeTrigger_members NULL | |
/* DeadbandType */ | |
#define DeadbandType_members NULL | |
/* DataChangeFilter */ | |
static UA_DataTypeMember DataChangeFilter_members[3] = { | |
{ | |
UA_TYPENAME("Trigger") /* .memberName */ | |
UA_TYPES_DATACHANGETRIGGER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DeadbandType") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_DataChangeFilter, deadbandType) - offsetof(UA_DataChangeFilter, trigger) - sizeof(UA_DataChangeTrigger), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DeadbandValue") /* .memberName */ | |
UA_TYPES_DOUBLE, /* .memberTypeIndex */ | |
offsetof(UA_DataChangeFilter, deadbandValue) - offsetof(UA_DataChangeFilter, deadbandType) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* EventFilter */ | |
static UA_DataTypeMember EventFilter_members[2] = { | |
{ | |
UA_TYPENAME("SelectClauses") /* .memberName */ | |
UA_TYPES_SIMPLEATTRIBUTEOPERAND, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("WhereClause") /* .memberName */ | |
UA_TYPES_CONTENTFILTER, /* .memberTypeIndex */ | |
offsetof(UA_EventFilter, whereClause) - offsetof(UA_EventFilter, selectClauses) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* AggregateConfiguration */ | |
static UA_DataTypeMember AggregateConfiguration_members[5] = { | |
{ | |
UA_TYPENAME("UseServerCapabilitiesDefaults") /* .memberName */ | |
UA_TYPES_BOOLEAN, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("TreatUncertainAsBad") /* .memberName */ | |
UA_TYPES_BOOLEAN, /* .memberTypeIndex */ | |
offsetof(UA_AggregateConfiguration, treatUncertainAsBad) - offsetof(UA_AggregateConfiguration, useServerCapabilitiesDefaults) - sizeof(UA_Boolean), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("PercentDataBad") /* .memberName */ | |
UA_TYPES_BYTE, /* .memberTypeIndex */ | |
offsetof(UA_AggregateConfiguration, percentDataBad) - offsetof(UA_AggregateConfiguration, treatUncertainAsBad) - sizeof(UA_Boolean), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("PercentDataGood") /* .memberName */ | |
UA_TYPES_BYTE, /* .memberTypeIndex */ | |
offsetof(UA_AggregateConfiguration, percentDataGood) - offsetof(UA_AggregateConfiguration, percentDataBad) - sizeof(UA_Byte), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("UseSlopedExtrapolation") /* .memberName */ | |
UA_TYPES_BOOLEAN, /* .memberTypeIndex */ | |
offsetof(UA_AggregateConfiguration, useSlopedExtrapolation) - offsetof(UA_AggregateConfiguration, percentDataGood) - sizeof(UA_Byte), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* AggregateFilter */ | |
static UA_DataTypeMember AggregateFilter_members[4] = { | |
{ | |
UA_TYPENAME("StartTime") /* .memberName */ | |
UA_TYPES_DATETIME, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("AggregateType") /* .memberName */ | |
UA_TYPES_NODEID, /* .memberTypeIndex */ | |
offsetof(UA_AggregateFilter, aggregateType) - offsetof(UA_AggregateFilter, startTime) - sizeof(UA_DateTime), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ProcessingInterval") /* .memberName */ | |
UA_TYPES_DOUBLE, /* .memberTypeIndex */ | |
offsetof(UA_AggregateFilter, processingInterval) - offsetof(UA_AggregateFilter, aggregateType) - sizeof(UA_NodeId), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("AggregateConfiguration") /* .memberName */ | |
UA_TYPES_AGGREGATECONFIGURATION, /* .memberTypeIndex */ | |
offsetof(UA_AggregateFilter, aggregateConfiguration) - offsetof(UA_AggregateFilter, processingInterval) - sizeof(UA_Double), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* EventFilterResult */ | |
static UA_DataTypeMember EventFilterResult_members[3] = { | |
{ | |
UA_TYPENAME("SelectClauseResults") /* .memberName */ | |
UA_TYPES_STATUSCODE, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("SelectClauseDiagnosticInfos") /* .memberName */ | |
UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ | |
offsetof(UA_EventFilterResult, selectClauseDiagnosticInfosSize) - offsetof(UA_EventFilterResult, selectClauseResults) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("WhereClauseResult") /* .memberName */ | |
UA_TYPES_CONTENTFILTERRESULT, /* .memberTypeIndex */ | |
offsetof(UA_EventFilterResult, whereClauseResult) - offsetof(UA_EventFilterResult, selectClauseDiagnosticInfos) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* MonitoringParameters */ | |
static UA_DataTypeMember MonitoringParameters_members[5] = { | |
{ | |
UA_TYPENAME("ClientHandle") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("SamplingInterval") /* .memberName */ | |
UA_TYPES_DOUBLE, /* .memberTypeIndex */ | |
offsetof(UA_MonitoringParameters, samplingInterval) - offsetof(UA_MonitoringParameters, clientHandle) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Filter") /* .memberName */ | |
UA_TYPES_EXTENSIONOBJECT, /* .memberTypeIndex */ | |
offsetof(UA_MonitoringParameters, filter) - offsetof(UA_MonitoringParameters, samplingInterval) - sizeof(UA_Double), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("QueueSize") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_MonitoringParameters, queueSize) - offsetof(UA_MonitoringParameters, filter) - sizeof(UA_ExtensionObject), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DiscardOldest") /* .memberName */ | |
UA_TYPES_BOOLEAN, /* .memberTypeIndex */ | |
offsetof(UA_MonitoringParameters, discardOldest) - offsetof(UA_MonitoringParameters, queueSize) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* MonitoredItemCreateRequest */ | |
static UA_DataTypeMember MonitoredItemCreateRequest_members[3] = { | |
{ | |
UA_TYPENAME("ItemToMonitor") /* .memberName */ | |
UA_TYPES_READVALUEID, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("MonitoringMode") /* .memberName */ | |
UA_TYPES_MONITORINGMODE, /* .memberTypeIndex */ | |
offsetof(UA_MonitoredItemCreateRequest, monitoringMode) - offsetof(UA_MonitoredItemCreateRequest, itemToMonitor) - sizeof(UA_ReadValueId), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("RequestedParameters") /* .memberName */ | |
UA_TYPES_MONITORINGPARAMETERS, /* .memberTypeIndex */ | |
offsetof(UA_MonitoredItemCreateRequest, requestedParameters) - offsetof(UA_MonitoredItemCreateRequest, monitoringMode) - sizeof(UA_MonitoringMode), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* MonitoredItemCreateResult */ | |
static UA_DataTypeMember MonitoredItemCreateResult_members[5] = { | |
{ | |
UA_TYPENAME("StatusCode") /* .memberName */ | |
UA_TYPES_STATUSCODE, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("MonitoredItemId") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_MonitoredItemCreateResult, monitoredItemId) - offsetof(UA_MonitoredItemCreateResult, statusCode) - sizeof(UA_StatusCode), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("RevisedSamplingInterval") /* .memberName */ | |
UA_TYPES_DOUBLE, /* .memberTypeIndex */ | |
offsetof(UA_MonitoredItemCreateResult, revisedSamplingInterval) - offsetof(UA_MonitoredItemCreateResult, monitoredItemId) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("RevisedQueueSize") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_MonitoredItemCreateResult, revisedQueueSize) - offsetof(UA_MonitoredItemCreateResult, revisedSamplingInterval) - sizeof(UA_Double), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("FilterResult") /* .memberName */ | |
UA_TYPES_EXTENSIONOBJECT, /* .memberTypeIndex */ | |
offsetof(UA_MonitoredItemCreateResult, filterResult) - offsetof(UA_MonitoredItemCreateResult, revisedQueueSize) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* CreateMonitoredItemsRequest */ | |
static UA_DataTypeMember CreateMonitoredItemsRequest_members[4] = { | |
{ | |
UA_TYPENAME("RequestHeader") /* .memberName */ | |
UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("SubscriptionId") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_CreateMonitoredItemsRequest, subscriptionId) - offsetof(UA_CreateMonitoredItemsRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("TimestampsToReturn") /* .memberName */ | |
UA_TYPES_TIMESTAMPSTORETURN, /* .memberTypeIndex */ | |
offsetof(UA_CreateMonitoredItemsRequest, timestampsToReturn) - offsetof(UA_CreateMonitoredItemsRequest, subscriptionId) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ItemsToCreate") /* .memberName */ | |
UA_TYPES_MONITOREDITEMCREATEREQUEST, /* .memberTypeIndex */ | |
offsetof(UA_CreateMonitoredItemsRequest, itemsToCreateSize) - offsetof(UA_CreateMonitoredItemsRequest, timestampsToReturn) - sizeof(UA_TimestampsToReturn), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* CreateMonitoredItemsResponse */ | |
static UA_DataTypeMember CreateMonitoredItemsResponse_members[3] = { | |
{ | |
UA_TYPENAME("ResponseHeader") /* .memberName */ | |
UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Results") /* .memberName */ | |
UA_TYPES_MONITOREDITEMCREATERESULT, /* .memberTypeIndex */ | |
offsetof(UA_CreateMonitoredItemsResponse, resultsSize) - offsetof(UA_CreateMonitoredItemsResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DiagnosticInfos") /* .memberName */ | |
UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ | |
offsetof(UA_CreateMonitoredItemsResponse, diagnosticInfosSize) - offsetof(UA_CreateMonitoredItemsResponse, results) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* MonitoredItemModifyRequest */ | |
static UA_DataTypeMember MonitoredItemModifyRequest_members[2] = { | |
{ | |
UA_TYPENAME("MonitoredItemId") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("RequestedParameters") /* .memberName */ | |
UA_TYPES_MONITORINGPARAMETERS, /* .memberTypeIndex */ | |
offsetof(UA_MonitoredItemModifyRequest, requestedParameters) - offsetof(UA_MonitoredItemModifyRequest, monitoredItemId) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* MonitoredItemModifyResult */ | |
static UA_DataTypeMember MonitoredItemModifyResult_members[4] = { | |
{ | |
UA_TYPENAME("StatusCode") /* .memberName */ | |
UA_TYPES_STATUSCODE, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("RevisedSamplingInterval") /* .memberName */ | |
UA_TYPES_DOUBLE, /* .memberTypeIndex */ | |
offsetof(UA_MonitoredItemModifyResult, revisedSamplingInterval) - offsetof(UA_MonitoredItemModifyResult, statusCode) - sizeof(UA_StatusCode), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("RevisedQueueSize") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_MonitoredItemModifyResult, revisedQueueSize) - offsetof(UA_MonitoredItemModifyResult, revisedSamplingInterval) - sizeof(UA_Double), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("FilterResult") /* .memberName */ | |
UA_TYPES_EXTENSIONOBJECT, /* .memberTypeIndex */ | |
offsetof(UA_MonitoredItemModifyResult, filterResult) - offsetof(UA_MonitoredItemModifyResult, revisedQueueSize) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* ModifyMonitoredItemsRequest */ | |
static UA_DataTypeMember ModifyMonitoredItemsRequest_members[4] = { | |
{ | |
UA_TYPENAME("RequestHeader") /* .memberName */ | |
UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("SubscriptionId") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_ModifyMonitoredItemsRequest, subscriptionId) - offsetof(UA_ModifyMonitoredItemsRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("TimestampsToReturn") /* .memberName */ | |
UA_TYPES_TIMESTAMPSTORETURN, /* .memberTypeIndex */ | |
offsetof(UA_ModifyMonitoredItemsRequest, timestampsToReturn) - offsetof(UA_ModifyMonitoredItemsRequest, subscriptionId) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ItemsToModify") /* .memberName */ | |
UA_TYPES_MONITOREDITEMMODIFYREQUEST, /* .memberTypeIndex */ | |
offsetof(UA_ModifyMonitoredItemsRequest, itemsToModifySize) - offsetof(UA_ModifyMonitoredItemsRequest, timestampsToReturn) - sizeof(UA_TimestampsToReturn), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* ModifyMonitoredItemsResponse */ | |
static UA_DataTypeMember ModifyMonitoredItemsResponse_members[3] = { | |
{ | |
UA_TYPENAME("ResponseHeader") /* .memberName */ | |
UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Results") /* .memberName */ | |
UA_TYPES_MONITOREDITEMMODIFYRESULT, /* .memberTypeIndex */ | |
offsetof(UA_ModifyMonitoredItemsResponse, resultsSize) - offsetof(UA_ModifyMonitoredItemsResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DiagnosticInfos") /* .memberName */ | |
UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ | |
offsetof(UA_ModifyMonitoredItemsResponse, diagnosticInfosSize) - offsetof(UA_ModifyMonitoredItemsResponse, results) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* SetMonitoringModeRequest */ | |
static UA_DataTypeMember SetMonitoringModeRequest_members[4] = { | |
{ | |
UA_TYPENAME("RequestHeader") /* .memberName */ | |
UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("SubscriptionId") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_SetMonitoringModeRequest, subscriptionId) - offsetof(UA_SetMonitoringModeRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("MonitoringMode") /* .memberName */ | |
UA_TYPES_MONITORINGMODE, /* .memberTypeIndex */ | |
offsetof(UA_SetMonitoringModeRequest, monitoringMode) - offsetof(UA_SetMonitoringModeRequest, subscriptionId) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("MonitoredItemIds") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_SetMonitoringModeRequest, monitoredItemIdsSize) - offsetof(UA_SetMonitoringModeRequest, monitoringMode) - sizeof(UA_MonitoringMode), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* SetMonitoringModeResponse */ | |
static UA_DataTypeMember SetMonitoringModeResponse_members[3] = { | |
{ | |
UA_TYPENAME("ResponseHeader") /* .memberName */ | |
UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Results") /* .memberName */ | |
UA_TYPES_STATUSCODE, /* .memberTypeIndex */ | |
offsetof(UA_SetMonitoringModeResponse, resultsSize) - offsetof(UA_SetMonitoringModeResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DiagnosticInfos") /* .memberName */ | |
UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ | |
offsetof(UA_SetMonitoringModeResponse, diagnosticInfosSize) - offsetof(UA_SetMonitoringModeResponse, results) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* SetTriggeringRequest */ | |
static UA_DataTypeMember SetTriggeringRequest_members[5] = { | |
{ | |
UA_TYPENAME("RequestHeader") /* .memberName */ | |
UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("SubscriptionId") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_SetTriggeringRequest, subscriptionId) - offsetof(UA_SetTriggeringRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("TriggeringItemId") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_SetTriggeringRequest, triggeringItemId) - offsetof(UA_SetTriggeringRequest, subscriptionId) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("LinksToAdd") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_SetTriggeringRequest, linksToAddSize) - offsetof(UA_SetTriggeringRequest, triggeringItemId) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("LinksToRemove") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_SetTriggeringRequest, linksToRemoveSize) - offsetof(UA_SetTriggeringRequest, linksToAdd) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* SetTriggeringResponse */ | |
static UA_DataTypeMember SetTriggeringResponse_members[5] = { | |
{ | |
UA_TYPENAME("ResponseHeader") /* .memberName */ | |
UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("AddResults") /* .memberName */ | |
UA_TYPES_STATUSCODE, /* .memberTypeIndex */ | |
offsetof(UA_SetTriggeringResponse, addResultsSize) - offsetof(UA_SetTriggeringResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("AddDiagnosticInfos") /* .memberName */ | |
UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ | |
offsetof(UA_SetTriggeringResponse, addDiagnosticInfosSize) - offsetof(UA_SetTriggeringResponse, addResults) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("RemoveResults") /* .memberName */ | |
UA_TYPES_STATUSCODE, /* .memberTypeIndex */ | |
offsetof(UA_SetTriggeringResponse, removeResultsSize) - offsetof(UA_SetTriggeringResponse, addDiagnosticInfos) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("RemoveDiagnosticInfos") /* .memberName */ | |
UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ | |
offsetof(UA_SetTriggeringResponse, removeDiagnosticInfosSize) - offsetof(UA_SetTriggeringResponse, removeResults) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* DeleteMonitoredItemsRequest */ | |
static UA_DataTypeMember DeleteMonitoredItemsRequest_members[3] = { | |
{ | |
UA_TYPENAME("RequestHeader") /* .memberName */ | |
UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("SubscriptionId") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_DeleteMonitoredItemsRequest, subscriptionId) - offsetof(UA_DeleteMonitoredItemsRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("MonitoredItemIds") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_DeleteMonitoredItemsRequest, monitoredItemIdsSize) - offsetof(UA_DeleteMonitoredItemsRequest, subscriptionId) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* DeleteMonitoredItemsResponse */ | |
static UA_DataTypeMember DeleteMonitoredItemsResponse_members[3] = { | |
{ | |
UA_TYPENAME("ResponseHeader") /* .memberName */ | |
UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Results") /* .memberName */ | |
UA_TYPES_STATUSCODE, /* .memberTypeIndex */ | |
offsetof(UA_DeleteMonitoredItemsResponse, resultsSize) - offsetof(UA_DeleteMonitoredItemsResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DiagnosticInfos") /* .memberName */ | |
UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ | |
offsetof(UA_DeleteMonitoredItemsResponse, diagnosticInfosSize) - offsetof(UA_DeleteMonitoredItemsResponse, results) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* CreateSubscriptionRequest */ | |
static UA_DataTypeMember CreateSubscriptionRequest_members[7] = { | |
{ | |
UA_TYPENAME("RequestHeader") /* .memberName */ | |
UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("RequestedPublishingInterval") /* .memberName */ | |
UA_TYPES_DOUBLE, /* .memberTypeIndex */ | |
offsetof(UA_CreateSubscriptionRequest, requestedPublishingInterval) - offsetof(UA_CreateSubscriptionRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("RequestedLifetimeCount") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_CreateSubscriptionRequest, requestedLifetimeCount) - offsetof(UA_CreateSubscriptionRequest, requestedPublishingInterval) - sizeof(UA_Double), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("RequestedMaxKeepAliveCount") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_CreateSubscriptionRequest, requestedMaxKeepAliveCount) - offsetof(UA_CreateSubscriptionRequest, requestedLifetimeCount) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("MaxNotificationsPerPublish") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_CreateSubscriptionRequest, maxNotificationsPerPublish) - offsetof(UA_CreateSubscriptionRequest, requestedMaxKeepAliveCount) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("PublishingEnabled") /* .memberName */ | |
UA_TYPES_BOOLEAN, /* .memberTypeIndex */ | |
offsetof(UA_CreateSubscriptionRequest, publishingEnabled) - offsetof(UA_CreateSubscriptionRequest, maxNotificationsPerPublish) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Priority") /* .memberName */ | |
UA_TYPES_BYTE, /* .memberTypeIndex */ | |
offsetof(UA_CreateSubscriptionRequest, priority) - offsetof(UA_CreateSubscriptionRequest, publishingEnabled) - sizeof(UA_Boolean), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* CreateSubscriptionResponse */ | |
static UA_DataTypeMember CreateSubscriptionResponse_members[5] = { | |
{ | |
UA_TYPENAME("ResponseHeader") /* .memberName */ | |
UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("SubscriptionId") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_CreateSubscriptionResponse, subscriptionId) - offsetof(UA_CreateSubscriptionResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("RevisedPublishingInterval") /* .memberName */ | |
UA_TYPES_DOUBLE, /* .memberTypeIndex */ | |
offsetof(UA_CreateSubscriptionResponse, revisedPublishingInterval) - offsetof(UA_CreateSubscriptionResponse, subscriptionId) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("RevisedLifetimeCount") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_CreateSubscriptionResponse, revisedLifetimeCount) - offsetof(UA_CreateSubscriptionResponse, revisedPublishingInterval) - sizeof(UA_Double), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("RevisedMaxKeepAliveCount") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_CreateSubscriptionResponse, revisedMaxKeepAliveCount) - offsetof(UA_CreateSubscriptionResponse, revisedLifetimeCount) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* ModifySubscriptionRequest */ | |
static UA_DataTypeMember ModifySubscriptionRequest_members[7] = { | |
{ | |
UA_TYPENAME("RequestHeader") /* .memberName */ | |
UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("SubscriptionId") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_ModifySubscriptionRequest, subscriptionId) - offsetof(UA_ModifySubscriptionRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("RequestedPublishingInterval") /* .memberName */ | |
UA_TYPES_DOUBLE, /* .memberTypeIndex */ | |
offsetof(UA_ModifySubscriptionRequest, requestedPublishingInterval) - offsetof(UA_ModifySubscriptionRequest, subscriptionId) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("RequestedLifetimeCount") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_ModifySubscriptionRequest, requestedLifetimeCount) - offsetof(UA_ModifySubscriptionRequest, requestedPublishingInterval) - sizeof(UA_Double), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("RequestedMaxKeepAliveCount") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_ModifySubscriptionRequest, requestedMaxKeepAliveCount) - offsetof(UA_ModifySubscriptionRequest, requestedLifetimeCount) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("MaxNotificationsPerPublish") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_ModifySubscriptionRequest, maxNotificationsPerPublish) - offsetof(UA_ModifySubscriptionRequest, requestedMaxKeepAliveCount) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Priority") /* .memberName */ | |
UA_TYPES_BYTE, /* .memberTypeIndex */ | |
offsetof(UA_ModifySubscriptionRequest, priority) - offsetof(UA_ModifySubscriptionRequest, maxNotificationsPerPublish) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* ModifySubscriptionResponse */ | |
static UA_DataTypeMember ModifySubscriptionResponse_members[4] = { | |
{ | |
UA_TYPENAME("ResponseHeader") /* .memberName */ | |
UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("RevisedPublishingInterval") /* .memberName */ | |
UA_TYPES_DOUBLE, /* .memberTypeIndex */ | |
offsetof(UA_ModifySubscriptionResponse, revisedPublishingInterval) - offsetof(UA_ModifySubscriptionResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("RevisedLifetimeCount") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_ModifySubscriptionResponse, revisedLifetimeCount) - offsetof(UA_ModifySubscriptionResponse, revisedPublishingInterval) - sizeof(UA_Double), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("RevisedMaxKeepAliveCount") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_ModifySubscriptionResponse, revisedMaxKeepAliveCount) - offsetof(UA_ModifySubscriptionResponse, revisedLifetimeCount) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* SetPublishingModeRequest */ | |
static UA_DataTypeMember SetPublishingModeRequest_members[3] = { | |
{ | |
UA_TYPENAME("RequestHeader") /* .memberName */ | |
UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("PublishingEnabled") /* .memberName */ | |
UA_TYPES_BOOLEAN, /* .memberTypeIndex */ | |
offsetof(UA_SetPublishingModeRequest, publishingEnabled) - offsetof(UA_SetPublishingModeRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("SubscriptionIds") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_SetPublishingModeRequest, subscriptionIdsSize) - offsetof(UA_SetPublishingModeRequest, publishingEnabled) - sizeof(UA_Boolean), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* SetPublishingModeResponse */ | |
static UA_DataTypeMember SetPublishingModeResponse_members[3] = { | |
{ | |
UA_TYPENAME("ResponseHeader") /* .memberName */ | |
UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Results") /* .memberName */ | |
UA_TYPES_STATUSCODE, /* .memberTypeIndex */ | |
offsetof(UA_SetPublishingModeResponse, resultsSize) - offsetof(UA_SetPublishingModeResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DiagnosticInfos") /* .memberName */ | |
UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ | |
offsetof(UA_SetPublishingModeResponse, diagnosticInfosSize) - offsetof(UA_SetPublishingModeResponse, results) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* NotificationMessage */ | |
static UA_DataTypeMember NotificationMessage_members[3] = { | |
{ | |
UA_TYPENAME("SequenceNumber") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("PublishTime") /* .memberName */ | |
UA_TYPES_DATETIME, /* .memberTypeIndex */ | |
offsetof(UA_NotificationMessage, publishTime) - offsetof(UA_NotificationMessage, sequenceNumber) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("NotificationData") /* .memberName */ | |
UA_TYPES_EXTENSIONOBJECT, /* .memberTypeIndex */ | |
offsetof(UA_NotificationMessage, notificationDataSize) - offsetof(UA_NotificationMessage, publishTime) - sizeof(UA_DateTime), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* MonitoredItemNotification */ | |
static UA_DataTypeMember MonitoredItemNotification_members[2] = { | |
{ | |
UA_TYPENAME("ClientHandle") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Value") /* .memberName */ | |
UA_TYPES_DATAVALUE, /* .memberTypeIndex */ | |
offsetof(UA_MonitoredItemNotification, value) - offsetof(UA_MonitoredItemNotification, clientHandle) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* EventFieldList */ | |
static UA_DataTypeMember EventFieldList_members[2] = { | |
{ | |
UA_TYPENAME("ClientHandle") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("EventFields") /* .memberName */ | |
UA_TYPES_VARIANT, /* .memberTypeIndex */ | |
offsetof(UA_EventFieldList, eventFieldsSize) - offsetof(UA_EventFieldList, clientHandle) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* StatusChangeNotification */ | |
static UA_DataTypeMember StatusChangeNotification_members[2] = { | |
{ | |
UA_TYPENAME("Status") /* .memberName */ | |
UA_TYPES_STATUSCODE, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DiagnosticInfo") /* .memberName */ | |
UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ | |
offsetof(UA_StatusChangeNotification, diagnosticInfo) - offsetof(UA_StatusChangeNotification, status) - sizeof(UA_StatusCode), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* SubscriptionAcknowledgement */ | |
static UA_DataTypeMember SubscriptionAcknowledgement_members[2] = { | |
{ | |
UA_TYPENAME("SubscriptionId") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("SequenceNumber") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_SubscriptionAcknowledgement, sequenceNumber) - offsetof(UA_SubscriptionAcknowledgement, subscriptionId) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* PublishRequest */ | |
static UA_DataTypeMember PublishRequest_members[2] = { | |
{ | |
UA_TYPENAME("RequestHeader") /* .memberName */ | |
UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("SubscriptionAcknowledgements") /* .memberName */ | |
UA_TYPES_SUBSCRIPTIONACKNOWLEDGEMENT, /* .memberTypeIndex */ | |
offsetof(UA_PublishRequest, subscriptionAcknowledgementsSize) - offsetof(UA_PublishRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* PublishResponse */ | |
static UA_DataTypeMember PublishResponse_members[7] = { | |
{ | |
UA_TYPENAME("ResponseHeader") /* .memberName */ | |
UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("SubscriptionId") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_PublishResponse, subscriptionId) - offsetof(UA_PublishResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("AvailableSequenceNumbers") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_PublishResponse, availableSequenceNumbersSize) - offsetof(UA_PublishResponse, subscriptionId) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("MoreNotifications") /* .memberName */ | |
UA_TYPES_BOOLEAN, /* .memberTypeIndex */ | |
offsetof(UA_PublishResponse, moreNotifications) - offsetof(UA_PublishResponse, availableSequenceNumbers) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("NotificationMessage") /* .memberName */ | |
UA_TYPES_NOTIFICATIONMESSAGE, /* .memberTypeIndex */ | |
offsetof(UA_PublishResponse, notificationMessage) - offsetof(UA_PublishResponse, moreNotifications) - sizeof(UA_Boolean), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Results") /* .memberName */ | |
UA_TYPES_STATUSCODE, /* .memberTypeIndex */ | |
offsetof(UA_PublishResponse, resultsSize) - offsetof(UA_PublishResponse, notificationMessage) - sizeof(UA_NotificationMessage), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DiagnosticInfos") /* .memberName */ | |
UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ | |
offsetof(UA_PublishResponse, diagnosticInfosSize) - offsetof(UA_PublishResponse, results) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* RepublishRequest */ | |
static UA_DataTypeMember RepublishRequest_members[3] = { | |
{ | |
UA_TYPENAME("RequestHeader") /* .memberName */ | |
UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("SubscriptionId") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_RepublishRequest, subscriptionId) - offsetof(UA_RepublishRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("RetransmitSequenceNumber") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_RepublishRequest, retransmitSequenceNumber) - offsetof(UA_RepublishRequest, subscriptionId) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* RepublishResponse */ | |
static UA_DataTypeMember RepublishResponse_members[2] = { | |
{ | |
UA_TYPENAME("ResponseHeader") /* .memberName */ | |
UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("NotificationMessage") /* .memberName */ | |
UA_TYPES_NOTIFICATIONMESSAGE, /* .memberTypeIndex */ | |
offsetof(UA_RepublishResponse, notificationMessage) - offsetof(UA_RepublishResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* DeleteSubscriptionsRequest */ | |
static UA_DataTypeMember DeleteSubscriptionsRequest_members[2] = { | |
{ | |
UA_TYPENAME("RequestHeader") /* .memberName */ | |
UA_TYPES_REQUESTHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("SubscriptionIds") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_DeleteSubscriptionsRequest, subscriptionIdsSize) - offsetof(UA_DeleteSubscriptionsRequest, requestHeader) - sizeof(UA_RequestHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* DeleteSubscriptionsResponse */ | |
static UA_DataTypeMember DeleteSubscriptionsResponse_members[3] = { | |
{ | |
UA_TYPENAME("ResponseHeader") /* .memberName */ | |
UA_TYPES_RESPONSEHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Results") /* .memberName */ | |
UA_TYPES_STATUSCODE, /* .memberTypeIndex */ | |
offsetof(UA_DeleteSubscriptionsResponse, resultsSize) - offsetof(UA_DeleteSubscriptionsResponse, responseHeader) - sizeof(UA_ResponseHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DiagnosticInfos") /* .memberName */ | |
UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ | |
offsetof(UA_DeleteSubscriptionsResponse, diagnosticInfosSize) - offsetof(UA_DeleteSubscriptionsResponse, results) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* BuildInfo */ | |
static UA_DataTypeMember BuildInfo_members[6] = { | |
{ | |
UA_TYPENAME("ProductUri") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ManufacturerName") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_BuildInfo, manufacturerName) - offsetof(UA_BuildInfo, productUri) - sizeof(UA_String), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ProductName") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_BuildInfo, productName) - offsetof(UA_BuildInfo, manufacturerName) - sizeof(UA_String), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("SoftwareVersion") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_BuildInfo, softwareVersion) - offsetof(UA_BuildInfo, productName) - sizeof(UA_String), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("BuildNumber") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_BuildInfo, buildNumber) - offsetof(UA_BuildInfo, softwareVersion) - sizeof(UA_String), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("BuildDate") /* .memberName */ | |
UA_TYPES_DATETIME, /* .memberTypeIndex */ | |
offsetof(UA_BuildInfo, buildDate) - offsetof(UA_BuildInfo, buildNumber) - sizeof(UA_String), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* RedundancySupport */ | |
#define RedundancySupport_members NULL | |
/* ServerState */ | |
#define ServerState_members NULL | |
/* ServerDiagnosticsSummaryDataType */ | |
static UA_DataTypeMember ServerDiagnosticsSummaryDataType_members[12] = { | |
{ | |
UA_TYPENAME("ServerViewCount") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("CurrentSessionCount") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_ServerDiagnosticsSummaryDataType, currentSessionCount) - offsetof(UA_ServerDiagnosticsSummaryDataType, serverViewCount) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("CumulatedSessionCount") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_ServerDiagnosticsSummaryDataType, cumulatedSessionCount) - offsetof(UA_ServerDiagnosticsSummaryDataType, currentSessionCount) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("SecurityRejectedSessionCount") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_ServerDiagnosticsSummaryDataType, securityRejectedSessionCount) - offsetof(UA_ServerDiagnosticsSummaryDataType, cumulatedSessionCount) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("RejectedSessionCount") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_ServerDiagnosticsSummaryDataType, rejectedSessionCount) - offsetof(UA_ServerDiagnosticsSummaryDataType, securityRejectedSessionCount) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("SessionTimeoutCount") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_ServerDiagnosticsSummaryDataType, sessionTimeoutCount) - offsetof(UA_ServerDiagnosticsSummaryDataType, rejectedSessionCount) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("SessionAbortCount") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_ServerDiagnosticsSummaryDataType, sessionAbortCount) - offsetof(UA_ServerDiagnosticsSummaryDataType, sessionTimeoutCount) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("CurrentSubscriptionCount") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_ServerDiagnosticsSummaryDataType, currentSubscriptionCount) - offsetof(UA_ServerDiagnosticsSummaryDataType, sessionAbortCount) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("CumulatedSubscriptionCount") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_ServerDiagnosticsSummaryDataType, cumulatedSubscriptionCount) - offsetof(UA_ServerDiagnosticsSummaryDataType, currentSubscriptionCount) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("PublishingIntervalCount") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_ServerDiagnosticsSummaryDataType, publishingIntervalCount) - offsetof(UA_ServerDiagnosticsSummaryDataType, cumulatedSubscriptionCount) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("SecurityRejectedRequestsCount") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_ServerDiagnosticsSummaryDataType, securityRejectedRequestsCount) - offsetof(UA_ServerDiagnosticsSummaryDataType, publishingIntervalCount) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("RejectedRequestsCount") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_ServerDiagnosticsSummaryDataType, rejectedRequestsCount) - offsetof(UA_ServerDiagnosticsSummaryDataType, securityRejectedRequestsCount) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* ServerStatusDataType */ | |
static UA_DataTypeMember ServerStatusDataType_members[6] = { | |
{ | |
UA_TYPENAME("StartTime") /* .memberName */ | |
UA_TYPES_DATETIME, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("CurrentTime") /* .memberName */ | |
UA_TYPES_DATETIME, /* .memberTypeIndex */ | |
offsetof(UA_ServerStatusDataType, currentTime) - offsetof(UA_ServerStatusDataType, startTime) - sizeof(UA_DateTime), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("State") /* .memberName */ | |
UA_TYPES_SERVERSTATE, /* .memberTypeIndex */ | |
offsetof(UA_ServerStatusDataType, state) - offsetof(UA_ServerStatusDataType, currentTime) - sizeof(UA_DateTime), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("BuildInfo") /* .memberName */ | |
UA_TYPES_BUILDINFO, /* .memberTypeIndex */ | |
offsetof(UA_ServerStatusDataType, buildInfo) - offsetof(UA_ServerStatusDataType, state) - sizeof(UA_ServerState), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("SecondsTillShutdown") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_ServerStatusDataType, secondsTillShutdown) - offsetof(UA_ServerStatusDataType, buildInfo) - sizeof(UA_BuildInfo), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ShutdownReason") /* .memberName */ | |
UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ | |
offsetof(UA_ServerStatusDataType, shutdownReason) - offsetof(UA_ServerStatusDataType, secondsTillShutdown) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* Range */ | |
static UA_DataTypeMember Range_members[2] = { | |
{ | |
UA_TYPENAME("Low") /* .memberName */ | |
UA_TYPES_DOUBLE, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("High") /* .memberName */ | |
UA_TYPES_DOUBLE, /* .memberTypeIndex */ | |
offsetof(UA_Range, high) - offsetof(UA_Range, low) - sizeof(UA_Double), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* EUInformation */ | |
static UA_DataTypeMember EUInformation_members[4] = { | |
{ | |
UA_TYPENAME("NamespaceUri") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("UnitId") /* .memberName */ | |
UA_TYPES_INT32, /* .memberTypeIndex */ | |
offsetof(UA_EUInformation, unitId) - offsetof(UA_EUInformation, namespaceUri) - sizeof(UA_String), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DisplayName") /* .memberName */ | |
UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ | |
offsetof(UA_EUInformation, displayName) - offsetof(UA_EUInformation, unitId) - sizeof(UA_Int32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Description") /* .memberName */ | |
UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ | |
offsetof(UA_EUInformation, description) - offsetof(UA_EUInformation, displayName) - sizeof(UA_LocalizedText), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* AxisScaleEnumeration */ | |
#define AxisScaleEnumeration_members NULL | |
/* ComplexNumberType */ | |
static UA_DataTypeMember ComplexNumberType_members[2] = { | |
{ | |
UA_TYPENAME("Real") /* .memberName */ | |
UA_TYPES_FLOAT, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Imaginary") /* .memberName */ | |
UA_TYPES_FLOAT, /* .memberTypeIndex */ | |
offsetof(UA_ComplexNumberType, imaginary) - offsetof(UA_ComplexNumberType, real) - sizeof(UA_Float), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* DoubleComplexNumberType */ | |
static UA_DataTypeMember DoubleComplexNumberType_members[2] = { | |
{ | |
UA_TYPENAME("Real") /* .memberName */ | |
UA_TYPES_DOUBLE, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Imaginary") /* .memberName */ | |
UA_TYPES_DOUBLE, /* .memberTypeIndex */ | |
offsetof(UA_DoubleComplexNumberType, imaginary) - offsetof(UA_DoubleComplexNumberType, real) - sizeof(UA_Double), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* AxisInformation */ | |
static UA_DataTypeMember AxisInformation_members[5] = { | |
{ | |
UA_TYPENAME("EngineeringUnits") /* .memberName */ | |
UA_TYPES_EUINFORMATION, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("EURange") /* .memberName */ | |
UA_TYPES_RANGE, /* .memberTypeIndex */ | |
offsetof(UA_AxisInformation, eURange) - offsetof(UA_AxisInformation, engineeringUnits) - sizeof(UA_EUInformation), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Title") /* .memberName */ | |
UA_TYPES_LOCALIZEDTEXT, /* .memberTypeIndex */ | |
offsetof(UA_AxisInformation, title) - offsetof(UA_AxisInformation, eURange) - sizeof(UA_Range), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("AxisScaleType") /* .memberName */ | |
UA_TYPES_AXISSCALEENUMERATION, /* .memberTypeIndex */ | |
offsetof(UA_AxisInformation, axisScaleType) - offsetof(UA_AxisInformation, title) - sizeof(UA_LocalizedText), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("AxisSteps") /* .memberName */ | |
UA_TYPES_DOUBLE, /* .memberTypeIndex */ | |
offsetof(UA_AxisInformation, axisStepsSize) - offsetof(UA_AxisInformation, axisScaleType) - sizeof(UA_AxisScaleEnumeration), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* XVType */ | |
static UA_DataTypeMember XVType_members[2] = { | |
{ | |
UA_TYPENAME("X") /* .memberName */ | |
UA_TYPES_DOUBLE, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Value") /* .memberName */ | |
UA_TYPES_FLOAT, /* .memberTypeIndex */ | |
offsetof(UA_XVType, value) - offsetof(UA_XVType, x) - sizeof(UA_Double), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* EnumDefinition */ | |
static UA_DataTypeMember EnumDefinition_members[1] = { | |
{ | |
UA_TYPENAME("Fields") /* .memberName */ | |
UA_TYPES_ENUMFIELD, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* DataChangeNotification */ | |
static UA_DataTypeMember DataChangeNotification_members[2] = { | |
{ | |
UA_TYPENAME("MonitoredItems") /* .memberName */ | |
UA_TYPES_MONITOREDITEMNOTIFICATION, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("DiagnosticInfos") /* .memberName */ | |
UA_TYPES_DIAGNOSTICINFO, /* .memberTypeIndex */ | |
offsetof(UA_DataChangeNotification, diagnosticInfosSize) - offsetof(UA_DataChangeNotification, monitoredItems) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
/* EventNotificationList */ | |
static UA_DataTypeMember EventNotificationList_members[1] = { | |
{ | |
UA_TYPENAME("Events") /* .memberName */ | |
UA_TYPES_EVENTFIELDLIST, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
},}; | |
const UA_DataType UA_TYPES[UA_TYPES_COUNT] = { | |
/* Boolean */ | |
{ | |
UA_TYPENAME("Boolean") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {1}}, /* .typeId */ | |
sizeof(UA_Boolean), /* .memSize */ | |
UA_TYPES_BOOLEAN, /* .typeIndex */ | |
UA_DATATYPEKIND_BOOLEAN, /* .typeKind */ | |
true, /* .pointerFree */ | |
true, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
Boolean_members /* .members */ | |
}, | |
/* SByte */ | |
{ | |
UA_TYPENAME("SByte") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {2}}, /* .typeId */ | |
sizeof(UA_SByte), /* .memSize */ | |
UA_TYPES_SBYTE, /* .typeIndex */ | |
UA_DATATYPEKIND_SBYTE, /* .typeKind */ | |
true, /* .pointerFree */ | |
true, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
SByte_members /* .members */ | |
}, | |
/* Byte */ | |
{ | |
UA_TYPENAME("Byte") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {3}}, /* .typeId */ | |
sizeof(UA_Byte), /* .memSize */ | |
UA_TYPES_BYTE, /* .typeIndex */ | |
UA_DATATYPEKIND_BYTE, /* .typeKind */ | |
true, /* .pointerFree */ | |
true, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
Byte_members /* .members */ | |
}, | |
/* Int16 */ | |
{ | |
UA_TYPENAME("Int16") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {4}}, /* .typeId */ | |
sizeof(UA_Int16), /* .memSize */ | |
UA_TYPES_INT16, /* .typeIndex */ | |
UA_DATATYPEKIND_INT16, /* .typeKind */ | |
true, /* .pointerFree */ | |
UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
Int16_members /* .members */ | |
}, | |
/* UInt16 */ | |
{ | |
UA_TYPENAME("UInt16") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {5}}, /* .typeId */ | |
sizeof(UA_UInt16), /* .memSize */ | |
UA_TYPES_UINT16, /* .typeIndex */ | |
UA_DATATYPEKIND_UINT16, /* .typeKind */ | |
true, /* .pointerFree */ | |
UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
UInt16_members /* .members */ | |
}, | |
/* Int32 */ | |
{ | |
UA_TYPENAME("Int32") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {6}}, /* .typeId */ | |
sizeof(UA_Int32), /* .memSize */ | |
UA_TYPES_INT32, /* .typeIndex */ | |
UA_DATATYPEKIND_INT32, /* .typeKind */ | |
true, /* .pointerFree */ | |
UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
Int32_members /* .members */ | |
}, | |
/* UInt32 */ | |
{ | |
UA_TYPENAME("UInt32") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {7}}, /* .typeId */ | |
sizeof(UA_UInt32), /* .memSize */ | |
UA_TYPES_UINT32, /* .typeIndex */ | |
UA_DATATYPEKIND_UINT32, /* .typeKind */ | |
true, /* .pointerFree */ | |
UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
UInt32_members /* .members */ | |
}, | |
/* Int64 */ | |
{ | |
UA_TYPENAME("Int64") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {8}}, /* .typeId */ | |
sizeof(UA_Int64), /* .memSize */ | |
UA_TYPES_INT64, /* .typeIndex */ | |
UA_DATATYPEKIND_INT64, /* .typeKind */ | |
true, /* .pointerFree */ | |
UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
Int64_members /* .members */ | |
}, | |
/* UInt64 */ | |
{ | |
UA_TYPENAME("UInt64") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {9}}, /* .typeId */ | |
sizeof(UA_UInt64), /* .memSize */ | |
UA_TYPES_UINT64, /* .typeIndex */ | |
UA_DATATYPEKIND_UINT64, /* .typeKind */ | |
true, /* .pointerFree */ | |
UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
UInt64_members /* .members */ | |
}, | |
/* Float */ | |
{ | |
UA_TYPENAME("Float") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {10}}, /* .typeId */ | |
sizeof(UA_Float), /* .memSize */ | |
UA_TYPES_FLOAT, /* .typeIndex */ | |
UA_DATATYPEKIND_FLOAT, /* .typeKind */ | |
true, /* .pointerFree */ | |
UA_BINARY_OVERLAYABLE_FLOAT, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
Float_members /* .members */ | |
}, | |
/* Double */ | |
{ | |
UA_TYPENAME("Double") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {11}}, /* .typeId */ | |
sizeof(UA_Double), /* .memSize */ | |
UA_TYPES_DOUBLE, /* .typeIndex */ | |
UA_DATATYPEKIND_DOUBLE, /* .typeKind */ | |
true, /* .pointerFree */ | |
UA_BINARY_OVERLAYABLE_FLOAT, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
Double_members /* .members */ | |
}, | |
/* String */ | |
{ | |
UA_TYPENAME("String") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {12}}, /* .typeId */ | |
sizeof(UA_String), /* .memSize */ | |
UA_TYPES_STRING, /* .typeIndex */ | |
UA_DATATYPEKIND_STRING, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
String_members /* .members */ | |
}, | |
/* DateTime */ | |
{ | |
UA_TYPENAME("DateTime") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {13}}, /* .typeId */ | |
sizeof(UA_DateTime), /* .memSize */ | |
UA_TYPES_DATETIME, /* .typeIndex */ | |
UA_DATATYPEKIND_DATETIME, /* .typeKind */ | |
true, /* .pointerFree */ | |
UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
DateTime_members /* .members */ | |
}, | |
/* Guid */ | |
{ | |
UA_TYPENAME("Guid") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {14}}, /* .typeId */ | |
sizeof(UA_Guid), /* .memSize */ | |
UA_TYPES_GUID, /* .typeIndex */ | |
UA_DATATYPEKIND_GUID, /* .typeKind */ | |
true, /* .pointerFree */ | |
(UA_BINARY_OVERLAYABLE_INTEGER && offsetof(UA_Guid, data2) == sizeof(UA_UInt32) && offsetof(UA_Guid, data3) == (sizeof(UA_UInt16) + sizeof(UA_UInt32)) && offsetof(UA_Guid, data4) == (2*sizeof(UA_UInt32))), /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
Guid_members /* .members */ | |
}, | |
/* ByteString */ | |
{ | |
UA_TYPENAME("ByteString") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {15}}, /* .typeId */ | |
sizeof(UA_ByteString), /* .memSize */ | |
UA_TYPES_BYTESTRING, /* .typeIndex */ | |
UA_DATATYPEKIND_BYTESTRING, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
ByteString_members /* .members */ | |
}, | |
/* XmlElement */ | |
{ | |
UA_TYPENAME("XmlElement") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {16}}, /* .typeId */ | |
sizeof(UA_XmlElement), /* .memSize */ | |
UA_TYPES_XMLELEMENT, /* .typeIndex */ | |
UA_DATATYPEKIND_XMLELEMENT, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
XmlElement_members /* .members */ | |
}, | |
/* NodeId */ | |
{ | |
UA_TYPENAME("NodeId") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {17}}, /* .typeId */ | |
sizeof(UA_NodeId), /* .memSize */ | |
UA_TYPES_NODEID, /* .typeIndex */ | |
UA_DATATYPEKIND_NODEID, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
NodeId_members /* .members */ | |
}, | |
/* ExpandedNodeId */ | |
{ | |
UA_TYPENAME("ExpandedNodeId") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {18}}, /* .typeId */ | |
sizeof(UA_ExpandedNodeId), /* .memSize */ | |
UA_TYPES_EXPANDEDNODEID, /* .typeIndex */ | |
UA_DATATYPEKIND_EXPANDEDNODEID, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
ExpandedNodeId_members /* .members */ | |
}, | |
/* StatusCode */ | |
{ | |
UA_TYPENAME("StatusCode") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {19}}, /* .typeId */ | |
sizeof(UA_StatusCode), /* .memSize */ | |
UA_TYPES_STATUSCODE, /* .typeIndex */ | |
UA_DATATYPEKIND_STATUSCODE, /* .typeKind */ | |
true, /* .pointerFree */ | |
UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
StatusCode_members /* .members */ | |
}, | |
/* QualifiedName */ | |
{ | |
UA_TYPENAME("QualifiedName") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {20}}, /* .typeId */ | |
sizeof(UA_QualifiedName), /* .memSize */ | |
UA_TYPES_QUALIFIEDNAME, /* .typeIndex */ | |
UA_DATATYPEKIND_QUALIFIEDNAME, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
QualifiedName_members /* .members */ | |
}, | |
/* LocalizedText */ | |
{ | |
UA_TYPENAME("LocalizedText") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {21}}, /* .typeId */ | |
sizeof(UA_LocalizedText), /* .memSize */ | |
UA_TYPES_LOCALIZEDTEXT, /* .typeIndex */ | |
UA_DATATYPEKIND_LOCALIZEDTEXT, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
LocalizedText_members /* .members */ | |
}, | |
/* ExtensionObject */ | |
{ | |
UA_TYPENAME("ExtensionObject") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {22}}, /* .typeId */ | |
sizeof(UA_ExtensionObject), /* .memSize */ | |
UA_TYPES_EXTENSIONOBJECT, /* .typeIndex */ | |
UA_DATATYPEKIND_EXTENSIONOBJECT, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
ExtensionObject_members /* .members */ | |
}, | |
/* DataValue */ | |
{ | |
UA_TYPENAME("DataValue") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {23}}, /* .typeId */ | |
sizeof(UA_DataValue), /* .memSize */ | |
UA_TYPES_DATAVALUE, /* .typeIndex */ | |
UA_DATATYPEKIND_DATAVALUE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
DataValue_members /* .members */ | |
}, | |
/* Variant */ | |
{ | |
UA_TYPENAME("Variant") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {24}}, /* .typeId */ | |
sizeof(UA_Variant), /* .memSize */ | |
UA_TYPES_VARIANT, /* .typeIndex */ | |
UA_DATATYPEKIND_VARIANT, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
Variant_members /* .members */ | |
}, | |
/* DiagnosticInfo */ | |
{ | |
UA_TYPENAME("DiagnosticInfo") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {25}}, /* .typeId */ | |
sizeof(UA_DiagnosticInfo), /* .memSize */ | |
UA_TYPES_DIAGNOSTICINFO, /* .typeIndex */ | |
UA_DATATYPEKIND_DIAGNOSTICINFO, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
DiagnosticInfo_members /* .members */ | |
}, | |
/* NodeClass */ | |
{ | |
UA_TYPENAME("NodeClass") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {257}}, /* .typeId */ | |
sizeof(UA_NodeClass), /* .memSize */ | |
UA_TYPES_INT32, /* .typeIndex */ | |
UA_DATATYPEKIND_ENUM, /* .typeKind */ | |
true, /* .pointerFree */ | |
UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
NodeClass_members /* .members */ | |
}, | |
/* StructureType */ | |
{ | |
UA_TYPENAME("StructureType") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {98}}, /* .typeId */ | |
sizeof(UA_StructureType), /* .memSize */ | |
UA_TYPES_INT32, /* .typeIndex */ | |
UA_DATATYPEKIND_ENUM, /* .typeKind */ | |
true, /* .pointerFree */ | |
UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
StructureType_members /* .members */ | |
}, | |
/* StructureField */ | |
{ | |
UA_TYPENAME("StructureField") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {101}}, /* .typeId */ | |
sizeof(UA_StructureField), /* .memSize */ | |
UA_TYPES_STRUCTUREFIELD, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
7, /* .membersSize */ | |
14844, /* .binaryEncodingId */ | |
StructureField_members /* .members */ | |
}, | |
/* StructureDefinition */ | |
{ | |
UA_TYPENAME("StructureDefinition") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {99}}, /* .typeId */ | |
sizeof(UA_StructureDefinition), /* .memSize */ | |
UA_TYPES_STRUCTUREDEFINITION, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
4, /* .membersSize */ | |
122, /* .binaryEncodingId */ | |
StructureDefinition_members /* .members */ | |
}, | |
/* Argument */ | |
{ | |
UA_TYPENAME("Argument") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {296}}, /* .typeId */ | |
sizeof(UA_Argument), /* .memSize */ | |
UA_TYPES_ARGUMENT, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
5, /* .membersSize */ | |
298, /* .binaryEncodingId */ | |
Argument_members /* .members */ | |
}, | |
/* EnumValueType */ | |
{ | |
UA_TYPENAME("EnumValueType") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {7594}}, /* .typeId */ | |
sizeof(UA_EnumValueType), /* .memSize */ | |
UA_TYPES_ENUMVALUETYPE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
3, /* .membersSize */ | |
8251, /* .binaryEncodingId */ | |
EnumValueType_members /* .members */ | |
}, | |
/* EnumField */ | |
{ | |
UA_TYPENAME("EnumField") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {102}}, /* .typeId */ | |
sizeof(UA_EnumField), /* .memSize */ | |
UA_TYPES_ENUMFIELD, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
4, /* .membersSize */ | |
14845, /* .binaryEncodingId */ | |
EnumField_members /* .members */ | |
}, | |
/* Duration */ | |
{ | |
UA_TYPENAME("Duration") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {290}}, /* .typeId */ | |
sizeof(UA_Duration), /* .memSize */ | |
UA_TYPES_DURATION, /* .typeIndex */ | |
UA_DATATYPEKIND_DOUBLE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
Duration_members /* .members */ | |
}, | |
/* UtcTime */ | |
{ | |
UA_TYPENAME("UtcTime") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {294}}, /* .typeId */ | |
sizeof(UA_UtcTime), /* .memSize */ | |
UA_TYPES_UTCTIME, /* .typeIndex */ | |
UA_DATATYPEKIND_DATETIME, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
UtcTime_members /* .members */ | |
}, | |
/* LocaleId */ | |
{ | |
UA_TYPENAME("LocaleId") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {295}}, /* .typeId */ | |
sizeof(UA_LocaleId), /* .memSize */ | |
UA_TYPES_LOCALEID, /* .typeIndex */ | |
UA_DATATYPEKIND_STRING, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
LocaleId_members /* .members */ | |
}, | |
/* ApplicationType */ | |
{ | |
UA_TYPENAME("ApplicationType") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {307}}, /* .typeId */ | |
sizeof(UA_ApplicationType), /* .memSize */ | |
UA_TYPES_INT32, /* .typeIndex */ | |
UA_DATATYPEKIND_ENUM, /* .typeKind */ | |
true, /* .pointerFree */ | |
UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
ApplicationType_members /* .members */ | |
}, | |
/* ApplicationDescription */ | |
{ | |
UA_TYPENAME("ApplicationDescription") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {308}}, /* .typeId */ | |
sizeof(UA_ApplicationDescription), /* .memSize */ | |
UA_TYPES_APPLICATIONDESCRIPTION, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
7, /* .membersSize */ | |
310, /* .binaryEncodingId */ | |
ApplicationDescription_members /* .members */ | |
}, | |
/* RequestHeader */ | |
{ | |
UA_TYPENAME("RequestHeader") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {389}}, /* .typeId */ | |
sizeof(UA_RequestHeader), /* .memSize */ | |
UA_TYPES_REQUESTHEADER, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
7, /* .membersSize */ | |
391, /* .binaryEncodingId */ | |
RequestHeader_members /* .members */ | |
}, | |
/* ResponseHeader */ | |
{ | |
UA_TYPENAME("ResponseHeader") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {392}}, /* .typeId */ | |
sizeof(UA_ResponseHeader), /* .memSize */ | |
UA_TYPES_RESPONSEHEADER, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
6, /* .membersSize */ | |
394, /* .binaryEncodingId */ | |
ResponseHeader_members /* .members */ | |
}, | |
/* ServiceFault */ | |
{ | |
UA_TYPENAME("ServiceFault") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {395}}, /* .typeId */ | |
sizeof(UA_ServiceFault), /* .memSize */ | |
UA_TYPES_SERVICEFAULT, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
1, /* .membersSize */ | |
397, /* .binaryEncodingId */ | |
ServiceFault_members /* .members */ | |
}, | |
/* FindServersRequest */ | |
{ | |
UA_TYPENAME("FindServersRequest") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {420}}, /* .typeId */ | |
sizeof(UA_FindServersRequest), /* .memSize */ | |
UA_TYPES_FINDSERVERSREQUEST, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
4, /* .membersSize */ | |
422, /* .binaryEncodingId */ | |
FindServersRequest_members /* .members */ | |
}, | |
/* FindServersResponse */ | |
{ | |
UA_TYPENAME("FindServersResponse") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {423}}, /* .typeId */ | |
sizeof(UA_FindServersResponse), /* .memSize */ | |
UA_TYPES_FINDSERVERSRESPONSE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
425, /* .binaryEncodingId */ | |
FindServersResponse_members /* .members */ | |
}, | |
/* ServerOnNetwork */ | |
{ | |
UA_TYPENAME("ServerOnNetwork") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {12189}}, /* .typeId */ | |
sizeof(UA_ServerOnNetwork), /* .memSize */ | |
UA_TYPES_SERVERONNETWORK, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
4, /* .membersSize */ | |
12207, /* .binaryEncodingId */ | |
ServerOnNetwork_members /* .members */ | |
}, | |
/* FindServersOnNetworkRequest */ | |
{ | |
UA_TYPENAME("FindServersOnNetworkRequest") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {12190}}, /* .typeId */ | |
sizeof(UA_FindServersOnNetworkRequest), /* .memSize */ | |
UA_TYPES_FINDSERVERSONNETWORKREQUEST, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
4, /* .membersSize */ | |
12208, /* .binaryEncodingId */ | |
FindServersOnNetworkRequest_members /* .members */ | |
}, | |
/* FindServersOnNetworkResponse */ | |
{ | |
UA_TYPENAME("FindServersOnNetworkResponse") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {12191}}, /* .typeId */ | |
sizeof(UA_FindServersOnNetworkResponse), /* .memSize */ | |
UA_TYPES_FINDSERVERSONNETWORKRESPONSE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
3, /* .membersSize */ | |
12209, /* .binaryEncodingId */ | |
FindServersOnNetworkResponse_members /* .members */ | |
}, | |
/* MessageSecurityMode */ | |
{ | |
UA_TYPENAME("MessageSecurityMode") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {302}}, /* .typeId */ | |
sizeof(UA_MessageSecurityMode), /* .memSize */ | |
UA_TYPES_INT32, /* .typeIndex */ | |
UA_DATATYPEKIND_ENUM, /* .typeKind */ | |
true, /* .pointerFree */ | |
UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
MessageSecurityMode_members /* .members */ | |
}, | |
/* UserTokenType */ | |
{ | |
UA_TYPENAME("UserTokenType") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {303}}, /* .typeId */ | |
sizeof(UA_UserTokenType), /* .memSize */ | |
UA_TYPES_INT32, /* .typeIndex */ | |
UA_DATATYPEKIND_ENUM, /* .typeKind */ | |
true, /* .pointerFree */ | |
UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
UserTokenType_members /* .members */ | |
}, | |
/* UserTokenPolicy */ | |
{ | |
UA_TYPENAME("UserTokenPolicy") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {304}}, /* .typeId */ | |
sizeof(UA_UserTokenPolicy), /* .memSize */ | |
UA_TYPES_USERTOKENPOLICY, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
5, /* .membersSize */ | |
306, /* .binaryEncodingId */ | |
UserTokenPolicy_members /* .members */ | |
}, | |
/* EndpointDescription */ | |
{ | |
UA_TYPENAME("EndpointDescription") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {312}}, /* .typeId */ | |
sizeof(UA_EndpointDescription), /* .memSize */ | |
UA_TYPES_ENDPOINTDESCRIPTION, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
8, /* .membersSize */ | |
314, /* .binaryEncodingId */ | |
EndpointDescription_members /* .members */ | |
}, | |
/* GetEndpointsRequest */ | |
{ | |
UA_TYPENAME("GetEndpointsRequest") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {426}}, /* .typeId */ | |
sizeof(UA_GetEndpointsRequest), /* .memSize */ | |
UA_TYPES_GETENDPOINTSREQUEST, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
4, /* .membersSize */ | |
428, /* .binaryEncodingId */ | |
GetEndpointsRequest_members /* .members */ | |
}, | |
/* GetEndpointsResponse */ | |
{ | |
UA_TYPENAME("GetEndpointsResponse") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {429}}, /* .typeId */ | |
sizeof(UA_GetEndpointsResponse), /* .memSize */ | |
UA_TYPES_GETENDPOINTSRESPONSE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
431, /* .binaryEncodingId */ | |
GetEndpointsResponse_members /* .members */ | |
}, | |
/* RegisteredServer */ | |
{ | |
UA_TYPENAME("RegisteredServer") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {432}}, /* .typeId */ | |
sizeof(UA_RegisteredServer), /* .memSize */ | |
UA_TYPES_REGISTEREDSERVER, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
8, /* .membersSize */ | |
434, /* .binaryEncodingId */ | |
RegisteredServer_members /* .members */ | |
}, | |
/* RegisterServerRequest */ | |
{ | |
UA_TYPENAME("RegisterServerRequest") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {435}}, /* .typeId */ | |
sizeof(UA_RegisterServerRequest), /* .memSize */ | |
UA_TYPES_REGISTERSERVERREQUEST, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
437, /* .binaryEncodingId */ | |
RegisterServerRequest_members /* .members */ | |
}, | |
/* RegisterServerResponse */ | |
{ | |
UA_TYPENAME("RegisterServerResponse") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {438}}, /* .typeId */ | |
sizeof(UA_RegisterServerResponse), /* .memSize */ | |
UA_TYPES_REGISTERSERVERRESPONSE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
1, /* .membersSize */ | |
440, /* .binaryEncodingId */ | |
RegisterServerResponse_members /* .members */ | |
}, | |
/* DiscoveryConfiguration */ | |
{ | |
UA_TYPENAME("DiscoveryConfiguration") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {12890}}, /* .typeId */ | |
sizeof(UA_DiscoveryConfiguration), /* .memSize */ | |
UA_TYPES_DISCOVERYCONFIGURATION, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
true, /* .pointerFree */ | |
false, /* .overlayable */ | |
0, /* .membersSize */ | |
12900, /* .binaryEncodingId */ | |
DiscoveryConfiguration_members /* .members */ | |
}, | |
/* MdnsDiscoveryConfiguration */ | |
{ | |
UA_TYPENAME("MdnsDiscoveryConfiguration") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {12891}}, /* .typeId */ | |
sizeof(UA_MdnsDiscoveryConfiguration), /* .memSize */ | |
UA_TYPES_MDNSDISCOVERYCONFIGURATION, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
12901, /* .binaryEncodingId */ | |
MdnsDiscoveryConfiguration_members /* .members */ | |
}, | |
/* RegisterServer2Request */ | |
{ | |
UA_TYPENAME("RegisterServer2Request") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {12193}}, /* .typeId */ | |
sizeof(UA_RegisterServer2Request), /* .memSize */ | |
UA_TYPES_REGISTERSERVER2REQUEST, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
3, /* .membersSize */ | |
12211, /* .binaryEncodingId */ | |
RegisterServer2Request_members /* .members */ | |
}, | |
/* RegisterServer2Response */ | |
{ | |
UA_TYPENAME("RegisterServer2Response") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {12194}}, /* .typeId */ | |
sizeof(UA_RegisterServer2Response), /* .memSize */ | |
UA_TYPES_REGISTERSERVER2RESPONSE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
3, /* .membersSize */ | |
12212, /* .binaryEncodingId */ | |
RegisterServer2Response_members /* .members */ | |
}, | |
/* SecurityTokenRequestType */ | |
{ | |
UA_TYPENAME("SecurityTokenRequestType") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {315}}, /* .typeId */ | |
sizeof(UA_SecurityTokenRequestType), /* .memSize */ | |
UA_TYPES_INT32, /* .typeIndex */ | |
UA_DATATYPEKIND_ENUM, /* .typeKind */ | |
true, /* .pointerFree */ | |
UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
SecurityTokenRequestType_members /* .members */ | |
}, | |
/* ChannelSecurityToken */ | |
{ | |
UA_TYPENAME("ChannelSecurityToken") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {441}}, /* .typeId */ | |
sizeof(UA_ChannelSecurityToken), /* .memSize */ | |
UA_TYPES_CHANNELSECURITYTOKEN, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
true, /* .pointerFree */ | |
false, /* .overlayable */ | |
4, /* .membersSize */ | |
443, /* .binaryEncodingId */ | |
ChannelSecurityToken_members /* .members */ | |
}, | |
/* OpenSecureChannelRequest */ | |
{ | |
UA_TYPENAME("OpenSecureChannelRequest") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {444}}, /* .typeId */ | |
sizeof(UA_OpenSecureChannelRequest), /* .memSize */ | |
UA_TYPES_OPENSECURECHANNELREQUEST, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
6, /* .membersSize */ | |
446, /* .binaryEncodingId */ | |
OpenSecureChannelRequest_members /* .members */ | |
}, | |
/* OpenSecureChannelResponse */ | |
{ | |
UA_TYPENAME("OpenSecureChannelResponse") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {447}}, /* .typeId */ | |
sizeof(UA_OpenSecureChannelResponse), /* .memSize */ | |
UA_TYPES_OPENSECURECHANNELRESPONSE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
4, /* .membersSize */ | |
449, /* .binaryEncodingId */ | |
OpenSecureChannelResponse_members /* .members */ | |
}, | |
/* CloseSecureChannelRequest */ | |
{ | |
UA_TYPENAME("CloseSecureChannelRequest") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {450}}, /* .typeId */ | |
sizeof(UA_CloseSecureChannelRequest), /* .memSize */ | |
UA_TYPES_CLOSESECURECHANNELREQUEST, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
1, /* .membersSize */ | |
452, /* .binaryEncodingId */ | |
CloseSecureChannelRequest_members /* .members */ | |
}, | |
/* CloseSecureChannelResponse */ | |
{ | |
UA_TYPENAME("CloseSecureChannelResponse") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {453}}, /* .typeId */ | |
sizeof(UA_CloseSecureChannelResponse), /* .memSize */ | |
UA_TYPES_CLOSESECURECHANNELRESPONSE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
1, /* .membersSize */ | |
455, /* .binaryEncodingId */ | |
CloseSecureChannelResponse_members /* .members */ | |
}, | |
/* SignedSoftwareCertificate */ | |
{ | |
UA_TYPENAME("SignedSoftwareCertificate") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {344}}, /* .typeId */ | |
sizeof(UA_SignedSoftwareCertificate), /* .memSize */ | |
UA_TYPES_SIGNEDSOFTWARECERTIFICATE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
346, /* .binaryEncodingId */ | |
SignedSoftwareCertificate_members /* .members */ | |
}, | |
/* SignatureData */ | |
{ | |
UA_TYPENAME("SignatureData") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {456}}, /* .typeId */ | |
sizeof(UA_SignatureData), /* .memSize */ | |
UA_TYPES_SIGNATUREDATA, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
458, /* .binaryEncodingId */ | |
SignatureData_members /* .members */ | |
}, | |
/* CreateSessionRequest */ | |
{ | |
UA_TYPENAME("CreateSessionRequest") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {459}}, /* .typeId */ | |
sizeof(UA_CreateSessionRequest), /* .memSize */ | |
UA_TYPES_CREATESESSIONREQUEST, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
9, /* .membersSize */ | |
461, /* .binaryEncodingId */ | |
CreateSessionRequest_members /* .members */ | |
}, | |
/* CreateSessionResponse */ | |
{ | |
UA_TYPENAME("CreateSessionResponse") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {462}}, /* .typeId */ | |
sizeof(UA_CreateSessionResponse), /* .memSize */ | |
UA_TYPES_CREATESESSIONRESPONSE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
10, /* .membersSize */ | |
464, /* .binaryEncodingId */ | |
CreateSessionResponse_members /* .members */ | |
}, | |
/* UserIdentityToken */ | |
{ | |
UA_TYPENAME("UserIdentityToken") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {316}}, /* .typeId */ | |
sizeof(UA_UserIdentityToken), /* .memSize */ | |
UA_TYPES_USERIDENTITYTOKEN, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
1, /* .membersSize */ | |
318, /* .binaryEncodingId */ | |
UserIdentityToken_members /* .members */ | |
}, | |
/* AnonymousIdentityToken */ | |
{ | |
UA_TYPENAME("AnonymousIdentityToken") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {319}}, /* .typeId */ | |
sizeof(UA_AnonymousIdentityToken), /* .memSize */ | |
UA_TYPES_ANONYMOUSIDENTITYTOKEN, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
1, /* .membersSize */ | |
321, /* .binaryEncodingId */ | |
AnonymousIdentityToken_members /* .members */ | |
}, | |
/* UserNameIdentityToken */ | |
{ | |
UA_TYPENAME("UserNameIdentityToken") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {322}}, /* .typeId */ | |
sizeof(UA_UserNameIdentityToken), /* .memSize */ | |
UA_TYPES_USERNAMEIDENTITYTOKEN, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
4, /* .membersSize */ | |
324, /* .binaryEncodingId */ | |
UserNameIdentityToken_members /* .members */ | |
}, | |
/* X509IdentityToken */ | |
{ | |
UA_TYPENAME("X509IdentityToken") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {325}}, /* .typeId */ | |
sizeof(UA_X509IdentityToken), /* .memSize */ | |
UA_TYPES_X509IDENTITYTOKEN, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
327, /* .binaryEncodingId */ | |
X509IdentityToken_members /* .members */ | |
}, | |
/* IssuedIdentityToken */ | |
{ | |
UA_TYPENAME("IssuedIdentityToken") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {938}}, /* .typeId */ | |
sizeof(UA_IssuedIdentityToken), /* .memSize */ | |
UA_TYPES_ISSUEDIDENTITYTOKEN, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
3, /* .membersSize */ | |
940, /* .binaryEncodingId */ | |
IssuedIdentityToken_members /* .members */ | |
}, | |
/* ActivateSessionRequest */ | |
{ | |
UA_TYPENAME("ActivateSessionRequest") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {465}}, /* .typeId */ | |
sizeof(UA_ActivateSessionRequest), /* .memSize */ | |
UA_TYPES_ACTIVATESESSIONREQUEST, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
6, /* .membersSize */ | |
467, /* .binaryEncodingId */ | |
ActivateSessionRequest_members /* .members */ | |
}, | |
/* ActivateSessionResponse */ | |
{ | |
UA_TYPENAME("ActivateSessionResponse") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {468}}, /* .typeId */ | |
sizeof(UA_ActivateSessionResponse), /* .memSize */ | |
UA_TYPES_ACTIVATESESSIONRESPONSE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
4, /* .membersSize */ | |
470, /* .binaryEncodingId */ | |
ActivateSessionResponse_members /* .members */ | |
}, | |
/* CloseSessionRequest */ | |
{ | |
UA_TYPENAME("CloseSessionRequest") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {471}}, /* .typeId */ | |
sizeof(UA_CloseSessionRequest), /* .memSize */ | |
UA_TYPES_CLOSESESSIONREQUEST, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
473, /* .binaryEncodingId */ | |
CloseSessionRequest_members /* .members */ | |
}, | |
/* CloseSessionResponse */ | |
{ | |
UA_TYPENAME("CloseSessionResponse") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {474}}, /* .typeId */ | |
sizeof(UA_CloseSessionResponse), /* .memSize */ | |
UA_TYPES_CLOSESESSIONRESPONSE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
1, /* .membersSize */ | |
476, /* .binaryEncodingId */ | |
CloseSessionResponse_members /* .members */ | |
}, | |
/* NodeAttributesMask */ | |
{ | |
UA_TYPENAME("NodeAttributesMask") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {348}}, /* .typeId */ | |
sizeof(UA_NodeAttributesMask), /* .memSize */ | |
UA_TYPES_INT32, /* .typeIndex */ | |
UA_DATATYPEKIND_ENUM, /* .typeKind */ | |
true, /* .pointerFree */ | |
UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
NodeAttributesMask_members /* .members */ | |
}, | |
/* NodeAttributes */ | |
{ | |
UA_TYPENAME("NodeAttributes") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {349}}, /* .typeId */ | |
sizeof(UA_NodeAttributes), /* .memSize */ | |
UA_TYPES_NODEATTRIBUTES, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
5, /* .membersSize */ | |
351, /* .binaryEncodingId */ | |
NodeAttributes_members /* .members */ | |
}, | |
/* ObjectAttributes */ | |
{ | |
UA_TYPENAME("ObjectAttributes") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {352}}, /* .typeId */ | |
sizeof(UA_ObjectAttributes), /* .memSize */ | |
UA_TYPES_OBJECTATTRIBUTES, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
6, /* .membersSize */ | |
354, /* .binaryEncodingId */ | |
ObjectAttributes_members /* .members */ | |
}, | |
/* VariableAttributes */ | |
{ | |
UA_TYPENAME("VariableAttributes") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {355}}, /* .typeId */ | |
sizeof(UA_VariableAttributes), /* .memSize */ | |
UA_TYPES_VARIABLEATTRIBUTES, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
13, /* .membersSize */ | |
357, /* .binaryEncodingId */ | |
VariableAttributes_members /* .members */ | |
}, | |
/* MethodAttributes */ | |
{ | |
UA_TYPENAME("MethodAttributes") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {358}}, /* .typeId */ | |
sizeof(UA_MethodAttributes), /* .memSize */ | |
UA_TYPES_METHODATTRIBUTES, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
7, /* .membersSize */ | |
360, /* .binaryEncodingId */ | |
MethodAttributes_members /* .members */ | |
}, | |
/* ObjectTypeAttributes */ | |
{ | |
UA_TYPENAME("ObjectTypeAttributes") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {361}}, /* .typeId */ | |
sizeof(UA_ObjectTypeAttributes), /* .memSize */ | |
UA_TYPES_OBJECTTYPEATTRIBUTES, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
6, /* .membersSize */ | |
363, /* .binaryEncodingId */ | |
ObjectTypeAttributes_members /* .members */ | |
}, | |
/* VariableTypeAttributes */ | |
{ | |
UA_TYPENAME("VariableTypeAttributes") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {364}}, /* .typeId */ | |
sizeof(UA_VariableTypeAttributes), /* .memSize */ | |
UA_TYPES_VARIABLETYPEATTRIBUTES, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
10, /* .membersSize */ | |
366, /* .binaryEncodingId */ | |
VariableTypeAttributes_members /* .members */ | |
}, | |
/* ReferenceTypeAttributes */ | |
{ | |
UA_TYPENAME("ReferenceTypeAttributes") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {367}}, /* .typeId */ | |
sizeof(UA_ReferenceTypeAttributes), /* .memSize */ | |
UA_TYPES_REFERENCETYPEATTRIBUTES, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
8, /* .membersSize */ | |
369, /* .binaryEncodingId */ | |
ReferenceTypeAttributes_members /* .members */ | |
}, | |
/* DataTypeAttributes */ | |
{ | |
UA_TYPENAME("DataTypeAttributes") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {370}}, /* .typeId */ | |
sizeof(UA_DataTypeAttributes), /* .memSize */ | |
UA_TYPES_DATATYPEATTRIBUTES, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
6, /* .membersSize */ | |
372, /* .binaryEncodingId */ | |
DataTypeAttributes_members /* .members */ | |
}, | |
/* ViewAttributes */ | |
{ | |
UA_TYPENAME("ViewAttributes") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {373}}, /* .typeId */ | |
sizeof(UA_ViewAttributes), /* .memSize */ | |
UA_TYPES_VIEWATTRIBUTES, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
7, /* .membersSize */ | |
375, /* .binaryEncodingId */ | |
ViewAttributes_members /* .members */ | |
}, | |
/* AddNodesItem */ | |
{ | |
UA_TYPENAME("AddNodesItem") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {376}}, /* .typeId */ | |
sizeof(UA_AddNodesItem), /* .memSize */ | |
UA_TYPES_ADDNODESITEM, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
7, /* .membersSize */ | |
378, /* .binaryEncodingId */ | |
AddNodesItem_members /* .members */ | |
}, | |
/* AddNodesResult */ | |
{ | |
UA_TYPENAME("AddNodesResult") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {483}}, /* .typeId */ | |
sizeof(UA_AddNodesResult), /* .memSize */ | |
UA_TYPES_ADDNODESRESULT, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
485, /* .binaryEncodingId */ | |
AddNodesResult_members /* .members */ | |
}, | |
/* AddNodesRequest */ | |
{ | |
UA_TYPENAME("AddNodesRequest") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {486}}, /* .typeId */ | |
sizeof(UA_AddNodesRequest), /* .memSize */ | |
UA_TYPES_ADDNODESREQUEST, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
488, /* .binaryEncodingId */ | |
AddNodesRequest_members /* .members */ | |
}, | |
/* AddNodesResponse */ | |
{ | |
UA_TYPENAME("AddNodesResponse") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {489}}, /* .typeId */ | |
sizeof(UA_AddNodesResponse), /* .memSize */ | |
UA_TYPES_ADDNODESRESPONSE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
3, /* .membersSize */ | |
491, /* .binaryEncodingId */ | |
AddNodesResponse_members /* .members */ | |
}, | |
/* AddReferencesItem */ | |
{ | |
UA_TYPENAME("AddReferencesItem") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {379}}, /* .typeId */ | |
sizeof(UA_AddReferencesItem), /* .memSize */ | |
UA_TYPES_ADDREFERENCESITEM, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
6, /* .membersSize */ | |
381, /* .binaryEncodingId */ | |
AddReferencesItem_members /* .members */ | |
}, | |
/* AddReferencesRequest */ | |
{ | |
UA_TYPENAME("AddReferencesRequest") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {492}}, /* .typeId */ | |
sizeof(UA_AddReferencesRequest), /* .memSize */ | |
UA_TYPES_ADDREFERENCESREQUEST, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
494, /* .binaryEncodingId */ | |
AddReferencesRequest_members /* .members */ | |
}, | |
/* AddReferencesResponse */ | |
{ | |
UA_TYPENAME("AddReferencesResponse") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {495}}, /* .typeId */ | |
sizeof(UA_AddReferencesResponse), /* .memSize */ | |
UA_TYPES_ADDREFERENCESRESPONSE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
3, /* .membersSize */ | |
497, /* .binaryEncodingId */ | |
AddReferencesResponse_members /* .members */ | |
}, | |
/* DeleteNodesItem */ | |
{ | |
UA_TYPENAME("DeleteNodesItem") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {382}}, /* .typeId */ | |
sizeof(UA_DeleteNodesItem), /* .memSize */ | |
UA_TYPES_DELETENODESITEM, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
384, /* .binaryEncodingId */ | |
DeleteNodesItem_members /* .members */ | |
}, | |
/* DeleteNodesRequest */ | |
{ | |
UA_TYPENAME("DeleteNodesRequest") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {498}}, /* .typeId */ | |
sizeof(UA_DeleteNodesRequest), /* .memSize */ | |
UA_TYPES_DELETENODESREQUEST, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
500, /* .binaryEncodingId */ | |
DeleteNodesRequest_members /* .members */ | |
}, | |
/* DeleteNodesResponse */ | |
{ | |
UA_TYPENAME("DeleteNodesResponse") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {501}}, /* .typeId */ | |
sizeof(UA_DeleteNodesResponse), /* .memSize */ | |
UA_TYPES_DELETENODESRESPONSE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
3, /* .membersSize */ | |
503, /* .binaryEncodingId */ | |
DeleteNodesResponse_members /* .members */ | |
}, | |
/* DeleteReferencesItem */ | |
{ | |
UA_TYPENAME("DeleteReferencesItem") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {385}}, /* .typeId */ | |
sizeof(UA_DeleteReferencesItem), /* .memSize */ | |
UA_TYPES_DELETEREFERENCESITEM, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
5, /* .membersSize */ | |
387, /* .binaryEncodingId */ | |
DeleteReferencesItem_members /* .members */ | |
}, | |
/* DeleteReferencesRequest */ | |
{ | |
UA_TYPENAME("DeleteReferencesRequest") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {504}}, /* .typeId */ | |
sizeof(UA_DeleteReferencesRequest), /* .memSize */ | |
UA_TYPES_DELETEREFERENCESREQUEST, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
506, /* .binaryEncodingId */ | |
DeleteReferencesRequest_members /* .members */ | |
}, | |
/* DeleteReferencesResponse */ | |
{ | |
UA_TYPENAME("DeleteReferencesResponse") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {507}}, /* .typeId */ | |
sizeof(UA_DeleteReferencesResponse), /* .memSize */ | |
UA_TYPES_DELETEREFERENCESRESPONSE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
3, /* .membersSize */ | |
509, /* .binaryEncodingId */ | |
DeleteReferencesResponse_members /* .members */ | |
}, | |
/* BrowseDirection */ | |
{ | |
UA_TYPENAME("BrowseDirection") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {510}}, /* .typeId */ | |
sizeof(UA_BrowseDirection), /* .memSize */ | |
UA_TYPES_INT32, /* .typeIndex */ | |
UA_DATATYPEKIND_ENUM, /* .typeKind */ | |
true, /* .pointerFree */ | |
UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
BrowseDirection_members /* .members */ | |
}, | |
/* ViewDescription */ | |
{ | |
UA_TYPENAME("ViewDescription") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {511}}, /* .typeId */ | |
sizeof(UA_ViewDescription), /* .memSize */ | |
UA_TYPES_VIEWDESCRIPTION, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
3, /* .membersSize */ | |
513, /* .binaryEncodingId */ | |
ViewDescription_members /* .members */ | |
}, | |
/* BrowseDescription */ | |
{ | |
UA_TYPENAME("BrowseDescription") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {514}}, /* .typeId */ | |
sizeof(UA_BrowseDescription), /* .memSize */ | |
UA_TYPES_BROWSEDESCRIPTION, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
6, /* .membersSize */ | |
516, /* .binaryEncodingId */ | |
BrowseDescription_members /* .members */ | |
}, | |
/* BrowseResultMask */ | |
{ | |
UA_TYPENAME("BrowseResultMask") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {517}}, /* .typeId */ | |
sizeof(UA_BrowseResultMask), /* .memSize */ | |
UA_TYPES_INT32, /* .typeIndex */ | |
UA_DATATYPEKIND_ENUM, /* .typeKind */ | |
true, /* .pointerFree */ | |
UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
BrowseResultMask_members /* .members */ | |
}, | |
/* ReferenceDescription */ | |
{ | |
UA_TYPENAME("ReferenceDescription") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {518}}, /* .typeId */ | |
sizeof(UA_ReferenceDescription), /* .memSize */ | |
UA_TYPES_REFERENCEDESCRIPTION, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
7, /* .membersSize */ | |
520, /* .binaryEncodingId */ | |
ReferenceDescription_members /* .members */ | |
}, | |
/* BrowseResult */ | |
{ | |
UA_TYPENAME("BrowseResult") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {522}}, /* .typeId */ | |
sizeof(UA_BrowseResult), /* .memSize */ | |
UA_TYPES_BROWSERESULT, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
3, /* .membersSize */ | |
524, /* .binaryEncodingId */ | |
BrowseResult_members /* .members */ | |
}, | |
/* BrowseRequest */ | |
{ | |
UA_TYPENAME("BrowseRequest") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {525}}, /* .typeId */ | |
sizeof(UA_BrowseRequest), /* .memSize */ | |
UA_TYPES_BROWSEREQUEST, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
4, /* .membersSize */ | |
527, /* .binaryEncodingId */ | |
BrowseRequest_members /* .members */ | |
}, | |
/* BrowseResponse */ | |
{ | |
UA_TYPENAME("BrowseResponse") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {528}}, /* .typeId */ | |
sizeof(UA_BrowseResponse), /* .memSize */ | |
UA_TYPES_BROWSERESPONSE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
3, /* .membersSize */ | |
530, /* .binaryEncodingId */ | |
BrowseResponse_members /* .members */ | |
}, | |
/* BrowseNextRequest */ | |
{ | |
UA_TYPENAME("BrowseNextRequest") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {531}}, /* .typeId */ | |
sizeof(UA_BrowseNextRequest), /* .memSize */ | |
UA_TYPES_BROWSENEXTREQUEST, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
3, /* .membersSize */ | |
533, /* .binaryEncodingId */ | |
BrowseNextRequest_members /* .members */ | |
}, | |
/* BrowseNextResponse */ | |
{ | |
UA_TYPENAME("BrowseNextResponse") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {534}}, /* .typeId */ | |
sizeof(UA_BrowseNextResponse), /* .memSize */ | |
UA_TYPES_BROWSENEXTRESPONSE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
3, /* .membersSize */ | |
536, /* .binaryEncodingId */ | |
BrowseNextResponse_members /* .members */ | |
}, | |
/* RelativePathElement */ | |
{ | |
UA_TYPENAME("RelativePathElement") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {537}}, /* .typeId */ | |
sizeof(UA_RelativePathElement), /* .memSize */ | |
UA_TYPES_RELATIVEPATHELEMENT, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
4, /* .membersSize */ | |
539, /* .binaryEncodingId */ | |
RelativePathElement_members /* .members */ | |
}, | |
/* RelativePath */ | |
{ | |
UA_TYPENAME("RelativePath") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {540}}, /* .typeId */ | |
sizeof(UA_RelativePath), /* .memSize */ | |
UA_TYPES_RELATIVEPATH, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
1, /* .membersSize */ | |
542, /* .binaryEncodingId */ | |
RelativePath_members /* .members */ | |
}, | |
/* BrowsePath */ | |
{ | |
UA_TYPENAME("BrowsePath") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {543}}, /* .typeId */ | |
sizeof(UA_BrowsePath), /* .memSize */ | |
UA_TYPES_BROWSEPATH, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
545, /* .binaryEncodingId */ | |
BrowsePath_members /* .members */ | |
}, | |
/* BrowsePathTarget */ | |
{ | |
UA_TYPENAME("BrowsePathTarget") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {546}}, /* .typeId */ | |
sizeof(UA_BrowsePathTarget), /* .memSize */ | |
UA_TYPES_BROWSEPATHTARGET, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
548, /* .binaryEncodingId */ | |
BrowsePathTarget_members /* .members */ | |
}, | |
/* BrowsePathResult */ | |
{ | |
UA_TYPENAME("BrowsePathResult") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {549}}, /* .typeId */ | |
sizeof(UA_BrowsePathResult), /* .memSize */ | |
UA_TYPES_BROWSEPATHRESULT, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
551, /* .binaryEncodingId */ | |
BrowsePathResult_members /* .members */ | |
}, | |
/* TranslateBrowsePathsToNodeIdsRequest */ | |
{ | |
UA_TYPENAME("TranslateBrowsePathsToNodeIdsRequest") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {552}}, /* .typeId */ | |
sizeof(UA_TranslateBrowsePathsToNodeIdsRequest), /* .memSize */ | |
UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSREQUEST, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
554, /* .binaryEncodingId */ | |
TranslateBrowsePathsToNodeIdsRequest_members /* .members */ | |
}, | |
/* TranslateBrowsePathsToNodeIdsResponse */ | |
{ | |
UA_TYPENAME("TranslateBrowsePathsToNodeIdsResponse") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {555}}, /* .typeId */ | |
sizeof(UA_TranslateBrowsePathsToNodeIdsResponse), /* .memSize */ | |
UA_TYPES_TRANSLATEBROWSEPATHSTONODEIDSRESPONSE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
3, /* .membersSize */ | |
557, /* .binaryEncodingId */ | |
TranslateBrowsePathsToNodeIdsResponse_members /* .members */ | |
}, | |
/* RegisterNodesRequest */ | |
{ | |
UA_TYPENAME("RegisterNodesRequest") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {558}}, /* .typeId */ | |
sizeof(UA_RegisterNodesRequest), /* .memSize */ | |
UA_TYPES_REGISTERNODESREQUEST, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
560, /* .binaryEncodingId */ | |
RegisterNodesRequest_members /* .members */ | |
}, | |
/* RegisterNodesResponse */ | |
{ | |
UA_TYPENAME("RegisterNodesResponse") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {561}}, /* .typeId */ | |
sizeof(UA_RegisterNodesResponse), /* .memSize */ | |
UA_TYPES_REGISTERNODESRESPONSE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
563, /* .binaryEncodingId */ | |
RegisterNodesResponse_members /* .members */ | |
}, | |
/* UnregisterNodesRequest */ | |
{ | |
UA_TYPENAME("UnregisterNodesRequest") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {564}}, /* .typeId */ | |
sizeof(UA_UnregisterNodesRequest), /* .memSize */ | |
UA_TYPES_UNREGISTERNODESREQUEST, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
566, /* .binaryEncodingId */ | |
UnregisterNodesRequest_members /* .members */ | |
}, | |
/* UnregisterNodesResponse */ | |
{ | |
UA_TYPENAME("UnregisterNodesResponse") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {567}}, /* .typeId */ | |
sizeof(UA_UnregisterNodesResponse), /* .memSize */ | |
UA_TYPES_UNREGISTERNODESRESPONSE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
1, /* .membersSize */ | |
569, /* .binaryEncodingId */ | |
UnregisterNodesResponse_members /* .members */ | |
}, | |
/* FilterOperator */ | |
{ | |
UA_TYPENAME("FilterOperator") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {576}}, /* .typeId */ | |
sizeof(UA_FilterOperator), /* .memSize */ | |
UA_TYPES_INT32, /* .typeIndex */ | |
UA_DATATYPEKIND_ENUM, /* .typeKind */ | |
true, /* .pointerFree */ | |
UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
FilterOperator_members /* .members */ | |
}, | |
/* ContentFilterElement */ | |
{ | |
UA_TYPENAME("ContentFilterElement") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {583}}, /* .typeId */ | |
sizeof(UA_ContentFilterElement), /* .memSize */ | |
UA_TYPES_CONTENTFILTERELEMENT, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
585, /* .binaryEncodingId */ | |
ContentFilterElement_members /* .members */ | |
}, | |
/* ContentFilter */ | |
{ | |
UA_TYPENAME("ContentFilter") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {586}}, /* .typeId */ | |
sizeof(UA_ContentFilter), /* .memSize */ | |
UA_TYPES_CONTENTFILTER, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
1, /* .membersSize */ | |
588, /* .binaryEncodingId */ | |
ContentFilter_members /* .members */ | |
}, | |
/* FilterOperand */ | |
{ | |
UA_TYPENAME("FilterOperand") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {589}}, /* .typeId */ | |
sizeof(UA_FilterOperand), /* .memSize */ | |
UA_TYPES_FILTEROPERAND, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
true, /* .pointerFree */ | |
false, /* .overlayable */ | |
0, /* .membersSize */ | |
591, /* .binaryEncodingId */ | |
FilterOperand_members /* .members */ | |
}, | |
/* ElementOperand */ | |
{ | |
UA_TYPENAME("ElementOperand") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {592}}, /* .typeId */ | |
sizeof(UA_ElementOperand), /* .memSize */ | |
UA_TYPES_ELEMENTOPERAND, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
true, /* .pointerFree */ | |
false, /* .overlayable */ | |
1, /* .membersSize */ | |
594, /* .binaryEncodingId */ | |
ElementOperand_members /* .members */ | |
}, | |
/* LiteralOperand */ | |
{ | |
UA_TYPENAME("LiteralOperand") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {595}}, /* .typeId */ | |
sizeof(UA_LiteralOperand), /* .memSize */ | |
UA_TYPES_LITERALOPERAND, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
1, /* .membersSize */ | |
597, /* .binaryEncodingId */ | |
LiteralOperand_members /* .members */ | |
}, | |
/* AttributeOperand */ | |
{ | |
UA_TYPENAME("AttributeOperand") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {598}}, /* .typeId */ | |
sizeof(UA_AttributeOperand), /* .memSize */ | |
UA_TYPES_ATTRIBUTEOPERAND, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
5, /* .membersSize */ | |
600, /* .binaryEncodingId */ | |
AttributeOperand_members /* .members */ | |
}, | |
/* SimpleAttributeOperand */ | |
{ | |
UA_TYPENAME("SimpleAttributeOperand") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {601}}, /* .typeId */ | |
sizeof(UA_SimpleAttributeOperand), /* .memSize */ | |
UA_TYPES_SIMPLEATTRIBUTEOPERAND, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
4, /* .membersSize */ | |
603, /* .binaryEncodingId */ | |
SimpleAttributeOperand_members /* .members */ | |
}, | |
/* ContentFilterElementResult */ | |
{ | |
UA_TYPENAME("ContentFilterElementResult") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {604}}, /* .typeId */ | |
sizeof(UA_ContentFilterElementResult), /* .memSize */ | |
UA_TYPES_CONTENTFILTERELEMENTRESULT, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
3, /* .membersSize */ | |
606, /* .binaryEncodingId */ | |
ContentFilterElementResult_members /* .members */ | |
}, | |
/* ContentFilterResult */ | |
{ | |
UA_TYPENAME("ContentFilterResult") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {607}}, /* .typeId */ | |
sizeof(UA_ContentFilterResult), /* .memSize */ | |
UA_TYPES_CONTENTFILTERRESULT, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
609, /* .binaryEncodingId */ | |
ContentFilterResult_members /* .members */ | |
}, | |
/* TimestampsToReturn */ | |
{ | |
UA_TYPENAME("TimestampsToReturn") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {625}}, /* .typeId */ | |
sizeof(UA_TimestampsToReturn), /* .memSize */ | |
UA_TYPES_INT32, /* .typeIndex */ | |
UA_DATATYPEKIND_ENUM, /* .typeKind */ | |
true, /* .pointerFree */ | |
UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
TimestampsToReturn_members /* .members */ | |
}, | |
/* ReadValueId */ | |
{ | |
UA_TYPENAME("ReadValueId") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {626}}, /* .typeId */ | |
sizeof(UA_ReadValueId), /* .memSize */ | |
UA_TYPES_READVALUEID, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
4, /* .membersSize */ | |
628, /* .binaryEncodingId */ | |
ReadValueId_members /* .members */ | |
}, | |
/* ReadRequest */ | |
{ | |
UA_TYPENAME("ReadRequest") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {629}}, /* .typeId */ | |
sizeof(UA_ReadRequest), /* .memSize */ | |
UA_TYPES_READREQUEST, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
4, /* .membersSize */ | |
631, /* .binaryEncodingId */ | |
ReadRequest_members /* .members */ | |
}, | |
/* ReadResponse */ | |
{ | |
UA_TYPENAME("ReadResponse") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {632}}, /* .typeId */ | |
sizeof(UA_ReadResponse), /* .memSize */ | |
UA_TYPES_READRESPONSE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
3, /* .membersSize */ | |
634, /* .binaryEncodingId */ | |
ReadResponse_members /* .members */ | |
}, | |
/* WriteValue */ | |
{ | |
UA_TYPENAME("WriteValue") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {668}}, /* .typeId */ | |
sizeof(UA_WriteValue), /* .memSize */ | |
UA_TYPES_WRITEVALUE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
4, /* .membersSize */ | |
670, /* .binaryEncodingId */ | |
WriteValue_members /* .members */ | |
}, | |
/* WriteRequest */ | |
{ | |
UA_TYPENAME("WriteRequest") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {671}}, /* .typeId */ | |
sizeof(UA_WriteRequest), /* .memSize */ | |
UA_TYPES_WRITEREQUEST, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
673, /* .binaryEncodingId */ | |
WriteRequest_members /* .members */ | |
}, | |
/* WriteResponse */ | |
{ | |
UA_TYPENAME("WriteResponse") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {674}}, /* .typeId */ | |
sizeof(UA_WriteResponse), /* .memSize */ | |
UA_TYPES_WRITERESPONSE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
3, /* .membersSize */ | |
676, /* .binaryEncodingId */ | |
WriteResponse_members /* .members */ | |
}, | |
/* CallMethodRequest */ | |
{ | |
UA_TYPENAME("CallMethodRequest") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {704}}, /* .typeId */ | |
sizeof(UA_CallMethodRequest), /* .memSize */ | |
UA_TYPES_CALLMETHODREQUEST, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
3, /* .membersSize */ | |
706, /* .binaryEncodingId */ | |
CallMethodRequest_members /* .members */ | |
}, | |
/* CallMethodResult */ | |
{ | |
UA_TYPENAME("CallMethodResult") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {707}}, /* .typeId */ | |
sizeof(UA_CallMethodResult), /* .memSize */ | |
UA_TYPES_CALLMETHODRESULT, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
4, /* .membersSize */ | |
709, /* .binaryEncodingId */ | |
CallMethodResult_members /* .members */ | |
}, | |
/* CallRequest */ | |
{ | |
UA_TYPENAME("CallRequest") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {710}}, /* .typeId */ | |
sizeof(UA_CallRequest), /* .memSize */ | |
UA_TYPES_CALLREQUEST, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
712, /* .binaryEncodingId */ | |
CallRequest_members /* .members */ | |
}, | |
/* CallResponse */ | |
{ | |
UA_TYPENAME("CallResponse") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {713}}, /* .typeId */ | |
sizeof(UA_CallResponse), /* .memSize */ | |
UA_TYPES_CALLRESPONSE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
3, /* .membersSize */ | |
715, /* .binaryEncodingId */ | |
CallResponse_members /* .members */ | |
}, | |
/* MonitoringMode */ | |
{ | |
UA_TYPENAME("MonitoringMode") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {716}}, /* .typeId */ | |
sizeof(UA_MonitoringMode), /* .memSize */ | |
UA_TYPES_INT32, /* .typeIndex */ | |
UA_DATATYPEKIND_ENUM, /* .typeKind */ | |
true, /* .pointerFree */ | |
UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
MonitoringMode_members /* .members */ | |
}, | |
/* DataChangeTrigger */ | |
{ | |
UA_TYPENAME("DataChangeTrigger") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {717}}, /* .typeId */ | |
sizeof(UA_DataChangeTrigger), /* .memSize */ | |
UA_TYPES_INT32, /* .typeIndex */ | |
UA_DATATYPEKIND_ENUM, /* .typeKind */ | |
true, /* .pointerFree */ | |
UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
DataChangeTrigger_members /* .members */ | |
}, | |
/* DeadbandType */ | |
{ | |
UA_TYPENAME("DeadbandType") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {718}}, /* .typeId */ | |
sizeof(UA_DeadbandType), /* .memSize */ | |
UA_TYPES_INT32, /* .typeIndex */ | |
UA_DATATYPEKIND_ENUM, /* .typeKind */ | |
true, /* .pointerFree */ | |
UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
DeadbandType_members /* .members */ | |
}, | |
/* DataChangeFilter */ | |
{ | |
UA_TYPENAME("DataChangeFilter") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {722}}, /* .typeId */ | |
sizeof(UA_DataChangeFilter), /* .memSize */ | |
UA_TYPES_DATACHANGEFILTER, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
true, /* .pointerFree */ | |
false, /* .overlayable */ | |
3, /* .membersSize */ | |
724, /* .binaryEncodingId */ | |
DataChangeFilter_members /* .members */ | |
}, | |
/* EventFilter */ | |
{ | |
UA_TYPENAME("EventFilter") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {725}}, /* .typeId */ | |
sizeof(UA_EventFilter), /* .memSize */ | |
UA_TYPES_EVENTFILTER, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
727, /* .binaryEncodingId */ | |
EventFilter_members /* .members */ | |
}, | |
/* AggregateConfiguration */ | |
{ | |
UA_TYPENAME("AggregateConfiguration") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {948}}, /* .typeId */ | |
sizeof(UA_AggregateConfiguration), /* .memSize */ | |
UA_TYPES_AGGREGATECONFIGURATION, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
true, /* .pointerFree */ | |
false, /* .overlayable */ | |
5, /* .membersSize */ | |
950, /* .binaryEncodingId */ | |
AggregateConfiguration_members /* .members */ | |
}, | |
/* AggregateFilter */ | |
{ | |
UA_TYPENAME("AggregateFilter") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {728}}, /* .typeId */ | |
sizeof(UA_AggregateFilter), /* .memSize */ | |
UA_TYPES_AGGREGATEFILTER, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
4, /* .membersSize */ | |
730, /* .binaryEncodingId */ | |
AggregateFilter_members /* .members */ | |
}, | |
/* EventFilterResult */ | |
{ | |
UA_TYPENAME("EventFilterResult") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {734}}, /* .typeId */ | |
sizeof(UA_EventFilterResult), /* .memSize */ | |
UA_TYPES_EVENTFILTERRESULT, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
3, /* .membersSize */ | |
736, /* .binaryEncodingId */ | |
EventFilterResult_members /* .members */ | |
}, | |
/* MonitoringParameters */ | |
{ | |
UA_TYPENAME("MonitoringParameters") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {740}}, /* .typeId */ | |
sizeof(UA_MonitoringParameters), /* .memSize */ | |
UA_TYPES_MONITORINGPARAMETERS, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
5, /* .membersSize */ | |
742, /* .binaryEncodingId */ | |
MonitoringParameters_members /* .members */ | |
}, | |
/* MonitoredItemCreateRequest */ | |
{ | |
UA_TYPENAME("MonitoredItemCreateRequest") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {743}}, /* .typeId */ | |
sizeof(UA_MonitoredItemCreateRequest), /* .memSize */ | |
UA_TYPES_MONITOREDITEMCREATEREQUEST, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
3, /* .membersSize */ | |
745, /* .binaryEncodingId */ | |
MonitoredItemCreateRequest_members /* .members */ | |
}, | |
/* MonitoredItemCreateResult */ | |
{ | |
UA_TYPENAME("MonitoredItemCreateResult") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {746}}, /* .typeId */ | |
sizeof(UA_MonitoredItemCreateResult), /* .memSize */ | |
UA_TYPES_MONITOREDITEMCREATERESULT, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
5, /* .membersSize */ | |
748, /* .binaryEncodingId */ | |
MonitoredItemCreateResult_members /* .members */ | |
}, | |
/* CreateMonitoredItemsRequest */ | |
{ | |
UA_TYPENAME("CreateMonitoredItemsRequest") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {749}}, /* .typeId */ | |
sizeof(UA_CreateMonitoredItemsRequest), /* .memSize */ | |
UA_TYPES_CREATEMONITOREDITEMSREQUEST, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
4, /* .membersSize */ | |
751, /* .binaryEncodingId */ | |
CreateMonitoredItemsRequest_members /* .members */ | |
}, | |
/* CreateMonitoredItemsResponse */ | |
{ | |
UA_TYPENAME("CreateMonitoredItemsResponse") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {752}}, /* .typeId */ | |
sizeof(UA_CreateMonitoredItemsResponse), /* .memSize */ | |
UA_TYPES_CREATEMONITOREDITEMSRESPONSE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
3, /* .membersSize */ | |
754, /* .binaryEncodingId */ | |
CreateMonitoredItemsResponse_members /* .members */ | |
}, | |
/* MonitoredItemModifyRequest */ | |
{ | |
UA_TYPENAME("MonitoredItemModifyRequest") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {755}}, /* .typeId */ | |
sizeof(UA_MonitoredItemModifyRequest), /* .memSize */ | |
UA_TYPES_MONITOREDITEMMODIFYREQUEST, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
757, /* .binaryEncodingId */ | |
MonitoredItemModifyRequest_members /* .members */ | |
}, | |
/* MonitoredItemModifyResult */ | |
{ | |
UA_TYPENAME("MonitoredItemModifyResult") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {758}}, /* .typeId */ | |
sizeof(UA_MonitoredItemModifyResult), /* .memSize */ | |
UA_TYPES_MONITOREDITEMMODIFYRESULT, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
4, /* .membersSize */ | |
760, /* .binaryEncodingId */ | |
MonitoredItemModifyResult_members /* .members */ | |
}, | |
/* ModifyMonitoredItemsRequest */ | |
{ | |
UA_TYPENAME("ModifyMonitoredItemsRequest") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {761}}, /* .typeId */ | |
sizeof(UA_ModifyMonitoredItemsRequest), /* .memSize */ | |
UA_TYPES_MODIFYMONITOREDITEMSREQUEST, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
4, /* .membersSize */ | |
763, /* .binaryEncodingId */ | |
ModifyMonitoredItemsRequest_members /* .members */ | |
}, | |
/* ModifyMonitoredItemsResponse */ | |
{ | |
UA_TYPENAME("ModifyMonitoredItemsResponse") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {764}}, /* .typeId */ | |
sizeof(UA_ModifyMonitoredItemsResponse), /* .memSize */ | |
UA_TYPES_MODIFYMONITOREDITEMSRESPONSE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
3, /* .membersSize */ | |
766, /* .binaryEncodingId */ | |
ModifyMonitoredItemsResponse_members /* .members */ | |
}, | |
/* SetMonitoringModeRequest */ | |
{ | |
UA_TYPENAME("SetMonitoringModeRequest") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {767}}, /* .typeId */ | |
sizeof(UA_SetMonitoringModeRequest), /* .memSize */ | |
UA_TYPES_SETMONITORINGMODEREQUEST, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
4, /* .membersSize */ | |
769, /* .binaryEncodingId */ | |
SetMonitoringModeRequest_members /* .members */ | |
}, | |
/* SetMonitoringModeResponse */ | |
{ | |
UA_TYPENAME("SetMonitoringModeResponse") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {770}}, /* .typeId */ | |
sizeof(UA_SetMonitoringModeResponse), /* .memSize */ | |
UA_TYPES_SETMONITORINGMODERESPONSE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
3, /* .membersSize */ | |
772, /* .binaryEncodingId */ | |
SetMonitoringModeResponse_members /* .members */ | |
}, | |
/* SetTriggeringRequest */ | |
{ | |
UA_TYPENAME("SetTriggeringRequest") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {773}}, /* .typeId */ | |
sizeof(UA_SetTriggeringRequest), /* .memSize */ | |
UA_TYPES_SETTRIGGERINGREQUEST, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
5, /* .membersSize */ | |
775, /* .binaryEncodingId */ | |
SetTriggeringRequest_members /* .members */ | |
}, | |
/* SetTriggeringResponse */ | |
{ | |
UA_TYPENAME("SetTriggeringResponse") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {776}}, /* .typeId */ | |
sizeof(UA_SetTriggeringResponse), /* .memSize */ | |
UA_TYPES_SETTRIGGERINGRESPONSE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
5, /* .membersSize */ | |
778, /* .binaryEncodingId */ | |
SetTriggeringResponse_members /* .members */ | |
}, | |
/* DeleteMonitoredItemsRequest */ | |
{ | |
UA_TYPENAME("DeleteMonitoredItemsRequest") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {779}}, /* .typeId */ | |
sizeof(UA_DeleteMonitoredItemsRequest), /* .memSize */ | |
UA_TYPES_DELETEMONITOREDITEMSREQUEST, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
3, /* .membersSize */ | |
781, /* .binaryEncodingId */ | |
DeleteMonitoredItemsRequest_members /* .members */ | |
}, | |
/* DeleteMonitoredItemsResponse */ | |
{ | |
UA_TYPENAME("DeleteMonitoredItemsResponse") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {782}}, /* .typeId */ | |
sizeof(UA_DeleteMonitoredItemsResponse), /* .memSize */ | |
UA_TYPES_DELETEMONITOREDITEMSRESPONSE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
3, /* .membersSize */ | |
784, /* .binaryEncodingId */ | |
DeleteMonitoredItemsResponse_members /* .members */ | |
}, | |
/* CreateSubscriptionRequest */ | |
{ | |
UA_TYPENAME("CreateSubscriptionRequest") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {785}}, /* .typeId */ | |
sizeof(UA_CreateSubscriptionRequest), /* .memSize */ | |
UA_TYPES_CREATESUBSCRIPTIONREQUEST, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
7, /* .membersSize */ | |
787, /* .binaryEncodingId */ | |
CreateSubscriptionRequest_members /* .members */ | |
}, | |
/* CreateSubscriptionResponse */ | |
{ | |
UA_TYPENAME("CreateSubscriptionResponse") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {788}}, /* .typeId */ | |
sizeof(UA_CreateSubscriptionResponse), /* .memSize */ | |
UA_TYPES_CREATESUBSCRIPTIONRESPONSE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
5, /* .membersSize */ | |
790, /* .binaryEncodingId */ | |
CreateSubscriptionResponse_members /* .members */ | |
}, | |
/* ModifySubscriptionRequest */ | |
{ | |
UA_TYPENAME("ModifySubscriptionRequest") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {791}}, /* .typeId */ | |
sizeof(UA_ModifySubscriptionRequest), /* .memSize */ | |
UA_TYPES_MODIFYSUBSCRIPTIONREQUEST, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
7, /* .membersSize */ | |
793, /* .binaryEncodingId */ | |
ModifySubscriptionRequest_members /* .members */ | |
}, | |
/* ModifySubscriptionResponse */ | |
{ | |
UA_TYPENAME("ModifySubscriptionResponse") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {794}}, /* .typeId */ | |
sizeof(UA_ModifySubscriptionResponse), /* .memSize */ | |
UA_TYPES_MODIFYSUBSCRIPTIONRESPONSE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
4, /* .membersSize */ | |
796, /* .binaryEncodingId */ | |
ModifySubscriptionResponse_members /* .members */ | |
}, | |
/* SetPublishingModeRequest */ | |
{ | |
UA_TYPENAME("SetPublishingModeRequest") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {797}}, /* .typeId */ | |
sizeof(UA_SetPublishingModeRequest), /* .memSize */ | |
UA_TYPES_SETPUBLISHINGMODEREQUEST, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
3, /* .membersSize */ | |
799, /* .binaryEncodingId */ | |
SetPublishingModeRequest_members /* .members */ | |
}, | |
/* SetPublishingModeResponse */ | |
{ | |
UA_TYPENAME("SetPublishingModeResponse") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {800}}, /* .typeId */ | |
sizeof(UA_SetPublishingModeResponse), /* .memSize */ | |
UA_TYPES_SETPUBLISHINGMODERESPONSE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
3, /* .membersSize */ | |
802, /* .binaryEncodingId */ | |
SetPublishingModeResponse_members /* .members */ | |
}, | |
/* NotificationMessage */ | |
{ | |
UA_TYPENAME("NotificationMessage") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {803}}, /* .typeId */ | |
sizeof(UA_NotificationMessage), /* .memSize */ | |
UA_TYPES_NOTIFICATIONMESSAGE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
3, /* .membersSize */ | |
805, /* .binaryEncodingId */ | |
NotificationMessage_members /* .members */ | |
}, | |
/* MonitoredItemNotification */ | |
{ | |
UA_TYPENAME("MonitoredItemNotification") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {806}}, /* .typeId */ | |
sizeof(UA_MonitoredItemNotification), /* .memSize */ | |
UA_TYPES_MONITOREDITEMNOTIFICATION, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
808, /* .binaryEncodingId */ | |
MonitoredItemNotification_members /* .members */ | |
}, | |
/* EventFieldList */ | |
{ | |
UA_TYPENAME("EventFieldList") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {917}}, /* .typeId */ | |
sizeof(UA_EventFieldList), /* .memSize */ | |
UA_TYPES_EVENTFIELDLIST, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
919, /* .binaryEncodingId */ | |
EventFieldList_members /* .members */ | |
}, | |
/* StatusChangeNotification */ | |
{ | |
UA_TYPENAME("StatusChangeNotification") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {818}}, /* .typeId */ | |
sizeof(UA_StatusChangeNotification), /* .memSize */ | |
UA_TYPES_STATUSCHANGENOTIFICATION, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
820, /* .binaryEncodingId */ | |
StatusChangeNotification_members /* .members */ | |
}, | |
/* SubscriptionAcknowledgement */ | |
{ | |
UA_TYPENAME("SubscriptionAcknowledgement") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {821}}, /* .typeId */ | |
sizeof(UA_SubscriptionAcknowledgement), /* .memSize */ | |
UA_TYPES_SUBSCRIPTIONACKNOWLEDGEMENT, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
true, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
823, /* .binaryEncodingId */ | |
SubscriptionAcknowledgement_members /* .members */ | |
}, | |
/* PublishRequest */ | |
{ | |
UA_TYPENAME("PublishRequest") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {824}}, /* .typeId */ | |
sizeof(UA_PublishRequest), /* .memSize */ | |
UA_TYPES_PUBLISHREQUEST, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
826, /* .binaryEncodingId */ | |
PublishRequest_members /* .members */ | |
}, | |
/* PublishResponse */ | |
{ | |
UA_TYPENAME("PublishResponse") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {827}}, /* .typeId */ | |
sizeof(UA_PublishResponse), /* .memSize */ | |
UA_TYPES_PUBLISHRESPONSE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
7, /* .membersSize */ | |
829, /* .binaryEncodingId */ | |
PublishResponse_members /* .members */ | |
}, | |
/* RepublishRequest */ | |
{ | |
UA_TYPENAME("RepublishRequest") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {830}}, /* .typeId */ | |
sizeof(UA_RepublishRequest), /* .memSize */ | |
UA_TYPES_REPUBLISHREQUEST, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
3, /* .membersSize */ | |
832, /* .binaryEncodingId */ | |
RepublishRequest_members /* .members */ | |
}, | |
/* RepublishResponse */ | |
{ | |
UA_TYPENAME("RepublishResponse") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {833}}, /* .typeId */ | |
sizeof(UA_RepublishResponse), /* .memSize */ | |
UA_TYPES_REPUBLISHRESPONSE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
835, /* .binaryEncodingId */ | |
RepublishResponse_members /* .members */ | |
}, | |
/* DeleteSubscriptionsRequest */ | |
{ | |
UA_TYPENAME("DeleteSubscriptionsRequest") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {845}}, /* .typeId */ | |
sizeof(UA_DeleteSubscriptionsRequest), /* .memSize */ | |
UA_TYPES_DELETESUBSCRIPTIONSREQUEST, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
847, /* .binaryEncodingId */ | |
DeleteSubscriptionsRequest_members /* .members */ | |
}, | |
/* DeleteSubscriptionsResponse */ | |
{ | |
UA_TYPENAME("DeleteSubscriptionsResponse") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {848}}, /* .typeId */ | |
sizeof(UA_DeleteSubscriptionsResponse), /* .memSize */ | |
UA_TYPES_DELETESUBSCRIPTIONSRESPONSE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
3, /* .membersSize */ | |
850, /* .binaryEncodingId */ | |
DeleteSubscriptionsResponse_members /* .members */ | |
}, | |
/* BuildInfo */ | |
{ | |
UA_TYPENAME("BuildInfo") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {338}}, /* .typeId */ | |
sizeof(UA_BuildInfo), /* .memSize */ | |
UA_TYPES_BUILDINFO, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
6, /* .membersSize */ | |
340, /* .binaryEncodingId */ | |
BuildInfo_members /* .members */ | |
}, | |
/* RedundancySupport */ | |
{ | |
UA_TYPENAME("RedundancySupport") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {851}}, /* .typeId */ | |
sizeof(UA_RedundancySupport), /* .memSize */ | |
UA_TYPES_INT32, /* .typeIndex */ | |
UA_DATATYPEKIND_ENUM, /* .typeKind */ | |
true, /* .pointerFree */ | |
UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
RedundancySupport_members /* .members */ | |
}, | |
/* ServerState */ | |
{ | |
UA_TYPENAME("ServerState") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {852}}, /* .typeId */ | |
sizeof(UA_ServerState), /* .memSize */ | |
UA_TYPES_INT32, /* .typeIndex */ | |
UA_DATATYPEKIND_ENUM, /* .typeKind */ | |
true, /* .pointerFree */ | |
UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
ServerState_members /* .members */ | |
}, | |
/* ServerDiagnosticsSummaryDataType */ | |
{ | |
UA_TYPENAME("ServerDiagnosticsSummaryDataType") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {859}}, /* .typeId */ | |
sizeof(UA_ServerDiagnosticsSummaryDataType), /* .memSize */ | |
UA_TYPES_SERVERDIAGNOSTICSSUMMARYDATATYPE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
true, /* .pointerFree */ | |
false, /* .overlayable */ | |
12, /* .membersSize */ | |
861, /* .binaryEncodingId */ | |
ServerDiagnosticsSummaryDataType_members /* .members */ | |
}, | |
/* ServerStatusDataType */ | |
{ | |
UA_TYPENAME("ServerStatusDataType") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {862}}, /* .typeId */ | |
sizeof(UA_ServerStatusDataType), /* .memSize */ | |
UA_TYPES_SERVERSTATUSDATATYPE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
6, /* .membersSize */ | |
864, /* .binaryEncodingId */ | |
ServerStatusDataType_members /* .members */ | |
}, | |
/* Range */ | |
{ | |
UA_TYPENAME("Range") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {884}}, /* .typeId */ | |
sizeof(UA_Range), /* .memSize */ | |
UA_TYPES_RANGE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
true, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
886, /* .binaryEncodingId */ | |
Range_members /* .members */ | |
}, | |
/* EUInformation */ | |
{ | |
UA_TYPENAME("EUInformation") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {887}}, /* .typeId */ | |
sizeof(UA_EUInformation), /* .memSize */ | |
UA_TYPES_EUINFORMATION, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
4, /* .membersSize */ | |
889, /* .binaryEncodingId */ | |
EUInformation_members /* .members */ | |
}, | |
/* AxisScaleEnumeration */ | |
{ | |
UA_TYPENAME("AxisScaleEnumeration") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {12077}}, /* .typeId */ | |
sizeof(UA_AxisScaleEnumeration), /* .memSize */ | |
UA_TYPES_INT32, /* .typeIndex */ | |
UA_DATATYPEKIND_ENUM, /* .typeKind */ | |
true, /* .pointerFree */ | |
UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
AxisScaleEnumeration_members /* .members */ | |
}, | |
/* ComplexNumberType */ | |
{ | |
UA_TYPENAME("ComplexNumberType") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {12171}}, /* .typeId */ | |
sizeof(UA_ComplexNumberType), /* .memSize */ | |
UA_TYPES_COMPLEXNUMBERTYPE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
true, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
12181, /* .binaryEncodingId */ | |
ComplexNumberType_members /* .members */ | |
}, | |
/* DoubleComplexNumberType */ | |
{ | |
UA_TYPENAME("DoubleComplexNumberType") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {12172}}, /* .typeId */ | |
sizeof(UA_DoubleComplexNumberType), /* .memSize */ | |
UA_TYPES_DOUBLECOMPLEXNUMBERTYPE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
true, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
12182, /* .binaryEncodingId */ | |
DoubleComplexNumberType_members /* .members */ | |
}, | |
/* AxisInformation */ | |
{ | |
UA_TYPENAME("AxisInformation") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {12079}}, /* .typeId */ | |
sizeof(UA_AxisInformation), /* .memSize */ | |
UA_TYPES_AXISINFORMATION, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
5, /* .membersSize */ | |
12089, /* .binaryEncodingId */ | |
AxisInformation_members /* .members */ | |
}, | |
/* XVType */ | |
{ | |
UA_TYPENAME("XVType") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {12080}}, /* .typeId */ | |
sizeof(UA_XVType), /* .memSize */ | |
UA_TYPES_XVTYPE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
true, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
12090, /* .binaryEncodingId */ | |
XVType_members /* .members */ | |
}, | |
/* EnumDefinition */ | |
{ | |
UA_TYPENAME("EnumDefinition") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {100}}, /* .typeId */ | |
sizeof(UA_EnumDefinition), /* .memSize */ | |
UA_TYPES_ENUMDEFINITION, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
1, /* .membersSize */ | |
123, /* .binaryEncodingId */ | |
EnumDefinition_members /* .members */ | |
}, | |
/* DataChangeNotification */ | |
{ | |
UA_TYPENAME("DataChangeNotification") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {809}}, /* .typeId */ | |
sizeof(UA_DataChangeNotification), /* .memSize */ | |
UA_TYPES_DATACHANGENOTIFICATION, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
811, /* .binaryEncodingId */ | |
DataChangeNotification_members /* .members */ | |
}, | |
/* EventNotificationList */ | |
{ | |
UA_TYPENAME("EventNotificationList") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {914}}, /* .typeId */ | |
sizeof(UA_EventNotificationList), /* .memSize */ | |
UA_TYPES_EVENTNOTIFICATIONLIST, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
1, /* .membersSize */ | |
916, /* .binaryEncodingId */ | |
EventNotificationList_members /* .members */ | |
}, | |
}; | |
/*********************************** amalgamated original file "E:/Librarys/open62541/build32/src_generated/open62541/transport_generated.c" ***********************************/ | |
/* Generated from Opc.Ua.Types.bsd, Custom.Opc.Ua.Transport.bsd with script E:/Librarys/open62541/tools/generate_datatypes.py | |
* on host DESKTOP-GDCIE62 by user guoxi at 2019-12-20 06:20:38 */ | |
/* MessageType */ | |
#define MessageType_members NULL | |
/* ChunkType */ | |
#define ChunkType_members NULL | |
/* TcpMessageHeader */ | |
static UA_DataTypeMember TcpMessageHeader_members[2] = { | |
{ | |
UA_TYPENAME("MessageTypeAndChunkType") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("MessageSize") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_TcpMessageHeader, messageSize) - offsetof(UA_TcpMessageHeader, messageTypeAndChunkType) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* TcpHelloMessage */ | |
static UA_DataTypeMember TcpHelloMessage_members[6] = { | |
{ | |
UA_TYPENAME("ProtocolVersion") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ReceiveBufferSize") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_TcpHelloMessage, receiveBufferSize) - offsetof(UA_TcpHelloMessage, protocolVersion) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("SendBufferSize") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_TcpHelloMessage, sendBufferSize) - offsetof(UA_TcpHelloMessage, receiveBufferSize) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("MaxMessageSize") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_TcpHelloMessage, maxMessageSize) - offsetof(UA_TcpHelloMessage, sendBufferSize) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("MaxChunkCount") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_TcpHelloMessage, maxChunkCount) - offsetof(UA_TcpHelloMessage, maxMessageSize) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("EndpointUrl") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_TcpHelloMessage, endpointUrl) - offsetof(UA_TcpHelloMessage, maxChunkCount) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* TcpAcknowledgeMessage */ | |
static UA_DataTypeMember TcpAcknowledgeMessage_members[5] = { | |
{ | |
UA_TYPENAME("ProtocolVersion") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ReceiveBufferSize") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_TcpAcknowledgeMessage, receiveBufferSize) - offsetof(UA_TcpAcknowledgeMessage, protocolVersion) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("SendBufferSize") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_TcpAcknowledgeMessage, sendBufferSize) - offsetof(UA_TcpAcknowledgeMessage, receiveBufferSize) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("MaxMessageSize") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_TcpAcknowledgeMessage, maxMessageSize) - offsetof(UA_TcpAcknowledgeMessage, sendBufferSize) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("MaxChunkCount") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_TcpAcknowledgeMessage, maxChunkCount) - offsetof(UA_TcpAcknowledgeMessage, maxMessageSize) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* TcpErrorMessage */ | |
static UA_DataTypeMember TcpErrorMessage_members[2] = { | |
{ | |
UA_TYPENAME("Error") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Reason") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_TcpErrorMessage, reason) - offsetof(UA_TcpErrorMessage, error) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* SecureConversationMessageHeader */ | |
static UA_DataTypeMember SecureConversationMessageHeader_members[2] = { | |
{ | |
UA_TYPENAME("MessageHeader") /* .memberName */ | |
UA_TRANSPORT_TCPMESSAGEHEADER, /* .memberTypeIndex */ | |
0, /* .padding */ | |
false, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("SecureChannelId") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_SecureConversationMessageHeader, secureChannelId) - offsetof(UA_SecureConversationMessageHeader, messageHeader) - sizeof(UA_TcpMessageHeader), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* AsymmetricAlgorithmSecurityHeader */ | |
static UA_DataTypeMember AsymmetricAlgorithmSecurityHeader_members[3] = { | |
{ | |
UA_TYPENAME("SecurityPolicyUri") /* .memberName */ | |
UA_TYPES_BYTESTRING, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("SenderCertificate") /* .memberName */ | |
UA_TYPES_BYTESTRING, /* .memberTypeIndex */ | |
offsetof(UA_AsymmetricAlgorithmSecurityHeader, senderCertificate) - offsetof(UA_AsymmetricAlgorithmSecurityHeader, securityPolicyUri) - sizeof(UA_ByteString), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("ReceiverCertificateThumbprint") /* .memberName */ | |
UA_TYPES_BYTESTRING, /* .memberTypeIndex */ | |
offsetof(UA_AsymmetricAlgorithmSecurityHeader, receiverCertificateThumbprint) - offsetof(UA_AsymmetricAlgorithmSecurityHeader, senderCertificate) - sizeof(UA_ByteString), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* SymmetricAlgorithmSecurityHeader */ | |
static UA_DataTypeMember SymmetricAlgorithmSecurityHeader_members[1] = { | |
{ | |
UA_TYPENAME("TokenId") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* SequenceHeader */ | |
static UA_DataTypeMember SequenceHeader_members[2] = { | |
{ | |
UA_TYPENAME("SequenceNumber") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("RequestId") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
offsetof(UA_SequenceHeader, requestId) - offsetof(UA_SequenceHeader, sequenceNumber) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* SecureConversationMessageFooter */ | |
static UA_DataTypeMember SecureConversationMessageFooter_members[2] = { | |
{ | |
UA_TYPENAME("Padding") /* .memberName */ | |
UA_TYPES_BYTE, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
true /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Signature") /* .memberName */ | |
UA_TYPES_BYTE, /* .memberTypeIndex */ | |
offsetof(UA_SecureConversationMessageFooter, signature) - offsetof(UA_SecureConversationMessageFooter, padding) - sizeof(void*), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
/* SecureConversationMessageAbortBody */ | |
static UA_DataTypeMember SecureConversationMessageAbortBody_members[2] = { | |
{ | |
UA_TYPENAME("Error") /* .memberName */ | |
UA_TYPES_UINT32, /* .memberTypeIndex */ | |
0, /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
}, | |
{ | |
UA_TYPENAME("Reason") /* .memberName */ | |
UA_TYPES_STRING, /* .memberTypeIndex */ | |
offsetof(UA_SecureConversationMessageAbortBody, reason) - offsetof(UA_SecureConversationMessageAbortBody, error) - sizeof(UA_UInt32), /* .padding */ | |
true, /* .namespaceZero */ | |
false /* .isArray */ | |
},}; | |
const UA_DataType UA_TRANSPORT[UA_TRANSPORT_COUNT] = { | |
/* MessageType */ | |
{ | |
UA_TYPENAME("MessageType") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {0}}, /* .typeId */ | |
sizeof(UA_MessageType), /* .memSize */ | |
UA_TYPES_INT32, /* .typeIndex */ | |
UA_DATATYPEKIND_ENUM, /* .typeKind */ | |
true, /* .pointerFree */ | |
UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
MessageType_members /* .members */ | |
}, | |
/* ChunkType */ | |
{ | |
UA_TYPENAME("ChunkType") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {0}}, /* .typeId */ | |
sizeof(UA_ChunkType), /* .memSize */ | |
UA_TYPES_INT32, /* .typeIndex */ | |
UA_DATATYPEKIND_ENUM, /* .typeKind */ | |
true, /* .pointerFree */ | |
UA_BINARY_OVERLAYABLE_INTEGER, /* .overlayable */ | |
0, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
ChunkType_members /* .members */ | |
}, | |
/* TcpMessageHeader */ | |
{ | |
UA_TYPENAME("TcpMessageHeader") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {0}}, /* .typeId */ | |
sizeof(UA_TcpMessageHeader), /* .memSize */ | |
UA_TRANSPORT_TCPMESSAGEHEADER, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
true, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
TcpMessageHeader_members /* .members */ | |
}, | |
/* TcpHelloMessage */ | |
{ | |
UA_TYPENAME("TcpHelloMessage") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {0}}, /* .typeId */ | |
sizeof(UA_TcpHelloMessage), /* .memSize */ | |
UA_TRANSPORT_TCPHELLOMESSAGE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
6, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
TcpHelloMessage_members /* .members */ | |
}, | |
/* TcpAcknowledgeMessage */ | |
{ | |
UA_TYPENAME("TcpAcknowledgeMessage") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {0}}, /* .typeId */ | |
sizeof(UA_TcpAcknowledgeMessage), /* .memSize */ | |
UA_TRANSPORT_TCPACKNOWLEDGEMESSAGE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
true, /* .pointerFree */ | |
false, /* .overlayable */ | |
5, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
TcpAcknowledgeMessage_members /* .members */ | |
}, | |
/* TcpErrorMessage */ | |
{ | |
UA_TYPENAME("TcpErrorMessage") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {0}}, /* .typeId */ | |
sizeof(UA_TcpErrorMessage), /* .memSize */ | |
UA_TRANSPORT_TCPERRORMESSAGE, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
TcpErrorMessage_members /* .members */ | |
}, | |
/* SecureConversationMessageHeader */ | |
{ | |
UA_TYPENAME("SecureConversationMessageHeader") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {0}}, /* .typeId */ | |
sizeof(UA_SecureConversationMessageHeader), /* .memSize */ | |
UA_TRANSPORT_SECURECONVERSATIONMESSAGEHEADER, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
true, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
SecureConversationMessageHeader_members /* .members */ | |
}, | |
/* AsymmetricAlgorithmSecurityHeader */ | |
{ | |
UA_TYPENAME("AsymmetricAlgorithmSecurityHeader") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {0}}, /* .typeId */ | |
sizeof(UA_AsymmetricAlgorithmSecurityHeader), /* .memSize */ | |
UA_TRANSPORT_ASYMMETRICALGORITHMSECURITYHEADER, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
3, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
AsymmetricAlgorithmSecurityHeader_members /* .members */ | |
}, | |
/* SymmetricAlgorithmSecurityHeader */ | |
{ | |
UA_TYPENAME("SymmetricAlgorithmSecurityHeader") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {0}}, /* .typeId */ | |
sizeof(UA_SymmetricAlgorithmSecurityHeader), /* .memSize */ | |
UA_TRANSPORT_SYMMETRICALGORITHMSECURITYHEADER, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
true, /* .pointerFree */ | |
false, /* .overlayable */ | |
1, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
SymmetricAlgorithmSecurityHeader_members /* .members */ | |
}, | |
/* SequenceHeader */ | |
{ | |
UA_TYPENAME("SequenceHeader") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {0}}, /* .typeId */ | |
sizeof(UA_SequenceHeader), /* .memSize */ | |
UA_TRANSPORT_SEQUENCEHEADER, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
true, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
SequenceHeader_members /* .members */ | |
}, | |
/* SecureConversationMessageFooter */ | |
{ | |
UA_TYPENAME("SecureConversationMessageFooter") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {0}}, /* .typeId */ | |
sizeof(UA_SecureConversationMessageFooter), /* .memSize */ | |
UA_TRANSPORT_SECURECONVERSATIONMESSAGEFOOTER, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
SecureConversationMessageFooter_members /* .members */ | |
}, | |
/* SecureConversationMessageAbortBody */ | |
{ | |
UA_TYPENAME("SecureConversationMessageAbortBody") /* .typeName */ | |
{0, UA_NODEIDTYPE_NUMERIC, {0}}, /* .typeId */ | |
sizeof(UA_SecureConversationMessageAbortBody), /* .memSize */ | |
UA_TRANSPORT_SECURECONVERSATIONMESSAGEABORTBODY, /* .typeIndex */ | |
UA_DATATYPEKIND_STRUCTURE, /* .typeKind */ | |
false, /* .pointerFree */ | |
false, /* .overlayable */ | |
2, /* .membersSize */ | |
0, /* .binaryEncodingId */ | |
SecureConversationMessageAbortBody_members /* .members */ | |
}, | |
}; | |
/*********************************** amalgamated original file "E:/Librarys/open62541/build32/src_generated/open62541/statuscodes.c" ***********************************/ | |
/********************************************************** | |
* Autogenerated -- do not modify | |
* Generated from E:/Librarys/open62541/tools/schema/StatusCode.csv with script E:/Librarys/open62541/tools/generate_statuscode_descriptions.py | |
*********************************************************/ | |
typedef struct { | |
UA_StatusCode code; | |
const char *name; | |
} UA_StatusCodeName; | |
#ifndef UA_ENABLE_STATUSCODE_DESCRIPTIONS | |
static const char * emptyStatusCodeName = ""; | |
const char * UA_StatusCode_name(UA_StatusCode code) { | |
return emptyStatusCodeName; | |
} | |
#else | |
static const size_t statusCodeDescriptionsSize = 237; | |
static const UA_StatusCodeName statusCodeDescriptions[237] = { | |
{UA_STATUSCODE_GOOD, "Good"}, | |
{UA_STATUSCODE_BADUNEXPECTEDERROR, "BadUnexpectedError"}, | |
{UA_STATUSCODE_BADINTERNALERROR, "BadInternalError"}, | |
{UA_STATUSCODE_BADOUTOFMEMORY, "BadOutOfMemory"}, | |
{UA_STATUSCODE_BADRESOURCEUNAVAILABLE, "BadResourceUnavailable"}, | |
{UA_STATUSCODE_BADCOMMUNICATIONERROR, "BadCommunicationError"}, | |
{UA_STATUSCODE_BADENCODINGERROR, "BadEncodingError"}, | |
{UA_STATUSCODE_BADDECODINGERROR, "BadDecodingError"}, | |
{UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED, "BadEncodingLimitsExceeded"}, | |
{UA_STATUSCODE_BADREQUESTTOOLARGE, "BadRequestTooLarge"}, | |
{UA_STATUSCODE_BADRESPONSETOOLARGE, "BadResponseTooLarge"}, | |
{UA_STATUSCODE_BADUNKNOWNRESPONSE, "BadUnknownResponse"}, | |
{UA_STATUSCODE_BADTIMEOUT, "BadTimeout"}, | |
{UA_STATUSCODE_BADSERVICEUNSUPPORTED, "BadServiceUnsupported"}, | |
{UA_STATUSCODE_BADSHUTDOWN, "BadShutdown"}, | |
{UA_STATUSCODE_BADSERVERNOTCONNECTED, "BadServerNotConnected"}, | |
{UA_STATUSCODE_BADSERVERHALTED, "BadServerHalted"}, | |
{UA_STATUSCODE_BADNOTHINGTODO, "BadNothingToDo"}, | |
{UA_STATUSCODE_BADTOOMANYOPERATIONS, "BadTooManyOperations"}, | |
{UA_STATUSCODE_BADTOOMANYMONITOREDITEMS, "BadTooManyMonitoredItems"}, | |
{UA_STATUSCODE_BADDATATYPEIDUNKNOWN, "BadDataTypeIdUnknown"}, | |
{UA_STATUSCODE_BADCERTIFICATEINVALID, "BadCertificateInvalid"}, | |
{UA_STATUSCODE_BADSECURITYCHECKSFAILED, "BadSecurityChecksFailed"}, | |
{UA_STATUSCODE_BADCERTIFICATEPOLICYCHECKFAILED, "BadCertificatePolicyCheckFailed"}, | |
{UA_STATUSCODE_BADCERTIFICATETIMEINVALID, "BadCertificateTimeInvalid"}, | |
{UA_STATUSCODE_BADCERTIFICATEISSUERTIMEINVALID, "BadCertificateIssuerTimeInvalid"}, | |
{UA_STATUSCODE_BADCERTIFICATEHOSTNAMEINVALID, "BadCertificateHostNameInvalid"}, | |
{UA_STATUSCODE_BADCERTIFICATEURIINVALID, "BadCertificateUriInvalid"}, | |
{UA_STATUSCODE_BADCERTIFICATEUSENOTALLOWED, "BadCertificateUseNotAllowed"}, | |
{UA_STATUSCODE_BADCERTIFICATEISSUERUSENOTALLOWED, "BadCertificateIssuerUseNotAllowed"}, | |
{UA_STATUSCODE_BADCERTIFICATEUNTRUSTED, "BadCertificateUntrusted"}, | |
{UA_STATUSCODE_BADCERTIFICATEREVOCATIONUNKNOWN, "BadCertificateRevocationUnknown"}, | |
{UA_STATUSCODE_BADCERTIFICATEISSUERREVOCATIONUNKNOWN, "BadCertificateIssuerRevocationUnknown"}, | |
{UA_STATUSCODE_BADCERTIFICATEREVOKED, "BadCertificateRevoked"}, | |
{UA_STATUSCODE_BADCERTIFICATEISSUERREVOKED, "BadCertificateIssuerRevoked"}, | |
{UA_STATUSCODE_BADCERTIFICATECHAININCOMPLETE, "BadCertificateChainIncomplete"}, | |
{UA_STATUSCODE_BADUSERACCESSDENIED, "BadUserAccessDenied"}, | |
{UA_STATUSCODE_BADIDENTITYTOKENINVALID, "BadIdentityTokenInvalid"}, | |
{UA_STATUSCODE_BADIDENTITYTOKENREJECTED, "BadIdentityTokenRejected"}, | |
{UA_STATUSCODE_BADSECURECHANNELIDINVALID, "BadSecureChannelIdInvalid"}, | |
{UA_STATUSCODE_BADINVALIDTIMESTAMP, "BadInvalidTimestamp"}, | |
{UA_STATUSCODE_BADNONCEINVALID, "BadNonceInvalid"}, | |
{UA_STATUSCODE_BADSESSIONIDINVALID, "BadSessionIdInvalid"}, | |
{UA_STATUSCODE_BADSESSIONCLOSED, "BadSessionClosed"}, | |
{UA_STATUSCODE_BADSESSIONNOTACTIVATED, "BadSessionNotActivated"}, | |
{UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID, "BadSubscriptionIdInvalid"}, | |
{UA_STATUSCODE_BADREQUESTHEADERINVALID, "BadRequestHeaderInvalid"}, | |
{UA_STATUSCODE_BADTIMESTAMPSTORETURNINVALID, "BadTimestampsToReturnInvalid"}, | |
{UA_STATUSCODE_BADREQUESTCANCELLEDBYCLIENT, "BadRequestCancelledByClient"}, | |
{UA_STATUSCODE_BADTOOMANYARGUMENTS, "BadTooManyArguments"}, | |
{UA_STATUSCODE_BADLICENSEEXPIRED, "BadLicenseExpired"}, | |
{UA_STATUSCODE_BADLICENSELIMITSEXCEEDED, "BadLicenseLimitsExceeded"}, | |
{UA_STATUSCODE_BADLICENSENOTAVAILABLE, "BadLicenseNotAvailable"}, | |
{UA_STATUSCODE_GOODSUBSCRIPTIONTRANSFERRED, "GoodSubscriptionTransferred"}, | |
{UA_STATUSCODE_GOODCOMPLETESASYNCHRONOUSLY, "GoodCompletesAsynchronously"}, | |
{UA_STATUSCODE_GOODOVERLOAD, "GoodOverload"}, | |
{UA_STATUSCODE_GOODCLAMPED, "GoodClamped"}, | |
{UA_STATUSCODE_BADNOCOMMUNICATION, "BadNoCommunication"}, | |
{UA_STATUSCODE_BADWAITINGFORINITIALDATA, "BadWaitingForInitialData"}, | |
{UA_STATUSCODE_BADNODEIDINVALID, "BadNodeIdInvalid"}, | |
{UA_STATUSCODE_BADNODEIDUNKNOWN, "BadNodeIdUnknown"}, | |
{UA_STATUSCODE_BADATTRIBUTEIDINVALID, "BadAttributeIdInvalid"}, | |
{UA_STATUSCODE_BADINDEXRANGEINVALID, "BadIndexRangeInvalid"}, | |
{UA_STATUSCODE_BADINDEXRANGENODATA, "BadIndexRangeNoData"}, | |
{UA_STATUSCODE_BADDATAENCODINGINVALID, "BadDataEncodingInvalid"}, | |
{UA_STATUSCODE_BADDATAENCODINGUNSUPPORTED, "BadDataEncodingUnsupported"}, | |
{UA_STATUSCODE_BADNOTREADABLE, "BadNotReadable"}, | |
{UA_STATUSCODE_BADNOTWRITABLE, "BadNotWritable"}, | |
{UA_STATUSCODE_BADOUTOFRANGE, "BadOutOfRange"}, | |
{UA_STATUSCODE_BADNOTSUPPORTED, "BadNotSupported"}, | |
{UA_STATUSCODE_BADNOTFOUND, "BadNotFound"}, | |
{UA_STATUSCODE_BADOBJECTDELETED, "BadObjectDeleted"}, | |
{UA_STATUSCODE_BADNOTIMPLEMENTED, "BadNotImplemented"}, | |
{UA_STATUSCODE_BADMONITORINGMODEINVALID, "BadMonitoringModeInvalid"}, | |
{UA_STATUSCODE_BADMONITOREDITEMIDINVALID, "BadMonitoredItemIdInvalid"}, | |
{UA_STATUSCODE_BADMONITOREDITEMFILTERINVALID, "BadMonitoredItemFilterInvalid"}, | |
{UA_STATUSCODE_BADMONITOREDITEMFILTERUNSUPPORTED, "BadMonitoredItemFilterUnsupported"}, | |
{UA_STATUSCODE_BADFILTERNOTALLOWED, "BadFilterNotAllowed"}, | |
{UA_STATUSCODE_BADSTRUCTUREMISSING, "BadStructureMissing"}, | |
{UA_STATUSCODE_BADEVENTFILTERINVALID, "BadEventFilterInvalid"}, | |
{UA_STATUSCODE_BADCONTENTFILTERINVALID, "BadContentFilterInvalid"}, | |
{UA_STATUSCODE_BADFILTEROPERATORINVALID, "BadFilterOperatorInvalid"}, | |
{UA_STATUSCODE_BADFILTEROPERATORUNSUPPORTED, "BadFilterOperatorUnsupported"}, | |
{UA_STATUSCODE_BADFILTEROPERANDCOUNTMISMATCH, "BadFilterOperandCountMismatch"}, | |
{UA_STATUSCODE_BADFILTEROPERANDINVALID, "BadFilterOperandInvalid"}, | |
{UA_STATUSCODE_BADFILTERELEMENTINVALID, "BadFilterElementInvalid"}, | |
{UA_STATUSCODE_BADFILTERLITERALINVALID, "BadFilterLiteralInvalid"}, | |
{UA_STATUSCODE_BADCONTINUATIONPOINTINVALID, "BadContinuationPointInvalid"}, | |
{UA_STATUSCODE_BADNOCONTINUATIONPOINTS, "BadNoContinuationPoints"}, | |
{UA_STATUSCODE_BADREFERENCETYPEIDINVALID, "BadReferenceTypeIdInvalid"}, | |
{UA_STATUSCODE_BADBROWSEDIRECTIONINVALID, "BadBrowseDirectionInvalid"}, | |
{UA_STATUSCODE_BADNODENOTINVIEW, "BadNodeNotInView"}, | |
{UA_STATUSCODE_BADNUMERICOVERFLOW, "BadNumericOverflow"}, | |
{UA_STATUSCODE_BADSERVERURIINVALID, "BadServerUriInvalid"}, | |
{UA_STATUSCODE_BADSERVERNAMEMISSING, "BadServerNameMissing"}, | |
{UA_STATUSCODE_BADDISCOVERYURLMISSING, "BadDiscoveryUrlMissing"}, | |
{UA_STATUSCODE_BADSEMPAHOREFILEMISSING, "BadSempahoreFileMissing"}, | |
{UA_STATUSCODE_BADREQUESTTYPEINVALID, "BadRequestTypeInvalid"}, | |
{UA_STATUSCODE_BADSECURITYMODEREJECTED, "BadSecurityModeRejected"}, | |
{UA_STATUSCODE_BADSECURITYPOLICYREJECTED, "BadSecurityPolicyRejected"}, | |
{UA_STATUSCODE_BADTOOMANYSESSIONS, "BadTooManySessions"}, | |
{UA_STATUSCODE_BADUSERSIGNATUREINVALID, "BadUserSignatureInvalid"}, | |
{UA_STATUSCODE_BADAPPLICATIONSIGNATUREINVALID, "BadApplicationSignatureInvalid"}, | |
{UA_STATUSCODE_BADNOVALIDCERTIFICATES, "BadNoValidCertificates"}, | |
{UA_STATUSCODE_BADIDENTITYCHANGENOTSUPPORTED, "BadIdentityChangeNotSupported"}, | |
{UA_STATUSCODE_BADREQUESTCANCELLEDBYREQUEST, "BadRequestCancelledByRequest"}, | |
{UA_STATUSCODE_BADPARENTNODEIDINVALID, "BadParentNodeIdInvalid"}, | |
{UA_STATUSCODE_BADREFERENCENOTALLOWED, "BadReferenceNotAllowed"}, | |
{UA_STATUSCODE_BADNODEIDREJECTED, "BadNodeIdRejected"}, | |
{UA_STATUSCODE_BADNODEIDEXISTS, "BadNodeIdExists"}, | |
{UA_STATUSCODE_BADNODECLASSINVALID, "BadNodeClassInvalid"}, | |
{UA_STATUSCODE_BADBROWSENAMEINVALID, "BadBrowseNameInvalid"}, | |
{UA_STATUSCODE_BADBROWSENAMEDUPLICATED, "BadBrowseNameDuplicated"}, | |
{UA_STATUSCODE_BADNODEATTRIBUTESINVALID, "BadNodeAttributesInvalid"}, | |
{UA_STATUSCODE_BADTYPEDEFINITIONINVALID, "BadTypeDefinitionInvalid"}, | |
{UA_STATUSCODE_BADSOURCENODEIDINVALID, "BadSourceNodeIdInvalid"}, | |
{UA_STATUSCODE_BADTARGETNODEIDINVALID, "BadTargetNodeIdInvalid"}, | |
{UA_STATUSCODE_BADDUPLICATEREFERENCENOTALLOWED, "BadDuplicateReferenceNotAllowed"}, | |
{UA_STATUSCODE_BADINVALIDSELFREFERENCE, "BadInvalidSelfReference"}, | |
{UA_STATUSCODE_BADREFERENCELOCALONLY, "BadReferenceLocalOnly"}, | |
{UA_STATUSCODE_BADNODELETERIGHTS, "BadNoDeleteRights"}, | |
{UA_STATUSCODE_UNCERTAINREFERENCENOTDELETED, "UncertainReferenceNotDeleted"}, | |
{UA_STATUSCODE_BADSERVERINDEXINVALID, "BadServerIndexInvalid"}, | |
{UA_STATUSCODE_BADVIEWIDUNKNOWN, "BadViewIdUnknown"}, | |
{UA_STATUSCODE_BADVIEWTIMESTAMPINVALID, "BadViewTimestampInvalid"}, | |
{UA_STATUSCODE_BADVIEWPARAMETERMISMATCH, "BadViewParameterMismatch"}, | |
{UA_STATUSCODE_BADVIEWVERSIONINVALID, "BadViewVersionInvalid"}, | |
{UA_STATUSCODE_UNCERTAINNOTALLNODESAVAILABLE, "UncertainNotAllNodesAvailable"}, | |
{UA_STATUSCODE_GOODRESULTSMAYBEINCOMPLETE, "GoodResultsMayBeIncomplete"}, | |
{UA_STATUSCODE_BADNOTTYPEDEFINITION, "BadNotTypeDefinition"}, | |
{UA_STATUSCODE_UNCERTAINREFERENCEOUTOFSERVER, "UncertainReferenceOutOfServer"}, | |
{UA_STATUSCODE_BADTOOMANYMATCHES, "BadTooManyMatches"}, | |
{UA_STATUSCODE_BADQUERYTOOCOMPLEX, "BadQueryTooComplex"}, | |
{UA_STATUSCODE_BADNOMATCH, "BadNoMatch"}, | |
{UA_STATUSCODE_BADMAXAGEINVALID, "BadMaxAgeInvalid"}, | |
{UA_STATUSCODE_BADSECURITYMODEINSUFFICIENT, "BadSecurityModeInsufficient"}, | |
{UA_STATUSCODE_BADHISTORYOPERATIONINVALID, "BadHistoryOperationInvalid"}, | |
{UA_STATUSCODE_BADHISTORYOPERATIONUNSUPPORTED, "BadHistoryOperationUnsupported"}, | |
{UA_STATUSCODE_BADINVALIDTIMESTAMPARGUMENT, "BadInvalidTimestampArgument"}, | |
{UA_STATUSCODE_BADWRITENOTSUPPORTED, "BadWriteNotSupported"}, | |
{UA_STATUSCODE_BADTYPEMISMATCH, "BadTypeMismatch"}, | |
{UA_STATUSCODE_BADMETHODINVALID, "BadMethodInvalid"}, | |
{UA_STATUSCODE_BADARGUMENTSMISSING, "BadArgumentsMissing"}, | |
{UA_STATUSCODE_BADNOTEXECUTABLE, "BadNotExecutable"}, | |
{UA_STATUSCODE_BADTOOMANYSUBSCRIPTIONS, "BadTooManySubscriptions"}, | |
{UA_STATUSCODE_BADTOOMANYPUBLISHREQUESTS, "BadTooManyPublishRequests"}, | |
{UA_STATUSCODE_BADNOSUBSCRIPTION, "BadNoSubscription"}, | |
{UA_STATUSCODE_BADSEQUENCENUMBERUNKNOWN, "BadSequenceNumberUnknown"}, | |
{UA_STATUSCODE_BADMESSAGENOTAVAILABLE, "BadMessageNotAvailable"}, | |
{UA_STATUSCODE_BADINSUFFICIENTCLIENTPROFILE, "BadInsufficientClientProfile"}, | |
{UA_STATUSCODE_BADSTATENOTACTIVE, "BadStateNotActive"}, | |
{UA_STATUSCODE_BADALREADYEXISTS, "BadAlreadyExists"}, | |
{UA_STATUSCODE_BADTCPSERVERTOOBUSY, "BadTcpServerTooBusy"}, | |
{UA_STATUSCODE_BADTCPMESSAGETYPEINVALID, "BadTcpMessageTypeInvalid"}, | |
{UA_STATUSCODE_BADTCPSECURECHANNELUNKNOWN, "BadTcpSecureChannelUnknown"}, | |
{UA_STATUSCODE_BADTCPMESSAGETOOLARGE, "BadTcpMessageTooLarge"}, | |
{UA_STATUSCODE_BADTCPNOTENOUGHRESOURCES, "BadTcpNotEnoughResources"}, | |
{UA_STATUSCODE_BADTCPINTERNALERROR, "BadTcpInternalError"}, | |
{UA_STATUSCODE_BADTCPENDPOINTURLINVALID, "BadTcpEndpointUrlInvalid"}, | |
{UA_STATUSCODE_BADREQUESTINTERRUPTED, "BadRequestInterrupted"}, | |
{UA_STATUSCODE_BADREQUESTTIMEOUT, "BadRequestTimeout"}, | |
{UA_STATUSCODE_BADSECURECHANNELCLOSED, "BadSecureChannelClosed"}, | |
{UA_STATUSCODE_BADSECURECHANNELTOKENUNKNOWN, "BadSecureChannelTokenUnknown"}, | |
{UA_STATUSCODE_BADSEQUENCENUMBERINVALID, "BadSequenceNumberInvalid"}, | |
{UA_STATUSCODE_BADPROTOCOLVERSIONUNSUPPORTED, "BadProtocolVersionUnsupported"}, | |
{UA_STATUSCODE_BADCONFIGURATIONERROR, "BadConfigurationError"}, | |
{UA_STATUSCODE_BADNOTCONNECTED, "BadNotConnected"}, | |
{UA_STATUSCODE_BADDEVICEFAILURE, "BadDeviceFailure"}, | |
{UA_STATUSCODE_BADSENSORFAILURE, "BadSensorFailure"}, | |
{UA_STATUSCODE_BADOUTOFSERVICE, "BadOutOfService"}, | |
{UA_STATUSCODE_BADDEADBANDFILTERINVALID, "BadDeadbandFilterInvalid"}, | |
{UA_STATUSCODE_UNCERTAINNOCOMMUNICATIONLASTUSABLEVALUE, "UncertainNoCommunicationLastUsableValue"}, | |
{UA_STATUSCODE_UNCERTAINLASTUSABLEVALUE, "UncertainLastUsableValue"}, | |
{UA_STATUSCODE_UNCERTAINSUBSTITUTEVALUE, "UncertainSubstituteValue"}, | |
{UA_STATUSCODE_UNCERTAININITIALVALUE, "UncertainInitialValue"}, | |
{UA_STATUSCODE_UNCERTAINSENSORNOTACCURATE, "UncertainSensorNotAccurate"}, | |
{UA_STATUSCODE_UNCERTAINENGINEERINGUNITSEXCEEDED, "UncertainEngineeringUnitsExceeded"}, | |
{UA_STATUSCODE_UNCERTAINSUBNORMAL, "UncertainSubNormal"}, | |
{UA_STATUSCODE_GOODLOCALOVERRIDE, "GoodLocalOverride"}, | |
{UA_STATUSCODE_BADREFRESHINPROGRESS, "BadRefreshInProgress"}, | |
{UA_STATUSCODE_BADCONDITIONALREADYDISABLED, "BadConditionAlreadyDisabled"}, | |
{UA_STATUSCODE_BADCONDITIONALREADYENABLED, "BadConditionAlreadyEnabled"}, | |
{UA_STATUSCODE_BADCONDITIONDISABLED, "BadConditionDisabled"}, | |
{UA_STATUSCODE_BADEVENTIDUNKNOWN, "BadEventIdUnknown"}, | |
{UA_STATUSCODE_BADEVENTNOTACKNOWLEDGEABLE, "BadEventNotAcknowledgeable"}, | |
{UA_STATUSCODE_BADDIALOGNOTACTIVE, "BadDialogNotActive"}, | |
{UA_STATUSCODE_BADDIALOGRESPONSEINVALID, "BadDialogResponseInvalid"}, | |
{UA_STATUSCODE_BADCONDITIONBRANCHALREADYACKED, "BadConditionBranchAlreadyAcked"}, | |
{UA_STATUSCODE_BADCONDITIONBRANCHALREADYCONFIRMED, "BadConditionBranchAlreadyConfirmed"}, | |
{UA_STATUSCODE_BADCONDITIONALREADYSHELVED, "BadConditionAlreadyShelved"}, | |
{UA_STATUSCODE_BADCONDITIONNOTSHELVED, "BadConditionNotShelved"}, | |
{UA_STATUSCODE_BADSHELVINGTIMEOUTOFRANGE, "BadShelvingTimeOutOfRange"}, | |
{UA_STATUSCODE_BADNODATA, "BadNoData"}, | |
{UA_STATUSCODE_BADBOUNDNOTFOUND, "BadBoundNotFound"}, | |
{UA_STATUSCODE_BADBOUNDNOTSUPPORTED, "BadBoundNotSupported"}, | |
{UA_STATUSCODE_BADDATALOST, "BadDataLost"}, | |
{UA_STATUSCODE_BADDATAUNAVAILABLE, "BadDataUnavailable"}, | |
{UA_STATUSCODE_BADENTRYEXISTS, "BadEntryExists"}, | |
{UA_STATUSCODE_BADNOENTRYEXISTS, "BadNoEntryExists"}, | |
{UA_STATUSCODE_BADTIMESTAMPNOTSUPPORTED, "BadTimestampNotSupported"}, | |
{UA_STATUSCODE_GOODENTRYINSERTED, "GoodEntryInserted"}, | |
{UA_STATUSCODE_GOODENTRYREPLACED, "GoodEntryReplaced"}, | |
{UA_STATUSCODE_UNCERTAINDATASUBNORMAL, "UncertainDataSubNormal"}, | |
{UA_STATUSCODE_GOODNODATA, "GoodNoData"}, | |
{UA_STATUSCODE_GOODMOREDATA, "GoodMoreData"}, | |
{UA_STATUSCODE_BADAGGREGATELISTMISMATCH, "BadAggregateListMismatch"}, | |
{UA_STATUSCODE_BADAGGREGATENOTSUPPORTED, "BadAggregateNotSupported"}, | |
{UA_STATUSCODE_BADAGGREGATEINVALIDINPUTS, "BadAggregateInvalidInputs"}, | |
{UA_STATUSCODE_BADAGGREGATECONFIGURATIONREJECTED, "BadAggregateConfigurationRejected"}, | |
{UA_STATUSCODE_GOODDATAIGNORED, "GoodDataIgnored"}, | |
{UA_STATUSCODE_BADREQUESTNOTALLOWED, "BadRequestNotAllowed"}, | |
{UA_STATUSCODE_BADREQUESTNOTCOMPLETE, "BadRequestNotComplete"}, | |
{UA_STATUSCODE_GOODEDITED, "GoodEdited"}, | |
{UA_STATUSCODE_GOODPOSTACTIONFAILED, "GoodPostActionFailed"}, | |
{UA_STATUSCODE_UNCERTAINDOMINANTVALUECHANGED, "UncertainDominantValueChanged"}, | |
{UA_STATUSCODE_GOODDEPENDENTVALUECHANGED, "GoodDependentValueChanged"}, | |
{UA_STATUSCODE_BADDOMINANTVALUECHANGED, "BadDominantValueChanged"}, | |
{UA_STATUSCODE_UNCERTAINDEPENDENTVALUECHANGED, "UncertainDependentValueChanged"}, | |
{UA_STATUSCODE_BADDEPENDENTVALUECHANGED, "BadDependentValueChanged"}, | |
{UA_STATUSCODE_GOODCOMMUNICATIONEVENT, "GoodCommunicationEvent"}, | |
{UA_STATUSCODE_GOODSHUTDOWNEVENT, "GoodShutdownEvent"}, | |
{UA_STATUSCODE_GOODCALLAGAIN, "GoodCallAgain"}, | |
{UA_STATUSCODE_GOODNONCRITICALTIMEOUT, "GoodNonCriticalTimeout"}, | |
{UA_STATUSCODE_BADINVALIDARGUMENT, "BadInvalidArgument"}, | |
{UA_STATUSCODE_BADCONNECTIONREJECTED, "BadConnectionRejected"}, | |
{UA_STATUSCODE_BADDISCONNECT, "BadDisconnect"}, | |
{UA_STATUSCODE_BADCONNECTIONCLOSED, "BadConnectionClosed"}, | |
{UA_STATUSCODE_BADINVALIDSTATE, "BadInvalidState"}, | |
{UA_STATUSCODE_BADENDOFSTREAM, "BadEndOfStream"}, | |
{UA_STATUSCODE_BADNODATAAVAILABLE, "BadNoDataAvailable"}, | |
{UA_STATUSCODE_BADWAITINGFORRESPONSE, "BadWaitingForResponse"}, | |
{UA_STATUSCODE_BADOPERATIONABANDONED, "BadOperationAbandoned"}, | |
{UA_STATUSCODE_BADEXPECTEDSTREAMTOBLOCK, "BadExpectedStreamToBlock"}, | |
{UA_STATUSCODE_BADWOULDBLOCK, "BadWouldBlock"}, | |
{UA_STATUSCODE_BADSYNTAXERROR, "BadSyntaxError"}, | |
{UA_STATUSCODE_BADMAXCONNECTIONSREACHED, "BadMaxConnectionsReached"}, | |
{0xffffffff, "Unknown StatusCode"} | |
}; | |
const char * UA_StatusCode_name(UA_StatusCode code) { | |
for (size_t i = 0; i < statusCodeDescriptionsSize; ++i) { | |
if (statusCodeDescriptions[i].code == code) | |
return statusCodeDescriptions[i].name; | |
} | |
return statusCodeDescriptions[statusCodeDescriptionsSize-1].name; | |
} | |
#endif | |
/*********************************** amalgamated original file "E:/Librarys/open62541/src/ua_util.c" ***********************************/ | |
/* This Source Code Form is subject to the terms of the Mozilla Public | |
* License, v. 2.0. If a copy of the MPL was not distributed with this | |
* file, You can obtain one at http://mozilla.org/MPL/2.0/. | |
* | |
* Copyright 2014, 2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) | |
* Copyright 2014 (c) Florian Palm | |
* Copyright 2017 (c) Stefan Profanter, fortiss GmbH | |
*/ | |
size_t | |
UA_readNumberWithBase(const UA_Byte *buf, size_t buflen, UA_UInt32 *number, UA_Byte base) { | |
UA_assert(buf); | |
UA_assert(number); | |
u32 n = 0; | |
size_t progress = 0; | |
/* read numbers until the end or a non-number character appears */ | |
while(progress < buflen) { | |
u8 c = buf[progress]; | |
if(c >= '0' && c <= '9' && c <= '0' + (base-1)) | |
n = (n * base) + c - '0'; | |
else if(base > 9 && c >= 'a' && c <= 'z' && c <= 'a' + (base-11)) | |
n = (n * base) + c-'a' + 10; | |
else if(base > 9 && c >= 'A' && c <= 'Z' && c <= 'A' + (base-11)) | |
n = (n * base) + c-'A' + 10; | |
else | |
break; | |
++progress; | |
} | |
*number = n; | |
return progress; | |
} | |
size_t | |
UA_readNumber(UA_Byte *buf, size_t buflen, UA_UInt32 *number) | |
{ | |
return UA_readNumberWithBase(buf, buflen, number, 10); | |
} | |
UA_StatusCode | |
UA_parseEndpointUrl(const UA_String *endpointUrl, UA_String *outHostname, | |
u16 *outPort, UA_String *outPath) { | |
/* Url must begin with "opc.tcp://" or opc.udp:// (if pubsub enabled) */ | |
if(endpointUrl->length < 11) { | |
return UA_STATUSCODE_BADTCPENDPOINTURLINVALID; | |
} | |
if (strncmp((char*)endpointUrl->data, "opc.tcp://", 10) != 0) { | |
#ifdef UA_ENABLE_PUBSUB | |
if (strncmp((char*)endpointUrl->data, "opc.udp://", 10) != 0 && | |
strncmp((char*)endpointUrl->data, "opc.mqtt://", 11) != 0) { | |
return UA_STATUSCODE_BADTCPENDPOINTURLINVALID; | |
} | |
#else | |
return UA_STATUSCODE_BADTCPENDPOINTURLINVALID; | |
#endif | |
} | |
/* Where does the hostname end? */ | |
size_t curr = 10; | |
if(endpointUrl->data[curr] == '[') { | |
/* IPv6: opc.tcp://[2001:0db8:85a3::8a2e:0370:7334]:1234/path */ | |
for(; curr < endpointUrl->length; ++curr) { | |
if(endpointUrl->data[curr] == ']') | |
break; | |
} | |
if(curr == endpointUrl->length) | |
return UA_STATUSCODE_BADTCPENDPOINTURLINVALID; | |
curr++; | |
} else { | |
/* IPv4 or hostname: opc.tcp://something.something:1234/path */ | |
for(; curr < endpointUrl->length; ++curr) { | |
if(endpointUrl->data[curr] == ':' || endpointUrl->data[curr] == '/') | |
break; | |
} | |
} | |
/* Set the hostname */ | |
outHostname->data = &endpointUrl->data[10]; | |
outHostname->length = curr - 10; | |
if(curr == endpointUrl->length) | |
return UA_STATUSCODE_GOOD; | |
/* Set the port */ | |
if(endpointUrl->data[curr] == ':') { | |
if(++curr == endpointUrl->length) | |
return UA_STATUSCODE_BADTCPENDPOINTURLINVALID; | |
u32 largeNum; | |
size_t progress = UA_readNumber(&endpointUrl->data[curr], endpointUrl->length - curr, &largeNum); | |
if(progress == 0 || largeNum > 65535) | |
return UA_STATUSCODE_BADTCPENDPOINTURLINVALID; | |
/* Test if the end of a valid port was reached */ | |
curr += progress; | |
if(curr == endpointUrl->length || endpointUrl->data[curr] == '/') | |
*outPort = (u16)largeNum; | |
if(curr == endpointUrl->length) | |
return UA_STATUSCODE_GOOD; | |
} | |
/* Set the path */ | |
UA_assert(curr < endpointUrl->length); | |
if(endpointUrl->data[curr] != '/') | |
return UA_STATUSCODE_BADTCPENDPOINTURLINVALID; | |
if(++curr == endpointUrl->length) | |
return UA_STATUSCODE_GOOD; | |
outPath->data = &endpointUrl->data[curr]; | |
outPath->length = endpointUrl->length - curr; | |
/* Remove trailing slash from the path */ | |
if(endpointUrl->data[endpointUrl->length - 1] == '/') | |
outPath->length--; | |
return UA_STATUSCODE_GOOD; | |
} | |
UA_StatusCode | |
UA_parseEndpointUrlEthernet(const UA_String *endpointUrl, UA_String *target, | |
UA_UInt16 *vid, UA_Byte *pcp) { | |
/* Url must begin with "opc.eth://" */ | |
if(endpointUrl->length < 11) { | |
return UA_STATUSCODE_BADINTERNALERROR; | |
} | |
if(strncmp((char*) endpointUrl->data, "opc.eth://", 10) != 0) { | |
return UA_STATUSCODE_BADINTERNALERROR; | |
} | |
/* Where does the host address end? */ | |
size_t curr = 10; | |
for(; curr < endpointUrl->length; ++curr) { | |
if(endpointUrl->data[curr] == ':') { | |
break; | |
} | |
} | |
/* set host address */ | |
target->data = &endpointUrl->data[10]; | |
target->length = curr - 10; | |
if(curr == endpointUrl->length) { | |
return UA_STATUSCODE_GOOD; | |
} | |
/* Set VLAN */ | |
u32 value = 0; | |
curr++; /* skip ':' */ | |
size_t progress = UA_readNumber(&endpointUrl->data[curr], | |
endpointUrl->length - curr, &value); | |
if(progress == 0 || value > 4096) { | |
return UA_STATUSCODE_BADINTERNALERROR; | |
} | |
curr += progress; | |
if(curr == endpointUrl->length || endpointUrl->data[curr] == '.') { | |
*vid = (UA_UInt16) value; | |
} | |
if(curr == endpointUrl->length) { | |
return UA_STATUSCODE_GOOD; | |
} | |
/* Set priority */ | |
if(endpointUrl->data[curr] != '.') { | |
return UA_STATUSCODE_BADINTERNALERROR; | |
} | |
curr++; /* skip '.' */ | |
progress = UA_readNumber(&endpointUrl->data[curr], | |
endpointUrl->length - curr, &value); | |
if(progress == 0 || value > 7) { | |
return UA_STATUSCODE_BADINTERNALERROR; | |
} | |
curr += progress; | |
if(curr != endpointUrl->length) { | |
return UA_STATUSCODE_BADINTERNALERROR; | |
} | |
*pcp = (UA_Byte) value; | |
return UA_STATUSCODE_GOOD; | |
} | |
UA_StatusCode UA_ByteString_toBase64String(const UA_ByteString *byteString, UA_String *str) { | |
if (str->length != 0) { | |
UA_free(str->data); | |
str->data = NULL; | |
str->length = 0; | |
} | |
if (byteString == NULL || byteString->data == NULL) | |
return UA_STATUSCODE_GOOD; | |
if (byteString == str) | |
return UA_STATUSCODE_BADINVALIDARGUMENT; | |
str->data = (UA_Byte*)UA_base64(byteString->data, | |
byteString->length, &str->length); | |
if(str->data == NULL) | |
return UA_STATUSCODE_BADOUTOFMEMORY; | |
return UA_STATUSCODE_GOOD; | |
} | |
UA_StatusCode | |
UA_NodeId_toString(const UA_NodeId *nodeId, UA_String *nodeIdStr) { | |
if (nodeIdStr->length != 0) { | |
UA_free(nodeIdStr->data); | |
nodeIdStr->data = NULL; | |
nodeIdStr->length = 0; | |
} | |
if (nodeId == NULL) | |
return UA_STATUSCODE_GOOD; | |
char *nsStr = NULL; | |
long snprintfLen = 0; | |
size_t nsLen = 0; | |
if (nodeId->namespaceIndex != 0) { | |
nsStr = (char*)UA_malloc(9+1); // strlen("ns=XXXXX;") = 9 + Nullbyte | |
snprintfLen = UA_snprintf(nsStr, 10, "ns=%d;", nodeId->namespaceIndex); | |
if (snprintfLen < 0 || snprintfLen >= 10) { | |
UA_free(nsStr); | |
return UA_STATUSCODE_BADINTERNALERROR; | |
} | |
nsLen = (size_t)(snprintfLen); | |
} | |
UA_ByteString byteStr = UA_BYTESTRING_NULL; | |
switch (nodeId->identifierType) { | |
case UA_NODEIDTYPE_NUMERIC: | |
/* ns (2 byte, 65535) = 5 chars, numeric (4 byte, 4294967295) = 10 chars, delim = 1 , nullbyte = 1-> 17 chars */ | |
nodeIdStr->length = nsLen + 2 + 10 + 1; | |
nodeIdStr->data = (UA_Byte*)UA_malloc(nodeIdStr->length); | |
if (nodeIdStr->data == NULL) { | |
nodeIdStr->length = 0; | |
UA_free(nsStr); | |
return UA_STATUSCODE_BADOUTOFMEMORY; | |
} | |
snprintfLen =UA_snprintf((char*)nodeIdStr->data, nodeIdStr->length, "%si=%lu", | |
nsLen > 0 ? nsStr : "", | |
(unsigned long )nodeId->identifier.numeric); | |
break; | |
case UA_NODEIDTYPE_STRING: | |
/* ns (16bit) = 5 chars, strlen + nullbyte */ | |
nodeIdStr->length = nsLen + 2 + nodeId->identifier.string.length + 1; | |
nodeIdStr->data = (UA_Byte*)UA_malloc(nodeIdStr->length); | |
if (nodeIdStr->data == NULL) { | |
nodeIdStr->length = 0; | |
UA_free(nsStr); | |
return UA_STATUSCODE_BADOUTOFMEMORY; | |
} | |
snprintfLen =UA_snprintf((char*)nodeIdStr->data, nodeIdStr->length, "%ss=%.*s", | |
nsLen > 0 ? nsStr : "", | |
(int)nodeId->identifier.string.length, nodeId->identifier.string.data); | |
break; | |
case UA_NODEIDTYPE_GUID: | |
/* ns (16bit) = 5 chars + strlen(A123456C-0ABC-1A2B-815F-687212AAEE1B)=36 + nullbyte */ | |
nodeIdStr->length = nsLen + 2 + 36 + 1; | |
nodeIdStr->data = (UA_Byte*)UA_malloc(nodeIdStr->length); | |
if (nodeIdStr->data == NULL) { | |
nodeIdStr->length = 0; | |
UA_free(nsStr); | |
return UA_STATUSCODE_BADOUTOFMEMORY; | |
} | |
snprintfLen = UA_snprintf((char*)nodeIdStr->data, nodeIdStr->length, "%sg=" UA_PRINTF_GUID_FORMAT, | |
nsLen > 0 ? nsStr : "", | |
UA_PRINTF_GUID_DATA(nodeId->identifier.guid)); | |
break; | |
case UA_NODEIDTYPE_BYTESTRING: | |
UA_ByteString_toBase64String(&nodeId->identifier.byteString, &byteStr); | |
/* ns (16bit) = 5 chars + LEN + nullbyte */ | |
nodeIdStr->length = nsLen + 2 + byteStr.length + 1; | |
nodeIdStr->data = (UA_Byte*)UA_malloc(nodeIdStr->length); | |
if (nodeIdStr->data == NULL) { | |
nodeIdStr->length = 0; | |
UA_String_deleteMembers(&byteStr); | |
UA_free(nsStr); | |
return UA_STATUSCODE_BADOUTOFMEMORY; | |
} | |
snprintfLen = UA_snprintf((char*)nodeIdStr->data, nodeIdStr->length, "%sb=%.*s", | |
nsLen > 0 ? nsStr : "", | |
(int)byteStr.length, byteStr.data); | |
UA_String_deleteMembers(&byteStr); | |
break; | |
} | |
UA_free(nsStr); | |
if (snprintfLen < 0 || snprintfLen >= (long) nodeIdStr->length) { | |
UA_free(nodeIdStr->data); | |
nodeIdStr->data = NULL; | |
nodeIdStr->length = 0; | |
return UA_STATUSCODE_BADINTERNALERROR; | |
} | |
nodeIdStr->length = (size_t)snprintfLen; | |
return UA_STATUSCODE_GOOD; | |
} | |
/*********************************** amalgamated original file "E:/Librarys/open62541/src/ua_workqueue.c" ***********************************/ | |
/* This Source Code Form is subject to the terms of the Mozilla Public | |
* License, v. 2.0. If a copy of the MPL was not distributed with this | |
* file, You can obtain one at http://mozilla.org/MPL/2.0/. | |
* | |
* Copyright 2014-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) | |
* Copyright 2014-2016 (c) Sten Grüner | |
* Copyright 2015 (c) Chris Iatrou | |
* Copyright 2015 (c) Nick Goossens | |
* Copyright 2015 (c) Jörg Schüler-Maroldt | |
* Copyright 2015-2016 (c) Oleksiy Vasylyev | |
* Copyright 2016-2017 (c) Florian Palm | |
* Copyright 2017 (c) Stefan Profanter, fortiss GmbH | |
* Copyright 2016 (c) Lorenz Haas | |
* Copyright 2017 (c) Jonas Green | |
*/ | |
void UA_WorkQueue_init(UA_WorkQueue *wq) { | |
/* Initialized the linked list for delayed callbacks */ | |
SIMPLEQ_INIT(&wq->delayedCallbacks); | |
#if UA_MULTITHREADING >= 200 | |
wq->delayedCallbacks_checkpoint = NULL; | |
UA_LOCK_INIT(wq->delayedCallbacks_accessMutex) | |
/* Initialize the dispatch queue for worker threads */ | |
SIMPLEQ_INIT(&wq->dispatchQueue); | |
UA_LOCK_INIT(wq->dispatchQueue_accessMutex) | |
pthread_cond_init(&wq->dispatchQueue_condition, NULL); | |
UA_LOCK_INIT(wq->dispatchQueue_conditionMutex) | |
#endif | |
} | |
#if UA_MULTITHREADING >= 200 | |
/* Forward declaration */ | |
static void UA_WorkQueue_manuallyProcessDelayed(UA_WorkQueue *wq); | |
#endif | |
void UA_WorkQueue_cleanup(UA_WorkQueue *wq) { | |
#if UA_MULTITHREADING >= 200 | |
/* Shut down workers */ | |
UA_WorkQueue_stop(wq); | |
/* Execute remaining work in the dispatch queue */ | |
while(true) { | |
UA_LOCK(wq->dispatchQueue_accessMutex); | |
UA_DelayedCallback *dc = SIMPLEQ_FIRST(&wq->dispatchQueue); | |
if(!dc) { | |
UA_UNLOCK(wq->dispatchQueue_accessMutex); | |
break; | |
} | |
SIMPLEQ_REMOVE_HEAD(&wq->dispatchQueue, next); | |
UA_UNLOCK(wq->dispatchQueue_accessMutex); | |
dc->callback(dc->application, dc->data); | |
UA_free(dc); | |
} | |
#endif | |
/* All workers are shut down. Execute remaining delayed work here. */ | |
UA_WorkQueue_manuallyProcessDelayed(wq); | |
#if UA_MULTITHREADING >= 200 | |
wq->delayedCallbacks_checkpoint = NULL; | |
UA_LOCK_DESTROY(wq->dispatchQueue_accessMutex); | |
pthread_cond_destroy(&wq->dispatchQueue_condition); | |
UA_LOCK_DESTROY(wq->dispatchQueue_conditionMutex); | |
UA_LOCK_DESTROY(wq->delayedCallbacks_accessMutex); | |
#endif | |
} | |
/***********/ | |
/* Workers */ | |
/***********/ | |
#if UA_MULTITHREADING >= 200 | |
static void * | |
workerLoop(UA_Worker *worker) { | |
UA_WorkQueue *wq = worker->queue; | |
UA_UInt32 *counter = &worker->counter; | |
volatile UA_Boolean *running = &worker->running; | |
/* Initialize the (thread local) random seed with the ram address | |
* of the worker. Not for security-critical entropy! */ | |
UA_random_seed((uintptr_t)worker); | |
while(*running) { | |
UA_atomic_addUInt32(counter, 1); | |
/* Remove a callback from the queue */ | |
UA_LOCK(wq->dispatchQueue_accessMutex); | |
UA_DelayedCallback *dc = SIMPLEQ_FIRST(&wq->dispatchQueue); | |
if(dc) | |
SIMPLEQ_REMOVE_HEAD(&wq->dispatchQueue, next); | |
UA_UNLOCK(wq->dispatchQueue_accessMutex); | |
/* Nothing to do. Sleep until a callback is dispatched */ | |
if(!dc) { | |
UA_LOCK(wq->dispatchQueue_conditionMutex); | |
pthread_cond_wait(&wq->dispatchQueue_condition, | |
&wq->dispatchQueue_conditionMutex); | |
UA_UNLOCK(wq->dispatchQueue_conditionMutex); | |
continue; | |
} | |
/* Execute */ | |
if(dc->callback) | |
dc->callback(dc->application, dc->data); | |
UA_free(dc); | |
} | |
return NULL; | |
} | |
/* Can be called repeatedly and starts additional workers */ | |
UA_StatusCode | |
UA_WorkQueue_start(UA_WorkQueue *wq, size_t workersCount) { | |
if(wq->workersSize > 0 || workersCount == 0) | |
return UA_STATUSCODE_BADINTERNALERROR; | |
/* Create the worker array */ | |
wq->workers = (UA_Worker*)UA_calloc(workersCount, sizeof(UA_Worker)); | |
if(!wq->workers) | |
return UA_STATUSCODE_BADOUTOFMEMORY; | |
wq->workersSize = workersCount; | |
/* Spin up the workers */ | |
for(size_t i = 0; i < workersCount; ++i) { | |
UA_Worker *w = &wq->workers[i]; | |
w->queue = wq; | |
w->counter = 0; | |
w->running = true; | |
pthread_create(&w->thread, NULL, (void* (*)(void*))workerLoop, w); | |
} | |
return UA_STATUSCODE_GOOD; | |
} | |
void UA_WorkQueue_stop(UA_WorkQueue *wq) { | |
if(wq->workersSize == 0) | |
return; | |
/* Signal the workers to stop */ | |
for(size_t i = 0; i < wq->workersSize; ++i) | |
wq->workers[i].running = false; | |
/* Wake up all workers */ | |
pthread_cond_broadcast(&wq->dispatchQueue_condition); | |
/* Wait for the workers to finish, then clean up */ | |
for(size_t i = 0; i < wq->workersSize; ++i) | |
pthread_join(wq->workers[i].thread, NULL); | |
UA_free(wq->workers); | |
wq->workers = NULL; | |
wq->workersSize = 0; | |
} | |
void UA_WorkQueue_enqueue(UA_WorkQueue *wq, UA_ApplicationCallback cb, | |
void *application, void *data) { | |
UA_DelayedCallback *dc = (UA_DelayedCallback*)UA_malloc(sizeof(UA_DelayedCallback)); | |
if(!dc) { | |
cb(application, data); /* Execute immediately if the memory could not be allocated */ | |
return; | |
} | |
dc->callback = cb; | |
dc->application = application; | |
dc->data = data; | |
/* Enqueue for the worker threads */ | |
UA_LOCK(wq->dispatchQueue_accessMutex); | |
SIMPLEQ_INSERT_TAIL(&wq->dispatchQueue, dc, next); | |
UA_UNLOCK(wq->dispatchQueue_accessMutex); | |
/* Wake up sleeping workers */ | |
pthread_cond_broadcast(&wq->dispatchQueue_condition); | |
} | |
#endif | |
/*********************/ | |
/* Delayed Callbacks */ | |
/*********************/ | |
#if UA_MULTITHREADING >= 200 | |
/* Delayed Callbacks are called only when all callbacks that were dispatched | |
* prior are finished. After every UA_MAX_DELAYED_SAMPLE delayed Callbacks that | |
* were added to the queue, we sample the counters from the workers. The | |
* counters are compared to the last counters that were sampled. If every worker | |
* has proceeded the counter, then we know that all delayed callbacks prior to | |
* the last sample-point are safe to execute. */ | |
/* Sample the worker counter for every nth delayed callback. This is used to | |
* test that all workers have **finished** their current job before the delayed | |
* callback is processed. */ | |
#define UA_MAX_DELAYED_SAMPLE 100 | |
/* Call only with a held mutex for the delayed callbacks */ | |
static void | |
dispatchDelayedCallbacks(UA_WorkQueue *wq, UA_DelayedCallback *cb) { | |
/* Are callbacks before the last checkpoint ready? */ | |
for(size_t i = 0; i < wq->workersSize; ++i) { | |
if(wq->workers[i].counter == wq->workers[i].checkpointCounter) | |
return; | |
} | |
/* Dispatch all delayed callbacks up to the checkpoint. | |
* TODO: Move over the entire queue up to the checkpoint in one step. */ | |
if(wq->delayedCallbacks_checkpoint != NULL) { | |
UA_DelayedCallback *iter, *tmp_iter; | |
SIMPLEQ_FOREACH_SAFE(iter, &wq->delayedCallbacks, next, tmp_iter) { | |
UA_LOCK(wq->dispatchQueue_accessMutex); | |
SIMPLEQ_INSERT_TAIL(&wq->dispatchQueue, iter, next); | |
UA_UNLOCK(wq->dispatchQueue_accessMutex); | |
if(iter == wq->delayedCallbacks_checkpoint) | |
break; | |
} | |
} | |
/* Create the new sample point */ | |
for(size_t i = 0; i < wq->workersSize; ++i) | |
wq->workers[i].checkpointCounter = wq->workers[i].counter; | |
wq->delayedCallbacks_checkpoint = cb; | |
} | |
#endif | |
void | |
UA_WorkQueue_enqueueDelayed(UA_WorkQueue *wq, UA_DelayedCallback *cb) { | |
#if UA_MULTITHREADING >= 200 | |
UA_LOCK(wq->dispatchQueue_accessMutex); | |
#endif | |
SIMPLEQ_INSERT_HEAD(&wq->delayedCallbacks, cb, next); | |
#if UA_MULTITHREADING >= 200 | |
wq->delayedCallbacks_sinceDispatch++; | |
if(wq->delayedCallbacks_sinceDispatch > UA_MAX_DELAYED_SAMPLE) { | |
dispatchDelayedCallbacks(wq, cb); | |
wq->delayedCallbacks_sinceDispatch = 0; | |
} | |
UA_UNLOCK(wq->dispatchQueue_accessMutex); | |
#endif | |
} | |
/* Assumes all workers are shut down */ | |
void UA_WorkQueue_manuallyProcessDelayed(UA_WorkQueue *wq) { | |
UA_DelayedCallback *dc, *dc_tmp; | |
SIMPLEQ_FOREACH_SAFE(dc, &wq->delayedCallbacks, next, dc_tmp) { | |
SIMPLEQ_REMOVE_HEAD(&wq->delayedCallbacks, next); | |
if(dc->callback) | |
dc->callback(dc->application, dc->data); | |
UA_free(dc); | |
} | |
#if UA_MULTITHREADING >= 200 | |
wq->delayedCallbacks_checkpoint = NULL; | |
#endif | |
} | |
/*********************************** amalgamated original file "E:/Librarys/open62541/src/ua_timer.c" ***********************************/ | |
/* This Source Code Form is subject to the terms of the Mozilla Public | |
* License, v. 2.0. If a copy of the MPL was not distributed with this | |
* file, You can obtain one at http://mozilla.org/MPL/2.0/. | |
* | |
* Copyright 2017, 2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) | |
* Copyright 2017 (c) Stefan Profanter, fortiss GmbH | |
*/ | |
struct UA_TimerEntry { | |
ZIP_ENTRY(UA_TimerEntry) zipfields; | |
UA_DateTime nextTime; /* The next time when the callback | |
* is to be executed */ | |
UA_UInt64 interval; /* Interval in 100ns resolution */ | |
UA_Boolean repeated; /* Repeated callback? */ | |
UA_ApplicationCallback callback; | |
void *application; | |
void *data; | |
ZIP_ENTRY(UA_TimerEntry) idZipfields; | |
UA_UInt64 id; /* Id of the entry */ | |
}; | |
/* There may be several entries with the same nextTime in the tree. We give them | |
* an absolute order by considering the memory address to break ties. Because of | |
* this, the nextTime property cannot be used to lookup specific entries. */ | |
static enum ZIP_CMP | |
cmpDateTime(const UA_DateTime *a, const UA_DateTime *b) { | |
if(*a < *b) | |
return ZIP_CMP_LESS; | |
if(*a > *b) | |
return ZIP_CMP_MORE; | |
if(a == b) | |
return ZIP_CMP_EQ; | |
if(a < b) | |
return ZIP_CMP_LESS; | |
return ZIP_CMP_MORE; | |
} | |
ZIP_PROTTYPE(UA_TimerZip, UA_TimerEntry, UA_DateTime) | |
ZIP_IMPL(UA_TimerZip, UA_TimerEntry, zipfields, UA_DateTime, nextTime, cmpDateTime) | |
/* The identifiers of entries are unique */ | |
static enum ZIP_CMP | |
cmpId(const UA_UInt64 *a, const UA_UInt64 *b) { | |
if(*a < *b) | |
return ZIP_CMP_LESS; | |
if(*a == *b) | |
return ZIP_CMP_EQ; | |
return ZIP_CMP_MORE; | |
} | |
ZIP_PROTTYPE(UA_TimerIdZip, UA_TimerEntry, UA_UInt64) | |
ZIP_IMPL(UA_TimerIdZip, UA_TimerEntry, idZipfields, UA_UInt64, id, cmpId) | |
void | |
UA_Timer_init(UA_Timer *t) { | |
memset(t, 0, sizeof(UA_Timer)); | |
} | |
static UA_StatusCode | |
addCallback(UA_Timer *t, UA_ApplicationCallback callback, void *application, void *data, | |
UA_DateTime nextTime, UA_UInt64 interval, UA_Boolean repeated, | |
UA_UInt64 *callbackId) { | |
/* A callback method needs to be present */ | |
if(!callback) | |
return UA_STATUSCODE_BADINTERNALERROR; | |
/* Allocate the repeated callback structure */ | |
UA_TimerEntry *te = (UA_TimerEntry*)UA_malloc(sizeof(UA_TimerEntry)); | |
if(!te) | |
return UA_STATUSCODE_BADOUTOFMEMORY; | |
/* Set the repeated callback */ | |
te->interval = (UA_UInt64)interval; | |
te->id = ++t->idCounter; | |
te->callback = callback; | |
te->application = application; | |
te->data = data; | |
te->repeated = repeated; | |
te->nextTime = nextTime; | |
/* Set the output identifier */ | |
if(callbackId) | |
*callbackId = te->id; | |
ZIP_INSERT(UA_TimerZip, &t->root, te, ZIP_FFS32(UA_UInt32_random())); | |
ZIP_INSERT(UA_TimerIdZip, &t->idRoot, te, ZIP_RANK(te, zipfields)); | |
return UA_STATUSCODE_GOOD; | |
} | |
UA_StatusCode | |
UA_Timer_addTimedCallback(UA_Timer *t, UA_ApplicationCallback callback, | |
void *application, void *data, UA_DateTime date, | |
UA_UInt64 *callbackId) { | |
return addCallback(t, callback, application, data, date, 0, false, callbackId); | |
} | |
/* Adding repeated callbacks: Add an entry with the "nextTime" timestamp in the | |
* future. This will be picked up in the next iteration and inserted at the | |
* correct place. So that the next execution takes place ät "nextTime". */ | |
UA_StatusCode | |
UA_Timer_addRepeatedCallback(UA_Timer *t, UA_ApplicationCallback callback, | |
void *application, void *data, UA_Double interval_ms, | |
UA_UInt64 *callbackId) { | |
/* The interval needs to be positive */ | |
if(interval_ms <= 0.0) | |
return UA_STATUSCODE_BADINTERNALERROR; | |
UA_UInt64 interval = (UA_UInt64)(interval_ms * UA_DATETIME_MSEC); | |
UA_DateTime nextTime = UA_DateTime_nowMonotonic() + (UA_DateTime)interval; | |
return addCallback(t, callback, application, data, nextTime, | |
interval, true, callbackId); | |
} | |
UA_StatusCode | |
UA_Timer_changeRepeatedCallbackInterval(UA_Timer *t, UA_UInt64 callbackId, | |
UA_Double interval_ms) { | |
/* The interval needs to be positive */ | |
if(interval_ms <= 0.0) | |
return UA_STATUSCODE_BADINTERNALERROR; | |
/* Remove from the sorted list */ | |
UA_TimerEntry *te = ZIP_FIND(UA_TimerIdZip, &t->idRoot, &callbackId); | |
if(!te) | |
return UA_STATUSCODE_BADNOTFOUND; | |
/* Set the repeated callback */ | |
ZIP_REMOVE(UA_TimerZip, &t->root, te); | |
te->interval = (UA_UInt64)(interval_ms * UA_DATETIME_MSEC); /* in 100ns resolution */ | |
te->nextTime = UA_DateTime_nowMonotonic() + (UA_DateTime)te->interval; | |
ZIP_INSERT(UA_TimerZip, &t->root, te, ZIP_RANK(te, zipfields)); | |
return UA_STATUSCODE_GOOD; | |
} | |
void | |
UA_Timer_removeCallback(UA_Timer *t, UA_UInt64 callbackId) { | |
UA_TimerEntry *te = ZIP_FIND(UA_TimerIdZip, &t->idRoot, &callbackId); | |
if(!te) | |
return; | |
ZIP_REMOVE(UA_TimerZip, &t->root, te); | |
ZIP_REMOVE(UA_TimerIdZip, &t->idRoot, te); | |
UA_free(te); | |
} | |
UA_DateTime | |
UA_Timer_process(UA_Timer *t, UA_DateTime nowMonotonic, | |
UA_TimerExecutionCallback executionCallback, | |
void *executionApplication) { | |
UA_TimerEntry *first; | |
while((first = ZIP_MIN(UA_TimerZip, &t->root)) && | |
first->nextTime <= nowMonotonic) { | |
ZIP_REMOVE(UA_TimerZip, &t->root, first); | |
/* Reinsert / remove to their new position first. Because the callback | |
* can interact with the zip tree and expects the same entries in the | |
* root and idRoot trees. */ | |
if(!first->repeated) { | |
ZIP_REMOVE(UA_TimerIdZip, &t->idRoot, first); | |
executionCallback(executionApplication, first->callback, | |
first->application, first->data); | |
UA_free(first); | |
continue; | |
} | |
/* Set the time for the next execution. Prevent an infinite loop by | |
* forcing the next processing into the next iteration. */ | |
first->nextTime += (UA_Int64)first->interval; | |
if(first->nextTime < nowMonotonic) | |
first->nextTime = nowMonotonic + 1; | |
ZIP_INSERT(UA_TimerZip, &t->root, first, ZIP_RANK(first, zipfields)); | |
executionCallback(executionApplication, first->callback, | |
first->application, first->data); | |
} | |
/* Return the timestamp of the earliest next callback */ | |
first = ZIP_MIN(UA_TimerZip, &t->root); | |
return (first) ? first->nextTime : UA_INT64_MAX; | |
} | |
static void | |
freeEntry(UA_TimerEntry *te, void *data) { | |
UA_free(te); | |
} | |
void | |
UA_Timer_deleteMembers(UA_Timer *t) { | |
/* Free all nodes and reset the root */ | |
ZIP_ITER(UA_TimerZip, &t->root, freeEntry, NULL); | |
ZIP_INIT(&t->root); | |
} | |
/*********************************** amalgamated original file "E:/Librarys/open62541/src/ua_connection.c" ***********************************/ | |
/* This Source Code Form is subject to the terms of the Mozilla Public | |
* License, v. 2.0. If a copy of the MPL was not distributed with this | |
* file, You can obtain one at http://mozilla.org/MPL/2.0/. | |
* | |
* Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) | |
* Copyright 2014, 2016-2017 (c) Florian Palm | |
* Copyright 2015-2016 (c) Sten Grüner | |
* Copyright 2015 (c) Oleksiy Vasylyev | |
* Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH | |
* Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB | |
* Copyright 2019 (c) Kalycito Infotech Private Limited | |
*/ | |
void UA_Connection_clear(UA_Connection *connection) { | |
UA_ByteString_deleteMembers(&connection->incompleteChunk); | |
} | |
UA_StatusCode | |
UA_Connection_processHELACK(UA_Connection *connection, | |
const UA_ConnectionConfig *localConfig, | |
const UA_ConnectionConfig *remoteConfig) { | |
connection->config = *remoteConfig; | |
/* The lowest common version is used by both sides */ | |
if(connection->config.protocolVersion > localConfig->protocolVersion) | |
connection->config.protocolVersion = localConfig->protocolVersion; | |
/* Can we receive the max send size? */ | |
if(connection->config.sendBufferSize > localConfig->recvBufferSize) | |
connection->config.sendBufferSize = localConfig->recvBufferSize; | |
/* Can we send the max receive size? */ | |
if(connection->config.recvBufferSize > localConfig->sendBufferSize) | |
connection->config.recvBufferSize = localConfig->sendBufferSize; | |
/* Chunks of at least 8192 bytes must be permissible. | |
* See Part 6, Clause 6.7.1 */ | |
if(connection->config.recvBufferSize < 8192 || | |
connection->config.sendBufferSize < 8192 || | |
(connection->config.maxMessageSize != 0 && | |
connection->config.maxMessageSize < 8192)) | |
return UA_STATUSCODE_BADINTERNALERROR; | |
connection->state = UA_CONNECTION_ESTABLISHED; | |
return UA_STATUSCODE_GOOD; | |
} | |
/* Hides some errors before sending them to a client according to the | |
* standard. */ | |
static void | |
hideErrors(UA_TcpErrorMessage *const error) { | |
switch(error->error) { | |
case UA_STATUSCODE_BADCERTIFICATEUNTRUSTED: | |
case UA_STATUSCODE_BADCERTIFICATEREVOKED: | |
error->error = UA_STATUSCODE_BADSECURITYCHECKSFAILED; | |
error->reason = UA_STRING_NULL; | |
break; | |
// TODO: Check if these are all cases that need to be covered. | |
default: | |
break; | |
} | |
} | |
void | |
UA_Connection_sendError(UA_Connection *connection, UA_TcpErrorMessage *error) { | |
hideErrors(error); | |
UA_TcpMessageHeader header; | |
header.messageTypeAndChunkType = UA_MESSAGETYPE_ERR + UA_CHUNKTYPE_FINAL; | |
// Header + ErrorMessage (error + reasonLength_field + length) | |
header.messageSize = 8 + (4 + 4 + (UA_UInt32)error->reason.length); | |
/* Get the send buffer from the network layer */ | |
UA_ByteString msg = UA_BYTESTRING_NULL; | |
UA_StatusCode retval = connection->getSendBuffer(connection, header.messageSize, &msg); | |
if(retval != UA_STATUSCODE_GOOD) | |
return; | |
/* Encode and send the response */ | |
UA_Byte *bufPos = msg.data; | |
const UA_Byte *bufEnd = &msg.data[msg.length]; | |
UA_TcpMessageHeader_encodeBinary(&header, &bufPos, bufEnd); | |
UA_TcpErrorMessage_encodeBinary(error, &bufPos, bufEnd); | |
msg.length = header.messageSize; | |
connection->send(connection, &msg); | |
} | |
static UA_StatusCode | |
bufferIncompleteChunk(UA_Connection *connection, const UA_Byte *pos, | |
const UA_Byte *end) { | |
UA_assert(connection->incompleteChunk.length == 0); | |
UA_assert(pos < end); | |
size_t length = (uintptr_t)end - (uintptr_t)pos; | |
UA_StatusCode retval = UA_ByteString_allocBuffer(&connection->incompleteChunk, length); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
memcpy(connection->incompleteChunk.data, pos, length); | |
return UA_STATUSCODE_GOOD; | |
} | |
static UA_StatusCode | |
processChunk(UA_Connection *connection, void *application, | |
UA_Connection_processChunk processCallback, | |
const UA_Byte **posp, const UA_Byte *end, UA_Boolean *done) { | |
const UA_Byte *pos = *posp; | |
const size_t remaining = (uintptr_t)end - (uintptr_t)pos; | |
/* At least 8 byte needed for the header. Wait for the next chunk. */ | |
if(remaining < 8) { | |
*done = true; | |
return UA_STATUSCODE_GOOD; | |
} | |
/* Check the message type */ | |
UA_MessageType msgtype = (UA_MessageType) | |
((UA_UInt32)pos[0] + ((UA_UInt32)pos[1] << 8) + ((UA_UInt32)pos[2] << 16)); | |
if(msgtype != UA_MESSAGETYPE_MSG && msgtype != UA_MESSAGETYPE_ERR && | |
msgtype != UA_MESSAGETYPE_OPN && msgtype != UA_MESSAGETYPE_HEL && | |
msgtype != UA_MESSAGETYPE_ACK && msgtype != UA_MESSAGETYPE_CLO) { | |
/* The message type is not recognized */ | |
return UA_STATUSCODE_BADTCPMESSAGETYPEINVALID; | |
} | |
UA_Byte isFinal = pos[3]; | |
if(isFinal != 'C' && isFinal != 'F' && isFinal != 'A') { | |
/* The message type is not recognized */ | |
return UA_STATUSCODE_BADTCPMESSAGETYPEINVALID; | |
} | |
UA_UInt32 chunk_length = 0; | |
UA_ByteString temp = { 8, (UA_Byte*)(uintptr_t)pos }; /* At least 8 byte left */ | |
size_t temp_offset = 4; | |
/* Decoding the UInt32 cannot fail */ | |
UA_UInt32_decodeBinary(&temp, &temp_offset, &chunk_length); | |
/* The message size is not allowed */ | |
if(chunk_length < 16 || chunk_length > connection->config.recvBufferSize) | |
return UA_STATUSCODE_BADTCPMESSAGETOOLARGE; | |
/* Have an the complete chunk */ | |
if(chunk_length > remaining) { | |
*done = true; | |
return UA_STATUSCODE_GOOD; | |
} | |
/* Process the chunk; forward the position pointer */ | |
temp.length = chunk_length; | |
*posp += chunk_length; | |
*done = false; | |
return processCallback(application, connection, &temp); | |
} | |
UA_StatusCode | |
UA_Connection_processChunks(UA_Connection *connection, void *application, | |
UA_Connection_processChunk processCallback, | |
const UA_ByteString *packet) { | |
const UA_Byte *pos = packet->data; | |
const UA_Byte *end = &packet->data[packet->length]; | |
UA_ByteString appended = connection->incompleteChunk; | |
/* Prepend the incomplete last chunk. This is usually done in the | |
* networklayer. But we test for a buffered incomplete chunk here again to | |
* work around "lazy" network layers. */ | |
if(appended.length > 0) { | |
connection->incompleteChunk = UA_BYTESTRING_NULL; | |
UA_Byte *t = (UA_Byte*)UA_realloc(appended.data, appended.length + packet->length); | |
if(!t) { | |
UA_ByteString_deleteMembers(&appended); | |
return UA_STATUSCODE_BADOUTOFMEMORY; | |
} | |
memcpy(&t[appended.length], pos, packet->length); | |
appended.data = t; | |
appended.length += packet->length; | |
pos = t; | |
end = &t[appended.length]; | |
} | |
UA_assert(connection->incompleteChunk.length == 0); | |
/* Loop over the received chunks. pos is increased with each chunk. */ | |
UA_Boolean done = false; | |
UA_StatusCode retval = UA_STATUSCODE_GOOD; | |
while(!done) { | |
retval = processChunk(connection, application, processCallback, &pos, end, &done); | |
/* If an irrecoverable error happens: do not buffer incomplete chunk */ | |
if(retval != UA_STATUSCODE_GOOD) | |
goto cleanup; | |
} | |
if(end > pos) | |
retval = bufferIncompleteChunk(connection, pos, end); | |
cleanup: | |
UA_ByteString_deleteMembers(&appended); | |
return retval; | |
} | |
/* In order to know whether a chunk was processed, we insert an redirection into | |
* the callback. */ | |
struct completeChunkTrampolineData { | |
UA_Boolean called; | |
void *application; | |
UA_Connection_processChunk processCallback; | |
}; | |
static UA_StatusCode | |
completeChunkTrampoline(void *application, UA_Connection *connection, | |
UA_ByteString *chunk) { | |
struct completeChunkTrampolineData *data = | |
(struct completeChunkTrampolineData*)application; | |
data->called = true; | |
return data->processCallback(data->application, connection, chunk); | |
} | |
UA_StatusCode | |
UA_Connection_receiveChunksBlocking(UA_Connection *connection, void *application, | |
UA_Connection_processChunk processCallback, | |
UA_UInt32 timeout) { | |
UA_DateTime now = UA_DateTime_nowMonotonic(); | |
UA_DateTime maxDate = now + (timeout * UA_DATETIME_MSEC); | |
struct completeChunkTrampolineData data; | |
data.called = false; | |
data.application = application; | |
data.processCallback = processCallback; | |
UA_StatusCode retval = UA_STATUSCODE_GOOD; | |
while(true) { | |
/* Listen for messages to arrive */ | |
UA_ByteString packet = UA_BYTESTRING_NULL; | |
retval = connection->recv(connection, &packet, timeout); | |
if(retval != UA_STATUSCODE_GOOD) | |
break; | |
/* Try to process one complete chunk */ | |
retval = UA_Connection_processChunks(connection, &data, | |
completeChunkTrampoline, &packet); | |
connection->releaseRecvBuffer(connection, &packet); | |
if(data.called) | |
break; | |
/* We received a message. But the chunk is incomplete. Compute the | |
* remaining timeout. */ | |
now = UA_DateTime_nowMonotonic(); | |
/* >= avoid timeout to be set to 0 */ | |
if(now >= maxDate) | |
return UA_STATUSCODE_GOODNONCRITICALTIMEOUT; | |
/* round always to upper value to avoid timeout to be set to 0 | |
* if(maxDate - now) < (UA_DATETIME_MSEC/2) */ | |
timeout = (UA_UInt32)(((maxDate - now) + (UA_DATETIME_MSEC - 1)) / UA_DATETIME_MSEC); | |
} | |
return retval; | |
} | |
UA_StatusCode | |
UA_Connection_receiveChunksNonBlocking(UA_Connection *connection, void *application, | |
UA_Connection_processChunk processCallback) { | |
struct completeChunkTrampolineData data; | |
data.called = false; | |
data.application = application; | |
data.processCallback = processCallback; | |
/* Listen for messages to arrive */ | |
UA_ByteString packet = UA_BYTESTRING_NULL; | |
UA_StatusCode retval = connection->recv(connection, &packet, 1); | |
if((retval != UA_STATUSCODE_GOOD) && (retval != UA_STATUSCODE_GOODNONCRITICALTIMEOUT)) | |
return retval; | |
/* Try to process one complete chunk */ | |
retval = UA_Connection_processChunks(connection, &data, completeChunkTrampoline, &packet); | |
connection->releaseRecvBuffer(connection, &packet); | |
return retval; | |
} | |
void UA_Connection_detachSecureChannel(UA_Connection *connection) { | |
UA_SecureChannel *channel = connection->channel; | |
if(channel) | |
/* only replace when the channel points to this connection */ | |
UA_atomic_cmpxchg((void**)&channel->connection, connection, NULL); | |
UA_atomic_xchg((void**)&connection->channel, NULL); | |
} | |
// TODO: Return an error code | |
void | |
UA_Connection_attachSecureChannel(UA_Connection *connection, UA_SecureChannel *channel) { | |
if(UA_atomic_cmpxchg((void**)&channel->connection, NULL, connection) == NULL) | |
UA_atomic_xchg((void**)&connection->channel, (void*)channel); | |
} | |
/*********************************** amalgamated original file "E:/Librarys/open62541/src/ua_securechannel.c" ***********************************/ | |
/* This Source Code Form is subject to the terms of the Mozilla Public | |
* License, v. 2.0. If a copy of the MPL was not distributed with this | |
* file, You can obtain one at http://mozilla.org/MPL/2.0/. | |
* | |
* Copyright 2014-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) | |
* Copyright 2014, 2016-2017 (c) Florian Palm | |
* Copyright 2015-2016 (c) Sten Grüner | |
* Copyright 2015 (c) Oleksiy Vasylyev | |
* Copyright 2016 (c) TorbenD | |
* Copyright 2017 (c) Stefan Profanter, fortiss GmbH | |
* Copyright 2017-2018 (c) Mark Giraud, Fraunhofer IOSB | |
*/ | |
#define UA_BITMASK_MESSAGETYPE 0x00ffffffu | |
#define UA_BITMASK_CHUNKTYPE 0xff000000u | |
#define UA_ASYMMETRIC_ALG_SECURITY_HEADER_FIXED_LENGTH 12 | |
#define UA_SYMMETRIC_ALG_SECURITY_HEADER_LENGTH 4 | |
#define UA_SEQUENCE_HEADER_LENGTH 8 | |
#define UA_SECUREMH_AND_SYMALGH_LENGTH \ | |
(UA_SECURE_CONVERSATION_MESSAGE_HEADER_LENGTH + \ | |
UA_SYMMETRIC_ALG_SECURITY_HEADER_LENGTH) | |
const UA_ByteString UA_SECURITY_POLICY_NONE_URI = | |
{47, (UA_Byte *)"http://opcfoundation.org/UA/SecurityPolicy#None"}; | |
#ifdef UA_ENABLE_UNIT_TEST_FAILURE_HOOKS | |
UA_StatusCode decrypt_verifySignatureFailure; | |
UA_StatusCode sendAsym_sendFailure; | |
UA_StatusCode processSym_seqNumberFailure; | |
#endif | |
void | |
UA_SecureChannel_init(UA_SecureChannel *channel) { | |
/* Linked lists are also initialized by zeroing out */ | |
memset(channel, 0, sizeof(UA_SecureChannel)); | |
channel->state = UA_SECURECHANNELSTATE_FRESH; | |
TAILQ_INIT(&channel->messages); | |
} | |
UA_StatusCode | |
UA_SecureChannel_setSecurityPolicy(UA_SecureChannel *channel, | |
const UA_SecurityPolicy *securityPolicy, | |
const UA_ByteString *remoteCertificate) { | |
/* Is a policy already configured? */ | |
if(channel->securityPolicy) { | |
UA_LOG_ERROR(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY, | |
"Security policy already configured"); | |
return UA_STATUSCODE_BADINTERNALERROR; | |
} | |
UA_StatusCode retval; | |
if(securityPolicy->certificateVerification != NULL) { | |
retval = securityPolicy->certificateVerification-> | |
verifyCertificate(securityPolicy->certificateVerification->context, | |
remoteCertificate); | |
if(retval != UA_STATUSCODE_GOOD) { | |
UA_LOG_WARNING(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY, | |
"Could not verify the remote certificate"); | |
return retval; | |
} | |
} else { | |
UA_LOG_WARNING(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY, | |
"Security policy None is used to create SecureChannel. Accepting all certificates"); | |
} | |
retval = securityPolicy->channelModule. | |
newContext(securityPolicy, remoteCertificate, &channel->channelContext); | |
if(retval != UA_STATUSCODE_GOOD) { | |
UA_LOG_WARNING(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY, | |
"Could not set up the SecureChannel context"); | |
return retval; | |
} | |
retval = UA_ByteString_copy(remoteCertificate, &channel->remoteCertificate); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
UA_ByteString remoteCertificateThumbprint = {20, channel->remoteCertificateThumbprint}; | |
retval = securityPolicy->asymmetricModule. | |
makeCertificateThumbprint(securityPolicy, &channel->remoteCertificate, | |
&remoteCertificateThumbprint); | |
if(retval != UA_STATUSCODE_GOOD) { | |
UA_LOG_WARNING(securityPolicy->logger, UA_LOGCATEGORY_SECURITYPOLICY, | |
"Could not create the certificate thumbprint"); | |
return retval; | |
} | |
channel->securityPolicy = securityPolicy; | |
return UA_STATUSCODE_GOOD; | |
} | |
static void | |
deleteMessage(UA_Message *me) { | |
UA_ChunkPayload *cp; | |
while((cp = SIMPLEQ_FIRST(&me->chunkPayloads))) { | |
if(cp->copied) | |
UA_ByteString_deleteMembers(&cp->bytes); | |
SIMPLEQ_REMOVE_HEAD(&me->chunkPayloads, pointers); | |
UA_free(cp); | |
} | |
UA_free(me); | |
} | |
static void | |
deleteLatestMessage(UA_SecureChannel *channel, UA_UInt32 requestId) { | |
UA_Message *me = TAILQ_LAST(&channel->messages, UA_MessageQueue); | |
if(!me) | |
return; | |
if(me->requestId != requestId) | |
return; | |
TAILQ_REMOVE(&channel->messages, me, pointers); | |
deleteMessage(me); | |
} | |
void | |
UA_SecureChannel_deleteMessages(UA_SecureChannel *channel) { | |
UA_Message *me, *me_tmp; | |
TAILQ_FOREACH_SAFE(me, &channel->messages, pointers, me_tmp) { | |
TAILQ_REMOVE(&channel->messages, me, pointers); | |
deleteMessage(me); | |
} | |
} | |
void | |
UA_SecureChannel_deleteMembers(UA_SecureChannel *channel) { | |
/* Delete members */ | |
UA_ByteString_deleteMembers(&channel->remoteCertificate); | |
UA_ByteString_deleteMembers(&channel->localNonce); | |
UA_ByteString_deleteMembers(&channel->remoteNonce); | |
UA_ChannelSecurityToken_deleteMembers(&channel->securityToken); | |
UA_ChannelSecurityToken_deleteMembers(&channel->nextSecurityToken); | |
/* Delete the channel context for the security policy */ | |
if(channel->securityPolicy) { | |
channel->securityPolicy->channelModule.deleteContext(channel->channelContext); | |
channel->securityPolicy = NULL; | |
} | |
/* Remove the buffered messages */ | |
UA_SecureChannel_deleteMessages(channel); | |
UA_SecureChannel_init(channel); | |
} | |
void | |
UA_SecureChannel_close(UA_SecureChannel *channel) { | |
/* Set the status to closed */ | |
channel->state = UA_SECURECHANNELSTATE_CLOSED; | |
/* Detach from the connection and close the connection */ | |
if(channel->connection) { | |
if(channel->connection->state != UA_CONNECTION_CLOSED) | |
channel->connection->close(channel->connection); | |
UA_Connection_detachSecureChannel(channel->connection); | |
} | |
/* Remove session pointers (not the sessions) and NULL the pointers back to | |
* the SecureChannel in the Session */ | |
UA_SessionHeader *sh, *temp; | |
LIST_FOREACH_SAFE(sh, &channel->sessions, pointers, temp) { | |
sh->channel = NULL; | |
LIST_REMOVE(sh, pointers); | |
} | |
} | |
UA_StatusCode | |
UA_SecureChannel_generateLocalNonce(UA_SecureChannel *channel) { | |
if(!channel->securityPolicy) | |
return UA_STATUSCODE_BADINTERNALERROR; | |
/* Is the length of the previous nonce correct? */ | |
size_t nonceLength = channel->securityPolicy->symmetricModule.secureChannelNonceLength; | |
if(channel->localNonce.length != nonceLength) { | |
UA_ByteString_deleteMembers(&channel->localNonce); | |
UA_StatusCode retval = UA_ByteString_allocBuffer(&channel->localNonce, nonceLength); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
} | |
return channel->securityPolicy->symmetricModule. | |
generateNonce(channel->securityPolicy, &channel->localNonce); | |
} | |
static UA_StatusCode | |
UA_SecureChannel_generateLocalKeys(const UA_SecureChannel *const channel, | |
const UA_SecurityPolicy *const securityPolicy) { | |
UA_LOG_TRACE_CHANNEL(securityPolicy->logger, channel, "Generating new local keys"); | |
const UA_SecurityPolicyChannelModule *channelModule = &securityPolicy->channelModule; | |
const UA_SecurityPolicySymmetricModule *symmetricModule = &securityPolicy->symmetricModule; | |
const UA_SecurityPolicyCryptoModule *const cryptoModule = | |
&securityPolicy->symmetricModule.cryptoModule; | |
/* Symmetric key length */ | |
size_t encryptionKeyLength = | |
cryptoModule->encryptionAlgorithm.getLocalKeyLength(securityPolicy, channel->channelContext); | |
size_t encryptionBlockSize = | |
cryptoModule->encryptionAlgorithm.getLocalBlockSize(securityPolicy, channel->channelContext); | |
size_t signingKeyLength = | |
cryptoModule->signatureAlgorithm.getLocalKeyLength(securityPolicy, channel->channelContext); | |
const size_t bufSize = encryptionBlockSize + signingKeyLength + encryptionKeyLength; | |
UA_STACKARRAY(UA_Byte, bufBytes, bufSize); | |
UA_ByteString buffer = {bufSize, bufBytes}; | |
/* Local keys */ | |
UA_StatusCode retval = symmetricModule->generateKey(securityPolicy, &channel->remoteNonce, | |
&channel->localNonce, &buffer); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
const UA_ByteString localSigningKey = {signingKeyLength, buffer.data}; | |
const UA_ByteString localEncryptingKey = {encryptionKeyLength, | |
buffer.data + signingKeyLength}; | |
const UA_ByteString localIv = {encryptionBlockSize, | |
buffer.data + signingKeyLength + | |
encryptionKeyLength}; | |
retval = channelModule->setLocalSymSigningKey(channel->channelContext, &localSigningKey); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
retval = channelModule->setLocalSymEncryptingKey(channel->channelContext, &localEncryptingKey); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
retval = channelModule->setLocalSymIv(channel->channelContext, &localIv); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
return retval; | |
} | |
static UA_StatusCode | |
UA_SecureChannel_generateRemoteKeys(const UA_SecureChannel *const channel, | |
const UA_SecurityPolicy *const securityPolicy) { | |
UA_LOG_TRACE_CHANNEL(securityPolicy->logger, channel, "Generating new remote keys"); | |
const UA_SecurityPolicyChannelModule *channelModule = &securityPolicy->channelModule; | |
const UA_SecurityPolicySymmetricModule *symmetricModule = &securityPolicy->symmetricModule; | |
const UA_SecurityPolicyCryptoModule *const cryptoModule = | |
&securityPolicy->symmetricModule.cryptoModule; | |
/* Symmetric key length */ | |
size_t encryptionKeyLength = | |
cryptoModule->encryptionAlgorithm.getRemoteKeyLength(securityPolicy, channel->channelContext); | |
size_t encryptionBlockSize = | |
cryptoModule->encryptionAlgorithm.getRemoteBlockSize(securityPolicy, channel->channelContext); | |
size_t signingKeyLength = | |
cryptoModule->signatureAlgorithm.getRemoteKeyLength(securityPolicy, channel->channelContext); | |
const size_t bufSize = encryptionBlockSize + signingKeyLength + encryptionKeyLength; | |
UA_STACKARRAY(UA_Byte, bufBytes, bufSize); | |
UA_ByteString buffer = {bufSize, bufBytes}; | |
/* Remote keys */ | |
UA_StatusCode retval = symmetricModule->generateKey(securityPolicy, &channel->localNonce, | |
&channel->remoteNonce, &buffer); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
const UA_ByteString remoteSigningKey = {signingKeyLength, buffer.data}; | |
const UA_ByteString remoteEncryptingKey = {encryptionKeyLength, | |
buffer.data + signingKeyLength}; | |
const UA_ByteString remoteIv = {encryptionBlockSize, | |
buffer.data + signingKeyLength + | |
encryptionKeyLength}; | |
retval = channelModule->setRemoteSymSigningKey(channel->channelContext, &remoteSigningKey); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
retval = channelModule->setRemoteSymEncryptingKey(channel->channelContext, &remoteEncryptingKey); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
retval = channelModule->setRemoteSymIv(channel->channelContext, &remoteIv); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
return retval; | |
} | |
UA_StatusCode | |
UA_SecureChannel_generateNewKeys(UA_SecureChannel *channel) { | |
UA_StatusCode retval = | |
UA_SecureChannel_generateLocalKeys(channel, channel->securityPolicy); | |
if(retval != UA_STATUSCODE_GOOD) { | |
UA_LOG_ERROR(channel->securityPolicy->logger, UA_LOGCATEGORY_SECURECHANNEL, | |
"Could not generate a local key"); | |
return retval; | |
} | |
retval = UA_SecureChannel_generateRemoteKeys(channel, channel->securityPolicy); | |
if(retval != UA_STATUSCODE_GOOD) { | |
UA_LOG_ERROR(channel->securityPolicy->logger, UA_LOGCATEGORY_SECURECHANNEL, | |
"Could not generate a remote key"); | |
return retval; | |
} | |
return retval; | |
} | |
UA_SessionHeader * | |
UA_SecureChannel_getSession(UA_SecureChannel *channel, | |
const UA_NodeId *authenticationToken) { | |
UA_SessionHeader *sh; | |
LIST_FOREACH(sh, &channel->sessions, pointers) { | |
if(UA_NodeId_equal(&sh->authenticationToken, authenticationToken)) | |
break; | |
} | |
return sh; | |
} | |
UA_StatusCode | |
UA_SecureChannel_revolveTokens(UA_SecureChannel *channel) { | |
if(channel->nextSecurityToken.tokenId == 0) // no security token issued | |
return UA_STATUSCODE_BADSECURECHANNELTOKENUNKNOWN; | |
//FIXME: not thread-safe ???? Why is this not thread safe? | |
UA_ChannelSecurityToken_deleteMembers(&channel->previousSecurityToken); | |
UA_ChannelSecurityToken_copy(&channel->securityToken, &channel->previousSecurityToken); | |
UA_ChannelSecurityToken_deleteMembers(&channel->securityToken); | |
UA_ChannelSecurityToken_copy(&channel->nextSecurityToken, &channel->securityToken); | |
UA_ChannelSecurityToken_deleteMembers(&channel->nextSecurityToken); | |
UA_ChannelSecurityToken_init(&channel->nextSecurityToken); | |
/* remote keys are generated later on */ | |
return UA_SecureChannel_generateLocalKeys(channel, channel->securityPolicy); | |
} | |
/***************************/ | |
/* Send Asymmetric Message */ | |
/***************************/ | |
static size_t | |
calculateAsymAlgSecurityHeaderLength(const UA_SecureChannel *channel) { | |
size_t asymHeaderLength = UA_ASYMMETRIC_ALG_SECURITY_HEADER_FIXED_LENGTH + | |
channel->securityPolicy->policyUri.length; | |
if(channel->securityMode != UA_MESSAGESECURITYMODE_SIGN && | |
channel->securityMode != UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) | |
return asymHeaderLength; | |
/* OPN is always encrypted even if the mode is sign only */ | |
asymHeaderLength += 20; /* Thumbprints are always 20 byte long */ | |
asymHeaderLength += channel->securityPolicy->localCertificate.length; | |
return asymHeaderLength; | |
} | |
static UA_StatusCode | |
prependHeadersAsym(UA_SecureChannel *const channel, UA_Byte *header_pos, | |
const UA_Byte *buf_end, size_t totalLength, | |
size_t securityHeaderLength, UA_UInt32 requestId, | |
size_t *const finalLength) { | |
UA_StatusCode retval; | |
size_t dataToEncryptLength = | |
totalLength - (UA_SECURE_CONVERSATION_MESSAGE_HEADER_LENGTH + securityHeaderLength); | |
UA_SecureConversationMessageHeader respHeader; | |
respHeader.messageHeader.messageTypeAndChunkType = UA_MESSAGETYPE_OPN + UA_CHUNKTYPE_FINAL; | |
respHeader.messageHeader.messageSize = (UA_UInt32) | |
(totalLength + | |
UA_SecurityPolicy_getRemoteAsymEncryptionBufferLengthOverhead(channel->securityPolicy, | |
channel->channelContext, | |
dataToEncryptLength)); | |
respHeader.secureChannelId = channel->securityToken.channelId; | |
retval = UA_encodeBinary(&respHeader, | |
&UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEHEADER], | |
&header_pos, &buf_end, NULL, NULL); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
UA_AsymmetricAlgorithmSecurityHeader asymHeader; | |
UA_AsymmetricAlgorithmSecurityHeader_init(&asymHeader); | |
asymHeader.securityPolicyUri = channel->securityPolicy->policyUri; | |
if(channel->securityMode == UA_MESSAGESECURITYMODE_SIGN || | |
channel->securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) { | |
asymHeader.senderCertificate = channel->securityPolicy->localCertificate; | |
asymHeader.receiverCertificateThumbprint.length = 20; | |
asymHeader.receiverCertificateThumbprint.data = channel->remoteCertificateThumbprint; | |
} | |
retval = UA_encodeBinary(&asymHeader, | |
&UA_TRANSPORT[UA_TRANSPORT_ASYMMETRICALGORITHMSECURITYHEADER], | |
&header_pos, &buf_end, NULL, NULL); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
UA_SequenceHeader seqHeader; | |
seqHeader.requestId = requestId; | |
seqHeader.sequenceNumber = UA_atomic_addUInt32(&channel->sendSequenceNumber, 1); | |
retval = UA_encodeBinary(&seqHeader, &UA_TRANSPORT[UA_TRANSPORT_SEQUENCEHEADER], | |
&header_pos, &buf_end, NULL, NULL); | |
*finalLength = respHeader.messageHeader.messageSize; | |
return retval; | |
} | |
static void | |
hideBytesAsym(const UA_SecureChannel *channel, UA_Byte **buf_start, | |
const UA_Byte **buf_end) { | |
*buf_start += UA_SECURE_CONVERSATION_MESSAGE_HEADER_LENGTH; | |
*buf_start += calculateAsymAlgSecurityHeaderLength(channel); | |
*buf_start += UA_SEQUENCE_HEADER_LENGTH; | |
#ifdef UA_ENABLE_ENCRYPTION | |
if(channel->securityMode != UA_MESSAGESECURITYMODE_SIGN && | |
channel->securityMode != UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) | |
return; | |
const UA_SecurityPolicy *securityPolicy = channel->securityPolicy; | |
/* Hide bytes for signature and padding */ | |
size_t potentialEncryptMaxSize = (size_t)(*buf_end - *buf_start) + UA_SEQUENCE_HEADER_LENGTH; | |
*buf_end -= securityPolicy->asymmetricModule.cryptoModule.signatureAlgorithm. | |
getLocalSignatureSize(securityPolicy, channel->channelContext); | |
*buf_end -= 2; /* padding byte and extraPadding byte */ | |
/* Add some overhead length due to RSA implementations adding a signature themselves */ | |
*buf_end -= UA_SecurityPolicy_getRemoteAsymEncryptionBufferLengthOverhead(securityPolicy, | |
channel->channelContext, | |
potentialEncryptMaxSize); | |
#endif | |
} | |
#ifdef UA_ENABLE_ENCRYPTION | |
static void | |
padChunkAsym(UA_SecureChannel *channel, const UA_ByteString *const buf, | |
size_t securityHeaderLength, UA_Byte **buf_pos) { | |
const UA_SecurityPolicy *const securityPolicy = channel->securityPolicy; | |
/* Also pad if the securityMode is SIGN_ONLY, since we are using | |
* asymmetric communication to exchange keys and thus need to encrypt. */ | |
if(channel->securityMode != UA_MESSAGESECURITYMODE_SIGN && | |
channel->securityMode != UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) | |
return; | |
const UA_Byte *buf_body_start = | |
&buf->data[UA_SECURE_CONVERSATION_MESSAGE_HEADER_LENGTH + | |
UA_SEQUENCE_HEADER_LENGTH + securityHeaderLength]; | |
const size_t bytesToWrite = | |
(uintptr_t)*buf_pos - (uintptr_t)buf_body_start + UA_SEQUENCE_HEADER_LENGTH; | |
/* Compute the padding length */ | |
size_t plainTextBlockSize = securityPolicy->asymmetricModule.cryptoModule.encryptionAlgorithm. | |
getRemotePlainTextBlockSize(securityPolicy, channel->channelContext); | |
size_t signatureSize = securityPolicy->asymmetricModule.cryptoModule.signatureAlgorithm. | |
getLocalSignatureSize(securityPolicy, channel->channelContext); | |
size_t paddingBytes = 1; | |
if(securityPolicy->asymmetricModule.cryptoModule.encryptionAlgorithm. | |
getRemoteKeyLength(securityPolicy, channel->channelContext) > 2048) | |
++paddingBytes; /* extra padding */ | |
size_t totalPaddingSize = | |
(plainTextBlockSize - ((bytesToWrite + signatureSize + paddingBytes) % plainTextBlockSize)); | |
/* Write the padding. This is <= because the paddingSize byte also has to be written */ | |
UA_Byte paddingSize = (UA_Byte)(totalPaddingSize & 0xffu); | |
for(UA_UInt16 i = 0; i <= totalPaddingSize; ++i) { | |
**buf_pos = paddingSize; | |
++*buf_pos; | |
} | |
/* Write the extra padding byte if required */ | |
if(securityPolicy->asymmetricModule.cryptoModule.encryptionAlgorithm. | |
getRemoteKeyLength(securityPolicy, channel->channelContext) > 2048) { | |
UA_Byte extraPaddingSize = (UA_Byte)(totalPaddingSize >> 8u); | |
**buf_pos = extraPaddingSize; | |
++*buf_pos; | |
} | |
} | |
static UA_StatusCode | |
signAndEncryptAsym(UA_SecureChannel *const channel, size_t preSignLength, | |
UA_ByteString *buf, size_t securityHeaderLength, | |
size_t totalLength) { | |
if(channel->securityMode != UA_MESSAGESECURITYMODE_SIGN && | |
channel->securityMode != UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) | |
return UA_STATUSCODE_GOOD; | |
const UA_SecurityPolicy *const securityPolicy = channel->securityPolicy; | |
/* Sign message */ | |
const UA_ByteString dataToSign = {preSignLength, buf->data}; | |
size_t sigsize = securityPolicy->asymmetricModule.cryptoModule.signatureAlgorithm. | |
getLocalSignatureSize(securityPolicy, channel->channelContext); | |
UA_ByteString signature = {sigsize, buf->data + preSignLength}; | |
UA_StatusCode retval = securityPolicy->asymmetricModule.cryptoModule.signatureAlgorithm. | |
sign(securityPolicy, channel->channelContext, &dataToSign, &signature); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
/* Specification part 6, 6.7.4: The OpenSecureChannel Messages are | |
* signed and encrypted if the SecurityMode is not None (even if the | |
* SecurityMode is SignOnly). */ | |
size_t unencrypted_length = | |
UA_SECURE_CONVERSATION_MESSAGE_HEADER_LENGTH + securityHeaderLength; | |
UA_ByteString dataToEncrypt = {totalLength - unencrypted_length, | |
&buf->data[unencrypted_length]}; | |
return securityPolicy->asymmetricModule.cryptoModule.encryptionAlgorithm. | |
encrypt(securityPolicy, channel->channelContext, &dataToEncrypt); | |
} | |
#endif /* UA_ENABLE_ENCRYPTION */ | |
/* Sends an OPN message using asymmetric encryption if defined */ | |
UA_StatusCode | |
UA_SecureChannel_sendAsymmetricOPNMessage(UA_SecureChannel *channel, | |
UA_UInt32 requestId, const void *content, | |
const UA_DataType *contentType) { | |
if(channel->securityMode == UA_MESSAGESECURITYMODE_INVALID) | |
return UA_STATUSCODE_BADSECURITYMODEREJECTED; | |
const UA_SecurityPolicy *const securityPolicy = channel->securityPolicy; | |
UA_Connection *connection = channel->connection; | |
if(!connection) | |
return UA_STATUSCODE_BADINTERNALERROR; | |
/* Allocate the message buffer */ | |
UA_ByteString buf = UA_BYTESTRING_NULL; | |
UA_StatusCode retval = | |
connection->getSendBuffer(connection, connection->config.sendBufferSize, &buf); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
/* Restrict buffer to the available space for the payload */ | |
UA_Byte *buf_pos = buf.data; | |
const UA_Byte *buf_end = &buf.data[buf.length]; | |
hideBytesAsym(channel, &buf_pos, &buf_end); | |
/* Encode the message type and content */ | |
UA_NodeId typeId = UA_NODEID_NUMERIC(0, contentType->binaryEncodingId); | |
retval |= UA_encodeBinary(&typeId, &UA_TYPES[UA_TYPES_NODEID], | |
&buf_pos, &buf_end, NULL, NULL); | |
retval |= UA_encodeBinary(content, contentType, | |
&buf_pos, &buf_end, NULL, NULL); | |
if(retval != UA_STATUSCODE_GOOD) { | |
connection->releaseSendBuffer(connection, &buf); | |
return retval; | |
} | |
const size_t securityHeaderLength = calculateAsymAlgSecurityHeaderLength(channel); | |
/* Add padding to the chunk */ | |
#ifdef UA_ENABLE_ENCRYPTION | |
padChunkAsym(channel, &buf, securityHeaderLength, &buf_pos); | |
#endif | |
/* The total message length */ | |
size_t pre_sig_length = (uintptr_t)buf_pos - (uintptr_t)buf.data; | |
size_t total_length = pre_sig_length; | |
if(channel->securityMode == UA_MESSAGESECURITYMODE_SIGN || | |
channel->securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) | |
total_length += securityPolicy->asymmetricModule.cryptoModule.signatureAlgorithm. | |
getLocalSignatureSize(securityPolicy, channel->channelContext); | |
/* The total message length is known here which is why we encode the headers | |
* at this step and not earlier. */ | |
size_t finalLength = 0; | |
retval = prependHeadersAsym(channel, buf.data, buf_end, total_length, | |
securityHeaderLength, requestId, &finalLength); | |
if(retval != UA_STATUSCODE_GOOD) | |
goto error; | |
#ifdef UA_ENABLE_ENCRYPTION | |
retval = signAndEncryptAsym(channel, pre_sig_length, &buf, securityHeaderLength, total_length); | |
if(retval != UA_STATUSCODE_GOOD) | |
goto error; | |
#endif | |
/* Send the message, the buffer is freed in the network layer */ | |
buf.length = finalLength; | |
retval = connection->send(connection, &buf); | |
#ifdef UA_ENABLE_UNIT_TEST_FAILURE_HOOKS | |
retval |= sendAsym_sendFailure; | |
#endif | |
return retval; | |
error: | |
connection->releaseSendBuffer(connection, &buf); | |
return retval; | |
} | |
/**************************/ | |
/* Send Symmetric Message */ | |
/**************************/ | |
#ifdef UA_ENABLE_ENCRYPTION | |
static UA_UInt16 | |
calculatePaddingSym(const UA_SecurityPolicy *securityPolicy, const void *channelContext, | |
size_t bytesToWrite, UA_Byte *paddingSize, UA_Byte *extraPaddingSize) { | |
size_t encryptionBlockSize = securityPolicy->symmetricModule.cryptoModule. | |
encryptionAlgorithm.getLocalBlockSize(securityPolicy, channelContext); | |
size_t signatureSize = securityPolicy->symmetricModule.cryptoModule.signatureAlgorithm. | |
getLocalSignatureSize(securityPolicy, channelContext); | |
size_t padding = (encryptionBlockSize - | |
((bytesToWrite + signatureSize + 1) % encryptionBlockSize)); | |
*paddingSize = (UA_Byte)padding; | |
*extraPaddingSize = (UA_Byte)(padding >> 8u); | |
return (UA_UInt16)padding; | |
} | |
static void | |
padChunkSym(UA_MessageContext *messageContext, size_t bodyLength) { | |
if(messageContext->channel->securityMode != UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) | |
return; | |
/* The bytes for the padding and signature were removed from buf_end before | |
* encoding the payload. So we don't have to check if there is enough | |
* space. */ | |
size_t bytesToWrite = bodyLength + UA_SEQUENCE_HEADER_LENGTH; | |
UA_Byte paddingSize = 0; | |
UA_Byte extraPaddingSize = 0; | |
UA_UInt16 totalPaddingSize = | |
calculatePaddingSym(messageContext->channel->securityPolicy, | |
messageContext->channel->channelContext, | |
bytesToWrite, &paddingSize, &extraPaddingSize); | |
/* This is <= because the paddingSize byte also has to be written. */ | |
for(UA_UInt16 i = 0; i <= totalPaddingSize; ++i) { | |
*messageContext->buf_pos = paddingSize; | |
++(messageContext->buf_pos); | |
} | |
if(extraPaddingSize > 0) { | |
*messageContext->buf_pos = extraPaddingSize; | |
++(messageContext->buf_pos); | |
} | |
} | |
static UA_StatusCode | |
signChunkSym(UA_MessageContext *const messageContext, size_t preSigLength) { | |
const UA_SecureChannel *channel = messageContext->channel; | |
if(channel->securityMode != UA_MESSAGESECURITYMODE_SIGN && | |
channel->securityMode != UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) | |
return UA_STATUSCODE_GOOD; | |
const UA_SecurityPolicy *securityPolicy = channel->securityPolicy; | |
UA_ByteString dataToSign = messageContext->messageBuffer; | |
dataToSign.length = preSigLength; | |
UA_ByteString signature; | |
signature.length = securityPolicy->symmetricModule.cryptoModule.signatureAlgorithm. | |
getLocalSignatureSize(securityPolicy, channel->channelContext); | |
signature.data = messageContext->buf_pos; | |
return securityPolicy->symmetricModule.cryptoModule.signatureAlgorithm. | |
sign(securityPolicy, channel->channelContext, &dataToSign, &signature); | |
} | |
static UA_StatusCode | |
encryptChunkSym(UA_MessageContext *const messageContext, size_t totalLength) { | |
const UA_SecureChannel *channel = messageContext->channel; | |
if(channel->securityMode != UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) | |
return UA_STATUSCODE_GOOD; | |
UA_ByteString dataToEncrypt; | |
dataToEncrypt.data = messageContext->messageBuffer.data + UA_SECUREMH_AND_SYMALGH_LENGTH; | |
dataToEncrypt.length = totalLength - UA_SECUREMH_AND_SYMALGH_LENGTH; | |
const UA_SecurityPolicy *securityPolicy = channel->securityPolicy; | |
return securityPolicy->symmetricModule.cryptoModule.encryptionAlgorithm. | |
encrypt(securityPolicy, channel->channelContext, &dataToEncrypt); | |
} | |
#endif /* UA_ENABLE_ENCRYPTION */ | |
static void | |
setBufPos(UA_MessageContext *mc) { | |
/* Forward the data pointer so that the payload is encoded after the | |
* message header */ | |
mc->buf_pos = &mc->messageBuffer.data[UA_SECURE_MESSAGE_HEADER_LENGTH]; | |
mc->buf_end = &mc->messageBuffer.data[mc->messageBuffer.length]; | |
#ifdef UA_ENABLE_ENCRYPTION | |
const UA_SecureChannel *channel = mc->channel; | |
const UA_SecurityPolicy *securityPolicy = channel->securityPolicy; | |
/* Reserve space for the message footer at the end of the chunk if the chunk | |
* is signed and/or encrypted. The footer includes the fields PaddingSize, | |
* Padding, ExtraPadding and Signature. The padding fields are only present | |
* if the chunk is encrypted. */ | |
if(channel->securityMode == UA_MESSAGESECURITYMODE_SIGN || | |
channel->securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) | |
mc->buf_end -= securityPolicy->symmetricModule.cryptoModule.signatureAlgorithm. | |
getLocalSignatureSize(securityPolicy, channel->channelContext); | |
/* The size of the padding depends on the amount of data that shall be sent | |
* and is unknown at this point. Reserve space for the PaddingSize byte, | |
* the maximum amount of Padding which equals the block size of the | |
* symmetric encryption algorithm and last 1 byte for the ExtraPaddingSize | |
* field that is present if the encryption key is larger than 2048 bits. | |
* The actual padding size is later calculated by the function | |
* calculatePaddingSym(). */ | |
if(channel->securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) { | |
/* PaddingSize and ExtraPaddingSize fields */ | |
size_t encryptionBlockSize = securityPolicy->symmetricModule.cryptoModule. | |
encryptionAlgorithm.getLocalBlockSize(securityPolicy, channel->channelContext); | |
mc->buf_end -= 1 + ((encryptionBlockSize >> 8u) ? 1 : 0); | |
/* Reduce the message body size with the remainder of the operation | |
* maxEncryptedDataSize modulo EncryptionBlockSize to get a whole | |
* number of blocks to encrypt later. Also reserve one byte for | |
* padding (1 <= paddingSize <= encryptionBlockSize). */ | |
size_t maxEncryptDataSize = mc->messageBuffer.length - | |
UA_SECURE_CONVERSATION_MESSAGE_HEADER_LENGTH - | |
UA_SYMMETRIC_ALG_SECURITY_HEADER_LENGTH; | |
mc->buf_end -= (maxEncryptDataSize % encryptionBlockSize) + 1; | |
} | |
#endif | |
} | |
static UA_StatusCode | |
checkLimitsSym(UA_MessageContext *const messageContext, size_t *const bodyLength) { | |
/* Will this chunk surpass the capacity of the SecureChannel for the message? */ | |
UA_Connection *const connection = messageContext->channel->connection; | |
if(!connection) | |
return UA_STATUSCODE_BADINTERNALERROR; | |
UA_Byte *buf_body_start = messageContext->messageBuffer.data + UA_SECURE_MESSAGE_HEADER_LENGTH; | |
const UA_Byte *buf_body_end = messageContext->buf_pos; | |
*bodyLength = (uintptr_t)buf_body_end - (uintptr_t)buf_body_start; | |
messageContext->messageSizeSoFar += *bodyLength; | |
messageContext->chunksSoFar++; | |
if(messageContext->messageSizeSoFar > connection->config.maxMessageSize && | |
connection->config.maxMessageSize != 0) | |
return UA_STATUSCODE_BADRESPONSETOOLARGE; | |
if(messageContext->chunksSoFar > connection->config.maxChunkCount && | |
connection->config.maxChunkCount != 0) | |
return UA_STATUSCODE_BADRESPONSETOOLARGE; | |
return UA_STATUSCODE_GOOD; | |
} | |
static UA_StatusCode | |
encodeHeadersSym(UA_MessageContext *const messageContext, size_t totalLength) { | |
UA_SecureChannel *channel = messageContext->channel; | |
UA_Byte *header_pos = messageContext->messageBuffer.data; | |
UA_SecureConversationMessageHeader respHeader; | |
respHeader.secureChannelId = channel->securityToken.channelId; | |
respHeader.messageHeader.messageTypeAndChunkType = messageContext->messageType; | |
respHeader.messageHeader.messageSize = (UA_UInt32)totalLength; | |
if(messageContext->final) | |
respHeader.messageHeader.messageTypeAndChunkType += UA_CHUNKTYPE_FINAL; | |
else | |
respHeader.messageHeader.messageTypeAndChunkType += UA_CHUNKTYPE_INTERMEDIATE; | |
UA_StatusCode res = | |
UA_encodeBinary(&respHeader, &UA_TRANSPORT[UA_TRANSPORT_SECURECONVERSATIONMESSAGEHEADER], | |
&header_pos, &messageContext->buf_end, NULL, NULL); | |
UA_SymmetricAlgorithmSecurityHeader symSecHeader; | |
symSecHeader.tokenId = channel->securityToken.tokenId; | |
res |= UA_encodeBinary(&symSecHeader.tokenId, | |
&UA_TRANSPORT[UA_TRANSPORT_SYMMETRICALGORITHMSECURITYHEADER], | |
&header_pos, &messageContext->buf_end, NULL, NULL); | |
UA_SequenceHeader seqHeader; | |
seqHeader.requestId = messageContext->requestId; | |
seqHeader.sequenceNumber = UA_atomic_addUInt32(&channel->sendSequenceNumber, 1); | |
res |= UA_encodeBinary(&seqHeader, &UA_TRANSPORT[UA_TRANSPORT_SEQUENCEHEADER], | |
&header_pos, &messageContext->buf_end, NULL, NULL); | |
return res; | |
} | |
static UA_StatusCode | |
sendSymmetricChunk(UA_MessageContext *messageContext) { | |
UA_SecureChannel *const channel = messageContext->channel; | |
const UA_SecurityPolicy *securityPolicy = channel->securityPolicy; | |
UA_Connection *const connection = channel->connection; | |
if(!connection) | |
return UA_STATUSCODE_BADINTERNALERROR; | |
size_t bodyLength = 0; | |
UA_StatusCode res = checkLimitsSym(messageContext, &bodyLength); | |
if(res != UA_STATUSCODE_GOOD) | |
goto error; | |
/* Add padding */ | |
#ifdef UA_ENABLE_ENCRYPTION | |
padChunkSym(messageContext, bodyLength); | |
#endif | |
/* The total message length */ | |
size_t pre_sig_length = (uintptr_t)(messageContext->buf_pos) - | |
(uintptr_t)messageContext->messageBuffer.data; | |
size_t total_length = pre_sig_length; | |
if(channel->securityMode == UA_MESSAGESECURITYMODE_SIGN || | |
channel->securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) | |
total_length += securityPolicy->symmetricModule.cryptoModule.signatureAlgorithm. | |
getLocalSignatureSize(securityPolicy, channel->channelContext); | |
/* Space for the padding and the signature have been reserved in setBufPos() */ | |
UA_assert(total_length <= connection->config.sendBufferSize); | |
/* For giving the buffer to the network layer */ | |
messageContext->messageBuffer.length = total_length; | |
UA_assert(res == UA_STATUSCODE_GOOD); | |
res = encodeHeadersSym(messageContext, total_length); | |
if(res != UA_STATUSCODE_GOOD) | |
goto error; | |
#ifdef UA_ENABLE_ENCRYPTION | |
res = signChunkSym(messageContext, pre_sig_length); | |
if(res != UA_STATUSCODE_GOOD) | |
goto error; | |
res = encryptChunkSym(messageContext, total_length); | |
if(res != UA_STATUSCODE_GOOD) | |
goto error; | |
#endif | |
/* Send the chunk, the buffer is freed in the network layer */ | |
return connection->send(channel->connection, &messageContext->messageBuffer); | |
error: | |
connection->releaseSendBuffer(channel->connection, &messageContext->messageBuffer); | |
return res; | |
} | |
/* Callback from the encoding layer. Send the chunk and replace the buffer. */ | |
static UA_StatusCode | |
sendSymmetricEncodingCallback(void *data, UA_Byte **buf_pos, const UA_Byte **buf_end) { | |
/* Set buf values from encoding in the messagecontext */ | |
UA_MessageContext *mc = (UA_MessageContext *)data; | |
mc->buf_pos = *buf_pos; | |
mc->buf_end = *buf_end; | |
/* Send out */ | |
UA_StatusCode retval = sendSymmetricChunk(mc); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
/* Set a new buffer for the next chunk */ | |
UA_Connection *connection = mc->channel->connection; | |
if(!connection) | |
return UA_STATUSCODE_BADINTERNALERROR; | |
retval = connection->getSendBuffer(connection, connection->config.sendBufferSize, | |
&mc->messageBuffer); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
/* Hide bytes for header, padding and signature */ | |
setBufPos(mc); | |
*buf_pos = mc->buf_pos; | |
*buf_end = mc->buf_end; | |
return UA_STATUSCODE_GOOD; | |
} | |
UA_StatusCode | |
UA_MessageContext_begin(UA_MessageContext *mc, UA_SecureChannel *channel, | |
UA_UInt32 requestId, UA_MessageType messageType) { | |
UA_Connection *connection = channel->connection; | |
if(!connection) | |
return UA_STATUSCODE_BADINTERNALERROR; | |
if(messageType != UA_MESSAGETYPE_MSG && messageType != UA_MESSAGETYPE_CLO) | |
return UA_STATUSCODE_BADINTERNALERROR; | |
/* Create the chunking info structure */ | |
mc->channel = channel; | |
mc->requestId = requestId; | |
mc->chunksSoFar = 0; | |
mc->messageSizeSoFar = 0; | |
mc->final = false; | |
mc->messageBuffer = UA_BYTESTRING_NULL; | |
mc->messageType = messageType; | |
/* Allocate the message buffer */ | |
UA_StatusCode retval = | |
connection->getSendBuffer(connection, connection->config.sendBufferSize, | |
&mc->messageBuffer); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
/* Hide bytes for header, padding and signature */ | |
setBufPos(mc); | |
return UA_STATUSCODE_GOOD; | |
} | |
UA_StatusCode | |
UA_MessageContext_encode(UA_MessageContext *mc, const void *content, | |
const UA_DataType *contentType) { | |
UA_StatusCode retval = UA_encodeBinary(content, contentType, &mc->buf_pos, &mc->buf_end, | |
sendSymmetricEncodingCallback, mc); | |
if(retval != UA_STATUSCODE_GOOD && mc->messageBuffer.length > 0) | |
UA_MessageContext_abort(mc); | |
return retval; | |
} | |
UA_StatusCode | |
UA_MessageContext_finish(UA_MessageContext *mc) { | |
mc->final = true; | |
return sendSymmetricChunk(mc); | |
} | |
void | |
UA_MessageContext_abort(UA_MessageContext *mc) { | |
UA_Connection *connection = mc->channel->connection; | |
connection->releaseSendBuffer(connection, &mc->messageBuffer); | |
} | |
UA_StatusCode | |
UA_SecureChannel_sendSymmetricMessage(UA_SecureChannel *channel, UA_UInt32 requestId, | |
UA_MessageType messageType, void *payload, | |
const UA_DataType *payloadType) { | |
if(!channel || !channel->connection || !payload || !payloadType) | |
return UA_STATUSCODE_BADINTERNALERROR; | |
if(channel->connection->state == UA_CONNECTION_CLOSED) | |
return UA_STATUSCODE_BADCONNECTIONCLOSED; | |
UA_MessageContext mc; | |
UA_StatusCode retval = UA_MessageContext_begin(&mc, channel, requestId, messageType); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
/* Assert's required for clang-analyzer */ | |
UA_assert(mc.buf_pos == &mc.messageBuffer.data[UA_SECURE_MESSAGE_HEADER_LENGTH]); | |
UA_assert(mc.buf_end <= &mc.messageBuffer.data[mc.messageBuffer.length]); | |
UA_NodeId typeId = UA_NODEID_NUMERIC(0, payloadType->binaryEncodingId); | |
retval = UA_MessageContext_encode(&mc, &typeId, &UA_TYPES[UA_TYPES_NODEID]); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
retval = UA_MessageContext_encode(&mc, payload, payloadType); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
return UA_MessageContext_finish(&mc); | |
} | |
/*****************************/ | |
/* Assemble Complete Message */ | |
/*****************************/ | |
static UA_StatusCode | |
addChunkPayload(UA_SecureChannel *channel, UA_UInt32 requestId, | |
UA_MessageType messageType, UA_ByteString *chunkPayload, | |
UA_Boolean final) { | |
UA_Message *latest = TAILQ_LAST(&channel->messages, UA_MessageQueue); | |
if(latest) { | |
if(latest->requestId != requestId) { | |
/* Start of a new message */ | |
if(!latest->final) | |
return UA_STATUSCODE_BADTCPMESSAGETYPEINVALID; | |
latest = NULL; | |
} else { | |
if(latest->messageType != messageType) /* MessageType mismatch */ | |
return UA_STATUSCODE_BADTCPMESSAGETYPEINVALID; | |
if(latest->final) /* Correct message, but already finalized */ | |
return UA_STATUSCODE_BADTCPMESSAGETYPEINVALID; | |
} | |
} | |
/* Create a new message entry */ | |
if(!latest) { | |
latest = (UA_Message *)UA_malloc(sizeof(UA_Message)); | |
if(!latest) | |
return UA_STATUSCODE_BADOUTOFMEMORY; | |
memset(latest, 0, sizeof(UA_Message)); | |
latest->requestId = requestId; | |
latest->messageType = messageType; | |
SIMPLEQ_INIT(&latest->chunkPayloads); | |
TAILQ_INSERT_TAIL(&channel->messages, latest, pointers); | |
} | |
/* Test against the connection settings */ | |
const UA_ConnectionConfig *config = &channel->connection->config; | |
UA_assert(config != NULL); /* clang-analyzer false positive */ | |
if(config->maxChunkCount > 0 && | |
config->maxChunkCount <= latest->chunkPayloadsSize) | |
return UA_STATUSCODE_BADRESPONSETOOLARGE; | |
if(config->maxMessageSize > 0 && | |
config->maxMessageSize < latest->messageSize + chunkPayload->length) | |
return UA_STATUSCODE_BADRESPONSETOOLARGE; | |
/* Create a new chunk entry */ | |
UA_ChunkPayload *cp = (UA_ChunkPayload *)UA_malloc(sizeof(UA_ChunkPayload)); | |
if(!cp) | |
return UA_STATUSCODE_BADOUTOFMEMORY; | |
cp->bytes = *chunkPayload; | |
cp->copied = false; | |
/* Add the chunk */ | |
SIMPLEQ_INSERT_TAIL(&latest->chunkPayloads, cp, pointers); | |
latest->chunkPayloadsSize += 1; | |
latest->messageSize += chunkPayload->length; | |
latest->final = final; | |
return UA_STATUSCODE_GOOD; | |
} | |
static UA_StatusCode | |
processMessage(UA_SecureChannel *channel, const UA_Message *message, | |
void *application, UA_ProcessMessageCallback callback) { | |
if(message->chunkPayloadsSize == 1) { | |
/* No need to combine chunks */ | |
UA_ChunkPayload *cp = SIMPLEQ_FIRST(&message->chunkPayloads); | |
callback(application, channel, message->messageType, message->requestId, &cp->bytes); | |
} else { | |
/* Allocate memory */ | |
UA_ByteString bytes; | |
bytes.data = (UA_Byte *)UA_malloc(message->messageSize); | |
if(!bytes.data) { | |
UA_LOG_ERROR(channel->securityPolicy->logger, UA_LOGCATEGORY_SECURECHANNEL, | |
"Could not allocate the memory to assemble the message"); | |
return UA_STATUSCODE_BADOUTOFMEMORY; | |
} | |
bytes.length = message->messageSize; | |
/* Assemble the full message */ | |
size_t curPos = 0; | |
UA_ChunkPayload *cp; | |
SIMPLEQ_FOREACH(cp, &message->chunkPayloads, pointers) { | |
memcpy(&bytes.data[curPos], cp->bytes.data, cp->bytes.length); | |
curPos += cp->bytes.length; | |
} | |
/* Process the message */ | |
callback(application, channel, message->messageType, message->requestId, &bytes); | |
UA_ByteString_deleteMembers(&bytes); | |
} | |
return UA_STATUSCODE_GOOD; | |
} | |
UA_StatusCode | |
UA_SecureChannel_processCompleteMessages(UA_SecureChannel *channel, void *application, | |
UA_ProcessMessageCallback callback) { | |
UA_Message *message, *tmp_message; | |
UA_StatusCode retval = UA_STATUSCODE_GOOD; | |
TAILQ_FOREACH_SAFE(message, &channel->messages, pointers, tmp_message) { | |
/* Stop at the first incomplete message */ | |
if(!message->final) | |
break; | |
/* Has the channel been closed (during the last message)? */ | |
if(channel->state == UA_SECURECHANNELSTATE_CLOSED) | |
break; | |
/* Remove the current message before processing */ | |
TAILQ_REMOVE(&channel->messages, message, pointers); | |
/* Process */ | |
retval = processMessage(channel, message, application, callback); | |
if(retval != UA_STATUSCODE_GOOD) | |
break; | |
/* Clean up the message */ | |
UA_ChunkPayload *payload; | |
while((payload = SIMPLEQ_FIRST(&message->chunkPayloads))) { | |
if(payload->copied) | |
UA_ByteString_deleteMembers(&payload->bytes); | |
SIMPLEQ_REMOVE_HEAD(&message->chunkPayloads, pointers); | |
UA_free(payload); | |
} | |
UA_free(message); | |
} | |
return retval; | |
} | |
/****************************/ | |
/* Process a received Chunk */ | |
/****************************/ | |
static UA_StatusCode | |
decryptChunk(const UA_SecureChannel *const channel, | |
const UA_SecurityPolicyCryptoModule *const cryptoModule, | |
UA_MessageType const messageType, const UA_ByteString *const chunk, | |
size_t const offset, size_t *const chunkSizeAfterDecryption) { | |
UA_LOG_TRACE_CHANNEL(channel->securityPolicy->logger, channel, "Decrypting chunk"); | |
UA_ByteString cipherText = {chunk->length - offset, chunk->data + offset}; | |
size_t sizeBeforeDecryption = cipherText.length; | |
size_t chunkSizeBeforeDecryption = *chunkSizeAfterDecryption; | |
/* Always decrypt opn messages if mode not none */ | |
if(channel->securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT || | |
messageType == UA_MESSAGETYPE_OPN) { | |
UA_StatusCode retval = cryptoModule->encryptionAlgorithm. | |
decrypt(channel->securityPolicy, channel->channelContext, &cipherText); | |
*chunkSizeAfterDecryption -= (sizeBeforeDecryption - cipherText.length); | |
if(retval != UA_STATUSCODE_GOOD) { | |
return retval; | |
} | |
} | |
UA_LOG_TRACE_CHANNEL(channel->securityPolicy->logger, channel, | |
"Chunk size before and after decryption: %lu, %lu", | |
(long unsigned int)chunkSizeBeforeDecryption, | |
(long unsigned int)*chunkSizeAfterDecryption); | |
return UA_STATUSCODE_GOOD; | |
} | |
static UA_UInt16 | |
decodeChunkPaddingSize(const UA_SecureChannel *const channel, | |
const UA_SecurityPolicyCryptoModule *const cryptoModule, | |
UA_MessageType const messageType, const UA_ByteString *const chunk, | |
size_t const chunkSizeAfterDecryption, size_t sigsize) { | |
/* Is padding used? */ | |
if(channel->securityMode != UA_MESSAGESECURITYMODE_SIGNANDENCRYPT && | |
!(messageType == UA_MESSAGETYPE_OPN && | |
!UA_String_equal(&cryptoModule->encryptionAlgorithm.uri, &UA_STRING_NULL))) | |
return 0; | |
size_t paddingSize = chunk->data[chunkSizeAfterDecryption - sigsize - 1]; | |
/* Extra padding size */ | |
size_t keyLength = cryptoModule->encryptionAlgorithm. | |
getLocalKeyLength(channel->securityPolicy, channel->channelContext); | |
if(keyLength > 2048) { | |
paddingSize <<= 8u; | |
paddingSize += 1; | |
paddingSize += chunk->data[chunkSizeAfterDecryption - sigsize - 2]; | |
} | |
/* We need to add one to the padding size since the paddingSize byte itself | |
* need to be removed as well. */ | |
paddingSize += 1; | |
UA_LOG_TRACE_CHANNEL(channel->securityPolicy->logger, channel, | |
"Calculated padding size to be %lu", | |
(long unsigned int)paddingSize); | |
return (UA_UInt16)paddingSize; | |
} | |
static UA_StatusCode | |
verifyChunk(const UA_SecureChannel *const channel, | |
const UA_SecurityPolicyCryptoModule *const cryptoModule, | |
const UA_ByteString *const chunk, | |
size_t const chunkSizeAfterDecryption, size_t sigsize) { | |
UA_LOG_TRACE_CHANNEL(channel->securityPolicy->logger, channel, | |
"Verifying chunk signature"); | |
/* Verify the signature */ | |
const UA_ByteString chunkDataToVerify = {chunkSizeAfterDecryption - sigsize, chunk->data}; | |
const UA_ByteString signature = {sigsize, chunk->data + chunkSizeAfterDecryption - sigsize}; | |
UA_StatusCode retval = cryptoModule->signatureAlgorithm. | |
verify(channel->securityPolicy, channel->channelContext, &chunkDataToVerify, &signature); | |
#ifdef UA_ENABLE_UNIT_TEST_FAILURE_HOOKS | |
retval |= decrypt_verifySignatureFailure; | |
#endif | |
return retval; | |
} | |
/* Sets the payload to a pointer inside the chunk buffer. Returns the requestId | |
* and the sequenceNumber */ | |
static UA_StatusCode | |
decryptAndVerifyChunk(const UA_SecureChannel *channel, | |
const UA_SecurityPolicyCryptoModule *cryptoModule, | |
UA_MessageType messageType, const UA_ByteString *chunk, | |
size_t offset, UA_UInt32 *requestId, | |
UA_UInt32 *sequenceNumber, UA_ByteString *payload) { | |
size_t chunkSizeAfterDecryption = chunk->length; | |
UA_StatusCode retval = decryptChunk(channel, cryptoModule, messageType, | |
chunk, offset, &chunkSizeAfterDecryption); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
/* Verify the chunk signature */ | |
size_t sigsize = 0; | |
size_t paddingSize = 0; | |
const UA_SecurityPolicy *securityPolicy = channel->securityPolicy; | |
if(channel->securityMode == UA_MESSAGESECURITYMODE_SIGN || | |
channel->securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT || | |
messageType == UA_MESSAGETYPE_OPN) { | |
sigsize = cryptoModule->signatureAlgorithm. | |
getRemoteSignatureSize(securityPolicy, channel->channelContext); | |
paddingSize = decodeChunkPaddingSize(channel, cryptoModule, messageType, chunk, | |
chunkSizeAfterDecryption, sigsize); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
if(offset + paddingSize + sigsize >= chunkSizeAfterDecryption) | |
return UA_STATUSCODE_BADSECURITYCHECKSFAILED; | |
retval = verifyChunk(channel, cryptoModule, chunk, chunkSizeAfterDecryption, sigsize); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
} | |
/* Decode the sequence header */ | |
UA_SequenceHeader sequenceHeader; | |
retval = UA_SequenceHeader_decodeBinary(chunk, &offset, &sequenceHeader); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
if(offset + paddingSize + sigsize >= chunk->length) | |
return UA_STATUSCODE_BADSECURITYCHECKSFAILED; | |
*requestId = sequenceHeader.requestId; | |
*sequenceNumber = sequenceHeader.sequenceNumber; | |
payload->data = chunk->data + offset; | |
payload->length = chunkSizeAfterDecryption - offset - sigsize - paddingSize; | |
UA_LOG_TRACE_CHANNEL(channel->securityPolicy->logger, channel, | |
"Decrypted and verified chunk with request id %u and " | |
"sequence number %u", *requestId, *sequenceNumber); | |
return UA_STATUSCODE_GOOD; | |
} | |
typedef UA_StatusCode | |
(*UA_SequenceNumberCallback)(UA_SecureChannel *channel, UA_UInt32 sequenceNumber); | |
static UA_StatusCode | |
processSequenceNumberAsym(UA_SecureChannel *channel, UA_UInt32 sequenceNumber) { | |
UA_LOG_TRACE_CHANNEL(channel->securityPolicy->logger, channel, | |
"Sequence Number processed: %i", sequenceNumber); | |
channel->receiveSequenceNumber = sequenceNumber; | |
return UA_STATUSCODE_GOOD; | |
} | |
static UA_StatusCode | |
processSequenceNumberSym(UA_SecureChannel *channel, UA_UInt32 sequenceNumber) { | |
/* Failure mode hook for unit tests */ | |
#ifdef UA_ENABLE_UNIT_TEST_FAILURE_HOOKS | |
if(processSym_seqNumberFailure != UA_STATUSCODE_GOOD) | |
return processSym_seqNumberFailure; | |
#endif | |
UA_LOG_TRACE_CHANNEL(channel->securityPolicy->logger, channel, | |
"Sequence Number processed: %i", sequenceNumber); | |
/* Does the sequence number match? */ | |
if(sequenceNumber != channel->receiveSequenceNumber + 1) { | |
/* FIXME: Remove magic numbers :( */ | |
if(channel->receiveSequenceNumber + 1 > 4294966271 && sequenceNumber < 1024) | |
channel->receiveSequenceNumber = sequenceNumber - 1; /* Roll over */ | |
else | |
return UA_STATUSCODE_BADSECURITYCHECKSFAILED; | |
} | |
++channel->receiveSequenceNumber; | |
return UA_STATUSCODE_GOOD; | |
} | |
static UA_StatusCode | |
checkAsymHeader(UA_SecureChannel *const channel, | |
UA_AsymmetricAlgorithmSecurityHeader *const asymHeader) { | |
const UA_SecurityPolicy *const securityPolicy = channel->securityPolicy; | |
if(!UA_ByteString_equal(&securityPolicy->policyUri, | |
&asymHeader->securityPolicyUri)) { | |
return UA_STATUSCODE_BADSECURITYPOLICYREJECTED; | |
} | |
// TODO: Verify certificate using certificate plugin. This will come with a new PR | |
/* Something like this | |
retval = certificateManager->verify(certificateStore??, &asymHeader->senderCertificate); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
*/ | |
UA_StatusCode retval = securityPolicy->asymmetricModule. | |
compareCertificateThumbprint(securityPolicy, | |
&asymHeader->receiverCertificateThumbprint); | |
if(retval != UA_STATUSCODE_GOOD) { | |
return retval; | |
} | |
return UA_STATUSCODE_GOOD; | |
} | |
static UA_StatusCode | |
checkPreviousToken(UA_SecureChannel *const channel, const UA_UInt32 tokenId) { | |
if(tokenId != channel->previousSecurityToken.tokenId) | |
return UA_STATUSCODE_BADSECURECHANNELTOKENUNKNOWN; | |
UA_DateTime timeout = channel->previousSecurityToken.createdAt + | |
(UA_DateTime)((UA_Double)channel->previousSecurityToken.revisedLifetime * | |
(UA_Double)UA_DATETIME_MSEC * 1.25); | |
if(timeout < UA_DateTime_nowMonotonic()) | |
return UA_STATUSCODE_BADSECURECHANNELTOKENUNKNOWN; | |
return UA_STATUSCODE_GOOD; | |
} | |
static UA_StatusCode | |
checkSymHeader(UA_SecureChannel *const channel, | |
const UA_UInt32 tokenId, UA_Boolean allowPreviousToken) { | |
/* If the message uses the currently active token, check if it is still valid */ | |
if(tokenId == channel->securityToken.tokenId) { | |
if(channel->state == UA_SECURECHANNELSTATE_OPEN && | |
(channel->securityToken.createdAt + | |
(channel->securityToken.revisedLifetime * UA_DATETIME_MSEC)) | |
< UA_DateTime_nowMonotonic()) { | |
UA_SecureChannel_close(channel); | |
return UA_STATUSCODE_BADSECURECHANNELCLOSED; | |
} | |
} | |
/* If the message uses a different token, check if it is the next token. */ | |
if(tokenId != channel->securityToken.tokenId) { | |
/* If it isn't the next token, we might be dealing with a message, that | |
* still uses the old token, so check if the old one is still valid.*/ | |
if(tokenId != channel->nextSecurityToken.tokenId) { | |
if(allowPreviousToken) | |
return checkPreviousToken(channel, tokenId); | |
return UA_STATUSCODE_BADSECURECHANNELTOKENUNKNOWN; | |
} | |
/* If the token is indeed the next token, revolve the tokens */ | |
UA_StatusCode retval = UA_SecureChannel_revolveTokens(channel); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
/* If the message now uses the currently active token also generate | |
* new remote keys to correctly decrypt. */ | |
if(channel->securityToken.tokenId == tokenId) { | |
retval = UA_SecureChannel_generateRemoteKeys(channel, channel->securityPolicy); | |
UA_ChannelSecurityToken_deleteMembers(&channel->previousSecurityToken); | |
UA_ChannelSecurityToken_init(&channel->previousSecurityToken); | |
return retval; | |
} | |
} | |
/* It is possible that the sent messages already use the new token, but | |
* the received messages still use the old token. If we receive a message | |
* with the new token, we will need to generate the keys and discard the | |
* old token now*/ | |
if(channel->previousSecurityToken.tokenId != 0) { | |
UA_StatusCode retval = | |
UA_SecureChannel_generateRemoteKeys(channel, channel->securityPolicy); | |
UA_ChannelSecurityToken_deleteMembers(&channel->previousSecurityToken); | |
UA_ChannelSecurityToken_init(&channel->previousSecurityToken); | |
return retval; | |
} | |
return UA_STATUSCODE_GOOD; | |
} | |
static UA_StatusCode | |
putPayload(UA_SecureChannel *const channel, UA_UInt32 const requestId, | |
UA_MessageType const messageType, UA_ChunkType const chunkType, | |
UA_ByteString *chunkPayload) { | |
switch(chunkType) { | |
case UA_CHUNKTYPE_INTERMEDIATE: | |
case UA_CHUNKTYPE_FINAL: | |
return addChunkPayload(channel, requestId, messageType, | |
chunkPayload, chunkType == UA_CHUNKTYPE_FINAL); | |
case UA_CHUNKTYPE_ABORT: | |
deleteLatestMessage(channel, requestId); | |
return UA_STATUSCODE_GOOD; | |
default: | |
return UA_STATUSCODE_BADTCPMESSAGETYPEINVALID; | |
} | |
} | |
/* The chunk body begins after the SecureConversationMessageHeader */ | |
static UA_StatusCode | |
decryptAddChunk(UA_SecureChannel *channel, const UA_ByteString *chunk, | |
UA_Boolean allowPreviousToken) { | |
/* Decode the MessageHeader */ | |
size_t offset = 0; | |
UA_SecureConversationMessageHeader messageHeader; | |
UA_StatusCode retval = | |
UA_SecureConversationMessageHeader_decodeBinary(chunk, &offset, &messageHeader); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
#if !defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) | |
/* The wrong ChannelId. Non-opened channels have the id zero. */ | |
if(messageHeader.secureChannelId != channel->securityToken.channelId && | |
channel->state != UA_SECURECHANNELSTATE_FRESH) | |
return UA_STATUSCODE_BADSECURECHANNELIDINVALID; | |
#endif | |
UA_MessageType messageType = (UA_MessageType) | |
(messageHeader.messageHeader.messageTypeAndChunkType & UA_BITMASK_MESSAGETYPE); | |
UA_ChunkType chunkType = (UA_ChunkType) | |
(messageHeader.messageHeader.messageTypeAndChunkType & UA_BITMASK_CHUNKTYPE); | |
UA_UInt32 requestId = 0; | |
UA_UInt32 sequenceNumber = 0; | |
UA_ByteString chunkPayload; | |
const UA_SecurityPolicyCryptoModule *cryptoModule = NULL; | |
UA_SequenceNumberCallback sequenceNumberCallback = NULL; | |
switch(messageType) { | |
/* ERR message (not encrypted) */ | |
case UA_MESSAGETYPE_ERR: | |
if(chunkType != UA_CHUNKTYPE_FINAL) | |
return UA_STATUSCODE_BADTCPMESSAGETYPEINVALID; | |
chunkPayload.length = chunk->length - offset; | |
chunkPayload.data = chunk->data + offset; | |
return putPayload(channel, requestId, messageType, chunkType, &chunkPayload); | |
/* MSG and CLO: Symmetric encryption */ | |
case UA_MESSAGETYPE_MSG: | |
case UA_MESSAGETYPE_CLO: { | |
/* Decode and check the symmetric security header (tokenId) */ | |
UA_SymmetricAlgorithmSecurityHeader symmetricSecurityHeader; | |
UA_SymmetricAlgorithmSecurityHeader_init(&symmetricSecurityHeader); | |
retval = UA_SymmetricAlgorithmSecurityHeader_decodeBinary(chunk, &offset, | |
&symmetricSecurityHeader); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION | |
/* Help fuzzing by always setting the correct tokenId */ | |
symmetricSecurityHeader.tokenId = channel->securityToken.tokenId; | |
#endif | |
retval = checkSymHeader(channel, symmetricSecurityHeader.tokenId, allowPreviousToken); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
cryptoModule = &channel->securityPolicy->symmetricModule.cryptoModule; | |
sequenceNumberCallback = processSequenceNumberSym; | |
break; | |
} | |
/* OPN: Asymmetric encryption */ | |
case UA_MESSAGETYPE_OPN: { | |
/* Chunking not allowed for OPN */ | |
if(chunkType != UA_CHUNKTYPE_FINAL) | |
return UA_STATUSCODE_BADTCPMESSAGETYPEINVALID; | |
/* Decode the asymmetric algorithm security header and call the callback | |
* to perform checks. */ | |
UA_AsymmetricAlgorithmSecurityHeader asymHeader; | |
UA_AsymmetricAlgorithmSecurityHeader_init(&asymHeader); | |
offset = UA_SECURE_CONVERSATION_MESSAGE_HEADER_LENGTH; | |
retval = UA_AsymmetricAlgorithmSecurityHeader_decodeBinary(chunk, &offset, &asymHeader); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
retval = checkAsymHeader(channel, &asymHeader); | |
UA_AsymmetricAlgorithmSecurityHeader_deleteMembers(&asymHeader); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
cryptoModule = &channel->securityPolicy->asymmetricModule.cryptoModule; | |
sequenceNumberCallback = processSequenceNumberAsym; | |
break; | |
} | |
/* Invalid message type */ | |
default:return UA_STATUSCODE_BADTCPMESSAGETYPEINVALID; | |
} | |
UA_assert(cryptoModule != NULL); | |
retval = decryptAndVerifyChunk(channel, cryptoModule, messageType, chunk, offset, | |
&requestId, &sequenceNumber, &chunkPayload); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
/* Check the sequence number. Skip sequence number checking for fuzzer to | |
* improve coverage */ | |
if(sequenceNumberCallback == NULL) | |
return UA_STATUSCODE_BADINTERNALERROR; | |
#if defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) | |
retval = UA_STATUSCODE_GOOD; | |
#else | |
retval = sequenceNumberCallback(channel, sequenceNumber); | |
#endif | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
return putPayload(channel, requestId, messageType, chunkType, &chunkPayload); | |
} | |
UA_StatusCode | |
UA_SecureChannel_decryptAddChunk(UA_SecureChannel *channel, const UA_ByteString *chunk, | |
UA_Boolean allowPreviousToken) { | |
/* Has the SecureChannel timed out? */ | |
if(channel->state == UA_SECURECHANNELSTATE_CLOSED) | |
return UA_STATUSCODE_BADSECURECHANNELCLOSED; | |
/* Is the SecureChannel configured? */ | |
if(!channel->connection) | |
return UA_STATUSCODE_BADINTERNALERROR; | |
UA_StatusCode retval = decryptAddChunk(channel, chunk, allowPreviousToken); | |
if(retval != UA_STATUSCODE_GOOD) | |
UA_SecureChannel_close(channel); | |
return retval; | |
} | |
UA_StatusCode | |
UA_SecureChannel_persistIncompleteMessages(UA_SecureChannel *channel) { | |
UA_Message *me; | |
TAILQ_FOREACH(me, &channel->messages, pointers) { | |
UA_ChunkPayload *cp; | |
SIMPLEQ_FOREACH(cp, &me->chunkPayloads, pointers) { | |
if(cp->copied) | |
continue; | |
UA_ByteString copy; | |
UA_StatusCode retval = UA_ByteString_copy(&cp->bytes, ©); | |
if(retval != UA_STATUSCODE_GOOD) { | |
UA_SecureChannel_close(channel); | |
return retval; | |
} | |
cp->bytes = copy; | |
cp->copied = true; | |
} | |
} | |
return UA_STATUSCODE_GOOD; | |
} | |
/* Functionality used by both the SecureChannel and the SecurityPolicy */ | |
size_t | |
UA_SecurityPolicy_getRemoteAsymEncryptionBufferLengthOverhead(const UA_SecurityPolicy *securityPolicy, | |
const void *channelContext, | |
size_t maxEncryptionLength) { | |
if(maxEncryptionLength == 0) | |
return 0; | |
size_t plainTextBlockSize = securityPolicy->asymmetricModule.cryptoModule. | |
encryptionAlgorithm.getRemotePlainTextBlockSize(securityPolicy, channelContext); | |
size_t encryptedBlockSize = securityPolicy->asymmetricModule.cryptoModule. | |
encryptionAlgorithm.getRemoteBlockSize(securityPolicy, channelContext); | |
if(plainTextBlockSize == 0) | |
return 0; | |
size_t maxNumberOfBlocks = maxEncryptionLength / plainTextBlockSize; | |
return maxNumberOfBlocks * (encryptedBlockSize - plainTextBlockSize); | |
} | |
/*********************************** amalgamated original file "E:/Librarys/open62541/src/server/ua_session.c" ***********************************/ | |
/* This Source Code Form is subject to the terms of the Mozilla Public | |
* License, v. 2.0. If a copy of the MPL was not distributed with this | |
* file, You can obtain one at http://mozilla.org/MPL/2.0/. | |
* | |
* Copyright 2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) | |
* Copyright 2018 (c) Thomas Stalder, Blue Time Concept SA | |
*/ | |
#ifdef UA_ENABLE_SUBSCRIPTIONS | |
#endif | |
#define UA_SESSION_NONCELENTH 32 | |
void UA_Session_init(UA_Session *session) { | |
memset(session, 0, sizeof(UA_Session)); | |
session->availableContinuationPoints = UA_MAXCONTINUATIONPOINTS; | |
#ifdef UA_ENABLE_SUBSCRIPTIONS | |
SIMPLEQ_INIT(&session->responseQueue); | |
#endif | |
} | |
void UA_Session_deleteMembersCleanup(UA_Session *session, UA_Server* server) { | |
UA_LOCK_ASSERT(server->serviceMutex, 1); | |
UA_Session_detachFromSecureChannel(session); | |
UA_ApplicationDescription_deleteMembers(&session->clientDescription); | |
UA_NodeId_deleteMembers(&session->header.authenticationToken); | |
UA_NodeId_deleteMembers(&session->sessionId); | |
UA_String_deleteMembers(&session->sessionName); | |
UA_ByteString_deleteMembers(&session->serverNonce); | |
struct ContinuationPoint *cp, *next = session->continuationPoints; | |
while((cp = next)) { | |
next = ContinuationPoint_clear(cp); | |
UA_free(cp); | |
} | |
session->continuationPoints = NULL; | |
session->availableContinuationPoints = UA_MAXCONTINUATIONPOINTS; | |
} | |
void UA_Session_attachToSecureChannel(UA_Session *session, UA_SecureChannel *channel) { | |
LIST_INSERT_HEAD(&channel->sessions, &session->header, pointers); | |
session->header.channel = channel; | |
} | |
void UA_Session_detachFromSecureChannel(UA_Session *session) { | |
if(!session->header.channel) | |
return; | |
session->header.channel = NULL; | |
LIST_REMOVE(&session->header, pointers); | |
} | |
UA_StatusCode | |
UA_Session_generateNonce(UA_Session *session) { | |
UA_SecureChannel *channel = session->header.channel; | |
if(!channel || !channel->securityPolicy) | |
return UA_STATUSCODE_BADINTERNALERROR; | |
/* Is the length of the previous nonce correct? */ | |
if(session->serverNonce.length != UA_SESSION_NONCELENTH) { | |
UA_ByteString_deleteMembers(&session->serverNonce); | |
UA_StatusCode retval = | |
UA_ByteString_allocBuffer(&session->serverNonce, UA_SESSION_NONCELENTH); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
} | |
return channel->securityPolicy->symmetricModule. | |
generateNonce(channel->securityPolicy, &session->serverNonce); | |
} | |
void UA_Session_updateLifetime(UA_Session *session) { | |
session->validTill = UA_DateTime_nowMonotonic() + | |
(UA_DateTime)(session->timeout * UA_DATETIME_MSEC); | |
} | |
#ifdef UA_ENABLE_SUBSCRIPTIONS | |
void UA_Session_addSubscription(UA_Server *server, UA_Session *session, UA_Subscription *newSubscription) { | |
newSubscription->subscriptionId = ++session->lastSubscriptionId; | |
LIST_INSERT_HEAD(&session->serverSubscriptions, newSubscription, listEntry); | |
session->numSubscriptions++; | |
server->numSubscriptions++; | |
} | |
UA_StatusCode | |
UA_Session_deleteSubscription(UA_Server *server, UA_Session *session, | |
UA_UInt32 subscriptionId) { | |
UA_LOCK_ASSERT(server->serviceMutex, 1); | |
UA_Subscription *sub = UA_Session_getSubscriptionById(session, subscriptionId); | |
if(!sub) | |
return UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID; | |
UA_Subscription_deleteMembers(server, sub); | |
/* Add a delayed callback to remove the subscription when the currently | |
* scheduled jobs have completed. There is no actual delayed callback. Just | |
* free the structure. */ | |
sub->delayedFreePointers.callback = NULL; | |
UA_WorkQueue_enqueueDelayed(&server->workQueue, &sub->delayedFreePointers); | |
/* Remove from the session */ | |
LIST_REMOVE(sub, listEntry); | |
UA_assert(session->numSubscriptions > 0); | |
UA_assert(server->numSubscriptions > 0); | |
session->numSubscriptions--; | |
server->numSubscriptions--; | |
return UA_STATUSCODE_GOOD; | |
} | |
UA_Subscription * | |
UA_Session_getSubscriptionById(UA_Session *session, UA_UInt32 subscriptionId) { | |
UA_Subscription *sub; | |
LIST_FOREACH(sub, &session->serverSubscriptions, listEntry) { | |
if(sub->subscriptionId == subscriptionId) | |
break; | |
} | |
return sub; | |
} | |
UA_PublishResponseEntry* | |
UA_Session_dequeuePublishReq(UA_Session *session) { | |
UA_PublishResponseEntry* entry = SIMPLEQ_FIRST(&session->responseQueue); | |
if(entry) { | |
SIMPLEQ_REMOVE_HEAD(&session->responseQueue, listEntry); | |
session->numPublishReq--; | |
} | |
return entry; | |
} | |
void | |
UA_Session_queuePublishReq(UA_Session *session, UA_PublishResponseEntry* entry, UA_Boolean head) { | |
if(!head) | |
SIMPLEQ_INSERT_TAIL(&session->responseQueue, entry, listEntry); | |
else | |
SIMPLEQ_INSERT_HEAD(&session->responseQueue, entry, listEntry); | |
session->numPublishReq++; | |
} | |
#endif | |
/*********************************** amalgamated original file "E:/Librarys/open62541/src/server/ua_nodes.c" ***********************************/ | |
/* This Source Code Form is subject to the terms of the Mozilla Public | |
* License, v. 2.0. If a copy of the MPL was not distributed with this | |
* file, You can obtain one at http://mozilla.org/MPL/2.0/. | |
* | |
* Copyright 2015-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) | |
* Copyright 2015-2016 (c) Sten Grüner | |
* Copyright 2015 (c) Chris Iatrou | |
* Copyright 2015, 2017 (c) Florian Palm | |
* Copyright 2015 (c) Oleksiy Vasylyev | |
* Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH | |
* Copyright 2017 (c) Julian Grothoff | |
*/ | |
/* There is no UA_Node_new() method here. Creating nodes is part of the | |
* Nodestore layer */ | |
static enum ZIP_CMP | |
cmpRefTarget(const void *a, const void *b) { | |
const UA_ReferenceTarget *aa = (const UA_ReferenceTarget*)a; | |
const UA_ReferenceTarget *bb = (const UA_ReferenceTarget*)b; | |
if(aa->targetHash < bb->targetHash) | |
return ZIP_CMP_LESS; | |
if(aa->targetHash > bb->targetHash) | |
return ZIP_CMP_MORE; | |
return (enum ZIP_CMP)UA_ExpandedNodeId_order(&aa->target, &bb->target); | |
} | |
ZIP_IMPL(UA_ReferenceTargetHead, UA_ReferenceTarget, zipfields, | |
UA_ReferenceTarget, zipfields, cmpRefTarget) | |
void UA_Node_clear(UA_Node *node) { | |
/* Delete standard content */ | |
UA_NodeId_clear(&node->nodeId); | |
UA_QualifiedName_clear(&node->browseName); | |
UA_LocalizedText_clear(&node->displayName); | |
UA_LocalizedText_clear(&node->description); | |
/* Delete references */ | |
UA_Node_deleteReferences(node); | |
/* Delete unique content of the nodeclass */ | |
switch(node->nodeClass) { | |
case UA_NODECLASS_OBJECT: | |
break; | |
case UA_NODECLASS_METHOD: | |
break; | |
case UA_NODECLASS_OBJECTTYPE: | |
break; | |
case UA_NODECLASS_VARIABLE: | |
case UA_NODECLASS_VARIABLETYPE: { | |
UA_VariableNode *p = (UA_VariableNode*)node; | |
UA_NodeId_clear(&p->dataType); | |
UA_Array_delete(p->arrayDimensions, p->arrayDimensionsSize, | |
&UA_TYPES[UA_TYPES_INT32]); | |
p->arrayDimensions = NULL; | |
p->arrayDimensionsSize = 0; | |
if(p->valueSource == UA_VALUESOURCE_DATA) | |
UA_DataValue_clear(&p->value.data.value); | |
break; | |
} | |
case UA_NODECLASS_REFERENCETYPE: { | |
UA_ReferenceTypeNode *p = (UA_ReferenceTypeNode*)node; | |
UA_LocalizedText_clear(&p->inverseName); | |
break; | |
} | |
case UA_NODECLASS_DATATYPE: | |
break; | |
case UA_NODECLASS_VIEW: | |
break; | |
default: | |
break; | |
} | |
} | |
static UA_StatusCode | |
UA_ObjectNode_copy(const UA_ObjectNode *src, UA_ObjectNode *dst) { | |
dst->eventNotifier = src->eventNotifier; | |
return UA_STATUSCODE_GOOD; | |
} | |
static UA_StatusCode | |
UA_CommonVariableNode_copy(const UA_VariableNode *src, UA_VariableNode *dst) { | |
UA_StatusCode retval = UA_Array_copy(src->arrayDimensions, | |
src->arrayDimensionsSize, | |
(void**)&dst->arrayDimensions, | |
&UA_TYPES[UA_TYPES_INT32]); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
dst->arrayDimensionsSize = src->arrayDimensionsSize; | |
retval = UA_NodeId_copy(&src->dataType, &dst->dataType); | |
dst->valueRank = src->valueRank; | |
dst->valueSource = src->valueSource; | |
if(src->valueSource == UA_VALUESOURCE_DATA) { | |
retval |= UA_DataValue_copy(&src->value.data.value, | |
&dst->value.data.value); | |
dst->value.data.callback = src->value.data.callback; | |
} else | |
dst->value.dataSource = src->value.dataSource; | |
return retval; | |
} | |
static UA_StatusCode | |
UA_VariableNode_copy(const UA_VariableNode *src, UA_VariableNode *dst) { | |
UA_StatusCode retval = UA_CommonVariableNode_copy(src, dst); | |
dst->accessLevel = src->accessLevel; | |
dst->minimumSamplingInterval = src->minimumSamplingInterval; | |
dst->historizing = src->historizing; | |
return retval; | |
} | |
static UA_StatusCode | |
UA_VariableTypeNode_copy(const UA_VariableTypeNode *src, | |
UA_VariableTypeNode *dst) { | |
UA_StatusCode retval = UA_CommonVariableNode_copy((const UA_VariableNode*)src, | |
(UA_VariableNode*)dst); | |
dst->isAbstract = src->isAbstract; | |
return retval; | |
} | |
static UA_StatusCode | |
UA_MethodNode_copy(const UA_MethodNode *src, UA_MethodNode *dst) { | |
dst->executable = src->executable; | |
dst->method = src->method; | |
#if UA_MULTITHREADING >= 100 | |
dst->async = src->async; | |
#endif | |
return UA_STATUSCODE_GOOD; | |
} | |
static UA_StatusCode | |
UA_ObjectTypeNode_copy(const UA_ObjectTypeNode *src, UA_ObjectTypeNode *dst) { | |
dst->isAbstract = src->isAbstract; | |
dst->lifecycle = src->lifecycle; | |
return UA_STATUSCODE_GOOD; | |
} | |
static UA_StatusCode | |
UA_ReferenceTypeNode_copy(const UA_ReferenceTypeNode *src, | |
UA_ReferenceTypeNode *dst) { | |
UA_StatusCode retval = UA_LocalizedText_copy(&src->inverseName, | |
&dst->inverseName); | |
dst->isAbstract = src->isAbstract; | |
dst->symmetric = src->symmetric; | |
return retval; | |
} | |
static UA_StatusCode | |
UA_DataTypeNode_copy(const UA_DataTypeNode *src, UA_DataTypeNode *dst) { | |
dst->isAbstract = src->isAbstract; | |
return UA_STATUSCODE_GOOD; | |
} | |
static UA_StatusCode | |
UA_ViewNode_copy(const UA_ViewNode *src, UA_ViewNode *dst) { | |
dst->containsNoLoops = src->containsNoLoops; | |
dst->eventNotifier = src->eventNotifier; | |
return UA_STATUSCODE_GOOD; | |
} | |
UA_StatusCode | |
UA_Node_copy(const UA_Node *src, UA_Node *dst) { | |
if(src->nodeClass != dst->nodeClass) | |
return UA_STATUSCODE_BADINTERNALERROR; | |
/* Copy standard content */ | |
UA_StatusCode retval = UA_NodeId_copy(&src->nodeId, &dst->nodeId); | |
retval |= UA_QualifiedName_copy(&src->browseName, &dst->browseName); | |
retval |= UA_LocalizedText_copy(&src->displayName, &dst->displayName); | |
retval |= UA_LocalizedText_copy(&src->description, &dst->description); | |
dst->writeMask = src->writeMask; | |
dst->context = src->context; | |
dst->constructed = src->constructed; | |
if(retval != UA_STATUSCODE_GOOD) { | |
UA_Node_clear(dst); | |
return retval; | |
} | |
/* Copy the references */ | |
dst->references = NULL; | |
if(src->referencesSize > 0) { | |
dst->references = (UA_NodeReferenceKind*) | |
UA_calloc(src->referencesSize, sizeof(UA_NodeReferenceKind)); | |
if(!dst->references) { | |
UA_Node_clear(dst); | |
return UA_STATUSCODE_BADOUTOFMEMORY; | |
} | |
dst->referencesSize = src->referencesSize; | |
for(size_t i = 0; i < src->referencesSize; ++i) { | |
UA_NodeReferenceKind *srefs = &src->references[i]; | |
UA_NodeReferenceKind *drefs = &dst->references[i]; | |
drefs->isInverse = srefs->isInverse; | |
ZIP_INIT(&drefs->refTargetsTree); | |
retval = UA_NodeId_copy(&srefs->referenceTypeId, &drefs->referenceTypeId); | |
if(retval != UA_STATUSCODE_GOOD) | |
break; | |
drefs->refTargets = (UA_ReferenceTarget*) | |
UA_malloc(srefs->refTargetsSize* sizeof(UA_ReferenceTarget)); | |
if(!drefs->refTargets) { | |
UA_NodeId_clear(&drefs->referenceTypeId); | |
break; | |
} | |
uintptr_t arraydiff = (uintptr_t)drefs->refTargets - (uintptr_t)srefs->refTargets; | |
for(size_t j = 0; j < srefs->refTargetsSize; j++) { | |
UA_ReferenceTarget *srefTarget = &srefs->refTargets[j]; | |
UA_ReferenceTarget *drefTarget = &drefs->refTargets[j]; | |
retval |= UA_ExpandedNodeId_copy(&srefTarget->target, &drefTarget->target); | |
drefTarget->targetHash = srefTarget->targetHash; | |
ZIP_RIGHT(drefTarget, zipfields) = NULL; | |
if(ZIP_RIGHT(srefTarget, zipfields)) | |
*(uintptr_t*)&ZIP_RIGHT(drefTarget, zipfields) = | |
(uintptr_t)ZIP_RIGHT(srefTarget, zipfields) + arraydiff; | |
ZIP_LEFT(drefTarget, zipfields) = NULL; | |
if(ZIP_LEFT(srefTarget, zipfields)) | |
*(uintptr_t*)&ZIP_LEFT(drefTarget, zipfields) = | |
(uintptr_t)ZIP_LEFT(srefTarget, zipfields) + arraydiff; | |
ZIP_RANK(drefTarget, zipfields) = ZIP_RANK(srefTarget, zipfields); | |
} | |
ZIP_ROOT(&drefs->refTargetsTree) = NULL; | |
if(ZIP_ROOT(&srefs->refTargetsTree)) | |
*(uintptr_t*)&ZIP_ROOT(&drefs->refTargetsTree) = | |
(uintptr_t)ZIP_ROOT(&srefs->refTargetsTree) + arraydiff; | |
drefs->refTargetsSize = srefs->refTargetsSize; | |
if(retval != UA_STATUSCODE_GOOD) | |
break; | |
} | |
if(retval != UA_STATUSCODE_GOOD) { | |
UA_Node_clear(dst); | |
return retval; | |
} | |
} | |
/* Copy unique content of the nodeclass */ | |
switch(src->nodeClass) { | |
case UA_NODECLASS_OBJECT: | |
retval = UA_ObjectNode_copy((const UA_ObjectNode*)src, (UA_ObjectNode*)dst); | |
break; | |
case UA_NODECLASS_VARIABLE: | |
retval = UA_VariableNode_copy((const UA_VariableNode*)src, (UA_VariableNode*)dst); | |
break; | |
case UA_NODECLASS_METHOD: | |
retval = UA_MethodNode_copy((const UA_MethodNode*)src, (UA_MethodNode*)dst); | |
break; | |
case UA_NODECLASS_OBJECTTYPE: | |
retval = UA_ObjectTypeNode_copy((const UA_ObjectTypeNode*)src, (UA_ObjectTypeNode*)dst); | |
break; | |
case UA_NODECLASS_VARIABLETYPE: | |
retval = UA_VariableTypeNode_copy((const UA_VariableTypeNode*)src, (UA_VariableTypeNode*)dst); | |
break; | |
case UA_NODECLASS_REFERENCETYPE: | |
retval = UA_ReferenceTypeNode_copy((const UA_ReferenceTypeNode*)src, (UA_ReferenceTypeNode*)dst); | |
break; | |
case UA_NODECLASS_DATATYPE: | |
retval = UA_DataTypeNode_copy((const UA_DataTypeNode*)src, (UA_DataTypeNode*)dst); | |
break; | |
case UA_NODECLASS_VIEW: | |
retval = UA_ViewNode_copy((const UA_ViewNode*)src, (UA_ViewNode*)dst); | |
break; | |
default: | |
break; | |
} | |
if(retval != UA_STATUSCODE_GOOD) | |
UA_Node_clear(dst); | |
return retval; | |
} | |
UA_Node * | |
UA_Node_copy_alloc(const UA_Node *src) { | |
/* use dstPtr to trick static code analysis in accepting dirty cast */ | |
size_t nodesize = 0; | |
switch(src->nodeClass) { | |
case UA_NODECLASS_OBJECT: | |
nodesize = sizeof(UA_ObjectNode); | |
break; | |
case UA_NODECLASS_VARIABLE: | |
nodesize = sizeof(UA_VariableNode); | |
break; | |
case UA_NODECLASS_METHOD: | |
nodesize = sizeof(UA_MethodNode); | |
break; | |
case UA_NODECLASS_OBJECTTYPE: | |
nodesize = sizeof(UA_ObjectTypeNode); | |
break; | |
case UA_NODECLASS_VARIABLETYPE: | |
nodesize = sizeof(UA_VariableTypeNode); | |
break; | |
case UA_NODECLASS_REFERENCETYPE: | |
nodesize = sizeof(UA_ReferenceTypeNode); | |
break; | |
case UA_NODECLASS_DATATYPE: | |
nodesize = sizeof(UA_DataTypeNode); | |
break; | |
case UA_NODECLASS_VIEW: | |
nodesize = sizeof(UA_ViewNode); | |
break; | |
default: | |
return NULL; | |
} | |
UA_Node *dst = (UA_Node*)UA_calloc(1,nodesize); | |
if(!dst) | |
return NULL; | |
dst->nodeClass = src->nodeClass; | |
UA_StatusCode retval = UA_Node_copy(src, dst); | |
if(retval != UA_STATUSCODE_GOOD) { | |
UA_free(dst); | |
return NULL; | |
} | |
return dst; | |
} | |
/******************************/ | |
/* Copy Attributes into Nodes */ | |
/******************************/ | |
static UA_StatusCode | |
copyStandardAttributes(UA_Node *node, const UA_NodeAttributes *attr) { | |
/* retval = UA_NodeId_copy(&item->requestedNewNodeId.nodeId, &node->nodeId); */ | |
/* retval |= UA_QualifiedName_copy(&item->browseName, &node->browseName); */ | |
UA_StatusCode retval; | |
/* The new nodeset format has optional display name. | |
* See https://github.com/open62541/open62541/issues/2627 | |
* If display name is NULL, then we take the name part of the browse name */ | |
if (attr->displayName.text.length == 0) { | |
retval = UA_String_copy(&node->browseName.name, | |
&node->displayName.text); | |
} else { | |
retval = UA_LocalizedText_copy(&attr->displayName, | |
&node->displayName); | |
retval |= UA_LocalizedText_copy(&attr->description, &node->description); | |
} | |
node->writeMask = attr->writeMask; | |
return retval; | |
} | |
static UA_StatusCode | |
copyCommonVariableAttributes(UA_VariableNode *node, | |
const UA_VariableAttributes *attr) { | |
/* Copy the array dimensions */ | |
UA_StatusCode retval = | |
UA_Array_copy(attr->arrayDimensions, attr->arrayDimensionsSize, | |
(void**)&node->arrayDimensions, &UA_TYPES[UA_TYPES_UINT32]); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
node->arrayDimensionsSize = attr->arrayDimensionsSize; | |
/* Data type and value rank */ | |
retval = UA_NodeId_copy(&attr->dataType, &node->dataType); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
node->valueRank = attr->valueRank; | |
/* Copy the value */ | |
retval = UA_Variant_copy(&attr->value, &node->value.data.value.value); | |
node->valueSource = UA_VALUESOURCE_DATA; | |
node->value.data.value.hasValue = (node->value.data.value.value.type != NULL); | |
return retval; | |
} | |
static UA_StatusCode | |
copyVariableNodeAttributes(UA_VariableNode *vnode, | |
const UA_VariableAttributes *attr) { | |
vnode->accessLevel = attr->accessLevel; | |
vnode->historizing = attr->historizing; | |
vnode->minimumSamplingInterval = attr->minimumSamplingInterval; | |
return copyCommonVariableAttributes(vnode, attr); | |
} | |
static UA_StatusCode | |
copyVariableTypeNodeAttributes(UA_VariableTypeNode *vtnode, | |
const UA_VariableTypeAttributes *attr) { | |
vtnode->isAbstract = attr->isAbstract; | |
return copyCommonVariableAttributes((UA_VariableNode*)vtnode, | |
(const UA_VariableAttributes*)attr); | |
} | |
static UA_StatusCode | |
copyObjectNodeAttributes(UA_ObjectNode *onode, const UA_ObjectAttributes *attr) { | |
onode->eventNotifier = attr->eventNotifier; | |
return UA_STATUSCODE_GOOD; | |
} | |
static UA_StatusCode | |
copyReferenceTypeNodeAttributes(UA_ReferenceTypeNode *rtnode, | |
const UA_ReferenceTypeAttributes *attr) { | |
rtnode->isAbstract = attr->isAbstract; | |
rtnode->symmetric = attr->symmetric; | |
return UA_LocalizedText_copy(&attr->inverseName, &rtnode->inverseName); | |
} | |
static UA_StatusCode | |
copyObjectTypeNodeAttributes(UA_ObjectTypeNode *otnode, | |
const UA_ObjectTypeAttributes *attr) { | |
otnode->isAbstract = attr->isAbstract; | |
return UA_STATUSCODE_GOOD; | |
} | |
static UA_StatusCode | |
copyViewNodeAttributes(UA_ViewNode *vnode, const UA_ViewAttributes *attr) { | |
vnode->containsNoLoops = attr->containsNoLoops; | |
vnode->eventNotifier = attr->eventNotifier; | |
return UA_STATUSCODE_GOOD; | |
} | |
static UA_StatusCode | |
copyDataTypeNodeAttributes(UA_DataTypeNode *dtnode, | |
const UA_DataTypeAttributes *attr) { | |
dtnode->isAbstract = attr->isAbstract; | |
return UA_STATUSCODE_GOOD; | |
} | |
static UA_StatusCode | |
copyMethodNodeAttributes(UA_MethodNode *mnode, | |
const UA_MethodAttributes *attr) { | |
mnode->executable = attr->executable; | |
return UA_STATUSCODE_GOOD; | |
} | |
#define CHECK_ATTRIBUTES(TYPE) \ | |
if(attributeType != &UA_TYPES[UA_TYPES_##TYPE]) { \ | |
retval = UA_STATUSCODE_BADNODEATTRIBUTESINVALID; \ | |
break; \ | |
} | |
UA_StatusCode | |
UA_Node_setAttributes(UA_Node *node, const void *attributes, | |
const UA_DataType *attributeType) { | |
/* Copy the attributes into the node */ | |
UA_StatusCode retval = UA_STATUSCODE_GOOD; | |
switch(node->nodeClass) { | |
case UA_NODECLASS_OBJECT: | |
CHECK_ATTRIBUTES(OBJECTATTRIBUTES); | |
retval = copyObjectNodeAttributes((UA_ObjectNode*)node, | |
(const UA_ObjectAttributes*)attributes); | |
break; | |
case UA_NODECLASS_VARIABLE: | |
CHECK_ATTRIBUTES(VARIABLEATTRIBUTES); | |
retval = copyVariableNodeAttributes((UA_VariableNode*)node, | |
(const UA_VariableAttributes*)attributes); | |
break; | |
case UA_NODECLASS_OBJECTTYPE: | |
CHECK_ATTRIBUTES(OBJECTTYPEATTRIBUTES); | |
retval = copyObjectTypeNodeAttributes((UA_ObjectTypeNode*)node, | |
(const UA_ObjectTypeAttributes*)attributes); | |
break; | |
case UA_NODECLASS_VARIABLETYPE: | |
CHECK_ATTRIBUTES(VARIABLETYPEATTRIBUTES); | |
retval = copyVariableTypeNodeAttributes((UA_VariableTypeNode*)node, | |
(const UA_VariableTypeAttributes*)attributes); | |
break; | |
case UA_NODECLASS_REFERENCETYPE: | |
CHECK_ATTRIBUTES(REFERENCETYPEATTRIBUTES); | |
retval = copyReferenceTypeNodeAttributes((UA_ReferenceTypeNode*)node, | |
(const UA_ReferenceTypeAttributes*)attributes); | |
break; | |
case UA_NODECLASS_DATATYPE: | |
CHECK_ATTRIBUTES(DATATYPEATTRIBUTES); | |
retval = copyDataTypeNodeAttributes((UA_DataTypeNode*)node, | |
(const UA_DataTypeAttributes*)attributes); | |
break; | |
case UA_NODECLASS_VIEW: | |
CHECK_ATTRIBUTES(VIEWATTRIBUTES); | |
retval = copyViewNodeAttributes((UA_ViewNode*)node, | |
(const UA_ViewAttributes*)attributes); | |
break; | |
case UA_NODECLASS_METHOD: | |
CHECK_ATTRIBUTES(METHODATTRIBUTES); | |
retval = copyMethodNodeAttributes((UA_MethodNode*)node, | |
(const UA_MethodAttributes*)attributes); | |
break; | |
case UA_NODECLASS_UNSPECIFIED: | |
default: | |
retval = UA_STATUSCODE_BADNODECLASSINVALID; | |
} | |
if(retval == UA_STATUSCODE_GOOD) | |
retval = copyStandardAttributes(node, (const UA_NodeAttributes*)attributes); | |
if(retval != UA_STATUSCODE_GOOD) | |
UA_Node_clear(node); | |
return retval; | |
} | |
/*********************/ | |
/* Manage References */ | |
/*********************/ | |
static UA_StatusCode | |
addReferenceTarget(UA_NodeReferenceKind *refs, const UA_ExpandedNodeId *target, | |
UA_UInt32 targetHash) { | |
UA_ReferenceTarget *targets = (UA_ReferenceTarget*) | |
UA_realloc(refs->refTargets, (refs->refTargetsSize + 1) * sizeof(UA_ReferenceTarget)); | |
if(!targets) | |
return UA_STATUSCODE_BADOUTOFMEMORY; | |
/* Repair the pointers in the tree for the realloced array */ | |
uintptr_t arraydiff = (uintptr_t)targets - (uintptr_t)refs->refTargets; | |
if(arraydiff != 0) { | |
for(size_t i = 0; i < refs->refTargetsSize; i++) { | |
if(targets[i].zipfields.zip_left) | |
*(uintptr_t*)&targets[i].zipfields.zip_left += arraydiff; | |
if(targets[i].zipfields.zip_right) | |
*(uintptr_t*)&targets[i].zipfields.zip_right += arraydiff; | |
} | |
} | |
if(refs->refTargetsTree.zip_root) | |
*(uintptr_t*)&refs->refTargetsTree.zip_root += arraydiff; | |
refs->refTargets = targets; | |
UA_ReferenceTarget *entry = &refs->refTargets[refs->refTargetsSize]; | |
UA_StatusCode retval = UA_ExpandedNodeId_copy(target, &entry->target); | |
if(retval != UA_STATUSCODE_GOOD) { | |
if(refs->refTargetsSize== 0) { | |
/* We had zero references before (realloc was a malloc) */ | |
UA_free(refs->refTargets); | |
refs->refTargets = NULL; | |
} | |
return retval; | |
} | |
entry->targetHash = targetHash; | |
ZIP_INSERT(UA_ReferenceTargetHead, &refs->refTargetsTree, | |
entry, ZIP_FFS32(UA_UInt32_random())); | |
refs->refTargetsSize++; | |
return UA_STATUSCODE_GOOD; | |
} | |
static UA_StatusCode | |
addReferenceKind(UA_Node *node, const UA_AddReferencesItem *item) { | |
UA_NodeReferenceKind *refs = (UA_NodeReferenceKind*) | |
UA_realloc(node->references, sizeof(UA_NodeReferenceKind) * (node->referencesSize+1)); | |
if(!refs) | |
return UA_STATUSCODE_BADOUTOFMEMORY; | |
node->references = refs; | |
UA_NodeReferenceKind *newRef = &refs[node->referencesSize]; | |
memset(newRef, 0, sizeof(UA_NodeReferenceKind)); | |
ZIP_INIT(&newRef->refTargetsTree); | |
newRef->isInverse = !item->isForward; | |
UA_StatusCode retval = UA_NodeId_copy(&item->referenceTypeId, &newRef->referenceTypeId); | |
UA_UInt32 targetHash = UA_ExpandedNodeId_hash(&item->targetNodeId); | |
retval |= addReferenceTarget(newRef, &item->targetNodeId, targetHash); | |
if(retval != UA_STATUSCODE_GOOD) { | |
UA_NodeId_clear(&newRef->referenceTypeId); | |
if(node->referencesSize == 0) { | |
UA_free(node->references); | |
node->references = NULL; | |
} | |
return retval; | |
} | |
node->referencesSize++; | |
return UA_STATUSCODE_GOOD; | |
} | |
UA_StatusCode | |
UA_Node_addReference(UA_Node *node, const UA_AddReferencesItem *item) { | |
/* Find the matching refkind */ | |
UA_NodeReferenceKind *existingRefs = NULL; | |
for(size_t i = 0; i < node->referencesSize; ++i) { | |
UA_NodeReferenceKind *refs = &node->references[i]; | |
if(refs->isInverse != item->isForward && | |
UA_NodeId_equal(&refs->referenceTypeId, &item->referenceTypeId)) { | |
existingRefs = refs; | |
break; | |
} | |
} | |
if(!existingRefs) | |
return addReferenceKind(node, item); | |
UA_ReferenceTarget tmpTarget; | |
tmpTarget.target = item->targetNodeId; | |
tmpTarget.targetHash = UA_ExpandedNodeId_hash(&item->targetNodeId); | |
UA_ReferenceTarget *found = | |
ZIP_FIND(UA_ReferenceTargetHead, &existingRefs->refTargetsTree, &tmpTarget); | |
if(found) | |
return UA_STATUSCODE_BADDUPLICATEREFERENCENOTALLOWED; | |
return addReferenceTarget(existingRefs, &item->targetNodeId, tmpTarget.targetHash); | |
} | |
UA_StatusCode | |
UA_Node_deleteReference(UA_Node *node, const UA_DeleteReferencesItem *item) { | |
for(size_t i = node->referencesSize; i > 0; --i) { | |
UA_NodeReferenceKind *refs = &node->references[i-1]; | |
if(item->isForward == refs->isInverse) | |
continue; | |
if(!UA_NodeId_equal(&item->referenceTypeId, &refs->referenceTypeId)) | |
continue; | |
for(size_t j = refs->refTargetsSize; j > 0; --j) { | |
UA_ReferenceTarget *target = &refs->refTargets[j-1]; | |
if(!UA_NodeId_equal(&item->targetNodeId.nodeId, &target->target.nodeId)) | |
continue; | |
/* Ok, delete the reference */ | |
ZIP_REMOVE(UA_ReferenceTargetHead, &refs->refTargetsTree, target); | |
UA_ExpandedNodeId_clear(&target->target); | |
refs->refTargetsSize--; | |
/* One matching target remaining */ | |
if(refs->refTargetsSize > 0) { | |
if(j-1 != refs->refTargetsSize) { | |
/* avoid valgrind error: Source and destination overlap in | |
* memcpy */ | |
ZIP_REMOVE(UA_ReferenceTargetHead, &refs->refTargetsTree, | |
&refs->refTargets[refs->refTargetsSize]); | |
*target = refs->refTargets[refs->refTargetsSize]; | |
ZIP_INSERT(UA_ReferenceTargetHead, &refs->refTargetsTree, | |
target, ZIP_RANK(target, zipfields)); | |
} | |
return UA_STATUSCODE_GOOD; | |
} | |
/* No target for the ReferenceType remaining. Remove entry. */ | |
UA_free(refs->refTargets); | |
UA_NodeId_clear(&refs->referenceTypeId); | |
node->referencesSize--; | |
if(node->referencesSize > 0) { | |
if(i-1 != node->referencesSize) { | |
/* avoid valgrind error: Source and destination overlap in | |
* memcpy */ | |
node->references[i-1] = node->references[node->referencesSize]; | |
} | |
return UA_STATUSCODE_GOOD; | |
} | |
/* No remaining references of any ReferenceType */ | |
UA_free(node->references); | |
node->references = NULL; | |
return UA_STATUSCODE_GOOD; | |
} | |
} | |
return UA_STATUSCODE_UNCERTAINREFERENCENOTDELETED; | |
} | |
void | |
UA_Node_deleteReferencesSubset(UA_Node *node, size_t referencesSkipSize, | |
UA_NodeId* referencesSkip) { | |
/* Nothing to do */ | |
if(node->referencesSize == 0 || node->references == NULL) | |
return; | |
for(size_t i = node->referencesSize; i > 0; --i) { | |
UA_NodeReferenceKind *refs = &node->references[i-1]; | |
/* Shall we keep the references of this type? */ | |
UA_Boolean skip = false; | |
for(size_t j = 0; j < referencesSkipSize; j++) { | |
if(UA_NodeId_equal(&refs->referenceTypeId, &referencesSkip[j])) { | |
skip = true; | |
break; | |
} | |
} | |
if(skip) | |
continue; | |
/* Remove references */ | |
for(size_t j = 0; j < refs->refTargetsSize; j++) | |
UA_ExpandedNodeId_clear(&refs->refTargets[j].target); | |
UA_free(refs->refTargets); | |
UA_NodeId_clear(&refs->referenceTypeId); | |
node->referencesSize--; | |
/* Move last references-kind entry to this position */ | |
if(i-1 == node->referencesSize) /* Don't memcpy over the same position */ | |
continue; | |
node->references[i-1] = node->references[node->referencesSize]; | |
} | |
if(node->referencesSize > 0) { | |
/* Realloc to save memory */ | |
UA_NodeReferenceKind *refs = (UA_NodeReferenceKind*) | |
UA_realloc(node->references, sizeof(UA_NodeReferenceKind) * node->referencesSize); | |
if(refs) /* Do nothing if realloc fails */ | |
node->references = refs; | |
return; | |
} | |
/* The array is empty. Remove. */ | |
UA_free(node->references); | |
node->references = NULL; | |
} | |
void UA_Node_deleteReferences(UA_Node *node) { | |
UA_Node_deleteReferencesSubset(node, 0, NULL); | |
} | |
/*********************************** amalgamated original file "E:/Librarys/open62541/src/server/ua_server.c" ***********************************/ | |
/* This Source Code Form is subject to the terms of the Mozilla Public | |
* License, v. 2.0. If a copy of the MPL was not distributed with this | |
* file, You can obtain one at http://mozilla.org/MPL/2.0/. | |
* | |
* Copyright 2014-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer) | |
* Copyright 2014-2017 (c) Florian Palm | |
* Copyright 2015-2016 (c) Sten Grüner | |
* Copyright 2015-2016 (c) Chris Iatrou | |
* Copyright 2015 (c) LEvertz | |
* Copyright 2015-2016 (c) Oleksiy Vasylyev | |
* Copyright 2016 (c) Julian Grothoff | |
* Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH | |
* Copyright 2016 (c) Lorenz Haas | |
* Copyright 2017 (c) frax2222 | |
* Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB | |
* Copyright 2018 (c) Hilscher Gesellschaft für Systemautomation mbH (Author: Martin Lang) | |
* Copyright 2019 (c) Kalycito Infotech Private Limited | |
*/ | |
#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL | |
#endif | |
#ifdef UA_ENABLE_SUBSCRIPTIONS | |
#endif | |
#ifdef UA_ENABLE_VALGRIND_INTERACTIVE | |
#include <valgrind/memcheck.h> | |
#endif | |
/**********************/ | |
/* Namespace Handling */ | |
/**********************/ | |
/* | |
* The NS1 Uri can be changed by the user to some custom string. | |
* This method is called to initialize the NS1 Uri if it is not set before to the default Application URI. | |
* | |
* This is done as soon as the Namespace Array is read or written via node value read / write services, | |
* or UA_Server_addNamespace, UA_Server_getNamespaceByName or UA_Server_run_startup is called. | |
* | |
* Therefore one has to set the custom NS1 URI before one of the previously mentioned steps. | |
*/ | |
void setupNs1Uri(UA_Server *server) { | |
if (!server->namespaces[1].data) { | |
UA_String_copy(&server->config.applicationDescription.applicationUri, &server->namespaces[1]); | |
} | |
} | |
UA_UInt16 addNamespace(UA_Server *server, const UA_String name) { | |
/* ensure that the uri for ns1 is set up from the app description */ | |
setupNs1Uri(server); | |
/* Check if the namespace already exists in the server's namespace array */ | |
for(UA_UInt16 i = 0; i < server->namespacesSize; ++i) { | |
if(UA_String_equal(&name, &server->namespaces[i])) | |
return i; | |
} | |
/* Make the array bigger */ | |
UA_String *newNS = (UA_String*)UA_realloc(server->namespaces, | |
sizeof(UA_String) * (server->namespacesSize + 1)); | |
if(!newNS) | |
return 0; | |
server->namespaces = newNS; | |
/* Copy the namespace string */ | |
UA_StatusCode retval = UA_String_copy(&name, &server->namespaces[server->namespacesSize]); | |
if(retval != UA_STATUSCODE_GOOD) | |
return 0; | |
/* Announce the change (otherwise, the array appears unchanged) */ | |
++server->namespacesSize; | |
return (UA_UInt16)(server->namespacesSize - 1); | |
} | |
UA_UInt16 UA_Server_addNamespace(UA_Server *server, const char* name) { | |
/* Override const attribute to get string (dirty hack) */ | |
UA_String nameString; | |
nameString.length = strlen(name); | |
nameString.data = (UA_Byte*)(uintptr_t)name; | |
UA_LOCK(server->serviceMutex); | |
UA_UInt16 retVal = addNamespace(server, nameString); | |
UA_UNLOCK(server->serviceMutex); | |
return retVal; | |
} | |
UA_ServerConfig* | |
UA_Server_getConfig(UA_Server *server) | |
{ | |
if(!server) | |
return NULL; | |
return &server->config; | |
} | |
UA_StatusCode | |
UA_Server_getNamespaceByName(UA_Server *server, const UA_String namespaceUri, | |
size_t* foundIndex) { | |
UA_LOCK(server->serviceMutex); | |
/* ensure that the uri for ns1 is set up from the app description */ | |
setupNs1Uri(server); | |
for(size_t idx = 0; idx < server->namespacesSize; idx++) { | |
if(!UA_String_equal(&server->namespaces[idx], &namespaceUri)) | |
continue; | |
(*foundIndex) = idx; | |
UA_UNLOCK(server->serviceMutex); | |
return UA_STATUSCODE_GOOD; | |
} | |
UA_UNLOCK(server->serviceMutex); | |
return UA_STATUSCODE_BADNOTFOUND; | |
} | |
UA_StatusCode | |
UA_Server_forEachChildNodeCall(UA_Server *server, UA_NodeId parentNodeId, | |
UA_NodeIteratorCallback callback, void *handle) { | |
UA_LOCK(server->serviceMutex); | |
const UA_Node *parent = UA_NODESTORE_GET(server, &parentNodeId); | |
if(!parent) { | |
UA_UNLOCK(server->serviceMutex); | |
return UA_STATUSCODE_BADNODEIDINVALID; | |
} | |
/* TODO: We need to do an ugly copy of the references array since users may | |
* delete references from within the callback. In single-threaded mode this | |
* changes the same node we point at here. In multi-threaded mode, this | |
* creates a new copy as nodes are truly immutable. | |
* The callback could remove a node via the regular public API. | |
* This can remove a member of the nodes-array we iterate over... | |
* */ | |
UA_Node *parentCopy = UA_Node_copy_alloc(parent); | |
if(!parentCopy) { | |
UA_NODESTORE_RELEASE(server, parent); | |
UA_UNLOCK(server->serviceMutex); | |
return UA_STATUSCODE_BADUNEXPECTEDERROR; | |
} | |
UA_StatusCode retval = UA_STATUSCODE_GOOD; | |
for(size_t i = parentCopy->referencesSize; i > 0; --i) { | |
UA_NodeReferenceKind *ref = &parentCopy->references[i - 1]; | |
for(size_t j = 0; j<ref->refTargetsSize; j++) { | |
UA_UNLOCK(server->serviceMutex); | |
retval = callback(ref->refTargets[j].target.nodeId, ref->isInverse, | |
ref->referenceTypeId, handle); | |
UA_LOCK(server->serviceMutex); | |
if(retval != UA_STATUSCODE_GOOD) | |
goto cleanup; | |
} | |
} | |
cleanup: | |
UA_Node_clear(parentCopy); | |
UA_free(parentCopy); | |
UA_NODESTORE_RELEASE(server, parent); | |
UA_UNLOCK(server->serviceMutex); | |
return retval; | |
} | |
/********************/ | |
/* Server Lifecycle */ | |
/********************/ | |
/* The server needs to be stopped before it can be deleted */ | |
void UA_Server_delete(UA_Server *server) { | |
/* Delete all internal data */ | |
UA_SecureChannelManager_deleteMembers(&server->secureChannelManager); | |
UA_LOCK(server->serviceMutex); | |
UA_SessionManager_deleteMembers(&server->sessionManager); | |
UA_UNLOCK(server->serviceMutex); | |
UA_Array_delete(server->namespaces, server->namespacesSize, &UA_TYPES[UA_TYPES_STRING]); | |
#ifdef UA_ENABLE_SUBSCRIPTIONS | |
UA_MonitoredItem *mon, *mon_tmp; | |
LIST_FOREACH_SAFE(mon, &server->localMonitoredItems, listEntry, mon_tmp) { | |
LIST_REMOVE(mon, listEntry); | |
UA_LOCK(server->serviceMutex); | |
UA_MonitoredItem_delete(server, mon); | |
UA_UNLOCK(server->serviceMutex); | |
} | |
#ifdef UA_ENABLE_SUBSCRIPTIONS_ALARMS_CONDITIONS | |
UA_ConditionList_delete(server); | |
#endif//UA_ENABLE_ALARMS_CONDITIONS | |
#endif | |
#ifdef UA_ENABLE_PUBSUB | |
UA_PubSubManager_delete(server, &server->pubSubManager); | |
#endif | |
#ifdef UA_ENABLE_DISCOVERY | |
UA_DiscoveryManager_deleteMembers(&server->discoveryManager, server); | |
#endif | |
#if UA_MULTITHREADING >= 100 | |
UA_AsyncManager_clear(&server->asyncManager, server); | |
#endif | |
/* Clean up the Admin Session */ | |
UA_LOCK(server->serviceMutex); | |
UA_Session_deleteMembersCleanup(&server->adminSession, server); | |
UA_UNLOCK(server->serviceMutex); | |
/* Clean up the work queue */ | |
UA_WorkQueue_cleanup(&server->workQueue); | |
/* Delete the timed work */ | |
UA_Timer_deleteMembers(&server->timer); | |
/* Clean up the config */ | |
UA_ServerConfig_clean(&server->config); | |
#if UA_MULTITHREADING >= 100 | |
UA_LOCK_DESTROY(server->networkMutex) | |
UA_LOCK_DESTROY(server->serviceMutex) | |
#endif | |
/* Delete the server itself */ | |
UA_free(server); | |
} | |
/* Recurring cleanup. Removing unused and timed-out channels and sessions */ | |
static void | |
UA_Server_cleanup(UA_Server *server, void *_) { | |
UA_LOCK(server->serviceMutex); | |
UA_DateTime nowMonotonic = UA_DateTime_nowMonotonic(); | |
UA_SessionManager_cleanupTimedOut(&server->sessionManager, nowMonotonic); | |
UA_SecureChannelManager_cleanupTimedOut(&server->secureChannelManager, nowMonotonic); | |
#ifdef UA_ENABLE_DISCOVERY | |
UA_Discovery_cleanupTimedOut(server, nowMonotonic); | |
#endif | |
UA_UNLOCK(server->serviceMutex); | |
} | |
/********************/ | |
/* Server Lifecycle */ | |
/********************/ | |
static UA_Server * | |
UA_Server_init(UA_Server *server) { | |
UA_StatusCode res = UA_STATUSCODE_GOOD; | |
if(!server->config.nodestore.getNode) { | |
UA_LOG_FATAL(&server->config.logger, UA_LOGCATEGORY_SERVER, | |
"No Nodestore configured in the server"); | |
goto cleanup; | |
} | |
/* Init start time to zero, the actual start time will be sampled in | |
* UA_Server_run_startup() */ | |
server->startTime = 0; | |
/* Set a seed for non-cyptographic randomness */ | |
#ifndef UA_ENABLE_DETERMINISTIC_RNG | |
UA_random_seed((UA_UInt64)UA_DateTime_now()); | |
#endif | |
#if UA_MULTITHREADING >= 100 | |
UA_LOCK_INIT(server->networkMutex) | |
UA_LOCK_INIT(server->serviceMutex) | |
#endif | |
/* Initialize the handling of repeated callbacks */ | |
UA_Timer_init(&server->timer); | |
UA_WorkQueue_init(&server->workQueue); | |
/* Initialize the adminSession */ | |
UA_Session_init(&server->adminSession); | |
server->adminSession.sessionId.identifierType = UA_NODEIDTYPE_GUID; | |
server->adminSession.sessionId.identifier.guid.data1 = 1; | |
server->adminSession.validTill = UA_INT64_MAX; | |
/* Create Namespaces 0 and 1 | |
* Ns1 will be filled later with the uri from the app description */ | |
server->namespaces = (UA_String *)UA_Array_new(2, &UA_TYPES[UA_TYPES_STRING]); | |
if(!server->namespaces) { | |
UA_Server_delete(server); | |
return NULL; | |
} | |
server->namespaces[0] = UA_STRING_ALLOC("http://opcfoundation.org/UA/"); | |
server->namespaces[1] = UA_STRING_NULL; | |
server->namespacesSize = 2; | |
/* Initialized SecureChannel and Session managers */ | |
UA_SecureChannelManager_init(&server->secureChannelManager, server); | |
UA_SessionManager_init(&server->sessionManager, server); | |
#if UA_MULTITHREADING >= 100 | |
UA_AsyncManager_init(&server->asyncManager, server); | |
#endif | |
/* Add a regular callback for cleanup and maintenance. With a 10s interval. */ | |
UA_Server_addRepeatedCallback(server, (UA_ServerCallback)UA_Server_cleanup, NULL, | |
10000.0, NULL); | |
/* Initialize namespace 0*/ | |
res = UA_Server_initNS0(server); | |
if(res != UA_STATUSCODE_GOOD) | |
goto cleanup; | |
/* Build PubSub information model */ | |
#ifdef UA_ENABLE_PUBSUB_INFORMATIONMODEL | |
UA_Server_initPubSubNS0(server); | |
#endif | |
return server; | |
cleanup: | |
UA_Server_delete(server); | |
return NULL; | |
} | |
UA_Server * | |
UA_Server_newWithConfig(const UA_ServerConfig *config) { | |
if(!config) | |
return NULL; | |
UA_Server *server = (UA_Server *)UA_calloc(1, sizeof(UA_Server)); | |
if(!server) | |
return NULL; | |
server->config = *config; | |
return UA_Server_init(server); | |
} | |
/* Returns if the server should be shut down immediately */ | |
static UA_Boolean | |
setServerShutdown(UA_Server *server) { | |
if(server->endTime != 0) | |
return false; | |
if(server->config.shutdownDelay == 0) | |
return true; | |
UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER, | |
"Shutting down the server with a delay of %i ms", (int)server->config.shutdownDelay); | |
server->endTime = UA_DateTime_now() + (UA_DateTime)(server->config.shutdownDelay * UA_DATETIME_MSEC); | |
return false; | |
} | |
/*******************/ | |
/* Timed Callbacks */ | |
/*******************/ | |
UA_StatusCode | |
UA_Server_addTimedCallback(UA_Server *server, UA_ServerCallback callback, | |
void *data, UA_DateTime date, UA_UInt64 *callbackId) { | |
UA_LOCK(server->serviceMutex); | |
UA_StatusCode retval = UA_Timer_addTimedCallback(&server->timer, | |
(UA_ApplicationCallback)callback, | |
server, data, date, callbackId); | |
UA_UNLOCK(server->serviceMutex); | |
return retval; | |
} | |
UA_StatusCode | |
addRepeatedCallback(UA_Server *server, UA_ServerCallback callback, | |
void *data, UA_Double interval_ms, | |
UA_UInt64 *callbackId) { | |
return UA_Timer_addRepeatedCallback(&server->timer, | |
(UA_ApplicationCallback)callback, | |
server, data, interval_ms, callbackId); | |
} | |
UA_StatusCode | |
UA_Server_addRepeatedCallback(UA_Server *server, UA_ServerCallback callback, | |
void *data, UA_Double interval_ms, | |
UA_UInt64 *callbackId) { | |
UA_LOCK(server->serviceMutex); | |
UA_StatusCode retval = addRepeatedCallback(server, callback, data, interval_ms, callbackId); | |
UA_UNLOCK(server->serviceMutex); | |
return retval; | |
} | |
UA_StatusCode | |
changeRepeatedCallbackInterval(UA_Server *server, UA_UInt64 callbackId, | |
UA_Double interval_ms) { | |
return UA_Timer_changeRepeatedCallbackInterval(&server->timer, callbackId, | |
interval_ms); | |
} | |
UA_StatusCode | |
UA_Server_changeRepeatedCallbackInterval(UA_Server *server, UA_UInt64 callbackId, | |
UA_Double interval_ms) { | |
UA_LOCK(server->serviceMutex); | |
UA_StatusCode retval = changeRepeatedCallbackInterval(server, callbackId, interval_ms); | |
UA_UNLOCK(server->serviceMutex); | |
return retval; | |
} | |
void | |
removeCallback(UA_Server *server, UA_UInt64 callbackId) { | |
UA_Timer_removeCallback(&server->timer, callbackId); | |
} | |
void | |
UA_Server_removeCallback(UA_Server *server, UA_UInt64 callbackId) { | |
UA_LOCK(server->serviceMutex); | |
removeCallback(server, callbackId); | |
UA_UNLOCK(server->serviceMutex); | |
} | |
UA_StatusCode | |
UA_Server_updateCertificate(UA_Server *server, | |
const UA_ByteString *oldCertificate, | |
const UA_ByteString *newCertificate, | |
const UA_ByteString *newPrivateKey, | |
UA_Boolean closeSessions, | |
UA_Boolean closeSecureChannels) { | |
if(!server || !oldCertificate || !newCertificate || !newPrivateKey) | |
return UA_STATUSCODE_BADINTERNALERROR; | |
if(closeSessions) { | |
UA_SessionManager *sm = &server->sessionManager; | |
session_list_entry *current; | |
LIST_FOREACH(current, &sm->sessions, pointers) { | |
if(UA_ByteString_equal(oldCertificate, | |
¤t->session.header.channel->securityPolicy->localCertificate)) { | |
UA_LOCK(server->serviceMutex); | |
UA_SessionManager_removeSession(sm, ¤t->session.header.authenticationToken); | |
UA_UNLOCK(server->serviceMutex); | |
} | |
} | |
} | |
if(closeSecureChannels) { | |
UA_SecureChannelManager *cm = &server->secureChannelManager; | |
channel_entry *entry; | |
TAILQ_FOREACH(entry, &cm->channels, pointers) { | |
if(UA_ByteString_equal(&entry->channel.securityPolicy->localCertificate, oldCertificate)){ | |
UA_SecureChannelManager_close(cm, entry->channel.securityToken.channelId); | |
} | |
} | |
} | |
size_t i = 0; | |
while(i < server->config.endpointsSize) { | |
UA_EndpointDescription *ed = &server->config.endpoints[i]; | |
if(UA_ByteString_equal(&ed->serverCertificate, oldCertificate)) { | |
UA_String_deleteMembers(&ed->serverCertificate); | |
UA_String_copy(newCertificate, &ed->serverCertificate); | |
UA_SecurityPolicy *sp = UA_SecurityPolicy_getSecurityPolicyByUri(server, &server->config.endpoints[i].securityPolicyUri); | |
if(!sp) | |
return UA_STATUSCODE_BADINTERNALERROR; | |
sp->updateCertificateAndPrivateKey(sp, *newCertificate, *newPrivateKey); | |
} | |
i++; | |
} | |
return UA_STATUSCODE_GOOD; | |
} | |
/***************************/ | |
/* Server lookup functions */ | |
/***************************/ | |
UA_SecurityPolicy * | |
UA_SecurityPolicy_getSecurityPolicyByUri(const UA_Server *server, | |
const UA_ByteString *securityPolicyUri) { | |
for(size_t i = 0; i < server->config.securityPoliciesSize; i++) { | |
UA_SecurityPolicy *securityPolicyCandidate = &server->config.securityPolicies[i]; | |
if(UA_ByteString_equal(securityPolicyUri, &securityPolicyCandidate->policyUri)) | |
return securityPolicyCandidate; | |
} | |
return NULL; | |
} | |
#ifdef UA_ENABLE_ENCRYPTION | |
/* The local ApplicationURI has to match the certificates of the | |
* SecurityPolicies */ | |
static UA_StatusCode | |
verifyServerApplicationURI(const UA_Server *server) { | |
for(size_t i = 0; i < server->config.securityPoliciesSize; i++) { | |
UA_SecurityPolicy *sp = &server->config.securityPolicies[i]; | |
if(!sp->certificateVerification) | |
continue; | |
UA_StatusCode retval = | |
sp->certificateVerification-> | |
verifyApplicationURI(sp->certificateVerification->context, | |
&sp->localCertificate, | |
&server->config.applicationDescription.applicationUri); | |
if(retval != UA_STATUSCODE_GOOD) { | |
UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER, | |
"The configured ApplicationURI does not match the URI " | |
"specified in the certificate for the SecurityPolicy %.*s", | |
(int)sp->policyUri.length, sp->policyUri.data); | |
return retval; | |
} | |
} | |
return UA_STATUSCODE_GOOD; | |
} | |
#endif | |
/********************/ | |
/* Main Server Loop */ | |
/********************/ | |
#define UA_MAXTIMEOUT 50 /* Max timeout in ms between main-loop iterations */ | |
/* Start: Spin up the workers and the network layer and sample the server's | |
* start time. | |
* Iterate: Process repeated callbacks and events in the network layer. This | |
* part can be driven from an external main-loop in an event-driven | |
* single-threaded architecture. | |
* Stop: Stop workers, finish all callbacks, stop the network layer, clean up */ | |
UA_StatusCode | |
UA_Server_run_startup(UA_Server *server) { | |
/* ensure that the uri for ns1 is set up from the app description */ | |
setupNs1Uri(server); | |
/* write ServerArray with same ApplicationURI value as NamespaceArray */ | |
UA_StatusCode retVal = writeNs0VariableArray(server, UA_NS0ID_SERVER_SERVERARRAY, | |
&server->config.applicationDescription.applicationUri, | |
1, &UA_TYPES[UA_TYPES_STRING]); | |
if(retVal != UA_STATUSCODE_GOOD) | |
return retVal; | |
if(server->state > UA_SERVERLIFECYCLE_FRESH) | |
return UA_STATUSCODE_GOOD; | |
/* At least one endpoint has to be configured */ | |
if(server->config.endpointsSize == 0) { | |
UA_LOG_WARNING(&server->config.logger, UA_LOGCATEGORY_SERVER, | |
"There has to be at least one endpoint."); | |
} | |
/* Initialized discovery */ | |
#ifdef UA_ENABLE_DISCOVERY | |
UA_DiscoveryManager_init(&server->discoveryManager, server); | |
#endif | |
/* Does the ApplicationURI match the local certificates? */ | |
#ifdef UA_ENABLE_ENCRYPTION | |
retVal = verifyServerApplicationURI(server); | |
if(retVal != UA_STATUSCODE_GOOD) | |
return retVal; | |
#endif | |
/* Sample the start time and set it to the Server object */ | |
server->startTime = UA_DateTime_now(); | |
UA_Variant var; | |
UA_Variant_init(&var); | |
UA_Variant_setScalar(&var, &server->startTime, &UA_TYPES[UA_TYPES_DATETIME]); | |
UA_Server_writeValue(server, | |
UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_STARTTIME), | |
var); | |
/* Start the networklayers */ | |
UA_StatusCode result = UA_STATUSCODE_GOOD; | |
for(size_t i = 0; i < server->config.networkLayersSize; ++i) { | |
UA_ServerNetworkLayer *nl = &server->config.networkLayers[i]; | |
result |= nl->start(nl, &server->config.customHostname); | |
} | |
/* Update the application description to match the previously added discovery urls. | |
* We can only do this after the network layer is started since it inits the discovery url */ | |
if(server->config.applicationDescription.discoveryUrlsSize != 0) { | |
UA_Array_delete(server->config.applicationDescription.discoveryUrls, | |
server->config.applicationDescription.discoveryUrlsSize, | |
&UA_TYPES[UA_TYPES_STRING]); | |
server->config.applicationDescription.discoveryUrlsSize = 0; | |
} | |
server->config.applicationDescription.discoveryUrls = (UA_String *) | |
UA_Array_new(server->config.networkLayersSize, &UA_TYPES[UA_TYPES_STRING]); | |
if(!server->config.applicationDescription.discoveryUrls) | |
return UA_STATUSCODE_BADOUTOFMEMORY; | |
server->config.applicationDescription.discoveryUrlsSize = server->config.networkLayersSize; | |
for(size_t i = 0; i < server->config.applicationDescription.discoveryUrlsSize; i++) { | |
UA_ServerNetworkLayer *nl = &server->config.networkLayers[i]; | |
UA_String_copy(&nl->discoveryUrl, &server->config.applicationDescription.discoveryUrls[i]); | |
} | |
/* Spin up the worker threads */ | |
#if UA_MULTITHREADING >= 200 | |
UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER, | |
"Spinning up %u worker thread(s)", server->config.nThreads); | |
UA_WorkQueue_start(&server->workQueue, server->config.nThreads); | |
#endif | |
/* Start the multicast discovery server */ | |
#ifdef UA_ENABLE_DISCOVERY_MULTICAST | |
if(server->config.discovery.mdnsEnable) | |
startMulticastDiscoveryServer(server); | |
#endif | |
server->state = UA_SERVERLIFECYCLE_FRESH; | |
return result; | |
} | |
static void | |
serverExecuteRepeatedCallback(UA_Server *server, UA_ApplicationCallback cb, | |
void *callbackApplication, void *data) { | |
#if UA_MULTITHREADING >= 200 | |
UA_WorkQueue_enqueue(&server->workQueue, cb, callbackApplication, data); | |
#else | |
cb(callbackApplication, data); | |
#endif | |
} | |
UA_UInt16 | |
UA_Server_run_iterate(UA_Server *server, UA_Boolean waitInternal) { | |
/* Process repeated work */ | |
UA_DateTime now = UA_DateTime_nowMonotonic(); | |
UA_DateTime nextRepeated = UA_Timer_process(&server->timer, now, | |
(UA_TimerExecutionCallback)serverExecuteRepeatedCallback, server); | |
UA_DateTime latest = now + (UA_MAXTIMEOUT * UA_DATETIME_MSEC); | |
if(nextRepeated > latest) | |
nextRepeated = latest; | |
UA_UInt16 timeout = 0; | |
/* round always to upper value to avoid timeout to be set to 0 | |
* if(nextRepeated - now) < (UA_DATETIME_MSEC/2) */ | |
if(waitInternal) | |
timeout = (UA_UInt16)(((nextRepeated - now) + (UA_DATETIME_MSEC - 1)) / UA_DATETIME_MSEC); | |
/* Listen on the networklayer */ | |
for(size_t i = 0; i < server->config.networkLayersSize; ++i) { | |
UA_ServerNetworkLayer *nl = &server->config.networkLayers[i]; | |
nl->listen(nl, server, timeout); | |
} | |
#if defined(UA_ENABLE_PUBSUB_MQTT) | |
/* Listen on the pubsublayer, but only if the yield function is set */ | |
UA_PubSubConnection *connection; | |
TAILQ_FOREACH(connection, &server->pubSubManager.connections, listEntry){ | |
UA_PubSubConnection *ps = connection; | |
if(ps && ps->channel->yield){ | |
ps->channel->yield(ps->channel, timeout); | |
} | |
} | |
#endif | |
#if defined(UA_ENABLE_DISCOVERY_MULTICAST) && (UA_MULTITHREADING < 200) | |
if(server->config.discovery.mdnsEnable) { | |
// TODO multicastNextRepeat does not consider new input data (requests) | |
// on the socket. It will be handled on the next call. if needed, we | |
// need to use select with timeout on the multicast socket | |
// server->mdnsSocket (see example in mdnsd library) on higher level. | |
UA_DateTime multicastNextRepeat = 0; | |
UA_StatusCode hasNext = | |
iterateMulticastDiscoveryServer(server, &multicastNextRepeat, true); | |
if(hasNext == UA_STATUSCODE_GOOD && multicastNextRepeat < nextRepeated) | |
nextRepeated = multicastNextRepeat; | |
} | |
#endif | |
#if UA_MULTITHREADING < 200 | |
UA_WorkQueue_manuallyProcessDelayed(&server->workQueue); | |
#endif | |
now = UA_DateTime_nowMonotonic(); | |
timeout = 0; | |
if(nextRepeated > now) | |
timeout = (UA_UInt16)((nextRepeated - now) / UA_DATETIME_MSEC); | |
return timeout; | |
} | |
UA_StatusCode | |
UA_Server_run_shutdown(UA_Server *server) { | |
/* Stop the netowrk layer */ | |
for(size_t i = 0; i < server->config.networkLayersSize; ++i) { | |
UA_ServerNetworkLayer *nl = &server->config.networkLayers[i]; | |
nl->stop(nl, server); | |
} | |
#if UA_MULTITHREADING >= 200 | |
/* Shut down the workers */ | |
UA_LOG_INFO(&server->config.logger, UA_LOGCATEGORY_SERVER, | |
"Shutting down %u worker thread(s)", | |
(UA_UInt32)server->workQueue.workersSize); | |
UA_WorkQueue_stop(&server->workQueue); | |
#endif | |
#ifdef UA_ENABLE_DISCOVERY_MULTICAST | |
/* Stop multicast discovery */ | |
if(server->config.discovery.mdnsEnable) | |
stopMulticastDiscoveryServer(server); | |
#endif | |
/* Execute all delayed callbacks */ | |
UA_WorkQueue_cleanup(&server->workQueue); | |
return UA_STATUSCODE_GOOD; | |
} | |
static UA_Boolean | |
testShutdownCondition(UA_Server *server) { | |
if(server->endTime == 0) | |
return false; | |
return (UA_DateTime_now() > server->endTime); | |
} | |
UA_StatusCode | |
UA_Server_run(UA_Server *server, const volatile UA_Boolean *running) { | |
UA_StatusCode retval = UA_Server_run_startup(server); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
#ifdef UA_ENABLE_VALGRIND_INTERACTIVE | |
size_t loopCount = 0; | |
#endif | |
while(!testShutdownCondition(server)) { | |
#ifdef UA_ENABLE_VALGRIND_INTERACTIVE | |
if(loopCount == 0) { | |
VALGRIND_DO_LEAK_CHECK; | |
} | |
++loopCount; | |
loopCount %= UA_VALGRIND_INTERACTIVE_INTERVAL; | |
#endif | |
UA_Server_run_iterate(server, true); | |
if(!*running) { | |
if(setServerShutdown(server)) | |
break; | |
} | |
} | |
return UA_Server_run_shutdown(server); | |
} | |
#ifdef UA_ENABLE_HISTORIZING | |
/* Allow insert of historical data */ | |
UA_Boolean | |
UA_Server_AccessControl_allowHistoryUpdateUpdateData(UA_Server *server, | |
const UA_NodeId *sessionId, void *sessionContext, | |
const UA_NodeId *nodeId, | |
UA_PerformUpdateType performInsertReplace, | |
const UA_DataValue *value) { | |
if(server->config.accessControl.allowHistoryUpdateUpdateData && | |
!server->config.accessControl.allowHistoryUpdateUpdateData(server, &server->config.accessControl, | |
sessionId, sessionContext, nodeId, | |
performInsertReplace, value)) { | |
return false; | |
} | |
return true; | |
} | |
/* Allow delete of historical data */ | |
UA_Boolean | |
UA_Server_AccessControl_allowHistoryUpdateDeleteRawModified(UA_Server *server, | |
const UA_NodeId *sessionId, void *sessionContext, | |
const UA_NodeId *nodeId, | |
UA_DateTime startTimestamp, | |
UA_DateTime endTimestamp, | |
bool isDeleteModified) { | |
if(server->config.accessControl.allowHistoryUpdateDeleteRawModified && | |
!server->config.accessControl.allowHistoryUpdateDeleteRawModified(server, &server->config.accessControl, | |
sessionId, sessionContext, nodeId, | |
startTimestamp, endTimestamp, | |
isDeleteModified)) { | |
return false; | |
} | |
return true; | |
} | |
#endif /* UA_ENABLE_HISTORIZING */ | |
/*********************************** amalgamated original file "E:/Librarys/open62541/src/server/ua_server_ns0.c" ***********************************/ | |
/* This Source Code Form is subject to the terms of the Mozilla Public | |
* License, v. 2.0. If a copy of the MPL was not distributed with this | |
* file, You can obtain one at http://mozilla.org/MPL/2.0/. | |
* | |
* Copyright 2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer) | |
* Copyright 2017 (c) Stefan Profanter, fortiss GmbH | |
* Copyright 2017 (c) Thomas Bender | |
* Copyright 2017 (c) Julian Grothoff | |
* Copyright 2017 (c) Henrik Norrman | |
* Copyright 2018 (c) Fabian Arndt, Root-Core | |
* Copyright 2019 (c) Kalycito Infotech Private Limited | |
*/ | |
static UA_StatusCode | |
addNode_raw(UA_Server *server, UA_NodeClass nodeClass, | |
UA_UInt32 nodeId, char *name, void *attributes, | |
const UA_DataType *attributesType) { | |
UA_AddNodesItem item; | |
UA_AddNodesItem_init(&item); | |
item.nodeClass = nodeClass; | |
item.requestedNewNodeId.nodeId = UA_NODEID_NUMERIC(0, nodeId); | |
item.browseName = UA_QUALIFIEDNAME(0, name); | |
item.nodeAttributes.encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE; | |
item.nodeAttributes.content.decoded.data = attributes; | |
item.nodeAttributes.content.decoded.type = attributesType; | |
return AddNode_raw(server, &server->adminSession, NULL, &item, NULL); | |
} | |
static UA_StatusCode | |
addNode_finish(UA_Server *server, UA_UInt32 nodeId, | |
UA_UInt32 parentNodeId, UA_UInt32 referenceTypeId) { | |
const UA_NodeId sourceId = UA_NODEID_NUMERIC(0, nodeId); | |
const UA_NodeId refTypeId = UA_NODEID_NUMERIC(0, referenceTypeId); | |
const UA_ExpandedNodeId targetId = UA_EXPANDEDNODEID_NUMERIC(0, parentNodeId); | |
UA_StatusCode retval = UA_Server_addReference(server, sourceId, refTypeId, targetId, false); | |
if (retval != UA_STATUSCODE_GOOD) | |
return retval; | |
return AddNode_finish(server, &server->adminSession, &sourceId); | |
} | |
static UA_StatusCode | |
addObjectNode(UA_Server *server, char* name, UA_UInt32 objectid, | |
UA_UInt32 parentid, UA_UInt32 referenceid, UA_UInt32 type_id) { | |
UA_ObjectAttributes object_attr = UA_ObjectAttributes_default; | |
object_attr.displayName = UA_LOCALIZEDTEXT("", name); | |
return UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(0, objectid), | |
UA_NODEID_NUMERIC(0, parentid), | |
UA_NODEID_NUMERIC(0, referenceid), | |
UA_QUALIFIEDNAME(0, name), | |
UA_NODEID_NUMERIC(0, type_id), | |
object_attr, NULL, NULL); | |
} | |
static UA_StatusCode | |
addReferenceTypeNode(UA_Server *server, char* name, char *inverseName, UA_UInt32 referencetypeid, | |
UA_Boolean isabstract, UA_Boolean symmetric, UA_UInt32 parentid) { | |
UA_ReferenceTypeAttributes reference_attr = UA_ReferenceTypeAttributes_default; | |
reference_attr.displayName = UA_LOCALIZEDTEXT("", name); | |
reference_attr.isAbstract = isabstract; | |
reference_attr.symmetric = symmetric; | |
if(inverseName) | |
reference_attr.inverseName = UA_LOCALIZEDTEXT("", inverseName); | |
return UA_Server_addReferenceTypeNode(server, UA_NODEID_NUMERIC(0, referencetypeid), | |
UA_NODEID_NUMERIC(0, parentid), UA_NODEID_NULL, | |
UA_QUALIFIEDNAME(0, name), reference_attr, NULL, NULL); | |
} | |
/***************************/ | |
/* Bootstrap NS0 hierarchy */ | |
/***************************/ | |
/* Creates the basic nodes which are expected by the nodeset compiler to be | |
* already created. This is necessary to reduce the dependencies for the nodeset | |
* compiler. */ | |
static UA_StatusCode | |
UA_Server_createNS0_base(UA_Server *server) { | |
/* Bootstrap References and HasSubtype */ | |
UA_StatusCode ret = UA_STATUSCODE_GOOD; | |
UA_ReferenceTypeAttributes references_attr = UA_ReferenceTypeAttributes_default; | |
references_attr.displayName = UA_LOCALIZEDTEXT("", "References"); | |
references_attr.isAbstract = true; | |
references_attr.symmetric = true; | |
references_attr.inverseName = UA_LOCALIZEDTEXT("", "References"); | |
ret |= addNode_raw(server, UA_NODECLASS_REFERENCETYPE, UA_NS0ID_REFERENCES, "References", | |
&references_attr, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES]); | |
UA_ReferenceTypeAttributes hassubtype_attr = UA_ReferenceTypeAttributes_default; | |
hassubtype_attr.displayName = UA_LOCALIZEDTEXT("", "HasSubtype"); | |
hassubtype_attr.isAbstract = false; | |
hassubtype_attr.symmetric = false; | |
hassubtype_attr.inverseName = UA_LOCALIZEDTEXT("", "HasSupertype"); | |
ret |= addNode_raw(server, UA_NODECLASS_REFERENCETYPE, UA_NS0ID_HASSUBTYPE, "HasSubtype", | |
&hassubtype_attr, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES]); | |
UA_ReferenceTypeAttributes aggregates_attr = UA_ReferenceTypeAttributes_default; | |
aggregates_attr.displayName = UA_LOCALIZEDTEXT("", "Aggregates"); | |
aggregates_attr.isAbstract = true; | |
aggregates_attr.symmetric = false; | |
aggregates_attr.inverseName = UA_LOCALIZEDTEXT("", "AggregatedBy"); | |
ret |= addNode_raw(server, UA_NODECLASS_REFERENCETYPE, UA_NS0ID_AGGREGATES, "Aggregates", | |
&aggregates_attr, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES]); | |
ret |= addReferenceTypeNode(server, "HierarchicalReferences", NULL, | |
UA_NS0ID_HIERARCHICALREFERENCES, true, false, UA_NS0ID_REFERENCES); | |
ret |= addReferenceTypeNode(server, "NonHierarchicalReferences", NULL, | |
UA_NS0ID_NONHIERARCHICALREFERENCES, true, true, UA_NS0ID_REFERENCES); | |
ret |= addReferenceTypeNode(server, "HasChild", NULL, UA_NS0ID_HASCHILD, | |
true, false, UA_NS0ID_HIERARCHICALREFERENCES); | |
ret |= addReferenceTypeNode(server, "Organizes", "OrganizedBy", UA_NS0ID_ORGANIZES, | |
false, false, UA_NS0ID_HIERARCHICALREFERENCES); | |
ret |= addReferenceTypeNode(server, "HasEventSource", "EventSourceOf", UA_NS0ID_HASEVENTSOURCE, | |
false, false, UA_NS0ID_HIERARCHICALREFERENCES); | |
ret |= addReferenceTypeNode(server, "HasModellingRule", "ModellingRuleOf", UA_NS0ID_HASMODELLINGRULE, | |
false, false, UA_NS0ID_NONHIERARCHICALREFERENCES); | |
ret |= addReferenceTypeNode(server, "HasEncoding", "EncodingOf", UA_NS0ID_HASENCODING, | |
false, false, UA_NS0ID_NONHIERARCHICALREFERENCES); | |
ret |= addReferenceTypeNode(server, "HasDescription", "DescriptionOf", UA_NS0ID_HASDESCRIPTION, | |
false, false, UA_NS0ID_NONHIERARCHICALREFERENCES); | |
ret |= addReferenceTypeNode(server, "HasTypeDefinition", "TypeDefinitionOf", UA_NS0ID_HASTYPEDEFINITION, | |
false, false, UA_NS0ID_NONHIERARCHICALREFERENCES); | |
ret |= addReferenceTypeNode(server, "GeneratesEvent", "GeneratedBy", UA_NS0ID_GENERATESEVENT, | |
false, false, UA_NS0ID_NONHIERARCHICALREFERENCES); | |
/* Complete bootstrap of Aggregates */ | |
ret |= addNode_finish(server, UA_NS0ID_AGGREGATES, UA_NS0ID_HASCHILD, UA_NS0ID_HASSUBTYPE); | |
/* Complete bootstrap of HasSubtype */ | |
ret |= addNode_finish(server, UA_NS0ID_HASSUBTYPE, UA_NS0ID_HASCHILD, UA_NS0ID_HASSUBTYPE); | |
ret |= addReferenceTypeNode(server, "HasProperty", "PropertyOf", UA_NS0ID_HASPROPERTY, | |
false, false, UA_NS0ID_AGGREGATES); | |
ret |= addReferenceTypeNode(server, "HasComponent", "ComponentOf", UA_NS0ID_HASCOMPONENT, | |
false, false, UA_NS0ID_AGGREGATES); | |
ret |= addReferenceTypeNode(server, "HasNotifier", "NotifierOf", UA_NS0ID_HASNOTIFIER, | |
false, false, UA_NS0ID_HASEVENTSOURCE); | |
ret |= addReferenceTypeNode(server, "HasOrderedComponent", "OrderedComponentOf", | |
UA_NS0ID_HASORDEREDCOMPONENT, false, false, UA_NS0ID_HASCOMPONENT); | |
/**************/ | |
/* Data Types */ | |
/**************/ | |
/* Bootstrap BaseDataType */ | |
UA_DataTypeAttributes basedatatype_attr = UA_DataTypeAttributes_default; | |
basedatatype_attr.displayName = UA_LOCALIZEDTEXT("", "BaseDataType"); | |
basedatatype_attr.isAbstract = true; | |
ret |= addNode_raw(server, UA_NODECLASS_DATATYPE, UA_NS0ID_BASEDATATYPE, "BaseDataType", | |
&basedatatype_attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES]); | |
/*****************/ | |
/* VariableTypes */ | |
/*****************/ | |
UA_VariableTypeAttributes basevar_attr = UA_VariableTypeAttributes_default; | |
basevar_attr.displayName = UA_LOCALIZEDTEXT("", "BaseVariableType"); | |
basevar_attr.isAbstract = true; | |
basevar_attr.valueRank = UA_VALUERANK_ANY; | |
basevar_attr.dataType = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATATYPE); | |
ret |= addNode_raw(server, UA_NODECLASS_VARIABLETYPE, UA_NS0ID_BASEVARIABLETYPE, "BaseVariableType", | |
&basevar_attr, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES]); | |
UA_VariableTypeAttributes bdv_attr = UA_VariableTypeAttributes_default; | |
bdv_attr.displayName = UA_LOCALIZEDTEXT("", "BaseDataVariableType"); | |
bdv_attr.dataType = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATATYPE); | |
bdv_attr.valueRank = UA_VALUERANK_ANY; | |
ret |= UA_Server_addVariableTypeNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), | |
UA_NODEID_NUMERIC(0, UA_NS0ID_BASEVARIABLETYPE), | |
UA_NODEID_NULL, UA_QUALIFIEDNAME(0, "BaseDataVariableType"), | |
UA_NODEID_NULL, bdv_attr, NULL, NULL); | |
UA_VariableTypeAttributes prop_attr = UA_VariableTypeAttributes_default; | |
prop_attr.displayName = UA_LOCALIZEDTEXT("", "PropertyType"); | |
prop_attr.dataType = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATATYPE); | |
prop_attr.valueRank = UA_VALUERANK_ANY; | |
ret |= UA_Server_addVariableTypeNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_PROPERTYTYPE), | |
UA_NODEID_NUMERIC(0, UA_NS0ID_BASEVARIABLETYPE), | |
UA_NODEID_NULL, UA_QUALIFIEDNAME(0, "PropertyType"), | |
UA_NODEID_NULL, prop_attr, NULL, NULL); | |
/***************/ | |
/* ObjectTypes */ | |
/***************/ | |
UA_ObjectTypeAttributes baseobj_attr = UA_ObjectTypeAttributes_default; | |
baseobj_attr.displayName = UA_LOCALIZEDTEXT("", "BaseObjectType"); | |
ret |= addNode_raw(server, UA_NODECLASS_OBJECTTYPE, UA_NS0ID_BASEOBJECTTYPE, "BaseObjectType", | |
&baseobj_attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES]); | |
UA_ObjectTypeAttributes folder_attr = UA_ObjectTypeAttributes_default; | |
folder_attr.displayName = UA_LOCALIZEDTEXT("", "FolderType"); | |
ret |= UA_Server_addObjectTypeNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE), | |
UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE), | |
UA_NODEID_NULL, UA_QUALIFIEDNAME(0, "FolderType"), | |
folder_attr, NULL, NULL); | |
/******************/ | |
/* Root and below */ | |
/******************/ | |
ret |= addObjectNode(server, "Root", UA_NS0ID_ROOTFOLDER, 0, 0, UA_NS0ID_FOLDERTYPE); | |
ret |= addObjectNode(server, "Objects", UA_NS0ID_OBJECTSFOLDER, UA_NS0ID_ROOTFOLDER, | |
UA_NS0ID_ORGANIZES, UA_NS0ID_FOLDERTYPE); | |
ret |= addObjectNode(server, "Types", UA_NS0ID_TYPESFOLDER, UA_NS0ID_ROOTFOLDER, | |
UA_NS0ID_ORGANIZES, UA_NS0ID_FOLDERTYPE); | |
ret |= addObjectNode(server, "ReferenceTypes", UA_NS0ID_REFERENCETYPESFOLDER, UA_NS0ID_TYPESFOLDER, | |
UA_NS0ID_ORGANIZES, UA_NS0ID_FOLDERTYPE); | |
ret |= addNode_finish(server, UA_NS0ID_REFERENCES, UA_NS0ID_REFERENCETYPESFOLDER, | |
UA_NS0ID_ORGANIZES); | |
ret |= addObjectNode(server, "DataTypes", UA_NS0ID_DATATYPESFOLDER, UA_NS0ID_TYPESFOLDER, | |
UA_NS0ID_ORGANIZES, UA_NS0ID_FOLDERTYPE); | |
ret |= addNode_finish(server, UA_NS0ID_BASEDATATYPE, UA_NS0ID_DATATYPESFOLDER, | |
UA_NS0ID_ORGANIZES); | |
ret |= addObjectNode(server, "VariableTypes", UA_NS0ID_VARIABLETYPESFOLDER, UA_NS0ID_TYPESFOLDER, | |
UA_NS0ID_ORGANIZES, UA_NS0ID_FOLDERTYPE); | |
ret |= addNode_finish(server, UA_NS0ID_BASEVARIABLETYPE, UA_NS0ID_VARIABLETYPESFOLDER, | |
UA_NS0ID_ORGANIZES); | |
ret |= addObjectNode(server, "ObjectTypes", UA_NS0ID_OBJECTTYPESFOLDER, UA_NS0ID_TYPESFOLDER, | |
UA_NS0ID_ORGANIZES, UA_NS0ID_FOLDERTYPE); | |
ret |= addNode_finish(server, UA_NS0ID_BASEOBJECTTYPE, UA_NS0ID_OBJECTTYPESFOLDER, | |
UA_NS0ID_ORGANIZES); | |
ret |= addObjectNode(server, "EventTypes", UA_NS0ID_EVENTTYPESFOLDER, UA_NS0ID_TYPESFOLDER, | |
UA_NS0ID_ORGANIZES, UA_NS0ID_FOLDERTYPE); | |
ret |= addObjectNode(server, "Views", UA_NS0ID_VIEWSFOLDER, UA_NS0ID_ROOTFOLDER, | |
UA_NS0ID_ORGANIZES, UA_NS0ID_FOLDERTYPE); | |
if(ret != UA_STATUSCODE_GOOD) | |
ret = UA_STATUSCODE_BADINTERNALERROR; | |
return ret; | |
} | |
/****************/ | |
/* Data Sources */ | |
/****************/ | |
static UA_StatusCode | |
readStatus(UA_Server *server, const UA_NodeId *sessionId, void *sessionContext, | |
const UA_NodeId *nodeId, void *nodeContext, UA_Boolean sourceTimestamp, | |
const UA_NumericRange *range, UA_DataValue *value) { | |
if(range) { | |
value->hasStatus = true; | |
value->status = UA_STATUSCODE_BADINDEXRANGEINVALID; | |
return UA_STATUSCODE_GOOD; | |
} | |
if(sourceTimestamp) { | |
value->hasSourceTimestamp = true; | |
value->sourceTimestamp = UA_DateTime_now(); | |
} | |
void *data = NULL; | |
UA_assert(nodeId->identifierType == UA_NODEIDTYPE_NUMERIC); | |
switch(nodeId->identifier.numeric) { | |
case UA_NS0ID_SERVER_SERVERSTATUS_SECONDSTILLSHUTDOWN: { | |
UA_UInt32 *shutdown = UA_UInt32_new(); | |
if(!shutdown) | |
return UA_STATUSCODE_BADOUTOFMEMORY; | |
if(server->endTime != 0) | |
*shutdown = (UA_UInt32)((server->endTime - UA_DateTime_now()) / UA_DATETIME_SEC); | |
value->value.data = shutdown; | |
value->value.type = &UA_TYPES[UA_TYPES_UINT32]; | |
value->hasValue = true; | |
return UA_STATUSCODE_GOOD; | |
} | |
case UA_NS0ID_SERVER_SERVERSTATUS_STATE: { | |
UA_ServerState *state = UA_ServerState_new(); | |
if(!state) | |
return UA_STATUSCODE_BADOUTOFMEMORY; | |
if(server->endTime != 0) | |
*state = UA_SERVERSTATE_SHUTDOWN; | |
value->value.data = state; | |
value->value.type = &UA_TYPES[UA_TYPES_SERVERSTATE]; | |
value->hasValue = true; | |
return UA_STATUSCODE_GOOD; | |
} | |
case UA_NS0ID_SERVER_SERVERSTATUS: { | |
UA_ServerStatusDataType *statustype = UA_ServerStatusDataType_new(); | |
if(!statustype) | |
return UA_STATUSCODE_BADOUTOFMEMORY; | |
statustype->startTime = server->startTime; | |
statustype->currentTime = UA_DateTime_now(); | |
statustype->state = UA_SERVERSTATE_RUNNING; | |
statustype->secondsTillShutdown = 0; | |
if(server->endTime != 0) { | |
statustype->state = UA_SERVERSTATE_SHUTDOWN; | |
statustype->secondsTillShutdown = (UA_UInt32)((server->endTime - UA_DateTime_now()) / UA_DATETIME_SEC); | |
} | |
value->value.data = statustype; | |
value->value.type = &UA_TYPES[UA_TYPES_SERVERSTATUSDATATYPE]; | |
value->hasValue = true; | |
return UA_BuildInfo_copy(&server->config.buildInfo, &statustype->buildInfo); | |
} | |
case UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO: | |
value->value.type = &UA_TYPES[UA_TYPES_BUILDINFO]; | |
data = &server->config.buildInfo; | |
break; | |
case UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_PRODUCTURI: | |
value->value.type = &UA_TYPES[UA_TYPES_STRING]; | |
data = &server->config.buildInfo.productUri; | |
break; | |
case UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_MANUFACTURERNAME: | |
value->value.type = &UA_TYPES[UA_TYPES_STRING]; | |
data = &server->config.buildInfo.manufacturerName; | |
break; | |
case UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_PRODUCTNAME: | |
value->value.type = &UA_TYPES[UA_TYPES_STRING]; | |
data = &server->config.buildInfo.productName; | |
break; | |
case UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_SOFTWAREVERSION: | |
value->value.type = &UA_TYPES[UA_TYPES_STRING]; | |
data = &server->config.buildInfo.softwareVersion; | |
break; | |
case UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_BUILDNUMBER: | |
value->value.type = &UA_TYPES[UA_TYPES_STRING]; | |
data = &server->config.buildInfo.buildNumber; | |
break; | |
case UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_BUILDDATE: | |
value->value.type = &UA_TYPES[UA_TYPES_DATETIME]; | |
data = &server->config.buildInfo.buildDate; | |
break; | |
default: | |
value->hasStatus = true; | |
value->status = UA_STATUSCODE_BADINTERNALERROR; | |
return UA_STATUSCODE_GOOD; | |
} | |
value->value.data = UA_new(value->value.type); | |
if(!value->value.data) { | |
value->value.type = NULL; | |
return UA_STATUSCODE_BADOUTOFMEMORY; | |
} | |
value->hasValue = true; | |
return UA_copy(data, value->value.data, value->value.type); | |
} | |
#ifdef UA_GENERATED_NAMESPACE_ZERO | |
static UA_StatusCode | |
readServiceLevel(UA_Server *server, const UA_NodeId *sessionId, void *sessionContext, | |
const UA_NodeId *nodeId, void *nodeContext, UA_Boolean includeSourceTimeStamp, | |
const UA_NumericRange *range, UA_DataValue *value) { | |
if(range) { | |
value->hasStatus = true; | |
value->status = UA_STATUSCODE_BADINDEXRANGEINVALID; | |
return UA_STATUSCODE_GOOD; | |
} | |
value->value.type = &UA_TYPES[UA_TYPES_BYTE]; | |
value->value.arrayLength = 0; | |
UA_Byte *byte = UA_Byte_new(); | |
*byte = 255; | |
value->value.data = byte; | |
value->value.arrayDimensionsSize = 0; | |
value->value.arrayDimensions = NULL; | |
value->hasValue = true; | |
if(includeSourceTimeStamp) { | |
value->hasSourceTimestamp = true; | |
value->sourceTimestamp = UA_DateTime_now(); | |
} | |
return UA_STATUSCODE_GOOD; | |
} | |
static UA_StatusCode | |
readAuditing(UA_Server *server, const UA_NodeId *sessionId, void *sessionContext, | |
const UA_NodeId *nodeId, void *nodeContext, UA_Boolean includeSourceTimeStamp, | |
const UA_NumericRange *range, UA_DataValue *value) { | |
if(range) { | |
value->hasStatus = true; | |
value->status = UA_STATUSCODE_BADINDEXRANGEINVALID; | |
return UA_STATUSCODE_GOOD; | |
} | |
value->value.type = &UA_TYPES[UA_TYPES_BOOLEAN]; | |
value->value.arrayLength = 0; | |
UA_Boolean *boolean = UA_Boolean_new(); | |
*boolean = false; | |
value->value.data = boolean; | |
value->value.arrayDimensionsSize = 0; | |
value->value.arrayDimensions = NULL; | |
value->hasValue = true; | |
if(includeSourceTimeStamp) { | |
value->hasSourceTimestamp = true; | |
value->sourceTimestamp = UA_DateTime_now(); | |
} | |
return UA_STATUSCODE_GOOD; | |
} | |
#endif | |
static UA_StatusCode | |
readNamespaces(UA_Server *server, const UA_NodeId *sessionId, void *sessionContext, | |
const UA_NodeId *nodeid, void *nodeContext, UA_Boolean includeSourceTimeStamp, | |
const UA_NumericRange *range, | |
UA_DataValue *value) { | |
/* ensure that the uri for ns1 is set up from the app description */ | |
setupNs1Uri(server); | |
if(range) { | |
value->hasStatus = true; | |
value->status = UA_STATUSCODE_BADINDEXRANGEINVALID; | |
return UA_STATUSCODE_GOOD; | |
} | |
UA_StatusCode retval; | |
retval = UA_Variant_setArrayCopy(&value->value, server->namespaces, | |
server->namespacesSize, &UA_TYPES[UA_TYPES_STRING]); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
value->hasValue = true; | |
if(includeSourceTimeStamp) { | |
value->hasSourceTimestamp = true; | |
value->sourceTimestamp = UA_DateTime_now(); | |
} | |
return UA_STATUSCODE_GOOD; | |
} | |
static UA_StatusCode | |
writeNamespaces(UA_Server *server, const UA_NodeId *sessionId, void *sessionContext, | |
const UA_NodeId *nodeid, void *nodeContext, const UA_NumericRange *range, | |
const UA_DataValue *value) { | |
/* Check the data type */ | |
if(!value->hasValue || | |
value->value.type != &UA_TYPES[UA_TYPES_STRING]) | |
return UA_STATUSCODE_BADTYPEMISMATCH; | |
/* Check that the variant is not empty */ | |
if(!value->value.data) | |
return UA_STATUSCODE_BADTYPEMISMATCH; | |
/* TODO: Writing with a range is not implemented */ | |
if(range) | |
return UA_STATUSCODE_BADINTERNALERROR; | |
UA_String *newNamespaces = (UA_String*)value->value.data; | |
size_t newNamespacesSize = value->value.arrayLength; | |
/* Test if we append to the existing namespaces */ | |
if(newNamespacesSize <= server->namespacesSize) | |
return UA_STATUSCODE_BADTYPEMISMATCH; | |
/* ensure that the uri for ns1 is set up from the app description */ | |
setupNs1Uri(server); | |
/* Test if the existing namespaces are unchanged */ | |
for(size_t i = 0; i < server->namespacesSize; ++i) { | |
if(!UA_String_equal(&server->namespaces[i], &newNamespaces[i])) | |
return UA_STATUSCODE_BADINTERNALERROR; | |
} | |
/* Add namespaces */ | |
for(size_t i = server->namespacesSize; i < newNamespacesSize; ++i) | |
addNamespace(server, newNamespaces[i]); | |
return UA_STATUSCODE_GOOD; | |
} | |
static UA_StatusCode | |
readCurrentTime(UA_Server *server, const UA_NodeId *sessionId, void *sessionContext, | |
const UA_NodeId *nodeid, void *nodeContext, UA_Boolean sourceTimeStamp, | |
const UA_NumericRange *range, UA_DataValue *value) { | |
if(range) { | |
value->hasStatus = true; | |
value->status = UA_STATUSCODE_BADINDEXRANGEINVALID; | |
return UA_STATUSCODE_GOOD; | |
} | |
UA_DateTime currentTime = UA_DateTime_now(); | |
UA_StatusCode retval = UA_Variant_setScalarCopy(&value->value, ¤tTime, | |
&UA_TYPES[UA_TYPES_DATETIME]); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
value->hasValue = true; | |
if(sourceTimeStamp) { | |
value->hasSourceTimestamp = true; | |
value->sourceTimestamp = currentTime; | |
} | |
return UA_STATUSCODE_GOOD; | |
} | |
#ifdef UA_GENERATED_NAMESPACE_ZERO | |
static UA_StatusCode | |
readMinSamplingInterval(UA_Server *server, const UA_NodeId *sessionId, void *sessionContext, | |
const UA_NodeId *nodeid, void *nodeContext, UA_Boolean includeSourceTimeStamp, | |
const UA_NumericRange *range, | |
UA_DataValue *value) { | |
if(range) { | |
value->hasStatus = true; | |
value->status = UA_STATUSCODE_BADINDEXRANGEINVALID; | |
return UA_STATUSCODE_GOOD; | |
} | |
UA_StatusCode retval; | |
retval = UA_Variant_setScalarCopy(&value->value, | |
&server->config.samplingIntervalLimits.min, | |
&UA_TYPES[UA_TYPES_DURATION]); | |
if(retval != UA_STATUSCODE_GOOD) | |
return retval; | |
value->hasValue = true; | |
if(includeSourceTimeStamp) { | |
value->hasSourceTimestamp = true; | |
value->sourceTimestamp = UA_DateTime_now(); | |
} | |
return UA_STATUSCODE_GOOD; | |
} | |
#endif | |
#if defined(UA_GENERATED_NAMESPACE_ZERO) && defined(UA_ENABLE_METHODCALLS) && defined(UA_ENABLE_SUBSCRIPTIONS) | |
static UA_StatusCode | |
readMonitoredItems(UA_Server *server, const UA_NodeId *sessionId, void *sessionContext, | |
const UA_NodeId *methodId, void *methodContext, const UA_NodeId *objectId, | |
void *objectContext, size_t inputSize, | |
const UA_Variant *input, size_t outputSize, | |
UA_Variant *output) { | |
UA_LOCK(server->serviceMutex); | |
UA_Session *session = UA_SessionManager_getSessionById(&server->sessionManager, sessionId); | |
UA_UNLOCK(server->serviceMutex); | |
if(!session) | |
return UA_STATUSCODE_BADINTERNALERROR; | |
if (inputSize == 0 || !input[0].data) | |
return UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID; | |
UA_UInt32 subscriptionId = *((UA_UInt32*)(input[0].data)); | |
UA_LOCK(server->serviceMutex); | |
UA_Subscription* subscription = UA_Session_getSubscriptionById(session, subscriptionId); | |
UA_UNLOCK(server->serviceMutex); | |
if(!subscription) | |
{ | |
if(LIST_EMPTY(&session->serverSubscriptions)) | |
{ | |
UA_Variant_setArray(&output[0], UA_Array_new(0, &UA_TYPES[UA_TYPES_UINT32]), | |
0, &UA_TYPES[UA_TYPES_UINT32]); | |
UA_Variant_setArray(&output[1], UA_Array_new(0, &UA_TYPES[UA_TYPES_UINT32]), | |
0, &UA_TYPES[UA_TYPES_UINT32]); | |
return UA_STATUSCODE_BADNOMATCH; | |
} | |
return UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID; | |
} | |
UA_UInt32 sizeOfOutput = 0; | |
UA_MonitoredItem* monitoredItem; | |
LIST_FOREACH(monitoredItem, &subscription->monitoredItems, listEntry) { | |
++sizeOfOutput; | |
} | |
if(sizeOfOutput==0) | |
return UA_STATUSCODE_GOOD; | |
UA_UInt32* clientHandles = (UA_UInt32 *)UA_Array_new(sizeOfOutput, &UA_TYPES[UA_TYPES_UINT32]); | |
UA_UInt32* serverHandles = (UA_UInt32 *)UA_Array_new(sizeOfOutput, &UA_TYPES[UA_TYPES_UINT32]); | |
UA_UInt32 i = 0; | |
LIST_FOREACH(monitoredItem, &subscription->monitoredItems, listEntry) { | |
clientHandles[i] = monitoredItem->clientHandle; | |
serverHandles[i] = monitoredItem->monitoredItemId; | |
++i; | |
} | |
UA_Variant_setArray(&output[0], serverHandles, sizeOfOutput, &UA_TYPES[UA_TYPES_UINT32]); | |
UA_Variant_setArray(&output[1], clientHandles, sizeOfOutput, &UA_TYPES[UA_TYPES_UINT32]); | |
return UA_STATUSCODE_GOOD; | |
} | |
#endif /* defined(UA_ENABLE_METHODCALLS) && defined(UA_ENABLE_SUBSCRIPTIONS) */ | |
UA_StatusCode | |
writeNs0VariableArray(UA_Server *server, UA_UInt32 id, void *v, | |
size_t length, const UA_DataType *type) { | |
UA_Variant var; | |
UA_Variant_init(&var); | |
UA_Variant_setArray(&var, v, length, type); | |
return UA_Server_writeValue(server, UA_NODEID_NUMERIC(0, id), var); | |
} | |
#ifndef UA_GENERATED_NAMESPACE_ZERO | |
static UA_StatusCode | |
addVariableNode(UA_Server *server, char* name, UA_UInt32 variableid, | |
UA_UInt32 parentid, UA_UInt32 referenceid, | |
UA_Int32 valueRank, UA_UInt32 dataType) { | |
UA_VariableAttributes attr = UA_VariableAttributes_default; | |
attr.displayName = UA_LOCALIZEDTEXT("", name); | |
attr.dataType = UA_NODEID_NUMERIC(0, dataType); | |
attr.valueRank = valueRank; | |
attr.accessLevel = UA_ACCESSLEVELMASK_READ; | |
return UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(0, variableid), | |
UA_NODEID_NUMERIC(0, parentid), UA_NODEID_NUMERIC(0, referenceid), | |
UA_QUALIFIEDNAME(0, name), | |
UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), | |
attr, NULL, NULL); | |
} | |
/* A minimal server object that is not complete and does not use the mandated | |
* references to a server type. To be used on very constrained devices. */ | |
static UA_StatusCode | |
UA_Server_minimalServerObject(UA_Server *server) { | |
/* Server */ | |
UA_StatusCode retval = addObjectNode(server, "Server", UA_NS0ID_SERVER, UA_NS0ID_OBJECTSFOLDER, | |
UA_NS0ID_ORGANIZES, UA_NS0ID_BASEOBJECTTYPE); | |
/* Use a valuerank of -2 for now. The array is added later on and the valuerank set to 1. */ | |
retval |= addVariableNode(server, "ServerArray", UA_NS0ID_SERVER_SERVERARRAY, | |
UA_NS0ID_SERVER, UA_NS0ID_HASPROPERTY, | |
UA_VALUERANK_ANY, UA_NS0ID_BASEDATATYPE); | |
retval |= addVariableNode(server, "NamespaceArray", UA_NS0ID_SERVER_NAMESPACEARRAY, | |
UA_NS0ID_SERVER, UA_NS0ID_HASPROPERTY, | |
UA_VALUERANK_ANY, UA_NS0ID_BASEDATATYPE); | |
retval |= addVariableNode(server, "ServerStatus", UA_NS0ID_SERVER_SERVERSTATUS, | |
UA_NS0ID_SERVER, UA_NS0ID_HASCOMPONENT, | |
UA_VALUERANK_SCALAR, UA_NS0ID_BASEDATATYPE); | |
retval |= addVariableNode(server, "CurrentTime", UA_NS0ID_SERVER_SERVERSTATUS_CURRENTTIME, | |
UA_NS0ID_SERVER_SERVERSTATUS, UA_NS0ID_HASCOMPONENT, | |
UA_VALUERANK_SCALAR, UA_NS0ID_BASEDATATYPE); | |
retval |= addVariableNode(server, "State", UA_NS0ID_SERVER_SERVERSTATUS_STATE, | |
UA_NS0ID_SERVER_SERVERSTATUS, UA_NS0ID_HASCOMPONENT, | |
UA_VALUERANK_SCALAR, UA_NS0ID_BASEDATATYPE); | |
retval |= addVariableNode(server, "BuildInfo", UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO, | |
UA_NS0ID_SERVER_SERVERSTATUS, UA_NS0ID_HASCOMPONENT, | |
UA_VALUERANK_SCALAR, UA_NS0ID_BASEDATATYPE); | |
retval |= addVariableNode(server, "ProductUri", UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_PRODUCTURI, | |
UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO, UA_NS0ID_HASCOMPONENT, | |
UA_VALUERANK_SCALAR, UA_NS0ID_BASEDATATYPE); | |
retval |= addVariableNode(server, "ManufacturerName", | |
UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_MANUFACTURERNAME, | |
UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO, UA_NS0ID_HASCOMPONENT, | |
UA_VALUERANK_SCALAR, UA_NS0ID_BASEDATATYPE); | |
retval |= addVariableNode(server, "ProductName", | |
UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_PRODUCTNAME, | |
UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO, UA_NS0ID_HASCOMPONENT, | |
UA_VALUERANK_SCALAR, UA_NS0ID_BASEDATATYPE); | |
retval |= addVariableNode(server, "SoftwareVersion", | |
UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_SOFTWAREVERSION, | |
UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO, UA_NS0ID_HASCOMPONENT, | |
UA_VALUERANK_SCALAR, UA_NS0ID_BASEDATATYPE); | |
retval |= addVariableNode(server, "BuildNumber", | |
UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_BUILDNUMBER, | |
UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO, UA_NS0ID_HASCOMPONENT, | |
UA_VALUERANK_SCALAR, UA_NS0ID_BASEDATATYPE); | |
retval |= addVariableNode(server, "BuildDate", | |
UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_BUILDDATE, | |
UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO, UA_NS0ID_HASCOMPONENT, | |
UA_VALUERANK_SCALAR, UA_NS0ID_BASEDATATYPE); | |
return retval; | |
} | |
#else | |
static UA_StatusCode | |
writeNs0Variable(UA_Server *server, UA_UInt32 id, void *v, const UA_DataType *type) { | |
UA_Variant var; | |
UA_Variant_init(&var); | |
UA_Variant_setScalar(&var, v, type); | |
return UA_Server_writeValue(server, UA_NODEID_NUMERIC(0, id), var); | |
} | |
static void | |
addModellingRules(UA_Server *server) { | |
/* Test if the ModellingRules folder was added. (Only for the full ns0.) */ | |
UA_NodeClass mrnc = UA_NODECLASS_UNSPECIFIED; | |
UA_StatusCode retval = UA_Server_readNodeClass(server, | |
UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_MODELLINGRULES), | |
&mrnc); | |
if(retval != UA_STATUSCODE_GOOD) | |
return; | |
/* Add ExposesItsArray */ | |
UA_Server_addReference(server, | |
UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_MODELLINGRULES), | |
UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), | |
UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_MODELLINGRULE_EXPOSESITSARRAY), | |
true); | |
/* Add Mandatory */ | |
UA_Server_addReference(server, | |
UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_MODELLINGRULES), | |
UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), | |
UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_MODELLINGRULE_MANDATORY), | |
true); | |
/* Add MandatoryPlaceholder */ | |
UA_Server_addReference(server, | |
UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_MODELLINGRULES), | |
UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), | |
UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_MODELLINGRULE_MANDATORYPLACEHOLDER), | |
true); | |
/* Add Optional */ | |
UA_Server_addReference(server, | |
UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_MODELLINGRULES), | |
UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), | |
UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_MODELLINGRULE_OPTIONAL), | |
true); | |
/* Add OptionalPlaceholder */ | |
UA_Server_addReference(server, | |
UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_MODELLINGRULES), | |
UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), | |
UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_MODELLINGRULE_OPTIONALPLACEHOLDER), | |
true); | |
} | |
#endif | |
/* Initialize the nodeset 0 by using the generated code of the nodeset compiler. | |
* This also initialized the data sources for various variables, such as for | |
* example server time. */ | |
UA_StatusCode | |
UA_Server_initNS0(UA_Server *server) { | |
/* Initialize base nodes which are always required an cannot be created | |
* through the NS compiler */ | |
server->bootstrapNS0 = true; | |
UA_StatusCode retVal = UA_Server_createNS0_base(server); | |
server->bootstrapNS0 = false; | |
if(retVal != UA_STATUSCODE_GOOD) | |
return retVal; | |
#ifdef UA_GENERATED_NAMESPACE_ZERO | |
/* Load nodes and references generated from the XML ns0 definition */ | |
retVal = namespace0_generated(server); | |
#else | |
/* Create a minimal server object */ | |
retVal = UA_Server_minimalServerObject(server); | |
#endif | |
if(retVal != UA_STATUSCODE_GOOD) { | |
UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER, | |
"Initialization of Namespace 0 (before bootstrapping) " | |
"failed with %s. See previous outputs for any error messages.", | |
UA_StatusCode_name(retVal)); | |
return UA_STATUSCODE_BADINTERNALERROR; | |
} | |
/* NamespaceArray */ | |
UA_DataSource namespaceDataSource = {readNamespaces, writeNamespaces}; | |
retVal |= UA_Server_setVariableNode_dataSource(server, | |
UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_NAMESPACEARRAY), | |
namespaceDataSource); | |
retVal |= UA_Server_writeValueRank(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_NAMESPACEARRAY), 1); | |
/* ServerArray */ | |
retVal |= writeNs0VariableArray(server, UA_NS0ID_SERVER_SERVERARRAY, | |
&server->config.applicationDescription.applicationUri, | |
1, &UA_TYPES[UA_TYPES_STRING]); | |
retVal |= UA_Server_writeValueRank(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERARRAY), 1); | |
/* ServerStatus */ | |
UA_DataSource serverStatus = {readStatus, NULL}; | |
retVal |= UA_Server_setVariableNode_dataSource(server, | |
UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS), serverStatus); | |
/* StartTime will be sampled in UA_Server_run_startup()*/ | |
/* CurrentTime */ | |
UA_DataSource currentTime = {readCurrentTime, NULL}; | |
retVal |= UA_Server_setVariableNode_dataSource(server, | |
UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_CURRENTTIME), currentTime); | |
/* State */ | |
retVal |= UA_Server_setVariableNode_dataSource(server, | |
UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_STATE), | |
serverStatus); | |
/* BuildInfo */ | |
retVal |= UA_Server_setVariableNode_dataSource(server, | |
UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO), serverStatus); | |
/* BuildInfo - ProductUri */ | |
retVal |= UA_Server_setVariableNode_dataSource(server, | |
UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_PRODUCTURI), | |
serverStatus); | |
/* BuildInfo - ManufacturerName */ | |
retVal |= UA_Server_setVariableNode_dataSource(server, | |
UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_MANUFACTURERNAME), | |
serverStatus); | |
/* BuildInfo - ProductName */ | |
retVal |= UA_Server_setVariableNode_dataSource(server, | |
UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_PRODUCTNAME), | |
serverStatus); | |
/* BuildInfo - SoftwareVersion */ | |
retVal |= UA_Server_setVariableNode_dataSource(server, | |
UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_SOFTWAREVERSION), | |
serverStatus); | |
/* BuildInfo - BuildNumber */ | |
retVal |= UA_Server_setVariableNode_dataSource(server, | |
UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_BUILDNUMBER), | |
serverStatus); | |
/* BuildInfo - BuildDate */ | |
retVal |= UA_Server_setVariableNode_dataSource(server, | |
UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_BUILDDATE), | |
serverStatus); | |
#ifdef UA_GENERATED_NAMESPACE_ZERO | |
/* SecondsTillShutdown */ | |
retVal |= UA_Server_setVariableNode_dataSource(server, | |
UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_SECONDSTILLSHUTDOWN), | |
serverStatus); | |
/* ShutDownReason */ | |
UA_LocalizedText shutdownReason; | |
UA_LocalizedText_init(&shutdownReason); | |
retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERSTATUS_SHUTDOWNREASON, | |
&shutdownReason, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]); | |
/* ServiceLevel */ | |
UA_DataSource serviceLevel = {readServiceLevel, NULL}; | |
retVal |= UA_Server_setVariableNode_dataSource(server, | |
UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVICELEVEL), serviceLevel); | |
/* ServerDiagnostics - ServerDiagnosticsSummary */ | |
UA_ServerDiagnosticsSummaryDataType serverDiagnosticsSummary; | |
UA_ServerDiagnosticsSummaryDataType_init(&serverDiagnosticsSummary); | |
retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY, | |
&serverDiagnosticsSummary, | |
&UA_TYPES[UA_TYPES_SERVERDIAGNOSTICSSUMMARYDATATYPE]); | |
/* ServerDiagnostics - EnabledFlag */ | |
UA_Boolean enabledFlag = false; | |
retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERDIAGNOSTICS_ENABLEDFLAG, | |
&enabledFlag, &UA_TYPES[UA_TYPES_BOOLEAN]); | |
/* According to Specification part-5 - pg.no-11(PDF pg.no-29), when the ServerDiagnostics is disabled the client | |
* may modify the value of enabledFlag=true in the server. By default, this node have CurrentRead/Write access. | |
* In CTT, Subscription_Minimum_1/002.js test will modify the above flag. This will not be a problem when build | |
* configuration is set at UA_NAMESPACE_ZERO="REDUCED" as NodeIds will not be present. When UA_NAMESPACE_ZERO="FULL", | |
* the test will fail. Hence made the NodeId as read only */ | |
retVal |= UA_Server_writeAccessLevel(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERDIAGNOSTICS_ENABLEDFLAG), | |
UA_ACCESSLEVELMASK_READ); | |
/* Auditing */ | |
UA_DataSource auditing = {readAuditing, NULL}; | |
retVal |= UA_Server_setVariableNode_dataSource(server, | |
UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_AUDITING), auditing); | |
/* Redundancy Support */ | |
UA_RedundancySupport redundancySupport = UA_REDUNDANCYSUPPORT_NONE; | |
retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERREDUNDANCY_REDUNDANCYSUPPORT, | |
&redundancySupport, &UA_TYPES[UA_TYPES_REDUNDANCYSUPPORT]); | |
/* Remove unused subtypes of ServerRedundancy */ | |
UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERREDUNDANCY_CURRENTSERVERID), true); | |
UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERREDUNDANCY_REDUNDANTSERVERARRAY), true); | |
UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERREDUNDANCY_SERVERURIARRAY), true); | |
UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERREDUNDANCY_SERVERNETWORKGROUPS), true); | |
/* ServerCapabilities - LocaleIdArray */ | |
UA_LocaleId locale_en = UA_STRING("en"); | |
retVal |= writeNs0VariableArray(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_LOCALEIDARRAY, | |
&locale_en, 1, &UA_TYPES[UA_TYPES_LOCALEID]); | |
/* ServerCapabilities - MaxBrowseContinuationPoints */ | |
UA_UInt16 maxBrowseContinuationPoints = UA_MAXCONTINUATIONPOINTS; | |
retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_MAXBROWSECONTINUATIONPOINTS, | |
&maxBrowseContinuationPoints, &UA_TYPES[UA_TYPES_UINT16]); | |
/* ServerProfileArray */ | |
UA_String profileArray[3]; | |
UA_UInt16 profileArraySize = 0; | |
#define ADDPROFILEARRAY(x) profileArray[profileArraySize++] = UA_STRING(x) | |
ADDPROFILEARRAY("http://opcfoundation.org/UA-Profile/Server/MicroEmbeddedDevice"); | |
#ifdef UA_ENABLE_NODEMANAGEMENT | |
ADDPROFILEARRAY("http://opcfoundation.org/UA-Profile/Server/NodeManagement"); | |
#endif | |
#ifdef UA_ENABLE_METHODCALLS | |
ADDPROFILEARRAY("http://opcfoundation.org/UA-Profile/Server/Methods"); | |
#endif | |
retVal |= writeNs0VariableArray(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_SERVERPROFILEARRAY, | |
profileArray, profileArraySize, &UA_TYPES[UA_TYPES_STRING]); | |
/* ServerCapabilities - MaxQueryContinuationPoints */ | |
UA_UInt16 maxQueryContinuationPoints = 0; | |
retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_MAXQUERYCONTINUATIONPOINTS, | |
&maxQueryContinuationPoints, &UA_TYPES[UA_TYPES_UINT16]); | |
/* ServerCapabilities - MaxHistoryContinuationPoints */ | |
UA_UInt16 maxHistoryContinuationPoints = 0; | |
retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_MAXHISTORYCONTINUATIONPOINTS, | |
&maxHistoryContinuationPoints, &UA_TYPES[UA_TYPES_UINT16]); | |
/* ServerCapabilities - MinSupportedSampleRate */ | |
UA_DataSource samplingInterval = {readMinSamplingInterval, NULL}; | |
retVal |= UA_Server_setVariableNode_dataSource(server, | |
UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_MINSUPPORTEDSAMPLERATE), | |
samplingInterval); | |
/* ServerCapabilities - OperationLimits - MaxNodesPerRead */ | |
retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERREAD, | |
&server->config.maxNodesPerRead, &UA_TYPES[UA_TYPES_UINT32]); | |
/* ServerCapabilities - OperationLimits - maxNodesPerWrite */ | |
retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERWRITE, | |
&server->config.maxNodesPerWrite, &UA_TYPES[UA_TYPES_UINT32]); | |
/* ServerCapabilities - OperationLimits - MaxNodesPerMethodCall */ | |
retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERMETHODCALL, | |
&server->config.maxNodesPerMethodCall, &UA_TYPES[UA_TYPES_UINT32]); | |
/* ServerCapabilities - OperationLimits - MaxNodesPerBrowse */ | |
retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERBROWSE, | |
&server->config.maxNodesPerBrowse, &UA_TYPES[UA_TYPES_UINT32]); | |
/* ServerCapabilities - OperationLimits - MaxNodesPerRegisterNodes */ | |
retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERREGISTERNODES, | |
&server->config.maxNodesPerRegisterNodes, &UA_TYPES[UA_TYPES_UINT32]); | |
/* ServerCapabilities - OperationLimits - MaxNodesPerTranslateBrowsePathsToNodeIds */ | |
retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERTRANSLATEBROWSEPATHSTONODEIDS, | |
&server->config.maxNodesPerTranslateBrowsePathsToNodeIds, &UA_TYPES[UA_TYPES_UINT32]); | |
/* ServerCapabilities - OperationLimits - MaxNodesPerNodeManagement */ | |
retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERNODEMANAGEMENT, | |
&server->config.maxNodesPerNodeManagement, &UA_TYPES[UA_TYPES_UINT32]); | |
/* ServerCapabilities - OperationLimits - MaxMonitoredItemsPerCall */ | |
retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXMONITOREDITEMSPERCALL, | |
&server->config.maxMonitoredItemsPerCall, &UA_TYPES[UA_TYPES_UINT32]); | |
#ifdef UA_ENABLE_MICRO_EMB_DEV_PROFILE | |
/* Remove unused operation limit components */ | |
UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERHISTORYREADDATA), true); | |
UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERHISTORYREADEVENTS), true); | |
UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERHISTORYUPDATEDATA), true); | |
UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERHISTORYUPDATEEVENTS), true); | |
UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_ROLESET), true); | |
UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_MAXSTRINGLENGTH), true); | |
UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_MAXARRAYLENGTH), true); | |
UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERCAPABILITIES_MAXBYTESTRINGLENGTH), true); | |
/* Remove not supported Server Instance */ | |
UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_DICTIONARIES), true); | |
UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_ESTIMATEDRETURNTIME), true); | |
UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_LOCALTIME), true); | |
UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_PUBLISHSUBSCRIBE), true); | |
UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_NAMESPACES), true); | |
UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_REQUESTSERVERSTATECHANGE), true); | |
UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_RESENDDATA), true); | |
UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVERCONFIGURATION), true); | |
UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SETSUBSCRIPTIONDURABLE), true); | |
UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SAMPLINGINTERVALDIAGNOSTICSARRAY), true); | |
UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SESSIONSDIAGNOSTICSSUMMARY), true); | |
/* Removing these NodeIds make Server Object to be non-complaint with UA 1.03 in CTT (Base Inforamtion/Base Info Core Structure/ 001.js) | |
* In the 1.04 specification this has been resolved by allowing to remove these static nodes as well */ | |
UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY), true); | |
UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SUBSCRIPTIONDIAGNOSTICSARRAY), true); | |
#endif | |
#ifndef UA_ENABLE_HISTORIZING | |
UA_Server_deleteNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_HISTORYSERVERCAPABILITIES), true); | |
#else | |
/* ServerCapabilities - HistoryServerCapabilities - AccessHistoryDataCapability */ | |
retVal |= writeNs0Variable(server, UA_NS0ID_HISTORYSERVERCAPABILITIES_ACCESSHISTORYDATACAPABILITY, | |
&server->config.accessHistoryDataCapability, &UA_TYPES[UA_TYPES_BOOLEAN]); | |
/* ServerCapabilities - HistoryServerCapabilities - MaxReturnDataValues */ | |
retVal |= writeNs0Variable(server, UA_NS0ID_HISTORYSERVERCAPABILITIES_MAXRETURNDATAVALUES, | |
&server->config.maxReturnDataValues, &UA_TYPES[UA_TYPES_UINT32]); | |
/* ServerCapabilities - HistoryServerCapabilities - AccessHistoryEventsCapability */ | |
retVal |= writeNs0Variable(server, UA_NS0ID_HISTORYSERVERCAPABILITIES_ACCESSHISTORYEVENTSCAPABILITY, | |
&server->config.accessHistoryEventsCapability, &UA_TYPES[UA_TYPES_BOOLEAN]); | |
/* ServerCapabilities - HistoryServerCapabilities - MaxReturnEventValues */ | |
retVal |= writeNs0Variable(server, UA_NS0ID_HISTORYSERVERCAPABILITIES_MAXRETURNEVENTVALUES, | |
&server->config.maxReturnEventValues, &UA_TYPES[UA_TYPES_UINT32]); | |
/* ServerCapabilities - HistoryServerCapabilities - InsertDataCapability */ | |
retVal |= writeNs0Variable(server, UA_NS0ID_HISTORYSERVERCAPABILITIES_INSERTDATACAPABILITY, | |
&server->config.insertDataCapability, &UA_TYPES[UA_TYPES_BOOLEAN]); | |
/* ServerCapabilities - HistoryServerCapabilities - InsertEventCapability */ | |
retVal |= writeNs0Variable(server, UA_NS0ID_HISTORYSERVERCAPABILITIES_INSERTEVENTCAPABILITY, | |
&server->config.insertEventCapability, &UA_TYPES[UA_TYPES_BOOLEAN]); | |
/* ServerCapabilities - HistoryServerCapabilities - InsertAnnotationsCapability */ | |
retVal |= writeNs0Variable(server, UA_NS0ID_HISTORYSERVERCAPABILITIES_INSERTANNOTATIONCAPABILITY, | |
&server->config.insertAnnotationsCapability, &UA_TYPES[UA_TYPES_BOOLEAN]); | |
/* ServerCapabilities - HistoryServerCapabilities - ReplaceDataCapability */ | |
retVal |= writeNs0Variable(server, UA_NS0ID_HISTORYSERVERCAPABILITIES_REPLACEDATACAPABILITY, | |
&server->config.replaceDataCapability, &UA_TYPES[UA_TYPES_BOOLEAN]); | |
/* ServerCapabilities - HistoryServerCapabilities - ReplaceEventCapability */ | |
retVal |= writeNs0Variable(server, UA_NS0ID_HISTORYSERVERCAPABILITIES_REPLACEEVENTCAPABILITY, | |
&server->config.replaceEventCapability, &UA_TYPES[UA_TYPES_BOOLEAN]); | |
/* ServerCapabilities - HistoryServerCapabilities - UpdateDataCapability */ | |
retVal |= writeNs0Variable(server, UA_NS0ID_HISTORYSERVERCAPABILITIES_UPDATEDATACAPABIL |
View raw
(Sorry about that, but we can’t show files that are this big right now.)
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment