Initial commit

Signed-off-by: Artem Senichev <a.senichev@yadro.com>
diff --git a/src/log_storage.hpp b/src/log_storage.hpp
new file mode 100644
index 0000000..b2a6271
--- /dev/null
+++ b/src/log_storage.hpp
@@ -0,0 +1,99 @@
+/**
+ * @brief Log storage.
+ *
+ * This file is part of HostLogger project.
+ *
+ * Copyright (c) 2018 YADRO
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <ctime>
+#include <list>
+#include <string>
+#include <zlib.h>
+
+
+/** @class LogStorage
+ *  @brief Log storage implementation.
+ *         All functions within this class are not thread-safe.
+ */
+class LogStorage
+{
+public:
+    /** @brief Constructor. */
+    LogStorage();
+
+    /** @brief Parse input log stream and append messages to the storage.
+     *
+     *  @param[in] data - pointer to the message buffer
+     *  @param[in] len - length of the buffer in bytes
+     */
+    void parse(const char* data, size_t len);
+
+    /** @brief Clear (reset) storage. */
+    void clear();
+
+    /** @brief Check storage for empty.
+     *
+     *  @return true if storage is empty
+     */
+    bool empty() const;
+
+    /** @brief Save messages from storage to the specified file.
+     *
+     *  @param[in] fileName - path to the file
+     *
+     *  @return error code, 0 if operation completed successfully
+     */
+    int write(const char* fileName) const;
+
+private:
+    /** @struct Message
+     *  @brief Represent log message (single line from host log).
+     */
+    struct Message
+    {
+        /** @brief Timestamp (message creation time). */
+        time_t timeStamp;
+        /** @brief Text of the message. */
+        std::string text;
+    };
+
+    /** @brief Append new message to the storage.
+     *
+     *  @param[in] msg - pointer to the message buffer
+     *  @param[in] len - length of the buffer in bytes
+     */
+    void append(const char* msg, size_t len);
+
+    /** @brief Write message to the file.
+     *
+     *  @param[in] fd - descriptor of the file to write
+     *  @param[in] msg - message to write
+     *
+     *  @return error code, 0 if operation completed successfully
+     */
+    int write(gzFile fd, const Message& msg) const;
+
+    /** @brief Shrink storage by removing oldest messages. */
+    void shrink();
+
+private:
+    /** @brief List of messages. */
+    std::list<Message> messages_;
+    /** @brief Flag to indicate that the last message is incomplete. */
+    bool last_complete_;
+};