summaryrefslogtreecommitdiffstats
path: root/xbmc/messaging/ThreadMessage.h
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/messaging/ThreadMessage.h')
-rw-r--r--xbmc/messaging/ThreadMessage.h142
1 files changed, 142 insertions, 0 deletions
diff --git a/xbmc/messaging/ThreadMessage.h b/xbmc/messaging/ThreadMessage.h
new file mode 100644
index 0000000..1a277ff
--- /dev/null
+++ b/xbmc/messaging/ThreadMessage.h
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2005-2018 Team Kodi
+ * This file is part of Kodi - https://kodi.tv
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ * See LICENSES/README.md for more information.
+ */
+
+#pragma once
+
+#include <memory>
+#include <string>
+#include <utility>
+#include <vector>
+
+class CEvent;
+
+namespace KODI
+{
+namespace MESSAGING
+{
+
+class CApplicationMessenger;
+
+class ThreadMessage
+{
+ friend CApplicationMessenger;
+public:
+ ThreadMessage()
+ : ThreadMessage{ 0, -1, -1, nullptr }
+ {
+ }
+
+ explicit ThreadMessage(uint32_t messageId)
+ : ThreadMessage{ messageId, -1, -1, nullptr }
+ {
+ }
+
+ ThreadMessage(uint32_t messageId, int64_t p3)
+ : ThreadMessage{ messageId, -1, -1, nullptr, p3 }
+ {
+ }
+
+ ThreadMessage(uint32_t messageId, int p1, int p2, void* payload, int64_t p3 = 0)
+ : dwMessage{ messageId }
+ , param1{ p1 }
+ , param2{ p2 }
+ , param3{ p3 }
+ , lpVoid{ payload }
+ {
+ }
+
+ ThreadMessage(uint32_t messageId,
+ int p1,
+ int p2,
+ void* payload,
+ std::string param,
+ std::vector<std::string> vecParams)
+ : dwMessage{messageId},
+ param1{p1},
+ param2{p2},
+ param3{0},
+ lpVoid{payload},
+ strParam(std::move(param)),
+ params(std::move(vecParams))
+ {
+ }
+
+ ThreadMessage(const ThreadMessage& other) = default;
+
+ ThreadMessage(ThreadMessage&& other) noexcept
+ : dwMessage(other.dwMessage),
+ param1(other.param1),
+ param2(other.param2),
+ param3(other.param3),
+ lpVoid(other.lpVoid),
+ strParam(std::move(other.strParam)),
+ params(std::move(other.params)),
+ waitEvent(std::move(other.waitEvent)),
+ result(std::move(other.result))
+ {
+ }
+
+ ThreadMessage& operator=(const ThreadMessage& other)
+ {
+ if (this == &other)
+ return *this;
+ dwMessage = other.dwMessage;
+ param1 = other.param1;
+ param2 = other.param2;
+ param3 = other.param3;
+ lpVoid = other.lpVoid;
+ strParam = other.strParam;
+ params = other.params;
+ waitEvent = other.waitEvent;
+ result = other.result;
+ return *this;
+ }
+
+ ThreadMessage& operator=(ThreadMessage&& other) noexcept
+ {
+ if (this == &other)
+ return *this;
+ dwMessage = other.dwMessage;
+ param1 = other.param1;
+ param2 = other.param2;
+ param3 = other.param3;
+ lpVoid = other.lpVoid;
+ strParam = std::move(other.strParam);
+ params = std::move(other.params);
+ waitEvent = std::move(other.waitEvent);
+ result = std::move(other.result);
+ return *this;
+ }
+
+ uint32_t dwMessage;
+ int param1;
+ int param2;
+ int64_t param3;
+ void* lpVoid;
+ std::string strParam;
+ std::vector<std::string> params;
+
+ /*!
+ * \brief set the message return value, will only be returned when
+ * the message is sent using SendMsg
+ * \param [in] res the return value or a result status code that is returned to the caller
+ */
+ void SetResult(int res) const
+ {
+ //On posted messages result will be zero, since they can't
+ //retrieve the response we silently ignore this to let message
+ //handlers not have to worry about it
+ if (result)
+ *result = res;
+ }
+protected:
+ std::shared_ptr<CEvent> waitEvent;
+ std::shared_ptr<int> result;
+};
+}
+}