diff --git a/spectrum/src/main.cpp b/spectrum/src/main.cpp index b535a2f19a94cc57fb73855a3e391936bba2e12e..a1a8209e071dccc4f407b45946cc1be0e1a3975b 100644 --- a/spectrum/src/main.cpp +++ b/spectrum/src/main.cpp @@ -13,8 +13,9 @@ #include "transport/UsersReconnecter.h" #include "transport/Util.h" #include "transport/Logging.h" -#include "frontends/xmpp/XMPPFrontend.h" -#include "frontends/slack/SlackFrontend.h" +#include "transport/Frontend.h" +#include "frontends/xmpp/XMPPFrontendPlugin.h" +#include "frontends/slack/SlackFrontendPlugin.h" #include "Swiften/EventLoop/SimpleEventLoop.h" #include "Swiften/Network/BoostNetworkFactories.h" #include @@ -38,6 +39,10 @@ #endif #include +#include // for shared_library +#include // for program_location() + +namespace dll = boost::dll; using namespace Transport; using namespace Transport::Util; @@ -215,13 +220,24 @@ int mainloop() { Frontend *frontend = NULL; std::string frontend_name = CONFIG_STRING_DEFAULTED(config_, "service.frontend", "xmpp"); - if (frontend_name == "xmpp") { - frontend = new XMPPFrontend(); + std::string plugin_fc = "create_" + frontend_name + "_frontend_plugin"; + + dll::shared_library self(dll::program_location()); + boost::function()> creator; + + try { + creator = self.get_alias()>(plugin_fc); } - else if (frontend_name == "slack") { - frontend = new SlackFrontend(); + catch (...) { + } + + if (!creator) { + LOG4CXX_ERROR(logger, "Unknown Frontend name " << frontend_name); + return -3; } + frontend = creator()->createFrontend(); + Component transport(frontend, &eventLoop, factories, config_, NULL, &userRegistry); component_ = &transport;