aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiguel Borges de Freitas <92enen@gmail.com>2024-03-23 10:37:11 +0000
committerGitHub <noreply@github.com>2024-03-23 10:37:11 +0000
commiteea5308b40b478e63bdc051907018c9c4c7a66d0 (patch)
treec65d69e95ad986971bc8248fc9427a83d3283b56
parente03cbeb54de45bfb6cf2537483c26491d3e73f4b (diff)
parent9fe92dd4843ea77ad0259640dcefe1fb50f8ce87 (diff)
Merge pull request #24880 from enen92/handle_stack_errors
stacks: make InitializeStackStartPartAndOffset return optional and ha…
-rw-r--r--xbmc/application/Application.cpp10
-rw-r--r--xbmc/application/ApplicationStackHelper.cpp4
-rw-r--r--xbmc/application/ApplicationStackHelper.h4
3 files changed, 13 insertions, 5 deletions
diff --git a/xbmc/application/Application.cpp b/xbmc/application/Application.cpp
index cf45deafb5..d3bc14d33c 100644
--- a/xbmc/application/Application.cpp
+++ b/xbmc/application/Application.cpp
@@ -2264,10 +2264,16 @@ bool CApplication::PlayStack(CFileItem& item, bool bRestart)
if (!stackHelper->InitializeStack(item))
return false;
- int startoffset = stackHelper->InitializeStackStartPartAndOffset(item);
+ std::optional<int> startoffset = stackHelper->InitializeStackStartPartAndOffset(item);
+ if (!startoffset)
+ {
+ CLog::LogF(LOGERROR, "Failed to obtain start offset for stack {}. Aborting playback.",
+ item.GetDynPath());
+ return false;
+ }
CFileItem selectedStackPart = stackHelper->GetCurrentStackPartFileItem();
- selectedStackPart.SetStartOffset(startoffset);
+ selectedStackPart.SetStartOffset(startoffset.value());
if (item.HasProperty("savedplayerstate"))
{
diff --git a/xbmc/application/ApplicationStackHelper.cpp b/xbmc/application/ApplicationStackHelper.cpp
index 4e62388a62..fbc7219bd5 100644
--- a/xbmc/application/ApplicationStackHelper.cpp
+++ b/xbmc/application/ApplicationStackHelper.cpp
@@ -81,7 +81,7 @@ bool CApplicationStackHelper::InitializeStack(const CFileItem & item)
return true;
}
-int CApplicationStackHelper::InitializeStackStartPartAndOffset(const CFileItem& item)
+std::optional<int> CApplicationStackHelper::InitializeStackStartPartAndOffset(const CFileItem& item)
{
CVideoDatabase dbs;
int64_t startoffset = 0;
@@ -163,7 +163,7 @@ int CApplicationStackHelper::InitializeStackStartPartAndOffset(const CFileItem&
if (!CDVDFileInfo::GetFileDuration(GetStackPartFileItem(i).GetDynPath(), duration))
{
m_currentStack->Clear();
- return false;
+ return std::nullopt;
}
totalTimeMs += duration;
// set end time in every part
diff --git a/xbmc/application/ApplicationStackHelper.h b/xbmc/application/ApplicationStackHelper.h
index 6af0044372..4cdbc39e42 100644
--- a/xbmc/application/ApplicationStackHelper.h
+++ b/xbmc/application/ApplicationStackHelper.h
@@ -13,6 +13,7 @@
#include <map>
#include <memory>
+#include <optional>
#include <string>
class CFileItem;
@@ -36,8 +37,9 @@ public:
/*!
\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
+ \returns the part offset if available, nullopt in case of errors
*/
- int InitializeStackStartPartAndOffset(const CFileItem& item);
+ std::optional<int> InitializeStackStartPartAndOffset(const CFileItem& item);
/*!
\brief returns the current part number