HWND CEditView::StartProgress() { HWND hwndProgress = m_pcEditWnd->m_cStatusBar.GetProgressHwnd(); if( NULL != hwndProgress ){ ::ShowWindow( hwndProgress, SW_SHOW ); Progress_SetRange( hwndProgress, 0, 101 ); Progress_SetPos( hwndProgress, 0 ); } return hwndProgress; }
bool downloadUpdates( const char* downloadWebsite, const std::list<EvidyonUpdateFile>& filesAndSizes ) { // Hide the combo box, show the progress bar ComboBox_Enable( getDisplayModeCombo(), FALSE ); ShowWindow( getProgressBar(), SW_SHOWDEFAULT ); std::vector<std::pair<std::string,std::string>> tempFilesToLocalFiles; // Initialize the progress bar. All files are scaled to 65535 since the 32-bit range // doesn't seem to be working correctly. Progress_SetRange( getProgressBar(), 0, 65535 ); // Repeat for each of the files for (std::list<EvidyonUpdateFile>::const_iterator p = filesAndSizes.begin(); p != filesAndSizes.end(); ++p) { // Update the display window { // Get the number of bytes char bytes[16]; if( p->file_size > 1000 ) { sprintf_s( bytes, "%lu KB", p->file_size / 1000 ); } else if( p->file_size > 1000000 ) { sprintf_s( bytes, "%lu MB", p->file_size / 1000000 ); } else { sprintf_s( bytes, "%lu bytes", p->file_size ); } std::string text = "Downloading "; text.append( p->file_name ); text.append( " - " ); text.append( bytes ); appendStatusLine( text.c_str() ); } // Get the file's name on the website std::string fileUrl = downloadWebsite; fileUrl.append( p->file_name ); // Get the file's local name std::string fileLocalName = "~"; fileLocalName.append( p->file_name ); // Open the local file HANDLE hDestination; hDestination = CreateFile( fileLocalName.c_str(), GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_FLAG_WRITE_THROUGH | FILE_FLAG_SEQUENTIAL_SCAN, NULL ); CONFIRM( hDestination ) else return false; // Add to the list of local files tempFilesToLocalFiles.push_back( std::pair<std::string,std::string>( fileLocalName, p->file_name ) ); // Download this file dcx::dcxWin32InternetStream reader; if( !reader.open( "EvidyonClient", fileUrl.c_str() ) ) { CloseHandle( hDestination ); return false; } // Reset the progress bar Progress_SetPos( getProgressBar(), 0 ); char buffer[512]; size_t bytesRead = 0; size_t bytes; while( reader.scan( buffer, sizeof(buffer), &bytes ) && !reader.end() ) { // Write this data into the output file DWORD bytesWritten; BOOL success = WriteFile( hDestination, buffer, bytes, &bytesWritten, NULL ); // Exit if the data couldn't be written or the user exited the launcher if( !dcx::dcxWin32StdMessagePump( myMainWindow ) || APP_WARNING( !success || !bytesWritten )( "Couldn't write data to temporary file" ) ) break; // Add to the number of bytes that were read bytesRead += bytes; // Update the progress bar Progress_SetPos( getProgressBar(), (WORD)(((double)bytesRead / (double)p->file_size) * 65535) ); } bool completed = reader.end(); // Get rid of the output file and internet connection reader.close(); CloseHandle( hDestination ); // If we didn't finish the download, fail if( APP_ERROR( !completed )( "Didn't complete download of %s", fileUrl.c_str() ) ) return false; } // Delete original files and copy files over for( std::vector<std::pair<std::string,std::string>>::iterator i = tempFilesToLocalFiles.begin(); i != tempFilesToLocalFiles.end(); ++i ) { // Copy over the existing file if (CopyFile( i->first.c_str(), i->second.c_str(), FALSE )) { // Erase the temporary file DeleteFile( i->first.c_str() ); } } // Max out the bar Progress_SetPos( getProgressBar(), 65535 ); // Success return true; }