def __init__(self, inputs=[]):
self._inputs = inputs
self._tizen_features = []
- self._tizen_enums = []
for f in inputs:
self.__parse_xml(f)
@property
def result(self):
- return self._tizen_features, self._tizen_enums
+ return self._tizen_features
def __parse_xml(self, fname):
root = et.parse(fname).getroot()
- enums = root.findall('.//enum[@typename]')
- for enum in enums:
- self._tizen_enums.append(TizenFeatureEnum(enum))
-
features = root.findall('.//key[@name][@type][@getter]')
for feature in features:
self._tizen_features.append(TizenFeature(feature))
from .TizenFeature import TizenFeature, TizenFeatureEnum
class SystemInfoGenerator:
- def __init__(self, features, enums):
+ def __init__(self, features):
self._features = features
- self._enums = enums
@redirect_output('source')
def generate_source(self):
source_header = os.path.basename(get_output_path('header'))
bp.print_include([source_header])
for feature in self._features:
- feature.print_function()
+ feature.print_function_definition()
bp.print_tail()
@redirect_output('header')
def generate_header(self):
bp.print_head(title='system-info-generated', guard='__TIZEN_SYSTEM_SYSTEM_INFO_GENERATED_H__')
bp.print_include(['system_info.h'])
- for enum in self._enums:
- enum.print_enum_declaration()
for feature in self._features:
- feature.print_function(body=False)
+ feature.print_function_declaration()
bp.print_tail(guard='__TIZEN_SYSTEM_SYSTEM_INFO_GENERATED_H__')
from .TizenFeature import TizenFeature, TizenFeatureEnum
class SystemInfoUtilityGenerator:
- def __init__(self, features, enums):
+ def __init__(self, features):
self._features = features
- self._enums = enums
def __print_string_enum_mapping_array(self):
global_enum_set = {}
+ enum_list = []
+
+ for feature in self._features:
+ if feature.enum is None:
+ continue
+
+ enum_list.append(feature.enum)
+
print(
dedent('''\
static struct enumerator {
int value;
} enumerators[] = {''')
)
- for enum in self._enums:
+
+ for enum in enum_list:
for name,value in enum.data.items():
if name in global_enum_set:
print(f'#error Duplicate enumerator name "{name}"')
class TizenFeature:
def __init__(self, feature):
- self._name = feature.attrib['name']
- self._type = feature.attrib['type']
- self._getter = feature.attrib['getter']
+ self._name = feature.get('name')
+ self._type = feature.get('type')
+ if (self._type == 'enum'):
+ self._enum = TizenFeatureEnum(feature.find('enum'), self._name)
+ else:
+ self._enum = None
+ self._getter = feature.get('getter')
self._type_casting = ''
self._broken = False
elif self.type == 'string':
self._argtype = 'char **'
self._system_info = 'system_info_get_platform_string'
- else:
- self._argtype = f'{self.type} *'
+ elif self.type == 'enum':
+ self._argtype = self.enum.typename + ' *'
self._system_info = 'system_info_get_platform_int'
self._type_casting = '(int *) '
+ else:
+ print(f'#error Invalid key type: {self.type}')
def __eq__(self, other):
return self.name == other.name and \
def type(self):
return self._type
+ @property
+ def enum(self):
+ return self._enum
+
@property
def getter(self):
return self._getter
def broken(self, value):
self._broken = value
- def print_function(self, body=True):
- if body:
- trailing = ''
- visibility = '__attribute__((visibility("default")))'
- else:
- trailing = ';'
- visibility = ''
+ def print_function_declaration(self):
+ if self.type == 'enum':
+ self.enum.print_enum_declaration()
+ print(f'''int system_info_get_{self.getter}({self.argtype}value);\n''')
+
+ def print_function_definition(self):
print(
dedent(f'''\
- {visibility}
- int system_info_get_{self.getter}({self.argtype}value){trailing}'''
+ __attribute__((visibility("default")))
+ int system_info_get_{self.getter}({self.argtype}value)
+ {{
+ return {self.system_info}("{self.name}", {self.type_casting}value);
+ }}\n'''
)
)
- if not body:
- return
-
- print(dedent(f'''\
- {{
- return {self.system_info}("{self.name}", {self.type_casting}value);
- }}''')
- )
-
-
class TizenFeatureEnum:
- def __init__(self, feature):
- self._typename = feature.attrib['typename']
+ def __init__(self, feature, key_name):
+ self._key_name = key_name
+ self._typename = feature.get('typename')
self._data = {}
self._next_value = 0
self._broken = False
print('Invalid data name')
continue
- if value is None:
- self.__add_data(name)
- else:
- self.__add_data(name, int(value))
+ self.__add_data(name, value)
def __eq__(self, other):
return self.typename == other.typename and self.data == other.data
+ @property
+ def key_name(self):
+ return self._key_name
+
@property
def typename(self):
return self._typename
def broken(self, value):
self._broken = value
- def __add_data(self, name, value=None):
+ def __add_data(self, name, value):
if name in self._data:
print(f'Error: Duplicate data {name}, reject')
return
value = self._next_value
self._next_value += 1
else:
+ value = int(value)
self._next_value = value + 1
self._data[name] = value
def print_enum_declaration(self):
print('typedef enum {')
- for name,value in self._data.items():
+ for name,value in self.data.items():
print(f' {name} = {value},')
- print(f'}} {self._typename};')
+ print(f'}} {self._typename};\n')
if args.output_util_header is not None:
set_output_path('util-header', args.output_util_header)
- features, enums = ModelConfigParser(inputs).result
+ features = ModelConfigParser(inputs).result
- generator = SystemInfoGenerator(features, enums)
- utility_generator = SystemInfoUtilityGenerator(features, enums)
+ generator = SystemInfoGenerator(features)
+ utility_generator = SystemInfoUtilityGenerator(features)
generator.generate_header()
generator.generate_source()