/home/travis/build/open62541/open62541/include/ua_types.h
Go to the documentation of this file.
00001 /*
00002  * Copyright (C) 2014 the contributors as stated in the AUTHORS file
00003  *
00004  * This file is part of open62541. open62541 is free software: you can
00005  * redistribute it and/or modify it under the terms of the GNU Lesser General
00006  * Public License, version 3 (as published by the Free Software Foundation) with
00007  * a static linking exception as stated in the LICENSE file provided with
00008  * open62541.
00009  *
00010  * open62541 is distributed in the hope that it will be useful, but WITHOUT ANY
00011  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
00012  * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
00013  * details.
00014  */
00015 
00016 #ifndef UA_TYPES_H_
00017 #define UA_TYPES_H_
00018 
00019 #ifdef __cplusplus
00020 extern "C" {
00021 #endif
00022 
00023 #include <stdint.h>
00024 #include <stdbool.h>
00025 #include <stddef.h>
00026 #include "ua_config.h"
00027 
00062 typedef bool UA_Boolean;
00063 #define UA_TRUE true
00064 #define UA_FALSE false
00065 
00067 typedef int8_t UA_SByte;
00068 #define UA_SBYTE_MAX 127
00069 #define UA_SBYTE_MIN -128
00070 
00072 typedef uint8_t UA_Byte;
00073 #define UA_BYTE_MAX 256
00074 #define UA_BYTE_MIN 0
00075 
00077 typedef int16_t UA_Int16;
00078 #define UA_INT16_MAX 32767
00079 #define UA_INT16_MIN -32768
00080 
00082 typedef uint16_t UA_UInt16;
00083 #define UA_UINT16_MAX 65535
00084 #define UA_UINT16_MIN 0
00085 
00087 typedef int32_t UA_Int32;
00088 #define UA_INT32_MAX 2147483647
00089 #define UA_INT32_MIN -2147483648
00090 
00092 typedef uint32_t UA_UInt32;
00093 #define UA_UINT32_MAX 4294967295
00094 #define UA_UINT32_MIN 0
00095 
00097 typedef int64_t UA_Int64;
00098 #define UA_INT64_MAX 9223372036854775807
00099 #define UA_INT64_MIN -9223372036854775808
00100 
00102 typedef uint64_t UA_UInt64;
00103 #define UA_UINT64_MAX = 18446744073709551615
00104 #define UA_UINT64_MIN = 0
00105 
00107 typedef float UA_Float;
00108 
00110 typedef double UA_Double;
00111 
00113 typedef struct {
00114     UA_Int32 length;
00115     UA_Byte *data;
00116 } UA_String;
00117 
00122 typedef UA_Int64 UA_DateTime; // 100 nanosecond resolution
00123 
00125 typedef struct {
00126     UA_UInt32 data1;
00127     UA_UInt16 data2;
00128     UA_UInt16 data3;
00129     UA_Byte   data4[8];
00130 } UA_Guid;
00131 
00133 typedef UA_String UA_ByteString;
00134 
00136 typedef UA_String UA_XmlElement;
00137 
00139 /* The shortened numeric types are introduced during encoding. */
00140 typedef struct {
00141     UA_UInt16 namespaceIndex;
00142     enum {
00143         UA_NODEIDTYPE_NUMERIC    = 2,
00144         UA_NODEIDTYPE_STRING     = 3,
00145         UA_NODEIDTYPE_GUID       = 4,
00146         UA_NODEIDTYPE_BYTESTRING = 5
00147     } identifierType;
00148     union {
00149         UA_UInt32     numeric;
00150         UA_String     string;
00151         UA_Guid       guid;
00152         UA_ByteString byteString;
00153     } identifier;
00154 } UA_NodeId;
00155 
00157 typedef struct {
00158     UA_NodeId nodeId;
00159     UA_String namespaceUri; // not encoded if length=-1
00160     UA_UInt32 serverIndex;  // not encoded if 0
00161 } UA_ExpandedNodeId;
00162 
00163 #include "ua_statuscodes.h"
00165 typedef enum UA_StatusCode UA_StatusCode; // StatusCodes aren't an enum(=int) since 32 unsigned bits are needed. See also ua_statuscodes.h */
00166 
00168 typedef struct {
00169     UA_UInt16 namespaceIndex;
00170     UA_String name;
00171 } UA_QualifiedName;
00172 
00174 typedef struct {
00175     UA_String locale;
00176     UA_String text;
00177 } UA_LocalizedText;
00178 
00181 typedef struct {
00182     UA_NodeId typeId;
00183     enum {
00184         UA_EXTENSIONOBJECT_ENCODINGMASK_NOBODYISENCODED  = 0,
00185         UA_EXTENSIONOBJECT_ENCODINGMASK_BODYISBYTESTRING = 1,
00186         UA_EXTENSIONOBJECT_ENCODINGMASK_BODYISXML        = 2
00187     } encoding;
00188     UA_ByteString body; // contains either the bytestring or a pointer to the memory-object
00189 } UA_ExtensionObject;
00190 
00191 struct UA_DataType;
00192 typedef struct UA_DataType UA_DataType; 
00193 
00198 typedef struct {
00199     UA_Int32 dimensionsSize;
00200     struct UA_NumericRangeDimension {
00201         UA_UInt32 min;
00202         UA_UInt32 max;
00203     } *dimensions;
00204 } UA_NumericRange;
00205 
00217 typedef struct {
00218     const UA_DataType *type;
00219     enum {
00220         UA_VARIANT_DATA, 
00221         UA_VARIANT_DATA_NODELETE, 
00225     } storageType;
00226     UA_Int32  arrayLength;  
00227     void     *data; 
00228     UA_Int32  arrayDimensionsSize; 
00229     UA_Int32 *arrayDimensions; 
00230 } UA_Variant;
00231 
00233 typedef struct {
00234     UA_Boolean    hasValue : 1;
00235     UA_Boolean    hasStatus : 1;
00236     UA_Boolean    hasSourceTimestamp : 1;
00237     UA_Boolean    hasServerTimestamp : 1;
00238     UA_Boolean    hasSourcePicoseconds : 1;
00239     UA_Boolean    hasServerPicoseconds : 1;
00240     UA_Variant    value;
00241     UA_StatusCode status;
00242     UA_DateTime   sourceTimestamp;
00243     UA_Int16      sourcePicoseconds;
00244     UA_DateTime   serverTimestamp;
00245     UA_Int16      serverPicoseconds;
00246 } UA_DataValue;
00247 
00249 typedef struct UA_DiagnosticInfo {
00250     UA_Boolean    hasSymbolicId : 1;
00251     UA_Boolean    hasNamespaceUri : 1;
00252     UA_Boolean    hasLocalizedText : 1;
00253     UA_Boolean    hasLocale : 1;
00254     UA_Boolean    hasAdditionalInfo : 1;
00255     UA_Boolean    hasInnerStatusCode : 1;
00256     UA_Boolean    hasInnerDiagnosticInfo : 1;
00257     UA_Int32      symbolicId;
00258     UA_Int32      namespaceUri;
00259     UA_Int32      localizedText;
00260     UA_Int32      locale;
00261     UA_String     additionalInfo;
00262     UA_StatusCode innerStatusCode;
00263     struct UA_DiagnosticInfo *innerDiagnosticInfo;
00264 } UA_DiagnosticInfo;
00265 
00266 #ifndef SWIG
00267 #define UA_TYPE_HANDLING_FUNCTIONS(TYPE)                             \
00268     TYPE UA_EXPORT * TYPE##_new(void);                               \
00269     void UA_EXPORT TYPE##_init(TYPE * p);                            \
00270     void UA_EXPORT TYPE##_delete(TYPE * p);                          \
00271     void UA_EXPORT TYPE##_deleteMembers(TYPE * p);                   \
00272     UA_StatusCode UA_EXPORT TYPE##_copy(const TYPE *src, TYPE *dst);
00273 #else
00274 #define UA_TYPE_HANDLING_FUNCTIONS(TYPE)
00275 #endif
00276 
00277 /* Functions for all types */
00278 UA_TYPE_HANDLING_FUNCTIONS(UA_Boolean)
00279 UA_TYPE_HANDLING_FUNCTIONS(UA_SByte)
00280 UA_TYPE_HANDLING_FUNCTIONS(UA_Byte)
00281 UA_TYPE_HANDLING_FUNCTIONS(UA_Int16)
00282 UA_TYPE_HANDLING_FUNCTIONS(UA_UInt16)
00283 UA_TYPE_HANDLING_FUNCTIONS(UA_Int32)
00284 UA_TYPE_HANDLING_FUNCTIONS(UA_UInt32)
00285 UA_TYPE_HANDLING_FUNCTIONS(UA_Int64)
00286 UA_TYPE_HANDLING_FUNCTIONS(UA_UInt64)
00287 UA_TYPE_HANDLING_FUNCTIONS(UA_Float)
00288 UA_TYPE_HANDLING_FUNCTIONS(UA_Double)
00289 UA_TYPE_HANDLING_FUNCTIONS(UA_String)
00290 #define UA_DateTime_new UA_Int64_new
00291 #define UA_DateTime_init UA_Int64_init
00292 #define UA_DateTime_delete UA_Int64_delete
00293 #define UA_DateTime_deleteMembers UA_Int64_deleteMembers
00294 #define UA_DateTime_copy UA_Int64_copy
00295 UA_TYPE_HANDLING_FUNCTIONS(UA_Guid)
00296 #define UA_ByteString_new UA_String_new
00297 #define UA_ByteString_init UA_String_init
00298 #define UA_ByteString_delete UA_String_delete
00299 #define UA_ByteString_deleteMembers UA_String_deleteMembers
00300 #define UA_ByteString_copy UA_String_copy
00301 #define UA_XmlElement_new UA_String_new
00302 #define UA_XmlElement_init UA_String_init
00303 #define UA_XmlElement_delete UA_String_delete
00304 #define UA_XmlElement_deleteMembers UA_String_deleteMembers
00305 #define UA_XmlElement_copy UA_String_copy
00306 UA_TYPE_HANDLING_FUNCTIONS(UA_NodeId)
00307 UA_TYPE_HANDLING_FUNCTIONS(UA_ExpandedNodeId)
00308 #define UA_StatusCode_new(p) UA_Int32_new((UA_Int32*)p)
00309 #define UA_StatusCode_init(p) UA_Int32_init((UA_Int32*)p)
00310 #define UA_StatusCode_delete(p) UA_Int32_delete((UA_Int32*)p)
00311 #define UA_StatusCode_deleteMembers(p) UA_Int32_deleteMembers((UA_Int32*)p)
00312 #define UA_StatusCode_copy(p) UA_Int32_copy((UA_Int32*)p)
00313 UA_TYPE_HANDLING_FUNCTIONS(UA_QualifiedName)
00314 UA_TYPE_HANDLING_FUNCTIONS(UA_LocalizedText)
00315 UA_TYPE_HANDLING_FUNCTIONS(UA_ExtensionObject)
00316 UA_TYPE_HANDLING_FUNCTIONS(UA_DataValue)
00317 UA_TYPE_HANDLING_FUNCTIONS(UA_Variant)
00318 UA_TYPE_HANDLING_FUNCTIONS(UA_DiagnosticInfo)
00319 
00320 /**********************************************/
00321 /* Custom functions for the builtin datatypes */
00322 /**********************************************/
00323 
00324 /* String */
00327 UA_String UA_EXPORT UA_String_fromChars(char const src[]);
00328 
00329 #define UA_STRING_ALLOC(CHARS) UA_String_fromChars(CHARS)
00330 #define UA_STRING(CHARS) (UA_String) {strlen(CHARS), (UA_Byte*)CHARS }
00331 #define UA_STRING_NULL (UA_String) {-1, (UA_Byte*)0 }
00332 
00334 UA_StatusCode UA_EXPORT UA_String_copyprintf(char const fmt[], UA_String *dst, ...);
00335 
00337 UA_Boolean UA_EXPORT UA_String_equal(const UA_String *string1, const UA_String *string2);
00338 
00340 UA_Boolean UA_EXPORT UA_String_equalchars(const UA_String *string1, char *charString);
00341 
00342 /* DateTime */
00344 UA_DateTime UA_EXPORT UA_DateTime_now(void);
00345 
00346 typedef struct UA_DateTimeStruct {
00347     UA_Int16 nanoSec;
00348     UA_Int16 microSec;
00349     UA_Int16 milliSec;
00350     UA_Int16 sec;
00351     UA_Int16 min;
00352     UA_Int16 hour;
00353     UA_Int16 day;
00354     UA_Int16 month;
00355     UA_Int16 year;
00356 } UA_DateTimeStruct;
00357 
00358 UA_DateTimeStruct UA_EXPORT UA_DateTime_toStruct(UA_DateTime time);
00359 UA_StatusCode UA_EXPORT UA_DateTime_toString(UA_DateTime time, UA_String *timeString);
00360 
00361 /* Guid */
00363 UA_Boolean UA_EXPORT UA_Guid_equal(const UA_Guid *g1, const UA_Guid *g2);
00364     
00366 UA_Guid UA_EXPORT UA_Guid_random(UA_UInt32 *seed);
00367 
00368 /* ByteString */
00369 #define UA_BYTESTRING_NULL (UA_ByteString) {-1, (UA_Byte*)0 }
00370 #define UA_ByteString_equal(string1, string2) \
00371     UA_String_equal((const UA_String*) string1, (const UA_String*)string2)
00372 
00374 UA_StatusCode UA_EXPORT UA_ByteString_newMembers(UA_ByteString *p, UA_Int32 length);
00375 
00376 /* NodeId */
00378 UA_Boolean UA_EXPORT UA_NodeId_equal(const UA_NodeId *n1, const UA_NodeId *n2);
00379 
00381 UA_Boolean UA_EXPORT UA_NodeId_isNull(const UA_NodeId *p);
00382 
00383 UA_NodeId UA_EXPORT UA_NodeId_fromInteger(UA_UInt16 nsIndex, UA_Int32 identifier);
00384 UA_NodeId UA_EXPORT UA_NodeId_fromCharString(UA_UInt16 nsIndex, char identifier[]);
00385 UA_NodeId UA_EXPORT UA_NodeId_fromCharStringCopy(UA_UInt16 nsIndex, char const identifier[]);
00386 UA_NodeId UA_EXPORT UA_NodeId_fromString(UA_UInt16 nsIndex, UA_String identifier);
00387 UA_NodeId UA_EXPORT UA_NodeId_fromStringCopy(UA_UInt16 nsIndex, UA_String identifier);
00388 UA_NodeId UA_EXPORT UA_NodeId_fromGuid(UA_UInt16 nsIndex, UA_Guid identifier);
00389 UA_NodeId UA_EXPORT UA_NodeId_fromCharByteString(UA_UInt16 nsIndex, char identifier[]);
00390 UA_NodeId UA_EXPORT UA_NodeId_fromCharByteStringCopy(UA_UInt16 nsIndex, char const identifier[]);
00391 UA_NodeId UA_EXPORT UA_NodeId_fromByteString(UA_UInt16 nsIndex, UA_ByteString identifier);
00392 UA_NodeId UA_EXPORT UA_NodeId_fromByteStringCopy(UA_UInt16 nsIndex, UA_ByteString identifier);
00393 
00394 #define UA_NODEID_NUMERIC(NS_INDEX, NUMERICID) UA_NodeId_fromInteger(NS_INDEX, NUMERICID)
00395 #define UA_NODEID_STRING(NS_INDEX, CHARS) UA_NodeId_fromCharString(NS_INDEX, CHARS)
00396 #define UA_NODEID_STRING_ALLOC(NS_INDEX, CHARS) UA_NodeId_fromCharStringCopy(NS_INDEX, CHARS)
00397 #define UA_NODEID_GUID(NS_INDEX, GUID) UA_NodeId_fromGuid(NS_INDEX, GUID)
00398 #define UA_NODEID_BYTESTRING(NS_INDEX, CHARS) UA_NodeId_fromCharByteString(NS_INDEX, CHARS)
00399 #define UA_NODEID_BYTESTRING_ALLOC(NS_INDEX, CHARS) UA_NodeId_fromCharStringCopy(NS_INDEX, CHARS)
00400 #define UA_NODEID_NULL UA_NODEID_NUMERIC(0,0)
00401 
00402 /* ExpandedNodeId */
00403 UA_Boolean UA_EXPORT UA_ExpandedNodeId_isNull(const UA_ExpandedNodeId *p);
00404 
00405 #define UA_EXPANDEDNODEID_NUMERIC(NS_INDEX, NUMERICID) (UA_ExpandedNodeId) {            \
00406         .nodeId = {.namespaceIndex = NS_INDEX, .identifierType = UA_NODEIDTYPE_NUMERIC, \
00407                    .identifier.numeric = NUMERICID },                                   \
00408         .serverIndex = 0, .namespaceUri = {.data = (UA_Byte*)0, .length = -1} }
00409     
00410 /* QualifiedName */
00411 #define UA_QUALIFIEDNAME(NS_INDEX, CHARS) (const UA_QualifiedName) {    \
00412         .namespaceIndex = NS_INDEX, .name = UA_STRING(CHARS) }
00413 #define UA_QUALIFIEDNAME_ALLOC(NS_INDEX, CHARS) (UA_QualifiedName) {    \
00414         .namespaceIndex = NS_INDEX, .name = UA_STRING_ALLOC(CHARS) }
00415 
00416 /* LocalizedText */
00417 #define UA_LOCALIZEDTEXT(LOCALE, TEXT) (const UA_LocalizedText) {       \
00418         .locale = UA_STRING(LOCALE), .text = UA_STRING(TEXT) }
00419 #define UA_LOCALIZEDTEXT_ALLOC(LOCALE, TEXT) (UA_LocalizedText) {       \
00420         .locale = UA_STRING_ALLOC(LOCALE), .text = UA_STRING_ALLOC(TEXT) }
00421 
00422 /* Variant */
00423 
00431 UA_Boolean UA_EXPORT UA_Variant_isScalar(const UA_Variant *v);
00432     
00442 UA_StatusCode UA_EXPORT UA_Variant_setScalar(UA_Variant *v, void *p, const UA_DataType *type);
00443 
00452 UA_StatusCode UA_EXPORT UA_Variant_setScalarCopy(UA_Variant *v, const void *p, const UA_DataType *type);
00453 
00464 UA_StatusCode UA_EXPORT UA_Variant_setArray(UA_Variant *v, void *array, UA_Int32 noElements,
00465                                             const UA_DataType *type);
00466 
00476 UA_StatusCode UA_EXPORT UA_Variant_setArrayCopy(UA_Variant *v, const void *array, UA_Int32 noElements,
00477                                                 const UA_DataType *type);
00478 
00483 UA_StatusCode UA_EXPORT UA_Variant_copyRange(const UA_Variant *src, UA_Variant *dst, UA_NumericRange range);
00484 
00496 UA_StatusCode UA_EXPORT UA_Variant_setRange(UA_Variant *v, void *dataArray, UA_Int32 dataArraySize,
00497                                             const UA_NumericRange range);
00498 
00508 UA_StatusCode UA_EXPORT UA_Variant_setRangeCopy(UA_Variant *v, const void *dataArray, UA_Int32 dataArraySize,
00509                                                 const UA_NumericRange range);
00510 
00511 /****************************/
00512 /* Structured Type Handling */
00513 /****************************/
00514 
00515 #define UA_MAX_TYPE_MEMBERS 13 // Maximum number of members per complex type
00516 
00517 #ifndef _WIN32
00518 # define UA_BITFIELD(SIZE) : SIZE
00519 #else
00520 # define UA_BITFIELD(SIZE)
00521 #endif
00522 
00523 #define UA_IS_BUILTIN(ID) (ID <= UA_TYPES_DIAGNOSTICINFO)
00524 
00525 typedef struct {
00526     UA_UInt16 memberTypeIndex UA_BITFIELD(9); 
00527     UA_Boolean namespaceZero UA_BITFIELD(1); 
00531     UA_Byte padding UA_BITFIELD(5); 
00535     UA_Boolean isArray UA_BITFIELD(1); 
00536 } UA_DataTypeMember;
00537     
00538 struct UA_DataType {
00539     UA_NodeId typeId; 
00540     ptrdiff_t memSize UA_BITFIELD(16); 
00541     UA_UInt16 typeIndex UA_BITFIELD(13); 
00542     UA_Boolean namespaceZero UA_BITFIELD(1); 
00543     UA_Boolean fixedSize UA_BITFIELD(1); 
00544     UA_Boolean zeroCopyable UA_BITFIELD(1); 
00545     UA_Byte membersSize; 
00546     UA_DataTypeMember members[UA_MAX_TYPE_MEMBERS];
00547 };
00548 
00555 void UA_EXPORT * UA_new(const UA_DataType *dataType);
00556 
00563 void UA_EXPORT UA_init(void *p, const UA_DataType *dataType);
00564 
00574 UA_StatusCode UA_EXPORT UA_copy(const void *src, void *dst, const UA_DataType *dataType);
00575 
00584 void UA_EXPORT UA_deleteMembers(void *p, const UA_DataType *dataType);
00585 
00592 void UA_EXPORT UA_delete(void *p, const UA_DataType *dataType);
00593 
00594 /********************/
00595 /* Array operations */
00596 /********************/
00597 
00598 #define MAX_ARRAY_SIZE 104857600 // arrays must be smaller than 100MB
00599 
00606 void UA_EXPORT * UA_Array_new(const UA_DataType *dataType, UA_Int32 noElements);
00607 
00617 UA_StatusCode UA_EXPORT UA_Array_copy(const void *src, void **dst, const UA_DataType *dataType, UA_Int32 noElements);
00618 
00626 void UA_EXPORT UA_Array_delete(void *p, const UA_DataType *dataType, UA_Int32 noElements);
00627 
00630 /* These are not generated from XML. Server *and* client need them. */
00631 typedef enum {
00632     UA_ATTRIBUTEID_NODEID                  = 1,
00633     UA_ATTRIBUTEID_NODECLASS               = 2,
00634     UA_ATTRIBUTEID_BROWSENAME              = 3,
00635     UA_ATTRIBUTEID_DISPLAYNAME             = 4,
00636     UA_ATTRIBUTEID_DESCRIPTION             = 5,
00637     UA_ATTRIBUTEID_WRITEMASK               = 6,
00638     UA_ATTRIBUTEID_USERWRITEMASK           = 7,
00639     UA_ATTRIBUTEID_ISABSTRACT              = 8,
00640     UA_ATTRIBUTEID_SYMMETRIC               = 9,
00641     UA_ATTRIBUTEID_INVERSENAME             = 10,
00642     UA_ATTRIBUTEID_CONTAINSNOLOOPS         = 11,
00643     UA_ATTRIBUTEID_EVENTNOTIFIER           = 12,
00644     UA_ATTRIBUTEID_VALUE                   = 13,
00645     UA_ATTRIBUTEID_DATATYPE                = 14,
00646     UA_ATTRIBUTEID_VALUERANK               = 15,
00647     UA_ATTRIBUTEID_ARRAYDIMENSIONS         = 16,
00648     UA_ATTRIBUTEID_ACCESSLEVEL             = 17,
00649     UA_ATTRIBUTEID_USERACCESSLEVEL         = 18,
00650     UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL = 19,
00651     UA_ATTRIBUTEID_HISTORIZING             = 20,
00652     UA_ATTRIBUTEID_EXECUTABLE              = 21,
00653     UA_ATTRIBUTEID_USEREXECUTABLE          = 22
00654 } UA_AttributeId;
00655 
00656 #ifdef __cplusplus
00657 } // extern "C"
00658 #endif
00659 
00660 #endif /* UA_TYPES_H_ */