GeneratorBase.cc 2.85 KB
Newer Older
1 2
#include "GeneratorBase.h"

3 4
#include "GenericSingelton.h"

5 6
namespace routing {

7 8
const char *GeneratorBase::typeKey = "GeneratorType";

9 10 11 12 13 14 15 16 17 18
GeneratorBase::GeneratorBase(QObject *parent)
    : GeneratorBase(nullptr, parent) {}

GeneratorBase::GeneratorBase(GeneratorBase::Data d, QObject *parent)
    : QObject(parent), _d(d) {
  establishConnections();
}

GeneratorBase::~GeneratorBase() {}

19 20 21 22 23 24 25 26 27
QString GeneratorBase::name() { return _name; }

void GeneratorBase::setName(const QString &name) {
  if (_name != name) {
    _name = name;
    emit nameChanged();
  }
}

28 29
GeneratorBase::Data GeneratorBase::data() const { return _d; }

30
void GeneratorBase::setData(Data d) {
31
  if (d != _d && d != nullptr) {
32 33 34
    deleteConnections();
    _d = d;
    establishConnections();
35
    emit dataChanged();
36
  }
37 38 39 40 41
}

void GeneratorBase::establishConnections() {}

void GeneratorBase::deleteConnections() {}
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108

GeneratorFactory::GeneratorFactory() {}

GeneratorFactory *GeneratorFactory::createInstance() {
  return new GeneratorFactory();
}

GeneratorFactory::~GeneratorFactory() {}

GeneratorFactory *GeneratorFactory::instance() {
  return GenericSingelton<GeneratorFactory>::instance(
      GeneratorFactory::createInstance);
}

bool GeneratorFactory::registerGenerator(const QString &type,
                                         GeneratorFactory::Creator creator) {
  const auto pair = _creatorMap.insert(std::make_pair(type, creator));
  auto success = pair.second;
  return success;
}

bool GeneratorFactory::registered(const QString &type) {
  return _creatorMap.end() != _creatorMap.find(type);
}

void GeneratorFactory::unregisterGenerator(const QString &type) {
  _creatorMap.erase(type);
}

GeneratorBase *GeneratorFactory::create(const QString &type, QObject *parent) {
  auto it = _creatorMap.find(type);
  if (it != _creatorMap.end()) {
    auto &creator = it->second;
    return creator(parent);
  } else {
    return nullptr;
  }
}

GeneratorBase *GeneratorFactory::create(const QJsonObject &jsonGenerator,
                                        QString &errorMessage,
                                        QObject *parent) {
  if (jsonGenerator.contains(GeneratorBase::typeKey) &&
      jsonGenerator[GeneratorBase::typeKey].isString()) {
    auto gen = create(jsonGenerator[GeneratorBase::typeKey].toString(), parent);
    if (gen != nullptr) {
      QString e;
      if (gen->load(jsonGenerator, e)) {
        return gen;
      } else {
        gen->deleteLater();
        errorMessage.append(e);
        return nullptr;
      }
    } else {
      errorMessage.append(QObject::tr("Not able to create generator of type") +
                          " " +
                          jsonGenerator[GeneratorBase::typeKey].toString());
      return nullptr;
    }
  } else {
    errorMessage.append(QObject::tr(
        "Not able to load Generator. Impossible to determine type."));
    return nullptr;
  }
}

109
} // namespace routing