1854e61f2SSampa Misra #pragma once
2854e61f2SSampa Misra 
3854e61f2SSampa Misra #include "file_io.hpp"
4854e61f2SSampa Misra 
5854e61f2SSampa Misra namespace pldm
6854e61f2SSampa Misra {
7854e61f2SSampa Misra 
8854e61f2SSampa Misra namespace responder
9854e61f2SSampa Misra {
10854e61f2SSampa Misra 
11854e61f2SSampa Misra namespace fs = std::filesystem;
12854e61f2SSampa Misra 
13854e61f2SSampa Misra /**
14854e61f2SSampa Misra  *  @class FileHandler
15854e61f2SSampa Misra  *
16854e61f2SSampa Misra  *  Base class to handle read/write of all oem file types
17854e61f2SSampa Misra  */
18854e61f2SSampa Misra class FileHandler
19854e61f2SSampa Misra {
20854e61f2SSampa Misra   public:
21854e61f2SSampa Misra     /** @brief Method to write an oem file type from host memory. Individual
22854e61f2SSampa Misra      *  file types need to override this method to do the file specific
23854e61f2SSampa Misra      *  processing
24854e61f2SSampa Misra      *  @param[in] offset - offset to read/write
25854e61f2SSampa Misra      *  @param[in] length - length to be read/write mentioned by Host
26854e61f2SSampa Misra      *  @param[in] address - DMA address
2769508503SSampa Misra      *  @param[in] oemPlatformHandler - oem handler for PLDM platform related
2869508503SSampa Misra      *                                  tasks
29854e61f2SSampa Misra      *  @return PLDM status code
30854e61f2SSampa Misra      */
31854e61f2SSampa Misra     virtual int writeFromMemory(uint32_t offset, uint32_t length,
3269508503SSampa Misra                                 uint64_t address,
3369508503SSampa Misra                                 oem_platform::Handler* oemPlatformHandler) = 0;
34854e61f2SSampa Misra 
35f6d3a830SDeepak Kodihalli     /** @brief Method to read an oem file type into host memory. Individual
36f6d3a830SDeepak Kodihalli      *  file types need to override this method to do the file specific
37f6d3a830SDeepak Kodihalli      *  processing
38f6d3a830SDeepak Kodihalli      *  @param[in] offset - offset to read
39*56c78807SKamalkumar Patel      *  @param[in] length - length to be read mentioned by Host
40f6d3a830SDeepak Kodihalli      *  @param[in] address - DMA address
4169508503SSampa Misra      *  @param[in] oemPlatformHandler - oem handler for PLDM platform related
4269508503SSampa Misra      *                                  tasks
43f6d3a830SDeepak Kodihalli      *  @return PLDM status code
44f6d3a830SDeepak Kodihalli      */
45*56c78807SKamalkumar Patel     virtual int readIntoMemory(uint32_t offset, uint32_t length,
4669508503SSampa Misra                                uint64_t address,
4769508503SSampa Misra                                oem_platform::Handler* oemPlatformHandler) = 0;
48f6d3a830SDeepak Kodihalli 
4975e02f84SDeepak Kodihalli     /** @brief Method to read an oem file type's content into the PLDM response.
5075e02f84SDeepak Kodihalli      *  @param[in] offset - offset to read
5175e02f84SDeepak Kodihalli      *  @param[in/out] length - length to be read
5275e02f84SDeepak Kodihalli      *  @param[in] response - PLDM response
5369508503SSampa Misra      *  @param[in] oemPlatformHandler - oem handler for PLDM platform related
5469508503SSampa Misra      *                                  tasks
5575e02f84SDeepak Kodihalli      *  @return PLDM status code
5675e02f84SDeepak Kodihalli      */
5769508503SSampa Misra     virtual int read(uint32_t offset, uint32_t& length, Response& response,
5869508503SSampa Misra                      oem_platform::Handler* oemPlatformHandler) = 0;
5975e02f84SDeepak Kodihalli 
6018967161SSampa Misra     /** @brief Method to write an oem file by type
6118967161SSampa Misra      *  @param[in] buffer - buffer to be written to file
6218967161SSampa Misra      *  @param[in] offset - offset to write to
6318967161SSampa Misra      *  @param[in/out] length - length to be written
6469508503SSampa Misra      *  @param[in] oemPlatformHandler - oem handler for PLDM platform related
6569508503SSampa Misra      *                                  tasks
6618967161SSampa Misra      *  @return PLDM status code
6718967161SSampa Misra      */
6869508503SSampa Misra     virtual int write(const char* buffer, uint32_t offset, uint32_t& length,
6969508503SSampa Misra                       oem_platform::Handler* oemPlatformHandler) = 0;
7018967161SSampa Misra 
712da1bfeaSDeepak Kodihalli     virtual int fileAck(uint8_t fileStatus) = 0;
722da1bfeaSDeepak Kodihalli 
7318967161SSampa Misra     /** @brief Method to process a new file available notification from the
7418967161SSampa Misra      *  host. The bmc can chose to do different actions based on the file type.
7518967161SSampa Misra      *
7618967161SSampa Misra      *  @param[in] length - size of the file content to be transferred
7718967161SSampa Misra      *
7818967161SSampa Misra      *  @return PLDM status code
7918967161SSampa Misra      */
8018967161SSampa Misra     virtual int newFileAvailable(uint64_t length) = 0;
8118967161SSampa Misra 
8275e02f84SDeepak Kodihalli     /** @brief Method to read an oem file type's content into the PLDM response.
8375e02f84SDeepak Kodihalli      *  @param[in] filePath - file to read from
8475e02f84SDeepak Kodihalli      *  @param[in] offset - offset to read
8575e02f84SDeepak Kodihalli      *  @param[in/out] length - length to be read
8675e02f84SDeepak Kodihalli      *  @param[in] response - PLDM response
8775e02f84SDeepak Kodihalli      *  @return PLDM status code
8875e02f84SDeepak Kodihalli      */
8975e02f84SDeepak Kodihalli     virtual int readFile(const std::string& filePath, uint32_t offset,
9075e02f84SDeepak Kodihalli                          uint32_t& length, Response& response);
9175e02f84SDeepak Kodihalli 
92854e61f2SSampa Misra     /** @brief Method to do the file content transfer ove DMA between host and
93854e61f2SSampa Misra      *  bmc. This method is made virtual to be overridden in test case. And need
94854e61f2SSampa Misra      *  not be defined in other child classes
95854e61f2SSampa Misra      *
96854e61f2SSampa Misra      *  @param[in] path - file system path  where read/write will be done
97854e61f2SSampa Misra      *  @param[in] upstream - direction of DMA transfer. "false" means a
98854e61f2SSampa Misra      *                        transfer from host to BMC
99854e61f2SSampa Misra      *  @param[in] offset - offset to read/write
10075e02f84SDeepak Kodihalli      *  @param[in/out] length - length to be read/write mentioned by Host
101854e61f2SSampa Misra      *  @param[in] address - DMA address
102854e61f2SSampa Misra      *
103854e61f2SSampa Misra      *  @return PLDM status code
104854e61f2SSampa Misra      */
105854e61f2SSampa Misra     virtual int transferFileData(const fs::path& path, bool upstream,
10675e02f84SDeepak Kodihalli                                  uint32_t offset, uint32_t& length,
107854e61f2SSampa Misra                                  uint64_t address);
108854e61f2SSampa Misra 
10915211b43SDeepak Kodihalli     virtual int transferFileData(int fd, bool upstream, uint32_t offset,
11015211b43SDeepak Kodihalli                                  uint32_t& length, uint64_t address);
11115211b43SDeepak Kodihalli 
112ce1c96fbSRavi Teja     virtual int transferFileDataToSocket(int fd, uint32_t& length,
113ce1c96fbSRavi Teja                                          uint64_t address);
114ce1c96fbSRavi Teja 
115854e61f2SSampa Misra     /** @brief Constructor to create a FileHandler object
116854e61f2SSampa Misra      */
FileHandler(uint32_t fileHandle)1176da4f91bSPatrick Williams     FileHandler(uint32_t fileHandle) : fileHandle(fileHandle) {}
118854e61f2SSampa Misra 
119854e61f2SSampa Misra     /** FileHandler destructor
120854e61f2SSampa Misra      */
~FileHandler()1216da4f91bSPatrick Williams     virtual ~FileHandler() {}
122854e61f2SSampa Misra 
123854e61f2SSampa Misra   protected:
124854e61f2SSampa Misra     uint32_t fileHandle; //!< file handle indicating name of file or invalid
125854e61f2SSampa Misra };
126854e61f2SSampa Misra 
127854e61f2SSampa Misra /** @brief Method to create individual file handler objects based on file type
128854e61f2SSampa Misra  *
129854e61f2SSampa Misra  *  @param[in] fileType - type of file
130854e61f2SSampa Misra  *  @param[in] fileHandle - file handle
131854e61f2SSampa Misra  */
132854e61f2SSampa Misra 
133854e61f2SSampa Misra std::unique_ptr<FileHandler> getHandlerByType(uint16_t fileType,
134854e61f2SSampa Misra                                               uint32_t fileHandle);
135854e61f2SSampa Misra } // namespace responder
136854e61f2SSampa Misra } // namespace pldm
137