From 8986a688252a72bf55d0032120818a65fb15073a Mon Sep 17 00:00:00 2001 From: "Ramir \"Ramir0\" Sultanov" Date: Thu, 19 Sep 2024 13:03:12 +0300 Subject: [PATCH] Add compatibility with protobuf 28 Signed-off-by: Ramir Sultanov --- include/gz/transport/RepHandler.hh | 46 ++++++++++++++++++++- include/gz/transport/SubscriptionHandler.hh | 24 ++++++++++- 2 files changed, 68 insertions(+), 2 deletions(-) diff --git a/include/gz/transport/RepHandler.hh b/include/gz/transport/RepHandler.hh index eb2e9d7c1..0ae1e6340 100644 --- a/include/gz/transport/RepHandler.hh +++ b/include/gz/transport/RepHandler.hh @@ -141,7 +141,51 @@ namespace gz return false; } -#if GOOGLE_PROTOBUF_VERSION >= 4022000 +#if GOOGLE_PROTOBUF_VERSION >= 5028000 + const auto msgReq = + google::protobuf::DynamicCastMessage(&_msgReq); + auto msgRep = + google::protobuf::DynamicCastMessage(&_msgRep); + + // Verify the dynamically casted messages are valid + if (msgReq == nullptr || msgRep == nullptr) + { + if (msgReq == nullptr) + { + if (_msgReq.GetDescriptor() != nullptr) + { + std::cerr << "RepHandler::RunLocalCallback() error: " + << "Failed to cast the request of the type " + << _msgReq.GetDescriptor()->full_name() + << " to the specified type" << '\n'; + } + else + { + std::cerr << "RepHandler::RunLocalCallback() error: " + << "Failed to cast the request of an unknown type" + << " to the specified type" << '\n'; + } + } + if (msgRep == nullptr) + { + if (_msgRep.GetDescriptor() != nullptr) + { + std::cerr << "RepHandler::RunLocalCallback() error: " + << "Failed to cast the response of the type " + << _msgRep.GetDescriptor()->full_name() + << " to the specified type" << '\n'; + } + else + { + std::cerr << "RepHandler::RunLocalCallback() error: " + << "Failed to cast the response of an unknown type" + << " to the specified type" << '\n'; + } + } + std::cerr.flush(); + return false; + } +#elif GOOGLE_PROTOBUF_VERSION >= 4022000 auto msgReq = google::protobuf::internal::DownCast(&_msgReq); auto msgRep = google::protobuf::internal::DownCast(&_msgRep); diff --git a/include/gz/transport/SubscriptionHandler.hh b/include/gz/transport/SubscriptionHandler.hh index 6119e100e..e85eacc16 100644 --- a/include/gz/transport/SubscriptionHandler.hh +++ b/include/gz/transport/SubscriptionHandler.hh @@ -214,7 +214,29 @@ namespace gz if (!this->UpdateThrottling()) return true; -#if GOOGLE_PROTOBUF_VERSION >= 4022000 +#if GOOGLE_PROTOBUF_VERSION >= 5028000 + auto msgPtr = google::protobuf::DynamicCastMessage(&_msg); + + // Verify the dynamically casted message is valid + if (msgPtr == nullptr) + { + if (_msg.GetDescriptor() != nullptr) + { + std::cerr << "SubscriptionHandler::RunLocalCallback() error: " + << "Failed to cast the message of the type " + << _msg.GetDescriptor()->full_name() + << " to the specified type" << '\n'; + } + else + { + std::cerr << "SubscriptionHandler::RunLocalCallback() error: " + << "Failed to cast the message of an unknown type" + << " to the specified type" << '\n'; + } + std::cerr.flush(); + return false; + } +#elif GOOGLE_PROTOBUF_VERSION >= 4022000 auto msgPtr = google::protobuf::internal::DownCast(&_msg); #elif GOOGLE_PROTOBUF_VERSION >= 3000000 auto msgPtr = google::protobuf::down_cast(&_msg);