From eaaa1b312dfd8ab0fed677dd9eb368c84c03a758 Mon Sep 17 00:00:00 2001 From: Tom Tanner Date: Sun, 2 Aug 2015 16:25:32 +0100 Subject: Extract multiple copies of file from archive Had to rewrite the archive handling a bit. First pass, some tidyups required. --- src/installationmanager.cpp | 60 ++++++++++++++++----------------------------- 1 file changed, 21 insertions(+), 39 deletions(-) (limited to 'src/installationmanager.cpp') diff --git a/src/installationmanager.cpp b/src/installationmanager.cpp index c036a373..71b38139 100644 --- a/src/installationmanager.cpp +++ b/src/installationmanager.cpp @@ -124,23 +124,16 @@ void InstallationManager::mapToArchive(const DirectoryTree::Node *node, std::wst } for (DirectoryTree::const_leaf_iterator iter = node->leafsBegin(); iter != node->leafsEnd(); ++iter) { - if (! data[iter->getIndex()]->getSkip()) { - std::wstring newp((path + iter->getName().toStdWString())); - std::wstring oldp(data[iter->getIndex()]->getOutputFileName()); - qDebug() << "outputting to " << QString::fromStdWString(newp) << " but already outputting to " << QString::fromStdWString(oldp); - } - data[iter->getIndex()]->setSkip(false); std::wstring temp = path + iter->getName().toStdWString(); - data[iter->getIndex()]->setOutputFileName(temp.c_str()); + data[iter->getIndex()]->addOutputFileName(temp.c_str()); } for (DirectoryTree::const_node_iterator iter = node->nodesBegin(); iter != node->nodesEnd(); ++iter) { + std::wstring temp = path + (*iter)->getData().name.toStdWString(); if ((*iter)->getData().index != -1) { - data[(*iter)->getData().index]->setSkip(false); - std::wstring temp = path + (*iter)->getData().name.toStdWString(); - data[(*iter)->getData().index]->setOutputFileName(temp.c_str()); + data[(*iter)->getData().index]->addOutputFileName(temp.c_str()); } - mapToArchive(*iter, path + (*iter)->getData().name.toStdWString(), data); + mapToArchive(*iter, temp, data); } } @@ -151,11 +144,6 @@ void InstallationManager::mapToArchive(const DirectoryTree::Node *baseNode) size_t size; m_CurrentArchive->getFileList(data, size); - // first disable all files + folders, we will re-enable those present in baseNode - for (size_t i = 0; i < size; ++i) { - data[i]->setSkip(true); - } - std::wstring currentPath; mapToArchive(baseNode, currentPath, data); @@ -174,32 +162,29 @@ bool InstallationManager::unpackSingleFile(const QString &fileName) for (size_t i = 0; i < size; ++i) { if (_wcsicmp(data[i]->getFileName(), ToWString(fileName).c_str()) == 0) { available = true; - data[i]->setSkip(false); - data[i]->setOutputFileName(ToWString(baseName).c_str()); + data[i]->addOutputFileName(ToWString(baseName).c_str()); m_TempFilesToDelete.insert(baseName); - } else { - data[i]->setSkip(true); } } - if (available) { - m_InstallationProgress.setWindowTitle(tr("Extracting files")); - m_InstallationProgress.setLabelText(QString()); - m_InstallationProgress.setValue(0); - m_InstallationProgress.setWindowModality(Qt::WindowModal); - m_InstallationProgress.show(); + if (!available) { + return false; + } - bool res = m_CurrentArchive->extract(ToWString(QDir::toNativeSeparators(QDir::tempPath())).c_str(), - new MethodCallback(this, &InstallationManager::updateProgress), - new MethodCallback(this, &InstallationManager::dummyProgressFile), - new MethodCallback(this, &InstallationManager::report7ZipError)); + m_InstallationProgress.setWindowTitle(tr("Extracting files")); + m_InstallationProgress.setLabelText(QString()); + m_InstallationProgress.setValue(0); + m_InstallationProgress.setWindowModality(Qt::WindowModal); + m_InstallationProgress.show(); - m_InstallationProgress.hide(); + bool res = m_CurrentArchive->extract(ToWString(QDir::toNativeSeparators(QDir::tempPath())).c_str(), + new MethodCallback(this, &InstallationManager::updateProgress), + new MethodCallback(this, &InstallationManager::dummyProgressFile), + new MethodCallback(this, &InstallationManager::report7ZipError)); - return res; - } else { - return false; - } + m_InstallationProgress.hide(); + + return res; } @@ -256,14 +241,11 @@ QStringList InstallationManager::extractFiles(const QStringList &filesOrig, bool ++targetFile; } } - data[i]->setOutputFileName(targetFile); + data[i]->addOutputFileName(targetFile); result.append(QDir::tempPath().append("/").append(ToQString(targetFile))); - data[i]->setSkip(false); m_TempFilesToDelete.insert(ToQString(targetFile)); - } else { - data[i]->setSkip(true); } } -- cgit v1.3.1