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