3 Commits

Author SHA1 Message Date
8253403746 Add some comments and an error check 2025-03-08 18:19:47 -08:00
a2c493b81e The editor plugin nonsense turned out to be useless 2025-03-08 17:23:48 -08:00
295d2cd838 Upgrade to Godot 4.4 2025-03-08 17:14:51 -08:00
7 changed files with 16 additions and 50 deletions

View File

@ -0,0 +1 @@
uid://ct7fwu1uxvpmt

View File

@ -1,6 +1,6 @@
[gd_scene load_steps=2 format=3 uid="uid://ckdfb5ggwslbk"]
[ext_resource type="Script" path="res://BSON Examples/dunk.gd" id="1_p38ab"]
[ext_resource type="Script" uid="uid://ct7fwu1uxvpmt" path="res://BSON Examples/dunk.gd" id="1_p38ab"]
[node name="Dunk" type="Control" node_paths=PackedStringArray("JSONEditor", "OutputLabel", "CopyPopup")]
layout_mode = 3
@ -57,7 +57,8 @@ text = "{
true,
false,
3.14159265,
\"baz\"
\"baz\",
null
]
}"
middle_mouse_paste_enabled = false
@ -116,7 +117,6 @@ horizontal_alignment = 1
autowrap_mode = 3
[node name="CopyPopup" type="PopupPanel" parent="."]
transparent_bg = true
position = Vector2i(492, 586)
size = Vector2i(164, 31)

View File

@ -2,10 +2,7 @@
# This file is the BSON serializer for the Godot Engine,
# published under the MIT license. https://opensource.org/license/MIT
extends Node
# Unfortunately, this has to be a node in order to be a singleton.
# I'd rather BSON wasn't in the scenetree, but it seems like that's
# the only way to do this. Hopefully this will change in the future.
class_name BSON
static func to_bson(data: Dictionary) -> PackedByteArray:
@ -22,11 +19,11 @@ static func get_byte_type(value: Variant) -> int:
return 0x02
TYPE_INT:
if abs(value as int) < 2147483647: # 32 bit signed integer limit
return 0x10
return 0x10 # 32 bit signed int
else:
return 0x12
return 0x12 # 64 bit signed int
TYPE_FLOAT:
return 0x01
return 0x01 # Double
TYPE_ARRAY:
return 0x04
TYPE_DICTIONARY:
@ -76,7 +73,7 @@ static func dictionary_to_bytes(dict: Dictionary) -> PackedByteArray:
buffer.append(get_byte_type(dict[key]))
var key_string_bytes := key.to_utf8_buffer()
buffer.append_array(key_string_bytes)
buffer.append(0x00)
buffer.append(0x00) # Index string null terminator
buffer.append_array(serialize_variant(dict[key]))
return buffer
@ -87,10 +84,10 @@ static func array_to_bytes(array: Array[Variant]) -> PackedByteArray:
for index: int in range(array.size()):
buffer.append(get_byte_type(array[index]))
# For whatever reason, BSON wants array indexes to be strings. This makes no sense.
# The string indexes are literally just the number but in ASCII/UTF8.
var s_index := str(index)
buffer.append_array(s_index.to_utf8_buffer())
buffer.append(0x00)
buffer.append(0x00) # Index string null terminator
buffer.append_array(serialize_variant(array[index]))
return buffer
@ -129,6 +126,8 @@ static func serialize_variant(data: Variant) -> PackedByteArray:
static func from_bson(data: PackedByteArray) -> Dictionary:
if data[-1] != 0x00:
push_error("BSON deserialization error: Document is not null terminated. It is likely that the provided buffer is not BSON.")
return Deserializer.new(data).read_dictionary()
@ -178,7 +177,7 @@ class Deserializer:
var b_char := get_int8()
if b_char == 0x00: break
s_value += char(b_char)
if expected_size != iter: # Check if the string is terminated with 0x00
if expected_size != iter:
push_error("BSON deserialization error: String was the wrong size."
+ " Position: "
+ str(read_position - iter)

1
addons/bson/bson.gd.uid Normal file
View File

@ -0,0 +1 @@
uid://tbtkc5qan4gw

View File

@ -1,7 +0,0 @@
[plugin]
name="BSON"
description="A BSON class to serialize and deserialize BSON in GDScript."
author="Colormatic Studios"
version=""
script="plugin.gd"

View File

@ -1,20 +0,0 @@
@tool
extends EditorPlugin
const AUTOLOAD_NAME = "BSON"
#func _enter_tree() -> void:
# Initialization of the plugin goes here.
#pass
#func _exit_tree() -> void:
# Clean-up of the plugin goes here.
#pass
func _enable_plugin() -> void:
add_autoload_singleton(AUTOLOAD_NAME, "res://addons/bson/bson.gd")
func _disable_plugin() -> void:
remove_autoload_singleton(AUTOLOAD_NAME)

View File

@ -12,13 +12,5 @@ config_version=5
config/name="BSON for Godot"
run/main_scene="res://BSON Examples/dunk.tscn"
config/features=PackedStringArray("4.3", "Forward Plus")
config/features=PackedStringArray("4.4", "Forward Plus")
config/icon="res://icon.svg"
[autoload]
BSON="*res://addons/bson/bson.gd"
[editor_plugins]
enabled=PackedStringArray("res://addons/bson/plugin.cfg")