bool CPluginDirectory::WaitOnScriptResult(const CStdString &scriptPath, int scriptId, const CStdString &scriptName, bool retrievingDir) { const unsigned int timeBeforeProgressBar = 1500; const unsigned int timeToKillScript = 1000; unsigned int startTime = XbmcThreads::SystemClockMillis(); CGUIDialogProgress *progressBar = NULL; bool cancelled = false; bool inMainAppThread = g_application.IsCurrentThread(); CLog::Log(LOGDEBUG, "%s - waiting on the %s (id=%d) plugin...", __FUNCTION__, scriptName.c_str(), scriptId); while (true) { { CSingleExit ex(g_graphicsContext); // check if the python script is finished if (m_fetchComplete.WaitMSec(20)) { // python has returned CLog::Log(LOGDEBUG, "%s- plugin returned %s", __FUNCTION__, m_success ? "successfully" : "failure"); break; } } // check our script is still running if (!CScriptInvocationManager::Get().IsRunning(scriptId)) { // check whether we exited normally if (!m_fetchComplete.WaitMSec(0)) { // python didn't return correctly CLog::Log(LOGDEBUG, " %s - plugin exited prematurely - terminating", __FUNCTION__); m_success = false; } break; } // check whether we should pop up the progress dialog if (!retrievingDir && !progressBar && XbmcThreads::SystemClockMillis() - startTime > timeBeforeProgressBar) { // loading takes more then 1.5 secs, show a progress dialog progressBar = (CGUIDialogProgress *)g_windowManager.GetWindow(WINDOW_DIALOG_PROGRESS); // if script has shown progressbar don't override it if (progressBar && progressBar->IsActive()) { startTime = XbmcThreads::SystemClockMillis(); progressBar = NULL; } if (progressBar) { progressBar->SetHeading(scriptName); progressBar->SetLine(0, retrievingDir ? 1040 : 10214); progressBar->SetLine(1, ""); progressBar->SetLine(2, ""); progressBar->ShowProgressBar(retrievingDir); progressBar->StartModal(); } } if (progressBar) { // update the progress bar and check for user cancel progressBar->Progress(); if (progressBar->IsCanceled()) { // user has cancelled our process - cancel our process m_cancelled = true; } } else // if the progressBar exists and we call StartModal or Progress we get the // ProcessRenderLoop call anyway. if (inMainAppThread) g_windowManager.ProcessRenderLoop(); if (!cancelled && m_cancelled) { cancelled = true; startTime = XbmcThreads::SystemClockMillis(); } if (cancelled && XbmcThreads::SystemClockMillis() - startTime > timeToKillScript) { // cancel our script if (scriptId != -1 && CScriptInvocationManager::Get().IsRunning(scriptId)) { CLog::Log(LOGDEBUG, "%s- cancelling plugin %s (id=%d)", __FUNCTION__, scriptName.c_str(), scriptId); CScriptInvocationManager::Get().Stop(scriptId); break; } } } if (progressBar) CApplicationMessenger::Get().Close(progressBar, false, false); return !cancelled && m_success; }
bool CPluginDirectory::WaitOnScriptResult(const CStdString &scriptPath, const CStdString &scriptName, bool retrievingDir) { const unsigned int timeBeforeProgressBar = 1500; const unsigned int timeToKillScript = 1000; unsigned int startTime = XbmcThreads::SystemClockMillis(); CGUIDialogProgress *progressBar = NULL; CLog::Log(LOGDEBUG, "%s - waiting on the %s plugin...", __FUNCTION__, scriptName.c_str()); while (true) { { CSingleExit ex(g_graphicsContext); // check if the python script is finished if (m_fetchComplete.WaitMSec(20)) { // python has returned CLog::Log(LOGDEBUG, "%s- plugin returned %s", __FUNCTION__, m_success ? "successfully" : "failure"); break; } } // check our script is still running #ifdef HAS_PYTHON if (!g_pythonParser.isRunning(g_pythonParser.getScriptId(scriptPath.c_str()))) #endif { // check whether we exited normally if (!m_fetchComplete.WaitMSec(0)) { // python didn't return correctly CLog::Log(LOGDEBUG, " %s - plugin exited prematurely - terminating", __FUNCTION__); m_success = false; } break; } // check whether we should pop up the progress dialog if (!progressBar && XbmcThreads::SystemClockMillis() - startTime > timeBeforeProgressBar) { // loading takes more then 1.5 secs, show a progress dialog progressBar = (CGUIDialogProgress *)g_windowManager.GetWindow(WINDOW_DIALOG_PROGRESS); // if script has shown progressbar don't override it if (progressBar && progressBar->IsActive()) { startTime = XbmcThreads::SystemClockMillis(); progressBar = NULL; } if (progressBar) { progressBar->SetHeading(scriptName); progressBar->SetLine(0, retrievingDir ? 1040 : 10214); progressBar->SetLine(1, ""); progressBar->SetLine(2, ""); progressBar->ShowProgressBar(retrievingDir); progressBar->StartModal(); } } if (progressBar) { // update the progress bar and check for user cancel if (retrievingDir) { CStdString label; if (m_totalItems > 0) { label.Format(g_localizeStrings.Get(1042).c_str(), m_listItems->Size(), m_totalItems); progressBar->SetPercentage((int)((m_listItems->Size() * 100 ) / m_totalItems)); progressBar->ShowProgressBar(true); } else label.Format(g_localizeStrings.Get(1041).c_str(), m_listItems->Size()); progressBar->SetLine(2, label); } progressBar->Progress(); if (progressBar->IsCanceled()) { // user has cancelled our process - cancel our process if (!m_cancelled) { m_cancelled = true; startTime = XbmcThreads::SystemClockMillis(); } if (m_cancelled && XbmcThreads::SystemClockMillis() - startTime > timeToKillScript) { // cancel our script #ifdef HAS_PYTHON int id = g_pythonParser.getScriptId(scriptPath.c_str()); if (id != -1 && g_pythonParser.isRunning(id)) { CLog::Log(LOGDEBUG, "%s- cancelling plugin %s", __FUNCTION__, scriptName.c_str()); g_pythonParser.stopScript(id); break; } #endif } } } } if (progressBar) CApplicationMessenger::Get().Close(progressBar, false, false); return !m_cancelled && m_success; }