blob: 70acbbb4d6a1fd973ea7a21ee4293726c82a01ca [file] [log] [blame]
Matt Spinler711d51d2019-11-06 09:36:51 -06001/**
2 * Copyright © 2019 IBM Corporation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Aatir Manzur51c92632019-09-06 13:30:48 -050016#include "user_data.hpp"
17
Matt Spinleracb7c102020-01-10 13:49:22 -060018#include "json_utils.hpp"
Aatir Manzur51c92632019-09-06 13:30:48 -050019#include "pel_types.hpp"
Matt Spinleracb7c102020-01-10 13:49:22 -060020#include "user_data_formats.hpp"
21#ifdef PELTOOL
22#include "user_data_json.hpp"
23#endif
Aatir Manzur51c92632019-09-06 13:30:48 -050024
25#include <phosphor-logging/log.hpp>
26
27namespace openpower
28{
29namespace pels
30{
31
32using namespace phosphor::logging;
33
34void UserData::unflatten(Stream& stream)
35{
36 stream >> _header;
37
38 if (_header.size <= SectionHeader::flattenedSize())
39 {
40 throw std::out_of_range(
41 "UserData::unflatten: SectionHeader::size field too small");
42 }
43
44 size_t dataLength = _header.size - SectionHeader::flattenedSize();
45 _data.resize(dataLength);
46
47 stream >> _data;
48}
49
Matt Spinler06885452019-11-06 10:35:42 -060050void UserData::flatten(Stream& stream) const
Aatir Manzur51c92632019-09-06 13:30:48 -050051{
52 stream << _header << _data;
53}
54
55UserData::UserData(Stream& pel)
56{
57 try
58 {
59 unflatten(pel);
60 validate();
61 }
62 catch (const std::exception& e)
63 {
64 log<level::ERR>("Cannot unflatten user data",
65 entry("ERROR=%s", e.what()));
66 _valid = false;
67 }
68}
69
70UserData::UserData(uint16_t componentID, uint8_t subType, uint8_t version,
71 const std::vector<uint8_t>& data)
72{
73 _header.id = static_cast<uint16_t>(SectionID::userData);
74 _header.size = Section::flattenedSize() + data.size();
75 _header.version = version;
76 _header.subType = subType;
77 _header.componentID = componentID;
78
79 _data = data;
80
81 _valid = true;
82}
83
84void UserData::validate()
85{
86 if (header().id != static_cast<uint16_t>(SectionID::userData))
87 {
88 log<level::ERR>("Invalid user data section ID",
89 entry("ID=0x%X", header().id));
90 _valid = false;
91 }
92 else
93 {
94 _valid = true;
95 }
96}
97
Matt Spinleracb7c102020-01-10 13:49:22 -060098std::optional<std::string> UserData::getJSON() const
99{
100#ifdef PELTOOL
101 return user_data::getJSON(_header.componentID, _header.subType,
102 _header.version, _data);
103#endif
104 return std::nullopt;
105}
106
Aatir Manzur51c92632019-09-06 13:30:48 -0500107} // namespace pels
108} // namespace openpower