summaryrefslogtreecommitdiffstats
path: root/xbmc/application/ApplicationStackHelper.h
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/application/ApplicationStackHelper.h')
-rw-r--r--xbmc/application/ApplicationStackHelper.h213
1 files changed, 213 insertions, 0 deletions
diff --git a/xbmc/application/ApplicationStackHelper.h b/xbmc/application/ApplicationStackHelper.h
new file mode 100644
index 0000000..6af0044
--- /dev/null
+++ b/xbmc/application/ApplicationStackHelper.h
@@ -0,0 +1,213 @@
+/*
+ * Copyright (C) 2017-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 "application/IApplicationComponent.h"
+#include "threads/CriticalSection.h"
+
+#include <map>
+#include <memory>
+#include <string>
+
+class CFileItem;
+class CFileItemList;
+
+class CApplicationStackHelper : public IApplicationComponent
+{
+public:
+ CApplicationStackHelper(void);
+ ~CApplicationStackHelper() = default;
+
+ void Clear();
+ void OnPlayBackStarted(const CFileItem& item);
+
+ /*!
+ \brief Initialize stack
+ \param item the FileItem object that is the stack
+ */
+ bool InitializeStack(const CFileItem& item);
+
+ /*!
+ \brief Initialize stack times for each part, start & end, total time, and current part number if resume offset is specified.
+ \param item the FileItem object that is the stack
+ */
+ int InitializeStackStartPartAndOffset(const CFileItem& item);
+
+ /*!
+ \brief returns the current part number
+ */
+ int GetCurrentPartNumber() const { return m_currentStackPosition; }
+
+ /*!
+ \brief Returns true if Application is currently playing an ISO stack
+ */
+ bool IsPlayingISOStack() const;
+
+ /*!
+ \brief Returns true if Application is currently playing a Regular (non-ISO) stack
+ */
+ bool IsPlayingRegularStack() const;
+
+ /*!
+ \brief returns true if there is a next part available
+ */
+ bool HasNextStackPartFileItem() const;
+
+ /*!
+ \brief sets the next stack part as the current and returns a reference to it
+ */
+ const CFileItem& SetNextStackPartCurrentFileItem()
+ {
+ return GetStackPartFileItem(++m_currentStackPosition);
+ }
+
+ /*!
+ \brief sets a given stack part as the current and returns a reference to it
+ \param partNumber the number of the part that needs to become the current one
+ */
+ const CFileItem& SetStackPartCurrentFileItem(int partNumber)
+ {
+ return GetStackPartFileItem(m_currentStackPosition = partNumber);
+ }
+
+ /*!
+ \brief Returns the FileItem currently playing back as part of a (non-ISO) stack playback
+ */
+ const CFileItem& GetCurrentStackPartFileItem() const
+ {
+ return GetStackPartFileItem(m_currentStackPosition);
+ }
+
+ /*!
+ \brief Returns the end time of a FileItem part of a (non-ISO) stack playback
+ \param partNumber the requested part number in the stack
+ */
+ uint64_t GetStackPartEndTimeMs(int partNumber) const;
+
+ /*!
+ \brief Returns the start time of a FileItem part of a (non-ISO) stack playback
+ \param partNumber the requested part number in the stack
+ */
+ uint64_t GetStackPartStartTimeMs(int partNumber) const { return (partNumber > 0) ? GetStackPartEndTimeMs(partNumber - 1) : 0; }
+
+ /*!
+ \brief Returns the start time of the current FileItem part of a (non-ISO) stack playback
+ */
+ uint64_t GetCurrentStackPartStartTimeMs() const { return GetStackPartStartTimeMs(m_currentStackPosition); }
+
+ /*!
+ \brief Returns the total time of a (non-ISO) stack playback
+ */
+ uint64_t GetStackTotalTimeMs() const;
+
+ /*!
+ \brief Returns the stack part number corresponding to the given timestamp in a (non-ISO) stack playback
+ \param msecs the requested timestamp in the stack (in milliseconds)
+ */
+ int GetStackPartNumberAtTimeMs(uint64_t msecs);
+
+ // Stack information registration methods
+
+ /*!
+ \brief Clear all entries in the item-stack map. To be called upon playback stopped.
+ */
+ void ClearAllRegisteredStackInformation();
+
+ /*!
+ \brief Returns a smart pointer to the stack CFileItem.
+ */
+ std::shared_ptr<const CFileItem> GetRegisteredStack(const CFileItem& item) const;
+
+ /*!
+ \brief Returns true if there is a registered stack for the given CFileItem part.
+ \param item the reference to the item that is part of a stack
+ */
+ bool HasRegisteredStack(const CFileItem& item) const;
+
+ /*!
+ \brief Stores a smart pointer to the stack CFileItem in the item-stack map.
+ \param item the reference to the item that is part of a stack
+ \param stackItem the smart pointer to the stack CFileItem
+ */
+ void SetRegisteredStack(const CFileItem& item, std::shared_ptr<CFileItem> stackItem);
+
+ /*!
+ \brief Returns the part number of the part in the parameter
+ \param item the reference to the item that is part of a stack
+ */
+ int GetRegisteredStackPartNumber(const CFileItem& item);
+
+ /*!
+ \brief Stores the part number in the item-stack map.
+ \param item the reference to the item that is part of a stack
+ \param partNumber the part number of the part in other parameter
+ */
+ void SetRegisteredStackPartNumber(const CFileItem& item, int partNumber);
+
+ /*!
+ \brief Returns the start time of the part in the parameter
+ \param item the reference to the item that is part of a stack
+ */
+ uint64_t GetRegisteredStackPartStartTimeMs(const CFileItem& item) const;
+
+ /*!
+ \brief Stores the part start time in the item-stack map.
+ \param item the reference to the item that is part of a stack
+ \param startTime the start time of the part in other parameter
+ */
+ void SetRegisteredStackPartStartTimeMs(const CFileItem& item, uint64_t startTimeMs);
+
+ /*!
+ \brief Returns the total time of the stack associated to the part in the parameter
+ \param item the reference to the item that is part of a stack
+ */
+ uint64_t GetRegisteredStackTotalTimeMs(const CFileItem& item) const;
+
+ /*!
+ \brief Stores the stack's total time associated to the part in the item-stack map.
+ \param item the reference to the item that is part of a stack
+ \param totalTime the total time of the stack
+ */
+ void SetRegisteredStackTotalTimeMs(const CFileItem& item, uint64_t totalTimeMs);
+
+ CCriticalSection m_critSection;
+
+protected:
+ /*!
+ \brief Returns a FileItem part of a (non-ISO) stack playback
+ \param partNumber the requested part number in the stack
+ */
+ CFileItem& GetStackPartFileItem(int partNumber);
+ const CFileItem& GetStackPartFileItem(int partNumber) const;
+
+ class StackPartInformation
+ {
+ public:
+ StackPartInformation()
+ {
+ m_lStackPartNumber = 0;
+ m_lStackPartStartTimeMs = 0;
+ m_lStackTotalTimeMs = 0;
+ };
+ uint64_t m_lStackPartStartTimeMs;
+ uint64_t m_lStackTotalTimeMs;
+ int m_lStackPartNumber;
+ std::shared_ptr<CFileItem> m_pStack;
+ };
+
+ typedef std::shared_ptr<StackPartInformation> StackPartInformationPtr;
+ typedef std::map<std::string, StackPartInformationPtr> Stackmap;
+ Stackmap m_stackmap;
+ StackPartInformationPtr GetStackPartInformation(const std::string& key);
+ StackPartInformationPtr GetStackPartInformation(const std::string& key) const;
+
+ std::unique_ptr<CFileItemList> m_currentStack;
+ int m_currentStackPosition = 0;
+ bool m_currentStackIsDiscImageStack = false;
+};