1# SPDX-License-Identifier: GPL-2.0+
2# Copyright (c) 2018 Google, Inc
3# Written by Simon Glass <sjg@chromium.org>
4#
5
6from collections import OrderedDict
7
8from binman.entry import Entry, EntryArg
9from dtoc import fdt_util
10from patman import tools
11
12
13class Entry_text(Entry):
14    """An entry which contains text
15
16    The text can be provided either in the node itself or by a command-line
17    argument. There is a level of indirection to allow multiple text strings
18    and sharing of text.
19
20    Properties / Entry arguments:
21        text-label: The value of this string indicates the property / entry-arg
22            that contains the string to place in the entry
23        <xxx> (actual name is the value of text-label): contains the string to
24            place in the entry.
25        <text>: The text to place in the entry (overrides the above mechanism).
26            This is useful when the text is constant.
27
28    Example node:
29
30        text {
31            size = <50>;
32            text-label = "message";
33        };
34
35    You can then use:
36
37        binman -amessage="this is my message"
38
39    and binman will insert that string into the entry.
40
41    It is also possible to put the string directly in the node:
42
43        text {
44            size = <8>;
45            text-label = "message";
46            message = "a message directly in the node"
47        };
48
49    or just:
50
51        text {
52            size = <8>;
53            text = "some text directly in the node"
54        };
55
56    The text is not itself nul-terminated. This can be achieved, if required,
57    by setting the size of the entry to something larger than the text.
58    """
59    def __init__(self, section, etype, node):
60        super().__init__(section, etype, node)
61        value = fdt_util.GetString(self._node, 'text')
62        if value:
63            value = tools.ToBytes(value)
64        else:
65            label, = self.GetEntryArgsOrProps([EntryArg('text-label', str)])
66            self.text_label = label
67            if self.text_label:
68                value, = self.GetEntryArgsOrProps([EntryArg(self.text_label,
69                                                            str)])
70                value = tools.ToBytes(value) if value is not None else value
71        self.value = value
72
73    def ObtainContents(self):
74        if not self.value:
75            self.Raise("No value provided for text label '%s'" %
76                       self.text_label)
77        self.SetContents(self.value)
78        return True
79