[Windows] Fix driver version detection of AMD RDNA+ GPU on Windows 10
[xbmc.git] / xbmc / addons / AddonStatusHandler.cpp
blobb9a3f4fd16f85f2f738fa66263874b03df7b06e9
1 /*
2 * Copyright (C) 2005-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
7 */
8 #include "AddonStatusHandler.h"
10 #include "ServiceBroker.h"
11 #include "addons/AddonManager.h"
12 #include "addons/IAddonManagerCallback.h"
13 #include "addons/addoninfo/AddonInfo.h"
14 #include "addons/gui/GUIDialogAddonSettings.h"
15 #include "dialogs/GUIDialogKaiToast.h"
16 #include "dialogs/GUIDialogYesNo.h"
17 #include "guilib/GUIComponent.h"
18 #include "guilib/GUIWindowManager.h"
19 #include "messaging/ApplicationMessenger.h"
20 #include "messaging/helpers/DialogOKHelper.h"
21 #include "utils/StringUtils.h"
22 #include "utils/Variant.h"
23 #include "utils/log.h"
25 #include <mutex>
26 #include <utility>
28 using namespace KODI::MESSAGING;
30 namespace ADDON
33 /**********************************************************
34 * CAddonStatusHandler - AddOn Status Report Class
36 * Used to inform the user about occurred errors and
37 * changes inside Add-on's, and ask him what to do.
41 CCriticalSection CAddonStatusHandler::m_critSection;
43 CAddonStatusHandler::CAddonStatusHandler(const std::string& addonID,
44 AddonInstanceId instanceId,
45 ADDON_STATUS status,
46 bool sameThread)
47 : CThread(("AddonStatus " + std::to_string(instanceId) + "@" + addonID).c_str()),
48 m_instanceId(instanceId)
50 //! @todo The status handled CAddonStatusHandler by is related to the class, not the instance
51 //! having CAddonMgr construct an instance makes no sense
52 if (!CServiceBroker::GetAddonMgr().GetAddon(addonID, m_addon, OnlyEnabled::CHOICE_YES))
53 return;
55 CLog::Log(LOGINFO,
56 "Called Add-on status handler for '{}' of clientName:{}, clientID:{}, instanceID:{} "
57 "(same Thread={})",
58 status, m_addon->Name(), m_addon->ID(), m_instanceId, sameThread ? "yes" : "no");
60 m_status = status;
62 if (sameThread)
64 Process();
66 else
68 Create(true);
72 CAddonStatusHandler::~CAddonStatusHandler()
74 StopThread();
77 void CAddonStatusHandler::OnStartup()
79 SetPriority(ThreadPriority::LOWEST);
82 void CAddonStatusHandler::OnExit()
86 void CAddonStatusHandler::Process()
88 std::unique_lock<CCriticalSection> lock(m_critSection);
90 std::string heading = StringUtils::Format(
91 "{}: {}", CAddonInfo::TranslateType(m_addon->Type(), true), m_addon->Name());
93 /* Request to restart the AddOn and data structures need updated */
94 if (m_status == ADDON_STATUS_NEED_RESTART)
96 HELPERS::ShowOKDialogLines(CVariant{heading}, CVariant{24074});
97 CServiceBroker::GetAddonMgr()
98 .GetCallbackForType(m_addon->Type())
99 ->RequestRestart(m_addon->ID(), m_instanceId, true);
101 /* Some required settings are missing/invalid */
102 else if (m_status == ADDON_STATUS_NEED_SETTINGS)
104 CGUIDialogYesNo* pDialogYesNo = CServiceBroker::GetGUI()->GetWindowManager().GetWindow<CGUIDialogYesNo>(WINDOW_DIALOG_YES_NO);
105 if (!pDialogYesNo) return;
107 pDialogYesNo->SetHeading(CVariant{heading});
108 pDialogYesNo->SetLine(1, CVariant{24070});
109 pDialogYesNo->SetLine(2, CVariant{24072});
110 pDialogYesNo->Open();
112 if (!pDialogYesNo->IsConfirmed()) return;
114 if (!m_addon->HasSettings(m_instanceId))
115 return;
117 if (CGUIDialogAddonSettings::ShowForAddon(m_addon))
119 //! @todo Doesn't dialogaddonsettings save these automatically? It should do this.
120 m_addon->SaveSettings(m_instanceId);
121 CServiceBroker::GetAddonMgr()
122 .GetCallbackForType(m_addon->Type())
123 ->RequestRestart(m_addon->ID(), m_instanceId, true);
129 } /*namespace ADDON*/