From 692698b0a78752d2a32dbc8ee65b8b08970ab090 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Sat, 2 Jun 2012 12:25:13 +0100 Subject: [PATCH] Glib::ustring mapping fails with non ascii-7 characters --- pybindgen/typehandlers/stringtype.py | 53 ++++++++++++---------------- 1 file changed, 23 insertions(+), 30 deletions(-) diff --git a/pybindgen/typehandlers/stringtype.py b/pybindgen/typehandlers/stringtype.py index da9eeef..47dabc4 100644 --- a/pybindgen/typehandlers/stringtype.py +++ b/pybindgen/typehandlers/stringtype.py @@ -237,22 +237,20 @@ class GlibStringParam(Parameter): wrapper.before_call.write_code( "%s = (%s).c_str();" % (ptr, self.value)) wrapper.before_call.write_code( - "%s = (%s).size();" % (len_, self.value)) + "%s = (%s).bytes();" % (len_, self.value)) wrapper.build_params.add_parameter('s#', [ptr, len_]) def convert_python_to_c(self, wrapper): assert isinstance(wrapper, ForwardWrapperBase) if self.default_value is None: name = wrapper.declarations.declare_variable("const char *", self.name) - name_len = wrapper.declarations.declare_variable("Py_ssize_t", self.name+'_len') - wrapper.parse_params.add_parameter('s#', ['&'+name, '&'+name_len], self.value) - wrapper.call_params.append('Glib::ustring(%s, %s)' % (name, name_len)) + wrapper.parse_params.add_parameter('et', ['"utf-8"', '&'+name], self.value) + wrapper.call_params.append('Glib::ustring(%s)' % (name)) else: name = wrapper.declarations.declare_variable("const char *", self.name, 'NULL') - name_len = wrapper.declarations.declare_variable("Py_ssize_t", self.name+'_len') - wrapper.parse_params.add_parameter('s#', ['&'+name, '&'+name_len], self.value, optional=True) - wrapper.call_params.append('(%s ? Glib::ustring(%s, %s) : %s)' - % (name, name, name_len, self.default_value)) + wrapper.parse_params.add_parameter('et', ['"utf-8"', '&'+name], self.value, optional=True) + wrapper.call_params.append('(%s ? Glib::ustring(%s) : %s)' + % (name, name, self.default_value)) class GlibStringRefParam(Parameter): @@ -272,31 +270,29 @@ class GlibStringRefParam(Parameter): wrapper.before_call.write_code( "%s = (%s).c_str();" % (ptr, self.value)) wrapper.before_call.write_code( - "%s = (%s).size();" % (len_, self.value)) + "%s = (%s).bytes();" % (len_, self.value)) wrapper.build_params.add_parameter('s#', [ptr, len_]) if self.direction & Parameter.DIRECTION_OUT: if ptr is None: ptr = wrapper.declarations.declare_variable("const char *", self.name + "_ptr") - len_ = wrapper.declarations.declare_variable("Py_ssize_t", self.name + "_len") - wrapper.parse_params.add_parameter("s#", ['&'+ptr, '&'+len_], self.value) + wrapper.parse_params.add_parameter("et", ['"utf-8"', '&'+ptr], self.value) wrapper.after_call.write_code( - "%s = Glib::ustring(%s, %s);" % (self.value, ptr, len_)) + "%s = Glib::ustring(%s);" % (self.value, ptr)) def convert_python_to_c(self, wrapper): assert isinstance(wrapper, ForwardWrapperBase) name = wrapper.declarations.declare_variable("const char *", self.name) - name_len = wrapper.declarations.declare_variable("Py_ssize_t", self.name+'_len') name_std = wrapper.declarations.declare_variable("Glib::ustring", self.name + '_std') wrapper.call_params.append(name_std) if self.direction & Parameter.DIRECTION_IN: - wrapper.parse_params.add_parameter('s#', ['&'+name, '&'+name_len], self.value) - wrapper.before_call.write_code('%s = Glib::ustring(%s, %s);' % - (name_std, name, name_len)) + wrapper.parse_params.add_parameter('et', ['"utf-8"', '&'+name], self.value) + wrapper.before_call.write_code('%s = Glib::ustring(%s);' % + (name_std, name)) if self.direction & Parameter.DIRECTION_OUT: - wrapper.build_params.add_parameter("s#", ['('+name_std+').c_str()', '('+name_std+').size()']) + wrapper.build_params.add_parameter("s#", ['('+name_std+').c_str()', '('+name_std+').bytes()']) class GlibStringPtrParam(PointerParameter): @@ -315,16 +311,15 @@ class GlibStringPtrParam(PointerParameter): wrapper.before_call.write_code( "%s = %s->c_str();" % (ptr, self.value)) wrapper.before_call.write_code( - "%s = %s->size();" % (len_, self.value)) + "%s = %s->bytes();" % (len_, self.value)) wrapper.build_params.add_parameter('s#', [ptr, len_]) if self.direction & Parameter.DIRECTION_OUT: if ptr is None: ptr = wrapper.declarations.declare_variable("const char *", self.name + "_ptr") - len_ = wrapper.declarations.declare_variable("Py_ssize_t", self.name + "_len") - wrapper.parse_params.add_parameter("s#", ['&'+ptr, '&'+len_], self.value) + wrapper.parse_params.add_parameter("et", ['"utf-8"', '&'+ptr], self.value) wrapper.after_call.write_code( - "*%s = Glib::ustring(%s, %s);" % (self.value, ptr, len_)) + "*%s = Glib::ustring(%s);" % (self.value, ptr)) if self.transfer_ownership: wrapper.after_call.write_code("delete %s;" % (self.value,)) @@ -333,7 +328,6 @@ class GlibStringPtrParam(PointerParameter): assert isinstance(wrapper, ForwardWrapperBase) assert self.default_value is None, "default_value not implemented yet" name = wrapper.declarations.declare_variable("const char *", self.name) - name_len = wrapper.declarations.declare_variable("Py_ssize_t", self.name+'_len') if self.transfer_ownership: name_std = wrapper.declarations.declare_variable("Glib::ustring*", self.name + '_std', 'new Glib::ustring') wrapper.call_params.append('%s' % name_std) @@ -344,12 +338,12 @@ class GlibStringPtrParam(PointerParameter): name_std_value = name_std if self.direction & Parameter.DIRECTION_IN: - wrapper.parse_params.add_parameter('s#', ['&'+name, '&'+name_len], self.value) - wrapper.before_call.write_code('%s = Glib::ustring(%s, %s);' % - (name_std_value, name, name_len)) + wrapper.parse_params.add_parameter('et', ['"utf-8"', '&'+name], self.value) + wrapper.before_call.write_code('%s = Glib::ustring(%s);' % + (name_std_value, name)) if self.direction & Parameter.DIRECTION_OUT: - wrapper.build_params.add_parameter("s#", ['('+name_std_value+').c_str()', '('+name_std_value+').size()']) + wrapper.build_params.add_parameter("s#", ['('+name_std_value+').c_str()', '('+name_std_value+').bytes()']) class GlibStringReturn(ReturnValue): @@ -361,13 +355,12 @@ class GlibStringReturn(ReturnValue): def convert_python_to_c(self, wrapper): ptr = wrapper.declarations.declare_variable("const char *", "retval_ptr") - len_ = wrapper.declarations.declare_variable("Py_ssize_t", "retval_len") - wrapper.parse_params.add_parameter("s#", ['&'+ptr, '&'+len_]) + wrapper.parse_params.add_parameter("et", ['"utf-8"', '&'+ptr]) wrapper.after_call.write_code( - "%s = Glib::ustring(%s, %s);" % (self.value, ptr, len_)) + "%s = Glib::ustring(%s);" % (self.value, ptr)) def convert_c_to_python(self, wrapper): wrapper.build_params.add_parameter("s#", ['(%s).c_str()' % self.value, - '(%s).size()' % self.value], + '(%s).bytes()' % self.value], prepend=True)