7 #include "Arp/System/Commons/Exceptions/Exceptions.h"
8 #include "Arp/System/Commons/Encoding/Utf16.hpp"
9 #include "Arp/System/Rsc/Services/Rsc.h"
10 #include "Arp/System/Rsc/Services/RscGuid.hpp"
11 #include "Arp/System/Rsc/Services/RscVersion.hpp"
12 #include "Arp/System/Rsc/Services/RscString.hxx"
13 #include "Arp/System/Rsc/Services/SecureString.hxx"
19 namespace Arp {
namespace System {
namespace Rsc {
namespace Services
27 template<
int N>
class RscStructReader;
28 template<
int N>
class RscStructWriter;
29 template<
class T,
bool IsClass,
bool IsSerializable>
class RscValueAdapter;
37 template<
int MaxStringSize = 0>
45 template<
class T,
bool IsClass,
bool IsSerializable>
friend class RscValueAdapter;
48 using ReadElementFunction = std::function<
RscType(
RscType expectedType,
byte* pValue)>;
49 using WriteElementFunction = std::function<void(
RscType valueType,
const byte* pValue)>;
106 RscVariant(
size_t arraySize,
RscType arrayElementType,
size_t dimensions = 1,
size_t fieldCount = 0);
117 RscVariant(
size_t arraySize,
RscType arrayElementType, ReadElementFunction* pFunction,
size_t dimensions = 1,
size_t fieldCount = 0);
128 RscVariant(
size_t arraySize,
RscType arrayElementType, WriteElementFunction* pFunction,
size_t dimensions = 1,
size_t fieldCount = 0);
133 RscVariant(
size_t fieldCount, ReadElementFunction* pFunction);
178 bool operator==(const
RscVariant& value)const;
179 bool operator!=(const
RscVariant& value)const;
282 void InitComplexTypeInfo(
void);
283 bool ContainsTypeInformation(
void) const;
284 size_t GetSize(
void)const;
287 struct ComplexTypeInfo
294 RemotingReader* pReader =
nullptr;
295 mutable RemotingWriter* pWriter =
nullptr;
296 ReadElementFunction* pReadElementFunction =
nullptr;
297 mutable WriteElementFunction* pWriteElementFunction =
nullptr;
301 static const size_t maxPrimitiveSize = 8;
302 #ifdef ARP_SYSTEM_RSC_SUPPORT_VERSION_GUID_AS_OBJECT
303 static const size_t minBufferSize = std::max(maxPrimitiveSize, std::max(
sizeof(
RscGuid),
sizeof(
RscVersion)));
305 static const size_t minBufferSize = maxPrimitiveSize;
308 static const size_t bufferSize = minBufferSize < (size_t)MaxStringSize ? (
size_t)MaxStringSize : minBufferSize;
313 ComplexTypeInfo typeInfo;
314 byte buffer[bufferSize];
331 template<
int MaxStringSize>
337 template<
int MaxStringSize>
341 this->operator=(value);
344 template<
int MaxStringSize>
348 this->operator=(value);
351 template<
int MaxStringSize>
354 this->operator=(value);
357 template<
int MaxStringSize>
360 this->Assign(input, length, type);
363 template<
int MaxStringSize>
367 this->operator=(value);
370 template<
int MaxStringSize>
374 this->operator=(value);
377 template<
int MaxStringSize>
385 this->GetArrayInformation() =
RscArrayInformation(arraySize, arrayElementType, dimensions, fieldCount);
386 this->typeInfo.pReader =
nullptr;
387 this->typeInfo.pWriter =
nullptr;
388 this->typeInfo.pReadElementFunction =
nullptr;
389 this->typeInfo.pWriteElementFunction =
nullptr;
392 template<
int MaxStringSize>
400 this->GetArrayInformation() =
RscArrayInformation(arraySize, arrayElementType, dimensions, fieldCount);
401 this->typeInfo.pReader =
nullptr;
402 this->typeInfo.pWriter =
nullptr;
403 this->typeInfo.pReadElementFunction = pFunction;
404 this->typeInfo.pWriteElementFunction =
nullptr;
407 template<
int MaxStringSize>
415 this->GetArrayInformation() =
RscArrayInformation(arraySize, arrayElementType, dimensions, fieldCount);
416 this->typeInfo.pReader =
nullptr;
417 this->typeInfo.pWriter =
nullptr;
418 this->typeInfo.pReadElementFunction =
nullptr;
419 this->typeInfo.pWriteElementFunction = pFunction;
422 template<
int MaxStringSize>
426 this->InitComplexTypeInfo();
428 this->typeInfo.pReadElementFunction = pFunction;
431 template<
int MaxStringSize>
437 template<
int MaxStringSize>
447 case RscType::IecTimeOfDay64:
455 template<
int MaxStringSize>
458 return this->GetArrayInformation().ElementType;
461 template<
int MaxStringSize>
468 return this->typeInfo.arrayInformation;
471 template<
int MaxStringSize>
478 return this->typeInfo.arrayInformation;
481 template<
int MaxStringSize>
482 inline const RscStructInformation& RscVariant<MaxStringSize>::GetStructInformation(
void)
const
486 throw InvalidOperationException(
"RscVariant doesn't contain struct information");
488 return this->typeInfo.structInformation;
491 template<
int MaxStringSize>
492 inline RscStructInformation& RscVariant<MaxStringSize>::GetStructInformation(
void)
496 throw InvalidOperationException(
"RscVariant doesn't contain struct information");
498 return this->typeInfo.structInformation;
501 template<
int MaxStringSize>
504 return this->GetArrayInformation().Dimensions;
507 template<
int MaxStringSize>
510 return this->GetStructInformation().FieldCount;
513 template<
int MaxStringSize>
519 template<
int MaxStringSize>
525 template<
int MaxStringSize>
528 this->type = rscType;
531 template<
int MaxStringSize>
537 template<
int MaxStringSize>
541 this->type = GetRscType<T>();
546 #ifndef ARP_SYSTEM_RSC_SUPPORT_VERSION_GUID_AS_OBJECT
552 *
reinterpret_cast<T*
>(this->buffer) = value;
556 template<
int MaxStringSize>
560 result.InitComplexTypeInfo();
561 result.GetStructInformation().
FieldCount = fieldCount;
565 template<
int MaxStringSize>
572 template<
int MaxStringSize>
576 result.typeInfo.pWriter = &writer;
580 template<
int MaxStringSize>
584 result.typeInfo.pWriter = &writer;
588 template<
int MaxStringSize>
591 size_t len = value.
Length();
592 this->Assign(value.
CStr(), len);
596 template<
int MaxStringSize>
599 size_t len = strlen(value);
600 this->Assign(value, len);
604 template<
int MaxStringSize>
606 inline RscVariant<MaxStringSize>& RscVariant<MaxStringSize>::operator=(
const RscString<N>& value)
612 template<
int MaxStringSize>
614 inline RscVariant<MaxStringSize>& RscVariant<MaxStringSize>::operator=(
const SecureString<N>& value)
620 template<
int MaxStringSize>
623 if (length >= MaxStringSize)
625 throw ArgumentException(
"Cannot copy string: argument string length {} exceeds MaxStringSize {}", length, MaxStringSize);
629 throw NotSupportedException(
"RscType '{}' not supported for Strings", rscType);
631 SecureStrncpy(
reinterpret_cast<char*
>(this->buffer), MaxStringSize, input, length);
632 this->buffer[length] =
'\0';
633 this->type = rscType;
636 template<
int MaxStringSize>
646 this->type = rscType;
647 size_t resultLength = 0;
648 EncodingResult result = Utf16::ConvertToUtf8(input, length,
reinterpret_cast<char8*
>(this->buffer), MaxStringSize, resultLength);
649 if ((result != EncodingResult::Success) && (result != EncodingResult::NoConversion))
651 throw ArgumentException(
"Cannot convert UTF16 string, encoding result = {}", result);
653 this->buffer[resultLength] =
'\0';
656 template<
int MaxStringSize>
659 if (this->GetType() != value.
GetType())
664 if (this->GetSize() != value.GetSize())
669 if (memcmp(this->buffer, value.buffer, this->GetSize()) != 0)
676 if (strcmp((
char*)this->buffer, (
char*)value.buffer) != 0)
685 template<
int MaxStringSize>
688 return !(*
this == value);
691 template<
int MaxStringSize>
692 inline void RscVariant<MaxStringSize>::InitComplexTypeInfo(
void)
695 this->typeInfo.pReader =
nullptr;
696 this->typeInfo.pWriter =
nullptr;
697 this->typeInfo.pReadElementFunction =
nullptr;
698 this->typeInfo.pWriteElementFunction =
nullptr;
701 template<
int MaxStringSize>
705 RscType argType = GetRscType<T>();
706 if(this->GetValueType() != argType)
708 throw InvalidCastException(
"Cannot copy value to argument: RscVariant contains data type {0} but arg is of type {1}", this->type, argType);
710 value = *
reinterpret_cast<const T*
>(this->buffer);
713 template<
int MaxStringSize>
720 return reinterpret_cast<const char*
>(this->buffer);
723 template<
int MaxStringSize>
730 this->typeInfo.pWriteElementFunction = pFunction;
733 template<
int MaxStringSize>
738 this->CopyTo(result);
742 template<
int MaxStringSize>
745 const byte* pValue = this->GetDataAddress();
752 return reinterpret_cast<const char*
>(pValue);
754 return reinterpret_cast<const DateTime*
>(pValue)->ToIso8601String();
757 std::ostringstream oss;
758 oss << std::boolalpha << *reinterpret_cast<const bool*>(pValue);
766 return std::to_string(*
reinterpret_cast<const char16*
>(pValue));
768 return std::to_string(*
reinterpret_cast<const int16*
>(pValue));
771 return std::to_string(*
reinterpret_cast<const int32*
>(pValue));
773 return std::to_string(*
reinterpret_cast<const int8*
>(pValue));
778 case RscType::IecTimeOfDay64:
779 return std::to_string(*
reinterpret_cast<const int64*
>(pValue));
784 return std::to_string(*
reinterpret_cast<const float*
>(pValue));
786 return std::to_string(*
reinterpret_cast<const double*
>(pValue));
788 return std::to_string(*
reinterpret_cast<const uint16*
>(pValue));
790 return std::to_string(*
reinterpret_cast<const uint32*
>(pValue));
792 return std::to_string(*
reinterpret_cast<const uint64*
>(pValue));
794 return std::to_string(*
reinterpret_cast<const uint8*
>(pValue));
796 return reinterpret_cast<const RscVersion*
>(pValue)->ToString();
798 return reinterpret_cast<const RscGuid*
>(pValue)->ToString();
807 template<
int MaxStringSize>
810 switch (this->GetValueType())
838 case RscType::IecTimeOfDay64:
842 return strlen((
char*)this->buffer);
The class contains date and time informations.
Definition: DateTime.hpp:45
This exception is used when an invalid argument occurs.
Definition: ArgumentException.hpp:15
static ArgumentException Create(const char *paramName, const T ¶mValue)
Creates an ArgumentException instance using a default message text.
Definition: ArgumentException.hpp:112
This is a small immutable wrapper around the boost::uuids::uuid class and represents a universal uniq...
Definition: Uuid.hpp:19
This static class provides encoding string operations from UTF8 to UTF16 or vice versa.
Definition: Utf16.hpp:15
This exception is used when an invalid cast occurs.
Definition: InvalidCastException.hpp:15
This exception is used when a method call is invalid for object's current state.
Definition: InvalidOperationException.hpp:15
This exception is used when a method is not implemented yet.
Definition: NotImplementedException.hpp:15
This exception is used when a method is not supported.
Definition: NotSupportedException.hpp:15
Helper class to read an array of primtive types from an RscVariant. This class uses the array informa...
Definition: RscArrayReader.hpp:23
Helper class to read an array of primtive types from an RscVariant. This class uses the array informa...
Definition: RscArrayWriter.hpp:22
Definition: RscGuid.hpp:18
Contains a static string with string lentgh up to N characters. The string has to be null terminated.
Definition: RscString.hxx:21
Helper class to read a struct from an RscVariant. This class uses the struct information stored in Rs...
Definition: RscStructReader.hxx:25
Helper class to write a struct from an RscVariant. This class uses the struct information stored in R...
Definition: RscStructWriter.hxx:19
Rsc container class for primitive data type, strings or information about arrays or structs....
Definition: RscVariant.hxx:39
RscVariant(const T &value)
Creates a new instance of RscVariant with value. Gets RscType by type deduction of T.
Definition: RscVariant.hxx:339
void SetType(RscType rscType)
Forces the internal RscType to be set to another RscType. This Method does no conversion or validatio...
Definition: RscVariant.hxx:526
String ToString(void) const
Converts this instance to string if the variant type has a reasonable string representation.
Definition: RscVariant.hxx:743
RscVariant(const RscString< N > &value)
Creates a new instance of RscVariant with value. RscType is Utf8String.
Definition: RscVariant.hxx:365
size_t GetArrayDimensions(void) const
Gets the count of array dimensions (1 for simple array, 2 for array of array etc.)....
Definition: RscVariant.hxx:502
RscVariant(const SecureString< N > &value)
Creates a new instance of RscVariant with value. RscType is Utf8String.
Definition: RscVariant.hxx:372
void Assign(const char16 *input, size_t length, RscType rscType=RscType::Utf8String)
Assigns an UTF16 string to this instance.
Definition: RscVariant.hxx:637
RscVariant(RscType type=RscType::None)
Creates an empty instance of RscVariant
Definition: RscVariant.hxx:332
RscVariant(const RscVariant< MaxStringSize > &)=default
Copy constructor
RscVariant(const char *value)
Creates a new instance of RscVariant with value. RscType is Utf8String.
Definition: RscVariant.hxx:352
T GetValue(void) const
Converts this value to the given type T.
Definition: RscVariant.hxx:735
size_t GetFieldCount(void) const
Returns field count, if RscVariant contains struct information
Definition: RscVariant.hxx:508
RscType GetValueType(void) const
Gets the value type as RscType of the contained element
Definition: RscVariant.hxx:438
const char * GetChars(void) const
Gets pointer to internal string buffer. Operation only valid for Utf8Strings.
Definition: RscVariant.hxx:714
static RscVariant< MaxStringSize > CreateStructVariant(size_t fieldCount)
Creates a new RscVariant initialized with RscStructInformation
Definition: RscVariant.hxx:557
RscVariant(const char16 *input, size_t length, RscType type=RscType::Utf8String)
Assigns an UTF16 string to this instance.
Definition: RscVariant.hxx:358
RscVariant(size_t fieldCount, ReadElementFunction *pFunction)
For internal use only
Definition: RscVariant.hxx:423
static RscVariant< MaxStringSize > CreateArrayVariant(size_t arraySize, RscType elementType, size_t dimensions=1, size_t fieldCount=0)
Creates a new RscVariant initialized with RscArrayInformation
Definition: RscVariant.hxx:566
void SetWriteElementFunction(WriteElementFunction *pFunction) const
Sets callback for write function to write a single array element. This could only be used for Variant...
Definition: RscVariant.hxx:724
RscVariant(const String &value)
Creates a new instance of RscVariant with value. RscType is Utf8String.
Definition: RscVariant.hxx:345
const byte * GetDataAddress(void) const
Gets a raw pointer to internal data buffer. To read data prefer CopyTo and to write prefer assignment...
Definition: RscVariant.hxx:514
RscType GetType(void) const
Gets the RscType of the contained element
Definition: RscVariant.hxx:432
RscVariant(size_t arraySize, RscType arrayElementType, WriteElementFunction *pFunction, size_t dimensions=1, size_t fieldCount=0)
Creates a new instance of RscVariant containing an array with arraySize elements of RscType arrayElem...
Definition: RscVariant.hxx:408
RscVariant(RscVariant &&) noexcept=default
Move constructor
RscVariant(size_t arraySize, RscType arrayElementType, ReadElementFunction *pFunction, size_t dimensions=1, size_t fieldCount=0)
Creates a new instance of RscVariant containing an array with arraySize elements of RscType arrayElem...
Definition: RscVariant.hxx:393
RscType GetArrayElementType(void) const
Gets the RscType of the array elements if RscVariant contains array information.
Definition: RscVariant.hxx:456
RscVariant(size_t arraySize, RscType arrayElementType, size_t dimensions=1, size_t fieldCount=0)
Creates a new instance of RscVariant containing an array with arraySize elements of RscType arrayElem...
Definition: RscVariant.hxx:378
void CopyTo(T &value) const
Copies internal data to memory referenced by value. Only for primtive types. Read Strings with GetCha...
Definition: RscVariant.hxx:703
Specifies a version with 4 version numbers and is marshalled to .NET type System.Version.
Definition: RscVersion.hpp:21
Specialized version of RscString for security context. Not implemented in this version....
Definition: SecureString.hxx:19
const CharType * CStr() const
Gets the character data of this string.
Definition: BasicString.hxx:1508
size_type Length() const
Returns the number of char elements in this string.
Definition: BasicString.hxx:1039
bool operator!=(const BasicString< CharType, Alloc > &left, const BasicString< CharType, Alloc > &right)
Compares the left string to the right string on inequality.
Definition: BasicString.hxx:1912
static const SelfType Empty
An emtpy static string instance.
Definition: BasicString.hxx:214
bool operator==(const BasicString< CharType, Alloc > &left, const BasicString< CharType, Alloc > &right)
Compares the left string to the right string on equality.
Definition: BasicString.hxx:1876
std::uint8_t uint8
The Arp unsigned integer type of 1 byte size.
Definition: PrimitiveTypes.hpp:27
std::uint32_t uint32
The Arp unsigned integer type of 4 byte size.
Definition: PrimitiveTypes.hpp:35
std::int8_t int8
The Arp integer type of 1 byte size.
Definition: PrimitiveTypes.hpp:29
char16_t char16
The Arp character type of 2 byte size.
Definition: PrimitiveTypes.hpp:49
std::uint64_t uint64
The Arp unsigned integer type of 8 byte size.
Definition: PrimitiveTypes.hpp:39
char char8
The Arp character type of 1 byte size.
Definition: PrimitiveTypes.hpp:47
std::int64_t int64
The Arp integer type of 8 byte size.
Definition: PrimitiveTypes.hpp:41
std::int16_t int16
The Arp integer type of 2 byte size.
Definition: PrimitiveTypes.hpp:33
std::int32_t int32
The Arp integer type of 4 byte size.
Definition: PrimitiveTypes.hpp:37
std::uint16_t uint16
The Arp unsigned integer type of 2 byte size.
Definition: PrimitiveTypes.hpp:31
@ System
System components used by the System, Device, Plc or Io domains.
EncodingResult
This enum defines encoding results for operations of class Utf16.
Definition: EncodingResult.hpp:16
RscType
Datatypes supported by Rsc. Values are identical with CommonRemoting::RemotingMarshalType....
Definition: RscType.hpp:37
@ Uint32
unsigned 32 bit integer
@ Uint16
unsigned 16 bit integer
@ Real32
32 bit floating point number
@ Int16
signed 16 bit integer
@ Uint8
unsigned 8 bit integer
@ Object
Object type handled by Rsc as RscVariant
@ Int8
signed 8 bit integer
@ Void
void or null object
@ Struct
Complex datatype with implements IRscSerializable
@ DateTime
Datetime, handled by Rsc with DateTime
@ Real64
64 bit floating point number
@ AnsiString
Ansi string, not implemented in Rsc context
@ Int32
signed 32 bit integer
@ IecTime
summary>IEC type: LTIME [int64]
@ Guid
Universal unique ID Uuid
@ Uint64
unsigned 64 bit integer
@ SecureString
String for security context, handled by Rsc with SecureString
@ Int64
signed 64 bit integer
Root namespace for the PLCnext API
size_t SecureStrnlen(const char *str, size_t maxSize)
Warpper for strnlen_s
void SecureStrncpy(char *dest, size_t destMaxSize, const char *src, size_t count)
Wrapper for strncpy_s