BOOL CPackage::unZip() { CZipArchive cZip; CString csFile; // If there is no fragement, assume package unzipped if (m_uFrags == 0) // No fragment return TRUE; csFile.Format( _T( "%s\\%s\\%s"), getDownloadFolder(), m_csID, OCS_DOWNLOAD_BUILD); try { cZip.Open( csFile); for(ZIP_INDEX_TYPE i=0; i<cZip.GetCount();i++) cZip.ExtractFile(i, m_csPath); cZip.Close(); // Create package ID file into unzip directory only if not in store action if (m_csAction != OCS_DOWNLOAD_ACTION_STORE) { CStdioFile cFile; csFile.Format( _T( "%s\\%s"), m_csPath, OCS_DOWNLOAD_PACKAGE_ID); if (cFile.Open( csFile, CFile::modeCreate|CFile::modeWrite|CFile::typeText)) { cFile.WriteString( m_csID); cFile.Close(); } } } catch (CException *pE) { pE->Delete(); cZip.Close( CZipArchive::afAfterException); return FALSE; } catch (std::exception *pEx) { cZip.Close( CZipArchive::afAfterException); delete pEx; return FALSE; } return TRUE; }
bool CSimpleZip::Extract(std::string strDest,std::string strZipFile) { CZipString szArchive; szArchive=CZipString(strZipFile); CZipString szPath = CZipString(strDest); CZipArchive zip; int iVolumeSize = 0; int iMode = CZipArchive::zipOpen; try { zip.Open(szArchive, iMode, iVolumeSize); } catch(...) { return FALSE; } bool ok=true; for (int k = 0; k < zip.GetCount(); ++k) { try { ok = zip.ExtractFile(k, szPath, TRUE); } catch (...) { ok = false; break; } } zip.Close(); return ok; }
void WorkerThread::runUnzip() { emit(beginRunUnzip()); emit(stageEvent("Extracting and merging game data")); emit(infoEvent("Unzipping original game files")); CZipArchive zip; try { zip.Open(m_gameFileName.toStdString().c_str(), CZipArchive::zipOpenReadOnly); ZIP_SIZE_TYPE totalSize = 0; for(ZIP_INDEX_TYPE i = 0; i < zip.GetCount(); i++) { totalSize += zip.GetFileInfo(i)->m_uUncomprSize; // uncompressed size QString name = QString::fromUtf8(zip.GetFileInfo(i)->GetFileName()); if(!validName(name)) { emit(errorEvent("Game pack contains illegal file names (e.g. " + name + ")")); emit(infoEvent("A near future release of WHDRun will fix this problem, sorry for the inconvenience")); m_die = true; return; } } emit(unzipTotalSize(totalSize)); ZIP_SIZE_TYPE progress = 0; for(ZIP_INDEX_TYPE i = 0; i < zip.GetCount(); i++) { progress += zip.GetFileInfo(i)->m_uUncomprSize; zip.ExtractFile(i, m_tempPath.toUtf8()); emit(unzipProgress(progress)); } zip.Close(); } catch(CZipException ex) { zip.Close(CZipArchive::afAfterException); emit(errorEvent(QString("Error while unzipping: %1").arg((LPCTSTR)ex.GetErrorDescription()))); m_die = true; // no need to rezip return; } emit(infoEvent("Collecting checksums of unmodified files")); emit(beginCollect()); m_checksums.clear(); collectFiles(m_tempPath, &m_checksums); // TODO: progress for this? (should always be quick) QString gameFileBase = QFileInfo(m_gameFileName).baseName(); QString diffFileName = m_dataPath + "/" + gameFileBase + __WHDRun__DiffSuffix; if(QFileInfo(diffFileName).exists()) { emit(infoEvent("Merging original game files with previously modified files")); CZipArchive zip; try { zip.Open(diffFileName.toUtf8(), CZipArchive::zipOpenReadOnly); //TODO: progress infoEvent for this? (should always be quick) for (ZIP_INDEX_TYPE i = 0; i < zip.GetCount(); i++) { zip.ExtractFile(i, m_tempPath.toUtf8()); } zip.Close(); } catch(CZipException ex) { zip.Close(CZipArchive::afAfterException); emit(errorEvent(QString("Error while unzipping changes: %1").arg((LPCTSTR)ex.GetErrorDescription()))); m_die = true; // no need to rezip return; } } emit(endRunUnzip()); }
DWORD ProgressDialog::UpgradeAsync() { typedef std::list<CString> BackupFiles; CZipArchive ar; if (!ar.Open(upgradeFilePath_)) { ::PostMessage(m_hWnd, WM_UPGRADE_DONE, FALSE, 0); return 0; } bool copySuccess = true; TCHAR filePath[MAX_PATH]; BackupFiles backupFiles; WORD fileCount = ar.GetCount(); for (WORD i = 0; i < fileCount; i++) { CZipFileHeader *fileInfo = ar.GetFileInfo(i); if (fileInfo->IsDirectory()) { continue; } const CZipString &fileName = fileInfo->GetFileName(); _tcscpy(filePath, appDir_); PathAddBackslash(filePath); _tcscat(filePath, fileName); if (PathFileExists(filePath)) { TCHAR backupFilePath[MAX_PATH]; _tcscpy(backupFilePath, appDir_); PathAddBackslash(backupFilePath); _tcscat(backupFilePath, fileName); _tcscat(backupFilePath, _T(".bak")); if (PathFileExists(backupFilePath)) { DeleteFile(backupFilePath); } if (!MoveFile(filePath, backupFilePath)) { copySuccess = false; break; } backupFiles.push_back((LPCTSTR)fileName); } if (!ar.ExtractFile(i, appDir_)) { copySuccess = false; break; } } if (copySuccess) { AfxGetApp()->WriteProfileString(_T(""), _T("Version"), appVersion_); // remove backup files. for (BackupFiles::const_iterator i = backupFiles.begin(); i != backupFiles.end(); ++i) { TCHAR backupFilePath[MAX_PATH]; _tcscpy(backupFilePath, appDir_); PathAddBackslash(backupFilePath); _tcscat(backupFilePath, *i); _tcscat(backupFilePath, _T(".bak")); DeleteFile(backupFilePath); } } else { // upgrade failed, restore backup. for (BackupFiles::const_iterator i = backupFiles.begin(); i != backupFiles.end(); ++i) { TCHAR backupFilePath[MAX_PATH]; _tcscpy(backupFilePath, appDir_); PathAddBackslash(backupFilePath); _tcscat(backupFilePath, *i); _tcscat(backupFilePath, _T(".bak")); TCHAR filePath[MAX_PATH]; _tcscpy(filePath, appDir_); PathAddBackslash(filePath); _tcscat(filePath, *i); DeleteFile(filePath); MoveFile(backupFilePath, filePath); } } ::PostMessage(m_hWnd, WM_UPGRADE_DONE, TRUE, 0); return 0; }