def register_ptr_alias_parameter_and_return(self, cls, alias): alias_ptr = '::ns3::Ptr< %s >' % alias cls.ThisClassNs3PtrParameter.CTYPES.append(alias_ptr) try: param_type_matcher.register(alias_ptr, cls.ThisClassNs3PtrParameter) except ValueError: pass cls.ThisClassNs3PtrReturn.CTYPES.append(alias_ptr) try: return_type_matcher.register(alias_ptr, cls.ThisClassNs3PtrReturn) except ValueError: pass
def register_ptr_parameter_and_return(self, cls, name): class ThisClassNs3PtrParameter(CppClassNs3PtrParameter): """Register this C++ class as pass-by-pointer parameter""" CTYPES = [] cpp_class = cls cls.ThisClassNs3PtrParameter = ThisClassNs3PtrParameter try: param_type_matcher.register(self.get_pointer_name(cls.full_name), cls.ThisClassNs3PtrParameter) except ValueError: pass class ThisClassNs3PtrReturn(CppClassNs3PtrReturnValue): """Register this C++ class as pointer return""" CTYPES = [] cpp_class = cls cls.ThisClassNs3PtrReturn = ThisClassNs3PtrReturn try: return_type_matcher.register(self.get_pointer_name(cls.full_name), cls.ThisClassNs3PtrReturn) except ValueError: pass
def set_module(self, module): """Set the Module object this class belongs to; can only be set once""" assert self._module is None self._module = module if not self.name: return if self.outer_class is None: if self._module.cpp_namespace_prefix: if self._module.cpp_namespace_prefix == '::': self.full_name = '::' + self.name else: self.full_name = self._module.cpp_namespace_prefix + '::' + self.name else: self.full_name = self.name else: self.full_name = '::'.join([self.outer_class.full_name, self.name]) ## Register type handlers for the enum type assert self.name assert self.full_name class ThisEnumParameter(inttype.IntParam): CTYPES = [] full_type_name = self.full_name def __init__(self, ctype, name, *args, **kwargs): super(ThisEnumParameter, self).__init__(self.full_type_name, name, *args, **kwargs) class ThisEnumReturn(inttype.IntReturn): CTYPES = [] full_type_name = self.full_name def __init__(self, ctype, *args, **kwargs): super(ThisEnumReturn, self).__init__(self.full_type_name, *args, **kwargs) class ThisEnumRefParameter(inttype.IntRefParam): CTYPES = [] full_type_name = self.full_name + " &" def __init__(self, ctype, name, *args, **kwargs): super(ThisEnumRefParameter, self).__init__(self.full_type_name, name, *args, **kwargs) class ThisEnumPtrParameter(inttype.IntPtrParam): CTYPES = [] full_type_name = self.full_name + " *" def __init__(self, ctype, name, *args, **kwargs): super(ThisEnumPtrParameter, self).__init__(self.full_type_name, name, *args, **kwargs) self.ThisEnumParameter = ThisEnumParameter self.ThisEnumReturn = ThisEnumReturn self.ThisEnumRefParameter = ThisEnumRefParameter self.ThisEnumPtrParameter = ThisEnumPtrParameter param_type_matcher.register(self.full_name, self.ThisEnumParameter) return_type_matcher.register(self.full_name, self.ThisEnumReturn) param_type_matcher.register(self.full_name + ' &', self.ThisEnumRefParameter) param_type_matcher.register(self.full_name + ' *', self.ThisEnumPtrParameter) if self.name != self.full_name: try: param_type_matcher.register(self.name, self.ThisEnumParameter) except ValueError: pass try: return_type_matcher.register(self.name, self.ThisEnumReturn) except ValueError: pass try: param_type_matcher.register(self.name+' &', self.ThisEnumRefParameter) except ValueError: pass try: param_type_matcher.register(self.name+' *', self.ThisEnumPtrParameter) except ValueError: pass
def set_module(self, module): """Set the Module object this class belongs to; can only be set once""" assert self._module is None self._module = module if not self.name: return if self.outer_class is None: if self._module.cpp_namespace_prefix: if self._module.cpp_namespace_prefix == '::': self.full_name = '::' + self.name else: self.full_name = self._module.cpp_namespace_prefix + '::' + self.name else: self.full_name = self.name else: self.full_name = '::'.join([self.outer_class.full_name, self.name]) ## Register type handlers for the enum type assert self.name assert self.full_name class ThisEnumParameter(inttype.IntParam): CTYPES = [] full_type_name = self.full_name def __init__(self, ctype, name, *args, **kwargs): super(ThisEnumParameter, self).__init__(self.full_type_name, name, *args, **kwargs) class ThisEnumReturn(inttype.IntReturn): CTYPES = [] full_type_name = self.full_name def __init__(self, ctype, *args, **kwargs): super(ThisEnumReturn, self).__init__(self.full_type_name, *args, **kwargs) class ThisEnumRefParameter(inttype.IntRefParam): CTYPES = [] full_type_name = self.full_name + " &" def __init__(self, ctype, name, *args, **kwargs): super(ThisEnumRefParameter, self).__init__(self.full_type_name, name, *args, **kwargs) class ThisEnumPtrParameter(inttype.IntPtrParam): CTYPES = [] full_type_name = self.full_name + " *" def __init__(self, ctype, name, *args, **kwargs): super(ThisEnumPtrParameter, self).__init__(self.full_type_name, name, *args, **kwargs) self.ThisEnumParameter = ThisEnumParameter self.ThisEnumReturn = ThisEnumReturn self.ThisEnumRefParameter = ThisEnumRefParameter self.ThisEnumPtrParameter = ThisEnumPtrParameter param_type_matcher.register(self.full_name, self.ThisEnumParameter) return_type_matcher.register(self.full_name, self.ThisEnumReturn) param_type_matcher.register(self.full_name + ' &', self.ThisEnumRefParameter) param_type_matcher.register(self.full_name + ' *', self.ThisEnumPtrParameter) if self.name != self.full_name: try: param_type_matcher.register(self.name, self.ThisEnumParameter) except ValueError: pass try: return_type_matcher.register(self.name, self.ThisEnumReturn) except ValueError: pass try: param_type_matcher.register(self.name + ' &', self.ThisEnumRefParameter) except ValueError: pass try: param_type_matcher.register(self.name + ' *', self.ThisEnumPtrParameter) except ValueError: pass
def convert_python_to_c(self, wrapper): name = wrapper.declarations.declare_variable("SmlError*", "error", initializer="NULL") wrapper.call_params.append('&'+name) wrapper.after_call.write_error_check("smlErrorIsSet(&%s)" % name, 'PyErr_SetString(PyExc_RuntimeError, smlErrorPrint(&%s));\n' 'smlErrorDeref(&%s);' % (name, name)) def convert_c_to_python(self, wrapper): raise NotImplementedError param_type_matcher.register("SmlError", SmlErrorParam) #because syncml.h does # typedef int SmlBool; param_type_matcher.register("SmlBool", IntParam) return_type_matcher.register("SmlBool", IntReturn) #smlMD5ToString param_type_matcher.register("unsigned char *", CStringParam) #smlTransportDataNew param_type_matcher.register("long unsigned int", IntParam) def callback_customizations(module): #write the callbacks with c compatible apis #typedef void (* SmlManagerEventCb) (SmlManager *manager, SmlManagerEventType type, SmlSession *session, SmlError *error, void *userdata); #typedef void (* SmlCommandCb) (SmlSession *session, SmlCommand *cmd, void *userdata); #typedef void (* SmlHeaderCb) (SmlSession *session, SmlHeader *header, SmlCred *cred, void *userdata); #typedef void (* SmlStatusReplyCb) (SmlSession *session, SmlStatus *status, void *userdata); module.header.writeln( '''