# SPDX-License-Identifier: GPL-2.0+ # Copyright 2021 Google LLC # Written by Simon Glass # # Support for a collection of entries from other parts of an image from collections import OrderedDict import os from binman.entry import Entry from dtoc import fdt_util class Entry_collection(Entry): """An entry which contains a collection of other entries Properties / Entry arguments: - content: List of phandles to entries to include This allows reusing the contents of other entries. The contents of the listed entries are combined to form this entry. This serves as a useful base class for entry types which need to process data from elsewhere in the image, not necessarily child entries. """ def __init__(self, section, etype, node): super().__init__(section, etype, node) self.content = fdt_util.GetPhandleList(self._node, 'content') if not self.content: self.Raise("Collection must have a 'content' property") def GetContents(self, required): """Get the contents of this entry Args: required: True if the data must be present, False if it is OK to return None Returns: bytes content of the entry """ # Join up all the data self.Info('Getting contents, required=%s' % required) data = bytearray() for entry_phandle in self.content: entry_data = self.section.GetContentsByPhandle(entry_phandle, self, required) if not required and entry_data is None: self.Info('Contents not available yet') # Data not available yet return None data += entry_data self.Info('Returning contents size %x' % len(data)) return data def ObtainContents(self): data = self.GetContents(False) if data is None: return False self.SetContents(data) return True def ProcessContents(self): # The blob may have changed due to WriteSymbols() data = self.GetContents(True) return self.ProcessContentsUpdate(data)