summaryrefslogtreecommitdiffstats
path: root/xbmc/pvr/timers/PVRTimers.h
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/pvr/timers/PVRTimers.h')
-rw-r--r--xbmc/pvr/timers/PVRTimers.h331
1 files changed, 331 insertions, 0 deletions
diff --git a/xbmc/pvr/timers/PVRTimers.h b/xbmc/pvr/timers/PVRTimers.h
new file mode 100644
index 0000000..6b0e4e7
--- /dev/null
+++ b/xbmc/pvr/timers/PVRTimers.h
@@ -0,0 +1,331 @@
+/*
+ * 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/settings/PVRSettings.h"
+#include "threads/Thread.h"
+
+#include <map>
+#include <memory>
+#include <queue>
+#include <vector>
+
+class CDateTime;
+
+namespace PVR
+{
+enum class TimerOperationResult;
+enum class PVREvent;
+
+class CPVRChannel;
+class CPVRClient;
+class CPVREpgInfoTag;
+class CPVRTimerInfoTag;
+class CPVRTimersPath;
+
+class CPVRTimersContainer
+{
+public:
+ /*!
+ * @brief Add a timer tag to this container or update the tag if already present in this
+ * container.
+ * @param The timer tag
+ * @return True, if the update was successful. False, otherwise.
+ */
+ bool UpdateFromClient(const std::shared_ptr<CPVRTimerInfoTag>& timer);
+
+ /*!
+ * @brief Get the timer tag denoted by given client id and timer id.
+ * @param iClientId The client id.
+ * @param iClientIndex The timer id.
+ * @return the timer tag if found, null otherwise.
+ */
+ std::shared_ptr<CPVRTimerInfoTag> GetByClient(int iClientId, int iClientIndex) const;
+
+ typedef std::vector<std::shared_ptr<CPVRTimerInfoTag>> VecTimerInfoTag;
+ typedef std::map<CDateTime, VecTimerInfoTag> MapTags;
+
+ /*!
+ * @brief Get the timertags map.
+ * @return The map.
+ */
+ const MapTags& GetTags() const { return m_tags; }
+
+protected:
+ void InsertEntry(const std::shared_ptr<CPVRTimerInfoTag>& newTimer);
+
+ mutable CCriticalSection m_critSection;
+ unsigned int m_iLastId = 0;
+ MapTags m_tags;
+};
+
+class CPVRTimers : public CPVRTimersContainer, private CThread
+{
+public:
+ CPVRTimers();
+ ~CPVRTimers() override = default;
+
+ /*!
+ * @brief start the timer update thread.
+ */
+ void Start();
+
+ /*!
+ * @brief stop the timer update thread.
+ */
+ void Stop();
+
+ /*!
+ * @brief Update all timers from PVR database and from given clients.
+ * @param clients The PVR clients data should be loaded for. Leave empty for all clients.
+ * @return True on success, false otherwise.
+ */
+ bool Update(const std::vector<std::shared_ptr<CPVRClient>>& clients);
+
+ /*!
+ * @brief unload all timers.
+ */
+ void Unload();
+
+ /*!
+ * @brief Update data with recordings from the given clients, sync with local data.
+ * @param clients The clients to fetch data from. Leave empty to fetch data from all created
+ * clients.
+ * @return True on success, false otherwise.
+ */
+ bool UpdateFromClients(const std::vector<std::shared_ptr<CPVRClient>>& clients);
+
+ /*!
+ * @param bIgnoreReminders include or ignore reminders
+ * @return The tv or radio timer that will be active next (state scheduled), or nullptr if none.
+ */
+ std::shared_ptr<CPVRTimerInfoTag> GetNextActiveTimer(bool bIgnoreReminders = true) const;
+
+ /*!
+ * @return The tv timer that will be active next (state scheduled), or nullptr if none.
+ */
+ std::shared_ptr<CPVRTimerInfoTag> GetNextActiveTVTimer() const;
+
+ /*!
+ * @return The radio timer that will be active next (state scheduled), or nullptr if none.
+ */
+ std::shared_ptr<CPVRTimerInfoTag> GetNextActiveRadioTimer() const;
+
+ /*!
+ * @return All timers that are active (states scheduled or recording)
+ */
+ std::vector<std::shared_ptr<CPVRTimerInfoTag>> GetActiveTimers() const;
+
+ /*!
+ * @return Next due reminder, if any. Removes it from the queue of due reminders.
+ */
+ std::shared_ptr<CPVRTimerInfoTag> GetNextReminderToAnnnounce();
+
+ /*!
+ * Get all timers
+ * @return The list of all timers
+ */
+ std::vector<std::shared_ptr<CPVRTimerInfoTag>> GetAll() const;
+
+ /*!
+ * @return The amount of tv and radio timers that are active (states scheduled or recording)
+ */
+ int AmountActiveTimers() const;
+
+ /*!
+ * @return The amount of tv timers that are active (states scheduled or recording)
+ */
+ int AmountActiveTVTimers() const;
+
+ /*!
+ * @return The amount of radio timers that are active (states scheduled or recording)
+ */
+ int AmountActiveRadioTimers() const;
+
+ /*!
+ * @return All tv and radio timers that are recording
+ */
+ std::vector<std::shared_ptr<CPVRTimerInfoTag>> GetActiveRecordings() const;
+
+ /*!
+ * @return All tv timers that are recording
+ */
+ std::vector<std::shared_ptr<CPVRTimerInfoTag>> GetActiveTVRecordings() const;
+
+ /*!
+ * @return All radio timers that are recording
+ */
+ std::vector<std::shared_ptr<CPVRTimerInfoTag>> GetActiveRadioRecordings() const;
+
+ /*!
+ * @return True when recording, false otherwise.
+ */
+ bool IsRecording() const;
+
+ /*!
+ * @brief Check if a recording is running on the given channel.
+ * @param channel The channel to check.
+ * @return True when recording, false otherwise.
+ */
+ bool IsRecordingOnChannel(const CPVRChannel& channel) const;
+
+ /*!
+ * @brief Obtain the active timer for a given channel.
+ * @param channel The channel to check.
+ * @return the timer, null otherwise.
+ */
+ std::shared_ptr<CPVRTimerInfoTag> GetActiveTimerForChannel(
+ const std::shared_ptr<CPVRChannel>& channel) const;
+
+ /*!
+ * @return The amount of tv and radio timers that are currently recording
+ */
+ int AmountActiveRecordings() const;
+
+ /*!
+ * @return The amount of tv timers that are currently recording
+ */
+ int AmountActiveTVRecordings() const;
+
+ /*!
+ * @return The amount of radio timers that are currently recording
+ */
+ int AmountActiveRadioRecordings() const;
+
+ /*!
+ * @brief Delete all timers on a channel.
+ * @param channel The channel to delete the timers for.
+ * @param bDeleteTimerRules True to delete timer rules too, false otherwise.
+ * @param bCurrentlyActiveOnly True to delete timers that are currently running only.
+ * @return True if timers any were deleted, false otherwise.
+ */
+ bool DeleteTimersOnChannel(const std::shared_ptr<CPVRChannel>& channel,
+ bool bDeleteTimerRules = true,
+ bool bCurrentlyActiveOnly = false);
+
+ /*!
+ * @return Next event time (timer or daily wake up)
+ */
+ CDateTime GetNextEventTime() const;
+
+ /*!
+ * @brief Add a timer to the client. Doesn't add the timer to the container. The backend will do
+ * this.
+ * @param tag The timer to add.
+ * @return True if timer add request was sent correctly, false if not.
+ */
+ bool AddTimer(const std::shared_ptr<CPVRTimerInfoTag>& tag);
+
+ /*!
+ * @brief Delete a timer on the client. Doesn't delete the timer from the container. The backend
+ * will do this.
+ * @param tag The timer to delete.
+ * @param bForce Control what to do in case the timer is currently recording.
+ * True to force to delete the timer, false to return TimerDeleteResult::RECORDING.
+ * @param bDeleteRule Also delete the timer rule that scheduled the timer instead of single timer
+ * only.
+ * @return The result.
+ */
+ TimerOperationResult DeleteTimer(const std::shared_ptr<CPVRTimerInfoTag>& tag,
+ bool bForce = false,
+ bool bDeleteRule = false);
+
+ /*!
+ * @brief Update the timer on the client. Doesn't update the timer in the container. The backend
+ * will do this.
+ * @param tag The timer to update.
+ * @return True if timer update request was sent correctly, false if not.
+ */
+ bool UpdateTimer(const std::shared_ptr<CPVRTimerInfoTag>& tag);
+
+ /*!
+ * @brief Get the timer tag that matches the given epg tag.
+ * @param epgTag The epg tag.
+ * @return The requested timer tag, or nullptr if none was found.
+ */
+ std::shared_ptr<CPVRTimerInfoTag> GetTimerForEpgTag(
+ const std::shared_ptr<CPVREpgInfoTag>& epgTag) const;
+
+ /*!
+ * @brief Get the timer rule for a given timer tag
+ * @param timer The timer to query the timer rule for
+ * @return The timer rule, or nullptr if none was found.
+ */
+ std::shared_ptr<CPVRTimerInfoTag> GetTimerRule(
+ const std::shared_ptr<CPVRTimerInfoTag>& timer) const;
+
+ /*!
+ * @brief Update the channel pointers.
+ */
+ void UpdateChannels();
+
+ /*!
+ * @brief CEventStream callback for PVR events.
+ * @param event The event.
+ */
+ void Notify(const PVREvent& event);
+
+ /*!
+ * @brief Get a timer tag given it's unique ID
+ * @param iTimerId The ID to find
+ * @return The tag, or an empty one when not found
+ */
+ std::shared_ptr<CPVRTimerInfoTag> GetById(unsigned int iTimerId) const;
+
+private:
+ void Process() override;
+
+ /*!
+ * @brief Load all timers from PVR database.
+ * @param clients The PVR clients data should be loaded for. Leave empty for all clients.
+ * @return True on success, false otherwise.
+ */
+ bool LoadFromDatabase(const std::vector<std::shared_ptr<CPVRClient>>& clients);
+
+ void RemoveEntry(const std::shared_ptr<CPVRTimerInfoTag>& tag);
+ bool UpdateEntries(const CPVRTimersContainer& timers, const std::vector<int>& failedClients);
+ bool UpdateEntries(int iMaxNotificationDelay);
+ std::shared_ptr<CPVRTimerInfoTag> UpdateEntry(const std::shared_ptr<CPVRTimerInfoTag>& timer);
+
+ bool AddLocalTimer(const std::shared_ptr<CPVRTimerInfoTag>& tag, bool bNotify);
+ bool DeleteLocalTimer(const std::shared_ptr<CPVRTimerInfoTag>& tag, bool bNotify);
+ bool UpdateLocalTimer(const std::shared_ptr<CPVRTimerInfoTag>& tag);
+ std::shared_ptr<CPVRTimerInfoTag> PersistAndUpdateLocalTimer(
+ const std::shared_ptr<CPVRTimerInfoTag>& timer,
+ const std::shared_ptr<CPVRTimerInfoTag>& parentTimer);
+ void NotifyTimersEvent(bool bAddedOrDeleted = true);
+
+ enum TimerKind
+ {
+ TimerKindAny = 0,
+ TimerKindTV,
+ TimerKindRadio
+ };
+
+ bool KindMatchesTag(const TimerKind& eKind, const std::shared_ptr<CPVRTimerInfoTag>& tag) const;
+
+ std::shared_ptr<CPVRTimerInfoTag> GetNextActiveTimer(const TimerKind& eKind,
+ bool bIgnoreReminders) const;
+ int AmountActiveTimers(const TimerKind& eKind) const;
+ std::vector<std::shared_ptr<CPVRTimerInfoTag>> GetActiveRecordings(const TimerKind& eKind) const;
+ int AmountActiveRecordings(const TimerKind& eKind) const;
+
+ bool CheckAndAppendTimerNotification(std::vector<std::pair<int, std::string>>& timerNotifications,
+ const std::shared_ptr<CPVRTimerInfoTag>& tag,
+ bool bDeleted) const;
+
+ bool m_bIsUpdating = false;
+ CPVRSettings m_settings;
+ std::queue<std::shared_ptr<CPVRTimerInfoTag>> m_remindersToAnnounce;
+ bool m_bReminderRulesUpdatePending = false;
+
+ bool m_bFirstUpdate = true;
+ std::vector<int> m_failedClients;
+};
+} // namespace PVR