summaryrefslogtreecommitdiff
path: root/LibGUI/GIODevice.h
blob: d2aca72b0669f7c64570538419775ce7bf475b11 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#pragma once

#include <LibGUI/GObject.h>
#include <AK/ByteBuffer.h>

class GIODevice : public GObject {
public:
    enum OpenMode {
        NotOpen      = 0,
        ReadOnly     = 1,
        WriteOnly    = 2,
        ReadWrite    = 3,
        Append       = 4,
        Truncate     = 8,
        MustBeNew    = 16,
    };

    virtual ~GIODevice() override;

    int fd() const { return m_fd; }
    unsigned mode() const { return m_mode; }
    bool eof() const { return m_eof; }

    int error() const { return m_error; }
    const char* error_string() const;

    bool has_error() const { return m_error != 0; }

    ByteBuffer read(int max_size);
    ByteBuffer read_line(int max_size);
    ByteBuffer read_all();

    // FIXME: I would like this to be const but currently it needs to call populate_read_buffer().
    bool can_read_line();

    bool can_read() const;

    virtual bool open(GIODevice::OpenMode) = 0;
    virtual bool close();

    virtual const char* class_name() const override { return "GIODevice"; }

protected:
    explicit GIODevice(GObject* parent = nullptr);

    void set_fd(int fd) { m_fd = fd; }
    void set_mode(OpenMode mode) { m_mode = mode; }
    void set_error(int error) { m_error = error; }
    void set_eof(bool eof) { m_eof = eof; }

private:
    bool populate_read_buffer();
    bool can_read_from_fd() const;

    int m_fd { -1 };
    int m_error { 0 };
    bool m_eof { false };
    OpenMode m_mode { NotOpen };
    Vector<byte> m_buffered_data;
};