[PVR][Estuary] Timer settings dialog: Show client name in timer type selection dialog...
[xbmc.git] / xbmc / interfaces / generic / LanguageInvokerThread.cpp
blob67f3d1487522ef6adb6776dc17ad55126643ba0d
1 /*
2 * Copyright (C) 2013-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 "LanguageInvokerThread.h"
11 #include "ScriptInvocationManager.h"
13 #include <utility>
15 CLanguageInvokerThread::CLanguageInvokerThread(LanguageInvokerPtr invoker,
16 CScriptInvocationManager* invocationManager,
17 bool reuseable)
18 : ILanguageInvoker(NULL),
19 CThread("LanguageInvoker"),
20 m_invoker(std::move(invoker)),
21 m_invocationManager(invocationManager),
22 m_reusable(reuseable)
23 { }
25 CLanguageInvokerThread::~CLanguageInvokerThread()
27 Stop(true);
30 InvokerState CLanguageInvokerThread::GetState() const
32 if (m_invoker == NULL)
33 return InvokerStateFailed;
35 return m_invoker->GetState();
38 void CLanguageInvokerThread::Release()
40 m_bStop = true;
41 m_condition.notify_one();
44 bool CLanguageInvokerThread::execute(const std::string &script, const std::vector<std::string> &arguments)
46 if (m_invoker == NULL || script.empty())
47 return false;
49 m_script = script;
50 m_args = arguments;
52 if (CThread::IsRunning())
54 std::unique_lock<std::mutex> lck(m_mutex);
55 m_restart = true;
56 m_condition.notify_one();
58 else
59 Create();
61 //Todo wait until running
63 return true;
66 bool CLanguageInvokerThread::stop(bool wait)
68 if (m_invoker == NULL)
69 return false;
71 if (!CThread::IsRunning())
72 return false;
74 Release();
76 bool result = true;
77 if (m_invoker->GetState() < InvokerStateExecutionDone)
79 // stop the language-specific invoker
80 result = m_invoker->Stop(wait);
82 // stop the thread
83 CThread::StopThread(wait);
85 return result;
88 void CLanguageInvokerThread::OnStartup()
90 if (m_invoker == NULL)
91 return;
93 m_invoker->SetId(GetId());
94 if (m_addon != NULL)
95 m_invoker->SetAddon(m_addon);
98 void CLanguageInvokerThread::Process()
100 if (m_invoker == NULL)
101 return;
103 std::unique_lock<std::mutex> lckdl(m_mutex);
106 m_restart = false;
107 m_invoker->Execute(m_script, m_args);
109 if (m_invoker->GetState() != InvokerStateScriptDone)
110 m_reusable = false;
112 m_condition.wait(lckdl, [this] { return m_bStop || m_restart || !m_reusable; });
114 } while (m_reusable && !m_bStop);
117 void CLanguageInvokerThread::OnExit()
119 if (m_invoker == NULL)
120 return;
122 m_invoker->onExecutionDone();
123 m_invocationManager->OnExecutionDone(GetId());
126 void CLanguageInvokerThread::OnException()
128 if (m_invoker == NULL)
129 return;
131 m_invoker->onExecutionFailed();
132 m_invocationManager->OnExecutionDone(GetId());