8#include "Arp/System/Rsc/Services/Rsc.h"
9#include "Arp/System/Commons/Exceptions/Exceptions.h"
10#include "Arp/System/Rsc/Services/IRscSerializable.hpp"
11#include "Arp/System/Rsc/Services/RemotingReader.hpp"
12#include "Arp/System/Rsc/Services/RemotingWriter.hpp"
13#include "Arp/System/Rsc/Services/RscString.hxx"
14#include "Arp/System/Rsc/Services/RscVariant.hxx"
15#include "Arp/System/Core/DateTime.hpp"
18namespace Arp {
namespace System {
namespace Rsc {
namespace Services
25template<class T, bool IsClass = std::is_class<T>::value,
bool IsSerializable = std::is_base_of<IRscSerializable, T>::value>
30 RscValueAdapter(T& value);
32 RscValueAdapter(
const T& value);
34 RscValueAdapter(
const RscValueAdapter& arg) =
delete;
36 RscValueAdapter& operator=(
const RscValueAdapter& arg) =
delete;
38 ~RscValueAdapter(
void) =
default;
41 void Read(RemotingReader& reader,
bool readTag =
true);
42 void Write(RemotingWriter& writer,
bool writeTag =
true);
51template<
class T,
bool IsClass,
bool IsSerializable>
52inline RscValueAdapter<T, IsClass, IsSerializable>::RscValueAdapter(T& value)
54 , pWriteValue(nullptr)
58template<
class T,
bool IsClass,
bool IsSerializable>
59inline RscValueAdapter<T, IsClass, IsSerializable>::RscValueAdapter(
const T& value)
65template<
class T,
bool IsClass,
bool IsSerializable>
66inline void RscValueAdapter<T, IsClass, IsSerializable>::Read(RemotingReader& reader,
bool readTag)
68 const size_t size =
sizeof(T);
71 reader.ReadTag(GetRscType<T>());
75 reader.ReadDataInternal(buffer, size);
76 ByteConverter::ReverseCopy(buffer, this->pReadValue, size);
78 reader.ReadDataInternal(
reinterpret_cast<byte*
>(this->pReadValue), size);
82template<
class T,
bool IsClass,
bool IsSerializable>
83inline void RscValueAdapter<T, IsClass, IsSerializable>::Write(RemotingWriter& writer,
bool writeTag)
85 const size_t size =
sizeof(T);
88 writer.WriteTag(GetRscType<T>());
93 ByteConverter::ReverseCopy(this->pWriteValue, buffer, size);
94 writer.WriteDataInternal(buffer, size);
98 writer.WriteDataInternal(
reinterpret_cast<const byte*
>(this->pWriteValue), size);
107class RscValueAdapter<const void*,
false,
false>
111 RscValueAdapter(
const void*& ptr) : pReadValue(&ptr), pWriteValue(nullptr) {}
113 RscValueAdapter(
const void*
const& ptr) : pReadValue(nullptr), pWriteValue(&ptr) {}
115 RscValueAdapter(
const RscValueAdapter& arg) =
delete;
117 RscValueAdapter& operator=(
const RscValueAdapter& arg) =
delete;
119 ~RscValueAdapter(
void) =
default;
122 void Read(RemotingReader& reader,
bool =
true)
124 RscType pointerType = reader.ReadObjectType();
125#if defined(ARP_ARCHITECTURE_X86) || defined(ARP_ARCHITECTURE_ARMTHUMB)
126 RscType nativeType = RscType::Uint32;
127 RscValueAdapter<uint32> valueAdapter(
reinterpret_cast<uint32&
>(*this->pReadValue));
128#elif defined(ARP_ARCHITECTURE_X64) || defined(ARP_ARCHITECTURE_ARM64)
129 RscType nativeType = RscType::Uint64;
130 RscValueAdapter<uint64> valueAdapter(
reinterpret_cast<uint64&
>(*this->pReadValue));
134 if(pointerType != nativeType)
136 throw InvalidCastException(
"Cannot convert UintPtr with type '{0}' to void*", pointerType);
138 valueAdapter.Read(reader,
false);
141 void Write(RemotingWriter& writer,
bool =
true)
143#if defined(ARP_ARCHITECTURE_X86) || defined(ARP_ARCHITECTURE_ARMTHUMB)
144 writer.WriteObjectType(RscType::Uint32);
145 RscValueAdapter<uint32> valueAdapter(
reinterpret_cast<const uint32&
>(*this->pWriteValue));
146#elif defined(ARP_ARCHITECTURE_X64) || defined(ARP_ARCHITECTURE_ARM64)
147 writer.WriteObjectType(RscType::Uint64);
148 RscValueAdapter<uint64> valueAdapter(
reinterpret_cast<const uint64&
>(*this->pWriteValue));
152 valueAdapter.Write(writer,
false);
156 const void** pReadValue;
157 const void*
const* pWriteValue;
165class RscValueAdapter<T, true, true>
169 RscValueAdapter(T& value) : pReadValue(&value), pWriteValue(nullptr) {}
171 RscValueAdapter(
const T& value) : pReadValue(nullptr), pWriteValue(&value) {}
173 RscValueAdapter(
const RscValueAdapter& arg) =
delete;
175 RscValueAdapter& operator=(
const RscValueAdapter& arg) =
delete;
177 ~RscValueAdapter(
void) =
default;
180 void Read(RemotingReader& reader,
bool readTag =
true)
184 reader.ReadBeginStruct(T::GetFieldCount());
186 this->pReadValue->Deserialize(reader.GetRscReader());
189 void Write(RemotingWriter& writer,
bool writeTag =
true)
193 writer.WriteBeginStruct(T::GetFieldCount());
195 this->pWriteValue->Serialize(writer.GetRscWriter());
200 const T* pWriteValue;
207class RscValueAdapter<T, true, false>
211 RscValueAdapter(T& value) : pReadValue(&value), pWriteValue(nullptr) {}
213 RscValueAdapter(
const T& value) : pReadValue(nullptr), pWriteValue(&value) {}
215 RscValueAdapter(
const RscValueAdapter& arg) =
delete;
217 RscValueAdapter& operator=(
const RscValueAdapter& arg) =
delete;
219 ~RscValueAdapter(
void) =
default;
222 void Read(RemotingReader& reader,
bool readTag =
true)
226 reader.ReadTag(GetRscType<T>());
228 this->pReadValue->Read(reader.GetRscReader());
231 void Write(RemotingWriter& writer,
bool writeTag =
true)
235 writer.WriteTag(GetRscType<T>());
237 this->pWriteValue->Write(writer.GetRscWriter());
242 const T* pWriteValue;
249class RscValueAdapter<
DateTime, true>
253 RscValueAdapter(DateTime& value) : pReadValue(&value), pWriteValue(nullptr) {}
255 RscValueAdapter(
const DateTime& value) : pReadValue(nullptr), pWriteValue(&value) {}
257 RscValueAdapter(
const RscValueAdapter& arg) =
delete;
259 RscValueAdapter& operator=(
const RscValueAdapter& arg) =
delete;
261 ~RscValueAdapter(
void) =
default;
264 void Read(RemotingReader& reader,
bool readTag =
true)
268 reader.ReadTag(RscType::DateTime);
270 *this->pReadValue = reader.ReadDateTime();
272 if (this->pReadValue->GetKind() == DateTimeKind::Unspecified)
274 throw NotSupportedException(
"DateTimeKind Unspecified not supported.");
278 void Write(RemotingWriter& writer,
bool writeTag =
true)
280 if (this->pWriteValue->GetKind() == DateTimeKind::Unspecified)
282 throw NotSupportedException(
"DateTimeKind Unspecified not supported.");
286 writer.WriteTag(RscType::DateTime);
288 writer.WriteDateTime(*pWriteValue);
300class RscValueAdapter<SecurityToken, true, false>
302 using T = SecurityToken;
306 RscValueAdapter(T& value) : pReadValue(&value), pWriteValue(nullptr) {}
308 RscValueAdapter(
const T& value) : pReadValue(nullptr), pWriteValue(&value) {}
310 RscValueAdapter(
const RscValueAdapter& arg) =
delete;
312 RscValueAdapter& operator=(
const RscValueAdapter& arg) =
delete;
314 ~RscValueAdapter(
void) =
default;
317 void Read(RemotingReader& reader,
bool readTag =
true)
321 reader.ReadTag(RscType::SecurityToken);
323 reader.ReadSecurityToken(*pReadValue,
false);
326 void Write(RemotingWriter& writer,
bool writeTag =
true)
330 writer.WriteTag(RscType::SecurityToken);
332 writer.WriteSecurityToken(*pWriteValue,
false);
337 const T* pWriteValue;
343template<
int MaxStringSize>
344class RscValueAdapter<RscString<MaxStringSize>, true, false>
346 typedef RscString<MaxStringSize> T;
350 RscValueAdapter(T& value) : pReadValue(&value), pWriteValue(nullptr) {}
352 RscValueAdapter(
const T& value) : pReadValue(nullptr), pWriteValue(&value) {}
354 RscValueAdapter(
const RscValueAdapter& arg) =
delete;
356 RscValueAdapter& operator=(
const RscValueAdapter& arg) =
delete;
358 ~RscValueAdapter(
void) =
default;
361 void Read(RemotingReader& reader,
bool readTag =
true)
363 reader.ReadStringInternal(pReadValue->CStr(), MaxStringSize, RscStringEncoding::Utf8, readTag);
366 void Write(RemotingWriter& writer,
bool writeTag =
true)
368 writer.WriteStringInternal(pWriteValue->CStr(), MaxStringSize, RscStringEncoding::Utf8, writeTag);
373 const T* pWriteValue;
379template<
int MaxStringSize>
380class RscValueAdapter<
SecureString<MaxStringSize>, true, false>
382 typedef SecureString<MaxStringSize> T;
386 RscValueAdapter(T& value) : pReadValue(&value), pWriteValue(nullptr) {}
388 RscValueAdapter(
const T& value) : pReadValue(nullptr), pWriteValue(&value) {}
390 RscValueAdapter(
const RscValueAdapter& arg) =
delete;
392 RscValueAdapter& operator=(
const RscValueAdapter& arg) =
delete;
394 ~RscValueAdapter(
void) =
default;
397 void Read(RemotingReader& reader,
bool readTag =
true)
401 reader.ReadTag(RscType::SecureString);
403 reader.ReadStringInternal(pReadValue->CStr(), MaxStringSize, RscStringEncoding::Utf8,
false);
406 void Write(RemotingWriter& writer,
bool writeTag =
true)
410 writer.WriteTag(RscType::SecureString);
412 writer.WriteStringInternal(pWriteValue->CStr(), MaxStringSize, RscStringEncoding::Utf8,
false);
417 const T* pWriteValue;
424class RscValueAdapter<char[N], false, false>
428 RscValueAdapter(
char value[N]) : pReadValue(value), pWriteValue(nullptr) {}
430 RscValueAdapter(
const char value[N]) : pReadValue(nullptr), pWriteValue(value) {}
432 RscValueAdapter(
const RscValueAdapter& arg) =
delete;
434 RscValueAdapter& operator=(
const RscValueAdapter& arg) =
delete;
436 ~RscValueAdapter(
void) =
default;
439 void Read(RemotingReader& reader,
bool readTag =
true)
441 reader.ReadStringInternal(this->pReadValue, N, RscStringEncoding::Utf8, readTag);
444 void Write(RemotingWriter& writer,
bool writeTag =
true)
446 writer.WriteStringInternal(this->pWriteValue, N, RscStringEncoding::Utf8, writeTag);
451 const char* pWriteValue;
457template<
int MaxStringSize>
458class RscValueAdapter<RscVariant<MaxStringSize>, true, false>
460 typedef RscVariant<MaxStringSize> T;
464 RscValueAdapter(T& value) : pReadValue(&value), pWriteValue(nullptr) {}
466 RscValueAdapter(
const T& value) : pReadValue(nullptr), pWriteValue(&value) {}
468 RscValueAdapter(
const RscValueAdapter& arg) =
delete;
470 RscValueAdapter& operator=(
const RscValueAdapter& arg) =
delete;
472 ~RscValueAdapter(
void) =
default;
475 void Read(RemotingReader& reader,
bool =
true)
482 *this->pReadValue = RscVariant<MaxStringSize>(RscType::Void);
485 *this->pReadValue = this->ReadInternal<boolean>(reader);
491 *this->pReadValue = this->ReadInternal<int8>(reader);
494 *this->pReadValue = this->ReadInternal<uint8>(reader);
497 *this->pReadValue = this->ReadInternal<int16>(reader);
499 case RscType::Uint16:
500 *this->pReadValue = this->ReadInternal<uint16>(reader);
503 case RscType::IecTime:
504 *this->pReadValue = this->ReadInternal<int32>(reader);
506 case RscType::Uint32:
507 *this->pReadValue = this->ReadInternal<uint32>(reader);
510 case RscType::IecTime64:
511 case RscType::IecTimeOfDay64:
512 case RscType::IecDate64:
513 case RscType::IecDateTime64:
514 *this->pReadValue = this->ReadInternal<int64>(reader);
516 case RscType::Uint64:
517 *this->pReadValue = this->ReadInternal<uint64>(reader);
519 case RscType::Real32:
520 *this->pReadValue = this->ReadInternal<float32>(reader);
522 case RscType::Real64:
523 *this->pReadValue = this->ReadInternal<float64>(reader);
525 case RscType::DateTime:
526 *this->pReadValue = this->ReadInternal<DateTime>(reader);
528 case RscType::Utf8String:
530 reader.ReadStringInternal(
reinterpret_cast<char*
>(this->pReadValue->buffer), MaxStringSize, RscStringEncoding::Utf8,
false);
531 this->pReadValue->type = rscType;
534 case RscType::SecureString:
536 reader.ReadStringInternal(
reinterpret_cast<char*
>(this->pReadValue->buffer), MaxStringSize, RscStringEncoding::Utf8,
false);
537 this->pReadValue->type = rscType;
542 this->pReadValue->InitComplexTypeInfo();
543 this->pReadValue->SetType(RscType::Array);
544 this->pReadValue->typeInfo.pReader = &reader;
545 this->pReadValue->GetArrayInformation() = reader.ReadArrayInformation();
548 case RscType::Struct:
550 this->pReadValue->InitComplexTypeInfo();
551 this->pReadValue->typeInfo.pReader = &reader;
552 this->pReadValue->SetType(RscType::Struct);
553 size_t fieldCount = reader.ReadFieldCount();
554 this->pReadValue->GetStructInformation() = RscStructInformation(fieldCount);
557#ifdef ARP_SYSTEM_RSC_SUPPORT_VERSION_GUID_AS_OBJECT
559 *this->pReadValue = this->ReadInternal<RscVersion>(reader);
562 *this->pReadValue = this->ReadInternal<RscGuid>(reader);
567 throw NotImplementedException(
"Type RscVersion and RscGuid are currently not supported by RscVariant");
571 throw NotSupportedException(
"RscType {0} not supported.", rscType);
575 void Write(RemotingWriter& writer,
bool =
true)
577 RscType type = this->pWriteValue->GetType();
581 writer.WriteObjectType(type);
584 this->WriteInternal<boolean>(writer);
587 this->WriteInternal<sbyte>(writer);
590 this->WriteInternal<uint8>(writer);
595 case RscType::Uint16:
596 this->WriteInternal<uint16>(writer);
599 this->WriteInternal<int16>(writer);
601 case RscType::Uint32:
602 this->WriteInternal<uint32>(writer);
605 case RscType::IecTime:
606 this->WriteInternal<int32>(writer);
608 case RscType::Uint64:
609 this->WriteInternal<uint64>(writer);
612 case RscType::IecTime64:
613 case RscType::IecTimeOfDay64:
614 case RscType::IecDate64:
615 case RscType::IecDateTime64:
616 this->WriteInternal<int64>(writer);
618 case RscType::Real32:
619 this->WriteInternal<float32>(writer);
621 case RscType::Real64:
622 this->WriteInternal<float64>(writer);
624 case RscType::DateTime:
625 this->WriteInternal<DateTime>(writer);
627 case RscType::Utf8String:
629 const char* pString = this->pWriteValue->GetChars();
630 writer.WriteObjectString(RscStringEncoding::Utf8, pString);
633 case RscType::SecureString:
635 writer.WriteObjectType(RscType::SecureString);
636 writer.WriteStringInternal(this->pWriteValue->GetChars(), MaxStringSize, RscStringEncoding::Utf8,
false);
641 this->pWriteValue->typeInfo.pWriter = &writer;
642 const RscArrayInformation& arrayInformation = this->pWriteValue->GetArrayInformation();
643 writer.WriteArrayInformation(arrayInformation);
646 case RscType::Struct:
648 this->pWriteValue->typeInfo.pWriter = &writer;
649 writer.WriteBeginStruct(this->pWriteValue->GetStructInformation().FieldCount);
653 this->WriteInternal<RscVersion>(writer);
656 this->WriteInternal<RscGuid>(writer);
659 throw NotSupportedException(
"DataType '{0}' not supported by RscVariant.", type);
666 inline T2 ReadInternal(RemotingReader& reader)
669 RscValueAdapter<T2> valueAdapter(value);
670 valueAdapter.Read(reader,
false);
675 inline void WriteInternal(RemotingWriter& writer)
const
677 writer.WriteObjectType(this->pWriteValue->GetType());
679 this->pWriteValue->CopyTo(value);
680 const T2& temp = value;
681 RscValueAdapter<T2> valueAdapter(temp);
682 valueAdapter.Write(writer,
false);
687 const T* pWriteValue;
std::uint64_t uint64
The Arp unsigned integer type of 8 byte size.
Definition: PrimitiveTypes.hpp:40
std::uint32_t uint32
The Arp unsigned integer type of 4 byte size.
Definition: PrimitiveTypes.hpp:36
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