bool CCheckForUpdatesDlg::Download(CString filename) { CString destFilename = GetDownloadsDirectory() + filename; if (PathFileExists(destFilename)) { if (VerifySignature(destFilename)) return true; else DeleteFile(destFilename); } CBSCallbackImpl bsc(this->GetSafeHwnd(), m_eventStop); CString url = m_sFilesURL + filename; m_progress.SetRange32(0, 1); m_progress.SetPos(0); m_progress.ShowWindow(SW_SHOW); CString tempfile = CTempFiles::Instance().GetTempFilePath(true).GetWinPathString(); HRESULT res = URLDownloadToFile(NULL, url, tempfile, 0, &bsc); if (res == S_OK) { if (VerifySignature(tempfile)) { if (PathFileExists(destFilename)) DeleteFile(destFilename); MoveFile(tempfile, destFilename); return true; } } return false; }
void CCheckForUpdatesDlg::OnBnClickedButtonUpdate() { CString title; m_ctrlUpdate.GetWindowText(title); if (m_pDownloadThread == NULL && title == CString(MAKEINTRESOURCE(IDS_PROC_DOWNLOAD))) { bool isOneSelected = false; for (int i = 0; i < (int)m_ctrlFiles.GetItemCount(); i++) { if (m_ctrlFiles.GetCheck(i)) { isOneSelected = true; break; } } if (!isOneSelected) return; m_eventStop.ResetEvent(); m_pDownloadThread = ::AfxBeginThread(DownloadThreadEntry, this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED); if (m_pDownloadThread != NULL) { m_pDownloadThread->m_bAutoDelete = FALSE; m_pDownloadThread->ResumeThread(); GetDlgItem(IDC_BUTTON_UPDATE)->SetWindowText(CString(MAKEINTRESOURCE(IDS_ABORTBUTTON))); } else { CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR); } } else if (title == CString(MAKEINTRESOURCE(IDS_ABORTBUTTON))) { // Abort m_eventStop.SetEvent(); } else { CString folder = GetDownloadsDirectory(); if (m_ctrlUpdate.GetCurrentEntry() == 0) { for (int i = 0; i < (int)m_ctrlFiles.GetItemCount(); i++) { CUpdateListCtrl::Entry *data = (CUpdateListCtrl::Entry *)m_ctrlFiles.GetItemData(i); if (m_ctrlFiles.GetCheck(i) == TRUE) ShellExecute(NULL, _T("open"), folder + data->m_filename, NULL, NULL, SW_SHOWNORMAL); } CStandAloneDialog::OnOK(); } else if (m_ctrlUpdate.GetCurrentEntry() == 1) { ShellExecute(NULL, _T("open"), folder, NULL, NULL, SW_SHOWNORMAL); } m_ctrlUpdate.SetCurrentEntry(0); } }
bool CCheckForUpdatesDlg::Download(CString filename) { CString url = m_sFilesURL + filename; CString destFilename = GetDownloadsDirectory() + filename; if (PathFileExists(destFilename) && PathFileExists(destFilename + SIGNATURE_FILE_ENDING)) { if (VerifyIntegrity(destFilename, destFilename + SIGNATURE_FILE_ENDING, m_updateDownloader) == 0) return true; else { DeleteFile(destFilename); DeleteFile(destFilename + SIGNATURE_FILE_ENDING); DeleteUrlCacheEntry(url); DeleteUrlCacheEntry(url + SIGNATURE_FILE_ENDING); } } m_progress.SetRange32(0, 1); m_progress.SetPos(0); m_progress.ShowWindow(SW_SHOW); if (m_pTaskbarList) { m_pTaskbarList->SetProgressState(m_hWnd, TBPF_NORMAL); m_pTaskbarList->SetProgressValue(m_hWnd, 0, 1); } CString tempfile = CTempFiles::Instance().GetTempFilePath(true).GetWinPathString(); CString signatureTempfile = CTempFiles::Instance().GetTempFilePath(true).GetWinPathString(); DWORD ret = m_updateDownloader->DownloadFile(url, tempfile, true); if (!ret) { ret = m_updateDownloader->DownloadFile(url + SIGNATURE_FILE_ENDING, signatureTempfile, true); if (ret) m_sErrors += url + SIGNATURE_FILE_ENDING + _T(": ") + GetWinINetError(ret) + _T("\r\n"); m_progress.SetPos(m_progress.GetPos() + 1); if (m_pTaskbarList) { m_pTaskbarList->SetProgressState(m_hWnd, TBPF_NORMAL); int minValue, maxValue; m_progress.GetRange(minValue, maxValue); m_pTaskbarList->SetProgressValue(m_hWnd, m_progress.GetPos(), maxValue); } } else m_sErrors += url + _T(": ") + GetWinINetError(ret) + _T("\r\n"); if (!ret) { if (VerifyIntegrity(tempfile, signatureTempfile, m_updateDownloader) == 0) { DeleteFile(destFilename); DeleteFile(destFilename + SIGNATURE_FILE_ENDING); MoveFile(tempfile, destFilename); MoveFile(signatureTempfile, destFilename + SIGNATURE_FILE_ENDING); return true; } m_sErrors += url + SIGNATURE_FILE_ENDING + _T(": Broken digital signature.\r\n"); DeleteUrlCacheEntry(url); DeleteUrlCacheEntry(url + SIGNATURE_FILE_ENDING); } return false; }