1 /**
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  */
16 #include "section_factory.hpp"
17 
18 #include "extended_user_data.hpp"
19 #include "extended_user_header.hpp"
20 #include "failing_mtms.hpp"
21 #include "generic.hpp"
22 #include "pel_types.hpp"
23 #include "private_header.hpp"
24 #include "src.hpp"
25 #include "user_data.hpp"
26 #include "user_header.hpp"
27 
28 namespace openpower
29 {
30 namespace pels
31 {
32 namespace section_factory
33 {
34 std::unique_ptr<Section> create(Stream& pelData)
35 {
36     std::unique_ptr<Section> section;
37 
38     // Peek the section ID to create the appriopriate object.
39     // If not enough data remains to do so, an invalid
40     // Generic object will be created in the default case.
41     uint16_t sectionID = 0;
42 
43     if (pelData.remaining() >= 2)
44     {
45         pelData >> sectionID;
46         pelData.offset(pelData.offset() - 2);
47     }
48 
49     switch (sectionID)
50     {
51         case static_cast<uint16_t>(SectionID::privateHeader):
52             section = std::make_unique<PrivateHeader>(pelData);
53             break;
54         case static_cast<uint16_t>(SectionID::userData):
55             section = std::make_unique<UserData>(pelData);
56             break;
57         case static_cast<uint16_t>(SectionID::userHeader):
58             section = std::make_unique<UserHeader>(pelData);
59             break;
60         case static_cast<uint16_t>(SectionID::failingMTMS):
61             section = std::make_unique<FailingMTMS>(pelData);
62             break;
63         case static_cast<uint16_t>(SectionID::primarySRC):
64         case static_cast<uint16_t>(SectionID::secondarySRC):
65             section = std::make_unique<SRC>(pelData);
66             break;
67         case static_cast<uint16_t>(SectionID::extendedUserHeader):
68             section = std::make_unique<ExtendedUserHeader>(pelData);
69             break;
70         case static_cast<uint16_t>(SectionID::extUserData):
71             section = std::make_unique<ExtendedUserData>(pelData);
72             break;
73         default:
74             // A generic object, but at least an object.
75             section = std::make_unique<Generic>(pelData);
76             break;
77     }
78 
79     return section;
80 }
81 
82 } // namespace section_factory
83 } // namespace pels
84 } // namespace openpower
85