Skip to content

Commit

Permalink
Broker: added service factory and better requirements resolution for …
Browse files Browse the repository at this point in the history
…services
  • Loading branch information
bcsanches committed Jul 27, 2024
1 parent 5dd1838 commit e95f428
Show file tree
Hide file tree
Showing 19 changed files with 430 additions and 130 deletions.
6 changes: 4 additions & 2 deletions src/BrokerLib/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ file(GLOB_RECURSE SRC_DISPATCHER
)

add_library(
BrokerLib
BrokerLib
dcc/DccAddress.cpp
dcc/DccAddress.h
dcc/DccLiteService.cpp
Expand Down Expand Up @@ -90,6 +90,8 @@ add_library(
sys/ScriptSystem.h
sys/Service.cpp
sys/Service.h
sys/ServiceFactory.cpp
sys/ServiceFactory.h
sys/SpecialFolders.cpp
sys/SpecialFolders.h
sys/Thinker.cpp
Expand All @@ -108,7 +110,7 @@ source_group("ln" FILES ${SRC_LN})
source_group("sys" FILES ${SRC_SYS})
source_group("terminal" FILES ${SRC_TERMINAL})

if(WIN32)
if(WIN32)
target_link_libraries(BrokerLib
PRIVATE bcrypt.lib
PRIVATE CityHash
Expand Down
16 changes: 15 additions & 1 deletion src/BrokerLib/dcc/DccLiteService.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,12 @@
#include "VirtualSensorDecoder.h"

#include "../sys/EventHub.h"
#include "../sys/ServiceFactory.h"

using namespace std::chrono_literals;

namespace dcclite::broker
{
{
DecoderWeakPointer::DecoderWeakPointer(dcclite::broker::Decoder &decoder, dcclite::broker::Service &dccLiteService) :
m_pclDecoder{ &decoder },
m_clAddress{ decoder.GetAddress() }
Expand Down Expand Up @@ -106,6 +107,19 @@ namespace dcclite::broker
return nullptr;
}

//
//
//
//
//

const char *DccLiteService::TYPE_NAME = "DccLiteService";

void DccLiteService::RegisterFactory()
{
static GenericServiceFactory<DccLiteService> g_DccLiteServiceFactory;
}


DccLiteService::DccLiteService(RName name, Broker &broker, const rapidjson::Value &params, const Project &project) :
Service(name, broker, params, project)
Expand Down
8 changes: 6 additions & 2 deletions src/BrokerLib/dcc/DccLiteService.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,9 +75,13 @@ namespace dcclite::broker
class DccLiteService : public Service, private IDccLite_DeviceServices, private IDccLite_DecoderServices, public EventHub::IEventTarget, public ScriptSystem::IScriptSupport
{
public:
static const char *TYPE_NAME;

DccLiteService(RName name, Broker &broker, const rapidjson::Value &params, const Project &project);

~DccLiteService() override;
~DccLiteService() override;

static void RegisterFactory();

//
//IObject
Expand All @@ -86,7 +90,7 @@ namespace dcclite::broker

const char *GetTypeName() const noexcept override
{
return "DccLiteService";
return TYPE_NAME;
}

void Serialize(dcclite::JsonOutputStream_t &stream) const override
Expand Down
26 changes: 13 additions & 13 deletions src/BrokerLib/dcc/DccppService.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#include "../sys/BonjourService.h"
#include "../sys/Broker.h"
#include "../sys/EventHub.h"
#include "../sys/ServiceFactory.h"
#include "../sys/ZeroConfSystem.h"

#include "Decoder.h"
Expand Down Expand Up @@ -103,7 +104,7 @@ namespace dcclite::broker
class DccppServiceImpl: public DccppService, public EventHub::IEventTarget, DccppServiceImplClientProxy
{
public:
DccppServiceImpl(RName name, Broker &broker, const rapidjson::Value &params, const Project &project);
DccppServiceImpl(RName name, Broker &broker, const rapidjson::Value &params, const Project &project, DccLiteService &dependency);
~DccppServiceImpl() override;

private:
Expand Down Expand Up @@ -717,9 +718,9 @@ namespace dcclite::broker
//


DccppServiceImpl::DccppServiceImpl(RName name, Broker &broker, const rapidjson::Value& params, const Project& project):
DccppServiceImpl::DccppServiceImpl(RName name, Broker &broker, const rapidjson::Value& params, const Project& project, DccLiteService &dependency):
DccppService(name, broker, params, project),
m_rclDccService{ static_cast<DccLiteService &>(m_rclBroker.ResolveRequirement(dcclite::json::GetString(params, "requires", name.GetData().data()))) }
m_rclDccService{ dependency }
{
//standard port used by DCC++
const auto port = dcclite::json::TryGetDefaultInt(params, "port", 2560);
Expand Down Expand Up @@ -812,20 +813,19 @@ namespace dcclite::broker
}
}

DccppService::DccppService(RName name, Broker &broker, const rapidjson::Value &params, const Project &project) :
Service{ name, broker, params, project }
void DccppService::RegisterFactory()
{
//empty
}

std::unique_ptr<Service> DccppService::Create(RName name, Broker &broker, const rapidjson::Value &params, const Project &project)
DccppService::DccppService(RName name, Broker &broker, const rapidjson::Value &params, const Project &project) :
Service{ name, broker, params, project }
{
return std::make_unique<DccppServiceImpl>(name, broker, params, project);
//empty
}

#if 1


#endif

}
DCC_LITE_SERVICE_FACTORY_REQ(g_clDccppServiceFactory, RName{ "DccppService" }, DccLiteService::TYPE_NAME,
{
return std::make_unique<DccppServiceImpl>(name, broker, data, project, dynamic_cast<DccLiteService &>(dep));
});
}
6 changes: 3 additions & 3 deletions src/BrokerLib/dcc/DccppService.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,10 @@ namespace dcclite::broker
class DccppService: public Service
{
public:
static void RegisterFactory();

DccppService(RName name, Broker &broker, const rapidjson::Value& params, const Project& project);

~DccppService() override = default;

static std::unique_ptr<Service> Create(RName name, Broker &broker, const rapidjson::Value &params, const Project &project);
~DccppService() override = default;
};
}
2 changes: 1 addition & 1 deletion src/BrokerLib/dcc/LocationManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

#include <FmtUtils.h>

#include <JsonUtil.h>
#include <JsonUtils.h>
#include <Log.h>

#include "Decoder.h"
Expand Down
27 changes: 18 additions & 9 deletions src/BrokerLib/dispatcher/DispatcherService.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,18 @@

#include <Log.h>

#include <JsonUtils.h>

#include "FmtUtils.h"

#include "../sys/Broker.h"
#include "../dcc/DccLiteService.h"
#include "../sys/ScriptSystem.h"
#include "../dcc/Device.h"
#include "../dcc/VirtualSensorDecoder.h"

#include "../sys/Broker.h"
#include "../sys/ServiceFactory.h"
#include "../sys/ScriptSystem.h"

namespace dcclite::broker
{
class BaseSectionWrapper: public Object
Expand Down Expand Up @@ -108,7 +112,7 @@ namespace dcclite::broker
class DispatcherServiceImpl : public DispatcherService, public ScriptSystem::IScriptSupport, public IResettableService
{
public:
DispatcherServiceImpl(RName name, Broker &broker, const rapidjson::Value &params, const Project &project);
DispatcherServiceImpl(RName name, Broker &broker, const rapidjson::Value &params, const Project &project, DccLiteService &dep);
~DispatcherServiceImpl() override;

void Serialize(JsonOutputStream_t &stream) const override;
Expand Down Expand Up @@ -140,9 +144,9 @@ namespace dcclite::broker
Device *m_pclDevice = nullptr;
};

DispatcherServiceImpl::DispatcherServiceImpl(RName name, Broker &broker, const rapidjson::Value& params, const Project& project):
DispatcherServiceImpl::DispatcherServiceImpl(RName name, Broker &broker, const rapidjson::Value& params, const Project& project, DccLiteService &dep):
DispatcherService(name, broker, params, project),
m_rclDccLite{ static_cast<DccLiteService &>(broker.ResolveRequirement(params["requires"].GetString())) },
m_rclDccLite{ dep },
m_pSections{ static_cast<FolderObject *>(this->AddChild(std::make_unique<FolderObject>(RName{"sections"}))) }
{
dcclite::Log::Info("[DispatcherServiceImpl] Init");
Expand Down Expand Up @@ -280,14 +284,19 @@ namespace dcclite::broker
//
//

DispatcherService::DispatcherService(RName name, Broker &broker, const rapidjson::Value &params, const Project &project) :
Service(name, broker, params, project)
void DispatcherService::RegisterFactory()
{
//empty
}

std::unique_ptr<Service> DispatcherService::Create(RName name, Broker &broker, const rapidjson::Value &params, const Project &project)
DispatcherService::DispatcherService(RName name, Broker &broker, const rapidjson::Value &params, const Project &project) :
Service(name, broker, params, project)
{
return std::make_unique<DispatcherServiceImpl>(name, broker, params, project);
//empty
}

DCC_LITE_SERVICE_FACTORY_REQ(g_clDispatcherServiceFactory, RName{ "DispatcherService" }, DccLiteService::TYPE_NAME,
{
return std::make_unique<DispatcherServiceImpl>(name, broker, data, project, dynamic_cast<DccLiteService &>(dep));
});
}
12 changes: 3 additions & 9 deletions src/BrokerLib/dispatcher/DispatcherService.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,21 +20,15 @@ namespace dcclite::broker
class DispatcherService: public Service
{
public:
static void RegisterFactory();

DispatcherService(RName name, Broker &broker, const rapidjson::Value& params, const Project& project);

~DispatcherService() override = default;

//
// Main interface
//



//
//
//

static std::unique_ptr<Service> Create(RName name, Broker &broker, const rapidjson::Value &params, const Project &project);
//

const char *GetTypeName() const noexcept override
{
Expand Down
32 changes: 23 additions & 9 deletions src/BrokerLib/ln/LoconetService.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,10 @@

#include <magic_enum/magic_enum.hpp>

#include <JsonUtils.h>

#include "../sys/Broker.h"
#include "../sys/ServiceFactory.h"
#include "../sys/Thinker.h"

#include "Clock.h"
Expand Down Expand Up @@ -968,7 +971,7 @@ namespace dcclite::broker
class LoconetServiceImpl : public LoconetService
{
public:
LoconetServiceImpl(RName name, Broker &broker, const rapidjson::Value &params, const Project &project);
LoconetServiceImpl(RName name, Broker &broker, const rapidjson::Value &params, const Project &project, ThrottleService &requirement);
~LoconetServiceImpl() override;

static std::unique_ptr<Service> Create(RName name, Broker &broker, const rapidjson::Value &params, const Project &project);
Expand Down Expand Up @@ -1007,13 +1010,13 @@ namespace dcclite::broker
};


LoconetServiceImpl::LoconetServiceImpl(RName name, Broker &broker, const rapidjson::Value& params, const Project& project):
LoconetServiceImpl::LoconetServiceImpl(RName name, Broker &broker, const rapidjson::Value &params, const Project &project, ThrottleService &requirement):
LoconetService(name, broker, params, project),
m_clSerialPort(params["port"].GetString()),
m_tThinker{ {}, THINKER_MF_LAMBDA(Think)},
m_tThinker{ {}, THINKER_MF_LAMBDA(Think) },
m_tPurgeThinker{ {}, THINKER_MF_LAMBDA(PurgeThink) }
{
g_pclThrottleService = &static_cast<ThrottleService &>(m_rclBroker.ResolveRequirement(params["requires"].GetString()));
{
g_pclThrottleService = &requirement;

dcclite::Log::Info("[LoconetService] Started, listening on port {}", params["port"].GetString());

Expand Down Expand Up @@ -1454,14 +1457,25 @@ namespace dcclite::broker
);
}

LoconetService::LoconetService(RName name, Broker &broker, const rapidjson::Value &params, const Project &project) :
Service(name, broker, params, project)
DCC_LITE_SERVICE_FACTORY_REQ(g_clLoconetServiceFactory, RName{ "LoconetService" }, ThrottleService::TYPE_NAME,
{
return std::make_unique<LoconetServiceImpl>(name, broker, data, project, dynamic_cast<ThrottleService &>(dep));
});

//
//
//
//
//

void LoconetService::RegisterFactory()
{
//empty
}

std::unique_ptr<Service> LoconetService::Create(RName name, Broker &broker, const rapidjson::Value &params, const Project &project)
LoconetService::LoconetService(RName name, Broker &broker, const rapidjson::Value &params, const Project &project) :
Service(name, broker, params, project)
{
return std::make_unique<LoconetServiceImpl>(name, broker, params, project);
//empty
}
}
5 changes: 2 additions & 3 deletions src/BrokerLib/ln/LoconetService.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,15 +77,14 @@ namespace dcclite::broker
class LoconetService: public Service
{
public:
static void RegisterFactory();

LoconetService(RName name, Broker &broker, const rapidjson::Value& params, const Project& project);

~LoconetService() override
{
//empty
}


static std::unique_ptr<Service> Create(RName name, Broker &broker, const rapidjson::Value &params, const Project &project);

const char *GetTypeName() const noexcept override
{
Expand Down
Loading

0 comments on commit e95f428

Please sign in to comment.