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.
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"
27 std::string
CEventLog::EventLevelToString(EventLevel level
)
31 case EventLevel::Basic
:
34 case EventLevel::Warning
:
37 case EventLevel::Error
:
40 case EventLevel::Information
:
48 EventLevel
CEventLog::EventLevelFromString(const std::string
& level
)
51 return EventLevel::Basic
;
52 if (level
== "warning")
53 return EventLevel::Warning
;
55 return EventLevel::Error
;
57 return EventLevel::Information
;
60 Events
CEventLog::Get() const
65 Events
CEventLog::Get(EventLevel level
, bool includeHigherLevels
/* = false */) const
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
);
80 EventPtr
CEventLog::Get(const std::string
& eventPtrIdentifier
) const
82 if (eventPtrIdentifier
.empty())
85 std::unique_lock
<CCriticalSection
> lock(m_critical
);
86 const auto& eventPtr
= m_eventsMap
.find(eventPtrIdentifier
);
87 if (eventPtr
== m_eventsMap
.end())
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
)))
100 std::unique_lock
<CCriticalSection
> lock(m_critical
);
101 if (m_eventsMap
.find(eventPtr
->GetIdentifier()) != m_eventsMap
.end())
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
)
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)
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
);
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)
154 Remove(eventPtr
->GetIdentifier());
157 void CEventLog::Remove(const std::string
& eventPtrIdentifier
)
159 if (eventPtrIdentifier
.empty())
162 std::unique_lock
<CCriticalSection
> lock(m_critical
);
163 const auto& itEvent
= m_eventsMap
.find(eventPtrIdentifier
);
164 if (itEvent
== m_eventsMap
.end())
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
);
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
))
193 bool CEventLog::Execute(const std::string
& eventPtrIdentifier
)
195 if (eventPtrIdentifier
.empty())
198 std::unique_lock
<CCriticalSection
> lock(m_critical
);
199 const auto& itEvent
= m_eventsMap
.find(eventPtrIdentifier
);
200 if (itEvent
== m_eventsMap
.end())
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
)
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
);