Skip to content

Commit 84fc434

Browse files
feat!: yay! somewhat working classdata parsing, restructure
Co-Authored-By: Zero_DSRS_VX <24632178+PhoenixVX@users.noreply.github.com>
1 parent 5b63d9d commit 84fc434

File tree

105 files changed

+1619
-418
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

105 files changed

+1619
-418
lines changed

CMakeLists.txt

Lines changed: 91 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
cmake_minimum_required(VERSION VERSION 3.30)
2-
project(JavaObjectStreams VERSION 1.1.2)
2+
project(JavaObjectStreams VERSION 1.2.0)
33

44
set(CMAKE_CXX_STANDARD 20)
55

@@ -23,53 +23,97 @@ set(FILES
2323
include/JavaObject/stream/ObjectInputStream.h
2424
src/io/Serializable.cpp
2525
include/JavaObject/io/Serializable.h
26-
include/JavaObject/type/TypeCodeParser.cpp
27-
include/JavaObject/type/TypeCodeParser.h
28-
include/JavaObject/type/parser/IObjectParser.cpp
29-
include/JavaObject/type/parser/IObjectParser.h
30-
include/JavaObject/type/object/IObject.cpp
31-
include/JavaObject/type/object/IObject.h
32-
include/JavaObject/type/object/NullObject.h
33-
include/JavaObject/type/parser/StringParser.cpp
34-
include/JavaObject/type/parser/StringParser.h
35-
include/JavaObject/type/object/StringObject.cpp
36-
include/JavaObject/type/object/StringObject.h
37-
include/JavaObject/type/parser/ObjectParser.cpp
38-
include/JavaObject/type/parser/ObjectParser.h
39-
include/JavaObject/type/object/Object.cpp
40-
include/JavaObject/type/object/Object.h
41-
include/JavaObject/type/parser/descriptor/NewClassDescriptorParser.cpp
42-
include/JavaObject/type/parser/descriptor/NewClassDescriptorParser.h
43-
include/JavaObject/type/object/descriptor/NewClassDescriptorObject.cpp
44-
include/JavaObject/type/object/descriptor/NewClassDescriptorObject.h
45-
include/JavaObject/type/parser/descriptor/ClassDescriptorInfoParser.cpp
46-
include/JavaObject/type/parser/descriptor/ClassDescriptorInfoParser.h
47-
include/JavaObject/type/parser/descriptor/FieldDescriptorParser.cpp
48-
include/JavaObject/type/parser/descriptor/FieldDescriptorParser.h
49-
include/JavaObject/type/object/descriptor/FieldDescriptorObject.cpp
50-
include/JavaObject/type/object/descriptor/FieldDescriptorObject.h
51-
include/JavaObject/type/object/descriptor/PrimitiveDescriptorObject.cpp
52-
include/JavaObject/type/object/descriptor/PrimitiveDescriptorObject.h
53-
include/JavaObject/type/parser/descriptor/PrimitiveDescriptorParser.cpp
54-
include/JavaObject/type/parser/descriptor/PrimitiveDescriptorParser.h
55-
include/JavaObject/util/SmartPointerCast.cpp
26+
src/type/object/parsers/ObjectParser.cpp
27+
include/JavaObject/type/object/parsers/ObjectParser.h
28+
src/type/object/types/IObject.cpp
29+
include/JavaObject/type/object/parsers/IObjectParser.h
30+
src/type/object/parsers/IObjectParser.cpp
31+
include/JavaObject/type/object/types/IObject.h
32+
include/JavaObject/type/object/types/NullObject.h
33+
src/type/object/parsers/StringParser.cpp
34+
include/JavaObject/type/object/parsers/StringParser.h
35+
src/type/object/types/StringObject.cpp
36+
include/JavaObject/type/object/types/StringObject.h
37+
src/type/object/types/Object.cpp
38+
include/JavaObject/type/object/types/Object.h
39+
src/type/object/parsers/descriptor/NewClassDescriptorParser.cpp
40+
include/JavaObject/type/object/parsers/descriptor/NewClassDescriptorParser.h
41+
src/type/object/parsers/descriptor/ClassDescriptorInfoParser.cpp
42+
include/JavaObject/type/object/parsers/descriptor/ClassDescriptorInfoParser.h
43+
src/type/object/parsers/descriptor/FieldDescriptorParser.cpp
44+
include/JavaObject/type/object/parsers/descriptor/FieldDescriptorParser.h
45+
src/type/object/types/descriptor/PrimitiveDescriptorObject.cpp
46+
include/JavaObject/type/object/types/descriptor/PrimitiveDescriptorObject.h
47+
src/type/object/parsers/descriptor/PrimitiveDescriptorParser.cpp
48+
include/JavaObject/type/object/parsers/descriptor/PrimitiveDescriptorParser.h
49+
src/util/SmartPointerCast.cpp
5650
include/JavaObject/util/SmartPointerCast.h
57-
include/JavaObject/type/object/ClassDataObject.cpp
58-
include/JavaObject/type/object/ClassDataObject.h
59-
include/JavaObject/type/object/AnnotationObject.cpp
60-
include/JavaObject/type/object/AnnotationObject.h
61-
include/JavaObject/type/parser/ClassDataParser.cpp
62-
include/JavaObject/type/parser/ClassDataParser.h
63-
include/JavaObject/type/object/descriptor/ClassDescriptorObject.cpp
64-
include/JavaObject/type/object/descriptor/ClassDescriptorObject.h
65-
include/JavaObject/type/parser/descriptor/ClassDescriptorParser.cpp
66-
include/JavaObject/type/parser/descriptor/ClassDescriptorParser.h
67-
include/JavaObject/type/object/ReferenceObject.cpp
68-
include/JavaObject/type/object/ReferenceObject.h
69-
include/JavaObject/type/parser/ReferenceParser.cpp
70-
include/JavaObject/type/parser/ReferenceParser.h
71-
include/JavaObject/type/object/descriptor/ClassDescriptorInfoObject.cpp
72-
include/JavaObject/type/object/descriptor/ClassDescriptorInfoObject.h
51+
src/type/object/types/ClassDataObject.cpp
52+
include/JavaObject/type/object/types/ClassDataObject.h
53+
src/type/object/types/AnnotationObject.cpp
54+
include/JavaObject/type/object/types/AnnotationObject.h
55+
src/type/object/parsers/ClassDataParser.cpp
56+
include/JavaObject/type/object/parsers/ClassDataParser.h
57+
src/type/object/types/descriptor/ClassDescriptorObject.cpp
58+
include/JavaObject/type/object/types/descriptor/ClassDescriptorObject.h
59+
src/type/object/parsers/descriptor/ClassDescriptorParser.cpp
60+
include/JavaObject/type/object/parsers/descriptor/ClassDescriptorParser.h
61+
src/type/object/types/ReferenceObject.cpp
62+
include/JavaObject/type/object/types/ReferenceObject.h
63+
src/type/object/parsers/ReferenceParser.cpp
64+
include/JavaObject/type/object/parsers/ReferenceParser.h
65+
src/type/object/types/descriptor/ClassDescriptorInfoObject.cpp
66+
include/JavaObject/type/object/types/descriptor/ClassDescriptorInfoObject.h
67+
src/type/object/parsers/NewClassParser.cpp
68+
include/JavaObject/type/object/parsers/NewClassParser.h
69+
src/type/primitive/PrimitiveTypeCodeParser.cpp
70+
include/JavaObject/type/primitive/PrimitiveTypeCodeParser.h
71+
src/type/primitive/types/IPrimitiveObject.cpp
72+
include/JavaObject/type/primitive/types/IPrimitiveObject.h
73+
src/type/HandleContainer.cpp
74+
include/JavaObject/type/HandleContainer.h
75+
src/type/ITypeCodeParser.cpp
76+
include/JavaObject/type/ITypeCodeParser.h
77+
src/type/primitive/parsers/IPrimitiveObjectParser.cpp
78+
include/JavaObject/type/primitive/parsers/IPrimitiveObjectParser.h
79+
src/type/primitive/types/PrimitiveByteObject.cpp
80+
include/JavaObject/type/primitive/types/PrimitiveByteObject.h
81+
src/type/primitive/types/PrimitiveCharObject.cpp
82+
include/JavaObject/type/primitive/types/PrimitiveCharObject.h
83+
src/type/primitive/types/PrimitiveDoubleObject.cpp
84+
include/JavaObject/type/primitive/types/PrimitiveDoubleObject.h
85+
src/type/primitive/types/PrimitiveFloatObject.cpp
86+
include/JavaObject/type/primitive/types/PrimitiveFloatObject.h
87+
src/type/primitive/types/PrimitiveIntegerObject.cpp
88+
include/JavaObject/type/primitive/types/PrimitiveIntegerObject.h
89+
src/type/primitive/types/PrimitiveLongObject.cpp
90+
include/JavaObject/type/primitive/types/PrimitiveLongObject.h
91+
src/type/primitive/types/PrimitiveShortObject.cpp
92+
include/JavaObject/type/primitive/types/PrimitiveShortObject.h
93+
src/type/primitive/types/PrimitiveBooleanObject.cpp
94+
include/JavaObject/type/primitive/types/PrimitiveBooleanObject.h
95+
src/type/primitive/types/PrimitiveJavaObject.cpp
96+
include/JavaObject/type/primitive/types/PrimitiveJavaObject.h
97+
src/type/primitive/types/PrimitiveArrayObject.cpp
98+
include/JavaObject/type/primitive/types/PrimitiveArrayObject.h
99+
src/type/primitive/parsers/PrimitiveByteObjectParser.cpp
100+
include/JavaObject/type/primitive/parsers/PrimitiveByteObjectParser.h
101+
src/type/primitive/parsers/PrimitiveCharObjectParser.cpp
102+
include/JavaObject/type/primitive/parsers/PrimitiveCharObjectParser.h
103+
src/type/primitive/parsers/PrimitiveDoubleObjectParser.cpp
104+
include/JavaObject/type/primitive/parsers/PrimitiveDoubleObjectParser.h
105+
src/type/primitive/parsers/PrimitiveFloatObjectParser.cpp
106+
include/JavaObject/type/primitive/parsers/PrimitiveFloatObjectParser.h
107+
src/type/primitive/parsers/PrimitiveIntegerObjectParser.cpp
108+
include/JavaObject/type/primitive/parsers/PrimitiveIntegerObjectParser.h
109+
src/type/primitive/parsers/PrimitiveShortObjectParser.cpp
110+
include/JavaObject/type/primitive/parsers/PrimitiveShortObjectParser.h
111+
src/type/primitive/parsers/PrimitiveLongObjectParser.cpp
112+
include/JavaObject/type/primitive/parsers/PrimitiveLongObjectParser.h
113+
src/type/primitive/parsers/PrimitiveBooleanObjectParser.cpp
114+
include/JavaObject/type/primitive/parsers/PrimitiveBooleanObjectParser.h
115+
include/JavaObject/type/object/ObjectTypeCodeParser.h
116+
src/type/object/ObjectTypeCodeParser.cpp
73117
)
74118

75119
add_library(JavaObjectStreams SHARED ${FILES})

README.md

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
11
# JavaObjectStreams
2-
Serialization and Deserialization which matches Java's Object streams
2+
A C++ library to provide serialization and deserialization of Java objects (ala ObjectInputStream and ObjectOutputStream).
33

4-
This allows for deserializing ObjectOutputStream-serialized files
4+
### JavaObjectStreams is not...
5+
- a Java class file parser.
6+
- a Java disassembler.
7+
---
8+
- ✅ Deserialization
9+
- ❌ Serialization (TODO)
10+
11+
## Contributing

include/JavaObject/stream/ObjectInputStream.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
*/
1111
#ifndef JAVAOBJECTSTREAMS_OBJECTINPUTSTREAM_H
1212
#define JAVAOBJECTSTREAMS_OBJECTINPUTSTREAM_H
13-
#include "JavaObject/type/TypeCodeParser.h"
14-
#include "JavaObject/type/object/IObject.h"
13+
#include "../type/object/ObjectTypeCodeParser.h"
14+
#include "../type/object/types/IObject.h"
1515

1616
#include <iostream>
1717
#include <memory>
@@ -25,10 +25,12 @@ namespace javaobject::stream {
2525

2626
std::shared_ptr<type::object::IObject> readObject();
2727
private:
28+
type::HandleContainer m_handleContainer;
29+
2830
std::istream &m_input;
2931
bio::stream::BinaryInputStream m_stream;
3032

31-
type::TypeCodeParser m_parser;
33+
type::object::ObjectTypeCodeParser m_parser;
3234
};
3335

3436
//some people might prefer STL naming scheme for this, so why not:
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/** @file HandleContainer.h
2+
*
3+
* @author Dexrn ZacAttack
4+
* @date 3/24/26
5+
*
6+
* @device zPc-i2
7+
*
8+
* @copyright Copyright (c) 2026 Team Lodestone
9+
* @license This project is licensed under the MIT license, see the LICENSE file for details.
10+
*/
11+
#ifndef JAVAOBJECTSTREAMS_HANDLECONTAINER_H
12+
#define JAVAOBJECTSTREAMS_HANDLECONTAINER_H
13+
#include "JavaObject/type/object/types/IObject.h"
14+
#include "JavaObject/type/object/types/ReferenceObject.h"
15+
16+
#include <memory>
17+
#include <unordered_map>
18+
19+
namespace javaobject::type {
20+
class HandleContainer {
21+
public:
22+
void registerHandle(const std::shared_ptr<object::IObject> &object);
23+
24+
std::shared_ptr<object::IObject> resolveHandle(const object::ReferenceObject::handle_t handle);
25+
std::shared_ptr<object::IObject> resolveReference(const object::ReferenceObject *reference);
26+
std::shared_ptr<object::IObject> resolveReference(const std::shared_ptr<object::ReferenceObject> &reference);
27+
28+
private:
29+
/** Links handles to objects by pointer, these objects are expected to be stored already, otherwise it would leave a dangling/invalid pointer. */
30+
std::unordered_map<object::ReferenceObject::handle_t, std::shared_ptr<object::IObject>> m_handles;
31+
object::ReferenceObject::handle_t m_nextHandle = 0x7E000000;
32+
};
33+
} // namespace javaobject::type
34+
35+
#endif // JAVAOBJECTSTREAMS_HANDLECONTAINER_H
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/** @file ITypeCodeParser.h
2+
*
3+
* @author Dexrn ZacAttack
4+
* @date 3/24/26
5+
*
6+
* @device zPc-i2
7+
*
8+
* @copyright Copyright (c) 2026 Team Lodestone
9+
* @license This project is licensed under the MIT license, see the LICENSE file for details.
10+
*/
11+
#ifndef JAVAOBJECTSTREAMS_ITYPECODEPARSER_H
12+
#define JAVAOBJECTSTREAMS_ITYPECODEPARSER_H
13+
#include "BinaryIO/stream/BinaryInputStream.h"
14+
#include "JavaObject/type/HandleContainer.h"
15+
16+
namespace javaobject::type {
17+
template <typename ObjectT, typename ParserT, typename TypeCodeT>
18+
class ITypeCodeParser {
19+
public:
20+
explicit ITypeCodeParser(std::istream &input, HandleContainer &handleContainer) : m_input(input), m_handleContainer(handleContainer) {}
21+
22+
virtual ~ITypeCodeParser() = default;
23+
24+
virtual std::shared_ptr<ObjectT> readNext() = 0;
25+
virtual std::shared_ptr<ObjectT> readUsingParser(const ParserT &parser) = 0;
26+
27+
template <typename T>
28+
requires std::is_base_of_v<ObjectT, T>
29+
std::shared_ptr<T> readNextAs() {
30+
return std::static_pointer_cast<T>(this->readNext());
31+
}
32+
33+
template <typename T>
34+
requires std::is_base_of_v<ObjectT, T>
35+
std::shared_ptr<T> readAsUsingParser(const ParserT &parser) {
36+
return std::static_pointer_cast<T>(this->readUsingParser(parser));
37+
}
38+
39+
ParserT *getParser(const TypeCodeT typeCode) {
40+
if (const auto it = m_parsers.find(typeCode); it != this->m_parsers.end()) {
41+
return it->second.get();
42+
}
43+
44+
return nullptr;
45+
}
46+
47+
HandleContainer &handleContainer() {
48+
return this->m_handleContainer;
49+
}
50+
51+
bio::stream::BinaryInputStream &stream() {
52+
return this->m_input;
53+
}
54+
55+
protected:
56+
/** Links typecodes to their parser class */
57+
std::unordered_map<TypeCodeT, std::unique_ptr<ParserT>> m_parsers;
58+
59+
bio::stream::BinaryInputStream m_input;
60+
HandleContainer &m_handleContainer;
61+
};
62+
} // namespace javaobject::type
63+
64+
#endif // JAVAOBJECTSTREAMS_ITYPECODEPARSER_H

include/JavaObject/type/TypeCodeParser.cpp

Lines changed: 0 additions & 71 deletions
This file was deleted.

0 commit comments

Comments
 (0)