From 62d58437ea902afc13d17aa198d24428b286bb14 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Wed, 9 Jul 2014 17:26:05 +0200 Subject: [PATCH] Implement instance methods and add a blacklist of C functions that must not be wrapped. --- tools/python/apixml2python.py | 11 ++++++++++- tools/python/apixml2python/linphone.py | 17 ++++++++++++----- .../apixml2python/linphone_module.mustache | 13 +++++-------- 3 files changed, 27 insertions(+), 14 deletions(-) diff --git a/tools/python/apixml2python.py b/tools/python/apixml2python.py index 87497ec8e..f83084f54 100755 --- a/tools/python/apixml2python.py +++ b/tools/python/apixml2python.py @@ -26,10 +26,19 @@ sys.path.append(os.path.realpath(__file__)) from apixml2python.linphone import LinphoneModule +blacklisted_functions = [ + 'linphone_auth_info_write_config', + 'lp_config_for_each_entry', + 'lp_config_for_each_section', + 'lp_config_get_range', + 'lp_config_load_dict_to_section', + 'lp_config_section_to_dict' +] + def generate(apixmlfile): tree = ET.parse(apixmlfile) renderer = pystache.Renderer() - m = LinphoneModule(tree) + m = LinphoneModule(tree, blacklisted_functions) f = open("linphone.c", "w") f.write(renderer.render(m)) diff --git a/tools/python/apixml2python/linphone.py b/tools/python/apixml2python/linphone.py index 57127d815..eca991ff8 100644 --- a/tools/python/apixml2python/linphone.py +++ b/tools/python/apixml2python/linphone.py @@ -98,8 +98,8 @@ class MethodDefinition: if self.return_type != 'void': self.body += "cresult = " self.body += self.method_node.get('name') + "(" - if self.method_type != 'classmethod': - self.body += "pylinphone_" + self.class_['class_name'] + "_get_native_ptr(self)" + if self.self_arg is not None: + self.body += "native_ptr" if len(self.arg_names) > 0: self.body += ', ' self.body += ', '.join(self.arg_names) + ");\n" @@ -194,7 +194,7 @@ class MethodDefinition: class LinphoneModule(object): - def __init__(self, tree): + def __init__(self, tree, blacklisted_functions): self.enums = [] xml_enums = tree.findall("./enums/enum") for xml_enum in xml_enums: @@ -220,15 +220,22 @@ class LinphoneModule(object): c['class_type_methods'] = [] xml_type_methods = xml_class.findall("./classmethods/classmethod") for xml_type_method in xml_type_methods: + method_name = xml_type_method.get('name') + if method_name in blacklisted_functions: + continue m = {} - m['method_name'] = xml_type_method.get('name').replace(c['class_c_function_prefix'], '') + m['method_name'] = method_name.replace(c['class_c_function_prefix'], '') m['method_body'] = self.__format_method_body(xml_type_method, c) c['class_type_methods'].append(m) c['class_instance_methods'] = [] xml_instance_methods = xml_class.findall("./instancemethods/instancemethod") for xml_instance_method in xml_instance_methods: + method_name = xml_instance_method.get('name') + if method_name in blacklisted_functions: + continue m = {} - m['method_name'] = xml_instance_method.get('name').replace(c['class_c_function_prefix'], '') + m['method_name'] = method_name.replace(c['class_c_function_prefix'], '') + m['method_body'] = self.__format_method_body(xml_instance_method, c) c['class_instance_methods'].append(m) c['class_properties'] = [] xml_properties = xml_class.findall("./properties/property") diff --git a/tools/python/apixml2python/linphone_module.mustache b/tools/python/apixml2python/linphone_module.mustache index 682934031..915a2759b 100644 --- a/tools/python/apixml2python/linphone_module.mustache +++ b/tools/python/apixml2python/linphone_module.mustache @@ -57,9 +57,7 @@ static void pylinphone_log(const char *level, const char *fmt) { {{#classes}} - static PyTypeObject pylinphone_{{class_name}}Type; - {{/classes}} {{#classes}} @@ -69,8 +67,8 @@ typedef struct { {{class_cname}} *native_ptr; } pylinphone_{{class_name}}Object; -static {{class_cname}} * pylinphone_{{class_name}}_get_native_ptr(pylinphone_{{class_name}}Object *self) { - return self->native_ptr; +static {{class_cname}} * pylinphone_{{class_name}}_get_native_ptr(PyObject *self) { + return ((pylinphone_{{class_name}}Object *)self)->native_ptr; } static PyObject * pylinphone_{{class_name}}_new_from_native_ptr(PyTypeObject *type, {{class_cname}} *native_ptr) { @@ -106,8 +104,7 @@ static PyObject * pylinphone_{{class_name}}_class_method_{{method_name}}(PyObjec {{#class_instance_methods}} static PyObject * pylinphone_{{class_name}}_instance_method_{{method_name}}(PyObject *self, PyObject *args) { - // TODO: Fill implementation - Py_RETURN_NONE; +{{{method_body}}} } {{/class_instance_methods}} @@ -127,11 +124,11 @@ static PyMethodDef pylinphone_{{class_name}}_instance_methods[] = { {{#class_properties}} -static PyObject * pylinphone_{{class_name}}_{{getter_name}}(pylinphone_{{class_name}}Object *self, void *closure) { +static PyObject * pylinphone_{{class_name}}_{{getter_name}}(PyObject *self, void *closure) { {{{getter_body}}} } -static int pylinphone_{{class_name}}_{{setter_name}}(pylinphone_{{class_name}}Object *self, PyObject *value, void *closure) { +static int pylinphone_{{class_name}}_{{setter_name}}(PyObject *self, PyObject *value, void *closure) { {{{setter_body}}} return 0; }