mhwd::STATUS mhwd::performTransaction(mhwd::Data *data, mhwd::Transaction *transaction) { if (transaction->type == mhwd::Transaction::TYPE_INSTALL && !transaction->conflictedConfigs.empty()) return STATUS_ERROR_CONFLICTS; else if (transaction->type == mhwd::Transaction::TYPE_REMOVE && !transaction->requiredByConfigs.empty()) return STATUS_ERROR_REQUIREMENTS; // Check if already installed mhwd::Config *installedConfig = getInstalledConfig(data, transaction->config->name, transaction->config->type); mhwd::STATUS status = STATUS_SUCCESS; if (transaction->type == mhwd::Transaction::TYPE_REMOVE || (installedConfig != NULL && transaction->allowReinstallation)) { if (installedConfig == NULL) return STATUS_ERROR_NOT_INSTALLED; emitMessageFunc(data, mhwd::MESSAGETYPE_REMOVE_START, installedConfig->name); if ((status = uninstallConfig(data, installedConfig)) != STATUS_SUCCESS) return status; emitMessageFunc(data, mhwd::MESSAGETYPE_REMOVE_END, installedConfig->name); } if (transaction->type == mhwd::Transaction::TYPE_INSTALL) { // Check if already installed but not allowed to reinstall if (installedConfig != NULL && !transaction->allowReinstallation) return STATUS_ERROR_ALREADY_INSTALLED; // Install all dependencies first for (std::vector<mhwd::Config*>::const_iterator it = transaction->dependencyConfigs.end() - 1; it != transaction->dependencyConfigs.begin() - 1; --it) { emitMessageFunc(data, mhwd::MESSAGETYPE_INSTALLDEPENDENCY_START, (*it)->name); if ((status = installConfig(data, (*it))) != STATUS_SUCCESS) return status; emitMessageFunc(data, mhwd::MESSAGETYPE_INSTALLDEPENDENCY_END, (*it)->name); } emitMessageFunc(data, mhwd::MESSAGETYPE_INSTALL_START, transaction->config->name); if ((status = installConfig(data, transaction->config)) != STATUS_SUCCESS) return status; emitMessageFunc(data, mhwd::MESSAGETYPE_INSTALL_END, transaction->config->name); } return status; }
MHWD::STATUS Mhwd::performTransaction(const Transaction& transaction) { if ((MHWD::TRANSACTIONTYPE::INSTALL == transaction.type_) && !transaction.conflictedConfigs_.empty()) { return MHWD::STATUS::ERROR_CONFLICTS; } else if ((MHWD::TRANSACTIONTYPE::REMOVE == transaction.type_) && !transaction.configsRequirements_.empty()) { return MHWD::STATUS::ERROR_REQUIREMENTS; } else { // Check if already installed std::shared_ptr<Config> installedConfig{getInstalledConfig(transaction.config_->name_, transaction.config_->type_)}; MHWD::STATUS status = MHWD::STATUS::SUCCESS; if ((MHWD::TRANSACTIONTYPE::REMOVE == transaction.type_) || (installedConfig != nullptr && transaction.isAllowedToReinstall())) { if (nullptr == installedConfig) { return MHWD::STATUS::ERROR_NOT_INSTALLED; } else { consoleWriter_.printMessage(MHWD::MESSAGETYPE::REMOVE_START, installedConfig->name_); if (MHWD::STATUS::SUCCESS != (status = uninstallConfig(installedConfig.get()))) { return status; } else { consoleWriter_.printMessage(MHWD::MESSAGETYPE::REMOVE_END, installedConfig->name_); } } } if (MHWD::TRANSACTIONTYPE::INSTALL == transaction.type_) { // Check if already installed but not allowed to reinstall if ((nullptr != installedConfig) && !transaction.isAllowedToReinstall()) { return MHWD::STATUS::ERROR_ALREADY_INSTALLED; } else { // Install all dependencies first for (auto&& dependencyConfig = transaction.dependencyConfigs_.end() - 1; dependencyConfig != transaction.dependencyConfigs_.begin() - 1; --dependencyConfig) { consoleWriter_.printMessage(MHWD::MESSAGETYPE::INSTALLDEPENDENCY_START, (*dependencyConfig)->name_); if (MHWD::STATUS::SUCCESS != (status = installConfig((*dependencyConfig)))) { return status; } else { consoleWriter_.printMessage(MHWD::MESSAGETYPE::INSTALLDEPENDENCY_END, (*dependencyConfig)->name_); } } consoleWriter_.printMessage(MHWD::MESSAGETYPE::INSTALL_START, transaction.config_->name_); if (MHWD::STATUS::SUCCESS != (status = installConfig(transaction.config_))) { return status; } else { consoleWriter_.printMessage(MHWD::MESSAGETYPE::INSTALL_END, transaction.config_->name_); } } } return status; } }