From 7e2e62cf7c513bd7d8e784069c5534fda1c50c52 Mon Sep 17 00:00:00 2001 From: Russell Yanofsky Date: Tue, 30 May 2017 15:55:17 -0400 Subject: [PATCH] Add skeleton chain and client classes This commit does not change behavior. It just adds new skeleton classes that don't do anything and aren't instantiated yet. --- build_msvc/msvc-autogen.py | 14 ++++++------ src/Makefile.am | 2 ++ src/interfaces/README.md | 2 +- src/interfaces/chain.cpp | 20 +++++++++++++++++ src/interfaces/chain.h | 44 ++++++++++++++++++++++++++++++++++++++ src/interfaces/wallet.cpp | 24 +++++++++++++++++++++ 6 files changed, 98 insertions(+), 8 deletions(-) create mode 100644 src/interfaces/chain.cpp create mode 100644 src/interfaces/chain.h diff --git a/build_msvc/msvc-autogen.py b/build_msvc/msvc-autogen.py index 8888487e7..f351532f9 100644 --- a/build_msvc/msvc-autogen.py +++ b/build_msvc/msvc-autogen.py @@ -16,10 +16,6 @@ libs = [ ] ignore_list = [ - 'rpc/net.cpp', - 'interfaces/handler.cpp', - 'interfaces/node.cpp', - 'interfaces/wallet.cpp', ] lib_sources = {} @@ -32,7 +28,9 @@ def parse_makefile(makefile): if current_lib: source = line.split()[0] if source.endswith('.cpp') and not source.startswith('$') and source not in ignore_list: - lib_sources[current_lib].append(source.replace('/', '\\')) + source_filename = source.replace('/', '\\') + object_filename = source.replace('/', '_')[:-4] + ".obj" + lib_sources[current_lib].append((source_filename, object_filename)) if not line.endswith('\\'): current_lib = '' continue @@ -51,8 +49,10 @@ def main(): for key, value in lib_sources.items(): vcxproj_filename = os.path.abspath(os.path.join(os.path.dirname(__file__), key, key + '.vcxproj')) content = '' - for source_filename in value: - content += ' \n' + for source_filename, object_filename in value: + content += ' \n' + content += ' $(IntDir)' + object_filename + '\n' + content += ' \n' with open(vcxproj_filename + '.in', 'r', encoding='utf-8') as vcxproj_in_file: with open(vcxproj_filename, 'w', encoding='utf-8') as vcxproj_file: vcxproj_file.write(vcxproj_in_file.read().replace( diff --git a/src/Makefile.am b/src/Makefile.am index 6852ef408..e2727ac52 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -125,6 +125,7 @@ BITCOIN_CORE_H = \ index/txindex.h \ indirectmap.h \ init.h \ + interfaces/chain.h \ interfaces/handler.h \ interfaces/node.h \ interfaces/wallet.h \ @@ -233,6 +234,7 @@ libbitcoin_server_a_SOURCES = \ httpserver.cpp \ index/base.cpp \ index/txindex.cpp \ + interfaces/chain.cpp \ interfaces/handler.cpp \ interfaces/node.cpp \ init.cpp \ diff --git a/src/interfaces/README.md b/src/interfaces/README.md index e93b91d23..57d41df74 100644 --- a/src/interfaces/README.md +++ b/src/interfaces/README.md @@ -4,7 +4,7 @@ The following interfaces are defined here: * [`Chain`](chain.h) — used by wallet to access blockchain and mempool state. Added in [#10973](https://github.com/bitcoin/bitcoin/pull/10973). -* [`Chain::Client`](chain.h) — used by node to start & stop `Chain` clients. Added in [#10973](https://github.com/bitcoin/bitcoin/pull/10973). +* [`ChainClient`](chain.h) — used by node to start & stop `Chain` clients. Added in [#10973](https://github.com/bitcoin/bitcoin/pull/10973). * [`Node`](node.h) — used by GUI to start & stop bitcoin node. Added in [#10244](https://github.com/bitcoin/bitcoin/pull/10244). diff --git a/src/interfaces/chain.cpp b/src/interfaces/chain.cpp new file mode 100644 index 000000000..28b36717d --- /dev/null +++ b/src/interfaces/chain.cpp @@ -0,0 +1,20 @@ +// Copyright (c) 2018 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include + +#include + +namespace interfaces { +namespace { + +class ChainImpl : public Chain +{ +}; + +} // namespace + +std::unique_ptr MakeChain() { return MakeUnique(); } + +} // namespace interfaces diff --git a/src/interfaces/chain.h b/src/interfaces/chain.h new file mode 100644 index 000000000..8a40cb4cd --- /dev/null +++ b/src/interfaces/chain.h @@ -0,0 +1,44 @@ +// Copyright (c) 2018 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 BITCOIN_INTERFACES_CHAIN_H +#define BITCOIN_INTERFACES_CHAIN_H + +#include +#include +#include + +namespace interfaces { + +//! Interface for giving wallet processes access to blockchain state. +class Chain +{ +public: + virtual ~Chain() {} +}; + +//! Interface to let node manage chain clients (wallets, or maybe tools for +//! monitoring and analysis in the future). +class ChainClient +{ +public: + virtual ~ChainClient() {} +}; + +//! Return implementation of Chain interface. +std::unique_ptr MakeChain(); + +//! Return implementation of ChainClient interface for a wallet client. This +//! function will be undefined in builds where ENABLE_WALLET is false. +//! +//! Currently, wallets are the only chain clients. But in the future, other +//! types of chain clients could be added, such as tools for monitoring, +//! analysis, or fee estimation. These clients need to expose their own +//! MakeXXXClient functions returning their implementations of the ChainClient +//! interface. +std::unique_ptr MakeWalletClient(Chain& chain, std::vector wallet_filenames); + +} // namespace interfaces + +#endif // BITCOIN_INTERFACES_CHAIN_H diff --git a/src/interfaces/wallet.cpp b/src/interfaces/wallet.cpp index 14c6bd033..e9f4669f4 100644 --- a/src/interfaces/wallet.cpp +++ b/src/interfaces/wallet.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -20,11 +21,17 @@ #include #include #include +#include #include #include #include #include +#include +#include +#include +#include + namespace interfaces { namespace { @@ -456,8 +463,25 @@ public: CWallet& m_wallet; }; +class WalletClientImpl : public ChainClient +{ +public: + WalletClientImpl(Chain& chain, std::vector wallet_filenames) + : m_chain(chain), m_wallet_filenames(std::move(wallet_filenames)) + { + } + + Chain& m_chain; + std::vector m_wallet_filenames; +}; + } // namespace std::unique_ptr MakeWallet(const std::shared_ptr& wallet) { return MakeUnique(wallet); } +std::unique_ptr MakeWalletClient(Chain& chain, std::vector wallet_filenames) +{ + return MakeUnique(chain, std::move(wallet_filenames)); +} + } // namespace interfaces