kodi
ApplicationStackHelper.h
1 /*
2  * Copyright (C) 2017-2018 Team Kodi
3  * This file is part of Kodi - https://kodi.tv
4  *
5  * SPDX-License-Identifier: GPL-2.0-or-later
6  * See LICENSES/README.md for more information.
7  */
8 
9 #pragma once
10 
11 #include "application/IApplicationComponent.h"
12 #include "threads/CriticalSection.h"
13 
14 #include <map>
15 #include <memory>
16 #include <optional>
17 #include <string>
18 
19 class CFileItem;
20 class CFileItemList;
21 
23 {
24 public:
26  ~CApplicationStackHelper() = default;
27 
28  void Clear();
29  void OnPlayBackStarted(const CFileItem& item);
30 
35  bool InitializeStack(const CFileItem& item);
36 
42  std::optional<int64_t> InitializeStackStartPartAndOffset(const CFileItem& item);
43 
47  int GetCurrentPartNumber() const { return m_currentStackPosition; }
48 
52  bool IsPlayingISOStack() const;
53 
57  bool IsPlayingRegularStack() const;
58 
62  bool HasNextStackPartFileItem() const;
63 
68  {
69  return GetStackPartFileItem(++m_currentStackPosition);
70  }
71 
76  const CFileItem& SetStackPartCurrentFileItem(int partNumber)
77  {
78  return GetStackPartFileItem(m_currentStackPosition = partNumber);
79  }
80 
85  {
86  return GetStackPartFileItem(m_currentStackPosition);
87  }
88 
93  uint64_t GetStackPartEndTimeMs(int partNumber) const;
94 
99  uint64_t GetStackPartStartTimeMs(int partNumber) const { return (partNumber > 0) ? GetStackPartEndTimeMs(partNumber - 1) : 0; }
100 
104  uint64_t GetCurrentStackPartStartTimeMs() const { return GetStackPartStartTimeMs(m_currentStackPosition); }
105 
109  uint64_t GetStackTotalTimeMs() const;
110 
115  int GetStackPartNumberAtTimeMs(uint64_t msecs);
116 
117  // Stack information registration methods
118 
123 
127  std::shared_ptr<const CFileItem> GetRegisteredStack(const CFileItem& item) const;
128 
133  bool HasRegisteredStack(const CFileItem& item) const;
134 
140  void SetRegisteredStack(const CFileItem& item, std::shared_ptr<CFileItem> stackItem);
141 
146  int GetRegisteredStackPartNumber(const CFileItem& item);
147 
153  void SetRegisteredStackPartNumber(const CFileItem& item, int partNumber);
154 
159  uint64_t GetRegisteredStackPartStartTimeMs(const CFileItem& item) const;
160 
166  void SetRegisteredStackPartStartTimeMs(const CFileItem& item, uint64_t startTimeMs);
167 
172  uint64_t GetRegisteredStackTotalTimeMs(const CFileItem& item) const;
173 
179  void SetRegisteredStackTotalTimeMs(const CFileItem& item, uint64_t totalTimeMs);
180 
181  CCriticalSection m_critSection;
182 
183 protected:
188  CFileItem& GetStackPartFileItem(int partNumber);
189  const CFileItem& GetStackPartFileItem(int partNumber) const;
190 
192  {
193  public:
195  {
196  m_lStackPartNumber = 0;
197  m_lStackPartStartTimeMs = 0;
198  m_lStackTotalTimeMs = 0;
199  };
200  uint64_t m_lStackPartStartTimeMs;
201  uint64_t m_lStackTotalTimeMs;
202  int m_lStackPartNumber;
203  std::shared_ptr<CFileItem> m_pStack;
204  };
205 
206  typedef std::shared_ptr<StackPartInformation> StackPartInformationPtr;
207  typedef std::map<std::string, StackPartInformationPtr> Stackmap;
208  Stackmap m_stackmap;
209  StackPartInformationPtr GetStackPartInformation(const std::string& key);
210  StackPartInformationPtr GetStackPartInformation(const std::string& key) const;
211 
212  std::unique_ptr<CFileItemList> m_currentStack;
213  int m_currentStackPosition = 0;
214  bool m_currentStackIsDiscImageStack = false;
215 };
Definition: ApplicationStackHelper.h:22
uint64_t GetCurrentStackPartStartTimeMs() const
Returns the start time of the current FileItem part of a (non-ISO) stack playback.
Definition: ApplicationStackHelper.h:104
bool HasRegisteredStack(const CFileItem &item) const
Returns true if there is a registered stack for the given CFileItem part.
Definition: ApplicationStackHelper.cpp:264
uint64_t GetStackPartEndTimeMs(int partNumber) const
Returns the end time of a FileItem part of a (non-ISO) stack playback.
Definition: ApplicationStackHelper.cpp:229
const CFileItem & SetStackPartCurrentFileItem(int partNumber)
sets a given stack part as the current and returns a reference to it
Definition: ApplicationStackHelper.h:76
uint64_t GetRegisteredStackPartStartTimeMs(const CFileItem &item) const
Returns the start time of the part in the parameter.
Definition: ApplicationStackHelper.cpp:296
int GetStackPartNumberAtTimeMs(uint64_t msecs)
Returns the stack part number corresponding to the given timestamp in a (non-ISO) stack playback...
Definition: ApplicationStackHelper.cpp:239
uint64_t GetRegisteredStackTotalTimeMs(const CFileItem &item) const
Returns the total time of the stack associated to the part in the parameter.
Definition: ApplicationStackHelper.cpp:306
bool IsPlayingISOStack() const
Returns true if Application is currently playing an ISO stack.
Definition: ApplicationStackHelper.cpp:214
void SetRegisteredStackPartStartTimeMs(const CFileItem &item, uint64_t startTimeMs)
Stores the part start time in the item-stack map.
Definition: ApplicationStackHelper.cpp:301
Represents a list of files.
Definition: FileItem.h:702
uint64_t GetStackTotalTimeMs() const
Returns the total time of a (non-ISO) stack playback.
Definition: ApplicationStackHelper.cpp:234
void SetRegisteredStackPartNumber(const CFileItem &item, int partNumber)
Stores the part number in the item-stack map.
Definition: ApplicationStackHelper.cpp:291
bool HasNextStackPartFileItem() const
returns true if there is a next part available
Definition: ApplicationStackHelper.cpp:224
const CFileItem & SetNextStackPartCurrentFileItem()
sets the next stack part as the current and returns a reference to it
Definition: ApplicationStackHelper.h:67
bool IsPlayingRegularStack() const
Returns true if Application is currently playing a Regular (non-ISO) stack.
Definition: ApplicationStackHelper.cpp:219
int GetRegisteredStackPartNumber(const CFileItem &item)
Returns the part number of the part in the parameter.
Definition: ApplicationStackHelper.cpp:286
uint64_t GetStackPartStartTimeMs(int partNumber) const
Returns the start time of a FileItem part of a (non-ISO) stack playback.
Definition: ApplicationStackHelper.h:99
bool InitializeStack(const CFileItem &item)
Initialize stack.
Definition: ApplicationStackHelper.cpp:60
void SetRegisteredStack(const CFileItem &item, std::shared_ptr< CFileItem > stackItem)
Stores a smart pointer to the stack CFileItem in the item-stack map.
Definition: ApplicationStackHelper.cpp:270
const CFileItem & GetCurrentStackPartFileItem() const
Returns the FileItem currently playing back as part of a (non-ISO) stack playback.
Definition: ApplicationStackHelper.h:84
std::optional< int64_t > InitializeStackStartPartAndOffset(const CFileItem &item)
Initialize stack times for each part, start & end, total time, and current part number if resume offs...
Definition: ApplicationStackHelper.cpp:84
CFileItem & GetStackPartFileItem(int partNumber)
Returns a FileItem part of a (non-ISO) stack playback.
Definition: ApplicationStackHelper.cpp:276
Base class for application components.
Definition: IApplicationComponent.h:12
void SetRegisteredStackTotalTimeMs(const CFileItem &item, uint64_t totalTimeMs)
Stores the stack&#39;s total time associated to the part in the item-stack map.
Definition: ApplicationStackHelper.cpp:311
int GetCurrentPartNumber() const
returns the current part number
Definition: ApplicationStackHelper.h:47
std::shared_ptr< const CFileItem > GetRegisteredStack(const CFileItem &item) const
Returns a smart pointer to the stack CFileItem.
Definition: ApplicationStackHelper.cpp:258
Definition: ApplicationStackHelper.h:191
void ClearAllRegisteredStackInformation()
Clear all entries in the item-stack map. To be called upon playback stopped.
Definition: ApplicationStackHelper.cpp:253
Represents a file on a share.
Definition: FileItem.h:102