From 7e2427148e9023483f266cd3ac4e167d50320796 Mon Sep 17 00:00:00 2001
From: Florent Le Coz <louiz@louiz.org>
Date: Mon, 21 Dec 2015 20:45:40 +0100
Subject: =?UTF-8?q?Use=20references=20instead=20of=20raw=20pointer,=20to?=
 =?UTF-8?q?=20store=20the=20=E2=80=9Cparent=E2=80=9D=20object?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

In Bridge and IrcClient
---
 src/bridge/bridge.cpp          | 62 +++++++++++++++++------------------
 src/bridge/bridge.hpp          |  8 ++---
 src/irc/irc_client.cpp         | 74 +++++++++++++++++++++---------------------
 src/irc/irc_client.hpp         |  6 ++--
 src/xmpp/biboumi_component.cpp |  2 +-
 5 files changed, 75 insertions(+), 77 deletions(-)

(limited to 'src')

diff --git a/src/bridge/bridge.cpp b/src/bridge/bridge.cpp
index a1ba71a..55f4c51 100644
--- a/src/bridge/bridge.cpp
+++ b/src/bridge/bridge.cpp
@@ -14,7 +14,7 @@ using namespace std::string_literals;
 
 static const char* action_prefix = "\01ACTION ";
 
-Bridge::Bridge(const std::string& user_jid, BiboumiComponent* xmpp, std::shared_ptr<Poller> poller):
+Bridge::Bridge(const std::string& user_jid, BiboumiComponent& xmpp, std::shared_ptr<Poller> poller):
   user_jid(user_jid),
   xmpp(xmpp),
   poller(poller)
@@ -105,7 +105,7 @@ IrcClient* Bridge::make_irc_client(const std::string& hostname, const std::strin
                                 std::make_shared<IrcClient>(this->poller, hostname,
                                                             nickname, username,
                                                             realname, jid.domain,
-                                                            this));
+                                                            *this));
       std::shared_ptr<IrcClient> irc = this->irc_clients.at(hostname);
       return irc.get();
     }
@@ -172,7 +172,7 @@ void Bridge::send_channel_message(const Iid& iid, const std::string& body)
 {
   if (iid.get_server().empty())
     {
-      this->xmpp->send_stanza_error("message", this->user_jid, std::to_string(iid), "",
+      this->xmpp.send_stanza_error("message", this->user_jid, std::to_string(iid), "",
                                     "cancel", "remote-server-not-found",
                                     std::to_string(iid) + " is not a valid channel name. "
                                     "A correct room jid is of the form: #<chan>%<server>",
@@ -205,7 +205,7 @@ void Bridge::send_channel_message(const Iid& iid, const std::string& body)
         irc->send_channel_message(iid.get_local(), action_prefix + line.substr(4) + "\01");
       else
         irc->send_channel_message(iid.get_local(), line);
-      this->xmpp->send_muc_message(std::to_string(iid), irc->get_own_nick(),
+      this->xmpp.send_muc_message(std::to_string(iid), irc->get_own_nick(),
                                    this->make_xmpp_body(line), this->user_jid);
     }
 }
@@ -278,7 +278,7 @@ void Bridge::send_private_message(const Iid& iid, const std::string& body, const
 {
   if (iid.get_local().empty() || iid.get_server().empty())
     {
-      this->xmpp->send_stanza_error("message", this->user_jid, std::to_string(iid), "",
+      this->xmpp.send_stanza_error("message", this->user_jid, std::to_string(iid), "",
                                     "cancel", "remote-server-not-found",
                                     std::to_string(iid) + " is not a valid channel name. "
                                     "A correct room jid is of the form: #<chan>%<server>",
@@ -336,7 +336,7 @@ void Bridge::send_irc_channel_list_request(const Iid& iid, const std::string& iq
           std::string text;
           if (message.arguments.size() >= 2)
             text = message.arguments[1];
-          this->xmpp->send_stanza_error("iq", to_jid, std::to_string(iid), iq_id,
+          this->xmpp.send_stanza_error("iq", to_jid, std::to_string(iid), iq_id,
                                         "wait", "service-unavailable", text, false);
           return true;
         }
@@ -349,7 +349,7 @@ void Bridge::send_irc_channel_list_request(const Iid& iid, const std::string& iq
         }
       else if (message.command == "323" || message.command == "RPL_LISTEND")
         { // Send the iq response with the content of the list
-          this->xmpp->send_iq_room_list_result(iq_id, to_jid, std::to_string(iid), list);
+          this->xmpp.send_iq_room_list_result(iq_id, to_jid, std::to_string(iid), list);
           return true;
         }
       return false;
@@ -374,7 +374,7 @@ void Bridge::send_irc_kick(const Iid& iid, const std::string& target, const std:
           const std::string chan_name_later = utils::tolower(message.arguments[0]);
           if (target_later != target || chan_name_later != iid.get_local())
             return false;
-          this->xmpp->send_iq_result(iq_id, to_jid, std::to_string(iid));
+          this->xmpp.send_iq_result(iq_id, to_jid, std::to_string(iid));
         }
       else if (message.command == "401" && message.arguments.size() >= 2)
         {
@@ -384,7 +384,7 @@ void Bridge::send_irc_kick(const Iid& iid, const std::string& target, const std:
           std::string error_message = "No such nick";
           if (message.arguments.size() >= 3)
             error_message = message.arguments[2];
-          this->xmpp->send_stanza_error("iq", to_jid, std::to_string(iid), iq_id, "cancel", "item-not-found",
+          this->xmpp.send_stanza_error("iq", to_jid, std::to_string(iid), iq_id, "cancel", "item-not-found",
                                         error_message, false);
         }
       else if (message.command == "482" && message.arguments.size() >= 2)
@@ -395,7 +395,7 @@ void Bridge::send_irc_kick(const Iid& iid, const std::string& target, const std:
           std::string error_message = "You're not channel operator";
           if (message.arguments.size() >= 3)
             error_message = message.arguments[2];
-          this->xmpp->send_stanza_error("iq", to_jid, std::to_string(iid), iq_id, "cancel", "not-allowed",
+          this->xmpp.send_stanza_error("iq", to_jid, std::to_string(iid), iq_id, "cancel", "not-allowed",
                                         error_message, false);
         }
       return true;
@@ -441,7 +441,7 @@ void Bridge::send_irc_user_ping_request(const std::string& irc_hostname, const s
           if (id != iq_id)
             return false;
           Jid jid(from_jid);
-          this->xmpp->send_iq_result(iq_id, to_jid, jid.local);
+          this->xmpp.send_iq_result(iq_id, to_jid, jid.local);
           return true;
         }
       if (message.command == "401" && message.arguments[1] == nick)
@@ -449,7 +449,7 @@ void Bridge::send_irc_user_ping_request(const std::string& irc_hostname, const s
           std::string error_message = "No such nick";
           if (message.arguments.size() >= 3)
             error_message = message.arguments[2];
-          this->xmpp->send_stanza_error("iq", to_jid, from_jid, iq_id, "cancel", "service-unavailable",
+          this->xmpp.send_stanza_error("iq", to_jid, from_jid, iq_id, "cancel", "service-unavailable",
                                         error_message, true);
           return true;
         }
@@ -467,13 +467,13 @@ void Bridge::send_irc_participant_ping_request(const Iid& iid, const std::string
   IrcChannel* chan = irc->get_channel(iid.get_local());
   if (!chan->joined)
     {
-      this->xmpp->send_stanza_error("iq", to_jid, from_jid, iq_id, "cancel", "not-allowed",
+      this->xmpp.send_stanza_error("iq", to_jid, from_jid, iq_id, "cancel", "not-allowed",
                                     "", true);
       return;
     }
   if (chan->get_self()->nick != nick && !chan->find_user(nick))
     {
-      this->xmpp->send_stanza_error("iq", to_jid, from_jid, iq_id, "cancel", "item-not-found",
+      this->xmpp.send_stanza_error("iq", to_jid, from_jid, iq_id, "cancel", "item-not-found",
                                     "Recipient not in room", true);
       return;
     }
@@ -487,9 +487,9 @@ void Bridge::on_gateway_ping(const std::string& irc_hostname, const std::string&
 {
   Jid jid(from_jid);
   if (irc_hostname.empty() || this->find_irc_client(irc_hostname))
-    this->xmpp->send_iq_result(iq_id, to_jid, jid.local);
+    this->xmpp.send_iq_result(iq_id, to_jid, jid.local);
   else
-    this->xmpp->send_stanza_error("iq", to_jid, from_jid, iq_id, "cancel", "service-unavailable",
+    this->xmpp.send_stanza_error("iq", to_jid, from_jid, iq_id, "cancel", "service-unavailable",
                                   "", true);
 }
 
@@ -511,7 +511,7 @@ void Bridge::send_irc_version_request(const std::string& irc_hostname, const std
         {
           // remove the "\01VERSION " and the "\01" parts from the string
           const std::string version = message.arguments[1].substr(9, message.arguments[1].size() - 10);
-          this->xmpp->send_version(iq_id, to_jid, from_jid, version);
+          this->xmpp.send_version(iq_id, to_jid, from_jid, version);
           return true;
         }
       if (message.command == "401" && message.arguments.size() >= 2
@@ -520,7 +520,7 @@ void Bridge::send_irc_version_request(const std::string& irc_hostname, const std
           std::string error_message = "No such nick";
           if (message.arguments.size() >= 3)
             error_message = message.arguments[2];
-          this->xmpp->send_stanza_error("iq", to_jid, from_jid, iq_id, "cancel", "item-not-found",
+          this->xmpp.send_stanza_error("iq", to_jid, from_jid, iq_id, "cancel", "item-not-found",
                                         error_message, true);
           return true;
         }
@@ -532,7 +532,7 @@ void Bridge::send_irc_version_request(const std::string& irc_hostname, const std
 void Bridge::send_message(const Iid& iid, const std::string& nick, const std::string& body, const bool muc)
 {
   if (muc)
-    this->xmpp->send_muc_message(std::to_string(iid), nick,
+    this->xmpp.send_muc_message(std::to_string(iid), nick,
                                  this->make_xmpp_body(body), this->user_jid);
   else
     {
@@ -544,7 +544,7 @@ void Bridge::send_message(const Iid& iid, const std::string& nick, const std::st
           target = it->second;
           fulljid = true;
         }
-      this->xmpp->send_message(target, this->make_xmpp_body(body),
+      this->xmpp.send_message(target, this->make_xmpp_body(body),
                                this->user_jid, "chat", fulljid);
     }
 }
@@ -553,12 +553,12 @@ void Bridge::send_presence_error(const Iid& iid, const std::string& nick,
                                  const std::string& type, const std::string& condition,
                                  const std::string& error_code, const std::string& text)
 {
-  this->xmpp->send_presence_error(std::to_string(iid), nick, this->user_jid, type, condition, error_code, text);
+  this->xmpp.send_presence_error(std::to_string(iid), nick, this->user_jid, type, condition, error_code, text);
 }
 
 void Bridge::send_muc_leave(Iid&& iid, std::string&& nick, const std::string& message, const bool self)
 {
-  this->xmpp->send_muc_leave(std::to_string(iid), std::move(nick), this->make_xmpp_body(message), this->user_jid, self);
+  this->xmpp.send_muc_leave(std::to_string(iid), std::move(nick), this->make_xmpp_body(message), this->user_jid, self);
   IrcClient* irc = this->find_irc_client(iid.get_server());
   if (irc && irc->number_of_joined_channels() == 0)
     irc->send_quit_command("");
@@ -574,7 +574,7 @@ void Bridge::send_nick_change(Iid&& iid,
   std::string role;
   std::tie(role, affiliation) = get_role_affiliation_from_irc_mode(user_mode);
 
-  this->xmpp->send_nick_change(std::to_string(iid),
+  this->xmpp.send_nick_change(std::to_string(iid),
                                old_nick, new_nick, affiliation, role, this->user_jid, self);
 }
 
@@ -590,7 +590,7 @@ void Bridge::send_xmpp_message(const std::string& from, const std::string& autho
     }
   else
     body = msg;
-  this->xmpp->send_message(from, this->make_xmpp_body(body), this->user_jid, "chat");
+  this->xmpp.send_message(from, this->make_xmpp_body(body), this->user_jid, "chat");
 }
 
 void Bridge::send_user_join(const std::string& hostname,
@@ -603,13 +603,13 @@ void Bridge::send_user_join(const std::string& hostname,
   std::string role;
   std::tie(role, affiliation) = get_role_affiliation_from_irc_mode(user_mode);
 
-  this->xmpp->send_user_join(chan_name + utils::empty_if_fixed_server("%" + hostname), user->nick, user->host,
+  this->xmpp.send_user_join(chan_name + utils::empty_if_fixed_server("%" + hostname), user->nick, user->host,
                              affiliation, role, this->user_jid, self);
 }
 
 void Bridge::send_topic(const std::string& hostname, const std::string& chan_name, const std::string& topic)
 {
-  this->xmpp->send_topic(chan_name + utils::empty_if_fixed_server("%" + hostname), this->make_xmpp_body(topic), this->user_jid);
+  this->xmpp.send_topic(chan_name + utils::empty_if_fixed_server("%" + hostname), this->make_xmpp_body(topic), this->user_jid);
 }
 
 std::string Bridge::get_own_nick(const Iid& iid)
@@ -627,12 +627,12 @@ size_t Bridge::active_clients() const
 
 void Bridge::kick_muc_user(Iid&& iid, const std::string& target, const std::string& reason, const std::string& author)
 {
-  this->xmpp->kick_user(std::to_string(iid), target, reason, author, this->user_jid);
+  this->xmpp.kick_user(std::to_string(iid), target, reason, author, this->user_jid);
 }
 
 void Bridge::send_nickname_conflict_error(const Iid& iid, const std::string& nickname)
 {
-  this->xmpp->send_presence_error(std::to_string(iid), nickname, this->user_jid, "cancel", "conflict", "409", "");
+  this->xmpp.send_presence_error(std::to_string(iid), nickname, this->user_jid, "cancel", "conflict", "409", "");
 }
 
 void Bridge::send_affiliation_role_change(const Iid& iid, const std::string& target, const char mode)
@@ -641,12 +641,12 @@ void Bridge::send_affiliation_role_change(const Iid& iid, const std::string& tar
   std::string affiliation;
 
   std::tie(role, affiliation) = get_role_affiliation_from_irc_mode(mode);
-  this->xmpp->send_affiliation_role_change(std::to_string(iid), target, affiliation, role, this->user_jid);
+  this->xmpp.send_affiliation_role_change(std::to_string(iid), target, affiliation, role, this->user_jid);
 }
 
 void Bridge::send_iq_version_request(const std::string& nick, const std::string& hostname)
 {
-  this->xmpp->send_iq_version_request(nick + "!" + utils::empty_if_fixed_server(hostname), this->user_jid);
+  this->xmpp.send_iq_version_request(nick + "!" + utils::empty_if_fixed_server(hostname), this->user_jid);
 }
 
 void Bridge::send_xmpp_ping_request(const std::string& nick, const std::string& hostname,
@@ -655,7 +655,7 @@ void Bridge::send_xmpp_ping_request(const std::string& nick, const std::string&
   // Use revstr because the forwarded ping to target XMPP user must not be
   // the same that the request iq, but we also need to get it back easily
   // (revstr again)
-  this->xmpp->send_ping_request(nick + "!" + utils::empty_if_fixed_server(hostname), this->user_jid, utils::revstr(id));
+  this->xmpp.send_ping_request(nick + "!" + utils::empty_if_fixed_server(hostname), this->user_jid, utils::revstr(id));
 }
 
 void Bridge::set_preferred_from_jid(const std::string& nick, const std::string& full_jid)
diff --git a/src/bridge/bridge.hpp b/src/bridge/bridge.hpp
index 7b8df8f..e73bd19 100644
--- a/src/bridge/bridge.hpp
+++ b/src/bridge/bridge.hpp
@@ -33,7 +33,7 @@ using irc_responder_callback_t = std::function<bool(const std::string& irc_hostn
 class Bridge
 {
 public:
-  explicit Bridge(const std::string& user_jid, BiboumiComponent* xmpp, std::shared_ptr<Poller> poller);
+  explicit Bridge(const std::string& user_jid, BiboumiComponent& xmpp, std::shared_ptr<Poller> poller);
   ~Bridge();
   /**
    * QUIT all connected IRC servers.
@@ -216,11 +216,9 @@ private:
    */
   std::unordered_map<std::string, std::shared_ptr<IrcClient>> irc_clients;
   /**
-   * A raw pointer, because we do not own it, the XMPP component owns us,
-   * but we still need to communicate with it, when sending messages from
-   * IRC to XMPP.
+   * To communicate back with the XMPP component
    */
-  BiboumiComponent* xmpp;
+  BiboumiComponent& xmpp;
   /**
    * Poller, to give it the IrcClients that we spawn, to make it manage
    * their sockets.
diff --git a/src/irc/irc_client.cpp b/src/irc/irc_client.cpp
index e53c540..4aa45ac 100644
--- a/src/irc/irc_client.cpp
+++ b/src/irc/irc_client.cpp
@@ -27,7 +27,7 @@ using namespace std::chrono_literals;
 IrcClient::IrcClient(std::shared_ptr<Poller> poller, const std::string& hostname,
                      const std::string& nickname, const std::string& username,
                      const std::string& realname, const std::string& user_hostname,
-                     Bridge* bridge):
+                     Bridge& bridge):
   TCPSocketHandler(poller),
   hostname(hostname),
   user_hostname(user_hostname),
@@ -48,7 +48,7 @@ IrcClient::IrcClient(std::shared_ptr<Poller> poller, const std::string& hostname
                               "To disconnect from the IRC server, leave this room and all "
                               "other IRC channels of that server.";
 #ifdef USE_DATABASE
-  auto options = Database::get_irc_server_options(this->bridge->get_bare_jid(),
+  auto options = Database::get_irc_server_options(this->bridge.get_bare_jid(),
                                                   this->get_hostname());
   std::vector<std::string> ports = utils::split(options.ports, ';', false);
   for (auto it = ports.rbegin(); it != ports.rend(); ++it)
@@ -72,7 +72,7 @@ IrcClient::~IrcClient()
 {
   // This event may or may not exist (if we never got connected, it
   // doesn't), but it's ok
-  TimedEventsManager::instance().cancel("PING"s + this->hostname + this->bridge->get_jid());
+  TimedEventsManager::instance().cancel("PING"s + this->hostname + this->bridge.get_jid());
 }
 
 void IrcClient::start()
@@ -83,7 +83,7 @@ void IrcClient::start()
   bool tls;
   std::tie(port, tls) = this->ports_to_try.top();
   this->ports_to_try.pop();
-  this->bridge->send_xmpp_message(this->hostname, "", "Connecting to "s +
+  this->bridge.send_xmpp_message(this->hostname, "", "Connecting to "s +
                                   this->hostname + ":" + port + " (" +
                                   (tls ? "encrypted" : "not encrypted") + ")");
 
@@ -94,7 +94,7 @@ void IrcClient::start()
 
 void IrcClient::on_connection_failed(const std::string& reason)
 {
-  this->bridge->send_xmpp_message(this->hostname, "",
+  this->bridge.send_xmpp_message(this->hostname, "",
                                   "Connection failed: "s + reason);
 
   if (this->hostname_resolution_failed)
@@ -107,7 +107,7 @@ void IrcClient::on_connection_failed(const std::string& reason)
       for (const auto& tuple: this->channels_to_join)
         {
           Iid iid(std::get<0>(tuple) + "%" + this->hostname);
-          this->bridge->send_presence_error(iid, this->current_nick,
+          this->bridge.send_presence_error(iid, this->current_nick,
                                             "cancel", "item-not-found",
                                             "", reason);
         }
@@ -152,7 +152,7 @@ void IrcClient::on_connected()
     }
 
 #ifdef USE_DATABASE
-  auto options = Database::get_irc_server_options(this->bridge->get_bare_jid(),
+  auto options = Database::get_irc_server_options(this->bridge.get_bare_jid(),
                                                   this->get_hostname());
   if (!options.pass.value().empty())
     this->send_pass_command(options.pass.value());
@@ -258,7 +258,7 @@ void IrcClient::parse_in_buffer(const size_t)
           this->on_unknown_message(message);
         }
       // Try to find a waiting_iq, which response will be triggered by this IrcMessage
-      this->bridge->trigger_on_irc_message(this->hostname, message);
+      this->bridge.trigger_on_irc_message(this->hostname, message);
     }
 }
 
@@ -413,7 +413,7 @@ void IrcClient::forward_server_message(const IrcMessage& message)
   const std::string from = message.prefix;
   const std::string body = message.arguments[1];
 
-  this->bridge->send_xmpp_message(this->hostname, from, body);
+  this->bridge.send_xmpp_message(this->hostname, from, body);
 }
 
 void IrcClient::on_notice(const IrcMessage& message)
@@ -438,11 +438,11 @@ void IrcClient::on_notice(const IrcMessage& message)
       if (this->nicks_to_treat_as_private.find(nick) !=
           this->nicks_to_treat_as_private.end())
         { // We previously sent a message to that nick)
-          this->bridge->send_message({nick + "!" + this->hostname}, nick, body,
+          this->bridge.send_message({nick + "!" + this->hostname}, nick, body,
                                      false);
         }
       else
-        this->bridge->send_xmpp_message(this->hostname, from, body);
+        this->bridge.send_xmpp_message(this->hostname, from, body);
     }
   else
     {
@@ -494,7 +494,7 @@ void IrcClient::on_isupport_message(const IrcMessage& message)
 
 void IrcClient::send_gateway_message(const std::string& message, const std::string& from)
 {
-  this->bridge->send_xmpp_message(this->hostname, from, message);
+  this->bridge.send_xmpp_message(this->hostname, from, message);
 }
 
 void IrcClient::set_and_forward_user_list(const IrcMessage& message)
@@ -507,7 +507,7 @@ void IrcClient::set_and_forward_user_list(const IrcMessage& message)
       const IrcUser* user = channel->add_user(nick, this->prefix_to_mode);
       if (user->nick != channel->get_self()->nick)
         {
-          this->bridge->send_user_join(this->hostname, chan_name, user,
+          this->bridge.send_user_join(this->hostname, chan_name, user,
                                        user->get_most_significant_mode(this->sorted_user_modes),
                                        false);
         }
@@ -533,7 +533,7 @@ void IrcClient::on_channel_join(const IrcMessage& message)
   else
     {
       const IrcUser* user = channel->add_user(nick, this->prefix_to_mode);
-      this->bridge->send_user_join(this->hostname, chan_name, user,
+      this->bridge.send_user_join(this->hostname, chan_name, user,
                                    user->get_most_significant_mode(this->sorted_user_modes),
                                    false);
     }
@@ -559,16 +559,16 @@ void IrcClient::on_channel_message(const IrcMessage& message)
   if (!body.empty() && body[0] == '\01')
     {
       if (body.substr(1, 6) == "ACTION")
-        this->bridge->send_message(iid, nick,
+        this->bridge.send_message(iid, nick,
                   "/me"s + body.substr(7, body.size() - 8), muc);
       else if (body.substr(1, 8) == "VERSION\01")
-        this->bridge->send_iq_version_request(nick, this->hostname);
+        this->bridge.send_iq_version_request(nick, this->hostname);
       else if (body.substr(1, 5) == "PING ")
-        this->bridge->send_xmpp_ping_request(utils::tolower(nick), this->hostname,
+        this->bridge.send_xmpp_ping_request(utils::tolower(nick), this->hostname,
                                              body.substr(6, body.size() - 7));
     }
   else
-    this->bridge->send_message(iid, nick, body, muc);
+    this->bridge.send_message(iid, nick, body, muc);
 }
 
 void IrcClient::on_rpl_liststart(const IrcMessage&)
@@ -599,7 +599,7 @@ void IrcClient::on_motd_line(const IrcMessage& message)
 
 void IrcClient::send_motd(const IrcMessage&)
 {
-  this->bridge->send_xmpp_message(this->hostname, "", this->motd);
+  this->bridge.send_xmpp_message(this->hostname, "", this->motd);
 }
 
 void IrcClient::on_topic_received(const IrcMessage& message)
@@ -608,7 +608,7 @@ void IrcClient::on_topic_received(const IrcMessage& message)
   IrcChannel* channel = this->get_channel(chan_name);
   channel->topic = message.arguments[message.arguments.size() - 1];
   if (channel->joined)
-    this->bridge->send_topic(this->hostname, chan_name, channel->topic);
+    this->bridge.send_topic(this->hostname, chan_name, channel->topic);
 }
 
 void IrcClient::on_channel_completely_joined(const IrcMessage& message)
@@ -616,10 +616,10 @@ void IrcClient::on_channel_completely_joined(const IrcMessage& message)
   const std::string chan_name = utils::tolower(message.arguments[1]);
   IrcChannel* channel = this->get_channel(chan_name);
   channel->joined = true;
-  this->bridge->send_user_join(this->hostname, chan_name, channel->get_self(),
+  this->bridge.send_user_join(this->hostname, chan_name, channel->get_self(),
                                channel->get_self()->get_most_significant_mode(this->sorted_user_modes),
                                true);
-  this->bridge->send_topic(this->hostname, chan_name, channel->topic);
+  this->bridge.send_topic(this->hostname, chan_name, channel->topic);
 }
 
 void IrcClient::on_erroneous_nickname(const IrcMessage& message)
@@ -639,7 +639,7 @@ void IrcClient::on_nickname_conflict(const IrcMessage& message)
     iid.set_local(it->first);
     iid.set_server(this->hostname);
     iid.is_channel = true;
-    this->bridge->send_nickname_conflict_error(iid, nickname);
+    this->bridge.send_nickname_conflict_error(iid, nickname);
   }
 }
 
@@ -656,7 +656,7 @@ void IrcClient::on_nickname_change_too_fast(const IrcMessage& message)
     iid.set_local(it->first);
     iid.set_server(this->hostname);
     iid.is_channel = true;
-    this->bridge->send_presence_error(iid, nickname,
+    this->bridge.send_presence_error(iid, nickname,
                                       "cancel", "not-acceptable",
                                       "", txt);
   }
@@ -674,14 +674,14 @@ void IrcClient::on_welcome_message(const IrcMessage& message)
   this->current_nick = message.arguments[0];
   this->welcomed = true;
 #ifdef USE_DATABASE
-  auto options = Database::get_irc_server_options(this->bridge->get_bare_jid(),
+  auto options = Database::get_irc_server_options(this->bridge.get_bare_jid(),
                                                   this->get_hostname());
   if (!options.afterConnectionCommand.value().empty())
     this->send_raw(options.afterConnectionCommand.value());
 #endif
   // Install a repeated events to regularly send a PING
   TimedEventsManager::instance().add_event(TimedEvent(240s, std::bind(&IrcClient::send_ping_command, this),
-                                                      "PING"s + this->hostname + this->bridge->get_jid()));
+                                                      "PING"s + this->hostname + this->bridge.get_jid()));
   for (const auto& tuple: this->channels_to_join)
     this->send_join_command(std::get<0>(tuple), std::get<1>(tuple));
   this->channels_to_join.clear();
@@ -725,7 +725,7 @@ void IrcClient::on_part(const IrcMessage& message)
         // channel pointer is now invalid
         channel = nullptr;
       }
-      this->bridge->send_muc_leave(std::move(iid), std::move(nick), std::move(txt), self);
+      this->bridge.send_muc_leave(std::move(iid), std::move(nick), std::move(txt), self);
     }
 }
 
@@ -743,7 +743,7 @@ void IrcClient::on_error(const IrcMessage& message)
     if (!channel->joined)
       continue;
     std::string own_nick = channel->get_self()->nick;
-    this->bridge->send_muc_leave(std::move(iid), std::move(own_nick), leave_message, true);
+    this->bridge.send_muc_leave(std::move(iid), std::move(own_nick), leave_message, true);
   }
   this->channels.clear();
   this->send_gateway_message("ERROR: "s + leave_message);
@@ -767,7 +767,7 @@ void IrcClient::on_quit(const IrcMessage& message)
           iid.set_local(chan_name);
           iid.set_server(this->hostname);
           iid.is_channel = true;
-          this->bridge->send_muc_leave(std::move(iid), std::move(nick), txt, false);
+          this->bridge.send_muc_leave(std::move(iid), std::move(nick), txt, false);
         }
     }
 }
@@ -789,7 +789,7 @@ void IrcClient::on_nick(const IrcMessage& message)
           iid.is_channel = true;
           const bool self = channel->get_self()->nick == old_nick;
           const char user_mode = user->get_most_significant_mode(this->sorted_user_modes);
-          this->bridge->send_nick_change(std::move(iid), old_nick, new_nick, user_mode, self);
+          this->bridge.send_nick_change(std::move(iid), old_nick, new_nick, user_mode, self);
           user->nick = new_nick;
           if (self)
             {
@@ -815,7 +815,7 @@ void IrcClient::on_kick(const IrcMessage& message)
   iid.set_local(chan_name);
   iid.set_server(this->hostname);
   iid.is_channel = true;
-  this->bridge->kick_muc_user(std::move(iid), target, reason, author.nick);
+  this->bridge.kick_muc_user(std::move(iid), target, reason, author.nick);
 }
 
 void IrcClient::on_mode(const IrcMessage& message)
@@ -846,7 +846,7 @@ void IrcClient::on_channel_mode(const IrcMessage& message)
           mode_arguments += message.arguments[i];
         }
     }
-  this->bridge->send_message(iid, "", "Mode "s + iid.get_local() +
+  this->bridge.send_message(iid, "", "Mode "s + iid.get_local() +
                                       " [" + mode_arguments + "] by " + user.nick,
                              true);
   const IrcChannel* channel = this->get_channel(iid.get_local());
@@ -917,13 +917,13 @@ void IrcClient::on_channel_mode(const IrcMessage& message)
   for (const IrcUser* u: modified_users)
     {
       char most_significant_mode = u->get_most_significant_mode(this->sorted_user_modes);
-      this->bridge->send_affiliation_role_change(iid, u->nick, most_significant_mode);
+      this->bridge.send_affiliation_role_change(iid, u->nick, most_significant_mode);
     }
 }
 
 void IrcClient::on_user_mode(const IrcMessage& message)
 {
-  this->bridge->send_xmpp_message(this->hostname, "",
+  this->bridge.send_xmpp_message(this->hostname, "",
                                   "User mode for "s + message.arguments[0] +
                                   " is [" + message.arguments[1] + "]");
 }
@@ -940,7 +940,7 @@ void IrcClient::on_unknown_message(const IrcMessage& message)
       if (it + 1 != message.arguments.end())
         ss << " ";
     }
-  this->bridge->send_xmpp_message(this->hostname, from, ss.str());
+  this->bridge.send_xmpp_message(this->hostname, from, ss.str());
 }
 
 size_t IrcClient::number_of_joined_channels() const
@@ -963,14 +963,14 @@ void IrcClient::leave_dummy_channel(const std::string& exit_message)
   this->dummy_channel.joined = false;
   this->dummy_channel.joining = false;
   this->dummy_channel.remove_all_users();
-  this->bridge->send_muc_leave(Iid("%"s + this->hostname), std::string(this->current_nick), exit_message, true);
+  this->bridge.send_muc_leave(Iid("%"s + this->hostname), std::string(this->current_nick), exit_message, true);
 }
 
 #ifdef BOTAN_FOUND
 bool IrcClient::abort_on_invalid_cert() const
 {
 #ifdef USE_DATABASE
-  auto options = Database::get_irc_server_options(this->bridge->get_bare_jid(), this->hostname);
+  auto options = Database::get_irc_server_options(this->bridge.get_bare_jid(), this->hostname);
   return options.verifyCert.value();
 #endif
   return true;
diff --git a/src/irc/irc_client.hpp b/src/irc/irc_client.hpp
index 733fc92..7c2a43f 100644
--- a/src/irc/irc_client.hpp
+++ b/src/irc/irc_client.hpp
@@ -29,7 +29,7 @@ public:
   explicit IrcClient(std::shared_ptr<Poller> poller, const std::string& hostname,
                      const std::string& nickname, const std::string& username,
                      const std::string& realname, const std::string& user_hostname,
-                     Bridge* bridge);
+                     Bridge& bridge);
   ~IrcClient();
   /**
    * Connect to the IRC server
@@ -281,9 +281,9 @@ private:
    */
   std::string current_nick;
   /**
-   * Raw pointer because the bridge owns us.
+   * To communicate back with the bridge
    */
-  Bridge* bridge;
+  Bridge& bridge;
   /**
    * The list of joined channels, indexed by name
    */
diff --git a/src/xmpp/biboumi_component.cpp b/src/xmpp/biboumi_component.cpp
index 72b767f..9682dcb 100644
--- a/src/xmpp/biboumi_component.cpp
+++ b/src/xmpp/biboumi_component.cpp
@@ -488,7 +488,7 @@ Bridge* BiboumiComponent::get_user_bridge(const std::string& user_jid)
     }
   catch (const std::out_of_range& exception)
     {
-      this->bridges.emplace(user_jid, std::make_unique<Bridge>(user_jid, this, this->poller));
+      this->bridges.emplace(user_jid, std::make_unique<Bridge>(user_jid, *this, this->poller));
       return this->bridges.at(user_jid).get();
     }
 }
-- 
cgit v1.2.3