src.ctf.lttng-live: introduce live_viewer_connection::UP and use it
[babeltrace.git] / src / plugins / ctf / lttng-live / viewer-connection.cpp
index 4a71508e720baf7429ef70490de6a02b406419a9..66605b10022cc66ceeb1cb352c357b52a0624aa3 100644 (file)
@@ -13,6 +13,7 @@
 
 #include "common/common.h"
 #include "compat/endian.h" /* IWYU pragma: keep  */
+#include "cpp-common/bt2s/make-unique.hpp"
 
 #include "data-stream.hpp"
 #include "lttng-live.hpp"
@@ -229,22 +230,22 @@ static int parse_url(struct live_viewer_connection *viewer_connection)
     char error_buf[256] = {0};
     struct bt_common_lttng_live_url_parts lttng_live_url_parts = {};
     int ret = -1;
-    const char *path = viewer_connection->url->str;
 
-    if (!path) {
+    if (viewer_connection->url.empty()) {
         goto end;
     }
 
-    lttng_live_url_parts = bt_common_parse_lttng_live_url(path, error_buf, sizeof(error_buf));
+    lttng_live_url_parts = bt_common_parse_lttng_live_url(viewer_connection->url.c_str(), error_buf,
+                                                          sizeof(error_buf));
     if (!lttng_live_url_parts.proto) {
         BT_CPPLOGE_APPEND_CAUSE_SPEC(viewer_connection->logger, "Invalid LTTng live URL format: {}",
                                      error_buf);
         goto end;
     }
-    viewer_connection->proto = lttng_live_url_parts.proto;
+    viewer_connection->proto.reset(lttng_live_url_parts.proto);
     lttng_live_url_parts.proto = NULL;
 
-    viewer_connection->relay_hostname = lttng_live_url_parts.hostname;
+    viewer_connection->relay_hostname.reset(lttng_live_url_parts.hostname);
     lttng_live_url_parts.hostname = NULL;
 
     if (lttng_live_url_parts.port >= 0) {
@@ -253,11 +254,11 @@ static int parse_url(struct live_viewer_connection *viewer_connection)
         viewer_connection->port = LTTNG_DEFAULT_NETWORK_VIEWER_PORT;
     }
 
-    viewer_connection->target_hostname = lttng_live_url_parts.target_hostname;
+    viewer_connection->target_hostname.reset(lttng_live_url_parts.target_hostname);
     lttng_live_url_parts.target_hostname = NULL;
 
     if (lttng_live_url_parts.session_name) {
-        viewer_connection->session_name = lttng_live_url_parts.session_name;
+        viewer_connection->session_name.reset(lttng_live_url_parts.session_name);
         lttng_live_url_parts.session_name = NULL;
     }
 
@@ -502,7 +503,7 @@ end:
     return ret;
 }
 
-static int list_append_session(bt_value *results, GString *base_url,
+static int list_append_session(bt_value *results, const std::string& base_url,
                                const struct lttng_viewer_session *session,
                                struct live_viewer_connection *viewer_connection)
 {
@@ -528,20 +529,20 @@ static int list_append_session(bt_value *results, GString *base_url,
         goto end;
     }
 
-    if (base_url->len < 1) {
+    if (base_url.empty()) {
         BT_CPPLOGE_APPEND_CAUSE_SPEC(viewer_connection->logger,
                                      "Error: base_url length smaller than 1.");
         ret = -1;
         goto end;
     }
+
     /*
      * key = "url",
      * value = <string>,
      */
     insert_status = bt_value_map_insert_string_entry(
         map, "url",
-        fmt::format("{}/host/{}/{}", base_url->str, session->hostname, session->session_name)
-            .c_str());
+        fmt::format("{}/host/{}/{}", base_url, session->hostname, session->session_name).c_str());
     if (insert_status != BT_VALUE_MAP_INSERT_ENTRY_STATUS_OK) {
         BT_CPPLOGE_APPEND_CAUSE_SPEC(viewer_connection->logger, "Error inserting \"url\" entry.");
         ret = -1;
@@ -753,7 +754,7 @@ lttng_live_query_session_ids(struct lttng_live_msg_iter *lttng_live_msg_iter)
     uint32_t i, sessions_count;
     uint64_t session_id;
     enum lttng_live_viewer_status status;
-    struct live_viewer_connection *viewer_connection = lttng_live_msg_iter->viewer_connection;
+    live_viewer_connection *viewer_connection = lttng_live_msg_iter->viewer_connection.get();
 
     BT_CPPLOGD_SPEC(viewer_connection->logger,
                     "Asking the relay daemon for the list of sessions: cmd={}",
@@ -817,7 +818,7 @@ lttng_live_create_viewer_session(struct lttng_live_msg_iter *lttng_live_msg_iter
     struct lttng_viewer_cmd cmd;
     struct lttng_viewer_create_session_response resp;
     enum lttng_live_viewer_status status;
-    struct live_viewer_connection *viewer_connection = lttng_live_msg_iter->viewer_connection;
+    live_viewer_connection *viewer_connection = lttng_live_msg_iter->viewer_connection.get();
 
     BT_CPPLOGD_SPEC(viewer_connection->logger, "Creating a viewer session: cmd={}",
                     LTTNG_VIEWER_CREATE_SESSION);
@@ -864,7 +865,7 @@ static enum lttng_live_viewer_status receive_streams(struct lttng_live_session *
     uint32_t i;
     struct lttng_live_msg_iter *lttng_live_msg_iter = session->lttng_live_msg_iter;
     enum lttng_live_viewer_status status;
-    struct live_viewer_connection *viewer_connection = lttng_live_msg_iter->viewer_connection;
+    live_viewer_connection *viewer_connection = lttng_live_msg_iter->viewer_connection.get();
 
     BT_CPPLOGI_SPEC(viewer_connection->logger, "Getting {} new streams", stream_count);
     for (i = 0; i < stream_count; i++) {
@@ -919,7 +920,7 @@ enum lttng_live_viewer_status lttng_live_session_attach(struct lttng_live_sessio
     struct lttng_viewer_attach_session_request rq;
     struct lttng_viewer_attach_session_response rp;
     struct lttng_live_msg_iter *lttng_live_msg_iter = session->lttng_live_msg_iter;
-    struct live_viewer_connection *viewer_connection = lttng_live_msg_iter->viewer_connection;
+    live_viewer_connection *viewer_connection = lttng_live_msg_iter->viewer_connection.get();
     uint64_t session_id = session->id;
     uint32_t streams_count;
     const size_t cmd_buf_len = sizeof(cmd) + sizeof(rq);
@@ -1015,7 +1016,7 @@ enum lttng_live_viewer_status lttng_live_session_detach(struct lttng_live_sessio
     struct lttng_viewer_detach_session_request rq;
     struct lttng_viewer_detach_session_response rp;
     struct lttng_live_msg_iter *lttng_live_msg_iter = session->lttng_live_msg_iter;
-    struct live_viewer_connection *viewer_connection = lttng_live_msg_iter->viewer_connection;
+    live_viewer_connection *viewer_connection = lttng_live_msg_iter->viewer_connection.get();
     uint64_t session_id = session->id;
     const size_t cmd_buf_len = sizeof(cmd) + sizeof(rq);
     char cmd_buf[cmd_buf_len];
@@ -1097,7 +1098,7 @@ lttng_live_get_one_metadata_packet(struct lttng_live_trace *trace, std::vector<c
     struct lttng_live_session *session = trace->session;
     struct lttng_live_msg_iter *lttng_live_msg_iter = session->lttng_live_msg_iter;
     struct lttng_live_metadata *metadata = trace->metadata.get();
-    struct live_viewer_connection *viewer_connection = lttng_live_msg_iter->viewer_connection;
+    live_viewer_connection *viewer_connection = lttng_live_msg_iter->viewer_connection.get();
     const size_t cmd_buf_len = sizeof(cmd) + sizeof(rq);
     char cmd_buf[cmd_buf_len];
 
@@ -1234,7 +1235,7 @@ lttng_live_get_next_index(struct lttng_live_msg_iter *lttng_live_msg_iter,
     enum lttng_live_viewer_status viewer_status;
     struct lttng_viewer_index rp;
     enum lttng_live_iterator_status status;
-    struct live_viewer_connection *viewer_connection = lttng_live_msg_iter->viewer_connection;
+    live_viewer_connection *viewer_connection = lttng_live_msg_iter->viewer_connection.get();
     struct lttng_live_trace *trace = stream->trace;
     const size_t cmd_buf_len = sizeof(cmd) + sizeof(rq);
     char cmd_buf[cmd_buf_len];
@@ -1373,7 +1374,7 @@ lttng_live_get_stream_bytes(struct lttng_live_msg_iter *lttng_live_msg_iter,
     struct lttng_viewer_trace_packet rp;
     struct lttng_viewer_cmd cmd;
     struct lttng_viewer_get_packet rq;
-    struct live_viewer_connection *viewer_connection = lttng_live_msg_iter->viewer_connection;
+    live_viewer_connection *viewer_connection = lttng_live_msg_iter->viewer_connection.get();
     struct lttng_live_trace *trace = stream->trace;
     const size_t cmd_buf_len = sizeof(cmd) + sizeof(rq);
     char cmd_buf[cmd_buf_len];
@@ -1500,7 +1501,7 @@ lttng_live_session_get_new_streams(struct lttng_live_session *session,
     struct lttng_viewer_new_streams_response rp;
     struct lttng_live_msg_iter *lttng_live_msg_iter = session->lttng_live_msg_iter;
     enum lttng_live_viewer_status viewer_status;
-    struct live_viewer_connection *viewer_connection = lttng_live_msg_iter->viewer_connection;
+    live_viewer_connection *viewer_connection = lttng_live_msg_iter->viewer_connection.get();
     uint32_t streams_count;
     const size_t cmd_buf_len = sizeof(cmd) + sizeof(rq);
     char cmd_buf[cmd_buf_len];
@@ -1582,33 +1583,27 @@ end:
     return status;
 }
 
-enum lttng_live_viewer_status live_viewer_connection_create(
-    const char *url, bool in_query, struct lttng_live_msg_iter *lttng_live_msg_iter,
-    const bt2c::Logger& parentLogger, struct live_viewer_connection **viewer)
+enum lttng_live_viewer_status
+live_viewer_connection_create(const char *url, bool in_query,
+                              struct lttng_live_msg_iter *lttng_live_msg_iter,
+                              const bt2c::Logger& parentLogger, live_viewer_connection::UP& viewer)
 {
-    enum lttng_live_viewer_status status;
-
-    live_viewer_connection *viewer_connection = new live_viewer_connection {parentLogger};
+    auto viewer_connection = bt2s::make_unique<live_viewer_connection>(parentLogger);
 
     if (bt_socket_init(viewer_connection->logger) != 0) {
         BT_CPPLOGE_APPEND_CAUSE_SPEC(viewer_connection->logger, "Failed to init socket");
-        status = LTTNG_LIVE_VIEWER_STATUS_ERROR;
-        goto error;
+        return LTTNG_LIVE_VIEWER_STATUS_ERROR;
     }
 
     viewer_connection->control_sock = BT_INVALID_SOCKET;
     viewer_connection->port = -1;
     viewer_connection->in_query = in_query;
     viewer_connection->lttng_live_msg_iter = lttng_live_msg_iter;
-    viewer_connection->url = g_string_new(url);
-    if (!viewer_connection->url) {
-        BT_CPPLOGE_APPEND_CAUSE_SPEC(viewer_connection->logger, "Failed to allocate URL buffer");
-        status = LTTNG_LIVE_VIEWER_STATUS_ERROR;
-        goto error;
-    }
+    viewer_connection->url = url;
 
     BT_CPPLOGD_SPEC(viewer_connection->logger, "Establishing connection to url \"{}\"...", url);
-    status = lttng_live_connect_viewer(viewer_connection);
+    const auto status = lttng_live_connect_viewer(viewer_connection.get());
+
     /*
      * Only print error and append cause in case of error. not in case of
      * interruption.
@@ -1618,59 +1613,21 @@ enum lttng_live_viewer_status live_viewer_connection_create(
                                      "Failed to establish connection: "
                                      "url=\"{}\"",
                                      url);
-        goto error;
+        return status;
     } else if (status == LTTNG_LIVE_VIEWER_STATUS_INTERRUPTED) {
-        goto error;
+        return status;
     }
     BT_CPPLOGD_SPEC(viewer_connection->logger, "Connection to url \"{}\" is established", url);
 
-    *viewer = viewer_connection;
-    status = LTTNG_LIVE_VIEWER_STATUS_OK;
-    goto end;
-
-error:
-    if (viewer_connection) {
-        live_viewer_connection_destroy(viewer_connection);
-    }
-end:
-    return status;
+    viewer = std::move(viewer_connection);
+    return LTTNG_LIVE_VIEWER_STATUS_OK;
 }
 
-void live_viewer_connection_destroy(struct live_viewer_connection *viewer_connection)
+live_viewer_connection::~live_viewer_connection()
 {
-    if (!viewer_connection) {
-        goto end;
-    }
+    BT_CPPLOGD_SPEC(this->logger, "Closing connection to relay: relay-url=\"{}\"", this->url);
 
-    BT_CPPLOGD_SPEC(viewer_connection->logger, "Closing connection to relay: relay-url=\"{}\"",
-                    viewer_connection->url->str);
-
-    lttng_live_disconnect_viewer(viewer_connection);
-
-    if (viewer_connection->url) {
-        g_string_free(viewer_connection->url, true);
-    }
-
-    if (viewer_connection->relay_hostname) {
-        g_string_free(viewer_connection->relay_hostname, true);
-    }
-
-    if (viewer_connection->target_hostname) {
-        g_string_free(viewer_connection->target_hostname, true);
-    }
-
-    if (viewer_connection->session_name) {
-        g_string_free(viewer_connection->session_name, true);
-    }
-
-    if (viewer_connection->proto) {
-        g_string_free(viewer_connection->proto, true);
-    }
-
-    delete viewer_connection;
+    lttng_live_disconnect_viewer(this);
 
     bt_socket_fini();
-
-end:
-    return;
 }
This page took 0.027109 seconds and 4 git commands to generate.