blob: 8a94911b9dc29872b50912b621fef6412c6ea99b [file] [log] [blame]
Kuiying Wang3a044402019-02-19 15:00:11 +08001/*
2// Copyright (c) 2019 Intel 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 "post_code.hpp"
17std::vector<uint64_t> PostCode::getPostCodes(uint16_t index)
18{
19 std::vector<uint64_t> codes;
20
21 if (currentBootCycleIndex() == index)
22 return postCodes;
23 deserializePostCodes(fs::path(strPostCodeListPath + std::to_string(index)),
24 codes);
25 return codes;
26}
27void PostCode::savePostCodes(uint64_t code)
28{
29 postCodes.push_back(code);
30 serialize(fs::path(PostCodeListPath));
31 return;
32}
33
34fs::path PostCode::serialize(const std::string& path)
35{
36 try
37 {
38 uint16_t index = currentBootCycleIndex();
39 fs::path fullPath(path + strCurrentBootCycleIndexName);
40 std::ofstream os(fullPath.c_str(), std::ios::binary);
41 cereal::JSONOutputArchive oarchive(os);
42 oarchive(index);
43
44 std::ofstream osPostCodes(
45 (path + std::to_string(currentBootCycleIndex())).c_str(),
46 std::ios::binary);
47 cereal::JSONOutputArchive oarchivePostCodes(osPostCodes);
48 oarchivePostCodes(postCodes);
49 }
50 catch (cereal::Exception& e)
51 {
52 phosphor::logging::log<phosphor::logging::level::ERR>(e.what());
53 return "";
54 }
55 catch (const fs::filesystem_error& e)
56 {
57 phosphor::logging::log<phosphor::logging::level::ERR>(e.what());
58 return "";
59 }
60 return path;
61}
62
63bool PostCode::deserialize(const fs::path& path, uint16_t& index)
64{
65 try
66 {
67 if (fs::exists(path))
68 {
69 std::ifstream is(path.c_str(), std::ios::in | std::ios::binary);
70 cereal::JSONInputArchive iarchive(is);
71 iarchive(index);
72 return true;
73 }
74 return false;
75 }
76 catch (cereal::Exception& e)
77 {
78 phosphor::logging::log<phosphor::logging::level::ERR>(e.what());
79 return false;
80 }
81 catch (const fs::filesystem_error& e)
82 {
83 return false;
84 }
85
86 return false;
87}
88
89bool PostCode::deserializePostCodes(const fs::path& path,
90 std::vector<uint64_t>& codes)
91{
92 try
93 {
94 if (fs::exists(path))
95 {
96 std::ifstream is(path.c_str(), std::ios::in | std::ios::binary);
97 cereal::JSONInputArchive iarchive(is);
98 iarchive(codes);
99 return true;
100 }
101 return false;
102 }
103 catch (cereal::Exception& e)
104 {
105 phosphor::logging::log<phosphor::logging::level::ERR>(e.what());
106 return false;
107 }
108 catch (const fs::filesystem_error& e)
109 {
110 return false;
111 }
112
113 return false;
114}