Skip to content

Commit 9d17a69

Browse files
committed
Fixed #452.
1 parent c6bf3d8 commit 9d17a69

File tree

6 files changed

+39
-16
lines changed

6 files changed

+39
-16
lines changed

Diff for: addons/source-python/packages/source-python/messages/impl.py

+6-4
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,9 @@ def read_protobuf(buffer):
135135
index=buffer.get_int32('ent_idx'),
136136
chat=buffer.get_bool('chat'),
137137
message=buffer.get_string('msg_name'),
138-
param1=buffer.get_repeated_string('params', 0),
139-
param2=buffer.get_repeated_string('params', 1),
138+
# See issues #27, #186 and #452.
139+
param1=buffer.get_repeated_string('params', 0, 'ignore'),
140+
param2=buffer.get_repeated_string('params', 1, 'ignore'),
140141
param3=buffer.get_repeated_string('params', 2),
141142
param4=buffer.get_repeated_string('params', 3))
142143

@@ -156,8 +157,9 @@ def read_bitbuffer(buffer):
156157
index=buffer.read_byte(),
157158
chat=buffer.read_byte(),
158159
message=buffer.read_string(),
159-
param1=buffer.read_string(),
160-
param2=buffer.read_string(),
160+
# See issues #27, #186 and #452.
161+
param1=buffer.read_string('ignore'),
162+
param2=buffer.read_string('ignore'),
161163
param3=buffer.read_string(),
162164
param4=buffer.read_string())
163165

Diff for: src/core/modules/bitbuffers/bitbuffers.h

+4-5
Original file line numberDiff line numberDiff line change
@@ -87,13 +87,12 @@ class BitBufferReadExt
8787
return BitByte(buffer.GetNumBitsRead());
8888
}
8989

90-
static str ReadString(bf_read& buffer)
90+
static str ReadString(bf_read& buffer, const char* szErrors = NULL)
9191
{
92-
char* pStr = new char[buffer.m_nDataBytes];
93-
buffer.ReadString(pStr, buffer.m_nDataBytes);
94-
92+
char* pStr = buffer.ReadAndAllocateString();
9593
// Let Boost handle deallocating the string
96-
str result = str((const char *) pStr);
94+
str result = make_str((const char *) pStr, szErrors);
95+
9796
delete pStr;
9897
return result;
9998
}

Diff for: src/core/modules/bitbuffers/bitbuffers_wrap.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,8 @@ void export_bf_read(scope _bitbuffers)
320320
)
321321

322322
.def("read_string",
323-
&BitBufferReadExt::ReadString
323+
&BitBufferReadExt::ReadString,
324+
("self", arg("errors")=object())
324325
)
325326

326327
.add_property("num_bytes_left",

Diff for: src/core/modules/messages/messages.h

+5-4
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
#include "public/engine/iserverplugin.h"
3737
#include "bitbuf.h"
3838

39+
#include "utilities/sp_util.h"
3940
#include "modules/memory/memory_utilities.h"
4041

4142
#ifdef USE_PROTOBUF
@@ -165,11 +166,11 @@
165166
static bool GetBool(google::protobuf::Message* pMessage, const char* field_name)
166167
{ return GetField<bool>(pMessage, &google::protobuf::Reflection::GetBool, field_name); }
167168

168-
static std::string GetString(google::protobuf::Message* pMessage, const char* field_name)
169+
static str GetString(google::protobuf::Message* pMessage, const char* field_name, const char* szErrors = NULL)
169170
{
170171
std::string return_value;
171172
return_value = pMessage->GetReflection()->GetStringReference(*pMessage, GetFieldDescriptor(pMessage, field_name), &return_value);
172-
return return_value;
173+
return make_str(return_value.c_str(), szErrors);
173174
}
174175

175176
static int GetEnum(google::protobuf::Message* pMessage, const char* field_name)
@@ -220,11 +221,11 @@
220221
static bool GetRepeatedBool(google::protobuf::Message* pMessage, const char* field_name, int index)
221222
{ return GetRepeatedField<bool>(pMessage, &google::protobuf::Reflection::GetRepeatedBool, field_name, index); }
222223

223-
static std::string GetRepeatedString(google::protobuf::Message* pMessage, const char* field_name, int index)
224+
static str GetRepeatedString(google::protobuf::Message* pMessage, const char* field_name, int index, const char* szErrors = NULL)
224225
{
225226
std::string return_value;
226227
return_value = pMessage->GetReflection()->GetRepeatedStringReference(*pMessage, GetFieldDescriptor(pMessage, field_name), index, &return_value);
227-
return return_value;
228+
return make_str(return_value.c_str(), szErrors);
228229
}
229230

230231
static int GetRepeatedEnum(google::protobuf::Message* pMessage, const char* field_name, int index)

Diff for: src/core/modules/messages/messages_wrap.cpp

+10-2
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,11 @@ void export_protobuf_message(scope _messages)
137137
ProtobufMessage.def("get_float", &CProtobufMessageExt::GetFloat);
138138
ProtobufMessage.def("get_double", &CProtobufMessageExt::GetDouble);
139139
ProtobufMessage.def("get_bool", &CProtobufMessageExt::GetBool);
140-
ProtobufMessage.def("get_string", &CProtobufMessageExt::GetString);
140+
ProtobufMessage.def(
141+
"get_string",
142+
&CProtobufMessageExt::GetString,
143+
("self", "field_name", arg("errors")=object())
144+
);
141145
ProtobufMessage.def("get_enum", &CProtobufMessageExt::GetEnum);
142146
ProtobufMessage.def("get_message", &CProtobufMessageExt::GetMessage, reference_existing_object_policy());
143147

@@ -148,7 +152,11 @@ void export_protobuf_message(scope _messages)
148152
ProtobufMessage.def("get_repeated_float", &CProtobufMessageExt::GetRepeatedFloat);
149153
ProtobufMessage.def("get_repeated_double", &CProtobufMessageExt::GetRepeatedDouble);
150154
ProtobufMessage.def("get_repeated_bool", &CProtobufMessageExt::GetRepeatedBool);
151-
ProtobufMessage.def("get_repeated_string", &CProtobufMessageExt::GetRepeatedString);
155+
ProtobufMessage.def(
156+
"get_repeated_string",
157+
&CProtobufMessageExt::GetRepeatedString,
158+
("self", "field_name", "index", arg("errors")=object())
159+
);
152160
ProtobufMessage.def("get_repeated_enum", &CProtobufMessageExt::GetRepeatedEnum);
153161
ProtobufMessage.def("get_repeated_message", &CProtobufMessageExt::GetRepeatedMessage, reference_existing_object_policy());
154162

Diff for: src/core/utilities/sp_util.h

+12
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,18 @@ inline bool CheckClassname(object obj, char* name)
9696
return strcmp(extract<char *>(obj.attr("__class__").attr("__name__")), name) == 0;
9797
}
9898

99+
//-----------------------------------------------------------------------------
100+
// Returns a Python string object.
101+
//-----------------------------------------------------------------------------
102+
inline str make_str(const char* pStr, const char* szErrors = NULL)
103+
{
104+
if (!szErrors) {
105+
return str(pStr);
106+
}
107+
108+
return str(handle<>(PyUnicode_DecodeUTF8(pStr, strlen(pStr), szErrors)));
109+
}
110+
99111
//-----------------------------------------------------------------------------
100112
// Returns the registered python class for T.
101113
//-----------------------------------------------------------------------------

0 commit comments

Comments
 (0)