ledger-core
RotatingEncryptableSink.hpp
1 /*
2  *
3  * RotatingEncryptableSink
4  * ledger-core
5  *
6  * Created by Pierre Pollastri on 24/11/2016.
7  *
8  * The MIT License (MIT)
9  *
10  * Copyright (c) 2016 Ledger
11  *
12  * Permission is hereby granted, free of charge, to any person obtaining a copy
13  * of this software and associated documentation files (the "Software"), to deal
14  * in the Software without restriction, including without limitation the rights
15  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
16  * copies of the Software, and to permit persons to whom the Software is
17  * furnished to do so, subject to the following conditions:
18  *
19  * The above copyright notice and this permission notice shall be included in all
20  * copies or substantial portions of the Software.
21  *
22  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
25  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
28  * SOFTWARE.
29  *
30  */
31 #ifndef LEDGER_CORE_ROTATINGENCRYPTABLESINK_HPP
32 #define LEDGER_CORE_ROTATINGENCRYPTABLESINK_HPP
33 
34 #include "spdlog/spdlog.h"
35 #include "spdlog/sinks/sink.h"
36 #include "spdlog/sinks/basic_file_sink.h"
37 #include "api/ExecutionContext.hpp"
38 #include "api/PathResolver.hpp"
39 #include <memory>
40 #include "utils/optional.hpp"
41 #include <mutex>
42 
43 namespace ledger {
44  namespace core {
48  class RotatingEncryptableSink : public spdlog::sinks::base_sink<std::mutex>, public std::enable_shared_from_this<RotatingEncryptableSink> {
49  public:
51  const std::shared_ptr<api::ExecutionContext> &context,
52  const std::shared_ptr<api::PathResolver> &resolver,
53  const std::string &name,
54  std::size_t maxSize,
55  std::size_t maxFiles
56  );
57  virtual void sink_it_(const spdlog::details::log_msg &msg) override;
58  virtual void flush_() override;
59 
60  protected:
61  void _sink_it(std::shared_ptr<fmt::memory_buffer> msg);
62 
63  private:
64  static spdlog::filename_t calc_filename(
65  std::shared_ptr<api::PathResolver> resolver,
66  const spdlog::filename_t& filename, std::size_t index, const spdlog::filename_t& extension);
67 
68  void _rotate();
69 
70 #if defined(_WIN32) || defined(_WIN64)
71  static void ToWide(const std::string &input, std::wstring &output);
72  static void ToNarrow(const std::wstring &input, std::string &output);
73 #endif
74 
75  std::shared_ptr<api::ExecutionContext> _context;
76  std::weak_ptr<api::PathResolver> _resolver;
77  std::string _name;
78  spdlog::filename_t _base_filename;
79  spdlog::filename_t _extension;
80  std::size_t _max_size;
81  std::size_t _max_files;
82  std::size_t _current_size;
83  spdlog::details::file_helper _file_helper;
84  };
85  }
86 }
87 
88 
89 #endif //LEDGER_CORE_ROTATINGENCRYPTABLESINK_HPP
Definition: RotatingEncryptableSink.hpp:48
Definition: Account.cpp:8