text: // Copyright (c) 2017-2021 The Merit Foundation
  // Copyright (c) 2009-2010 Satoshi Nakamoto
  // Copyright (c) 2009-2016 The Bitcoin Core developers
  // Distributed under the MIT software license, see the accompanying
  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
  
  #ifndef MERIT_ADDRDB_H
  #define MERIT_ADDRDB_H
  
  #include "fs.h"
  #include "serialize.h"
  
  #include <string>
  #include <map>
  
  class CSubNet;
  class CAddrMan;
  class CDataStream;
  
  typedef enum BanReason
  {
      BanReasonUnknown          = 0,
      BanReasonNodeMisbehaving  = 1,
      BanReasonManuallyAdded    = 2
  } BanReason;
  
  class CBanEntry
  {
  public:
      static const int CURRENT_VERSION=1;
      int nVersion;
      int64_t nCreateTime;
      int64_t nBanUntil;
      uint8_t banReason;
  
      CBanEntry()
      {
          SetNull();
      }
  
      explicit CBanEntry(int64_t nCreateTimeIn)
      {
          SetNull();
          nCreateTime = nCreateTimeIn;
      }
  
      ADD_SERIALIZE_METHODS;
  
      template <typename Stream, typename Operation>
      inline void SerializationOp(Stream& s, Operation ser_action) {
          READWRITE(this->nVersion);
          READWRITE(nCreateTime);
          READWRITE(nBanUntil);
          READWRITE(banReason);
      }
  
      void SetNull()
      {
          nVersion = CBanEntry::CURRENT_VERSION;
          nCreateTime = 0;
          nBanUntil = 0;
          banReason = BanReasonUnknown;
      }
  
      std::string banReasonToString() const
      {
          switch (banReason) {
          case BanReasonNodeMisbehaving:
              return "node misbehaving";
          case BanReasonManuallyAdded:
              return "manually added";
          default:
              return "unknown";
          }
      }
  };
  
  typedef std::map<CSubNet, CBanEntry> banmap_t;
  
  /** Access to the (IP) address database (peers.dat) */
  class CAddrDB
  {
  private:
      fs::path pathAddr;
  public:
      CAddrDB();
      bool Write(const CAddrMan& addr);
      bool Read(CAddrMan& addr);
      static bool Read(CAddrMan& addr, CDataStream& ssPeers);
  };
  
  /** Access to the banlist database (banlist.dat) */
  class CBanDB
  {
  private:
      fs::path pathBanlist;
  public:
      CBanDB();
      bool Write(const banmap_t& banSet);
      bool Read(banmap_t& banSet);
  };
  
  #endif // MERIT_ADDRDB_H
  