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_;
+};