Преглед изворни кода

LibCore: Convert CTCPSocket to ObjectPtr, add construct() helper

The C_OBJECT macro now also inserts a static construct(...) helper into
the class. Now we can make the constructor(s) private and instead call:

    auto socket = CTCPSocket::construct(arguments);

construct() returns an ObjectPtr<T>, which we'll later switch to being
a NonnullRefPtr<T>, once everything else in in place for ref-counting.
Andreas Kling пре 5 година
родитељ
комит
4298ba25c3

+ 1 - 1
Applications/IRCClient/IRCClient.cpp

@@ -35,7 +35,7 @@ IRCClient::IRCClient()
     , m_log(IRCLogBuffer::create())
     , m_config(CConfigFile::get_for_app("IRCClient"))
 {
-    m_socket = new CTCPSocket(this);
+    m_socket = CTCPSocket::construct(this);
     m_nickname = m_config->read_entry("User", "Nickname", "seren1ty");
     m_hostname = m_config->read_entry("Connection", "Server", "");
     m_port = m_config->read_num_entry("Connection", "Port", 6667);

+ 1 - 1
Applications/IRCClient/IRCClient.h

@@ -137,7 +137,7 @@ private:
     String m_hostname;
     int m_port { 6667 };
 
-    CTCPSocket* m_socket { nullptr };
+    ObjectPtr<CTCPSocket> m_socket;
 
     String m_nickname;
     ObjectPtr<CNotifier> m_notifier;

+ 1 - 1
Libraries/LibCore/CHttpJob.cpp

@@ -116,7 +116,7 @@ void CHttpJob::finish_up()
 void CHttpJob::start()
 {
     ASSERT(!m_socket);
-    m_socket = new CTCPSocket(this);
+    m_socket = CTCPSocket::construct(this);
     m_socket->on_connected = [this] {
         dbg() << "CHttpJob: on_connected callback";
         on_socket_connected();

+ 1 - 1
Libraries/LibCore/CHttpJob.h

@@ -26,7 +26,7 @@ private:
     };
 
     CHttpRequest m_request;
-    CTCPSocket* m_socket { nullptr };
+    ObjectPtr<CTCPSocket> m_socket;
     State m_state { State::InStatus };
     int m_code { -1 };
     HashMap<String, String> m_headers;

+ 10 - 4
Libraries/LibCore/CObject.h

@@ -1,11 +1,12 @@
 #pragma once
 
-#include <AK/String.h>
 #include <AK/Function.h>
 #include <AK/IntrusiveList.h>
 #include <AK/StdLibExtras.h>
+#include <AK/String.h>
 #include <AK/Vector.h>
 #include <AK/Weakable.h>
+#include <LibCore/ObjectPtr.h>
 
 namespace AK {
 class JsonObject;
@@ -16,9 +17,14 @@ class CChildEvent;
 class CCustomEvent;
 class CTimerEvent;
 
-#define C_OBJECT(klass) \
-public:                 \
-    virtual const char* class_name() const override { return #klass; }
+#define C_OBJECT(klass)                                                \
+public:                                                                \
+    virtual const char* class_name() const override { return #klass; } \
+    template<class... Args>                                            \
+    static inline ObjectPtr<klass> construct(Args&&... args)           \
+    {                                                                  \
+        return ObjectPtr<klass>(new klass(forward<Args>(args)...));    \
+    }
 
 class CObject : public Weakable<CObject> {
     // NOTE: No C_OBJECT macro for CObject itself.

+ 2 - 2
Libraries/LibCore/CTCPServer.cpp

@@ -40,7 +40,7 @@ bool CTCPServer::listen(const IPv4Address& address, u16 port)
     return true;
 }
 
-CTCPSocket* CTCPServer::accept()
+ObjectPtr<CTCPSocket> CTCPServer::accept()
 {
     ASSERT(m_listening);
     sockaddr_in in;
@@ -51,5 +51,5 @@ CTCPSocket* CTCPServer::accept()
         return nullptr;
     }
 
-    return new CTCPSocket({}, accepted_fd);
+    return CTCPSocket::construct(accepted_fd);
 }

+ 1 - 1
Libraries/LibCore/CTCPServer.h

@@ -15,7 +15,7 @@ public:
     bool is_listening() const { return m_listening; }
     bool listen(const IPv4Address& address, u16 port);
 
-    CTCPSocket* accept();
+    ObjectPtr<CTCPSocket> accept();
 
     Function<void()> on_ready_to_accept;
 

+ 1 - 1
Libraries/LibCore/CTCPSocket.cpp

@@ -2,7 +2,7 @@
 #include <sys/socket.h>
 #include <errno.h>
 
-CTCPSocket::CTCPSocket(Badge<CTCPServer>, int fd, CObject* parent)
+CTCPSocket::CTCPSocket(int fd, CObject* parent)
     : CSocket(CSocket::Type::TCP, parent)
 {
     set_fd(fd);

+ 4 - 2
Libraries/LibCore/CTCPSocket.h

@@ -8,7 +8,9 @@ class CTCPServer;
 class CTCPSocket final : public CSocket {
     C_OBJECT(CTCPSocket)
 public:
-    explicit CTCPSocket(CObject* parent = nullptr);
-    CTCPSocket(Badge<CTCPServer>, int fd, CObject* parent = nullptr);
     virtual ~CTCPSocket() override;
+
+private:
+    CTCPSocket(int fd, CObject* parent = nullptr);
+    explicit CTCPSocket(CObject* parent = nullptr);
 };

+ 0 - 2
Libraries/LibCore/CoreIPCClient.h

@@ -47,7 +47,6 @@ namespace Client {
 
     template<typename ServerMessage, typename ClientMessage>
     class Connection : public CObject {
-        C_OBJECT(Connection)
     public:
         Connection(const StringView& address)
             : m_connection(this)
@@ -238,7 +237,6 @@ namespace Client {
 
     template<typename Endpoint>
     class ConnectionNG : public CObject {
-        C_OBJECT(Connection)
     public:
         ConnectionNG(const StringView& address)
             : m_connection(this)

+ 0 - 2
Libraries/LibCore/CoreIPCServer.h

@@ -64,7 +64,6 @@ namespace Server {
 
     template<typename ServerMessage, typename ClientMessage>
     class Connection : public CObject {
-        C_OBJECT(Connection)
     public:
         Connection(CLocalSocket& socket, int client_id)
             : m_socket(socket)
@@ -206,7 +205,6 @@ namespace Server {
 
     template<typename Endpoint>
     class ConnectionNG : public CObject {
-        C_OBJECT(Connection)
     public:
         ConnectionNG(Endpoint& endpoint, CLocalSocket& socket, int client_id)
             : m_endpoint(endpoint)

+ 1 - 0
Libraries/LibGUI/GEventLoop.h

@@ -11,6 +11,7 @@ class CNotifier;
 class GWindow;
 
 class GWindowServerConnection : public IPC::Client::Connection<WSAPI_ServerMessage, WSAPI_ClientMessage> {
+    C_OBJECT(GWindowServerConnection)
 public:
     GWindowServerConnection()
         : Connection("/tmp/wsportal")

+ 2 - 2
Servers/TelnetServer/Client.cpp

@@ -10,9 +10,9 @@
 
 #include "Client.h"
 
-Client::Client(int id, CTCPSocket* socket, int ptm_fd)
+Client::Client(int id, ObjectPtr<CTCPSocket> socket, int ptm_fd)
     : m_id(id)
-    , m_socket(socket)
+    , m_socket(move(socket))
     , m_ptm_fd(ptm_fd)
     , m_ptm_notifier(CNotifier::create(ptm_fd, CNotifier::Read))
 {

+ 4 - 4
Servers/TelnetServer/Client.h

@@ -11,15 +11,15 @@
 
 class Client : public RefCounted<Client> {
 public:
-    static NonnullRefPtr<Client> create(int id, CTCPSocket* socket, int ptm_fd)
+    static NonnullRefPtr<Client> create(int id, ObjectPtr<CTCPSocket> socket, int ptm_fd)
     {
-        return adopt(*new Client(id, socket, ptm_fd));
+        return adopt(*new Client(id, move(socket), ptm_fd));
     }
 
     Function<void()> on_exit;
 
 protected:
-    Client(int id, CTCPSocket* socket, int ptm_fd);
+    Client(int id, ObjectPtr<CTCPSocket> socket, int ptm_fd);
 
     void drain_socket();
     void drain_pty();
@@ -35,7 +35,7 @@ private:
     // client id
     int m_id { 0 };
     // client resources
-    CTCPSocket* m_socket { nullptr };
+    ObjectPtr<CTCPSocket> m_socket;
     Parser m_parser;
     // pty resources
     int m_ptm_fd { -1 };

+ 1 - 1
Servers/TelnetServer/main.cpp

@@ -107,7 +107,7 @@ int main(int argc, char** argv)
     server.on_ready_to_accept = [&next_id, &clients, &server] {
         int id = next_id++;
 
-        auto* client_socket = server.accept();
+        auto client_socket = server.accept();
         if (!client_socket) {
             perror("accept");
             return;