File: ObjectStream.h

package info (click to toggle)
lsp-plugins 1.2.5-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 91,856 kB
  • sloc: cpp: 427,831; xml: 57,779; makefile: 9,961; php: 1,005; sh: 18
file content (209 lines) | stat: -rw-r--r-- 8,562 bytes parent folder | download
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
/*
 * Copyright (C) 2020 Linux Studio Plugins Project <https://lsp-plug.in/>
 *           (C) 2020 Vladimir Sadovnikov <sadko4u@gmail.com>
 *
 * This file is part of lsp-runtime-lib
 * Created on: 28 авг. 2019 г.
 *
 * lsp-runtime-lib is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * any later version.
 *
 * lsp-runtime-lib is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with lsp-runtime-lib. If not, see <https://www.gnu.org/licenses/>.
 */

#ifndef LSP_PLUG_IN_FMT_JAVA_OBJECTSTREAM_H_
#define LSP_PLUG_IN_FMT_JAVA_OBJECTSTREAM_H_

#include <lsp-plug.in/runtime/version.h>
#include <lsp-plug.in/runtime/LSPString.h>
#include <lsp-plug.in/common/types.h>
#include <lsp-plug.in/common/status.h>
#include <lsp-plug.in/io/Path.h>
#include <lsp-plug.in/io/IInStream.h>

#include <lsp-plug.in/fmt/java/const.h>
#include <lsp-plug.in/fmt/java/Object.h>
#include <lsp-plug.in/fmt/java/String.h>
#include <lsp-plug.in/fmt/java/RawArray.h>
#include <lsp-plug.in/fmt/java/Enum.h>
#include <lsp-plug.in/fmt/java/Handles.h>
#include <lsp-plug.in/fmt/java/ObjectStreamField.h>
#include <lsp-plug.in/fmt/java/ObjectStreamClass.h>

namespace lsp
{
    namespace java
    {
        class ObjectStream
        {
            protected:
                typedef struct block_t
                {
                    uint8_t            *data;
                    size_t              size;
                    size_t              offset;
                    size_t              unread;
                    bool                enabled;
                } block_t;

            protected:
                io::IInStream      *pIS;
                size_t              nFlags;
                ssize_t             nToken;
                stream_token_t      enToken;
                size_t              nDepth;
                ssize_t             nVersion;
                Handles            *pHandles;
                block_t             sBlock;
                String             *vTypeStrings[JFT_TOTAL];

            private:
                status_t            do_close();
                status_t            set_block_mode(bool enabled, bool *old = NULL);
                status_t            intern_type_string(String **dst, ftype_t type, char ptype);

            protected:
                status_t    initial_read(io::IInStream *is);
                ssize_t     get_token();
                status_t    lookup_token();
                inline void clear_token();

                status_t    fill_block();
                status_t    read_fully(void *dst, size_t count);

                status_t    skip_block_data();
                status_t    skip_custom_data();
                status_t    read_custom_data(void **dst, size_t *size);
                status_t    parse_array(RawArray **dst);
                status_t    parse_enum(Enum **dst);
                status_t    parse_ordinary_object(Object **dst);
                status_t    parse_reset();
                status_t    parse_null(Object **dst);
                status_t    parse_class_field(ObjectStreamField **dst);
                status_t    parse_class_descriptor(ObjectStreamClass **dst);
                status_t    parse_proxy_class_descriptor(ObjectStreamClass **dst);
                status_t    parse_utf(LSPString *dst, size_t len);
                status_t    parse_reference(Object **dst, const char *type = NULL);
                status_t    parse_string(String **dst);
                status_t    parse_object(Object **dst);
                status_t    parse_serial_data(Object *dst, ObjectStreamClass *desc);
                status_t    parse_external_data(Object *dst, ObjectStreamClass *desc);

                Object             *build_object(ObjectStreamClass *desc);

                inline status_t     start_object(bool &mode);
                inline status_t     end_object(bool &mode, status_t res);

            public:
                explicit ObjectStream(Handles *handles);
                virtual ~ObjectStream();

            public:
                /**
                 * Open stream reader
                 * @param file location of the file in UTF-8 encoding
                 * @return status of operation
                 */
                status_t    open(const char *file);

                /**
                 * Open stream reader
                 * @param file location of the file
                 * @return status of operation
                 */
                status_t    open(const LSPString *file);

                /**
                 * Open stream reader
                 * @param file location of the file
                 * @return status of operation
                 */
                status_t    open(const io::Path *file);

                /**
                 * Wrap memory buffer with stream reader
                 * @param buf data contents
                 * @param size size of data
                 * @return status of operation
                 */
                status_t    wrap(const void *buf, size_t count);

                /**
                 * Wrap memory buffer with stream reader
                 * @param buf data contents
                 * @param size size of data
                 * @param drop drop operation on close()
                 * @return status of operation
                 */
                status_t    wrap(void *buf, size_t count, lsp_memdrop_t drop);

                /**
                 * Wrap input stream
                 * @param is input stream
                 * @param flags actions on the input stream after close()
                 * @return status of operation
                 */
                status_t    wrap(io::IInStream *is, size_t flags);

                /**
                 * Close data reader
                 * @return status of operation
                 */
                status_t    close();

                /**
                 * Get current object stream version
                 * @return current object stream version
                 */
                inline ssize_t version() const { return nVersion; }

                status_t    current_token();

                status_t    read_byte(uint8_t *dst);
                status_t    read_byte(int8_t *dst);
                status_t    read_short(uint16_t *dst);
                status_t    read_short(int16_t *dst);
                status_t    read_int(uint32_t *dst);
                status_t    read_int(int32_t *dst);
                status_t    read_long(uint64_t *dst);
                status_t    read_long(int64_t *dst);
                status_t    read_float(float_t *dst);
                status_t    read_double(double_t *dst);
                status_t    read_char(lsp_utf16_t *dst);
                status_t    read_bool(bool_t *dst);

                status_t    read_bytes(uint8_t *dst, size_t count);
                status_t    read_bytes(int8_t *dst, size_t count);
                status_t    read_shorts(uint16_t *dst, size_t count);
                status_t    read_shorts(int16_t *dst, size_t count);
                status_t    read_ints(uint32_t *dst, size_t count);
                status_t    read_ints(int32_t *dst, size_t count);
                status_t    read_longs(uint64_t *dst, size_t count);
                status_t    read_longs(int64_t *dst, size_t count);
                status_t    read_floats(float_t *dst, size_t count);
                status_t    read_doubles(double_t *dst, size_t count);
                status_t    read_chars(lsp_utf16_t *dst, size_t count);
                status_t    read_bools(bool_t *dst, size_t count);

                status_t    read_utf(LSPString *dst);

                status_t    read_object(Object **dst);
                status_t    read_array(RawArray **dst);
                status_t    read_string(String **dst);
                status_t    read_string(LSPString *dst);
                status_t    read_enum(Enum **dst);
                status_t    read_class_descriptor(ObjectStreamClass **dst);
        };
    
    } /* namespace java */
} /* namespace lsp */

#endif /* LSP_PLUG_IN_FMT_JAVA_OBJECTSTREAM_H_ */