# # Copyright (C) 2017 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # import logging from xml.etree import ElementTree _ARCH = "arch" _HWBINDER = "hwbinder" _NAME = "name" _PASSTHROUGH = "passthrough" _TRANSPORT = "transport" _VERSION = "version" _INTERFACE = "interface" _INSTANCE = "instance" class HalInterfaceDescription(object): """Class to store the information of a running hal service interface. Attributes: hal_interface_name: interface name within the hal e.g. INfc. hal_instance_instances: a list of instance name of the registered hal service e.g. default. nfc """ def __init__(self, hal_interface_name, hal_interface_instances): self.hal_interface_name = hal_interface_name self.hal_interface_instances = hal_interface_instances class HalDescription(object): """Class to store the information of a running hal service. Attributes: hal_name: hal name e.g. android.hardware.nfc. hal_version: hal version e.g. 1.0. hal_interfaces: a list of HalInterfaceDescription within the hal. hal_archs: a list of strings where each string indicates the supported client bitness (e.g,. ["32", "64"]). """ def __init__(self, hal_name, hal_version, hal_interfaces, hal_archs): self.hal_name = hal_name self.hal_version = hal_version self.hal_interfaces = hal_interfaces self.hal_archs = hal_archs def GetHalDescriptions(vintf_xml): """Parses a vintf xml string. Args: vintf_xml: string, containing a vintf.xml file content. Returns: a dictionary containing the information of hwbinder HALs, a dictionary containing the information of passthrough HALs. """ try: xml_root = ElementTree.fromstring(vintf_xml) except ElementTree.ParseError as e: logging.exception(e) logging.error('This vintf xml could not be parsed:\n%s' % vintf_xml) return None, None hwbinder_hals = dict() passthrough_hals = dict() for xml_hal in xml_root: hal_name = None hal_transport = None hal_version = None hal_interfaces = [] hal_archs = ["32", "64"] for xml_hal_item in xml_hal: tag = str(xml_hal_item.tag) if tag == _NAME: hal_name = str(xml_hal_item.text) elif tag == _TRANSPORT: hal_transport = str(xml_hal_item.text) if _ARCH in xml_hal_item.attrib: hal_archs = xml_hal_item.attrib[_ARCH].split("+") elif tag == _VERSION: hal_version = str(xml_hal_item.text) elif tag == _INTERFACE: hal_interface_name = None hal_interface_instances = [] for interface_item in xml_hal_item: tag = str(interface_item.tag) if tag == _NAME: hal_interface_name = str(interface_item.text) elif tag == _INSTANCE: hal_interface_instances.append( str(interface_item.text)) hal_interfaces.append( HalInterfaceDescription(hal_interface_name, hal_interface_instances)) hal_info = HalDescription(hal_name, hal_version, hal_interfaces, hal_archs) hal_key = "%s@%s" % (hal_name, hal_version) if hal_transport == _HWBINDER: hwbinder_hals[hal_key] = hal_info elif hal_transport == _PASSTHROUGH: passthrough_hals[hal_key] = hal_info else: logging.error("Unknown transport type %s", hal_transport) return hwbinder_hals, passthrough_hals