Skip to content

Instantly share code, notes, and snippets.

@spartajet
Created March 3, 2020 05:59
Show Gist options
  • Save spartajet/34f1d210ccc8c9b47cd49b3fe84316a6 to your computer and use it in GitHub Desktop.
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 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, &copy);
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,
&current->session.header.channel->securityPolicy->localCertificate)) {
UA_LOCK(server->serviceMutex);
UA_SessionManager_removeSession(sm, &current->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, &currentTime,
&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