summaryrefslogtreecommitdiffstats
path: root/extras/packetforge/NodeField.py
blob: 5788984630ff9522727bd52acd7793ff3b0daea1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# Copyright (c) 2022 Intel and/or its affiliates.
# 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 ExpressionConverter
from InputFormat import *


class NodeField:
    def __init__(self):
        self.DefaultValue = None
        self.IsReserved = None
        self.IsReadonly = None
        self.IsAutoIncrease = None
        self.IsIncreaseLength = None
        self.Optional = None
        self.VariableSize = None

    def Create(token):
        if token == None:
            return None

        field = NodeField()

        if token["name"] == None:
            return None
        if token["size"] == None:
            return None

        # name
        field.Name = token["name"]

        if field.Name == "reserved":
            field.IsReserved = True

        inputFormat = InputFormat.bytearray
        res, u16 = ExpressionConverter.ToNum(token["size"])

        # size
        if res:
            field.Size = u16
            if u16 <= 8:
                inputFormat = InputFormat.u8
            elif u16 <= 16:
                inputFormat = InputFormat.u16
            elif u16 <= 32:
                inputFormat = InputFormat.u32
            elif u16 <= 64:
                inputFormat = InputFormat.u64
            else:
                inputFormat = InputFormat.bytearray
        else:
            field.Size = 0
            field.VariableSize = token["size"]

        if "format" in token and token["format"] != None:
            inputFormat = InputFormat[token["format"]]

        field.Format = inputFormat

        if "default" in token and token["default"] != None:
            field.DefaultValue = token["default"]
            ret, _ = ExpressionConverter.Verify(field.Format, field.DefaultValue)
            if not ret:
                return None

        if "readonly" in token and token["readonly"] == "true" or field.IsReserved:
            field.IsReadonly = True
        if "autoincrease" in token and token["autoincrease"] == "true":
            field.IsAutoIncrease = True
            field.IsReadonly = True
        if "increaselength" in token and token["increaselength"] == "true":
            field.IsIncreaseLength = True
        if "optional" in token:
            field.Optional = token["optional"]

        return field