Aktualizr
C++ SOTA Client
All Classes Namespaces Files Functions Variables Enumerations Enumerator Pages
packagemanagerfactory.cc
1 #include <cstdlib>
2 #include <map>
3 
4 #include "libaktualizr/packagemanagerfactory.h"
5 
6 #include "logging/logging.h"
7 
8 static std::map<std::string, PackageManagerBuilder> *registered_pkgms_;
9 
10 bool PackageManagerFactory::registerPackageManager(const char *name, PackageManagerBuilder builder) {
11  // this trick is needed so that this object is constructed before any element
12  // is added to it
13  static std::map<std::string, PackageManagerBuilder> rpkgms;
14 
15  if (registered_pkgms_ == nullptr) {
16  registered_pkgms_ = &rpkgms;
17  }
18  if (registered_pkgms_->find(name) != registered_pkgms_->end()) {
19  throw std::runtime_error(std::string("fatal: tried to register package manager \"") + name + "\" twice");
20  }
21  (*registered_pkgms_)[name] = std::move(builder);
22  return true;
23 }
24 
25 std::shared_ptr<PackageManagerInterface> PackageManagerFactory::makePackageManager(
26  const PackageConfig &pconfig, const BootloaderConfig &bconfig, const std::shared_ptr<INvStorage> &storage,
27  const std::shared_ptr<HttpInterface> &http) {
28  for (const auto &b : *registered_pkgms_) {
29  if (b.first == pconfig.type) {
30  PackageManagerInterface *pkgm = b.second(pconfig, bconfig, storage, http);
31  return std::shared_ptr<PackageManagerInterface>(pkgm);
32  }
33  }
34 
35  LOG_ERROR << "Package manager type \"" << pconfig.type << "\" does not exist";
36  LOG_ERROR << "Available options are: " << []() {
37  std::stringstream ss;
38  for (const auto &b : *registered_pkgms_) {
39  ss << "\n" << b.first;
40  }
41  return ss.str();
42  }();
43 
44  throw std::runtime_error(std::string("Unsupported package manager: ") + pconfig.type);
45 }
PackageManagerInterface
Definition: packagemanagerinterface.h:42
PackageConfig
Definition: config.h:91
BootloaderConfig
Definition: config.h:156