7#include "Arp/System/Rsc/Services/Rsc.h"
8#include "Arp/System/Commons/Exceptions/Exceptions.h"
9#include "Arp/System/Rsc/Services/IRscSerializable.hpp"
10#include "Arp/System/Rsc/Services/RemotingReader.hpp"
11#include "Arp/System/Rsc/Services/RemotingWriter.hpp"
12#include "Arp/System/Rsc/Services/RscString.hxx"
13#include "Arp/System/Rsc/Services/RscVariant.hxx"
14#include "Arp/System/Core/DateTime.hpp"
17namespace Arp {
namespace System {
namespace Rsc {
namespace Services
24template<class T, bool IsClass = std::is_class<T>::value,
bool IsSerializable = std::is_base_of<IRscSerializable, T>::value>
29 RscValueAdapter(T& value);
31 RscValueAdapter(
const T& value);
33 RscValueAdapter(
const RscValueAdapter& arg) =
delete;
35 RscValueAdapter& operator=(
const RscValueAdapter& arg) =
delete;
37 ~RscValueAdapter(
void) =
default;
40 void Read(RemotingReader& reader,
bool readTag =
true);
41 void Write(RemotingWriter& writer,
bool writeTag =
true);
50template<
class T,
bool IsClass,
bool IsSerializable>
51inline RscValueAdapter<T, IsClass, IsSerializable>::RscValueAdapter(T& value)
53 , pWriteValue(nullptr)
57template<
class T,
bool IsClass,
bool IsSerializable>
58inline RscValueAdapter<T, IsClass, IsSerializable>::RscValueAdapter(
const T& value)
64template<
class T,
bool IsClass,
bool IsSerializable>
65inline void RscValueAdapter<T, IsClass, IsSerializable>::Read(RemotingReader& reader,
bool readTag)
67 const size_t size =
sizeof(T);
70 reader.ReadTag(GetRscType<T>());
74 reader.ReadDataInternal(buffer, size);
75 ByteConverter::ReverseCopy(buffer, this->pReadValue, size);
77 reader.ReadDataInternal(
reinterpret_cast<byte*
>(this->pReadValue), size);
81template<
class T,
bool IsClass,
bool IsSerializable>
82inline void RscValueAdapter<T, IsClass, IsSerializable>::Write(RemotingWriter& writer,
bool writeTag)
84 const size_t size =
sizeof(T);
87 writer.WriteTag(GetRscType<T>());
92 ByteConverter::ReverseCopy(this->pWriteValue, buffer, size);
93 writer.WriteDataInternal(buffer, size);
97 writer.WriteDataInternal(
reinterpret_cast<const byte*
>(this->pWriteValue), size);
106class RscValueAdapter<const void*,
false,
false>
110 RscValueAdapter(
const void*& ptr) : pReadValue(&ptr), pWriteValue(nullptr) {}
112 RscValueAdapter(
const void*
const& ptr) : pReadValue(nullptr), pWriteValue(&ptr) {}
114 RscValueAdapter(
const RscValueAdapter& arg) =
delete;
116 RscValueAdapter& operator=(
const RscValueAdapter& arg) =
delete;
118 ~RscValueAdapter(
void) =
default;
121 void Read(RemotingReader& reader,
bool =
true)
123 RscType pointerType = reader.ReadObjectType();
124#if defined(ARP_ARCHITECTURE_X86) || defined(ARP_ARCHITECTURE_ARMTHUMB)
125 RscType nativeType = RscType::Uint32;
126 RscValueAdapter<uint32> valueAdapter(
reinterpret_cast<uint32&
>(*this->pReadValue));
127#elif defined(ARP_ARCHITECTURE_X64) || defined(ARP_ARCHITECTURE_ARM64)
128 RscType nativeType = RscType::Uint64;
129 RscValueAdapter<uint64> valueAdapter(
reinterpret_cast<uint64&
>(*this->pReadValue));
133 if(pointerType != nativeType)
135 throw InvalidCastException(
"Cannot convert UintPtr with type '{0}' to void*", pointerType);
137 valueAdapter.Read(reader,
false);
140 void Write(RemotingWriter& writer,
bool =
true)
142#if defined(ARP_ARCHITECTURE_X86) || defined(ARP_ARCHITECTURE_ARMTHUMB)
143 writer.WriteObjectType(RscType::Uint32);
144 RscValueAdapter<uint32> valueAdapter(
reinterpret_cast<const uint32&
>(*this->pWriteValue));
145#elif defined(ARP_ARCHITECTURE_X64) || defined(ARP_ARCHITECTURE_ARM64)
146 writer.WriteObjectType(RscType::Uint64);
147 RscValueAdapter<uint64> valueAdapter(
reinterpret_cast<const uint64&
>(*this->pWriteValue));
151 valueAdapter.Write(writer,
false);
155 const void** pReadValue;
156 const void*
const* pWriteValue;
164class RscValueAdapter<T, true, true>
168 RscValueAdapter(T& value) : pReadValue(&value), pWriteValue(nullptr) {}
170 RscValueAdapter(
const T& value) : pReadValue(nullptr), pWriteValue(&value) {}
172 RscValueAdapter(
const RscValueAdapter& arg) =
delete;
174 RscValueAdapter& operator=(
const RscValueAdapter& arg) =
delete;
176 ~RscValueAdapter(
void) =
default;
179 void Read(RemotingReader& reader,
bool readTag =
true)
183 reader.ReadBeginStruct(T::GetFieldCount());
185 this->pReadValue->Deserialize(reader.GetRscReader());
188 void Write(RemotingWriter& writer,
bool writeTag =
true)
192 writer.WriteBeginStruct(T::GetFieldCount());
194 this->pWriteValue->Serialize(writer.GetRscWriter());
199 const T* pWriteValue;
206class RscValueAdapter<T, true, false>
210 RscValueAdapter(T& value) : pReadValue(&value), pWriteValue(nullptr) {}
212 RscValueAdapter(
const T& value) : pReadValue(nullptr), pWriteValue(&value) {}
214 RscValueAdapter(
const RscValueAdapter& arg) =
delete;
216 RscValueAdapter& operator=(
const RscValueAdapter& arg) =
delete;
218 ~RscValueAdapter(
void) =
default;
221 void Read(RemotingReader& reader,
bool readTag =
true)
225 reader.ReadTag(GetRscType<T>());
227 this->pReadValue->Read(reader.GetRscReader());
230 void Write(RemotingWriter& writer,
bool writeTag =
true)
234 writer.WriteTag(GetRscType<T>());
236 this->pWriteValue->Write(writer.GetRscWriter());
241 const T* pWriteValue;
248class RscValueAdapter<
DateTime, true>
252 RscValueAdapter(DateTime& value) : pReadValue(&value), pWriteValue(nullptr) {}
254 RscValueAdapter(
const DateTime& value) : pReadValue(nullptr), pWriteValue(&value) {}
256 RscValueAdapter(
const RscValueAdapter& arg) =
delete;
258 RscValueAdapter& operator=(
const RscValueAdapter& arg) =
delete;
260 ~RscValueAdapter(
void) =
default;
263 void Read(RemotingReader& reader,
bool readTag =
true)
267 reader.ReadTag(RscType::DateTime);
269 *this->pReadValue = reader.ReadDateTime();
271 if (this->pReadValue->GetKind() == DateTimeKind::Unspecified)
273 throw NotSupportedException(
"DateTimeKind Unspecified not supported.");
277 void Write(RemotingWriter& writer,
bool writeTag =
true)
279 if (this->pWriteValue->GetKind() == DateTimeKind::Unspecified)
281 throw NotSupportedException(
"DateTimeKind Unspecified not supported.");
285 writer.WriteTag(RscType::DateTime);
287 writer.WriteDateTime(*pWriteValue);
299class RscValueAdapter<SecurityToken, true, false>
301 using T = SecurityToken;
305 RscValueAdapter(T& value) : pReadValue(&value), pWriteValue(nullptr) {}
307 RscValueAdapter(
const T& value) : pReadValue(nullptr), pWriteValue(&value) {}
309 RscValueAdapter(
const RscValueAdapter& arg) =
delete;
311 RscValueAdapter& operator=(
const RscValueAdapter& arg) =
delete;
313 ~RscValueAdapter(
void) =
default;
316 void Read(RemotingReader& reader,
bool readTag =
true)
320 reader.ReadTag(RscType::SecurityToken);
322 reader.ReadSecurityToken(*pReadValue,
false);
325 void Write(RemotingWriter& writer,
bool writeTag =
true)
329 writer.WriteTag(RscType::SecurityToken);
331 writer.WriteSecurityToken(*pWriteValue,
false);
336 const T* pWriteValue;
342template<
int MaxStringSize>
343class RscValueAdapter<RscString<MaxStringSize>, true, false>
345 typedef RscString<MaxStringSize> T;
349 RscValueAdapter(T& value) : pReadValue(&value), pWriteValue(nullptr) {}
351 RscValueAdapter(
const T& value) : pReadValue(nullptr), pWriteValue(&value) {}
353 RscValueAdapter(
const RscValueAdapter& arg) =
delete;
355 RscValueAdapter& operator=(
const RscValueAdapter& arg) =
delete;
357 ~RscValueAdapter(
void) =
default;
360 void Read(RemotingReader& reader,
bool readTag =
true)
362 reader.ReadStringInternal(pReadValue->CStr(), MaxStringSize, RscStringEncoding::Utf8, readTag);
365 void Write(RemotingWriter& writer,
bool writeTag =
true)
367 writer.WriteStringInternal(pWriteValue->CStr(), MaxStringSize, RscStringEncoding::Utf8, writeTag);
372 const T* pWriteValue;
378template<
int MaxStringSize>
379class RscValueAdapter<
SecureString<MaxStringSize>, true, false>
381 typedef SecureString<MaxStringSize> T;
385 RscValueAdapter(T& value) : pReadValue(&value), pWriteValue(nullptr) {}
387 RscValueAdapter(
const T& value) : pReadValue(nullptr), pWriteValue(&value) {}
389 RscValueAdapter(
const RscValueAdapter& arg) =
delete;
391 RscValueAdapter& operator=(
const RscValueAdapter& arg) =
delete;
393 ~RscValueAdapter(
void) =
default;
396 void Read(RemotingReader& reader,
bool readTag =
true)
400 reader.ReadTag(RscType::SecureString);
402 reader.ReadStringInternal(pReadValue->CStr(), MaxStringSize, RscStringEncoding::Utf8,
false);
405 void Write(RemotingWriter& writer,
bool writeTag =
true)
409 writer.WriteTag(RscType::SecureString);
411 writer.WriteStringInternal(pWriteValue->CStr(), MaxStringSize, RscStringEncoding::Utf8,
false);
416 const T* pWriteValue;
423class RscValueAdapter<char[N], false, false>
427 RscValueAdapter(
char value[N]) : pReadValue(value), pWriteValue(nullptr) {}
429 RscValueAdapter(
const char value[N]) : pReadValue(nullptr), pWriteValue(value) {}
431 RscValueAdapter(
const RscValueAdapter& arg) =
delete;
433 RscValueAdapter& operator=(
const RscValueAdapter& arg) =
delete;
435 ~RscValueAdapter(
void) =
default;
438 void Read(RemotingReader& reader,
bool readTag =
true)
440 reader.ReadStringInternal(this->pReadValue, N, RscStringEncoding::Utf8, readTag);
443 void Write(RemotingWriter& writer,
bool writeTag =
true)
445 writer.WriteStringInternal(this->pWriteValue, N, RscStringEncoding::Utf8, writeTag);
450 const char* pWriteValue;
456template<
int MaxStringSize>
457class RscValueAdapter<RscVariant<MaxStringSize>, true, false>
459 typedef RscVariant<MaxStringSize> T;
463 RscValueAdapter(T& value) : pReadValue(&value), pWriteValue(nullptr) {}
465 RscValueAdapter(
const T& value) : pReadValue(nullptr), pWriteValue(&value) {}
467 RscValueAdapter(
const RscValueAdapter& arg) =
delete;
469 RscValueAdapter& operator=(
const RscValueAdapter& arg) =
delete;
471 ~RscValueAdapter(
void) =
default;
474 void Read(RemotingReader& reader,
bool =
true)
481 *this->pReadValue = RscVariant<MaxStringSize>(RscType::Void);
484 *this->pReadValue = this->ReadInternal<boolean>(reader);
490 *this->pReadValue = this->ReadInternal<int8>(reader);
493 *this->pReadValue = this->ReadInternal<uint8>(reader);
496 *this->pReadValue = this->ReadInternal<int16>(reader);
498 case RscType::Uint16:
499 *this->pReadValue = this->ReadInternal<uint16>(reader);
502 case RscType::IecTime:
503 *this->pReadValue = this->ReadInternal<int32>(reader);
505 case RscType::Uint32:
506 *this->pReadValue = this->ReadInternal<uint32>(reader);
509 case RscType::IecTime64:
510 case RscType::IecTimeOfDay64:
511 case RscType::IecDate64:
512 case RscType::IecDateTime64:
513 *this->pReadValue = this->ReadInternal<int64>(reader);
515 case RscType::Uint64:
516 *this->pReadValue = this->ReadInternal<uint64>(reader);
518 case RscType::Real32:
519 *this->pReadValue = this->ReadInternal<float32>(reader);
521 case RscType::Real64:
522 *this->pReadValue = this->ReadInternal<float64>(reader);
524 case RscType::DateTime:
525 *this->pReadValue = this->ReadInternal<DateTime>(reader);
527 case RscType::Utf8String:
529 reader.ReadStringInternal(
reinterpret_cast<char*
>(this->pReadValue->buffer), MaxStringSize, RscStringEncoding::Utf8,
false);
530 this->pReadValue->type = rscType;
533 case RscType::SecureString:
535 reader.ReadStringInternal(
reinterpret_cast<char*
>(this->pReadValue->buffer), MaxStringSize, RscStringEncoding::Utf8,
false);
536 this->pReadValue->type = rscType;
541 this->pReadValue->InitComplexTypeInfo();
542 this->pReadValue->SetType(RscType::Array);
543 this->pReadValue->typeInfo.pReader = &reader;
544 this->pReadValue->GetArrayInformation() = reader.ReadArrayInformation();
547 case RscType::Struct:
549 this->pReadValue->InitComplexTypeInfo();
550 this->pReadValue->typeInfo.pReader = &reader;
551 this->pReadValue->SetType(RscType::Struct);
552 size_t fieldCount = reader.ReadFieldCount();
553 this->pReadValue->GetStructInformation() = RscStructInformation(fieldCount);
556#ifdef ARP_SYSTEM_RSC_SUPPORT_VERSION_GUID_AS_OBJECT
558 *this->pReadValue = this->ReadInternal<RscVersion>(reader);
561 *this->pReadValue = this->ReadInternal<RscGuid>(reader);
566 throw NotImplementedException(
"Type RscVersion and RscGuid are currently not supported by RscVariant");
570 throw NotSupportedException(
"RscType {0} not supported.", rscType);
574 void Write(RemotingWriter& writer,
bool =
true)
576 RscType type = this->pWriteValue->GetType();
580 writer.WriteObjectType(type);
583 this->WriteInternal<boolean>(writer);
586 this->WriteInternal<sbyte>(writer);
589 this->WriteInternal<uint8>(writer);
594 case RscType::Uint16:
595 this->WriteInternal<uint16>(writer);
598 this->WriteInternal<int16>(writer);
600 case RscType::Uint32:
601 this->WriteInternal<uint32>(writer);
604 case RscType::IecTime:
605 this->WriteInternal<int32>(writer);
607 case RscType::Uint64:
608 this->WriteInternal<uint64>(writer);
611 case RscType::IecTime64:
612 case RscType::IecTimeOfDay64:
613 case RscType::IecDate64:
614 case RscType::IecDateTime64:
615 this->WriteInternal<int64>(writer);
617 case RscType::Real32:
618 this->WriteInternal<float32>(writer);
620 case RscType::Real64:
621 this->WriteInternal<float64>(writer);
623 case RscType::DateTime:
624 this->WriteInternal<DateTime>(writer);
626 case RscType::Utf8String:
628 const char* pString = this->pWriteValue->GetChars();
629 writer.WriteObjectString(RscStringEncoding::Utf8, pString);
632 case RscType::SecureString:
634 writer.WriteObjectType(RscType::SecureString);
635 writer.WriteStringInternal(this->pWriteValue->GetChars(), MaxStringSize, RscStringEncoding::Utf8,
false);
640 this->pWriteValue->typeInfo.pWriter = &writer;
641 const RscArrayInformation& arrayInformation = this->pWriteValue->GetArrayInformation();
642 writer.WriteArrayInformation(arrayInformation);
645 case RscType::Struct:
647 this->pWriteValue->typeInfo.pWriter = &writer;
648 writer.WriteBeginStruct(this->pWriteValue->GetStructInformation().FieldCount);
652 this->WriteInternal<RscVersion>(writer);
655 this->WriteInternal<RscGuid>(writer);
658 throw NotSupportedException(
"DataType '{0}' not supported by RscVariant.", type);
665 inline T2 ReadInternal(RemotingReader& reader)
668 RscValueAdapter<T2> valueAdapter(value);
669 valueAdapter.Read(reader,
false);
674 inline void WriteInternal(RemotingWriter& writer)
const
676 writer.WriteObjectType(this->pWriteValue->GetType());
678 this->pWriteValue->CopyTo(value);
679 const T2& temp = value;
680 RscValueAdapter<T2> valueAdapter(temp);
681 valueAdapter.Write(writer,
false);
686 const T* pWriteValue;
std::uint64_t uint64
The Arp unsigned integer type of 8 byte size.
Definition: PrimitiveTypes.hpp:39
std::uint32_t uint32
The Arp unsigned integer type of 4 byte size.
Definition: PrimitiveTypes.hpp:35
Arp::BasicVersion Version
The Arp Version class.
Definition: TypeSystem.h:30
@ System
System components used by the System, Device, Plc or Io domains.
@ Write
Specifies write access to the file. Data can be written to the file and the file pointer can be moved...
@ Read
Specifies read access to the file. Data can be read from the file and the file pointer can be moved....
RscType
Data types supported by RSC.
Definition: RscType.hpp:36
@ SecureString
String for security context, handled by Rsc with Arp::System::Rsc::Services::SecureString
Root namespace for the PLCnext API