| #pragma once | 
 |  | 
 | #include <fcntl.h> | 
 | #include <sys/ioctl.h> | 
 | #include <sys/stat.h> | 
 |  | 
 | #include <sdbusplus/async.hpp> | 
 |  | 
 | #include <cstdint> | 
 | #include <cstring> | 
 | #include <string> | 
 |  | 
 | extern "C" | 
 | { | 
 | #include <i2c/smbus.h> | 
 | #include <linux/i2c-dev.h> | 
 | #include <linux/i2c.h> | 
 | } | 
 |  | 
 | namespace phosphor::i2c | 
 | { | 
 |  | 
 | class I2C | 
 | { | 
 |   public: | 
 |     explicit I2C(uint16_t bus, uint16_t node) : | 
 |         busStr("/dev/i2c-" + std::to_string(bus)), deviceNode(node) | 
 |     { | 
 |         open(); | 
 |     } | 
 |  | 
 |     I2C(I2C& i2c) = delete; | 
 |     I2C& operator=(I2C other) = delete; | 
 |     I2C(I2C&& other) = delete; | 
 |     I2C& operator=(I2C&& other) = delete; | 
 |  | 
 |     ~I2C() | 
 |     { | 
 |         this->close(); | 
 |     } | 
 |  | 
 |     sdbusplus::async::task<bool> sendReceive( | 
 |         uint8_t* writeData, uint8_t writeSize, uint8_t* readData, | 
 |         uint8_t readSize) const; | 
 |     bool sendReceive(const std::vector<uint8_t>& writeData, | 
 |                      std::vector<uint8_t>& readData) const; | 
 |  | 
 |     bool isOpen() const | 
 |     { | 
 |         return (fd != invalidFd); | 
 |     } | 
 |  | 
 |     int close() const; | 
 |  | 
 |   private: | 
 |     static constexpr int invalidFd = -1; | 
 |     int fd = invalidFd; | 
 |     std::string busStr; | 
 |     uint16_t deviceNode; | 
 |     int open(); | 
 | }; // end class I2C | 
 |  | 
 | } // namespace phosphor::i2c |