#pragma once #ifdef REQUEST_HELPER_WITH_GUI #include "ltsutilsdds_export.h" #define LTSUTILSGUIDDS_INTERNAL_EXPORT LTSUTILSGUIDDS_EXPORT #else #include "ltsutilsdds_export.h" #define LTSUTILSGUIDDS_INTERNAL_EXPORT LTSUTILSDDS_EXPORT #endif #include #include #include #include #include #include namespace LtsUtils { template dds::core::optional toOptional(T inVal) { return inVal != T() ? dds::core::optional(inVal) : dds::core::optional(); } template dds::core::optional optional() { return dds::core::optional(); } class LTSUTILSGUIDDS_INTERNAL_EXPORT RequestHelper : public QObject { Q_OBJECT public: static bool s_debug; explicit RequestHelper( QObject* parent = nullptr, bool quiet = false, const std::function& success = []() {}, const std::function& failure = []() {}); ~RequestHelper() = default; bool quiet() const { return m_quiet; } void setQuiet(bool quiet) { m_quiet = quiet; } void addRequest(const std::function& requestFunction, const std::function& baseReplyHandler = nullptr); bool startRequests(); bool startSingleRequest(const std::function& requestFunction, const std::function& baseReplyHandler = nullptr); void startSingleBackgroundRequest( const std::function& requestFunction, const std::function& baseReplyHandler = nullptr); void startBackgroundRequests(); bool requestReply(const Core::FunctionReply& baseReply); bool requestReply(const Core::FunctionReplyObject& replyObject); bool hasRequests() const { return !m_requestFunctions.isEmpty(); } int getRepliedId() const { return m_repliedId; } QString getErrorString() const { return m_errorString; } void setCustomWaitMessage(const QString& customWaitMessage); bool failed() const { return m_failed; } void failure(); private: using RequestFunctionContainer = QPair, std::function>; QVector m_requestFunctions; bool m_failed; int m_repliedId; std::function m_singleRequestCustomFunctionReply; bool m_quiet; bool m_blockingCall; std::function m_successFn; std::function m_failureFn; QString m_errorString; QString m_customWaitMessage; void done(); bool _requestReply(const Core::FunctionReplyObject& fro, const Core::FunctionReply* baseReply); signals: void signalNextRequest(); void signalQuitLoop(); void signalSuccess(); void signalFailed(); private slots: void slotNextRequest(); }; } // namespace LtsUtils