[Windows] Fix driver version detection of AMD RDNA+ GPU on Windows 10
[xbmc.git] / xbmc / events / EventLog.cpp
blob89eff93195a139cb9aef8b8585c19cf872f14a86
1 /*
2 * Copyright (C) 2015-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 */
9 #include "EventLog.h"
11 #include "FileItem.h"
12 #include "GUIUserMessages.h"
13 #include "ServiceBroker.h"
14 #include "dialogs/GUIDialogKaiToast.h"
15 #include "dialogs/GUIDialogSelect.h"
16 #include "filesystem/EventsDirectory.h"
17 #include "guilib/GUIComponent.h"
18 #include "guilib/GUIWindowManager.h"
19 #include "guilib/WindowIDs.h"
20 #include "profiles/ProfileManager.h"
21 #include "settings/Settings.h"
22 #include "settings/SettingsComponent.h"
24 #include <mutex>
25 #include <utility>
27 std::string CEventLog::EventLevelToString(EventLevel level)
29 switch (level)
31 case EventLevel::Basic:
32 return "basic";
34 case EventLevel::Warning:
35 return "warning";
37 case EventLevel::Error:
38 return "error";
40 case EventLevel::Information:
41 default:
42 break;
45 return "information";
48 EventLevel CEventLog::EventLevelFromString(const std::string& level)
50 if (level == "basic")
51 return EventLevel::Basic;
52 if (level == "warning")
53 return EventLevel::Warning;
54 if (level == "error")
55 return EventLevel::Error;
57 return EventLevel::Information;
60 Events CEventLog::Get() const
62 return m_events;
65 Events CEventLog::Get(EventLevel level, bool includeHigherLevels /* = false */) const
67 Events events;
69 std::unique_lock<CCriticalSection> lock(m_critical);
70 for (const auto& eventPtr : m_events)
72 if (eventPtr->GetLevel() == level ||
73 (includeHigherLevels && eventPtr->GetLevel() > level))
74 events.push_back(eventPtr);
77 return events;
80 EventPtr CEventLog::Get(const std::string& eventPtrIdentifier) const
82 if (eventPtrIdentifier.empty())
83 return EventPtr();
85 std::unique_lock<CCriticalSection> lock(m_critical);
86 const auto& eventPtr = m_eventsMap.find(eventPtrIdentifier);
87 if (eventPtr == m_eventsMap.end())
88 return EventPtr();
90 return eventPtr->second;
93 void CEventLog::Add(const EventPtr& eventPtr)
95 if (eventPtr == nullptr || eventPtr->GetIdentifier().empty() ||
96 !CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool(CSettings::SETTING_EVENTLOG_ENABLED) ||
97 (eventPtr->GetLevel() == EventLevel::Information && !CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool(CSettings::SETTING_EVENTLOG_ENABLED_NOTIFICATIONS)))
98 return;
100 std::unique_lock<CCriticalSection> lock(m_critical);
101 if (m_eventsMap.find(eventPtr->GetIdentifier()) != m_eventsMap.end())
102 return;
104 // store the event
105 m_events.push_back(eventPtr);
106 m_eventsMap.insert(std::make_pair(eventPtr->GetIdentifier(), eventPtr));
108 SendMessage(eventPtr, GUI_MSG_EVENT_ADDED);
111 void CEventLog::Add(const EventPtr& eventPtr, bool withNotification, bool withSound /* = true */)
113 if (!withNotification)
114 Add(eventPtr);
115 else
116 AddWithNotification(eventPtr, withSound);
119 void CEventLog::AddWithNotification(const EventPtr& eventPtr,
120 unsigned int displayTime /* = NOTIFICATION_DISPLAY_TIME */,
121 unsigned int messageTime /* = NOTIFICATION_MESSAGE_TIME */,
122 bool withSound /* = true */)
124 if (eventPtr == nullptr)
125 return;
127 Add(eventPtr);
129 // queue the eventPtr as a kai toast notification
130 if (!eventPtr->GetIcon().empty())
131 CGUIDialogKaiToast::QueueNotification(eventPtr->GetIcon(), eventPtr->GetLabel(), eventPtr->GetDescription(), displayTime, withSound, messageTime);
132 else
134 CGUIDialogKaiToast::eMessageType type = CGUIDialogKaiToast::Info;
135 if (eventPtr->GetLevel() == EventLevel::Warning)
136 type = CGUIDialogKaiToast::Warning;
137 else if (eventPtr->GetLevel() == EventLevel::Error)
138 type = CGUIDialogKaiToast::Error;
140 CGUIDialogKaiToast::QueueNotification(type, eventPtr->GetLabel(), eventPtr->GetDescription(), displayTime, withSound, messageTime);
144 void CEventLog::AddWithNotification(const EventPtr& eventPtr, bool withSound)
146 AddWithNotification(eventPtr, NOTIFICATION_DISPLAY_TIME, NOTIFICATION_MESSAGE_TIME, withSound);
149 void CEventLog::Remove(const EventPtr& eventPtr)
151 if (eventPtr == nullptr)
152 return;
154 Remove(eventPtr->GetIdentifier());
157 void CEventLog::Remove(const std::string& eventPtrIdentifier)
159 if (eventPtrIdentifier.empty())
160 return;
162 std::unique_lock<CCriticalSection> lock(m_critical);
163 const auto& itEvent = m_eventsMap.find(eventPtrIdentifier);
164 if (itEvent == m_eventsMap.end())
165 return;
167 EventPtr eventPtr = itEvent->second;
168 m_eventsMap.erase(itEvent);
169 m_events.erase(std::remove(m_events.begin(), m_events.end(), eventPtr), m_events.end());
171 SendMessage(eventPtr, GUI_MSG_EVENT_REMOVED);
174 void CEventLog::Clear()
176 std::unique_lock<CCriticalSection> lock(m_critical);
177 m_events.clear();
178 m_eventsMap.clear();
181 void CEventLog::Clear(EventLevel level, bool includeHigherLevels /* = false */)
183 EventsList eventsCopy = m_events;
184 for (const auto& eventPtr : eventsCopy)
187 if (eventPtr->GetLevel() == level ||
188 (includeHigherLevels && eventPtr->GetLevel() > level))
189 Remove(eventPtr);
193 bool CEventLog::Execute(const std::string& eventPtrIdentifier)
195 if (eventPtrIdentifier.empty())
196 return false;
198 std::unique_lock<CCriticalSection> lock(m_critical);
199 const auto& itEvent = m_eventsMap.find(eventPtrIdentifier);
200 if (itEvent == m_eventsMap.end())
201 return false;
203 return itEvent->second->Execute();
206 void CEventLog::ShowFullEventLog(EventLevel level /* = EventLevel::Basic */, bool includeHigherLevels /* = true */)
208 // put together the path
209 std::string path = "events://";
210 if (level != EventLevel::Basic || !includeHigherLevels)
212 // add the level to the path
213 path += EventLevelToString(level);
214 // add whether to include higher levels or not to the path
215 if (includeHigherLevels)
216 path += "+";
219 // activate the full eventPtr log window
220 std::vector<std::string> params;
221 params.push_back(path);
222 params.emplace_back("return");
223 CServiceBroker::GetGUI()->GetWindowManager().ActivateWindow(WINDOW_EVENT_LOG, params);
226 void CEventLog::SendMessage(const EventPtr& eventPtr, int message)
228 CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, message, 0, XFILE::CEventsDirectory::EventToFileItem(eventPtr));
229 CServiceBroker::GetGUI()->GetWindowManager().SendThreadMessage(msg);