diff --git a/tools/genapixml.py b/tools/genapixml.py index fc291bdd0..8549e8e25 100755 --- a/tools/genapixml.py +++ b/tools/genapixml.py @@ -34,7 +34,9 @@ class CObject: class CEnumValue(CObject): - pass + def __init__(self, name): + CObject.__init__(self, name) + self.value = None class CEnum(CObject): @@ -360,8 +362,21 @@ class Project: c.addMethod(f) break + def __parseCEnumValueInitializer(self, initializer): + initializer = initializer.strip() + if not initializer.startswith('='): + return None + + initializer = initializer[1:] + initializer.strip() + return initializer + def __parseCEnumValue(self, node): ev = CEnumValue(node.find('./name').text) + initializerNode = node.find('./initializer') + if initializerNode is not None: + ev.value = self.__parseCEnumValueInitializer(initializerNode.text) + deprecatedNode = node.find(".//xrefsect[xreftitle='Deprecated']") if deprecatedNode is not None: ev.deprecated = True diff --git a/wrappers/cpp/abstractapi.py b/wrappers/cpp/abstractapi.py index edae4d92c..41e8f2718 100644 --- a/wrappers/cpp/abstractapi.py +++ b/wrappers/cpp/abstractapi.py @@ -14,15 +14,19 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + import re import genapixml as CApi + class Error(RuntimeError): pass + class BlacklistedException(Error): pass + class Name(object): camelCaseParsingRegex = re.compile('[A-Z][a-z0-9]*') lowerCamelCaseSplitingRegex = re.compile('([a-z][a-z0-9]*)([A-Z][a-z0-9]*)') @@ -277,8 +281,22 @@ class Namespace(DocumentableObject): child.parent = self +class Flag: + def __init__(self, position): + self.position = position + + class EnumValue(DocumentableObject): - pass + def __init__(self, name): + DocumentableObject.__init__(self, name) + self.value = None + + def value_from_string(self, stringValue): + m = re.match('^1\s*<<\s*([0-9]+)$', stringValue) + if m is not None: + self.value = Flag(int(m.group(1))) + else: + self.value = int(stringValue, base=0) class Enum(DocumentableObject): @@ -478,7 +496,11 @@ class CParser(object): def parse_all(self): for enum in self.cProject.enums: - self.parse_enum(enum) + try: + self.parse_enum(enum) + except Error as e: + print('Could not parse \'{0}\' enum: {1}'.format(enum.name, e.args[0])) + for _class in self.cProject.classes: try: self.parse_class(_class) @@ -570,6 +592,11 @@ class CParser(object): valueName = EnumValueName() valueName.from_camel_case(cEnumValue.name, namespace=name) aEnumValue = EnumValue(valueName) + if cEnumValue.value is not None: + try: + aEnumValue.value_from_string(cEnumValue.value) + except ValueError: + raise Error('{0} enum value has an invalid definition ({1})'.format(cEnumValue.name, cEnumValue.value)) enum.add_value(aEnumValue) self.enumsIndex[nameStr] = enum diff --git a/wrappers/cpp/enums_header.mustache b/wrappers/cpp/enums_header.mustache index 46d9b8220..77fee39a4 100644 --- a/wrappers/cpp/enums_header.mustache +++ b/wrappers/cpp/enums_header.mustache @@ -24,7 +24,7 @@ namespace linphone { {{#enums}} enum {{name}} { {{#values}} - {{name}}{{#notLast}},{{/notLast}} + {{name}}{{#value}} = {{{value}}}{{/value}}{{#notLast}},{{/notLast}} {{/values}} }; diff --git a/wrappers/cpp/genwrapper.py b/wrappers/cpp/genwrapper.py index 2a0080a93..1afb0398f 100755 --- a/wrappers/cpp/genwrapper.py +++ b/wrappers/cpp/genwrapper.py @@ -55,6 +55,12 @@ class CppTranslator(object): def translate_enum_value(enumValue): enumValueDict = {} enumValueDict['name'] = CppTranslator.translate_enum_value_name(enumValue.name) + if type(enumValue.value) is int: + enumValueDict['value'] = str(enumValue.value) + elif type(enumValue.value) is AbsApi.Flag: + enumValueDict['value'] = '1<<' + str(enumValue.value.position) + else: + enumValueDict['value'] = None return enumValueDict def translate_class(self, _class): @@ -429,7 +435,7 @@ class CppTranslator(object): raise AbsApi.Error('{0} has been escaped'.format(_type.name)) if _type.desc is None: - raise AbsApi.Error('{0} has not been fixed'.format(_type.name.to_camel_case(fullName=True))) + raise AbsApi.Error('{0} has not been fixed'.format(_type.name)) if 'namespace' in params: nsName = params['namespace'].name if params['namespace'] is not None else None