//--------------------------------------------------------------------------- void MediaInfoList_Internal::Close(size_t FilePos) { if (IsRunning()) { RequestTerminate(); while(IsExited()) Yield(); } CriticalSectionLocker CSL(CS); if (FilePos==Unlimited) { for (size_t Pos=0; Pos<Info.size(); Pos++) { delete Info[Pos]; Info[Pos]=NULL; } Info.clear(); } else if (FilePos<Info.size()) { delete Info[FilePos]; Info[FilePos]=NULL; Info.erase(Info.begin()+FilePos); } ToParse_AlreadyDone=0; ToParse_Total=0; }
//--------------------------------------------------------------------------- void QueueElement::stop() { RequestTerminate(); MI_CS.Enter(); if (MI) MI->Option(__T("File_RequestTerminate"), String()); MI_CS.Leave(); while (!IsExited()) Yield(); }
void CConEmuUpdate::StopChecking() { if (MessageBox(NULL, L"Are you sure, stop updates checking?", ms_DefaultTitle, MB_SYSTEMMODAL|MB_ICONQUESTION|MB_YESNO) != IDYES) return; RequestTerminate(); if (mh_CheckThread) { DWORD nWait; if ((nWait = WaitForSingleObject(mh_CheckThread, 0)) == WAIT_TIMEOUT) { RequestTerminate(); nWait = WaitForSingleObject(mh_CheckThread, UPDATETHREADTIMEOUT); } if (nWait != WAIT_OBJECT_0) { TerminateThread(mh_CheckThread, 100); } } DeleteBadTempFiles(); m_UpdateStep = us_NotStarted; if (mpsz_PendingBatchFile) { if (*mpsz_PendingBatchFile) DeleteFile(mpsz_PendingBatchFile); SafeFree(mpsz_PendingBatchFile); } if (mpsz_PendingPackageFile) { if (*mpsz_PendingPackageFile && !(mp_Set && mp_Set->isUpdateLeavePackages)) DeleteFile(mpsz_PendingPackageFile); SafeFree(mpsz_PendingPackageFile); } }
bool CConEmuUpdate::ShowConfirmation() { bool lbConfirm = false; // May be null, if update package was dropped on ConEmu icon if (gpConEmu && ghWnd) { gpConEmu->UpdateProgress(); } if (ms_LastErrorInfo && *ms_LastErrorInfo) { mb_InShowLastError = true; MSectionLock SC; SC.Lock(mp_LastErrorSC, TRUE); wchar_t* pszConfirm = ms_LastErrorInfo; ms_LastErrorInfo = NULL; SC.Unlock(); DontEnable de; int iBtn = MessageBox(NULL, pszConfirm, ms_DefaultTitle, MB_ICONQUESTION|MB_SETFOREGROUND|MB_SYSTEMMODAL|MB_YESNO); SafeFree(pszConfirm); mb_InShowLastError = false; lbConfirm = (iBtn == IDYES); } else { MBoxAssert(ms_LastErrorInfo && *ms_LastErrorInfo); } if (!lbConfirm) { RequestTerminate(); // May be null, if update package was dropped on ConEmu icon if (gpConEmu && ghWnd) { gpConEmu->UpdateProgress(); } } return lbConfirm; }
CConEmuUpdate::~CConEmuUpdate() { if (mh_CheckThread) { DWORD nWait; if ((nWait = WaitForSingleObject(mh_CheckThread, 0)) == WAIT_TIMEOUT) { RequestTerminate(); nWait = WaitForSingleObject(mh_CheckThread, UPDATETHREADTIMEOUT); } if (nWait != WAIT_OBJECT_0) { TerminateThread(mh_CheckThread, 100); } CloseHandle(mh_CheckThread); mh_CheckThread = NULL; } //if (mh_StopThread) //{ // CloseHandle(mh_StopThread); // mh_StopThread = NULL; //} DeleteBadTempFiles(); Inet.Deinit(true); SafeFree(ms_LastErrorInfo); if (mp_LastErrorSC) { delete mp_LastErrorSC; mp_LastErrorSC = NULL; } if (m_UpdateStep == us_ExitAndUpdate && mpsz_PendingBatchFile) { WaitAllInstances(); wchar_t *pszCmd = lstrdup(L"cmd.exe"); // Мало ли что в ComSpec пользователь засунул... size_t cchParmMax = lstrlen(mpsz_PendingBatchFile)+16; wchar_t *pszParm = (wchar_t*)calloc(cchParmMax,sizeof(*pszParm)); // Обязательно двойное окавычивание. cmd.exe отбрасывает кавычки, // и при наличии разделителей (пробелы, скобки,...) получаем проблемы _wsprintf(pszParm, SKIPLEN(cchParmMax) L"/c \"\"%s\"\"", mpsz_PendingBatchFile); // Наверное на Elevated процесс это не распространится, но для четкости - взведем флажок SetEnvironmentVariable(ENV_CONEMU_INUPDATE, ENV_CONEMU_INUPDATE_YES); // ghWnd уже закрыт INT_PTR nShellRc = (INT_PTR)ShellExecute(NULL, bNeedRunElevation ? L"runas" : L"open", pszCmd, pszParm, NULL, SW_SHOWMINIMIZED); if (nShellRc <= 32) { wchar_t szErrInfo[MAX_PATH*4]; _wsprintf(szErrInfo, SKIPLEN(countof(szErrInfo)) L"Failed to start update batch\n%s\nError code=%i", mpsz_PendingBatchFile, (int)nShellRc); MessageBoxW(NULL, szErrInfo, L"ConEmu", MB_ICONSTOP|MB_SYSTEMMODAL); DeleteFile(mpsz_PendingBatchFile); if (!(mp_Set && mp_Set->isUpdateLeavePackages)) DeleteFile(mpsz_PendingPackageFile); } SafeFree(pszCmd); SafeFree(pszParm); } SafeFree(mpsz_PendingBatchFile); SafeFree(mpsz_PendingPackageFile); if (mp_Set) { delete mp_Set; mp_Set = NULL; } }