mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 03:57:44 +00:00
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.
This commit is contained in:
parent
1f5a9762a2
commit
4298ba25c3
15 changed files with 30 additions and 25 deletions
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
};
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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")
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue