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_ */
|