#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 // BUILD_RTI wird immer definiert sein (ON oder OFF) // Type alias für FunctionReply - immer Core::FunctionReply verwenden // Bei BUILD_RTI=ON wird in der .cpp auf dds::core::Reference gecastet using FunctionReplyType = Core::FunctionReply; namespace LtsUtils { 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 FunctionReplyType& 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 FunctionReplyType* baseReply); signals: void signalNextRequest(); void signalQuitLoop(); void signalSuccess(); void signalFailed(); private slots: void slotNextRequest(); }; } // namespace LtsUtils