diff options
Diffstat (limited to 'core/io/marshalls.cpp')
| -rw-r--r-- | core/io/marshalls.cpp | 47 | 
1 files changed, 39 insertions, 8 deletions
diff --git a/core/io/marshalls.cpp b/core/io/marshalls.cpp index bb9606c94b..8ee19f274e 100644 --- a/core/io/marshalls.cpp +++ b/core/io/marshalls.cpp @@ -78,7 +78,7 @@ static Error _decode_string(const uint8_t *&buf, int &len, int *r_len, String &r  	ERR_FAIL_COND_V(strlen < 0 || strlen + pad > len, ERR_FILE_EOF);  	String str; -	ERR_FAIL_COND_V(str.parse_utf8((const char *)buf, strlen), ERR_INVALID_DATA); +	ERR_FAIL_COND_V(str.parse_utf8((const char *)buf, strlen) != OK, ERR_INVALID_DATA);  	r_string = str;  	// Add padding @@ -532,7 +532,13 @@ Error decode_variant(Variant &r_variant, const uint8_t *p_buffer, int p_len, int  		} break;  		case Variant::RID: { -			r_variant = RID(); +			ERR_FAIL_COND_V(len < 8, ERR_INVALID_DATA); +			uint64_t id = decode_uint64(buf); +			if (r_len) { +				(*r_len) += 8; +			} + +			r_variant = RID::from_uint64(id);  		} break;  		case Variant::OBJECT: {  			if (type & ENCODE_FLAG_OBJECT_AS_ID) { @@ -614,9 +620,20 @@ Error decode_variant(Variant &r_variant, const uint8_t *p_buffer, int p_len, int  			r_variant = Callable();  		} break;  		case Variant::SIGNAL: { -			r_variant = Signal(); -		} break; +			String name; +			Error err = _decode_string(buf, len, r_len, name); +			if (err) { +				return err; +			} +			ERR_FAIL_COND_V(len < 8, ERR_INVALID_DATA); +			ObjectID id = ObjectID(decode_uint64(buf)); +			if (r_len) { +				(*r_len) += 8; +			} + +			r_variant = Signal(id, StringName(name)); +		} break;  		case Variant::DICTIONARY: {  			ERR_FAIL_COND_V(len < 4, ERR_INVALID_DATA);  			int32_t count = decode_uint32(buf); @@ -1352,10 +1369,12 @@ Error encode_variant(const Variant &p_variant, uint8_t *r_buffer, int &r_len, bo  		} break;  		case Variant::RID: { -		} break; -		case Variant::CALLABLE: { -		} break; -		case Variant::SIGNAL: { +			RID rid = p_variant; + +			if (buf) { +				encode_uint64(rid.get_id(), buf); +			} +			r_len += 8;  		} break;  		case Variant::OBJECT: {  			if (p_full_objects) { @@ -1419,6 +1438,18 @@ Error encode_variant(const Variant &p_variant, uint8_t *r_buffer, int &r_len, bo  			}  		} break; +		case Variant::CALLABLE: { +		} break; +		case Variant::SIGNAL: { +			Signal signal = p_variant; + +			_encode_string(signal.get_name(), buf, r_len); + +			if (buf) { +				encode_uint64(signal.get_object_id(), buf); +			} +			r_len += 8; +		} break;  		case Variant::DICTIONARY: {  			Dictionary d = p_variant;  |