diff --git a/include/opc/ua/protocol/utils.h b/include/opc/ua/protocol/utils.h index e23bffe9..db846120 100644 --- a/include/opc/ua/protocol/utils.h +++ b/include/opc/ua/protocol/utils.h @@ -64,7 +64,7 @@ inline std::string ToHexDump(const char * buf, std::size_t size) template inline std::ostream & ToHexDump(std::ostream & os, const std::vector & buf, std::size_t size) { std::stringstream lineEnd; - size = std::min(size, buf.size()); + size = (std::min)(size, buf.size()); unsigned pos = 0; os << "size: " << size << "(0x" << std::hex << size << ")"; diff --git a/src/protocol/binary_stream.cpp b/src/protocol/binary_stream.cpp index 0ce306e6..5d6cedc2 100644 --- a/src/protocol/binary_stream.cpp +++ b/src/protocol/binary_stream.cpp @@ -523,7 +523,7 @@ void DataDeserializer::Deserialize(ByteString & value) uint32_t stringSize = 0; *this >> stringSize; - if (stringSize != ~uint32_t()) + if (stringSize != ~uint32_t() && stringSize > 0) { value.Data.resize(stringSize); GetData(In, reinterpret_cast(&value.Data[0]), stringSize); diff --git a/src/protocol/binary_variant.cpp b/src/protocol/binary_variant.cpp index d01b1306..a74e85bf 100644 --- a/src/protocol/binary_variant.cpp +++ b/src/protocol/binary_variant.cpp @@ -1061,13 +1061,17 @@ void DataDeserializer::Deserialize(Variant & var) { var = deserializer.get(); } else if (encodingMask == ((uint8_t)VariantType::DIAGNOSTIC_INFO | HAS_ARRAY_MASK)) - { var = deserializer.get>(); } + { + var = deserializer.get(); + } else if (encodingMask == ((uint8_t)VariantType::EXTENSION_OBJECT)) { var = deserializer.get(); } else if (encodingMask == ((uint8_t)VariantType::EXTENSION_OBJECT | HAS_ARRAY_MASK)) - { var = deserializer.get>(); } + { + var = deserializer.get>(); + } else { throw std::logic_error("Deserialization of VariantType: " + std::to_string(encodingMask) + " is not supported yet."); } diff --git a/src/protocol/deserialize_auto.cpp b/src/protocol/deserialize_auto.cpp index b20af533..d7cecea0 100644 --- a/src/protocol/deserialize_auto.cpp +++ b/src/protocol/deserialize_auto.cpp @@ -328,7 +328,7 @@ void DataDeserializer::Deserialize(XmlElement & data) */ template<> -void DataDeserializer::Deserialize(ExtensionObject & data) +void DataDeserializer::Deserialize(OpcUa::ExtensionObject & data) { *this >> data.TypeId; *this >> data.Encoding; @@ -336,6 +336,12 @@ void DataDeserializer::Deserialize(ExtensionObject & data) if ((data.Encoding) & (1 >> (0))) { *this >> data.Body; } } +template<> +void DataDeserializer::Deserialize>(std::vector & infos) +{ + DeserializeContainer(*this, infos); +} + /* DISABLED diff --git a/src/server/tcp_server.cpp b/src/server/tcp_server.cpp index b4f20005..780a33b4 100644 --- a/src/server/tcp_server.cpp +++ b/src/server/tcp_server.cpp @@ -9,6 +9,7 @@ /// #ifdef _WIN32 +#include #include #endif @@ -178,7 +179,7 @@ class TcpServerConnection : private Common::ThreadObserver { LOG_INFO(Logger, "shutting down opc ua binary server"); Stopped = true; - shutdown(Socket, SHUT_RDWR); + shutdown(Socket, SD_BOTH/*SHUT_RDWR*/); ServerThread->Join(); ServerThread.reset(); }