From b9bf520e1583539ffb607fa1ecc60fec0dd07543 Mon Sep 17 00:00:00 2001
From: Nicolas Pope <nicolas.pope@utu.fi>
Date: Thu, 16 Jun 2022 07:32:08 +0000
Subject: [PATCH] #48 Add service provider

---
 CMakeLists.txt                   |  1 +
 include/ftl/protocol/self.hpp    | 11 +++++++++++
 include/ftl/protocol/service.hpp | 21 +++++++++++++++++++++
 src/protocol.cpp                 |  6 +++---
 src/self.cpp                     |  5 +++++
 src/service.cpp                  | 14 ++++++++++++++
 test/rpc_integration.cpp         |  3 ++-
 7 files changed, 57 insertions(+), 4 deletions(-)
 create mode 100644 include/ftl/protocol/service.hpp
 create mode 100644 src/service.cpp

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 5261bea..e9c31bc 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -192,6 +192,7 @@ add_library(beyond-protocol STATIC
 	src/protocol.cpp
 	src/rpc.cpp
     src/channelUtils.cpp
+    src/service.cpp
 )
 
 target_include_directories(beyond-protocol PUBLIC
diff --git a/include/ftl/protocol/self.hpp b/include/ftl/protocol/self.hpp
index d73bbd1..ad3ba19 100644
--- a/include/ftl/protocol/self.hpp
+++ b/include/ftl/protocol/self.hpp
@@ -25,6 +25,7 @@ namespace protocol {
 
 class Node;
 class Stream;
+class Service;
 
 /**
  * @brief A wrapper providing RPC API and local node management. Internally the
@@ -48,6 +49,16 @@ class Self {
      */
     std::shared_ptr<ftl::protocol::Node> connectNode(const std::string &uri);
 
+    /**
+     * @brief Connect to the web service.
+     * 
+     * Only one service connection is allowed per self object.
+     * 
+     * @param uri 
+     * @return std::shared_ptr<ftl::protocol::Service> 
+     */
+    std::shared_ptr<ftl::protocol::Service> connectService(const std::string &uri);
+
     /**
      * @brief Create a new stream. Use the namespace method if possible.
      * 
diff --git a/include/ftl/protocol/service.hpp b/include/ftl/protocol/service.hpp
new file mode 100644
index 0000000..72cd4a9
--- /dev/null
+++ b/include/ftl/protocol/service.hpp
@@ -0,0 +1,21 @@
+/**
+ * @file service.hpp
+ * @copyright Copyright (c) 2022 University of Turku, MIT License
+ * @author Nicolas Pope
+ */
+
+#pragma once
+
+#include <ftl/protocol/node.hpp>
+
+namespace ftl {
+namespace protocol {
+
+class Service: public ftl::protocol::Node {
+ public:
+    explicit Service(const ftl::net::PeerPtr &impl);
+    virtual ~Service();
+};
+
+}  // namespace protocol
+}  // namespace ftl
diff --git a/src/protocol.cpp b/src/protocol.cpp
index 012198d..32291fc 100644
--- a/src/protocol.cpp
+++ b/src/protocol.cpp
@@ -36,9 +36,9 @@ std::shared_ptr<ftl::protocol::Self> ftl::createDummySelf() {
     return std::make_shared<ftl::protocol::Self>(u);
 }
 
-/*std::shared_ptr<ftl::protocol::Service> ftl::setServiceProvider(const std::string &uri) {
-
-}*/
+std::shared_ptr<ftl::protocol::Service> ftl::setServiceProvider(const std::string &uri) {
+    return getSelf()->connectService(uri);
+}
 
 std::shared_ptr<ftl::protocol::Node> ftl::connectNode(const std::string &uri) {
     return getSelf()->connectNode(uri);
diff --git a/src/self.cpp b/src/self.cpp
index 627646b..7331266 100644
--- a/src/self.cpp
+++ b/src/self.cpp
@@ -6,6 +6,7 @@
 
 #include "universe.hpp"
 #include <ftl/protocol/self.hpp>
+#include <ftl/protocol/service.hpp>
 #include "./streams/netstream.hpp"
 #include "./streams/filestream.hpp"
 #include <ftl/protocol/muxer.hpp>
@@ -24,6 +25,10 @@ std::shared_ptr<ftl::protocol::Node> Self::connectNode(const std::string &uri) {
     return std::make_shared<ftl::protocol::Node>(universe_->connect(uri));
 }
 
+std::shared_ptr<ftl::protocol::Service> Self::connectService(const std::string &uri) {
+    return std::make_shared<ftl::protocol::Service>(universe_->connect(uri));
+}
+
 std::shared_ptr<ftl::protocol::Stream> Self::createStream(const std::string &uri) {
     ftl::URI u(uri);
 
diff --git a/src/service.cpp b/src/service.cpp
new file mode 100644
index 0000000..1de41d4
--- /dev/null
+++ b/src/service.cpp
@@ -0,0 +1,14 @@
+/**
+ * @file service.cpp
+ * @copyright Copyright (c) 2022 University of Turku, MIT License
+ * @author Nicolas Pope
+ */
+
+#include <ftl/protocol/service.hpp>
+
+using ftl::protocol::Service;
+using ftl::protocol::Node;
+
+Service::Service(const ftl::net::PeerPtr &impl): Node(impl) {}
+
+Service::~Service() {}
diff --git a/test/rpc_integration.cpp b/test/rpc_integration.cpp
index 1ea1ad3..e0c0b7e 100644
--- a/test/rpc_integration.cpp
+++ b/test/rpc_integration.cpp
@@ -2,6 +2,7 @@
 #include <ftl/protocol.hpp>
 #include <ftl/protocol/self.hpp>
 #include <ftl/protocol/node.hpp>
+#include <ftl/protocol/service.hpp>
 #include <ftl/uri.hpp>
 #include <ftl/exception.hpp>
 #include <ftl/lib/nlohmann/json.hpp>
@@ -50,7 +51,7 @@ TEST_CASE("RPC List Streams", "[rpc]") {
     {
         auto uri = "tcp://127.0.0.1:" + std::to_string(self->getListeningURIs().front().getPort());
         LOG(INFO) << uri;
-        auto p = ftl::connectNode(uri);
+        auto p = ftl::setServiceProvider(uri);
         REQUIRE(p);
         REQUIRE(p->waitConnection(5));
         REQUIRE(self->waitConnections(5) == 1);
-- 
GitLab