Add support for Glib::ustring

Bug #978878 reported by Michael Brown
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
PyBindGen
Fix Released
Undecided
Unassigned

Bug Description

Please accept the following patch adding support for Glib::ustring. It affects the file pybindgen/typehandlers/stringtype.py and is generated against version 0.15.0 of the software. This is additive, no existing type support was harmed in the creation of this patch.

*** pybindgen-0.15.0.old/pybindgen/typehandlers/stringtype.py 2010-04-05 11:20:46.000000000 +0100
--- pybindgen-0.15.0.new/pybindgen/typehandlers/stringtype.py 2012-04-11 13:26:20.498652954 +0100
***************
*** 223,225 ****
--- 223,374 ----
          wrapper.build_params.add_parameter("s#", ['(%s).c_str()' % self.value,
                                                    '(%s).size()' % self.value],
                                             prepend=True)
+
+
+
+ class GlibStringParam(Parameter):
+
+ DIRECTIONS = [Parameter.DIRECTION_IN]
+ CTYPES = ['Glib::ustring']
+
+ def convert_c_to_python(self, wrapper):
+ assert isinstance(wrapper, ReverseWrapperBase)
+ ptr = wrapper.declarations.declare_variable("const char *", self.name + "_ptr")
+ len_ = wrapper.declarations.declare_variable("Py_ssize_t", self.name + "_len")
+ wrapper.before_call.write_code(
+ "%s = (%s).c_str();" % (ptr, self.value))
+ wrapper.before_call.write_code(
+ "%s = (%s).size();" % (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))
+ 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))
+
+
+ class GlibStringRefParam(Parameter):
+
+ DIRECTIONS = [Parameter.DIRECTION_IN,
+ Parameter.DIRECTION_OUT,
+ Parameter.DIRECTION_IN|Parameter.DIRECTION_OUT]
+ CTYPES = ['Glib::ustring&']
+
+ def convert_c_to_python(self, wrapper):
+ assert isinstance(wrapper, ReverseWrapperBase)
+
+ ptr = None
+ if self.direction & Parameter.DIRECTION_IN:
+ ptr = wrapper.declarations.declare_variable("const char *", self.name + "_ptr")
+ len_ = wrapper.declarations.declare_variable("Py_ssize_t", self.name + "_len")
+ wrapper.before_call.write_code(
+ "%s = (%s).c_str();" % (ptr, self.value))
+ wrapper.before_call.write_code(
+ "%s = (%s).size();" % (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.after_call.write_code(
+ "%s = Glib::ustring(%s, %s);" % (self.value, ptr, len_))
+
+ 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))
+
+ if self.direction & Parameter.DIRECTION_OUT:
+ wrapper.build_params.add_parameter("s#", ['('+name_std+').c_str()', '('+name_std+').size()'])
+
+
+ class GlibStringPtrParam(PointerParameter):
+
+ DIRECTIONS = [Parameter.DIRECTION_IN,
+ Parameter.DIRECTION_OUT,
+ Parameter.DIRECTION_IN|Parameter.DIRECTION_OUT]
+ CTYPES = ['Glib::ustring*']
+
+ def convert_c_to_python(self, wrapper):
+ assert isinstance(wrapper, ReverseWrapperBase)
+ ptr = None
+ if self.direction & Parameter.DIRECTION_IN:
+ ptr = wrapper.declarations.declare_variable("const char *", self.name + "_ptr")
+ len_ = wrapper.declarations.declare_variable("Py_ssize_t", self.name + "_len")
+ wrapper.before_call.write_code(
+ "%s = %s->c_str();" % (ptr, self.value))
+ wrapper.before_call.write_code(
+ "%s = %s->size();" % (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.after_call.write_code(
+ "*%s = Glib::ustring(%s, %s);" % (self.value, ptr, len_))
+ if self.transfer_ownership:
+ wrapper.after_call.write_code("delete %s;" % (self.value,))
+
+
+ def convert_python_to_c(self, wrapper):
+ 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)
+ name_std_value = '*' + name_std
+ else:
+ name_std = wrapper.declarations.declare_variable("Glib::ustring", self.name + '_std')
+ wrapper.call_params.append('&%s' % name_std)
+ 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))
+
+ if self.direction & Parameter.DIRECTION_OUT:
+ wrapper.build_params.add_parameter("s#", ['('+name_std_value+').c_str()', '('+name_std_value+').size()'])
+
+
+ class GlibStringReturn(ReturnValue):
+
+ CTYPES = ['Glib::ustring']
+
+ def get_c_error_return(self):
+ return "return Glib::ustring();"
+
+ 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.after_call.write_code(
+ "%s = Glib::ustring(%s, %s);" % (self.value, ptr, len_))
+
+ def convert_c_to_python(self, wrapper):
+ wrapper.build_params.add_parameter("s#", ['(%s).c_str()' % self.value,
+ '(%s).size()' % self.value],
+ prepend=True)
+

Related branches

Revision history for this message
Michael Brown (mbrown-7) wrote :

Now as an attachment.

Gustavo Carneiro (gjc)
Changed in pybindgen:
status: New → Fix Committed
Gustavo Carneiro (gjc)
Changed in pybindgen:
status: Fix Committed → Fix Released
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.