--- a/src/Socket.cpp Thu Jul 28 02:03:11 2022 +0200
+++ b/src/Socket.cpp Thu Jul 28 02:45:11 2022 +0200
@@ -23,6 +23,7 @@
#include <sys/socket.h>
#include <netinet/in.h>
#include <vector>
+#include <memory>
#include "Socket.h"
@@ -30,6 +31,15 @@
namespace out {
namespace socket {
+static const char PROTOCOL_TCP[] = "tcp://";
+static const char PROTOCOL_UDP[] = "udp://";
+static const char PROTOCOL_UDS[] = "uds://";
+static const char PROTOCOL_SCTP[] = "sctp://";
+static const char PROTOCOL_TCP_LISTEN[] = "tcp-listen://";
+static const char PROTOCOL_UDP_LISTEN[] = "udp-listen://";
+static const char PROTOCOL_UDS_LISTEN[] = "uds-listen://";
+static const char PROTOCOL_SCTP_LISTEN[] = "sctp-listen://";
+
class TCPSocket : public Socket {
public:
@@ -54,24 +64,32 @@
};
-static class TCPSocketFactory : public SocketFactory {
+template<const char* protocol, typename SocketClass>
+class TemplateSocketFactory : public SocketFactory {
public:
bool canHandle(const std::string& connectionString) override {
- return connectionString.rfind("tcp://", 0) == 0;
+ return connectionString.rfind(protocol, 0) == 0;
}
Socket* open(const std::string& connectionString) override {
// TODO: pass string to constructor
- return new TCPSocket();
+ // TODO: return shared_ptr?
+ return new SocketClass();
}
-} tcpSocketFactory;
+};
-static std::vector<SocketFactory*> factories{&tcpSocketFactory};
+static std::vector<std::shared_ptr<SocketFactory>> factories{
+ // FIXME: different classes than TCPSocket
+ std::make_shared<TemplateSocketFactory<PROTOCOL_TCP, TCPSocket>>(),
+ std::make_shared<TemplateSocketFactory<PROTOCOL_UDP, TCPSocket>>(),
+ std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, TCPSocket>>(),
+ std::make_shared<TemplateSocketFactory<PROTOCOL_SCTP, TCPSocket>>(),
+};
-SocketFactory* SocketFactory::find(const std::string& connectionString) {
+std::shared_ptr<SocketFactory> SocketFactory::find(const std::string& connectionString) {
for (auto f : factories) if (f->canHandle(connectionString)) return f;
- return nullptr;
+ return std::shared_ptr<SocketFactory>();
}