blob: 3354e89c49c614d88552dc1729794237204ed523 [file] [log] [blame]
Tom Joseph0c6d22c2019-06-26 09:58:41 +05301#pragma once
2
George Liu6492f522020-06-16 10:34:05 +08003#include "libpldm/pldm_types.h"
4
Tom Joseph0c6d22c2019-06-26 09:58:41 +05305#include <stdint.h>
6
Tom Joseph0c6d22c2019-06-26 09:58:41 +05307#include <nlohmann/json.hpp>
Tom Joseph0c6d22c2019-06-26 09:58:41 +05308
George Liu6492f522020-06-16 10:34:05 +08009#include <filesystem>
10#include <vector>
Tom Joseph0c6d22c2019-06-26 09:58:41 +053011
12namespace pldm
13{
14
15namespace filetable
16{
17
18namespace fs = std::filesystem;
19using Handle = uint32_t;
20using Json = nlohmann::json;
21using Table = std::vector<uint8_t>;
22
23/** @struct FileEntry
24 *
25 * Data structure for storing information regarding the files supported by
26 * PLDM File I/O. The file handle is used to uniquely identify the file. The
27 * traits provide information whether the file is Read only, Read/Write and
28 * preserved across firmware upgrades.
29 */
30struct FileEntry
31{
32 Handle handle; //!< File handle
33 fs::path fsPath; //!< File path
34 bitfield32_t traits; //!< File traits
35};
36
37/** @class FileTable
38 *
39 * FileTable class encapsulates the data related to files supported by PLDM
40 * File I/O and provides interfaces to lookup files information based on the
41 * file handle and extract the file attribute table. The file attribute table
42 * comprises of metadata for files. Metadata includes the file handle, file
43 * name, current file size and file traits.
44 */
45class FileTable
46{
47 public:
48 /** @brief The file table is initialised by parsing the config file
49 * containing information about the files.
50 *
51 * @param[in] fileTableConfigPath - path to the json file containing
52 * information
53 */
54 FileTable(const std::string& fileTableConfigPath);
55 FileTable() = default;
56 ~FileTable() = default;
57 FileTable(const FileTable&) = default;
58 FileTable& operator=(const FileTable&) = default;
59 FileTable(FileTable&&) = default;
60 FileTable& operator=(FileTable&&) = default;
61
62 /** @brief Get the file attribute table
63 *
64 * @return Table- contents of the file attribute table
65 */
66 Table operator()() const;
67
68 /** @brief Get the FileEntry at the file handle
69 *
70 * @param[in] handle - file handle
71 *
72 * @return FileEntry - file entry at the handle
73 */
74 FileEntry at(Handle handle) const
75 {
76 return tableEntries.at(handle);
77 }
78
79 /** @brief Check is file attribute table is empty
80 *
81 * @return bool - true if file attribute table is empty, false otherwise.
82 */
83 bool isEmpty() const
84 {
85 return fileTable.empty();
86 }
87
88 /** @brief Clear the file table contents
89 *
90 */
91 void clear()
92 {
93 tableEntries.clear();
94 fileTable.clear();
95 padCount = 0;
96 checkSum = 0;
97 }
98
99 private:
100 /** @brief handle to FileEntry mappings for lookups based on file handle */
101 std::unordered_map<Handle, FileEntry> tableEntries;
102
103 /** @brief file attribute table including the pad bytes, except the checksum
104 */
105 std::vector<uint8_t> fileTable;
106
107 /** @brief the pad count of the file attribute table, the number of pad
108 * bytes is between 0 and 3 */
109 uint8_t padCount = 0;
110
111 /** @brief the checksum of the file attribute table */
112 uint32_t checkSum = 0;
113};
114
115/** @brief Build the file attribute table if not already built using the
116 * file table config.
117 *
118 * @param[in] fileTablePath - path of the file table config
119 *
120 * @return FileTable& - Reference to instance of file table
121 */
122
123FileTable& buildFileTable(const std::string& fileTablePath);
124
125} // namespace filetable
126} // namespace pldm