Serenity Operating System
1/*
2 * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice, this
9 * list of conditions and the following disclaimer.
10 *
11 * 2. Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation
13 * and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
22 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
23 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26
27#pragma once
28
29#include <AK/Function.h>
30#include <LibCore/IODevice.h>
31#include <LibCore/SocketAddress.h>
32
33namespace Core {
34
35class Socket : public IODevice {
36 C_OBJECT(Socket)
37public:
38 enum class Type {
39 Invalid,
40 TCP,
41 UDP,
42 Local,
43 };
44 virtual ~Socket() override;
45
46 Type type() const { return m_type; }
47
48 bool connect(const String& hostname, int port);
49 bool connect(const SocketAddress&, int port);
50 bool connect(const SocketAddress&);
51
52 ByteBuffer receive(int max_size);
53 bool send(const ByteBuffer&);
54
55 bool is_connected() const { return m_connected; }
56 void set_blocking(bool blocking);
57
58 SocketAddress source_address() const { return m_source_address; }
59 int source_port() const { return m_source_port; }
60
61 SocketAddress destination_address() const { return m_destination_address; }
62 int destination_port() const { return m_destination_port; }
63
64 Function<void()> on_connected;
65 Function<void()> on_ready_to_read;
66
67protected:
68 Socket(Type, Object* parent);
69
70 SocketAddress m_source_address;
71 SocketAddress m_destination_address;
72 int m_source_port { -1 };
73 int m_destination_port { -1 };
74 bool m_connected { false };
75
76 virtual void did_update_fd(int) override;
77
78private:
79 virtual bool open(IODevice::OpenMode) override { ASSERT_NOT_REACHED(); }
80 bool common_connect(const struct sockaddr*, socklen_t);
81 void ensure_read_notifier();
82
83 Type m_type { Type::Invalid };
84 RefPtr<Notifier> m_notifier;
85 RefPtr<Notifier> m_read_notifier;
86};
87
88}