#pragma once #ifdef REQUEST_HELPER_WITH_GUI #include #define LTSUTILSGUIDDS_INTERNAL_EXPORT LTSUTILSGUIDDS_EXPORT #else #include #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(); }; }