void Data::getAllDependenciesToInstall(Config *config, std::vector<Config*>* installedConfigs, std::vector<Config*> *dependencies) { for (std::vector<std::string>::const_iterator configDependency = config->dependencies_.begin(); configDependency != config->dependencies_.end(); configDependency++) { bool found = false; for (std::vector<Config*>::const_iterator installedConfig = installedConfigs->begin(); installedConfig != installedConfigs->end(); installedConfig++) { if ((*configDependency) == (*installedConfig)->name_) { found = true; break; } } if (found) continue; // Check if already in vector for (std::vector<Config*>::const_iterator dependency = dependencies->begin(); dependency != dependencies->end(); dependency++) { if ((*dependency)->name_ == (*configDependency)) { found = true; break; } } if (found) { continue; } else { // Add to vector and check for further subdepends... Config *dependconfig = getDatabaseConfig((*configDependency), config->type_); if (dependconfig == nullptr) { continue; } else { dependencies->push_back(dependconfig); getAllDependenciesToInstall(dependconfig, installedConfigs, dependencies); } } } }
mhwd::Transaction mhwd::createTransaction(mhwd::Data *data, mhwd::Config* config, mhwd::Transaction::TYPE type, bool allowReinstallation) { struct mhwd::Transaction transaction; transaction.type = type; transaction.allowReinstallation = allowReinstallation; transaction.config = config; // Fill transaction vectors transaction.requiredByConfigs = getAllLocalRequirements(data, config); transaction.dependencyConfigs = getAllDependenciesToInstall(data, config); transaction.conflictedConfigs = getAllLocalConflicts(data, config); return transaction; }
std::vector<Config*> Data::getAllDependenciesToInstall(Config *config) { std::vector<Config*> depends; std::vector<Config*> installedConfigs; // Get the right configs if (config->type_ == MHWD::DEVICETYPE::USB) { installedConfigs = installedUSBConfigs; } else { installedConfigs = installedPCIConfigs; } // Get all depends getAllDependenciesToInstall(config, &installedConfigs, &depends); return depends; }
std::vector<mhwd::Config*> mhwd::getAllLocalConflicts(mhwd::Data *data, mhwd::Config *config) { std::vector<mhwd::Config*> conflicts; std::vector<mhwd::Config*> depends = getAllDependenciesToInstall(data, config); std::vector<mhwd::Config*>* installedConfigs; // Get the right configs if (config->type == mhwd::TYPE_USB) installedConfigs = &data->installedUSBConfigs; else installedConfigs = &data->installedPCIConfigs; depends.push_back(config); for (std::vector<mhwd::Config*>::const_iterator depend = depends.begin(); depend != depends.end(); depend++) { for (std::vector<std::string>::const_iterator conflict = (*depend)->conflicts.begin(); conflict != (*depend)->conflicts.end(); conflict++) { for (std::vector<mhwd::Config*>::const_iterator iterator = installedConfigs->begin(); iterator != installedConfigs->end(); iterator++) { if ((*conflict) != (*iterator)->name) continue; // Check if already in vector bool found = false; for (std::vector<mhwd::Config*>::const_iterator it = conflicts.begin(); it != conflicts.end(); it++) { if ((*it)->name == (*conflict)) { found = true; break; } } if (found) continue; // Add to vector conflicts.push_back((*iterator)); break; } } } return conflicts; }
std::vector<Config*> Data::getAllLocalConflicts(Config *config) { std::vector<Config*> conflicts; std::vector<Config*> dependencies = getAllDependenciesToInstall(config); std::vector<Config*> installedConfigs; // Get the right configs if (config->type_ == MHWD::DEVICETYPE::USB) { installedConfigs = installedUSBConfigs; } else { installedConfigs = installedPCIConfigs; } dependencies.push_back(config); for (std::vector<Config*>::const_iterator dependency = dependencies.begin(); dependency != dependencies.end(); dependency++) { for (std::vector<std::string>::const_iterator dependencyConflict = (*dependency)->conflicts_.begin(); dependencyConflict != (*dependency)->conflicts_.end(); dependencyConflict++) { for (std::vector<Config*>::const_iterator installedConfig = installedConfigs.begin(); installedConfig != installedConfigs.end(); installedConfig++) { if ((*dependencyConflict) != (*installedConfig)->name_) { continue; } else { // Check if already in vector bool found = false; for (std::vector<Config*>::const_iterator conflict = conflicts.begin(); conflict != conflicts.end(); conflict++) { if ((*conflict)->name_ == (*dependencyConflict)) { found = true; break; } } if (found) { continue; } else { conflicts.push_back((*installedConfig)); break; } } } } } return conflicts; }