Skip to content
Snippets Groups Projects
Commit a1813e4d authored by Jaron Emmenegger's avatar Jaron Emmenegger
Browse files

Implemented api management (factory and enable/disable option)

parent 0e08abec
Branches master
No related tags found
No related merge requests found
#include <QDebug>
#include "abstractapi.h"
//-------------------------------------------------------------------------------------------------
AbstractApi::AbstractApi()
: mState(None)
AbstractApi::AbstractApi(const QString &name)
: mState(Disabled)
, cName(name)
{
}
//-------------------------------------------------------------------------------------------------
bool AbstractApi::isEnabled() const
{
return mState == Enabled || mState == Starting;
}
//-------------------------------------------------------------------------------------------------
void AbstractApi::setState(AbstractApi::State s)
{
Q_ASSERT(s != mState);
if (s == mState)
return;
mState = s;
qInfo().noquote() << stateToString(mState) << cName << "API";
emit stateChanged(mState);
}
//-------------------------------------------------------------------------------------------------
QString AbstractApi::stateToString(AbstractApi::State s)
{
switch (s) {
case Starting: return "Starting";
case Enabled: return "Enabled";
case Stopping: return "Stopping";
case Disabled: return "Disabled";
}
return ""; // compiler warning
}
......@@ -3,28 +3,38 @@
#include <QObject>
#include "ceaconstants.h"
class AbstractApi : public QObject
{
Q_OBJECT
public:
enum State
{
None,
Starting,
Running
Enabled,
Stopping,
Disabled
};
AbstractApi();
virtual void init() = 0;
AbstractApi(const QString &name);
virtual void setEnabled(bool enable) = 0;
inline State state() const { return mState; }
inline QString name() const { return cName; }
bool isEnabled() const;
signals:
void stateChanged(State s);
void stateChanged(State newState);
protected:
void setState(State s);
QString stateToString(State s);
private:
State mState;
const QString cName;
};
#endif // ABSTRACTAPI_H
#include <QString>
#include "apifactory.h"
#include "ceaconstants.h"
// include all APIs
#include "binanceapi.h"
//-------------------------------------------------------------------------------------------------
AbstractApi *ApiFactory::create(const ApiCfg &c)
{
if (c.name == Apis::binanceApi) return new BinanceApi();
return nullptr;
}
#ifndef APIFACTORY_H
#define APIFACTORY_H
#include "types.h"
class AbstractApi;
class ApiFactory
{
public:
static AbstractApi *create(const ApiCfg &c);
private:
inline ApiFactory() {}
};
#endif // APIFACTORY_H
#include <QDebug>
#include "binanceapi.h"
//-------------------------------------------------------------------------------------------------
BinanceApi::BinanceApi()
: AbstractApi(Apis::binanceApi)
{
}
//-------------------------------------------------------------------------------------------------
void BinanceApi::setEnabled(bool enable)
{
setState(enable ? Enabled : Disabled);
}
#ifndef BINANCEAPI_H
#define BINANCEAPI_H
#include "abstractapi.h"
class BinanceApi : public AbstractApi
{
public:
BinanceApi();
virtual void setEnabled(bool enable) override;
};
#endif // BINANCEAPI_H
#include <QCoreApplication>
#include <QDebug>
#include <QSet>
#include "ceaapp.h"
#include "apifactory.h"
//-------------------------------------------------------------------------------------------------
CeaApp::CeaApp()
{
connect(&mStorage, &ConfigStorage::requestAppExit, this, &CeaApp::requestAppExit);
connect(&mStorage, &ConfigStorage::configUpdate, this, &CeaApp::configUpdated);
}
//-------------------------------------------------------------------------------------------------
CeaApp::~CeaApp()
{
qDeleteAll(mApis.values());
}
//-------------------------------------------------------------------------------------------------
......@@ -17,3 +26,50 @@ void CeaApp::init()
return;
}
}
//-------------------------------------------------------------------------------------------------
void CeaApp::configUpdated()
{
QSet<QString> configuredApis;
for (ApiCfg &cfg : mStorage.apis()) {
if (configuredApis.contains(cfg.name)) {
qWarning() << "Multiple configuration entries for" << cfg.name << "API. Next entry ignored";
continue;
}
configuredApis << cfg.name;
// new API
if (!mApis.contains(cfg.name)) {
newApi(cfg);
continue;
}
// API enabled status updated
AbstractApi *api = mApis.value(cfg.name);
if (api->isEnabled() != cfg.enabled)
api->setEnabled(cfg.enabled);
}
// removed APIs
for (const AbstractApi *api : mApis) {
if (!configuredApis.contains(api->name()))
mApis.take(api->name())->deleteLater();
}
}
//-------------------------------------------------------------------------------------------------
void CeaApp::newApi(ApiCfg &cfg)
{
Q_ASSERT(!mApis.contains(cfg.name));
AbstractApi *api = ApiFactory::create(cfg);
if (!api) {
qWarning() << "Ignoring unregistered API \"" << cfg.name << "\"";
return;
}
Q_ASSERT_X(api->name() == cfg.name, "API names", "API name must match in class and in ApiFactory.");
api->setEnabled(cfg.enabled);
mApis.insert(cfg.name, api);
}
......@@ -2,22 +2,33 @@
#define CEAAPP_H
#include <QObject>
#include <QMap>
#include "configstorage.h"
#include "abstractapi.h"
class CeaApp : public QObject
{
Q_OBJECT
public:
CeaApp();
~CeaApp();
void init();
signals:
void requestAppExit(const QString &reason, bool fatal);
private slots:
void configUpdated();
private:
typedef QMap<QString,AbstractApi*> Apis;
void newApi(ApiCfg &cfg);
ConfigStorage mStorage;
Apis mApis;
};
#endif // CEAAPP_H
......@@ -8,6 +8,8 @@ DEFINES += QT_DEPRECATED_WARNINGS
SOURCES += \
abstractapi.cc \
apifactory.cc \
binanceapi.cc \
ceaapp.cc \
ceaconstants.cc \
configparser.cc \
......@@ -16,6 +18,8 @@ SOURCES += \
HEADERS += \
abstractapi.h \
apifactory.h \
binanceapi.h \
ceaapp.h \
ceaconstants.h \
configparser.h \
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment