/src/serenity/Userland/Libraries/LibTextCodec/Encoder.h
Line | Count | Source |
1 | | /* |
2 | | * Copyright (c) 2024, Ben Jilks <benjyjilks@gmail.com> |
3 | | * |
4 | | * SPDX-License-Identifier: BSD-2-Clause |
5 | | */ |
6 | | |
7 | | #pragma once |
8 | | |
9 | | #include <AK/Forward.h> |
10 | | #include <AK/Function.h> |
11 | | |
12 | | namespace TextCodec { |
13 | | |
14 | | class Encoder { |
15 | | public: |
16 | | virtual ErrorOr<void> process(Utf8View, Function<ErrorOr<void>(u8)> on_byte, Function<ErrorOr<void>(u32)> on_error) = 0; |
17 | | |
18 | | protected: |
19 | 0 | virtual ~Encoder() = default; |
20 | | }; |
21 | | |
22 | | class UTF8Encoder final : public Encoder { |
23 | | public: |
24 | | virtual ErrorOr<void> process(Utf8View, Function<ErrorOr<void>(u8)> on_byte, Function<ErrorOr<void>(u32)> on_error) override; |
25 | | }; |
26 | | |
27 | | class UTF16BEEncoder final : public Encoder { |
28 | | public: |
29 | | virtual ErrorOr<void> process(Utf8View, Function<ErrorOr<void>(u8)> on_byte, Function<ErrorOr<void>(u32)> on_error) override; |
30 | | }; |
31 | | |
32 | | class UTF16LEEncoder final : public Encoder { |
33 | | public: |
34 | | virtual ErrorOr<void> process(Utf8View, Function<ErrorOr<void>(u8)> on_byte, Function<ErrorOr<void>(u32)> on_error) override; |
35 | | }; |
36 | | |
37 | | class Latin1Encoder final : public Encoder { |
38 | | public: |
39 | | virtual ErrorOr<void> process(Utf8View, Function<ErrorOr<void>(u8)> on_byte, Function<ErrorOr<void>(u32)> on_error) override; |
40 | | }; |
41 | | |
42 | | class EUCJPEncoder final : public Encoder { |
43 | | public: |
44 | | virtual ErrorOr<void> process(Utf8View, Function<ErrorOr<void>(u8)> on_byte, Function<ErrorOr<void>(u32)> on_error) override; |
45 | | }; |
46 | | |
47 | | class ISO2022JPEncoder final : public Encoder { |
48 | | public: |
49 | | virtual ErrorOr<void> process(Utf8View, Function<ErrorOr<void>(u8)> on_byte, Function<ErrorOr<void>(u32)> on_error) override; |
50 | | |
51 | | private: |
52 | | enum class State { |
53 | | ASCII, |
54 | | Roman, |
55 | | jis0208, |
56 | | }; |
57 | | |
58 | | ErrorOr<State> process_item(u32 item, State, Function<ErrorOr<void>(u8)>& on_byte, Function<ErrorOr<void>(u32)>& on_error); |
59 | | }; |
60 | | |
61 | | class ShiftJISEncoder final : public Encoder { |
62 | | public: |
63 | | virtual ErrorOr<void> process(Utf8View, Function<ErrorOr<void>(u8)> on_byte, Function<ErrorOr<void>(u32)> on_error) override; |
64 | | }; |
65 | | |
66 | | class EUCKREncoder final : public Encoder { |
67 | | public: |
68 | | virtual ErrorOr<void> process(Utf8View, Function<ErrorOr<void>(u8)> on_byte, Function<ErrorOr<void>(u32)> on_error) override; |
69 | | }; |
70 | | |
71 | | class Big5Encoder final : public Encoder { |
72 | | public: |
73 | | virtual ErrorOr<void> process(Utf8View, Function<ErrorOr<void>(u8)> on_byte, Function<ErrorOr<void>(u32)> on_error) override; |
74 | | }; |
75 | | |
76 | | class GB18030Encoder final : public Encoder { |
77 | | public: |
78 | | enum class IsGBK { |
79 | | Yes, |
80 | | No, |
81 | | }; |
82 | | |
83 | | GB18030Encoder(IsGBK is_gbk = IsGBK::No); |
84 | | |
85 | | virtual ErrorOr<void> process(Utf8View, Function<ErrorOr<void>(u8)> on_byte, Function<ErrorOr<void>(u32)> on_error) override; |
86 | | |
87 | | private: |
88 | | IsGBK m_is_gbk { IsGBK::No }; |
89 | | }; |
90 | | template<Integral ArrayType = u32> |
91 | | class SingleByteEncoder final : public Encoder { |
92 | | public: |
93 | | SingleByteEncoder(Array<ArrayType, 128> translation_table) |
94 | 1.67k | : m_translation_table(translation_table) |
95 | 1.67k | { |
96 | 1.67k | } |
97 | | |
98 | | virtual ErrorOr<void> process(Utf8View, Function<ErrorOr<void>(u8)> on_byte, Function<ErrorOr<void>(u32)> on_error) override; |
99 | | |
100 | | private: |
101 | | Array<ArrayType, 128> m_translation_table; |
102 | | }; |
103 | | |
104 | | Optional<Encoder&> encoder_for_exact_name(StringView encoding); |
105 | | Optional<Encoder&> encoder_for(StringView label); |
106 | | |
107 | | } |