Implement Host Console Buffer

Implement host console buffer to buffer host data and provide
interfaces to read the buffer, write to the buffer and erase
the buffer

Change-Id: I67bec738dee6fa3b22c30aaefe5056edf4fb937c
Signed-off-by: Tom Joseph <tomjoseph@in.ibm.com>
diff --git a/sol/console_buffer.hpp b/sol/console_buffer.hpp
new file mode 100644
index 0000000..b874be5
--- /dev/null
+++ b/sol/console_buffer.hpp
@@ -0,0 +1,74 @@
+#pragma once
+
+#include <algorithm>
+#include <deque>
+#include <vector>
+
+namespace sol
+{
+
+using ConsoleBuffer = std::deque<uint8_t>;
+using Buffer = std::vector<uint8_t>;
+
+/** @class ConsoleData
+ *
+ *  The console data is the buffer that holds the data that comes from the host
+ *  console which is to be sent to the remote console. The buffer is needed due
+ *  to the latency with the IPMI remote client. The current support for the
+ *  buffer is to support one instance of the SOL payload.
+ */
+class ConsoleData
+{
+    public:
+        /** @brief Get the current size of the host console buffer.
+         *
+         *  @return size of the host console buffer.
+         */
+        auto size() const noexcept
+        {
+            return data.size();
+        }
+
+        /** @brief Read host console data.
+         *
+         *  This API would return the iterator to the read data from the
+         *  console data buffer.
+         *
+         *  @return iterator to read data from the buffer
+         */
+        auto read() const
+        {
+            return data.cbegin();
+        }
+
+        /** @brief Write host console data.
+         *
+         *  This API would append the input data to the host console buffer.
+         *
+         *  @param[in] input - data to be written to the console buffer.
+         */
+        void write(const Buffer& input)
+        {
+            data.insert(data.end(), input.begin(), input.end());
+        }
+
+        /** @brief Erase console buffer.
+         *
+         *  @param[in] size - the number of bytes to be erased from the console
+         *                    buffer.
+         *
+         *  @note If the console buffer has less bytes that that was requested,
+         *        then the available size is erased.
+         */
+        void erase(size_t size) noexcept
+        {
+            data.erase(data.begin(), data.begin() + std::min(data.size(),
+                       size));
+        }
+
+    private:
+        /** @brief Storage for host console data. */
+        ConsoleBuffer data;
+};
+
+} // namespace sol