summaryrefslogtreecommitdiffstats
path: root/xbmc/pvr/PVRChannelNumberInputHandler.h
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/pvr/PVRChannelNumberInputHandler.h')
-rw-r--r--xbmc/pvr/PVRChannelNumberInputHandler.h118
1 files changed, 118 insertions, 0 deletions
diff --git a/xbmc/pvr/PVRChannelNumberInputHandler.h b/xbmc/pvr/PVRChannelNumberInputHandler.h
new file mode 100644
index 0000000..efa28ca
--- /dev/null
+++ b/xbmc/pvr/PVRChannelNumberInputHandler.h
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2012-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 "pvr/channels/PVRChannelNumber.h"
+#include "threads/CriticalSection.h"
+#include "threads/Timer.h"
+#include "utils/EventStream.h"
+
+#include <string>
+#include <vector>
+
+namespace PVR
+{
+struct PVRChannelNumberInputChangedEvent
+{
+ explicit PVRChannelNumberInputChangedEvent(const std::string& input) : m_input(input) {}
+ virtual ~PVRChannelNumberInputChangedEvent() = default;
+
+ std::string m_input;
+};
+
+class CPVRChannelNumberInputHandler : private ITimerCallback
+{
+public:
+ static const int CHANNEL_NUMBER_INPUT_MAX_DIGITS = 5;
+
+ CPVRChannelNumberInputHandler();
+
+ /*!
+ * @brief ctor.
+ * @param iDelay timer delay in millisecods.
+ * @param iMaxDigits maximum number of display digits to use.
+ */
+ CPVRChannelNumberInputHandler(int iDelay, int iMaxDigits = CHANNEL_NUMBER_INPUT_MAX_DIGITS);
+
+ ~CPVRChannelNumberInputHandler() override = default;
+
+ /*!
+ * @brief Get the events available for CEventStream.
+ * @return The events.
+ */
+ CEventStream<PVRChannelNumberInputChangedEvent>& Events() { return m_events; }
+
+ // implementation of ITimerCallback
+ void OnTimeout() override;
+
+ /*!
+ * @brief Get the currently available channel numbers.
+ * @param channelNumbers The list to fill with the channel numbers.
+ */
+ virtual void GetChannelNumbers(std::vector<std::string>& channelNumbers) = 0;
+
+ /*!
+ * @brief This method gets called after the channel number input timer has expired.
+ */
+ virtual void OnInputDone() = 0;
+
+ /*!
+ * @brief Appends a channel number character.
+ * @param cCharacter The character to append. value must be CPVRChannelNumber::SEPARATOR ('.') or any char in the range from '0' to '9'.
+ */
+ virtual void AppendChannelNumberCharacter(char cCharacter);
+
+ /*!
+ * @brief Check whether a channel number was entered.
+ * @return True if the handler currently holds a channel number, false otherwise.
+ */
+ bool HasChannelNumber() const;
+
+ /*!
+ * @brief Get the currently entered channel number as a formatted string.
+ * @return the channel number string.
+ */
+ std::string GetChannelNumberLabel() const;
+
+ /*!
+ * @brief If a number was entered, execute the associated action.
+ * @return True, if the action was executed, false otherwise.
+ */
+ bool CheckInputAndExecuteAction();
+
+protected:
+ /*!
+ * @brief Get the currently entered channel number.
+ * @return the channel number.
+ */
+ CPVRChannelNumber GetChannelNumber() const;
+
+ /*!
+ * @brief Get the currently entered number of digits.
+ * @return the number of digits.
+ */
+ size_t GetCurrentDigitCount() const { return m_inputBuffer.size(); }
+
+ mutable CCriticalSection m_mutex;
+
+private:
+ void ExecuteAction();
+
+ void SetLabel(const std::string& label);
+
+ std::vector<std::string> m_sortedChannelNumbers;
+ const int m_iDelay;
+ const int m_iMaxDigits;
+ std::string m_inputBuffer;
+ std::string m_label;
+ CTimer m_timer;
+ CEventSource<PVRChannelNumberInputChangedEvent> m_events;
+};
+
+} // namespace PVR