diff --git a/src/centralsystem/chargepoint/ChargePointHandler.h b/src/centralsystem/chargepoint/ChargePointHandler.h index f03faf3c..0335b088 100644 --- a/src/centralsystem/chargepoint/ChargePointHandler.h +++ b/src/centralsystem/chargepoint/ChargePointHandler.h @@ -263,9 +263,9 @@ class ChargePointHandler template ocpp::types::DataTransferStatus handleMessage(const std::string& type_id, const std::string& request_data, std::string& response_data) { - ocpp::types::DataTransferStatus status = ocpp::types::DataTransferStatus::Rejected; - ocpp::messages::IMessageConverter* req_converter = m_messages_converter.getRequestConverter(type_id); - ocpp::messages::IMessageConverter* resp_converter = m_messages_converter.getResponseConverter(type_id); + ocpp::types::DataTransferStatus status = ocpp::types::DataTransferStatus::Rejected; + auto req_converter = m_messages_converter.getRequestConverter(type_id); + auto resp_converter = m_messages_converter.getResponseConverter(type_id); try { // Parse JSON diff --git a/src/centralsystem/chargepoint/ChargePointProxy.h b/src/centralsystem/chargepoint/ChargePointProxy.h index 519c6592..945a77eb 100644 --- a/src/centralsystem/chargepoint/ChargePointProxy.h +++ b/src/centralsystem/chargepoint/ChargePointProxy.h @@ -341,8 +341,8 @@ class ChargePointProxy : public ICentralSystem::IChargePoint, public ocpp::rpc:: bool ret = false; // Get converters - ocpp::messages::IMessageConverter* req_converter = m_messages_converter.getRequestConverter(type_id); - ocpp::messages::IMessageConverter* resp_converter = m_messages_converter.getResponseConverter(type_id); + auto req_converter = m_messages_converter.getRequestConverter(type_id); + auto resp_converter = m_messages_converter.getResponseConverter(type_id); // Prepare request ocpp::messages::DataTransferReq req; diff --git a/src/chargepoint/iso15118/Iso15118Manager.h b/src/chargepoint/iso15118/Iso15118Manager.h index afd67b2f..43343e16 100644 --- a/src/chargepoint/iso15118/Iso15118Manager.h +++ b/src/chargepoint/iso15118/Iso15118Manager.h @@ -175,8 +175,8 @@ class Iso15118Manager : public IDataTransferManager::IDataTransferHandler bool ret = false; // Get converters - ocpp::messages::IMessageConverter* req_converter = m_messages_converter.getRequestConverter(type_id); - ocpp::messages::IMessageConverter* resp_converter = m_messages_converter.getResponseConverter(type_id); + auto req_converter = m_messages_converter.getRequestConverter(type_id); + auto resp_converter = m_messages_converter.getResponseConverter(type_id); // Prepare request ocpp::messages::DataTransferReq req; @@ -240,9 +240,9 @@ class Iso15118Manager : public IDataTransferManager::IDataTransferHandler template ocpp::types::DataTransferStatus handle(const std::string& type_id, const std::string& request_data, std::string& response_data) { - ocpp::types::DataTransferStatus status = ocpp::types::DataTransferStatus::Rejected; - ocpp::messages::IMessageConverter* req_converter = m_messages_converter.getRequestConverter(type_id); - ocpp::messages::IMessageConverter* resp_converter = m_messages_converter.getResponseConverter(type_id); + ocpp::types::DataTransferStatus status = ocpp::types::DataTransferStatus::Rejected; + auto req_converter = m_messages_converter.getRequestConverter(type_id); + auto resp_converter = m_messages_converter.getResponseConverter(type_id); try { // Parse JSON diff --git a/src/chargepoint/security/SecurityManager.cpp b/src/chargepoint/security/SecurityManager.cpp index 5f3cf67c..b90c05a4 100644 --- a/src/chargepoint/security/SecurityManager.cpp +++ b/src/chargepoint/security/SecurityManager.cpp @@ -98,7 +98,7 @@ SecurityManager::SecurityManager(const ocpp::config::IChargePointConfig& m_worker_pool(worker_pool), m_requests_fifo(requests_fifo), m_security_event_req_converter( - *messages_converter.getRequestConverter(SECURITY_EVENT_NOTIFICATION_ACTION)), + messages_converter.getRequestConverter(SECURITY_EVENT_NOTIFICATION_ACTION)), m_charge_point(charge_point), m_security_logs_db(stack_config, database), m_ca_certificates_db(stack_config, database), @@ -319,8 +319,8 @@ bool SecurityManager::logSecurityEvent(const std::string& type, const std::strin // Stack is not started, queue the notification rapidjson::Document payload; payload.Parse("{}"); - m_security_event_req_converter.setAllocator(&payload.GetAllocator()); - if (m_security_event_req_converter.toJson(request, payload)) + m_security_event_req_converter->setAllocator(&payload.GetAllocator()); + if (m_security_event_req_converter->toJson(request, payload)) { m_requests_fifo.push(0, SECURITY_EVENT_NOTIFICATION_ACTION, payload); } diff --git a/src/chargepoint/security/SecurityManager.h b/src/chargepoint/security/SecurityManager.h index 31163d2b..f3cfaa3a 100644 --- a/src/chargepoint/security/SecurityManager.h +++ b/src/chargepoint/security/SecurityManager.h @@ -190,7 +190,7 @@ class SecurityManager /** @brief Transaction related requests FIFO */ ocpp::messages::IRequestFifo& m_requests_fifo; /** @brief Message converter for SecurityEventNotificationReq */ - ocpp::messages::IMessageConverter& m_security_event_req_converter; + std::unique_ptr> m_security_event_req_converter; /** @brief Charge Point */ IChargePoint& m_charge_point; diff --git a/src/messages/GenericMessageHandler.h b/src/messages/GenericMessageHandler.h index 4ee4ce34..2e426662 100644 --- a/src/messages/GenericMessageHandler.h +++ b/src/messages/GenericMessageHandler.h @@ -35,8 +35,8 @@ class GenericMessageHandler : public IMessageDispatcher::IMessageHandler public: /** @brief Constructor */ GenericMessageHandler(const std::string& action, const GenericMessagesConverter& messages_converter) - : m_request_converter(*messages_converter.getRequestConverter(action)), - m_response_converter(*messages_converter.getResponseConverter(action)) + : m_request_converter(messages_converter.getRequestConverter(action)), + m_response_converter(messages_converter.getResponseConverter(action)) { } @@ -60,15 +60,15 @@ class GenericMessageHandler : public IMessageDispatcher::IMessageHandler // Convert request RequestType request; - if (m_request_converter.fromJson(payload, request, error_code, error_message)) + if (m_request_converter->fromJson(payload, request, error_code, error_message)) { // Handle message ResponseType resp; if (handleMessage(request, resp, error_code, error_message)) { // Convert response - m_response_converter.setAllocator(&response.GetAllocator()); - ret = m_response_converter.toJson(resp, response); + m_response_converter->setAllocator(&response.GetAllocator()); + ret = m_response_converter->toJson(resp, response); } } @@ -86,8 +86,8 @@ class GenericMessageHandler : public IMessageDispatcher::IMessageHandler virtual bool handleMessage(const RequestType& request, ResponseType& response, std::string& error_code, std::string& error_message) = 0; private: - IMessageConverter& m_request_converter; - IMessageConverter& m_response_converter; + std::unique_ptr> m_request_converter; + std::unique_ptr> m_response_converter; }; } // namespace messages diff --git a/src/messages/GenericMessageSender.h b/src/messages/GenericMessageSender.h index d18e380c..e424b67b 100644 --- a/src/messages/GenericMessageSender.h +++ b/src/messages/GenericMessageSender.h @@ -129,8 +129,8 @@ class GenericMessageSender CallResult ret = CallResult::Failed; // Get converters - IMessageConverter* req_converter = m_messages_converter.getRequestConverter(action); - IMessageConverter* resp_converter = m_messages_converter.getResponseConverter(action); + auto req_converter = m_messages_converter.getRequestConverter(action); + auto resp_converter = m_messages_converter.getResponseConverter(action); if (req_converter && resp_converter) { // Convert request @@ -204,7 +204,7 @@ class GenericMessageSender CallResult ret = CallResult::Failed; // Get converter - IMessageConverter* resp_converter = m_messages_converter.getResponseConverter(action); + auto resp_converter = m_messages_converter.getResponseConverter(action); if (resp_converter) { // Execute call diff --git a/src/messages/GenericMessagesConverter.h b/src/messages/GenericMessagesConverter.h index 807b1677..0d8b5faf 100644 --- a/src/messages/GenericMessagesConverter.h +++ b/src/messages/GenericMessagesConverter.h @@ -19,8 +19,10 @@ along with OpenOCPP. If not, see . #ifndef OPENOCPP_GENERICMESSAGESCONVERTER_H #define OPENOCPP_GENERICMESSAGESCONVERTER_H +#include #include #include + namespace ocpp { namespace messages @@ -42,13 +44,13 @@ class GenericMessagesConverter * @return Pointer to the message converter for the request or nullptr if the converter doesn't exists */ template - IMessageConverter* getRequestConverter(const std::string& action) const + std::unique_ptr> getRequestConverter(const std::string& action) const { - IMessageConverter* ret = nullptr; - auto it = m_req_converters.find(action); + std::unique_ptr> ret; + auto it = m_req_converters.find(action); if (it != m_req_converters.end()) { - ret = reinterpret_cast*>(it->second); + ret.reset(reinterpret_cast*>(it->second)->clone()); } return ret; } @@ -59,13 +61,13 @@ class GenericMessagesConverter * @return Pointer to the message converter for the response or nullptr if the converter doesn't exists */ template - IMessageConverter* getResponseConverter(const std::string& action) const + std::unique_ptr> getResponseConverter(const std::string& action) const { - IMessageConverter* ret = nullptr; - auto it = m_resp_converters.find(action); + std::unique_ptr> ret; + auto it = m_resp_converters.find(action); if (it != m_resp_converters.end()) { - ret = reinterpret_cast*>(it->second); + ret.reset(reinterpret_cast*>(it->second)->clone()); } return ret; } @@ -93,6 +95,34 @@ class GenericMessagesConverter m_resp_converters[action] = &converter; } + /** + * @brief Delete a converter for a request + * @param action Ocpp call action corresponding to the request + */ + template + void deleteRequestConverter(const std::string& action) + { + auto it = m_req_converters.find(action); + if (it != m_req_converters.end()) + { + delete reinterpret_cast*>(it->second); + } + } + + /** + * @brief Delete a converter for a response + * @param action Ocpp call action corresponding to the response + */ + template + void deleteResponseConverter(const std::string& action) + { + auto it = m_resp_converters.find(action); + if (it != m_resp_converters.end()) + { + delete reinterpret_cast*>(it->second); + } + } + private: /** @brief Request converters */ std::unordered_map m_req_converters; diff --git a/src/messages/IMessageConverter.h b/src/messages/IMessageConverter.h index d7d1bf05..b3305566 100644 --- a/src/messages/IMessageConverter.h +++ b/src/messages/IMessageConverter.h @@ -37,6 +37,12 @@ class IMessageConverter /** @brief Destructor */ virtual ~IMessageConverter() { } + /** + * Clone a message converter instance + * @return Cloned message converter instance + */ + virtual IMessageConverter* clone() const = 0; + /** * @brief Convert a JSON object to a C++ data type * @param json JSON object to convert @@ -273,17 +279,19 @@ class IMessageConverter class MessageType##ReqConverter : public IMessageConverter \ { \ public: \ + IMessageConverter* clone() const override { return new MessageType##ReqConverter(); } \ bool fromJson(const rapidjson::Value& json, MessageType##Req& data, std::string& error_code, std::string& error_message) override; \ bool toJson(const MessageType##Req& data, rapidjson::Document& json) override; \ }; \ class MessageType##ConfConverter : public IMessageConverter \ { \ public: \ - bool fromJson(const rapidjson::Value& json, \ - MessageType##Conf& data, \ - std::string& error_code, \ - std::string& error_message) override; \ - bool toJson(const MessageType##Conf& data, rapidjson::Document& json) override; \ + IMessageConverter* clone() const override { return new MessageType##ConfConverter(); } \ + bool fromJson(const rapidjson::Value& json, \ + MessageType##Conf& data, \ + std::string& error_code, \ + std::string& error_message) override; \ + bool toJson(const MessageType##Conf& data, rapidjson::Document& json) override; \ }; } // namespace messages diff --git a/src/messages/MessagesConverter.cpp b/src/messages/MessagesConverter.cpp index 22c5d001..83d282dd 100644 --- a/src/messages/MessagesConverter.cpp +++ b/src/messages/MessagesConverter.cpp @@ -70,9 +70,9 @@ along with OpenOCPP. If not, see . registerResponseConverter(#action, *new action##ConfConverter()) /** @brief Macro to delete a message converter for an OCPP action */ -#define DELETE_CONVERTER(action) \ - delete getRequestConverter(#action); \ - delete getResponseConverter(#action) +#define DELETE_CONVERTER(action) \ + deleteRequestConverter(#action); \ + deleteResponseConverter(#action) namespace ocpp { diff --git a/src/messages/types/AuthorizationDataConverter.h b/src/messages/types/AuthorizationDataConverter.h index 9bf69994..0b5b3e7f 100644 --- a/src/messages/types/AuthorizationDataConverter.h +++ b/src/messages/types/AuthorizationDataConverter.h @@ -31,6 +31,9 @@ namespace messages class AuthorizationDataConverter : public IMessageConverter { public: + /** @copydoc IMessageConverter* IMessageConverter::clone() const */ + IMessageConverter* clone() const override { return new AuthorizationDataConverter(); } + /** @copydoc bool IMessageConverter::fromJson(const rapidjson::Value&, * ocpp::types::AuthorizationData&, * std::string&, diff --git a/src/messages/types/CertificateHashDataChainTypeConverter.h b/src/messages/types/CertificateHashDataChainTypeConverter.h index 75a26a15..de940326 100644 --- a/src/messages/types/CertificateHashDataChainTypeConverter.h +++ b/src/messages/types/CertificateHashDataChainTypeConverter.h @@ -31,6 +31,12 @@ namespace messages class CertificateHashDataChainTypeConverter : public IMessageConverter { public: + /** @copydoc IMessageConverter* IMessageConverter::clone() const */ + IMessageConverter* clone() const override + { + return new CertificateHashDataChainTypeConverter(); + } + /** @copydoc bool IMessageConverter::fromJson(const rapidjson::Value&, * ocpp::types::CertificateHashDataChainType&, * std::string&, diff --git a/src/messages/types/CertificateHashDataTypeConverter.h b/src/messages/types/CertificateHashDataTypeConverter.h index a764f26a..b347f0ef 100644 --- a/src/messages/types/CertificateHashDataTypeConverter.h +++ b/src/messages/types/CertificateHashDataTypeConverter.h @@ -31,6 +31,9 @@ namespace messages class CertificateHashDataTypeConverter : public IMessageConverter { public: + /** @copydoc IMessageConverter* IMessageConverter::clone() const */ + IMessageConverter* clone() const override { return new CertificateHashDataTypeConverter(); } + /** @copydoc bool IMessageConverter::fromJson(const rapidjson::Value&, * ocpp::types::CertificateHashDataType&, * std::string&, diff --git a/src/messages/types/ChargingProfileConverter.h b/src/messages/types/ChargingProfileConverter.h index cc885b43..5a0f566d 100644 --- a/src/messages/types/ChargingProfileConverter.h +++ b/src/messages/types/ChargingProfileConverter.h @@ -31,6 +31,9 @@ namespace messages class ChargingProfileConverter : public IMessageConverter { public: + /** @copydoc IMessageConverter* IMessageConverter::clone() const */ + IMessageConverter* clone() const override { return new ChargingProfileConverter(); } + /** @copydoc bool IMessageConverter::fromJson(const rapidjson::Value&, * ocpp::types::ChargingProfile&, * std::string&, diff --git a/src/messages/types/ChargingScheduleConverter.h b/src/messages/types/ChargingScheduleConverter.h index 5589d3c7..10ded99c 100644 --- a/src/messages/types/ChargingScheduleConverter.h +++ b/src/messages/types/ChargingScheduleConverter.h @@ -31,6 +31,9 @@ namespace messages class ChargingScheduleConverter : public IMessageConverter { public: + /** @copydoc IMessageConverter* IMessageConverter::clone() const */ + IMessageConverter* clone() const override { return new ChargingScheduleConverter(); } + /** @copydoc bool IMessageConverter::fromJson(const rapidjson::Value&, * ocpp::types::ChargingSchedule&, * std::string&, diff --git a/src/messages/types/IdTagInfoConverter.h b/src/messages/types/IdTagInfoConverter.h index 4129c681..f12cca5c 100644 --- a/src/messages/types/IdTagInfoConverter.h +++ b/src/messages/types/IdTagInfoConverter.h @@ -31,6 +31,9 @@ namespace messages class IdTagInfoConverter : public IMessageConverter { public: + /** @copydoc IMessageConverter* IMessageConverter::clone() const */ + IMessageConverter* clone() const override { return new IdTagInfoConverter(); } + /** @copydoc bool IMessageConverter::fromJson(const rapidjson::Value&, * ocpp::types::IdTagInfo&, * std::string&, diff --git a/src/messages/types/IdTokenInfoTypeConverter.h b/src/messages/types/IdTokenInfoTypeConverter.h index 55d31ef9..ba234d82 100644 --- a/src/messages/types/IdTokenInfoTypeConverter.h +++ b/src/messages/types/IdTokenInfoTypeConverter.h @@ -31,6 +31,9 @@ namespace messages class IdTokenInfoTypeConverter : public IMessageConverter { public: + /** @copydoc IMessageConverter* IMessageConverter::clone() const */ + IMessageConverter* clone() const override { return new IdTokenInfoTypeConverter(); } + /** @copydoc bool IMessageConverter::fromJson(const rapidjson::Value&, * ocpp::types::IdTokenInfoType&, * std::string&, diff --git a/src/messages/types/MeterValueConverter.h b/src/messages/types/MeterValueConverter.h index 4f7708ca..e8178457 100644 --- a/src/messages/types/MeterValueConverter.h +++ b/src/messages/types/MeterValueConverter.h @@ -31,6 +31,9 @@ namespace messages class MeterValueConverter : public IMessageConverter { public: + /** @copydoc IMessageConverter* IMessageConverter::clone() const */ + IMessageConverter* clone() const override { return new MeterValueConverter(); } + /** @copydoc bool IMessageConverter::fromJson(const rapidjson::Value&, * ocpp::types::MeterValue&, * std::string&, diff --git a/src/messages/types/OcspRequestDataTypeConverter.h b/src/messages/types/OcspRequestDataTypeConverter.h index 4f75f42c..a54c3385 100644 --- a/src/messages/types/OcspRequestDataTypeConverter.h +++ b/src/messages/types/OcspRequestDataTypeConverter.h @@ -31,6 +31,9 @@ namespace messages class OcspRequestDataTypeConverter : public IMessageConverter { public: + /** @copydoc IMessageConverter* IMessageConverter::clone() const */ + IMessageConverter* clone() const override { return new OcspRequestDataTypeConverter(); } + /** @copydoc bool IMessageConverter::fromJson(const rapidjson::Value&, * ocpp::types::OcspRequestDataType&, * std::string&, diff --git a/src/tools/log/Logger.cpp b/src/tools/log/Logger.cpp index 0f0c2f57..ae064d62 100644 --- a/src/tools/log/Logger.cpp +++ b/src/tools/log/Logger.cpp @@ -69,10 +69,11 @@ Logger::~Logger() #endif // _MSC_VER LOG_OUTPUT << m_level_str << " - [" << std::put_time(&now_tm, "%Y-%m-%dT%T") << "] - " << file_line.str() << " - " << m_log_output.str() << std::endl; - } - if (m_log_database) - { - m_log_database->log(now, m_level, file_line.str(), m_log_output.str()); + + if (m_log_database) + { + m_log_database->log(now, m_level, file_line.str(), m_log_output.str()); + } } }