aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am23
-rw-r--r--configure.ac136
-rw-r--r--contrib/bitcoin-qt.pro1
-rw-r--r--contrib/gitian-descriptors/boost-linux.yml42
-rw-r--r--contrib/gitian-descriptors/boost-win.yml79
-rw-r--r--contrib/gitian-descriptors/boost-win32.yml66
-rw-r--r--contrib/gitian-descriptors/deps-linux.yml13
-rw-r--r--contrib/gitian-descriptors/deps-win.yml117
-rw-r--r--contrib/gitian-descriptors/deps-win32.yml101
-rw-r--r--contrib/gitian-descriptors/gitian-linux.yml20
-rw-r--r--contrib/gitian-descriptors/gitian-win.yml84
-rw-r--r--contrib/gitian-descriptors/gitian-win32.yml62
-rw-r--r--contrib/gitian-descriptors/protobuf-win.yml56
-rw-r--r--contrib/gitian-descriptors/protobuf-win32.yml44
-rw-r--r--contrib/gitian-descriptors/qt-win.yml77
-rw-r--r--contrib/gitian-descriptors/qt-win32.yml60
-rw-r--r--contrib/linearize/example-linearize.cfg2
-rw-r--r--contrib/linearize/linearize.py2
-rw-r--r--doc/build-osx.md14
-rw-r--r--doc/build-unix.md8
-rw-r--r--doc/release-process.md54
-rw-r--r--share/setup.nsi.in41
-rw-r--r--src/Makefile.am18
-rw-r--r--src/Makefile.include15
-rw-r--r--src/checkpoints.cpp9
-rw-r--r--src/leveldb/db/filename.cc9
-rw-r--r--src/m4/bitcoin_qt.m436
-rw-r--r--src/main.cpp16
-rw-r--r--src/main.h10
-rw-r--r--src/qt/Makefile.am9
-rw-r--r--src/qt/aboutdialog.cpp38
-rw-r--r--src/qt/aboutdialog.h34
-rw-r--r--src/qt/bitcoin.cpp17
-rw-r--r--src/qt/bitcoingui.cpp16
-rw-r--r--src/qt/bitcoingui.h3
-rw-r--r--src/qt/forms/aboutdialog.ui16
-rw-r--r--src/qt/forms/askpassphrasedialog.ui16
-rw-r--r--src/qt/forms/editaddressdialog.ui16
-rw-r--r--src/qt/forms/helpmessagedialog.ui128
-rw-r--r--src/qt/forms/intro.ui16
-rw-r--r--src/qt/forms/receivecoinsdialog.ui6
-rw-r--r--src/qt/forms/rpcconsole.ui26
-rw-r--r--src/qt/forms/sendcoinsentry.ui17
-rw-r--r--src/qt/forms/signverifymessagedialog.ui3
-rw-r--r--src/qt/forms/transactiondescdialog.ui16
-rw-r--r--src/qt/guiutil.cpp41
-rw-r--r--src/qt/guiutil.h20
-rw-r--r--src/qt/optionsdialog.cpp3
-rw-r--r--src/qt/optionsmodel.cpp24
-rw-r--r--src/qt/optionsmodel.h6
-rw-r--r--src/qt/paymentserver.cpp25
-rw-r--r--src/qt/receivecoinsdialog.cpp2
-rw-r--r--src/qt/recentrequeststablemodel.cpp78
-rw-r--r--src/qt/recentrequeststablemodel.h45
-rw-r--r--src/qt/rpcconsole.cpp7
-rw-r--r--src/qt/rpcconsole.h2
-rw-r--r--src/qt/sendcoinsentry.cpp9
-rw-r--r--src/qt/splashscreen.cpp2
-rw-r--r--src/qt/transactiondesc.cpp5
-rw-r--r--src/qt/utilitydialog.cpp134
-rw-r--r--src/qt/utilitydialog.h69
-rw-r--r--src/qt/walletmodel.cpp26
-rw-r--r--src/qt/walletmodel.h42
-rw-r--r--src/rpcdump.cpp5
-rw-r--r--src/wallet.cpp54
-rw-r--r--src/wallet.h12
-rw-r--r--src/walletdb.cpp24
-rw-r--r--src/walletdb.h5
68 files changed, 1495 insertions, 737 deletions
diff --git a/Makefile.am b/Makefile.am
index 243166b3f7..d222daf28c 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -6,7 +6,8 @@ GZIP_ENV="-9n"
BITCOIND_BIN=$(top_builddir)/src/bitcoind$(EXEEXT)
BITCOIN_QT_BIN=$(top_builddir)/src/qt/bitcoin-qt$(EXEEXT)
-BITCOIN_WIN_INSTALLER=$(PACKAGE)-$(PACKAGE_VERSION)-win32-setup$(EXEEXT)
+BITCOIN_CLI_BIN=$(top_builddir)/src/bitcoin-cli$(EXEEXT)
+BITCOIN_WIN_INSTALLER=$(PACKAGE)-$(PACKAGE_VERSION)-win$(WINDOWS_BITS)-setup$(EXEEXT)
OSX_APP=Bitcoin-Qt.app
OSX_DMG=Bitcoin-Qt.dmg
@@ -15,6 +16,8 @@ OSX_FANCY_PLIST=$(top_srcdir)/contrib/macdeploy/fancy.plist
OSX_INSTALLER_ICONS=$(top_srcdir)/src/qt/res/icons/bitcoin.icns
OSX_PLIST=$(top_srcdir)/share/qt/Info.plist #not installed
+DIST_DOCS = $(wildcard doc/*.md)
+
WINDOWS_PACKAGING = $(top_srcdir)/share/pixmaps/bitcoin.ico \
$(top_srcdir)/share/pixmaps/nsis-header.bmp \
$(top_srcdir)/share/pixmaps/nsis-wizard.bmp \
@@ -40,20 +43,16 @@ distcheck-hook:
distcleancheck:
@:
-$(BITCOIN_WIN_INSTALLER): $(BITCOIND_BIN) $(BITCOIN_QT_BIN)
- $(MAKE) distdir
+$(BITCOIN_WIN_INSTALLER): $(BITCOIND_BIN) $(BITCOIN_QT_BIN) $(BITCOIN_CLI_BIN)
$(MKDIR_P) $(top_builddir)/release
- $(INSTALL_STRIP_PROGRAM) $(top_builddir)/src/bitcoind$(EXEEXT) $(top_builddir)/release
- $(INSTALL_STRIP_PROGRAM) $(top_builddir)/src/qt/bitcoin-qt$(EXEEXT) $(top_builddir)/release
+ $(INSTALL_STRIP_PROGRAM) $(BITCOIND_BIN) $(top_builddir)/release
+ $(INSTALL_STRIP_PROGRAM) $(BITCOIN_QT_BIN) $(top_builddir)/release
+ $(INSTALL_STRIP_PROGRAM) $(BITCOIN_CLI_BIN) $(top_builddir)/release
@test -f $(MAKENSIS) && $(MAKENSIS) $(top_builddir)/share/setup.nsi || \
echo error: could not build $@
-$(BITCOIND_BIN):
- make -C $(top_srcdir)/src bitcoind$(EXEEXT)
-
-$(BITCOIN_QT_BIN):
- make -C $(top_srcdir)/src/qt bitcoin-qt$(EXEEXT)
-
+$(BITCOIND_BIN) $(BITCOIN_QT_BIN) $(BITCOIN_CLI_BIN):
+ make -C $(dir $@) $(notdir $@)
$(OSX_APP)/Contents/PkgInfo:
$(MKDIR_P) $(@D)
@@ -151,7 +150,7 @@ check-local:
@qa/pull-tester/run-bitcoind-for-test.sh $(JAVA) -jar $(JAVA_COMPARISON_TOOL) qa/tmp/compTool $(COMPARISON_TOOL_REORG_TESTS)
endif
-EXTRA_DIST = $(top_srcdir)/share/genbuild.sh qa/pull-tester/pull-tester.sh $(WINDOWS_PACKAGING) $(OSX_PACKAGING)
+EXTRA_DIST = $(top_srcdir)/share/genbuild.sh qa/pull-tester/pull-tester.sh $(DIST_DOCS) $(WINDOWS_PACKAGING) $(OSX_PACKAGING)
CLEANFILES = $(OSX_DMG) $(OSX_APP) $(BITCOIN_WIN_INSTALLER)
diff --git a/configure.ac b/configure.ac
index 88c20cdce6..394ca972c7 100644
--- a/configure.ac
+++ b/configure.ac
@@ -6,7 +6,7 @@ define(_CLIENT_VERSION_REVISION, 99)
define(_CLIENT_VERSION_BUILD, 0)
define(_CLIENT_VERSION_IS_RELEASE, false)
define(_COPYRIGHT_YEAR, 2014)
-AC_INIT([Bitcoin],[_CLIENT_VERSION_MAJOR._CLIENT_VERSION_MINOR._CLIENT_VERSION_REVISION],[info@bitcoin.org],[bitcoin])
+AC_INIT([Bitcoin Core],[_CLIENT_VERSION_MAJOR._CLIENT_VERSION_MINOR._CLIENT_VERSION_REVISION],[info@bitcoin.org],[bitcoin])
AC_CONFIG_AUX_DIR([src/build-aux])
AC_CONFIG_MACRO_DIR([src/m4])
AC_CANONICAL_HOST
@@ -24,6 +24,12 @@ m4_include([pkg.m4])
dnl faketime breaks configure and is only needed for make. Disable it here.
unset FAKETIME
+if test "x${CXXFLAGS+set}" = "xset"; then
+ CXXFLAGS_overridden=yes
+else
+ CXXFLAGS_overridden=no
+fi
+
dnl ==============================================================
dnl Setup for automake
dnl ==============================================================
@@ -92,7 +98,7 @@ AC_ARG_ENABLE([hardening],
AC_ARG_ENABLE([ccache],
[AS_HELP_STRING([--enable-ccache],
- [enable building with ccache (default is yes if ccache is found)])],
+ [use ccache for building (default is yes if ccache is found)])],
[use_ccache=$enableval],
[use_ccache=auto])
@@ -134,7 +140,9 @@ PKG_PROG_PKG_CONFIG
## TODO: Remove these hard-coded paths and flags. They are here for the sake of
## compatibility with the legacy buildsystem.
##
-CXXFLAGS="$CXXFLAGS -Wall -Wextra -Wformat -Wformat-security -Wno-unused-parameter"
+if test "x$CXXFLAGS_overridden" = "xno"; then
+ CXXFLAGS="$CXXFLAGS -Wall -Wextra -Wformat -Wformat-security -Wno-unused-parameter"
+fi
CPPFLAGS="$CPPFLAGS -DBOOST_SPIRIT_THREADSAFE -DHAVE_BUILD_INFO -D__STDC_FORMAT_MACROS"
AC_LANG_PUSH([C++])
@@ -167,6 +175,7 @@ case $host in
AC_CHECK_LIB([iphlpapi], [main],, AC_MSG_ERROR(lib missing))
AC_CHECK_LIB([crypt32], [main],, AC_MSG_ERROR(lib missing))
+ AX_CHECK_LINK_FLAG([[-static]],[LDFLAGS="$LDFLAGS -static"])
AX_CHECK_LINK_FLAG([[-static-libgcc]],[LDFLAGS="$LDFLAGS -static-libgcc"])
AX_CHECK_LINK_FLAG([[-static-libstdc++]],[LDFLAGS="$LDFLAGS -static-libstdc++"])
@@ -182,7 +191,15 @@ case $host in
CPPFLAGS="$CPPFLAGS -D_MT -DWIN32 -D_WINDOWS -DBOOST_THREAD_USE_LIB -D__USE_MINGW_ANSI_STDIO"
LEVELDB_TARGET_FLAGS="TARGET_OS=OS_WINDOWS_CROSSCOMPILE"
- CXXFLAGS="$CXXFLAGS -w"
+ if test "x$CXXFLAGS_overridden" = "xno"; then
+ CXXFLAGS="$CXXFLAGS -w"
+ fi
+ case $host in
+ i?86-*) WINDOWS_BITS=32 ;;
+ x86_64-*) WINDOWS_BITS=64 ;;
+ *) AC_MSG_ERROR("Could not determine win32/win64 for installer") ;;
+ esac
+ AC_SUBST(WINDOWS_BITS)
;;
*darwin*)
TARGET_OS=darwin
@@ -207,10 +224,8 @@ case $host in
fi
CPPFLAGS="$CPPFLAGS -DMAC_OSX"
- TESTDEFS="-DBOOST_TEST_DYN_LINK"
;;
*)
- TESTDEFS="-DBOOST_TEST_DYN_LINK"
;;
esac
@@ -276,9 +291,15 @@ AX_CHECK_LINK_FLAG([[-Wl,--large-address-aware]], [LDFLAGS="$LDFLAGS -Wl,--large
if test x$use_hardening != xno; then
AX_CHECK_COMPILE_FLAG([-Wstack-protector],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -Wstack-protector"])
+ AX_CHECK_COMPILE_FLAG([-fstack-protector-all],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -fstack-protector-all"])
AX_CHECK_COMPILE_FLAG([-fPIE],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -fPIE"])
- AX_CHECK_PREPROC_FLAG([-D_FORTIFY_SOURCE=2],[HARDENED_CPPFLAGS="$HARDENED_CPPFLAGS -D_FORTIFY_SOURCE=2"])
+ AX_CHECK_PREPROC_FLAG([-D_FORTIFY_SOURCE=2],[
+ AX_CHECK_PREPROC_FLAG([-U_FORTIFY_SOURCE],[
+ HARDENED_CPPFLAGS="$HARDENED_CPPFLAGS -U_FORTIFY_SOURCE"
+ ])
+ HARDENED_CPPFLAGS="$HARDENED_CPPFLAGS -D_FORTIFY_SOURCE=2"
+ ])
AX_CHECK_LINK_FLAG([[-Wl,--dynamicbase]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,--dynamicbase"])
AX_CHECK_LINK_FLAG([[-Wl,--nxcompat]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,--nxcompat"])
@@ -286,10 +307,6 @@ if test x$use_hardening != xno; then
AX_CHECK_LINK_FLAG([[-Wl,-z,now]], [LDFLAGS="-Wl,-z,now"])
if test x$TARGET_OS != xwindows; then
- # -fstack-protector-all can produce broken binaries with mingw
- AX_CHECK_COMPILE_FLAG([-fno-stack-protector],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -fno-stack-protector"])
- AX_CHECK_COMPILE_FLAG([-fstack-protector-all],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -fstack-protector-all"])
-
# -pie will link successfully with MinGW, but it's unsupported and leads to undeterministic binaries
AX_CHECK_LINK_FLAG([[-pie]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -pie"])
fi
@@ -315,6 +332,14 @@ AC_TRY_COMPILE([#include <sys/socket.h>],
[ AC_MSG_RESULT(no)]
)
+LEVELDB_CPPFLAGS=
+LIBLEVELDB=
+LIBMEMENV=
+AM_CONDITIONAL([EMBEDDED_LEVELDB],[true])
+AC_SUBST(LEVELDB_CPPFLAGS)
+AC_SUBST(LIBLEVELDB)
+AC_SUBST(LIBMEMENV)
+
if test x$enable_wallet != xno; then
dnl Check for libdb_cxx only if wallet enabled
BITCOIN_FIND_BDB48
@@ -345,6 +370,24 @@ if test x$use_tests = xyes; then
AX_BOOST_UNIT_TEST_FRAMEWORK
+
+ dnl Determine if -DBOOST_TEST_DYN_LINK is needed
+ AC_MSG_CHECKING([for dynamic linked boost test])
+ TEMP_LIBS="$LIBS"
+ LIBS="$LIBS $BOOST_UNIT_TEST_FRAMEWORK_LIB"
+ TEMP_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
+ AC_LINK_IFELSE([AC_LANG_SOURCE([
+ #define BOOST_TEST_DYN_LINK
+ #define BOOST_TEST_MAIN
+ #include <boost/test/unit_test.hpp>
+
+ ])],
+ [AC_MSG_RESULT(yes)]
+ [TESTDEFS="$TESTDEFS -DBOOST_TEST_DYN_LINK"],
+ [AC_MSG_RESULT(no)])
+ LIBS="$TEMP_LIBS"
+ CPPFLAGS="$TEMP_CPPFLAGS"
fi
BOOST_LIBS="$BOOST_LDFLAGS $BOOST_SYSTEM_LIB $BOOST_FILESYSTEM_LIB $BOOST_PROGRAM_OPTIONS_LIB $BOOST_THREAD_LIB"
@@ -357,8 +400,13 @@ dnl after 1.56.
dnl If neither is available, abort.
dnl If sleep_for is used, boost_chrono becomes a requirement.
if test x$ax_cv_boost_chrono = xyes; then
+dnl Allow passing extra needed dependency libraries for boost-chrono from static gitian build
+BOOST_CHRONO_LIB="$BOOST_CHRONO_LIB $BOOST_CHRONO_EXTRALIBS"
+
TEMP_LIBS="$LIBS"
LIBS="$LIBS $BOOST_LIBS $BOOST_CHRONO_LIB"
+TEMP_CPPFLAGS="$CPPFLAGS"
+CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
AC_TRY_LINK([
#include <boost/thread/thread.hpp>
#include <boost/version.hpp>
@@ -373,11 +421,14 @@ AC_TRY_LINK([
AC_DEFINE(HAVE_WORKING_BOOST_SLEEP_FOR, 1, [Define this symbol if boost sleep_for works])],
[boost_sleep=no])
LIBS="$TEMP_LIBS"
+CPPFLAGS="$TEMP_CPPFLAGS"
fi
if test x$boost_sleep != xyes; then
TEMP_LIBS="$LIBS"
LIBS="$LIBS $BOOST_LIBS"
+TEMP_CPPFLAGS="$CPPFLAGS"
+CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
AC_TRY_LINK([
#include <boost/version.hpp>
#include <boost/thread.hpp>
@@ -392,12 +443,25 @@ AC_TRY_LINK([
[boost_sleep=yes; AC_DEFINE(HAVE_WORKING_BOOST_SLEEP, 1, [Define this symbol if boost sleep works])],
[boost_sleep=no])
LIBS="$TEMP_LIBS"
+CPPFLAGS="$TEMP_CPPFLAGS"
fi
if test x$boost_sleep != xyes; then
AC_MSG_ERROR(No working boost sleep implementation found. If on ubuntu 13.10 with libboost1.54-all-dev remove libboost.1.54-all-dev and use libboost1.53-all-dev)
fi
+AC_ARG_WITH([cli],
+ [AS_HELP_STRING([--with-cli],
+ [with CLI (default is yes)])],
+ [build_bitcoin_cli=$withval],
+ [build_bitcoin_cli=yes])
+
+AC_ARG_WITH([daemon],
+ [AS_HELP_STRING([--with-daemon],
+ [with daemon (default is yes)])],
+ [build_bitcoind=$withval],
+ [build_bitcoind=yes])
+
BITCOIN_QT_INIT
if test x$use_pkgconfig = xyes; then
@@ -434,13 +498,21 @@ fi
BITCOIN_QT_PATH_PROGS([PROTOC], [protoc],$protoc_bin_path)
+AC_MSG_CHECKING([whether to build bitcoind])
+AM_CONDITIONAL([BUILD_BITCOIND], [test x$build_bitcoind = xyes])
+AC_MSG_RESULT($build_bitcoind)
+
+AC_MSG_CHECKING([whether to build bitcoin-cli])
+AM_CONDITIONAL([BUILD_BITCOIN_CLI], [test x$build_bitcoin_cli = xyes])
+AC_MSG_RESULT($build_bitcoin_cli)
+
dnl sets $bitcoin_enable_qt, $bitcoin_enable_qt_test, $bitcoin_enable_qt_dbus
BITCOIN_QT_CONFIGURE([$use_pkgconfig], [qt4])
if test x$use_ipv6 = xyes; then
dnl Check for ipv6 build requirements
- AC_MSG_CHECKING(for IPV6 build support)
+ AC_MSG_CHECKING(for operating system IPv6 support)
AC_TRY_LINK([
#if defined(_WINDOWS)
#include <winsock2.h>
@@ -455,18 +527,17 @@ if test x$use_ipv6 = xyes; then
struct sockaddr_in6 addr;
#endif
int temp = socket(AF_INET6, SOCK_STREAM, 0);],
- [AC_MSG_RESULT(yes); have_ipv6=yes; AC_DEFINE(HAVE_IPV6, 1, [Define this symbol if you have ipv6 build support])],
+ [AC_MSG_RESULT(yes); have_ipv6=yes; AC_DEFINE(HAVE_IPV6, 1, [Define this symbol if you have operating system IPv6 support])],
[AC_MSG_RESULT(no)]; have_ipv6=no)
fi
AC_LANG_POP
if test "x$use_ccache" != "xno"; then
- AC_MSG_CHECKING(if ccache should be enabled)
+ AC_MSG_CHECKING(if ccache should be used)
if test x$CCACHE = x; then
if test "x$use_ccache" = "xyes"; then
AC_MSG_ERROR([ccache not found.]);
else
- AC_MSG_NOTICE([ccache not found. Falling back to default CC])
use_ccache=no
fi
else
@@ -488,32 +559,32 @@ else
fi
dnl enable ipv6 support
-AC_MSG_CHECKING([if ipv6 should be enabled])
+AC_MSG_CHECKING([whether to build with support for IPv6])
if test x$have_ipv6 = xno; then
if test x$use_ipv6 = xyes; then
- AC_MSG_ERROR("ipv6 requested but cannot be built. use --disable-ipv6")
+ AC_MSG_ERROR([IPv6 requested, but cannot be built. use --disable-ipv6])
fi
AC_MSG_RESULT(no)
else
if test x$use_ipv6 = xyes; then
AC_MSG_RESULT(yes)
- AC_DEFINE([USE_IPV6],[1],[Define if ipv6 support should be compiled in])
+ AC_DEFINE([USE_IPV6],[1],[Define if IPv6 support should be compiled in])
else
AC_MSG_RESULT(no)
fi
fi
dnl enable upnp support
-AC_MSG_CHECKING([if upnp should be enabled])
+AC_MSG_CHECKING([whether to build with support for UPnP])
if test x$have_miniupnpc = xno; then
if test x$use_upnp = xyes; then
- AC_MSG_ERROR("upnp requested but cannot be built. use --without-miniupnpc")
+ AC_MSG_ERROR("UPnP requested but cannot be built. use --without-miniupnpc")
fi
AC_MSG_RESULT(no)
else
if test x$use_upnp != xno; then
AC_MSG_RESULT(yes)
- AC_MSG_CHECKING([if upnp should be on by default])
+ AC_MSG_CHECKING([whether to build with UPnP enabled by default])
use_upnp=yes
upnp_setting=0
if test x$use_upnp_default != xno; then
@@ -521,7 +592,7 @@ else
upnp_setting=1
fi
AC_MSG_RESULT($use_upnp_default)
- AC_DEFINE_UNQUOTED([USE_UPNP],[$upnp_setting],[Define to 1 for upnp runtime support])
+ AC_DEFINE_UNQUOTED([USE_UPNP],[$upnp_setting],[UPnP support not compiled if undefined, otherwise value (0 or 1) determines default state])
if test x$TARGET_OS = xwindows; then
CPPFLAGS="$CPPFLAGS -DSTATICLIB"
fi
@@ -534,14 +605,14 @@ dnl these are only used when qt is enabled
if test x$bitcoin_enable_qt != xno; then
BUILD_QT=qt
dnl enable dbus support
- AC_MSG_CHECKING([if dbus should be enabled])
+ AC_MSG_CHECKING([whether to build GUI with support for D-Bus])
if test x$bitcoin_enable_qt_dbus != xno; then
AC_DEFINE([USE_DBUS],[1],[Define if dbus support should be compiled in])
fi
AC_MSG_RESULT($bitcoin_enable_qt_dbus)
dnl enable qr support
- AC_MSG_CHECKING([if qr should be enabled])
+ AC_MSG_CHECKING([whether to build GUI with support for QR codes])
if test x$have_qrencode = xno; then
if test x$use_qr == xyes; then
AC_MSG_ERROR("QR support requested but cannot be built. use --without-qrencode")
@@ -561,16 +632,25 @@ if test x$bitcoin_enable_qt != xno; then
AC_MSG_WARN("xgettext is required to update qt translations")
fi
- if test x$use_tests = xyes; then
+ AC_MSG_CHECKING([whether to build test_bitcoin-qt])
+ if test x$use_tests$bitcoin_enable_qt_test = xyesyes; then
+ AC_MSG_RESULT([yes])
BUILD_TEST_QT="test"
- if test x$bitcoin_enable_qt_test != xyes; then
- AC_MSG_ERROR("QT Test lib not found. Use --disable-tests or --without-qt.")
- fi
+ else
+ AC_MSG_RESULT([no])
fi
fi
+AC_MSG_CHECKING([whether to build test_bitcoin])
if test x$use_tests = xyes; then
+ AC_MSG_RESULT([yes])
BUILD_TEST="test"
+else
+ AC_MSG_RESULT([no])
+fi
+
+if test "x$use_tests$build_bitcoind$use_qt" = "xnonono"; then
+ AC_MSG_ERROR([No targets! Please specify at least one of: --enable-cli --enable-daemon --enable-gui or --enable-tests])
fi
AM_CONDITIONAL([TARGET_DARWIN], [test x$TARGET_OS = xdarwin])
diff --git a/contrib/bitcoin-qt.pro b/contrib/bitcoin-qt.pro
index 8bfa4a18a5..3a72d10f47 100644
--- a/contrib/bitcoin-qt.pro
+++ b/contrib/bitcoin-qt.pro
@@ -4,6 +4,7 @@ FORMS += \
../src/qt/forms/askpassphrasedialog.ui \
../src/qt/forms/coincontroldialog.ui \
../src/qt/forms/editaddressdialog.ui \
+ ../src/qt/forms/helpmessagedialog.ui \
../src/qt/forms/intro.ui \
../src/qt/forms/openuridialog.ui \
../src/qt/forms/optionsdialog.ui \
diff --git a/contrib/gitian-descriptors/boost-linux.yml b/contrib/gitian-descriptors/boost-linux.yml
new file mode 100644
index 0000000000..5d22294dd8
--- /dev/null
+++ b/contrib/gitian-descriptors/boost-linux.yml
@@ -0,0 +1,42 @@
+---
+name: "boost"
+suites:
+- "precise"
+architectures:
+- "i386"
+- "amd64"
+packages:
+- "unzip"
+- "pkg-config"
+- "libtool"
+- "faketime"
+- "bsdmainutils"
+- "zip"
+reference_datetime: "2011-01-30 00:00:00"
+remotes: []
+files:
+- "boost_1_55_0.tar.bz2"
+script: |
+ STAGING="$HOME/install"
+ export LIBRARY_PATH="$STAGING/lib"
+ # Input Integrity Check
+ echo "fff00023dd79486d444c8e29922f4072e1d451fc5a4d2b6075852ead7f2b7b52 boost_1_55_0.tar.bz2" | shasum -c
+
+ mkdir -p "$STAGING"
+ tar xjf boost_1_55_0.tar.bz2
+ cd boost_1_55_0
+ GCCVERSION=$(g++ -E -dM $(mktemp --suffix=.h) | grep __VERSION__ | cut -d ' ' -f 3 | cut -d '"' -f 2)
+ # note: bjam with -d+2 reveals that -O3 is implied by default, no need to provide it in cxxflags
+ echo "using gcc : $GCCVERSION : g++
+ :
+ <cxxflags>\"-frandom-seed=boost1 -fPIC\"
+ ;" > user-config.jam
+
+ ./bootstrap.sh --without-icu
+
+ ./bjam toolset=gcc threadapi=pthread threading=multi variant=release link=static runtime-link=shared --user-config=user-config.jam --without-mpi --without-python -sNO_BZIP2=1 --layout=tagged --build-type=complete --prefix="$STAGING" $MAKEOPTS install
+
+ cd "$STAGING"
+ export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1
+ export FAKETIME=$REFERENCE_DATETIME
+ zip -r $OUTDIR/boost-linux${GBUILD_BITS}-1.55.0-gitian-r1.zip *
diff --git a/contrib/gitian-descriptors/boost-win.yml b/contrib/gitian-descriptors/boost-win.yml
new file mode 100644
index 0000000000..15aeccf543
--- /dev/null
+++ b/contrib/gitian-descriptors/boost-win.yml
@@ -0,0 +1,79 @@
+---
+name: "boost"
+suites:
+- "precise"
+architectures:
+- "amd64"
+packages:
+- "mingw-w64"
+- "g++-mingw-w64"
+- "faketime"
+- "zip"
+reference_datetime: "2011-01-30 00:00:00"
+remotes: []
+files:
+- "boost_1_55_0.tar.bz2"
+- "boost-mingw-gas-cross-compile-2013-03-03.patch"
+script: |
+ # Defines
+ export TZ=UTC
+ INDIR=$HOME/build
+ # Input Integrity Check
+ echo "fff00023dd79486d444c8e29922f4072e1d451fc5a4d2b6075852ead7f2b7b52 boost_1_55_0.tar.bz2" | shasum -c
+ echo "d2b7f6a1d7051faef3c9cf41a92fa3671d905ef1e1da920d07651a43299f6268 boost-mingw-gas-cross-compile-2013-03-03.patch" | shasum -c
+
+ for BITS in 32 64; do # for architectures
+ #
+ INSTALLPREFIX=$HOME/staging${BITS}
+ BUILDDIR=$HOME/build${BITS}
+ if [ "$BITS" == "32" ]; then
+ HOST=i686-w64-mingw32
+ else
+ HOST=x86_64-w64-mingw32
+ fi
+ #
+ mkdir -p $INSTALLPREFIX $BUILDDIR
+ cd $BUILDDIR
+ #
+ tar xjf $INDIR/boost_1_55_0.tar.bz2
+ cd boost_1_55_0
+ GCCVERSION=$($HOST-g++ -E -dM $(mktemp --suffix=.h) | grep __VERSION__ | cut -d ' ' -f 3 | cut -d '"' -f 2)
+ echo "using gcc : $GCCVERSION : $HOST-g++
+ :
+ <rc>$HOST-windres
+ <archiver>$HOST-ar
+ <cxxflags>-frandom-seed=boost1
+ <ranlib>$HOST-ranlib
+ ;" > user-config.jam
+ ./bootstrap.sh --without-icu
+
+ # Workaround: Upstream boost dev refuses to include patch that would allow Free Software cross-compile toolchain to work
+ # This patch was authored by the Fedora package developer and ships in Fedora's mingw32-boost.
+ # Please obtain the exact patch that matches the above sha256sum from one of the following mirrors.
+ #
+ # Read History: https://svn.boost.org/trac/boost/ticket/7262
+ # History Mirror: http://rose.makesad.us/~paulproteus/mirrors/7262%20Boost.Context%20fails%20to%20build%20using%20MinGW.html
+ #
+ # Patch: https://svn.boost.org/trac/boost/raw-attachment/ticket/7262/boost-mingw.patch
+ # Patch Mirror: http://wtogami.fedorapeople.org/boost-mingw-gas-cross-compile-2013-03-03.patch
+ # Patch Mirror: http://mindstalk.net/host/boost-mingw-gas-cross-compile-2013-03-03.patch
+ # Patch Mirror: http://rose.makesad.us/~paulproteus/mirrors/boost-mingw-gas-cross-compile-2013-03-03.patch
+ patch -p0 < $INDIR/boost-mingw-gas-cross-compile-2013-03-03.patch
+
+ # Bug Workaround: boost-1.54.0 broke the ability to disable zlib, still broken in 1.55
+ # https://svn.boost.org/trac/boost/ticket/9156
+ sed -i 's^\[ ac.check-library /zlib//zlib : <library>/zlib//zlib^^' libs/iostreams/build/Jamfile.v2
+ sed -i 's^<source>zlib.cpp <source>gzip.cpp \]^^' libs/iostreams/build/Jamfile.v2
+
+ # http://statmt.org/~s0565741/software/boost_1_52_0/libs/context/doc/html/context/requirements.html
+ # "For cross-compiling the lib you must specify certain additional properties at bjam command line: target-os, abi, binary-format, architecture and address-model."
+ ./bjam toolset=gcc binary-format=pe target-os=windows threadapi=win32 address-model=$BITS threading=multi variant=release link=static runtime-link=static --user-config=user-config.jam --without-mpi --without-python -sNO_BZIP2=1 -sNO_ZLIB=1 --layout=tagged --build-type=complete --prefix="$INSTALLPREFIX" $MAKEOPTS install
+ #
+ cd "$INSTALLPREFIX"
+ export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1
+ export FAKETIME=$REFERENCE_DATETIME
+ zip -r $OUTDIR/boost-win$BITS-1.55.0-gitian-r6.zip *
+ unset LD_PRELOAD
+ unset FAKETIME
+ done # for BITS in
+
diff --git a/contrib/gitian-descriptors/boost-win32.yml b/contrib/gitian-descriptors/boost-win32.yml
deleted file mode 100644
index b14cd1f6c2..0000000000
--- a/contrib/gitian-descriptors/boost-win32.yml
+++ /dev/null
@@ -1,66 +0,0 @@
----
-name: "boost"
-suites:
-- "precise"
-architectures:
-- "amd64"
-packages:
-- "mingw-w64"
-- "g++-mingw-w64"
-- "faketime"
-- "zip"
-reference_datetime: "2011-01-30 00:00:00"
-remotes: []
-files:
-- "boost_1_55_0.tar.bz2"
-- "boost-mingw-gas-cross-compile-2013-03-03.patch"
-script: |
- # Defines
- INSTALLPREFIX="$OUTDIR/staging/boost"
- HOST=i686-w64-mingw32
- # Input Integrity Check
- echo "fff00023dd79486d444c8e29922f4072e1d451fc5a4d2b6075852ead7f2b7b52 boost_1_55_0.tar.bz2" | shasum -c
- echo "d2b7f6a1d7051faef3c9cf41a92fa3671d905ef1e1da920d07651a43299f6268 boost-mingw-gas-cross-compile-2013-03-03.patch" | shasum -c
-
- mkdir -p "$INSTALLPREFIX"
- tar xjf boost_1_55_0.tar.bz2
- cd boost_1_55_0
- GCCVERSION=$($HOST-g++ -E -dM $(mktemp --suffix=.h) | grep __VERSION__ | cut -d ' ' -f 3 | cut -d '"' -f 2)
- echo "using gcc : $GCCVERSION : $HOST-g++
- :
- <rc>$HOST-windres
- <archiver>$HOST-ar
- <cxxflags>-frandom-seed=boost1
- <ranlib>$HOST-ranlib
- ;" > user-config.jam
- ./bootstrap.sh --without-icu
-
- # Workaround: Upstream boost dev refuses to include patch that would allow Free Software cross-compile toolchain to work
- # This patch was authored by the Fedora package developer and ships in Fedora's mingw32-boost.
- # Please obtain the exact patch that matches the above sha256sum from one of the following mirrors.
- #
- # Read History: https://svn.boost.org/trac/boost/ticket/7262
- # History Mirror: http://rose.makesad.us/~paulproteus/mirrors/7262%20Boost.Context%20fails%20to%20build%20using%20MinGW.html
- #
- # Patch: https://svn.boost.org/trac/boost/raw-attachment/ticket/7262/boost-mingw.patch
- # Patch Mirror: http://wtogami.fedorapeople.org/boost-mingw-gas-cross-compile-2013-03-03.patch
- # Patch Mirror: http://mindstalk.net/host/boost-mingw-gas-cross-compile-2013-03-03.patch
- # Patch Mirror: http://rose.makesad.us/~paulproteus/mirrors/boost-mingw-gas-cross-compile-2013-03-03.patch
- patch -p0 < ../boost-mingw-gas-cross-compile-2013-03-03.patch
-
- # Bug Workaround: boost-1.54.0 broke the ability to disable zlib, still broken in 1.55
- # https://svn.boost.org/trac/boost/ticket/9156
- sed -i 's^\[ ac.check-library /zlib//zlib : <library>/zlib//zlib^^' libs/iostreams/build/Jamfile.v2
- sed -i 's^<source>zlib.cpp <source>gzip.cpp \]^^' libs/iostreams/build/Jamfile.v2
-
- # http://statmt.org/~s0565741/software/boost_1_52_0/libs/context/doc/html/context/requirements.html
- # Note: Might need these options in the future for 64bit builds.
- # "Please note that address-model=64 must be given to bjam command line on 64bit Windows for 64bit build; otherwise 32bit code will be generated."
- # "For cross-compiling the lib you must specify certain additional properties at bjam command line: target-os, abi, binary-format, architecture and address-model."
- ./bjam toolset=gcc binary-format=pe target-os=windows threadapi=win32 threading=multi variant=release link=static --user-config=user-config.jam --without-mpi --without-python -sNO_BZIP2=1 -sNO_ZLIB=1 --layout=tagged --build-type=complete --prefix="$INSTALLPREFIX" $MAKEOPTS install
-
- cd "$INSTALLPREFIX"
- export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1
- export FAKETIME=$REFERENCE_DATETIME
- zip -r boost-win32-1.55.0-gitian-r6.zip *
- cp boost-win32-1.55.0-gitian-r6.zip $OUTDIR
diff --git a/contrib/gitian-descriptors/deps-linux.yml b/contrib/gitian-descriptors/deps-linux.yml
index 4ebf5c53a3..41d8d65fb7 100644
--- a/contrib/gitian-descriptors/deps-linux.yml
+++ b/contrib/gitian-descriptors/deps-linux.yml
@@ -15,6 +15,7 @@ packages:
reference_datetime: "2013-06-01 00:00:00"
remotes: []
files:
+- "openssl-1.0.1e.tar.gz"
- "miniupnpc-1.8.tar.gz"
- "qrencode-3.4.3.tar.bz2"
- "protobuf-2.5.0.tar.bz2"
@@ -24,11 +25,21 @@ script: |
OPTFLAGS='-O2'
export LIBRARY_PATH="$STAGING/lib"
# Integrity Check
+ echo "f74f15e8c8ff11aa3d5bb5f276d202ec18d7246e95f961db76054199c69c1ae3 openssl-1.0.1e.tar.gz" | sha256sum -c
echo "bc5f73c7b0056252c1888a80e6075787a1e1e9112b808f863a245483ff79859c miniupnpc-1.8.tar.gz" | sha256sum -c
echo "dfd71487513c871bad485806bfd1fdb304dedc84d2b01a8fb8e0940b50597a98 qrencode-3.4.3.tar.bz2" | sha256sum -c
echo "13bfc5ae543cf3aa180ac2485c0bc89495e3ae711fc6fab4f8ffe90dfb4bb677 protobuf-2.5.0.tar.bz2" | sha256sum -c
echo "12edc0df75bf9abd7f82f821795bcee50f42cb2e5f76a6a281b85732798364ef db-4.8.30.NC.tar.gz" | sha256sum -c
+ #
+ tar xzf openssl-1.0.1e.tar.gz
+ cd openssl-1.0.1e
+ # need -fPIC to avoid relocation error in 64 bit builds
+ ./config no-shared no-zlib no-dso no-krb5 --openssldir=$STAGING -fPIC
+ make
+ make install_sw
+ cd ..
+ #
tar xzfm miniupnpc-1.8.tar.gz
cd miniupnpc-1.8
# miniupnpc is always built with -fPIC
@@ -60,4 +71,4 @@ script: |
cd ../..
#
cd $STAGING
- zip -r $OUTDIR/bitcoin-deps-linux${GBUILD_BITS}-gitian-r1.zip include lib bin host
+ zip -r $OUTDIR/bitcoin-deps-linux${GBUILD_BITS}-gitian-r2.zip include lib bin host
diff --git a/contrib/gitian-descriptors/deps-win.yml b/contrib/gitian-descriptors/deps-win.yml
new file mode 100644
index 0000000000..ce7acc1e6a
--- /dev/null
+++ b/contrib/gitian-descriptors/deps-win.yml
@@ -0,0 +1,117 @@
+---
+name: "bitcoin-deps"
+suites:
+- "precise"
+architectures:
+- "amd64"
+packages:
+- "mingw-w64"
+- "g++-mingw-w64"
+- "git-core"
+- "zip"
+- "faketime"
+- "psmisc"
+reference_datetime: "2011-01-30 00:00:00"
+remotes: []
+files:
+- "openssl-1.0.1e.tar.gz"
+- "db-4.8.30.NC.tar.gz"
+- "miniupnpc-1.8.tar.gz"
+- "zlib-1.2.8.tar.gz"
+- "libpng-1.6.8.tar.gz"
+- "qrencode-3.4.3.tar.bz2"
+script: |
+ #
+ export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1
+ export FAKETIME=$REFERENCE_DATETIME
+ export TZ=UTC
+ INDIR=$HOME/build
+ # Input Integrity Check
+ echo "f74f15e8c8ff11aa3d5bb5f276d202ec18d7246e95f961db76054199c69c1ae3 openssl-1.0.1e.tar.gz" | sha256sum -c
+ echo "12edc0df75bf9abd7f82f821795bcee50f42cb2e5f76a6a281b85732798364ef db-4.8.30.NC.tar.gz" | sha256sum -c
+ echo "bc5f73c7b0056252c1888a80e6075787a1e1e9112b808f863a245483ff79859c miniupnpc-1.8.tar.gz" | sha256sum -c
+ echo "36658cb768a54c1d4dec43c3116c27ed893e88b02ecfcb44f2166f9c0b7f2a0d zlib-1.2.8.tar.gz" | sha256sum -c
+ echo "32c7acf1608b9c8b71b743b9780adb7a7b347563dbfb4a5263761056da44cc96 libpng-1.6.8.tar.gz" | sha256sum -c
+ echo "dfd71487513c871bad485806bfd1fdb304dedc84d2b01a8fb8e0940b50597a98 qrencode-3.4.3.tar.bz2" | sha256sum -c
+
+ for BITS in 32 64; do # for architectures
+ #
+ INSTALLPREFIX=$HOME/staging${BITS}
+ BUILDDIR=$HOME/build${BITS}
+ if [ "$BITS" == "32" ]; then
+ HOST=i686-w64-mingw32
+ else
+ HOST=x86_64-w64-mingw32
+ fi
+ #
+ mkdir -p $INSTALLPREFIX $BUILDDIR
+ cd $BUILDDIR
+ #
+ tar xzf $INDIR/openssl-1.0.1e.tar.gz
+ cd openssl-1.0.1e
+ if [ "$BITS" == "32" ]; then
+ OPENSSL_TGT=mingw
+ else
+ OPENSSL_TGT=mingw64
+ fi
+ ./Configure --cross-compile-prefix=$HOST- ${OPENSSL_TGT} no-shared no-dso --openssldir=$INSTALLPREFIX
+ make
+ make install_sw
+ cd ..
+ #
+ tar xzf $INDIR/db-4.8.30.NC.tar.gz
+ cd db-4.8.30.NC/build_unix
+ ../dist/configure --prefix=$INSTALLPREFIX --enable-mingw --enable-cxx --host=$HOST --disable-shared
+ make $MAKEOPTS library_build
+ make install_lib install_include
+ cd ../..
+ #
+ tar xzf $INDIR/miniupnpc-1.8.tar.gz
+ cd miniupnpc-1.8
+ echo "
+ --- miniupnpc-1.8/Makefile.mingw.orig 2013-09-29 18:52:51.014087958 -1000
+ +++ miniupnpc-1.8/Makefile.mingw 2013-09-29 19:09:29.663318691 -1000
+ @@ -67,8 +67,8 @@
+
+ wingenminiupnpcstrings.o: wingenminiupnpcstrings.c
+
+ -miniupnpcstrings.h: miniupnpcstrings.h.in wingenminiupnpcstrings
+ - wingenminiupnpcstrings \$< \$@
+ +miniupnpcstrings.h: miniupnpcstrings.h.in
+ + sed -e 's|OS/version|MSWindows/5.1.2600|' -e 's|MINIUPNPC_VERSION_STRING \"version\"|MINIUPNPC_VERSION_STRING \"VERSIONHERE\"|' \$< > \$@
+
+ minixml.o: minixml.c minixml.h miniupnpcstrings.h
+
+ " | sed "s/VERSIONHERE/$(cat VERSION)/" | patch -p1
+ mkdir -p dll
+ make -f Makefile.mingw CC=$HOST-gcc AR=$HOST-ar libminiupnpc.a
+ install -d $INSTALLPREFIX/include/miniupnpc
+ install *.h $INSTALLPREFIX/include/miniupnpc
+ install libminiupnpc.a $INSTALLPREFIX/lib
+ cd ..
+ #
+ tar xzf $INDIR/zlib-1.2.8.tar.gz
+ cd zlib-1.2.8
+ CROSS_PREFIX=$HOST- ./configure --prefix=$INSTALLPREFIX --static
+ make
+ make install
+ cd ..
+ #
+ tar xzf $INDIR/libpng-1.6.8.tar.gz
+ cd libpng-1.6.8
+ OPT="-O2"
+ CPPFLAGS="${OPT} -I$INSTALLPREFIX/include" CFLAGS="${OPT} -I$INSTALLPREFIX/include" LDFLAGS="${OPT} -L$INSTALLPREFIX/lib" ./configure --disable-shared --prefix=$INSTALLPREFIX --host=$HOST
+ make $MAKEOPTS
+ make install
+ cd ..
+ #
+ tar xjf $INDIR/qrencode-3.4.3.tar.bz2
+ cd qrencode-3.4.3
+ png_CFLAGS="-I$INSTALLPREFIX/include" png_LIBS="-L$INSTALLPREFIX/lib -lpng" ./configure --prefix=$INSTALLPREFIX --host=$HOST
+ make
+ make install
+ cd ..
+ #
+ cd $INSTALLPREFIX
+ zip -r $OUTDIR/bitcoin-deps-win$BITS-gitian-r10.zip include lib
+ done # for BITS in
diff --git a/contrib/gitian-descriptors/deps-win32.yml b/contrib/gitian-descriptors/deps-win32.yml
deleted file mode 100644
index 12b9dfc70c..0000000000
--- a/contrib/gitian-descriptors/deps-win32.yml
+++ /dev/null
@@ -1,101 +0,0 @@
----
-name: "bitcoin-deps"
-suites:
-- "precise"
-architectures:
-- "amd64"
-packages:
-- "mingw-w64"
-- "g++-mingw-w64"
-- "git-core"
-- "zip"
-- "faketime"
-- "psmisc"
-reference_datetime: "2011-01-30 00:00:00"
-remotes: []
-files:
-- "openssl-1.0.1e.tar.gz"
-- "db-4.8.30.NC.tar.gz"
-- "miniupnpc-1.8.tar.gz"
-- "zlib-1.2.8.tar.gz"
-- "libpng-1.6.8.tar.gz"
-- "qrencode-3.4.3.tar.bz2"
-script: |
- #
- export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1
- export FAKETIME=$REFERENCE_DATETIME
- export TZ=UTC
- export INSTALLPREFIX=$OUTDIR/staging/deps
- export HOST=i686-w64-mingw32
- # Input Integrity Check
- echo "f74f15e8c8ff11aa3d5bb5f276d202ec18d7246e95f961db76054199c69c1ae3 openssl-1.0.1e.tar.gz" | sha256sum -c
- echo "12edc0df75bf9abd7f82f821795bcee50f42cb2e5f76a6a281b85732798364ef db-4.8.30.NC.tar.gz" | sha256sum -c
- echo "bc5f73c7b0056252c1888a80e6075787a1e1e9112b808f863a245483ff79859c miniupnpc-1.8.tar.gz" | sha256sum -c
- echo "36658cb768a54c1d4dec43c3116c27ed893e88b02ecfcb44f2166f9c0b7f2a0d zlib-1.2.8.tar.gz" | sha256sum -c
- echo "32c7acf1608b9c8b71b743b9780adb7a7b347563dbfb4a5263761056da44cc96 libpng-1.6.8.tar.gz" | sha256sum -c
- echo "dfd71487513c871bad485806bfd1fdb304dedc84d2b01a8fb8e0940b50597a98 qrencode-3.4.3.tar.bz2" | sha256sum -c
-
- mkdir -p $INSTALLPREFIX
-
- tar xzf openssl-1.0.1e.tar.gz
- cd openssl-1.0.1e
- ./Configure --cross-compile-prefix=$HOST- mingw --openssldir=$INSTALLPREFIX
- make
- make install_sw
- cd ..
- #
- tar xzf db-4.8.30.NC.tar.gz
- cd db-4.8.30.NC/build_unix
- ../dist/configure --prefix=$INSTALLPREFIX --enable-mingw --enable-cxx --host=$HOST --disable-shared
- make $MAKEOPTS library_build
- make install_lib install_include
- cd ../..
- #
- tar xzf miniupnpc-1.8.tar.gz
- cd miniupnpc-1.8
- echo "
- --- miniupnpc-1.8/Makefile.mingw.orig 2013-09-29 18:52:51.014087958 -1000
- +++ miniupnpc-1.8/Makefile.mingw 2013-09-29 19:09:29.663318691 -1000
- @@ -67,8 +67,8 @@
-
- wingenminiupnpcstrings.o: wingenminiupnpcstrings.c
-
- -miniupnpcstrings.h: miniupnpcstrings.h.in wingenminiupnpcstrings
- - wingenminiupnpcstrings \$< \$@
- +miniupnpcstrings.h: miniupnpcstrings.h.in
- + sed -e 's|OS/version|MSWindows/5.1.2600|' -e 's|MINIUPNPC_VERSION_STRING \"version\"|MINIUPNPC_VERSION_STRING \"VERSIONHERE\"|' \$< > \$@
-
- minixml.o: minixml.c minixml.h miniupnpcstrings.h
-
- " | sed "s/VERSIONHERE/$(cat VERSION)/" | patch -p1
- mkdir -p dll
- make -f Makefile.mingw CC=$HOST-gcc AR=$HOST-ar libminiupnpc.a
- install -d $INSTALLPREFIX/include/miniupnpc
- install *.h $INSTALLPREFIX/include/miniupnpc
- install libminiupnpc.a $INSTALLPREFIX/lib
- cd ..
- #
- tar xzf zlib-1.2.8.tar.gz
- cd zlib-1.2.8
- CROSS_PREFIX=$HOST- ./configure --prefix=$INSTALLPREFIX --static
- make
- make install
- cd ..
- #
- tar xzf libpng-1.6.8.tar.gz
- cd libpng-1.6.8
- OPT="-O2"
- CPPFLAGS="${OPT} -I$INSTALLPREFIX/include" CFLAGS="${OPT} -I$INSTALLPREFIX/include" LDFLAGS="${OPT} -L$INSTALLPREFIX/lib" ./configure --disable-shared --prefix=$INSTALLPREFIX --host=$HOST
- make $MAKEOPTS
- make install
- cd ..
- #
- tar xjf qrencode-3.4.3.tar.bz2
- cd qrencode-3.4.3
- png_CFLAGS="-I$INSTALLPREFIX/include" png_LIBS="-L$INSTALLPREFIX/lib -lpng" ./configure --prefix=$INSTALLPREFIX --host=$HOST
- make
- make install
- cd ..
- #
- cd $INSTALLPREFIX
- zip -r $OUTDIR/bitcoin-deps-win32-gitian-r10.zip include lib
diff --git a/contrib/gitian-descriptors/gitian-linux.yml b/contrib/gitian-descriptors/gitian-linux.yml
index b0fe86e259..417f31e270 100644
--- a/contrib/gitian-descriptors/gitian-linux.yml
+++ b/contrib/gitian-descriptors/gitian-linux.yml
@@ -6,14 +6,7 @@ architectures:
- "i386"
- "amd64"
packages:
-- "qt4-qmake"
- "libqt4-dev"
-- "libboost-system-dev"
-- "libboost-filesystem-dev"
-- "libboost-program-options-dev"
-- "libboost-thread-dev"
-- "libboost-test-dev"
-- "libssl-dev"
- "git-core"
- "unzip"
- "pkg-config"
@@ -27,8 +20,10 @@ remotes:
- "url": "https://github.com/bitcoin/bitcoin.git"
"dir": "bitcoin"
files:
-- "bitcoin-deps-linux32-gitian-r1.zip"
-- "bitcoin-deps-linux64-gitian-r1.zip"
+- "bitcoin-deps-linux32-gitian-r2.zip"
+- "bitcoin-deps-linux64-gitian-r2.zip"
+- "boost-linux32-1.55.0-gitian-r1.zip"
+- "boost-linux64-1.55.0-gitian-r1.zip"
script: |
STAGING="$HOME/install"
OPTFLAGS='-O2'
@@ -38,18 +33,19 @@ script: |
#
mkdir -p $STAGING
cd $STAGING
- unzip ../build/bitcoin-deps-linux${GBUILD_BITS}-gitian-r1.zip
+ unzip ../build/bitcoin-deps-linux${GBUILD_BITS}-gitian-r2.zip
+ unzip ../build/boost-linux${GBUILD_BITS}-1.55.0-gitian-r1.zip
cd ../build
#
cd bitcoin
export TAR_OPTIONS=--mtime=`echo $REFERENCE_DATETIME | awk '{ print $1 }'`
./autogen.sh
- ./configure --prefix=$STAGING --bindir=$BINDIR --with-protoc-bindir=$STAGING/host/bin --disable-maintainer-mode --disable-dependency-tracking PKG_CONFIG_PATH="$STAGING/lib/pkgconfig" CPPFLAGS="-I$STAGING/include ${OPTFLAGS}" LDFLAGS="-L$STAGING/lib ${OPTFLAGS}" CXXFLAGS="-frandom-seed=bitcoin ${OPTFLAGS}"
+ ./configure --prefix=$STAGING --bindir=$BINDIR --with-protoc-bindir=$STAGING/host/bin --with-boost=$STAGING --disable-maintainer-mode --disable-dependency-tracking PKG_CONFIG_PATH="$STAGING/lib/pkgconfig" CPPFLAGS="-I$STAGING/include ${OPTFLAGS}" LDFLAGS="-L$STAGING/lib ${OPTFLAGS}" CXXFLAGS="-frandom-seed=bitcoin ${OPTFLAGS}" BOOST_CHRONO_EXTRALIBS="-lrt"
make dist
mkdir -p distsrc
cd distsrc
tar --strip-components=1 -xf ../bitcoin-*.tar.*
- ./configure --prefix=$STAGING --bindir=$BINDIR --with-protoc-bindir=$STAGING/host/bin --disable-maintainer-mode --disable-dependency-tracking PKG_CONFIG_PATH="$STAGING/lib/pkgconfig" CPPFLAGS="-I$STAGING/include ${OPTFLAGS}" LDFLAGS="-L$STAGING/lib ${OPTFLAGS}" CXXFLAGS="-frandom-seed=bitcoin ${OPTFLAGS}"
+ ./configure --prefix=$STAGING --bindir=$BINDIR --with-protoc-bindir=$STAGING/host/bin --with-boost=$STAGING --disable-maintainer-mode --disable-dependency-tracking PKG_CONFIG_PATH="$STAGING/lib/pkgconfig" CPPFLAGS="-I$STAGING/include ${OPTFLAGS}" LDFLAGS="-L$STAGING/lib ${OPTFLAGS}" CXXFLAGS="-frandom-seed=bitcoin ${OPTFLAGS}" BOOST_CHRONO_EXTRALIBS="-lrt"
make $MAKEOPTS
make $MAKEOPTS install-strip
mkdir -p $OUTDIR/src
diff --git a/contrib/gitian-descriptors/gitian-win.yml b/contrib/gitian-descriptors/gitian-win.yml
new file mode 100644
index 0000000000..9364db4ef7
--- /dev/null
+++ b/contrib/gitian-descriptors/gitian-win.yml
@@ -0,0 +1,84 @@
+---
+name: "bitcoin"
+suites:
+- "precise"
+architectures:
+- "amd64"
+packages:
+- "mingw-w64"
+- "g++-mingw-w64"
+- "git-core"
+- "unzip"
+- "nsis"
+- "faketime"
+- "autoconf2.13"
+- "libtool"
+- "automake"
+- "pkg-config"
+- "bsdmainutils"
+
+reference_datetime: "2013-06-01 00:00:00"
+remotes:
+- "url": "https://github.com/bitcoin/bitcoin.git"
+ "dir": "bitcoin"
+files:
+- "qt-win32-5.2.0-gitian-r1.zip"
+- "qt-win64-5.2.0-gitian-r1.zip"
+- "boost-win32-1.55.0-gitian-r6.zip"
+- "boost-win64-1.55.0-gitian-r6.zip"
+- "bitcoin-deps-win32-gitian-r10.zip"
+- "bitcoin-deps-win64-gitian-r10.zip"
+- "protobuf-win32-2.5.0-gitian-r4.zip"
+- "protobuf-win64-2.5.0-gitian-r4.zip"
+script: |
+ # Defines
+ export TZ=UTC
+ INDIR=$HOME/build
+ OPTFLAGS='-O2'
+ NEEDDIST=1
+ for BITS in 32 64; do # for architectures
+ #
+ STAGING=$HOME/staging${BITS}
+ BUILDDIR=$HOME/build${BITS}
+ BINDIR=$OUTDIR/$BITS
+ if [ "$BITS" == "32" ]; then
+ HOST=i686-w64-mingw32
+ else
+ HOST=x86_64-w64-mingw32
+ fi
+ mkdir -p $STAGING $BUILDDIR $BINDIR
+ #
+ cd $STAGING
+ unzip $INDIR/qt-win${BITS}-5.2.0-gitian-r1.zip
+ unzip $INDIR/boost-win${BITS}-1.55.0-gitian-r6.zip
+ unzip $INDIR/bitcoin-deps-win${BITS}-gitian-r10.zip
+ unzip $INDIR/protobuf-win${BITS}-2.5.0-gitian-r4.zip
+ if [ "$NEEDDIST" == "1" ]; then
+ # Make source code archive which is architecture independent so it only needs to be done once
+ cd $HOME/build/
+ cd bitcoin
+ export PATH=$STAGING/host/bin:$PATH
+ export TAR_OPTIONS=--mtime=`echo $REFERENCE_DATETIME | awk '{ print $1 }'`
+ ./autogen.sh
+ ./configure --bindir=$OUTDIR --prefix=$STAGING --host=$HOST --with-qt-plugindir=$STAGING/plugins --with-qt-incdir=$STAGING/include --with-qt-bindir=$STAGING/host/bin --with-boost=$STAGING --disable-maintainer-mode --with-protoc-bindir=$STAGING/host/bin --disable-dependency-tracking CPPFLAGS="-I$STAGING/include ${OPTFLAGS}" LDFLAGS="-L$STAGING/lib ${OPTFLAGS}" CXXFLAGS="-frandom-seed=bitcoin ${OPTFLAGS}"
+ make dist
+ mkdir -p $OUTDIR/src
+ cp -f bitcoin-*.tar.* $OUTDIR/src
+ NEEDDIST=0
+ fi
+ # Build platform-dependent executables from source archive
+ cd $BUILDDIR
+ mkdir -p distsrc
+ cd distsrc
+ tar --strip-components=1 -xf $HOME/build/bitcoin/bitcoin-*.tar.*
+ ./configure --bindir=$BINDIR --prefix=$STAGING --host=$HOST --with-qt-plugindir=$STAGING/plugins --with-qt-incdir=$STAGING/include --with-qt-bindir=$STAGING/host/bin --with-boost=$STAGING --disable-maintainer-mode --with-protoc-bindir=$STAGING/host/bin --disable-dependency-tracking CPPFLAGS="-I$STAGING/include ${OPTFLAGS}" LDFLAGS="-L$STAGING/lib ${OPTFLAGS}" CXXFLAGS="-frandom-seed=bitcoin ${OPTFLAGS}"
+ export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1
+ export FAKETIME=$REFERENCE_DATETIME
+ make $MAKEOPTS
+ make deploy
+ make install-strip
+ cp -f bitcoin-*setup*.exe $BINDIR/
+ unset LD_PRELOAD
+ unset FAKETIME
+ done # for BITS in
+
diff --git a/contrib/gitian-descriptors/gitian-win32.yml b/contrib/gitian-descriptors/gitian-win32.yml
deleted file mode 100644
index 794fa27f1f..0000000000
--- a/contrib/gitian-descriptors/gitian-win32.yml
+++ /dev/null
@@ -1,62 +0,0 @@
----
-name: "bitcoin"
-suites:
-- "precise"
-architectures:
-- "amd64"
-packages:
-- "mingw-w64"
-- "g++-mingw-w64"
-- "git-core"
-- "unzip"
-- "nsis"
-- "faketime"
-- "autoconf2.13"
-- "libtool"
-- "automake"
-- "pkg-config"
-- "bsdmainutils"
-
-reference_datetime: "2013-06-01 00:00:00"
-remotes:
-- "url": "https://github.com/bitcoin/bitcoin.git"
- "dir": "bitcoin"
-files:
-- "qt-win32-5.2.0-gitian-r1.zip"
-- "boost-win32-1.55.0-gitian-r6.zip"
-- "bitcoin-deps-win32-gitian-r10.zip"
-- "protobuf-win32-2.5.0-gitian-r3.zip"
-script: |
- #
- STAGING=$HOME/staging
- HOST=i686-w64-mingw32
- OPTFLAGS='-O2'
- #
- mkdir -p $STAGING
- cd $STAGING
- unzip ../build/qt-win32-5.2.0-gitian-r1.zip
- unzip ../build/boost-win32-1.55.0-gitian-r6.zip
- unzip ../build/bitcoin-deps-win32-gitian-r10.zip
- unzip ../build/protobuf-win32-2.5.0-gitian-r3.zip
- cd $HOME/build/
- #
- cd bitcoin
- export PATH=$STAGING/host/bin:$PATH
- export TAR_OPTIONS=--mtime=`echo $REFERENCE_DATETIME | awk '{ print $1 }'`
- ./autogen.sh
- ./configure --bindir=$OUTDIR --prefix=$STAGING --host=$HOST --with-qt-plugindir=$STAGING/plugins --with-qt-incdir=$STAGING/include --with-qt-bindir=$STAGING/host/bin --with-boost=$STAGING --disable-maintainer-mode --with-protoc-bindir=$STAGING/host/bin --disable-dependency-tracking CPPFLAGS="-I$STAGING/include ${OPTFLAGS}" LDFLAGS="-L$STAGING/lib ${OPTFLAGS}" CXXFLAGS="-frandom-seed=bitcoin ${OPTFLAGS}"
- make dist
- mkdir -p distsrc
- cd distsrc
- tar --strip-components=1 -xf ../bitcoin-*.tar.*
- ./configure --bindir=$OUTDIR --prefix=$STAGING --host=i686-w64-mingw32 --with-qt-plugindir=$STAGING/plugins --with-qt-incdir=$STAGING/include --with-qt-bindir=$STAGING/host/bin --with-boost=$STAGING --disable-maintainer-mode --with-protoc-bindir=$STAGING/host/bin --disable-dependency-tracking CPPFLAGS="-I$STAGING/include ${OPTFLAGS}" LDFLAGS="-L$STAGING/lib ${OPTFLAGS}" CXXFLAGS="-frandom-seed=bitcoin ${OPTFLAGS}"
- export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1
- export FAKETIME=$REFERENCE_DATETIME
- export TZ=UTC
- make $MAKEOPTS
- make deploy
- make install-strip
- cp -f bitcoin-*setup*.exe $OUTDIR/
-
- mkdir -p $OUTDIR/src
- cp -f ../bitcoin-*.tar.* $OUTDIR/src
diff --git a/contrib/gitian-descriptors/protobuf-win.yml b/contrib/gitian-descriptors/protobuf-win.yml
new file mode 100644
index 0000000000..7fcac72fea
--- /dev/null
+++ b/contrib/gitian-descriptors/protobuf-win.yml
@@ -0,0 +1,56 @@
+---
+name: "protobuf-win32"
+suites:
+- "precise"
+architectures:
+- "amd64"
+packages:
+- "mingw-w64"
+- "g++-mingw-w64"
+- "zip"
+- "faketime"
+reference_datetime: "2013-04-15 00:00:00"
+remotes: []
+files:
+- "protobuf-2.5.0.tar.bz2"
+script: |
+ #
+ export TZ=UTC
+ INDIR=$HOME/build
+ OPTFLAGS="-O2"
+ # Integrity Check
+ echo "13bfc5ae543cf3aa180ac2485c0bc89495e3ae711fc6fab4f8ffe90dfb4bb677 protobuf-2.5.0.tar.bz2" | sha256sum -c
+
+ for BITS in 32 64; do # for architectures
+ #
+ INSTALLPREFIX=$HOME/staging${BITS}
+ BUILDDIR=$HOME/build${BITS}
+ if [ "$BITS" == "32" ]; then
+ HOST=i686-w64-mingw32
+ else
+ HOST=x86_64-w64-mingw32
+ fi
+ #
+ mkdir -p $INSTALLPREFIX $BUILDDIR
+ cd $BUILDDIR
+ #
+ tar xjf $INDIR/protobuf-2.5.0.tar.bz2
+ cd protobuf-2.5.0
+ # First: build a native (linux) protoc
+ ./configure --enable-shared=no --disable-dependency-tracking
+ make
+ mkdir -p $INSTALLPREFIX/host/bin
+ cp src/protoc $INSTALLPREFIX/host/bin
+ # Now recompile with the mingw cross-compiler:
+ make distclean
+ ./configure --prefix=$INSTALLPREFIX --enable-shared=no --disable-dependency-tracking --with-protoc=$INSTALLPREFIX/host/bin/protoc --host=$HOST CXXFLAGS="-frandom-seed=11 ${OPTFLAGS}"
+ make
+ make install
+ #
+ cd $INSTALLPREFIX
+ export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1
+ export FAKETIME=$REFERENCE_DATETIME
+ zip -r $OUTDIR/protobuf-win$BITS-2.5.0-gitian-r4.zip include lib host
+ unset LD_PRELOAD
+ unset FAKETIME
+ done # for BITS in
diff --git a/contrib/gitian-descriptors/protobuf-win32.yml b/contrib/gitian-descriptors/protobuf-win32.yml
deleted file mode 100644
index b2e3d0b465..0000000000
--- a/contrib/gitian-descriptors/protobuf-win32.yml
+++ /dev/null
@@ -1,44 +0,0 @@
----
-name: "protobuf-win32"
-suites:
-- "precise"
-architectures:
-- "amd64"
-packages:
-- "mingw-w64"
-- "g++-mingw-w64"
-- "zip"
-- "faketime"
-reference_datetime: "2013-04-15 00:00:00"
-remotes: []
-files:
-- "protobuf-2.5.0.tar.bz2"
-script: |
- #
- export TZ=UTC
- export INSTALLPREFIX=$OUTDIR/staging/deps
- export HOST=i686-w64-mingw32
- # Integrity Check
- echo "13bfc5ae543cf3aa180ac2485c0bc89495e3ae711fc6fab4f8ffe90dfb4bb677 protobuf-2.5.0.tar.bz2" | sha256sum -c
-
- #
- mkdir -p $INSTALLPREFIX
-
- tar xjf protobuf-2.5.0.tar.bz2
- cd protobuf-2.5.0
- # First: build a native (linux) protoc
- ./configure --enable-shared=no --disable-dependency-tracking
- make
- mkdir -p $INSTALLPREFIX/host/bin
- cp src/protoc $INSTALLPREFIX/host/bin
- # Now recompile with the mingw cross-compiler:
- make distclean
- ./configure --prefix=$INSTALLPREFIX --enable-shared=no --disable-dependency-tracking --with-protoc=$INSTALLPREFIX/host/bin/protoc --host=$HOST CXXFLAGS=-frandom-seed=11
- make
- make install
- cd $INSTALLPREFIX
- export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1
- export FAKETIME=$REFERENCE_DATETIME
- zip -r $OUTDIR/protobuf-win32-2.5.0-gitian-r3.zip include lib host
- unset LD_PRELOAD
- unset FAKETIME
diff --git a/contrib/gitian-descriptors/qt-win.yml b/contrib/gitian-descriptors/qt-win.yml
new file mode 100644
index 0000000000..3b9aeeb19f
--- /dev/null
+++ b/contrib/gitian-descriptors/qt-win.yml
@@ -0,0 +1,77 @@
+---
+name: "qt"
+suites:
+- "precise"
+architectures:
+- "amd64"
+packages:
+- "mingw-w64"
+- "g++-mingw-w64"
+- "zip"
+- "unzip"
+- "faketime"
+- "libz-dev"
+reference_datetime: "2011-01-30 00:00:00"
+remotes: []
+files:
+- "qt-everywhere-opensource-src-5.2.0.tar.gz"
+- "bitcoin-deps-win32-gitian-r10.zip"
+- "bitcoin-deps-win64-gitian-r10.zip"
+script: |
+ # Defines
+ export TZ=UTC
+ INDIR=$HOME/build
+ # Integrity Check
+ echo "395ec72277c5786c65b8163ef5817fd03d0a1f524a6d47f53624baf8056f1081 qt-everywhere-opensource-src-5.2.0.tar.gz" | sha256sum -c
+
+ for BITS in 32 64; do # for architectures
+ #
+ INSTALLPREFIX=$HOME/staging${BITS}
+ BUILDDIR=$HOME/build${BITS}
+ DEPSDIR=$HOME/deps${BITS}
+ if [ "$BITS" == "32" ]; then
+ HOST=i686-w64-mingw32
+ else
+ HOST=x86_64-w64-mingw32
+ fi
+ #
+ mkdir -p $INSTALLPREFIX $INSTALLPREFIX/host/bin $DEPSDIR $BUILDDIR
+ #
+ # Need mingw-compiled openssl from bitcoin-deps:
+ cd $DEPSDIR
+ unzip $INDIR/bitcoin-deps-win${BITS}-gitian-r10.zip
+ #
+ cd $BUILDDIR
+ #
+ tar xzf $INDIR/qt-everywhere-opensource-src-5.2.0.tar.gz
+ cd qt-everywhere-opensource-src-5.2.0
+ SPECNAME="win32-g++"
+ SPECFILE="qtbase/mkspecs/${SPECNAME}/qmake.conf"
+ sed 's/$TODAY/2011-01-30/' -i configure
+ sed --posix "s|QMAKE_CFLAGS = -pipe -fno-keep-inline-dllexport|QMAKE_CFLAGS\t\t= -pipe -fno-keep-inline-dllexport -isystem /usr/$HOST/include/ -frandom-seed=qtbuild -I$DEPSDIR/include|" -i ${SPECFILE}
+ sed --posix "s|QMAKE_LFLAGS =|QMAKE_LFLAGS\t\t= -L$DEPSDIR/lib|" -i ${SPECFILE}
+ # ar adds timestamps to every object file included in the static library
+ # providing -D as ar argument is supposed to solve it, but doesn't work as qmake strips off the arguments and adds -M to pass a script...
+ # which somehow cannot be combined with other flags.
+ # use faketime only for ar, as it confuses make/qmake into hanging sometimes
+ sed --posix "s|QMAKE_LIB = \\\$\\\${CROSS_COMPILE}ar -ru|QMAKE_LIB\t\t= $HOME/ar -Dr|" -i ${SPECFILE}
+ echo '#!/bin/bash' > $HOME/ar
+ echo 'export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1' >> $HOME/ar
+ echo "$HOST-ar \"\$@\"" >> $HOME/ar
+ chmod +x $HOME/ar
+ # Don't load faketime while compiling Qt, qmake will get stuck in nearly infinite loops
+ #export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1
+ export FAKETIME=$REFERENCE_DATETIME
+ #
+ # Compile static libraries, and use statically linked openssl (-openssl-linked):
+ OPENSSL_LIBS="-L$DEPSDIR/lib -lssl -lcrypto -lgdi32" ./configure -prefix $INSTALLPREFIX -bindir $INSTALLPREFIX/host/bin -confirm-license -release -opensource -static -xplatform $SPECNAME -device-option CROSS_COMPILE="$HOST-" -no-audio-backend -no-javascript-jit -no-sql-sqlite -no-sql-odbc -no-nis -no-cups -no-iconv -no-dbus -no-gif -no-opengl -no-compile-examples -no-feature-style-windowsce -no-feature-style-windowsmobile -no-qml-debug -openssl-linked -skip qtsvg -skip qtwebkit -skip qtwebkit-examples -skip qtserialport -skip qtdeclarative -skip qtmultimedia -skip qtimageformats -skip qtlocation -skip qtsensors -skip qtquick1 -skip qtquickcontrols -skip qtactiveqt -skip qtconnectivity -skip qtwinextras -skip qtxmlpatterns -skip qtscript -skip qtdoc -system-libpng -system-zlib
+ make $MAKEOPTS install
+ #
+ cd $INSTALLPREFIX
+
+ # as zip stores file timestamps, use faketime to intercept stat calls to set dates for all files to reference date
+ export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1
+ zip -r $OUTDIR/qt-win${BITS}-5.2.0-gitian-r1.zip *
+ unset LD_PRELOAD
+ unset FAKETIME
+ done # for BITS in
diff --git a/contrib/gitian-descriptors/qt-win32.yml b/contrib/gitian-descriptors/qt-win32.yml
deleted file mode 100644
index 8bc53bbf25..0000000000
--- a/contrib/gitian-descriptors/qt-win32.yml
+++ /dev/null
@@ -1,60 +0,0 @@
----
-name: "qt"
-suites:
-- "precise"
-architectures:
-- "amd64"
-packages:
-- "mingw-w64"
-- "g++-mingw-w64"
-- "zip"
-- "unzip"
-- "faketime"
-- "libz-dev"
-reference_datetime: "2011-01-30 00:00:00"
-remotes: []
-files:
-- "qt-everywhere-opensource-src-5.2.0.tar.gz"
-- "bitcoin-deps-win32-gitian-r10.zip"
-script: |
- #
- HOST=i686-w64-mingw32
- INSTDIR="$HOME/qt/"
- # Integrity Check
- echo "395ec72277c5786c65b8163ef5817fd03d0a1f524a6d47f53624baf8056f1081 qt-everywhere-opensource-src-5.2.0.tar.gz" | sha256sum -c
-
- mkdir $INSTDIR
- mkdir -p $INSTDIR/host/bin
- #
- # Need mingw-compiled openssl from bitcoin-deps:
- unzip bitcoin-deps-win32-gitian-r10.zip
- DEPSDIR=`pwd`
- #
- tar xzf qt-everywhere-opensource-src-5.2.0.tar.gz
- cd qt-everywhere-opensource-src-5.2.0
- SPECNAME="win32-g++"
- SPECFILE="qtbase/mkspecs/${SPECNAME}/qmake.conf"
- sed 's/$TODAY/2011-01-30/' -i configure
- sed --posix "s|QMAKE_CFLAGS = -pipe -fno-keep-inline-dllexport|QMAKE_CFLAGS\t\t= -pipe -fno-keep-inline-dllexport -isystem /usr/$HOST/include/ -frandom-seed=qtbuild -I$DEPSDIR/include|" -i ${SPECFILE}
- sed --posix "s|QMAKE_LFLAGS =|QMAKE_LFLAGS\t\t= -L$DEPSDIR/lib|" -i ${SPECFILE}
- # ar adds timestamps to every object file included in the static library
- # providing -D as ar argument is supposed to solve it, but doesn't work as qmake strips off the arguments and adds -M to pass a script...
- # which somehow cannot be combined with other flags.
- # use faketime only for ar, as it confuses make/qmake into hanging sometimes
- sed --posix "s|QMAKE_LIB = \\\$\\\${CROSS_COMPILE}ar -ru|QMAKE_LIB\t\t= $HOME/ar -Dr|" -i ${SPECFILE}
- echo '#!/bin/bash' > $HOME/ar
- echo 'export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1' >> $HOME/ar
- echo "$HOST-ar \"\$@\"" >> $HOME/ar
- chmod +x $HOME/ar
- #export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1
- export FAKETIME=$REFERENCE_DATETIME
- export TZ=UTC
- #
- # Compile static libraries, and use statically linked openssl (-openssl-linked):
- OPENSSL_LIBS="-L$DEPSDIR/lib -lssl -lcrypto -lgdi32" ./configure -prefix $INSTDIR -bindir $INSTDIR/host/bin -confirm-license -release -opensource -static -xplatform $SPECNAME -device-option CROSS_COMPILE="$HOST-" -no-audio-backend -no-javascript-jit -no-sql-sqlite -no-sql-odbc -no-nis -no-cups -no-iconv -no-dbus -no-gif -no-opengl -no-compile-examples -no-feature-style-windowsce -no-feature-style-windowsmobile -no-qml-debug -openssl-linked -skip qtsvg -skip qtwebkit -skip qtwebkit-examples -skip qtserialport -skip qtdeclarative -skip qtmultimedia -skip qtimageformats -skip qtlocation -skip qtsensors -skip qtquick1 -skip qtquickcontrols -skip qtactiveqt -skip qtconnectivity -skip qtwinextras -skip qtxmlpatterns -skip qtscript -skip qtdoc -system-libpng -system-zlib
- make $MAKEOPTS install
- cd $INSTDIR
-
- # as zip stores file timestamps, use faketime to intercept stat calls to set dates for all files to reference date
- export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1
- zip -r $OUTDIR/qt-win32-5.2.0-gitian-r1.zip *
diff --git a/contrib/linearize/example-linearize.cfg b/contrib/linearize/example-linearize.cfg
index 9e5aa404c2..65bba712a5 100644
--- a/contrib/linearize/example-linearize.cfg
+++ b/contrib/linearize/example-linearize.cfg
@@ -7,6 +7,6 @@ port=8332
# bootstrap.dat settings
netmagic=f9beb4d9
-max_height=250000
+max_height=279000
output=bootstrap.dat
diff --git a/contrib/linearize/linearize.py b/contrib/linearize/linearize.py
index 12049100dc..ea3814ab72 100644
--- a/contrib/linearize/linearize.py
+++ b/contrib/linearize/linearize.py
@@ -117,7 +117,7 @@ if __name__ == '__main__':
if 'min_height' not in settings:
settings['min_height'] = 0
if 'max_height' not in settings:
- settings['max_height'] = 250000
+ settings['max_height'] = 279000
if 'rpcuser' not in settings or 'rpcpass' not in settings:
print "Missing username and/or password in cfg file"
sys.exit(1)
diff --git a/doc/build-osx.md b/doc/build-osx.md
index 381e8b6f0a..dd343dca5f 100644
--- a/doc/build-osx.md
+++ b/doc/build-osx.md
@@ -5,7 +5,7 @@ This guide will show you how to build bitcoind(headless client) for OSX.
Notes
-----
-* Tested on OS X 10.5 through 10.8 on Intel processors only. PPC is not
+* Tested on OS X 10.5 through 10.9 on Intel processors only. PPC is not
supported because it is big-endian.
* All of the commands should be executed in a Terminal application. The
built-in one is located in `/Applications/Utilities`.
@@ -27,7 +27,7 @@ not, it's the path of least resistance to install [Github for Mac](https://mac.g
[Git for OS X](https://code.google.com/p/git-osx-installer/). It is also
available via Homebrew or MacPorts.
-You will also need to install [Homebrew](http://mxcl.github.io/homebrew/)
+You will also need to install [Homebrew](http://brew.sh)
or [MacPorts](https://www.macports.org/) in order to install library
dependencies. It's largely a religious decision which to choose, but, as of
December 2012, MacPorts is a little easier because you can just install the
@@ -64,20 +64,20 @@ Installing the dependencies using MacPorts is very straightforward.
make check
-Instructions: HomeBrew
+Instructions: Homebrew
----------------------
#### Install dependencies using Homebrew
- brew install boost miniupnpc openssl berkeley-db4
+ brew install autoconf automake berkeley-db4 boost miniupnpc openssl pkg-config protobuf
-Note: After you have installed the dependencies, you should check that the Brew installed version of OpenSSL is the one available for compilation. You can check this by typing
+Note: After you have installed the dependencies, you should check that the Homebrew installed version of OpenSSL is the one available for compilation. You can check this by typing
openssl version
-into Terminal. You should see OpenSSL 1.0.1e 11 Feb 2013.
+into Terminal. You should see OpenSSL 1.0.1f 6 Jan 2014.
-If not, you can ensure that the Brew OpenSSL is correctly linked by running
+If not, you can ensure that the Homebrew OpenSSL is correctly linked by running
brew link openssl --force
diff --git a/doc/build-unix.md b/doc/build-unix.md
index 5124205a34..d3a0536b10 100644
--- a/doc/build-unix.md
+++ b/doc/build-unix.md
@@ -87,12 +87,18 @@ Dependencies for the GUI: Ubuntu & Debian
-----------------------------------------
If you want to build Bitcoin-Qt, make sure that the required packages for Qt development
-are installed. Qt 4 is currently necessary to build the GUI.
+are installed. Either Qt 4 or Qt 5 are necessary to build the GUI.
+If both Qt 4 and Qt 5 are installed, Qt 4 will be used. Pass `--with-gui=qt5` to configure to choose Qt5.
+To build without GUI pass `--without-gui`.
To build with Qt 4 you need the following:
apt-get install libqt4-dev libprotobuf-dev protobuf-compiler
+For Qt 5 you need the following:
+
+ apt-get install libqt5gui5 libqt5core5 libqt5dbus5 qttools5-dev-tools libprotobuf-dev
+
libqrencode (optional) can be installed with:
apt-get install libqrencode-dev
diff --git a/doc/release-process.md b/doc/release-process.md
index 4281936819..aadacf05f8 100644
--- a/doc/release-process.md
+++ b/doc/release-process.md
@@ -51,16 +51,18 @@ Release Process
wget 'https://download.qt-project.org/official_releases/qt/5.2/5.2.0/single/qt-everywhere-opensource-src-5.2.0.tar.gz'
wget 'https://protobuf.googlecode.com/files/protobuf-2.5.0.tar.bz2'
cd ..
+ ./bin/gbuild ../bitcoin/contrib/gitian-descriptors/boost-linux.yml
+ mv build/out/boost-*.zip inputs/
./bin/gbuild ../bitcoin/contrib/gitian-descriptors/deps-linux.yml
mv build/out/bitcoin-deps-*.zip inputs/
- ./bin/gbuild ../bitcoin/contrib/gitian-descriptors/boost-win32.yml
- mv build/out/boost-win32-*.zip inputs/
- ./bin/gbuild ../bitcoin/contrib/gitian-descriptors/deps-win32.yml
+ ./bin/gbuild ../bitcoin/contrib/gitian-descriptors/boost-win.yml
+ mv build/out/boost-*.zip inputs/
+ ./bin/gbuild ../bitcoin/contrib/gitian-descriptors/deps-win.yml
mv build/out/bitcoin-deps-*.zip inputs/
- ./bin/gbuild ../bitcoin/contrib/gitian-descriptors/qt-win32.yml
- mv build/out/qt-win32-*.zip inputs/
- ./bin/gbuild ../bitcoin/contrib/gitian-descriptors/protobuf-win32.yml
- mv build/out/protobuf-win32-*.zip inputs/
+ ./bin/gbuild ../bitcoin/contrib/gitian-descriptors/qt-win.yml
+ mv build/out/qt-*.zip inputs/
+ ./bin/gbuild ../bitcoin/contrib/gitian-descriptors/protobuf-win.yml
+ mv build/out/protobuf-*.zip inputs/
Build bitcoind and bitcoin-qt on Linux32, Linux64, and Win32:
@@ -70,19 +72,19 @@ Release Process
zip -r bitcoin-${VERSION}-linux-gitian.zip *
mv bitcoin-${VERSION}-linux-gitian.zip ../../../
popd
- ./bin/gbuild --commit bitcoin=v${VERSION} ../bitcoin/contrib/gitian-descriptors/gitian-win32.yml
- ./bin/gsign --signer $SIGNER --release ${VERSION}-win32 --destination ../gitian.sigs/ ../bitcoin/contrib/gitian-descriptors/gitian-win32.yml
+ ./bin/gbuild --commit bitcoin=v${VERSION} ../bitcoin/contrib/gitian-descriptors/gitian-win.yml
+ ./bin/gsign --signer $SIGNER --release ${VERSION}-win --destination ../gitian.sigs/ ../bitcoin/contrib/gitian-descriptors/gitian-win.yml
pushd build/out
- zip -r bitcoin-${VERSION}-win32-gitian.zip *
- mv bitcoin-${VERSION}-win32-gitian.zip ../../../
+ zip -r bitcoin-${VERSION}-win-gitian.zip *
+ mv bitcoin-${VERSION}-win-gitian.zip ../../../
popd
popd
Build output expected:
1. linux 32-bit and 64-bit binaries + source (bitcoin-${VERSION}-linux-gitian.zip)
- 2. windows 32-bit binary, installer + source (bitcoin-${VERSION}-win32-gitian.zip)
- 3. Gitian signatures (in gitian.sigs/${VERSION}[-win32]/(your gitian key)/
+ 2. windows 32-bit and 64-bit binaries + installer + source (bitcoin-${VERSION}-win-gitian.zip)
+ 3. Gitian signatures (in gitian.sigs/${VERSION}[-win]/(your gitian key)/
repackage gitian builds for release as stand-alone zip/tar/installer exe
@@ -94,10 +96,10 @@ repackage gitian builds for release as stand-alone zip/tar/installer exe
**Windows .zip and setup.exe:**
- unzip bitcoin-${VERSION}-win32-gitian.zip -d bitcoin-${VERSION}-win32
- mv bitcoin-${VERSION}-win32/bitcoin-*-setup.exe .
- zip -r bitcoin-${VERSION}-win32.zip bitcoin-${VERSION}-win32
- rm -rf bitcoin-${VERSION}-win32
+ unzip bitcoin-${VERSION}-win-gitian.zip -d bitcoin-${VERSION}-win
+ mv bitcoin-${VERSION}-win/bitcoin-*-setup.exe .
+ zip -r bitcoin-${VERSION}-win.zip bitcoin-${VERSION}-win
+ rm -rf bitcoin-${VERSION}-win
**Perform Mac build:**
@@ -136,7 +138,7 @@ Commit your signature to gitian.sigs:
pushd gitian.sigs
git add ${VERSION}/${SIGNER}
- git add ${VERSION}-win32/${SIGNER}
+ git add ${VERSION}-win/${SIGNER}
git commit -a
git push # Assuming you can push to the gitian.sigs tree
popd
@@ -160,17 +162,17 @@ From a directory containing bitcoin source, gitian.sigs and gitian zips
zip -r bitcoin-${VERSION}-linux-gitian.zip *
cp bitcoin-${VERSION}-linux-gitian.zip ../
popd
- mkdir bitcoin-${VERSION}-win32-gitian
- pushd bitcoin-${VERSION}-win32-gitian
- unzip ../bitcoin-${VERSION}-win32-gitian.zip
+ mkdir bitcoin-${VERSION}-win-gitian
+ pushd bitcoin-${VERSION}-win-gitian
+ unzip ../bitcoin-${VERSION}-win-gitian.zip
mkdir gitian
cp ../bitcoin/contrib/gitian-downloader/*.pgp ./gitian/
- for signer in $(ls ../gitian.sigs/${VERSION}-win32/); do
- cp ../gitian.sigs/${VERSION}-win32/${signer}/bitcoin-build.assert ./gitian/${signer}-build.assert
- cp ../gitian.sigs/${VERSION}-win32/${signer}/bitcoin-build.assert.sig ./gitian/${signer}-build.assert.sig
+ for signer in $(ls ../gitian.sigs/${VERSION}-win/); do
+ cp ../gitian.sigs/${VERSION}-win/${signer}/bitcoin-build.assert ./gitian/${signer}-build.assert
+ cp ../gitian.sigs/${VERSION}-win/${signer}/bitcoin-build.assert.sig ./gitian/${signer}-build.assert.sig
done
- zip -r bitcoin-${VERSION}-win32-gitian.zip *
- cp bitcoin-${VERSION}-win32-gitian.zip ../
+ zip -r bitcoin-${VERSION}-win-gitian.zip *
+ cp bitcoin-${VERSION}-win-gitian.zip ../
popd
- Upload gitian zips to SourceForge
diff --git a/share/setup.nsi.in b/share/setup.nsi.in
index dd37862382..6c0e895bb1 100644
--- a/share/setup.nsi.in
+++ b/share/setup.nsi.in
@@ -1,4 +1,4 @@
-Name @PACKAGE_NAME@
+Name "@PACKAGE_NAME@ (@WINDOWS_BITS@-bit)"
RequestExecutionLevel highest
SetCompressor /SOLID lzma
@@ -6,7 +6,7 @@ SetCompressor /SOLID lzma
# General Symbol Definitions
!define REGKEY "SOFTWARE\$(^Name)"
!define VERSION @CLIENT_VERSION_MAJOR@.@CLIENT_VERSION_MINOR@.@CLIENT_VERSION_REVISION@
-!define COMPANY "Bitcoin project"
+!define COMPANY "Bitcoin Core project"
!define URL http://www.bitcoin.org/
# MUI Symbol Definitions
@@ -19,7 +19,7 @@ SetCompressor /SOLID lzma
!define MUI_STARTMENUPAGE_REGISTRY_ROOT HKLM
!define MUI_STARTMENUPAGE_REGISTRY_KEY ${REGKEY}
!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME StartMenuGroup
-!define MUI_STARTMENUPAGE_DEFAULTFOLDER @PACKAGE_NAME@
+!define MUI_STARTMENUPAGE_DEFAULTFOLDER "@PACKAGE_NAME@"
!define MUI_FINISHPAGE_RUN $INSTDIR\bitcoin-qt.exe
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"
!define MUI_UNWELCOMEFINISHPAGE_BITMAP "@abs_top_srcdir@/share/pixmaps/nsis-wizard.bmp"
@@ -28,6 +28,9 @@ SetCompressor /SOLID lzma
# Included files
!include Sections.nsh
!include MUI2.nsh
+!if "@WINDOWS_BITS@" == "64"
+!include x64.nsh
+!endif
# Variables
Var StartMenuGroup
@@ -45,14 +48,18 @@ Var StartMenuGroup
!insertmacro MUI_LANGUAGE English
# Installer attributes
-OutFile @abs_top_srcdir@/bitcoin-${VERSION}-win32-setup.exe
+OutFile @abs_top_srcdir@/bitcoin-${VERSION}-win@WINDOWS_BITS@-setup.exe
+!if "@WINDOWS_BITS@" == "64"
+InstallDir $PROGRAMFILES64\Bitcoin
+!else
InstallDir $PROGRAMFILES\Bitcoin
+!endif
CRCCheck on
XPStyle on
BrandingText " "
ShowInstDetails show
VIProductVersion ${VERSION}.@CLIENT_VERSION_BUILD@
-VIAddVersionKey ProductName Bitcoin
+VIAddVersionKey ProductName "Bitcoin Core"
VIAddVersionKey ProductVersion "${VERSION}"
VIAddVersionKey CompanyName "${COMPANY}"
VIAddVersionKey CompanyWebsite "${URL}"
@@ -71,8 +78,9 @@ Section -Main SEC0000
File /oname=readme.txt @abs_top_srcdir@/doc/README_windows.txt
SetOutPath $INSTDIR\daemon
File @abs_top_srcdir@/release/bitcoind.exe
- SetOutPath $INSTDIR\src
- File /r @abs_top_srcdir@/@PACKAGE@-@VERSION@/src\*.*
+ File @abs_top_srcdir@/release/bitcoin-cli.exe
+ SetOutPath $INSTDIR\doc
+ File /r @abs_top_srcdir@/doc\*.*
SetOutPath $INSTDIR
WriteRegStr HKCU "${REGKEY}\Components" Main 1
@@ -87,8 +95,8 @@ Section -post SEC0001
WriteUninstaller $INSTDIR\uninstall.exe
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
CreateDirectory $SMPROGRAMS\$StartMenuGroup
- CreateShortcut "$SMPROGRAMS\$StartMenuGroup\Bitcoin.lnk" $INSTDIR\bitcoin-qt.exe
- CreateShortcut "$SMPROGRAMS\$StartMenuGroup\Uninstall Bitcoin.lnk" $INSTDIR\uninstall.exe
+ CreateShortcut "$SMPROGRAMS\$StartMenuGroup\$(^Name).lnk" $INSTDIR\bitcoin-qt.exe
+ CreateShortcut "$SMPROGRAMS\$StartMenuGroup\Uninstall $(^Name).lnk" $INSTDIR\uninstall.exe
!insertmacro MUI_STARTMENU_WRITE_END
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" DisplayName "$(^Name)"
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" DisplayVersion "${VERSION}"
@@ -123,14 +131,14 @@ Section /o -un.Main UNSEC0000
Delete /REBOOTOK $INSTDIR\COPYING.txt
Delete /REBOOTOK $INSTDIR\readme.txt
RMDir /r /REBOOTOK $INSTDIR\daemon
- RMDir /r /REBOOTOK $INSTDIR\src
+ RMDir /r /REBOOTOK $INSTDIR\doc
DeleteRegValue HKCU "${REGKEY}\Components" Main
SectionEnd
Section -un.post UNSEC0001
DeleteRegKey HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)"
- Delete /REBOOTOK "$SMPROGRAMS\$StartMenuGroup\Uninstall Bitcoin.lnk"
- Delete /REBOOTOK "$SMPROGRAMS\$StartMenuGroup\Bitcoin.lnk"
+ Delete /REBOOTOK "$SMPROGRAMS\$StartMenuGroup\Uninstall $(^Name).lnk"
+ Delete /REBOOTOK "$SMPROGRAMS\$StartMenuGroup\$(^Name).lnk"
Delete /REBOOTOK "$SMSTARTUP\Bitcoin.lnk"
Delete /REBOOTOK $INSTDIR\uninstall.exe
Delete /REBOOTOK $INSTDIR\debug.log
@@ -152,6 +160,15 @@ SectionEnd
# Installer functions
Function .onInit
InitPluginsDir
+!if "@WINDOWS_BITS@" == "64"
+ ${If} ${RunningX64}
+ ; disable registry redirection (enable access to 64-bit portion of registry)
+ SetRegView 64
+ ${Else}
+ MessageBox MB_OK|MB_ICONSTOP "Cannot install 64-bit version on a 32-bit system."
+ Abort
+ ${EndIf}
+!endif
FunctionEnd
# Uninstaller functions
diff --git a/src/Makefile.am b/src/Makefile.am
index 9917be2481..f27f16ab91 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,7 +1,6 @@
include Makefile.include
-AM_CPPFLAGS += -I$(top_srcdir)/src/leveldb/helpers/memenv \
- -I$(builddir)
+AM_CPPFLAGS += -I$(builddir)
noinst_LIBRARIES = \
libbitcoin_server.a \
@@ -11,7 +10,15 @@ if ENABLE_WALLET
noinst_LIBRARIES += libbitcoin_wallet.a
endif
-bin_PROGRAMS = bitcoind bitcoin-cli
+bin_PROGRAMS =
+
+if BUILD_BITCOIND
+ bin_PROGRAMS += bitcoind
+endif
+
+if BUILD_BITCOIN_CLI
+ bin_PROGRAMS += bitcoin-cli
+endif
SUBDIRS = . $(BUILD_QT) $(BUILD_TEST)
DIST_SUBDIRS = . qt test
@@ -140,8 +147,8 @@ bitcoind_LDADD = \
libbitcoin_server.a \
libbitcoin_cli.a \
libbitcoin_common.a \
- leveldb/libleveldb.a \
- leveldb/libmemenv.a
+ $(LIBLEVELDB) \
+ $(LIBMEMENV)
if ENABLE_WALLET
bitcoind_LDADD += libbitcoin_wallet.a
endif
@@ -167,6 +174,7 @@ if TARGET_WINDOWS
bitcoin_cli_SOURCES += bitcoin-cli-res.rc
endif
+# NOTE: This dependency is not strictly necessary, but without it make may try to build both in parallel, which breaks the LevelDB build system in a race
leveldb/libleveldb.a: leveldb/libmemenv.a
leveldb/%.a:
diff --git a/src/Makefile.include b/src/Makefile.include
index b9e6c262ca..01b47d1aa0 100644
--- a/src/Makefile.include
+++ b/src/Makefile.include
@@ -1,23 +1,30 @@
+if EMBEDDED_LEVELDB
+LEVELDB_CPPFLAGS += -I$(top_srcdir)/src/leveldb/include
+LEVELDB_CPPFLAGS += -I$(top_srcdir)/src/leveldb/helpers/memenv
+LIBLEVELDB += $(top_builddir)/src/leveldb/libleveldb.a
+LIBMEMENV += $(top_builddir)/src/leveldb/libmemenv.a
+endif
+
AM_CPPFLAGS = $(INCLUDES) \
-I$(top_builddir)/src/obj \
- -I$(top_srcdir)/src/leveldb/include \
$(BDB_CPPFLAGS) \
- $(BOOST_INCLUDES)
+ $(BOOST_CPPFLAGS) $(BOOST_INCLUDES)
+AM_CPPFLAGS += $(LEVELDB_CPPFLAGS)
AM_LDFLAGS = $(PTHREAD_CFLAGS)
LIBBITCOIN_SERVER=$(top_builddir)/src/libbitcoin_server.a
LIBBITCOIN_WALLET=$(top_builddir)/src/libbitcoin_wallet.a
LIBBITCOIN_COMMON=$(top_builddir)/src/libbitcoin_common.a
LIBBITCOIN_CLI=$(top_builddir)/src/libbitcoin_cli.a
-LIBLEVELDB=$(top_builddir)/src/leveldb/libleveldb.a
-LIBMEMENV=$(top_builddir)/src/leveldb/libmemenv.a
LIBBITCOINQT=$(top_builddir)/src/qt/libbitcoinqt.a
$(LIBBITCOIN):
$(MAKE) -C $(top_builddir)/src $(@F)
+if EMBEDDED_LEVELDB
$(LIBLEVELDB) $(LIBMEMENV):
$(MAKE) -C $(top_builddir)/src leveldb/$(@F)
+endif
$(LIBBITCOINQT):
$(MAKE) -C $(top_builddir)/src/qt $(@F)
diff --git a/src/checkpoints.cpp b/src/checkpoints.cpp
index 40dd30d1a4..9db1f5e100 100644
--- a/src/checkpoints.cpp
+++ b/src/checkpoints.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2009-2013 The Bitcoin developers
+// Copyright (c) 2009-2014 The Bitcoin developers
// Distributed under the MIT/X11 software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
@@ -50,11 +50,12 @@ namespace Checkpoints
(216116, uint256("0x00000000000001b4f4b433e81ee46494af945cf96014816a4e2370f11b23df4e"))
(225430, uint256("0x00000000000001c108384350f74090433e7fcf79a606b8e797f065b130575932"))
(250000, uint256("0x000000000000003887df1f29024b06fc2200b55f8af8f35453d7be294df2d214"))
+ (279000, uint256("0x0000000000000001ae8c72a0b0c301f67e3afca10e819efa9041e458e9bd7e40"))
;
static const CCheckpointData data = {
&mapCheckpoints,
- 1375533383, // * UNIX timestamp of last checkpoint block
- 21491097, // * total number of transactions between genesis and last checkpoint
+ 1389047471, // * UNIX timestamp of last checkpoint block
+ 30549816, // * total number of transactions between genesis and last checkpoint
// (the tx=... number in the SetBestChain debug.log lines)
60000.0 // * estimated number of transactions per day after checkpoint
};
@@ -111,7 +112,7 @@ namespace Checkpoints
double fWorkBefore = 0.0; // Amount of work done before pindex
double fWorkAfter = 0.0; // Amount of work left after pindex (estimated)
- // Work is defined as: 1.0 per transaction before the last checkoint, and
+ // Work is defined as: 1.0 per transaction before the last checkpoint, and
// fSigcheckVerificationFactor per transaction after.
const CCheckpointData &data = Checkpoints();
diff --git a/src/leveldb/db/filename.cc b/src/leveldb/db/filename.cc
index da32946d99..27d750697b 100644
--- a/src/leveldb/db/filename.cc
+++ b/src/leveldb/db/filename.cc
@@ -29,14 +29,19 @@ std::string LogFileName(const std::string& name, uint64_t number) {
return MakeFileName(name, number, "log");
}
+// TableFileName returns the filenames we usually write to, while
+// SSTTableFileName returns the alternative filenames we also try to read from
+// for backward compatibility. For now, swap them around.
+// TODO: when compatibility is no longer necessary, swap them back
+// (TableFileName to use "ldb" and SSTTableFileName to use "sst").
std::string TableFileName(const std::string& name, uint64_t number) {
assert(number > 0);
- return MakeFileName(name, number, "ldb");
+ return MakeFileName(name, number, "sst");
}
std::string SSTTableFileName(const std::string& name, uint64_t number) {
assert(number > 0);
- return MakeFileName(name, number, "sst");
+ return MakeFileName(name, number, "ldb");
}
std::string DescriptorFileName(const std::string& dbname, uint64_t number) {
diff --git a/src/m4/bitcoin_qt.m4 b/src/m4/bitcoin_qt.m4
index 758aea3499..5ed9692186 100644
--- a/src/m4/bitcoin_qt.m4
+++ b/src/m4/bitcoin_qt.m4
@@ -22,7 +22,7 @@ AC_DEFUN([BITCOIN_QT_CHECK],[
])
dnl BITCOIN_QT_PATH_PROGS([FOO], [foo foo2], [/path/to/search/first], [continue if missing])
-dnl Helper for finding the path of programs needed for QT.
+dnl Helper for finding the path of programs needed for Qt.
dnl Inputs: $1: Variable to be set
dnl Inputs: $2: List of programs to search for
dnl Inputs: $3: Look for $2 here before $PATH
@@ -47,9 +47,9 @@ dnl input variables are set correctly.
dnl CAUTION: Do not use this inside of a conditional.
AC_DEFUN([BITCOIN_QT_INIT],[
dnl enable qt support
- AC_ARG_WITH([qt],
- [AS_HELP_STRING([--with-qt],
- [with qt (no|qt4|qt5|auto. default is auto, qt4 tried first.)])],
+ AC_ARG_WITH([gui],
+ [AS_HELP_STRING([--with-gui],
+ [with GUI (no|qt4|qt5|auto. default is auto, qt4 tried first.)])],
[
bitcoin_qt_want_version=$withval
if test x$bitcoin_qt_want_version = xyes; then
@@ -59,10 +59,10 @@ AC_DEFUN([BITCOIN_QT_INIT],[
],
[bitcoin_qt_want_version=auto])
- AC_ARG_WITH([qt-incdir],[AS_HELP_STRING([--with-qt-incdir=INC_DIR],[specify qt include path (overridden by pkgconfig)])], [qt_include_path=$withval], [])
- AC_ARG_WITH([qt-libdir],[AS_HELP_STRING([--with-qt-libdir=LIB_DIR],[specify qt lib path (overridden by pkgconfig)])], [qt_lib_path=$withval], [])
- AC_ARG_WITH([qt-plugindir],[AS_HELP_STRING([--with-qt-plugindir=PLUGIN_DIR],[specify qt plugin path (overridden by pkgconfig)])], [qt_plugin_path=$withval], [])
- AC_ARG_WITH([qt-bindir],[AS_HELP_STRING([--with-qt-bindir=BIN_DIR],[specify qt bin path])], [qt_bin_path=$withval], [])
+ AC_ARG_WITH([qt-incdir],[AS_HELP_STRING([--with-gui-incdir=INC_DIR],[specify qt include path (overridden by pkgconfig)])], [qt_include_path=$withval], [])
+ AC_ARG_WITH([qt-libdir],[AS_HELP_STRING([--with-gui-libdir=LIB_DIR],[specify qt lib path (overridden by pkgconfig)])], [qt_lib_path=$withval], [])
+ AC_ARG_WITH([qt-plugindir],[AS_HELP_STRING([--with-gui-plugindir=PLUGIN_DIR],[specify qt plugin path (overridden by pkgconfig)])], [qt_plugin_path=$withval], [])
+ AC_ARG_WITH([qt-bindir],[AS_HELP_STRING([--with-gui-bindir=BIN_DIR],[specify qt bin path])], [qt_bin_path=$withval], [])
AC_ARG_WITH([qtdbus],
[AS_HELP_STRING([--with-qtdbus],
@@ -73,7 +73,7 @@ AC_DEFUN([BITCOIN_QT_INIT],[
dnl Find the appropriate version of Qt libraries and includes.
dnl Inputs: $1: Whether or not pkg-config should be used. yes|no. Default: yes.
-dnl Inputs: $2: If $1 is "yes" and --with-qt=auto, which qt version should be
+dnl Inputs: $2: If $1 is "yes" and --with-gui=auto, which qt version should be
dnl tried first.
dnl Outputs: See _BITCOIN_QT_FIND_LIBS_*
dnl Outputs: Sets variables for all qt-related tools.
@@ -113,7 +113,7 @@ AC_DEFUN([BITCOIN_QT_CONFIGURE],[
dnl enable qt support
- AC_MSG_CHECKING(if QT should be enabled)
+ AC_MSG_CHECKING(whether to build Bitcoin Core GUI)
BITCOIN_QT_CHECK([
bitcoin_enable_qt=yes
bitcoin_enable_qt_test=yes
@@ -149,11 +149,11 @@ dnl All macros below are internal and should _not_ be used from the main
dnl configure.ac.
dnl ----
-dnl Internal. Check if the included version of QT is Qt5.
+dnl Internal. Check if the included version of Qt is Qt5.
dnl Requires: INCLUDES must be populated as necessary.
dnl Output: bitcoin_cv_qt5=yes|no
AC_DEFUN([_BITCOIN_QT_CHECK_QT5],[
- AC_CACHE_CHECK(for QT 5, bitcoin_cv_qt5,[
+ AC_CACHE_CHECK(for Qt 5, bitcoin_cv_qt5,[
AC_TRY_COMPILE(
[#include <QtCore>],
[
@@ -167,13 +167,13 @@ AC_DEFUN([_BITCOIN_QT_CHECK_QT5],[
bitcoin_cv_qt5=no)
])])
-dnl Internal. Check if the linked version of QT was built as static libs.
+dnl Internal. Check if the linked version of Qt was built as static libs.
dnl Requires: Qt5. This check cannot determine if Qt4 is static.
dnl Requires: INCLUDES and LIBS must be populated as necessary.
dnl Output: bitcoin_cv_static_qt=yes|no
dnl Output: Defines QT_STATICPLUGIN if plugins are static.
AC_DEFUN([_BITCOIN_QT_IS_STATIC],[
- AC_CACHE_CHECK(for static QT, bitcoin_cv_static_qt,[
+ AC_CACHE_CHECK(for static Qt, bitcoin_cv_static_qt,[
AC_TRY_COMPILE(
[#include <QtCore>],
[
@@ -187,7 +187,7 @@ AC_DEFUN([_BITCOIN_QT_IS_STATIC],[
[bitcoin_cv_static_qt=no])
])
if test xbitcoin_cv_static_qt = xyes; then
- AC_DEFINE(QT_STATICPLUGIN, 1, [Define this symbol for static QT plugins])
+ AC_DEFINE(QT_STATICPLUGIN, 1, [Define this symbol for static Qt plugins])
fi
])
@@ -197,7 +197,7 @@ dnl Inputs: $1: A series of Q_IMPORT_PLUGIN().
dnl Inputs: $2: The libraries that resolve $1.
dnl Output: QT_LIBS is prepended or configure exits.
AC_DEFUN([_BITCOIN_QT_CHECK_STATIC_PLUGINS],[
- AC_MSG_CHECKING(for static QT plugins: $2)
+ AC_MSG_CHECKING(for static Qt plugins: $2)
CHECK_STATIC_PLUGINS_TEMP_LIBS="$LIBS"
LIBS="$2 $QT_LIBS $LIBS"
AC_TRY_LINK([
@@ -211,7 +211,7 @@ AC_DEFUN([_BITCOIN_QT_CHECK_STATIC_PLUGINS],[
])
dnl Internal. Find Qt libraries using pkg-config.
-dnl Inputs: bitcoin_qt_want_version (from --with-qt=). The version to check
+dnl Inputs: bitcoin_qt_want_version (from --with-gui=). The version to check
dnl first.
dnl Inputs: $1: If bitcoin_qt_want_version is "auto", check for this version
dnl first.
@@ -265,7 +265,7 @@ AC_DEFUN([_BITCOIN_QT_FIND_LIBS_WITH_PKGCONFIG],[
dnl Internal. Find Qt libraries without using pkg-config. Version is deduced
dnl from the discovered headers.
-dnl Inputs: bitcoin_qt_want_version (from --with-qt=). The version to use.
+dnl Inputs: bitcoin_qt_want_version (from --with-gui=). The version to use.
dnl If "auto", the version will be discovered by _BITCOIN_QT_CHECK_QT5.
dnl Outputs: All necessary QT_* variables are set.
dnl Outputs: bitcoin_qt_got_major_vers is set to "4" or "5".
diff --git a/src/main.cpp b/src/main.cpp
index 9c6c1ba0c3..3ff1fd3a91 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -883,11 +883,11 @@ bool GetTransaction(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock
fseek(file, postx.nTxOffset, SEEK_CUR);
file >> txOut;
} catch (std::exception &e) {
- return error("%s() : deserialize or I/O error", __PRETTY_FUNCTION__);
+ return error("%s : Deserialize or I/O error - %s", __PRETTY_FUNCTION__, e.what());
}
hashBlock = header.GetHash();
if (txOut.GetHash() != hash)
- return error("%s() : txid mismatch", __PRETTY_FUNCTION__);
+ return error("%s : txid mismatch", __PRETTY_FUNCTION__);
return true;
}
}
@@ -936,7 +936,7 @@ bool WriteBlockToDisk(CBlock& block, CDiskBlockPos& pos)
// Open history file to append
CAutoFile fileout = CAutoFile(OpenBlockFile(pos), SER_DISK, CLIENT_VERSION);
if (!fileout)
- return error("WriteBlockToDisk() : OpenBlockFile failed");
+ return error("WriteBlockToDisk : OpenBlockFile failed");
// Write index header
unsigned int nSize = fileout.GetSerializeSize(block);
@@ -945,7 +945,7 @@ bool WriteBlockToDisk(CBlock& block, CDiskBlockPos& pos)
// Write block
long fileOutPos = ftell(fileout);
if (fileOutPos < 0)
- return error("WriteBlockToDisk() : ftell failed");
+ return error("WriteBlockToDisk : ftell failed");
pos.nPos = (unsigned int)fileOutPos;
fileout << block;
@@ -964,19 +964,19 @@ bool ReadBlockFromDisk(CBlock& block, const CDiskBlockPos& pos)
// Open history file to read
CAutoFile filein = CAutoFile(OpenBlockFile(pos, true), SER_DISK, CLIENT_VERSION);
if (!filein)
- return error("ReadBlockFromDisk(CBlock&, CDiskBlockPos&) : OpenBlockFile failed");
+ return error("ReadBlockFromDisk : OpenBlockFile failed");
// Read block
try {
filein >> block;
}
catch (std::exception &e) {
- return error("%s() : deserialize or I/O error", __PRETTY_FUNCTION__);
+ return error("%s : Deserialize or I/O error - %s", __PRETTY_FUNCTION__, e.what());
}
// Check the header
if (!CheckProofOfWork(block.GetHash(), block.nBits))
- return error("ReadBlockFromDisk(CBlock&, CDiskBlockPos&) : errors in block header");
+ return error("ReadBlockFromDisk : Errors in block header");
return true;
}
@@ -2876,7 +2876,7 @@ bool LoadExternalBlockFile(FILE* fileIn, CDiskBlockPos *dbp)
break;
}
} catch (std::exception &e) {
- LogPrintf("%s() : Deserialize or I/O error caught during load\n", __PRETTY_FUNCTION__);
+ LogPrintf("%s : Deserialize or I/O error - %s", __PRETTY_FUNCTION__, e.what());
}
}
fclose(fileIn);
diff --git a/src/main.h b/src/main.h
index f3f9acb639..60e733b23a 100644
--- a/src/main.h
+++ b/src/main.h
@@ -336,7 +336,7 @@ public:
// Open history file to append
CAutoFile fileout = CAutoFile(OpenUndoFile(pos), SER_DISK, CLIENT_VERSION);
if (!fileout)
- return error("CBlockUndo::WriteToDisk() : OpenUndoFile failed");
+ return error("CBlockUndo::WriteToDisk : OpenUndoFile failed");
// Write index header
unsigned int nSize = fileout.GetSerializeSize(*this);
@@ -345,7 +345,7 @@ public:
// Write undo data
long fileOutPos = ftell(fileout);
if (fileOutPos < 0)
- return error("CBlockUndo::WriteToDisk() : ftell failed");
+ return error("CBlockUndo::WriteToDisk : ftell failed");
pos.nPos = (unsigned int)fileOutPos;
fileout << *this;
@@ -368,7 +368,7 @@ public:
// Open history file to read
CAutoFile filein = CAutoFile(OpenUndoFile(pos, true), SER_DISK, CLIENT_VERSION);
if (!filein)
- return error("CBlockUndo::ReadFromDisk() : OpenBlockFile failed");
+ return error("CBlockUndo::ReadFromDisk : OpenBlockFile failed");
// Read block
uint256 hashChecksum;
@@ -377,7 +377,7 @@ public:
filein >> hashChecksum;
}
catch (std::exception &e) {
- return error("%s() : deserialize or I/O error", __PRETTY_FUNCTION__);
+ return error("%s : Deserialize or I/O error - %s", __PRETTY_FUNCTION__, e.what());
}
// Verify checksum
@@ -385,7 +385,7 @@ public:
hasher << hashBlock;
hasher << *this;
if (hashChecksum != hasher.GetHash())
- return error("CBlockUndo::ReadFromDisk() : checksum mismatch");
+ return error("CBlockUndo::ReadFromDisk : Checksum mismatch");
return true;
}
diff --git a/src/qt/Makefile.am b/src/qt/Makefile.am
index 274cebcf3a..cac6039663 100644
--- a/src/qt/Makefile.am
+++ b/src/qt/Makefile.am
@@ -80,6 +80,7 @@ QT_FORMS_UI = \
forms/askpassphrasedialog.ui \
forms/coincontroldialog.ui \
forms/editaddressdialog.ui \
+ forms/helpmessagedialog.ui \
forms/intro.ui \
forms/openuridialog.ui \
forms/optionsdialog.ui \
@@ -93,7 +94,6 @@ QT_FORMS_UI = \
forms/transactiondescdialog.ui
QT_MOC_CPP = \
- moc_aboutdialog.cpp \
moc_addressbookpage.cpp \
moc_addresstablemodel.cpp \
moc_askpassphrasedialog.cpp \
@@ -133,6 +133,7 @@ QT_MOC_CPP = \
moc_transactionfilterproxy.cpp \
moc_transactiontablemodel.cpp \
moc_transactionview.cpp \
+ moc_utilitydialog.cpp \
moc_walletframe.cpp \
moc_walletmodel.cpp \
moc_walletview.cpp
@@ -155,7 +156,6 @@ PROTOBUF_H = paymentrequest.pb.h
PROTOBUF_PROTO = paymentrequest.proto
BITCOIN_QT_H = \
- aboutdialog.h \
addressbookpage.h \
addresstablemodel.h \
askpassphrasedialog.h \
@@ -198,6 +198,7 @@ BITCOIN_QT_H = \
transactionrecord.h \
transactiontablemodel.h \
transactionview.h \
+ utilitydialog.h \
walletframe.h \
walletmodel.h \
walletmodeltransaction.h \
@@ -248,7 +249,6 @@ RES_ICONS = \
res/icons/tx_mined.png
BITCOIN_QT_CPP = \
- aboutdialog.cpp \
bitcoin.cpp \
bitcoinaddressvalidator.cpp \
bitcoinamountfield.cpp \
@@ -267,7 +267,8 @@ BITCOIN_QT_CPP = \
rpcconsole.cpp \
signverifymessagedialog.cpp \
splashscreen.cpp \
- trafficgraphwidget.cpp
+ trafficgraphwidget.cpp \
+ utilitydialog.cpp
if ENABLE_WALLET
BITCOIN_QT_CPP += \
diff --git a/src/qt/aboutdialog.cpp b/src/qt/aboutdialog.cpp
deleted file mode 100644
index 6581a19c18..0000000000
--- a/src/qt/aboutdialog.cpp
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright (c) 2011-2013 The Bitcoin developers
-// Distributed under the MIT/X11 software license, see the accompanying
-// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-
-#include "aboutdialog.h"
-#include "ui_aboutdialog.h"
-
-#include "clientmodel.h"
-
-#include "clientversion.h"
-
-AboutDialog::AboutDialog(QWidget *parent) :
- QDialog(parent),
- ui(new Ui::AboutDialog)
-{
- ui->setupUi(this);
-
- // Set current copyright year
- ui->copyrightLabel->setText(tr("Copyright") + QString(" &copy; 2009-%1 ").arg(COPYRIGHT_YEAR) + tr("The Bitcoin Core developers"));
-}
-
-void AboutDialog::setModel(ClientModel *model)
-{
- if(model)
- {
- ui->versionLabel->setText(model->formatFullVersion());
- }
-}
-
-AboutDialog::~AboutDialog()
-{
- delete ui;
-}
-
-void AboutDialog::on_buttonBox_accepted()
-{
- close();
-}
diff --git a/src/qt/aboutdialog.h b/src/qt/aboutdialog.h
deleted file mode 100644
index 1b131c4dcc..0000000000
--- a/src/qt/aboutdialog.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright (c) 2011-2013 The Bitcoin developers
-// Distributed under the MIT/X11 software license, see the accompanying
-// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-
-#ifndef ABOUTDIALOG_H
-#define ABOUTDIALOG_H
-
-#include <QDialog>
-
-class ClientModel;
-
-namespace Ui {
- class AboutDialog;
-}
-
-/** "About" dialog box */
-class AboutDialog : public QDialog
-{
- Q_OBJECT
-
-public:
- explicit AboutDialog(QWidget *parent);
- ~AboutDialog();
-
- void setModel(ClientModel *model);
-
-private:
- Ui::AboutDialog *ui;
-
-private slots:
- void on_buttonBox_accepted();
-};
-
-#endif // ABOUTDIALOG_H
diff --git a/src/qt/bitcoin.cpp b/src/qt/bitcoin.cpp
index 9b0b1d6e43..4f5edefbb7 100644
--- a/src/qt/bitcoin.cpp
+++ b/src/qt/bitcoin.cpp
@@ -14,6 +14,7 @@
#include "intro.h"
#include "optionsmodel.h"
#include "splashscreen.h"
+#include "utilitydialog.h"
#ifdef ENABLE_WALLET
#include "paymentserver.h"
#include "walletmodel.h"
@@ -37,8 +38,6 @@
#include <QTimer>
#include <QTranslator>
#include <QThread>
-#include <QVBoxLayout>
-#include <QLabel>
#if defined(QT_STATICPLUGIN)
#include <QtPlugin>
@@ -364,17 +363,7 @@ void BitcoinApplication::requestShutdown()
clientModel = 0;
// Show a simple window indicating shutdown status
- QWidget *shutdownWindow = new QWidget();
- QVBoxLayout *layout = new QVBoxLayout();
- layout->addWidget(new QLabel(
- tr("Bitcoin Core is shutting down...") + "<br /><br />" +
- tr("Do not shut down the computer until this window disappears.")));
- shutdownWindow->setLayout(layout);
-
- // Center shutdown window at where main window was
- const QPoint global = window->mapToGlobal(window->rect().center());
- shutdownWindow->move(global.x() - shutdownWindow->width() / 2, global.y() - shutdownWindow->height() / 2);
- shutdownWindow->show();
+ ShutdownWindow::showShutdownWindow(window);
// Request shutdown from core thread
emit requestedShutdown();
@@ -511,7 +500,7 @@ int main(int argc, char *argv[])
// but before showing splash screen.
if (mapArgs.count("-?") || mapArgs.count("--help"))
{
- GUIUtil::HelpMessageBox help;
+ HelpMessageDialog help(NULL);
help.showOrPrint();
return 1;
}
diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp
index 692fb6dc1d..f548c65161 100644
--- a/src/qt/bitcoingui.cpp
+++ b/src/qt/bitcoingui.cpp
@@ -4,7 +4,6 @@
#include "bitcoingui.h"
-#include "aboutdialog.h"
#include "bitcoinunits.h"
#include "clientmodel.h"
#include "guiconstants.h"
@@ -14,6 +13,7 @@
#include "optionsdialog.h"
#include "optionsmodel.h"
#include "rpcconsole.h"
+#include "utilitydialog.h"
#ifdef ENABLE_WALLET
#include "walletframe.h"
#include "walletmodel.h"
@@ -308,11 +308,15 @@ void BitcoinGUI::createActions(bool fIsTestnet)
openAction = new QAction(QApplication::style()->standardIcon(QStyle::SP_FileIcon), tr("Open &URI..."), this);
openAction->setStatusTip(tr("Open a bitcoin: URI or payment request"));
+ showHelpMessageAction = new QAction(QApplication::style()->standardIcon(QStyle::SP_MessageBoxInformation), tr("&Command-line options"), this);
+ showHelpMessageAction->setStatusTip(tr("Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options"));
+
connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit()));
connect(aboutAction, SIGNAL(triggered()), this, SLOT(aboutClicked()));
connect(aboutQtAction, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
connect(optionsAction, SIGNAL(triggered()), this, SLOT(optionsClicked()));
connect(toggleHideAction, SIGNAL(triggered()), this, SLOT(toggleHidden()));
+ connect(showHelpMessageAction, SIGNAL(triggered()), this, SLOT(showHelpMessageClicked()));
#ifdef ENABLE_WALLET
if(walletFrame)
{
@@ -366,8 +370,9 @@ void BitcoinGUI::createMenuBar()
if(walletFrame)
{
help->addAction(openRPCConsoleAction);
- help->addSeparator();
}
+ help->addAction(showHelpMessageAction);
+ help->addSeparator();
help->addAction(aboutAction);
help->addAction(aboutQtAction);
}
@@ -546,6 +551,13 @@ void BitcoinGUI::aboutClicked()
dlg.exec();
}
+void BitcoinGUI::showHelpMessageClicked()
+{
+ HelpMessageDialog *help = new HelpMessageDialog(this);
+ help->setAttribute(Qt::WA_DeleteOnClose);
+ help->show();
+}
+
#ifdef ENABLE_WALLET
void BitcoinGUI::openClicked()
{
diff --git a/src/qt/bitcoingui.h b/src/qt/bitcoingui.h
index d5bbdca484..4dce4431ba 100644
--- a/src/qt/bitcoingui.h
+++ b/src/qt/bitcoingui.h
@@ -93,6 +93,7 @@ private:
QAction *aboutQtAction;
QAction *openRPCConsoleAction;
QAction *openAction;
+ QAction *showHelpMessageAction;
QSystemTrayIcon *trayIcon;
Notificator *notificator;
@@ -176,6 +177,8 @@ private slots:
void optionsClicked();
/** Show about dialog */
void aboutClicked();
+ /** Show help message dialog */
+ void showHelpMessageClicked();
#ifndef Q_OS_MAC
/** Handle tray icon clicked */
void trayIconActivated(QSystemTrayIcon::ActivationReason reason);
diff --git a/src/qt/forms/aboutdialog.ui b/src/qt/forms/aboutdialog.ui
index 10a5857cab..3ab4675bf3 100644
--- a/src/qt/forms/aboutdialog.ui
+++ b/src/qt/forms/aboutdialog.ui
@@ -160,12 +160,12 @@ This product includes software developed by the OpenSSL Project for use in the O
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
- <x>360</x>
- <y>308</y>
+ <x>20</x>
+ <y>20</y>
</hint>
<hint type="destinationlabel">
- <x>157</x>
- <y>274</y>
+ <x>20</x>
+ <y>20</y>
</hint>
</hints>
</connection>
@@ -176,12 +176,12 @@ This product includes software developed by the OpenSSL Project for use in the O
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
- <x>428</x>
- <y>308</y>
+ <x>20</x>
+ <y>20</y>
</hint>
<hint type="destinationlabel">
- <x>286</x>
- <y>274</y>
+ <x>20</x>
+ <y>20</y>
</hint>
</hints>
</connection>
diff --git a/src/qt/forms/askpassphrasedialog.ui b/src/qt/forms/askpassphrasedialog.ui
index 25169042a1..bc4921455f 100644
--- a/src/qt/forms/askpassphrasedialog.ui
+++ b/src/qt/forms/askpassphrasedialog.ui
@@ -122,12 +122,12 @@
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
- <x>248</x>
- <y>254</y>
+ <x>20</x>
+ <y>20</y>
</hint>
<hint type="destinationlabel">
- <x>157</x>
- <y>274</y>
+ <x>20</x>
+ <y>20</y>
</hint>
</hints>
</connection>
@@ -138,12 +138,12 @@
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
- <x>316</x>
- <y>260</y>
+ <x>20</x>
+ <y>20</y>
</hint>
<hint type="destinationlabel">
- <x>286</x>
- <y>274</y>
+ <x>20</x>
+ <y>20</y>
</hint>
</hints>
</connection>
diff --git a/src/qt/forms/editaddressdialog.ui b/src/qt/forms/editaddressdialog.ui
index 8ff3805226..915b3679a1 100644
--- a/src/qt/forms/editaddressdialog.ui
+++ b/src/qt/forms/editaddressdialog.ui
@@ -76,12 +76,12 @@
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
- <x>248</x>
- <y>254</y>
+ <x>20</x>
+ <y>20</y>
</hint>
<hint type="destinationlabel">
- <x>157</x>
- <y>274</y>
+ <x>20</x>
+ <y>20</y>
</hint>
</hints>
</connection>
@@ -92,12 +92,12 @@
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
- <x>316</x>
- <y>260</y>
+ <x>20</x>
+ <y>20</y>
</hint>
<hint type="destinationlabel">
- <x>286</x>
- <y>274</y>
+ <x>20</x>
+ <y>20</y>
</hint>
</hints>
</connection>
diff --git a/src/qt/forms/helpmessagedialog.ui b/src/qt/forms/helpmessagedialog.ui
new file mode 100644
index 0000000000..f68fea7e64
--- /dev/null
+++ b/src/qt/forms/helpmessagedialog.ui
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>HelpMessageDialog</class>
+ <widget class="QDialog" name="HelpMessageDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>800</width>
+ <height>400</height>
+ </rect>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>10</pointsize>
+ </font>
+ </property>
+ <property name="windowTitle">
+ <string>Bitcoin Core - Command-line options</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <widget class="QLabel" name="graphic">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Ignored">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="pixmap">
+ <pixmap resource="../bitcoin.qrc">:/images/about</pixmap>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QScrollArea" name="scrollArea">
+ <property name="verticalScrollBarPolicy">
+ <enum>Qt::ScrollBarAlwaysOn</enum>
+ </property>
+ <property name="widgetResizable">
+ <bool>true</bool>
+ </property>
+ <widget class="QWidget" name="scrollAreaWidgetContents">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>659</width>
+ <height>348</height>
+ </rect>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <widget class="QLabel" name="helpMessageLabel">
+ <property name="font">
+ <font>
+ <family>Terminal</family>
+ </font>
+ </property>
+ <property name="cursor">
+ <cursorShape>IBeamCursor</cursorShape>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::PlainText</enum>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ <item>
+ <widget class="QDialogButtonBox" name="okButton">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Ok</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <resources>
+ <include location="../bitcoin.qrc"/>
+ </resources>
+ <connections>
+ <connection>
+ <sender>okButton</sender>
+ <signal>accepted()</signal>
+ <receiver>HelpMessageDialog</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>20</x>
+ <y>20</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>20</x>
+ <y>20</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>okButton</sender>
+ <signal>rejected()</signal>
+ <receiver>HelpMessageDialog</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>20</x>
+ <y>20</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>20</x>
+ <y>20</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/src/qt/forms/intro.ui b/src/qt/forms/intro.ui
index 05ee9466c4..09e7bdb024 100644
--- a/src/qt/forms/intro.ui
+++ b/src/qt/forms/intro.ui
@@ -237,12 +237,12 @@
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
- <x>248</x>
- <y>254</y>
+ <x>20</x>
+ <y>20</y>
</hint>
<hint type="destinationlabel">
- <x>157</x>
- <y>274</y>
+ <x>20</x>
+ <y>20</y>
</hint>
</hints>
</connection>
@@ -253,12 +253,12 @@
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
- <x>316</x>
- <y>260</y>
+ <x>20</x>
+ <y>20</y>
</hint>
<hint type="destinationlabel">
- <x>286</x>
- <y>274</y>
+ <x>20</x>
+ <y>20</y>
</hint>
</hints>
</connection>
diff --git a/src/qt/forms/receivecoinsdialog.ui b/src/qt/forms/receivecoinsdialog.ui
index 8242763e77..7bf01224ee 100644
--- a/src/qt/forms/receivecoinsdialog.ui
+++ b/src/qt/forms/receivecoinsdialog.ui
@@ -207,7 +207,11 @@
</widget>
</item>
<item>
- <widget class="QTableView" name="recentRequestsView"/>
+ <widget class="QTableView" name="recentRequestsView">
+ <property name="sortingEnabled">
+ <bool>true</bool>
+ </property>
+ </widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
diff --git a/src/qt/forms/rpcconsole.ui b/src/qt/forms/rpcconsole.ui
index 69504f3159..31d61ec468 100644
--- a/src/qt/forms/rpcconsole.ui
+++ b/src/qt/forms/rpcconsole.ui
@@ -339,32 +339,6 @@
</widget>
</item>
<item row="16" column="0">
- <widget class="QLabel" name="labelCLOptions">
- <property name="font">
- <font>
- <weight>75</weight>
- <bold>true</bold>
- </font>
- </property>
- <property name="text">
- <string>Command-line options</string>
- </property>
- </widget>
- </item>
- <item row="17" column="0">
- <widget class="QPushButton" name="showCLOptionsButton">
- <property name="toolTip">
- <string>Show the Bitcoin-Core help message to get a list with possible Bitcoin command-line options.</string>
- </property>
- <property name="text">
- <string>&amp;Show</string>
- </property>
- <property name="autoDefault">
- <bool>false</bool>
- </property>
- </widget>
- </item>
- <item row="18" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
diff --git a/src/qt/forms/sendcoinsentry.ui b/src/qt/forms/sendcoinsentry.ui
index b6cec5baf0..96c922af4d 100644
--- a/src/qt/forms/sendcoinsentry.ui
+++ b/src/qt/forms/sendcoinsentry.ui
@@ -141,6 +141,23 @@
<item row="2" column="1">
<widget class="BitcoinAmountField" name="payAmount"/>
</item>
+ <item row="3" column="0">
+ <widget class="QLabel" name="messageLabel">
+ <property name="text">
+ <string>Message:</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <widget class="QLabel" name="messageTextLabel">
+ <property name="textFormat">
+ <enum>Qt::PlainText</enum>
+ </property>
+ </widget>
+ </item>
</layout>
</widget>
<widget class="QFrame" name="SendCoins_InsecurePaymentRequest">
diff --git a/src/qt/forms/signverifymessagedialog.ui b/src/qt/forms/signverifymessagedialog.ui
index 04d614a1cd..989522bb58 100644
--- a/src/qt/forms/signverifymessagedialog.ui
+++ b/src/qt/forms/signverifymessagedialog.ui
@@ -19,9 +19,6 @@
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QTabWidget" name="tabWidget">
- <property name="currentIndex">
- <number>0</number>
- </property>
<widget class="QWidget" name="tabSignMessage">
<attribute name="title">
<string>&amp;Sign Message</string>
diff --git a/src/qt/forms/transactiondescdialog.ui b/src/qt/forms/transactiondescdialog.ui
index b38dffcc12..5ae1e12856 100644
--- a/src/qt/forms/transactiondescdialog.ui
+++ b/src/qt/forms/transactiondescdialog.ui
@@ -45,12 +45,12 @@
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
- <x>248</x>
- <y>254</y>
+ <x>20</x>
+ <y>20</y>
</hint>
<hint type="destinationlabel">
- <x>157</x>
- <y>274</y>
+ <x>20</x>
+ <y>20</y>
</hint>
</hints>
</connection>
@@ -61,12 +61,12 @@
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
- <x>316</x>
- <y>260</y>
+ <x>20</x>
+ <y>20</y>
</hint>
<hint type="destinationlabel">
- <x>286</x>
- <y>274</y>
+ <x>20</x>
+ <y>20</y>
</hint>
</hints>
</connection>
diff --git a/src/qt/guiutil.cpp b/src/qt/guiutil.cpp
index b87498402d..2d8a6afe21 100644
--- a/src/qt/guiutil.cpp
+++ b/src/qt/guiutil.cpp
@@ -591,47 +591,6 @@ void restoreWindowGeometry(const QString& strSetting, const QSize& defaultSize,
parent->move(pos);
}
-HelpMessageBox::HelpMessageBox(QWidget *parent) :
- QMessageBox(parent)
-{
- header = tr("Bitcoin Core") + " " + tr("version") + " " +
- QString::fromStdString(FormatFullVersion()) + "\n\n" +
- tr("Usage:") + "\n" +
- " bitcoin-qt [" + tr("command-line options") + "] " + "\n";
-
- coreOptions = QString::fromStdString(HelpMessage(HMM_BITCOIN_QT));
-
- uiOptions = tr("UI options") + ":\n" +
- " -lang=<lang> " + tr("Set language, for example \"de_DE\" (default: system locale)") + "\n" +
- " -min " + tr("Start minimized") + "\n" +
- " -splash " + tr("Show splash screen on startup (default: 1)") + "\n" +
- " -choosedatadir " + tr("Choose data directory on startup (default: 0)") + "\n";
-
- setWindowTitle(tr("Bitcoin Core"));
- setTextFormat(Qt::PlainText);
- // setMinimumWidth is ignored for QMessageBox so put in non-breaking spaces to make it wider.
- setText(header + QString(QChar(0x2003)).repeated(50));
- setDetailedText(coreOptions + "\n" + uiOptions);
-}
-
-void HelpMessageBox::printToConsole()
-{
- // On other operating systems, the expected action is to print the message to the console.
- QString strUsage = header + "\n" + coreOptions + "\n" + uiOptions;
- fprintf(stdout, "%s", strUsage.toStdString().c_str());
-}
-
-void HelpMessageBox::showOrPrint()
-{
-#if defined(WIN32)
- // On Windows, show a message box, as there is no stderr/stdout in windowed applications
- exec();
-#else
- // On other operating systems, print help text to console
- printToConsole();
-#endif
-}
-
void setClipboard(const QString& str)
{
QApplication::clipboard()->setText(str, QClipboard::Clipboard);
diff --git a/src/qt/guiutil.h b/src/qt/guiutil.h
index 14d4ff17c1..c894850a91 100644
--- a/src/qt/guiutil.h
+++ b/src/qt/guiutil.h
@@ -123,26 +123,6 @@ namespace GUIUtil
/** Restore window size and position */
void restoreWindowGeometry(const QString& strSetting, const QSize &defaultSizeIn, QWidget *parent);
- /** Help message for Bitcoin-Qt, shown with --help. */
- class HelpMessageBox : public QMessageBox
- {
- Q_OBJECT
-
- public:
- HelpMessageBox(QWidget *parent = 0);
-
- /** Show message box or print help message to standard output, based on operating system. */
- void showOrPrint();
-
- /** Print help message to console */
- void printToConsole();
-
- private:
- QString header;
- QString coreOptions;
- QString uiOptions;
- };
-
} // namespace GUIUtil
#endif // GUIUTIL_H
diff --git a/src/qt/optionsdialog.cpp b/src/qt/optionsdialog.cpp
index d024e3b7aa..f61bb3ed2c 100644
--- a/src/qt/optionsdialog.cpp
+++ b/src/qt/optionsdialog.cpp
@@ -53,7 +53,6 @@ OptionsDialog::OptionsDialog(QWidget *parent) :
connect(ui->connectSocks, SIGNAL(toggled(bool)), ui->proxyIp, SLOT(setEnabled(bool)));
connect(ui->connectSocks, SIGNAL(toggled(bool)), ui->proxyPort, SLOT(setEnabled(bool)));
connect(ui->connectSocks, SIGNAL(toggled(bool)), ui->socksVersion, SLOT(setEnabled(bool)));
- connect(ui->connectSocks, SIGNAL(clicked(bool)), this, SLOT(showRestartWarning_Proxy()));
ui->proxyIp->installEventFilter(this);
@@ -204,7 +203,7 @@ void OptionsDialog::on_resetButton_clicked()
if(btnRetVal == QMessageBox::Cancel)
return;
- /* reset all options and close Bitcoin-Qt */
+ /* reset all options and close GUI */
model->Reset();
QApplication::quit();
}
diff --git a/src/qt/optionsmodel.cpp b/src/qt/optionsmodel.cpp
index 1133c457b3..a18fd1d514 100644
--- a/src/qt/optionsmodel.cpp
+++ b/src/qt/optionsmodel.cpp
@@ -19,6 +19,7 @@
#include "walletdb.h"
#endif
+#include <QNetworkProxy>
#include <QSettings>
#include <QStringList>
@@ -375,14 +376,25 @@ bool OptionsModel::setData(const QModelIndex & index, const QVariant & value, in
return successful;
}
-bool OptionsModel::getProxySettings(QString& proxyIP, quint16 &proxyPort) const
+bool OptionsModel::getProxySettings(QNetworkProxy& proxy) const
{
- std::string proxy = GetArg("-proxy", "");
- if (proxy.empty()) return false;
+ // Directly query current base proxy, because
+ // GUI settings can be overridden with -proxy.
+ proxyType curProxy;
+ if (GetProxy(NET_IPV4, curProxy)) {
+ if (curProxy.second == 5) {
+ proxy.setType(QNetworkProxy::Socks5Proxy);
+ proxy.setHostName(QString::fromStdString(curProxy.first.ToStringIP()));
+ proxy.setPort(curProxy.first.GetPort());
+
+ return true;
+ }
+ else
+ return false;
+ }
+ else
+ proxy.setType(QNetworkProxy::NoProxy);
- CService addrProxy(proxy);
- proxyIP = QString(addrProxy.ToStringIP().c_str());
- proxyPort = addrProxy.GetPort();
return true;
}
diff --git a/src/qt/optionsmodel.h b/src/qt/optionsmodel.h
index d05cb46746..7a71b772b2 100644
--- a/src/qt/optionsmodel.h
+++ b/src/qt/optionsmodel.h
@@ -7,6 +7,10 @@
#include <QAbstractListModel>
+QT_BEGIN_NAMESPACE
+class QNetworkProxy;
+QT_END_NAMESPACE
+
/** Interface from Qt to configuration data structure for Bitcoin client.
To Qt, the options are presented as a list with the different options
laid out vertically.
@@ -54,7 +58,7 @@ public:
bool getMinimizeOnClose() { return fMinimizeOnClose; }
int getDisplayUnit() { return nDisplayUnit; }
bool getDisplayAddresses() { return bDisplayAddresses; }
- bool getProxySettings(QString& proxyIP, quint16 &proxyPort) const;
+ bool getProxySettings(QNetworkProxy& proxy) const;
bool getCoinControlFeatures() { return fCoinControlFeatures; }
const QString& getOverriddenByCommandLine() { return strOverriddenByCommandLine; }
diff --git a/src/qt/paymentserver.cpp b/src/qt/paymentserver.cpp
index 7642cd117a..ca6ae17990 100644
--- a/src/qt/paymentserver.cpp
+++ b/src/qt/paymentserver.cpp
@@ -335,17 +335,22 @@ void PaymentServer::initNetManager()
// netManager is used to fetch paymentrequests given in bitcoin: URIs
netManager = new QNetworkAccessManager(this);
- // Use proxy settings from optionsModel
- QString proxyIP;
- quint16 proxyPort;
- if (optionsModel->getProxySettings(proxyIP, proxyPort))
- {
- QNetworkProxy proxy;
- proxy.setType(QNetworkProxy::Socks5Proxy);
- proxy.setHostName(proxyIP);
- proxy.setPort(proxyPort);
- netManager->setProxy(proxy);
+ QNetworkProxy proxy;
+
+ // Query active proxy (fails if no SOCKS5 proxy)
+ if (optionsModel->getProxySettings(proxy)) {
+ if (proxy.type() == QNetworkProxy::Socks5Proxy) {
+ netManager->setProxy(proxy);
+
+ qDebug() << "PaymentServer::initNetManager : Using SOCKS5 proxy" << proxy.hostName() << ":" << proxy.port();
+ }
+ else
+ qDebug() << "PaymentServer::initNetManager : No active proxy server found.";
}
+ else
+ emit message(tr("Net manager warning"),
+ tr("Your active proxy doesn't support SOCKS5, which is required for payment requests via proxy."),
+ CClientUIInterface::MSG_WARNING);
connect(netManager, SIGNAL(finished(QNetworkReply*)),
this, SLOT(netRequestFinished(QNetworkReply*)));
diff --git a/src/qt/receivecoinsdialog.cpp b/src/qt/receivecoinsdialog.cpp
index 075a16dabf..38dc88f63b 100644
--- a/src/qt/receivecoinsdialog.cpp
+++ b/src/qt/receivecoinsdialog.cpp
@@ -55,6 +55,8 @@ void ReceiveCoinsDialog::setModel(WalletModel *model)
ui->recentRequestsView->horizontalHeader()->setSectionResizeMode(RecentRequestsTableModel::Message, QHeaderView::Stretch);
#endif
ui->recentRequestsView->horizontalHeader()->resizeSection(RecentRequestsTableModel::Amount, 100);
+
+ model->getRecentRequestsTableModel()->sort(RecentRequestsTableModel::Date, Qt::DescendingOrder);
}
}
diff --git a/src/qt/recentrequeststablemodel.cpp b/src/qt/recentrequeststablemodel.cpp
index 86c29dd02b..74b43f1d24 100644
--- a/src/qt/recentrequeststablemodel.cpp
+++ b/src/qt/recentrequeststablemodel.cpp
@@ -12,6 +12,13 @@ RecentRequestsTableModel::RecentRequestsTableModel(CWallet *wallet, WalletModel
walletModel(parent)
{
Q_UNUSED(wallet);
+ nReceiveRequestsMaxId = 0;
+
+ // Load entries from wallet
+ std::vector<std::string> vReceiveRequests;
+ parent->loadReceiveRequests(vReceiveRequests);
+ BOOST_FOREACH(const std::string& request, vReceiveRequests)
+ addNewRequest(request);
/* These columns must match the indices in the ColumnIndex enumeration */
columns << tr("Date") << tr("Label") << tr("Message") << tr("Amount");
@@ -104,6 +111,14 @@ bool RecentRequestsTableModel::removeRows(int row, int count, const QModelIndex
if(count > 0 && row >= 0 && (row+count) <= list.size())
{
+ const RecentRequestEntry *rec;
+ for (int i = 0; i < count; ++i)
+ {
+ rec = &list[row+i];
+ if (!walletModel->saveReceiveRequest(rec->recipient.address.toStdString(), rec->id, ""))
+ return false;
+ }
+
beginRemoveRows(parent, row, row + count - 1);
list.erase(list.begin() + row, list.begin() + row + count);
endRemoveRows();
@@ -118,12 +133,73 @@ Qt::ItemFlags RecentRequestsTableModel::flags(const QModelIndex &index) const
return Qt::ItemIsSelectable | Qt::ItemIsEnabled;
}
+// called when adding a request from the GUI
void RecentRequestsTableModel::addNewRequest(const SendCoinsRecipient &recipient)
{
RecentRequestEntry newEntry;
+ newEntry.id = ++nReceiveRequestsMaxId;
newEntry.date = QDateTime::currentDateTime();
newEntry.recipient = recipient;
+
+ CDataStream ss(SER_DISK, CLIENT_VERSION);
+ ss << newEntry;
+
+ if (!walletModel->saveReceiveRequest(recipient.address.toStdString(), newEntry.id, ss.str()))
+ return;
+
+ addNewRequest(newEntry);
+}
+
+// called from ctor when loading from wallet
+void RecentRequestsTableModel::addNewRequest(const std::string &recipient)
+{
+ std::vector<char> data(recipient.begin(), recipient.end());
+ CDataStream ss(data, SER_DISK, CLIENT_VERSION);
+
+ RecentRequestEntry entry;
+ ss >> entry;
+
+ if (entry.id == 0) // should not happen
+ return;
+
+ if (entry.id > nReceiveRequestsMaxId)
+ nReceiveRequestsMaxId = entry.id;
+
+ addNewRequest(entry);
+}
+
+// actually add to table in GUI
+void RecentRequestsTableModel::addNewRequest(RecentRequestEntry &recipient)
+{
beginInsertRows(QModelIndex(), 0, 0);
- list.prepend(newEntry);
+ list.prepend(recipient);
endInsertRows();
}
+
+void RecentRequestsTableModel::sort(int column, Qt::SortOrder order)
+{
+ qSort(list.begin(), list.end(), RecentRequestEntryLessThan(column, order));
+ emit dataChanged(index(0, 0, QModelIndex()), index(list.size() - 1, NUMBER_OF_COLUMNS - 1, QModelIndex()));
+}
+
+bool RecentRequestEntryLessThan::operator()(RecentRequestEntry &left, RecentRequestEntry &right) const
+{
+ RecentRequestEntry *pLeft = &left;
+ RecentRequestEntry *pRight = &right;
+ if (order == Qt::DescendingOrder)
+ std::swap(pLeft, pRight);
+
+ switch(column)
+ {
+ case RecentRequestsTableModel::Date:
+ return pLeft->date.toTime_t() < pRight->date.toTime_t();
+ case RecentRequestsTableModel::Label:
+ return pLeft->recipient.label < pRight->recipient.label;
+ case RecentRequestsTableModel::Message:
+ return pLeft->recipient.message < pRight->recipient.message;
+ case RecentRequestsTableModel::Amount:
+ return pLeft->recipient.amount < pRight->recipient.amount;
+ default:
+ return pLeft->id < pRight->id;
+ }
+}
diff --git a/src/qt/recentrequeststablemodel.h b/src/qt/recentrequeststablemodel.h
index 3aab7b0a48..51aef9decf 100644
--- a/src/qt/recentrequeststablemodel.h
+++ b/src/qt/recentrequeststablemodel.h
@@ -13,10 +13,44 @@
class CWallet;
-struct RecentRequestEntry
+class RecentRequestEntry
{
+public:
+ RecentRequestEntry() : nVersion(RecentRequestEntry::CURRENT_VERSION), id(0) { }
+
+ static const int CURRENT_VERSION = 1;
+ int nVersion;
+ int64_t id;
QDateTime date;
SendCoinsRecipient recipient;
+
+ IMPLEMENT_SERIALIZE
+ (
+ RecentRequestEntry* pthis = const_cast<RecentRequestEntry*>(this);
+
+ unsigned int nDate = date.toTime_t();
+
+ READWRITE(pthis->nVersion);
+ nVersion = pthis->nVersion;
+ READWRITE(id);
+ READWRITE(nDate);
+ READWRITE(recipient);
+
+ if (fRead)
+ pthis->date = QDateTime::fromTime_t(nDate);
+ )
+};
+
+class RecentRequestEntryLessThan
+{
+public:
+ RecentRequestEntryLessThan(int nColumn, Qt::SortOrder fOrder):
+ column(nColumn), order(fOrder) {}
+ bool operator()(RecentRequestEntry &left, RecentRequestEntry &right) const;
+
+private:
+ int column;
+ Qt::SortOrder order;
};
/** Model for list of recently generated payment requests / bitcoin URIs.
@@ -34,7 +68,8 @@ public:
Date = 0,
Label = 1,
Message = 2,
- Amount = 3
+ Amount = 3,
+ NUMBER_OF_COLUMNS
};
/** @name Methods overridden from QAbstractTableModel
@@ -51,11 +86,17 @@ public:
const RecentRequestEntry &entry(int row) const { return list[row]; }
void addNewRequest(const SendCoinsRecipient &recipient);
+ void addNewRequest(const std::string &recipient);
+ void addNewRequest(RecentRequestEntry &recipient);
+
+public slots:
+ void sort(int column, Qt::SortOrder order = Qt::AscendingOrder);
private:
WalletModel *walletModel;
QStringList columns;
QList<RecentRequestEntry> list;
+ int64_t nReceiveRequestsMaxId;
};
#endif
diff --git a/src/qt/rpcconsole.cpp b/src/qt/rpcconsole.cpp
index a8470572dd..b1671b8a0e 100644
--- a/src/qt/rpcconsole.cpp
+++ b/src/qt/rpcconsole.cpp
@@ -200,7 +200,6 @@ RPCConsole::RPCConsole(QWidget *parent) :
#ifndef Q_OS_MAC
ui->openDebugLogfileButton->setIcon(QIcon(":/icons/export"));
- ui->showCLOptionsButton->setIcon(QIcon(":/icons/options"));
#endif
// Install event filter for up and down arrow
@@ -441,12 +440,6 @@ void RPCConsole::scrollToEnd()
scrollbar->setValue(scrollbar->maximum());
}
-void RPCConsole::on_showCLOptionsButton_clicked()
-{
- GUIUtil::HelpMessageBox help;
- help.exec();
-}
-
void RPCConsole::on_sldGraphRange_valueChanged(int value)
{
const int multiplier = 5; // each position on the slider represents 5 min
diff --git a/src/qt/rpcconsole.h b/src/qt/rpcconsole.h
index 6fbf197728..0cfd1c80d1 100644
--- a/src/qt/rpcconsole.h
+++ b/src/qt/rpcconsole.h
@@ -40,8 +40,6 @@ private slots:
void on_tabWidget_currentChanged(int index);
/** open the debug.log from the current datadir */
void on_openDebugLogfileButton_clicked();
- /** display messagebox with program parameters (same as bitcoin-qt --help) */
- void on_showCLOptionsButton_clicked();
/** change the time range of the network traffic graph */
void on_sldGraphRange_valueChanged(int value);
/** update traffic statistics */
diff --git a/src/qt/sendcoinsentry.cpp b/src/qt/sendcoinsentry.cpp
index 3f5d0cda3a..b4e74b078c 100644
--- a/src/qt/sendcoinsentry.cpp
+++ b/src/qt/sendcoinsentry.cpp
@@ -88,6 +88,9 @@ void SendCoinsEntry::clear()
ui->payTo->clear();
ui->addAsLabel->clear();
ui->payAmount->clear();
+ ui->messageTextLabel->clear();
+ ui->messageTextLabel->hide();
+ ui->messageLabel->hide();
// clear UI elements for insecure payment request
ui->payTo_is->clear();
ui->memoTextLabel_is->clear();
@@ -148,6 +151,7 @@ SendCoinsRecipient SendCoinsEntry::getValue()
recipient.address = ui->payTo->text();
recipient.label = ui->addAsLabel->text();
recipient.amount = ui->payAmount->value();
+ recipient.message = ui->messageTextLabel->text();
return recipient;
}
@@ -188,6 +192,11 @@ void SendCoinsEntry::setValue(const SendCoinsRecipient &value)
}
else // normal payment
{
+ // message
+ ui->messageTextLabel->setText(recipient.message);
+ ui->messageTextLabel->setVisible(!recipient.message.isEmpty());
+ ui->messageLabel->setVisible(!recipient.message.isEmpty());
+
ui->payTo->setText(recipient.address);
ui->addAsLabel->setText(recipient.label);
ui->payAmount->setValue(recipient.amount);
diff --git a/src/qt/splashscreen.cpp b/src/qt/splashscreen.cpp
index 8b16496c18..c21679ea8a 100644
--- a/src/qt/splashscreen.cpp
+++ b/src/qt/splashscreen.cpp
@@ -5,8 +5,8 @@
#include "splashscreen.h"
#include "clientversion.h"
-#include "util.h"
#include "ui_interface.h"
+#include "util.h"
#include <QApplication>
#include <QPainter>
diff --git a/src/qt/transactiondesc.cpp b/src/qt/transactiondesc.cpp
index c0c4d53732..2c3a9e3a5c 100644
--- a/src/qt/transactiondesc.cpp
+++ b/src/qt/transactiondesc.cpp
@@ -224,6 +224,11 @@ QString TransactionDesc::toHTML(CWallet *wallet, CWalletTx &wtx, int vout, int u
strHTML += "<b>" + tr("Transaction ID") + ":</b> " + TransactionRecord::formatSubTxId(wtx.GetHash(), vout) + "<br>";
+ // Message from normal bitcoin:URI (bitcoin:123...?message=example)
+ foreach (const PAIRTYPE(string, string)& r, wtx.vOrderForm)
+ if (r.first == "Message")
+ strHTML += "<br><b>" + tr("Message") + ":</b><br>" + GUIUtil::HtmlEscape(r.second, true) + "<br>";
+
//
// PaymentRequest info:
//
diff --git a/src/qt/utilitydialog.cpp b/src/qt/utilitydialog.cpp
new file mode 100644
index 0000000000..a96b9d6c0b
--- /dev/null
+++ b/src/qt/utilitydialog.cpp
@@ -0,0 +1,134 @@
+// Copyright (c) 2011-2014 The Bitcoin developers
+// Distributed under the MIT/X11 software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#include "utilitydialog.h"
+
+#include "ui_aboutdialog.h"
+#include "ui_helpmessagedialog.h"
+
+#include "bitcoingui.h"
+#include "clientmodel.h"
+#include "guiutil.h"
+
+#include "clientversion.h"
+#include "init.h"
+#include "util.h"
+
+#include <QLabel>
+#include <QVBoxLayout>
+
+/** "About" dialog box */
+AboutDialog::AboutDialog(QWidget *parent) :
+ QDialog(parent),
+ ui(new Ui::AboutDialog)
+{
+ ui->setupUi(this);
+
+ // Set current copyright year
+ ui->copyrightLabel->setText(tr("Copyright") + QString(" &copy; 2009-%1 ").arg(COPYRIGHT_YEAR) + tr("The Bitcoin Core developers"));
+}
+
+void AboutDialog::setModel(ClientModel *model)
+{
+ if(model)
+ {
+ QString version = model->formatFullVersion();
+ /* On x86 add a bit specifier to the version so that users can distinguish between
+ * 32 and 64 bit builds. On other architectures, 32/64 bit may be more ambigious.
+ */
+#if defined(__x86_64__)
+ version += " (64-bit)";
+#elif defined(__i386__ )
+ version += " (32-bit)";
+#endif
+ ui->versionLabel->setText(version);
+ }
+}
+
+AboutDialog::~AboutDialog()
+{
+ delete ui;
+}
+
+void AboutDialog::on_buttonBox_accepted()
+{
+ close();
+}
+
+/** "Help message" dialog box */
+HelpMessageDialog::HelpMessageDialog(QWidget *parent) :
+ QDialog(parent),
+ ui(new Ui::HelpMessageDialog)
+{
+ ui->setupUi(this);
+ GUIUtil::restoreWindowGeometry("nHelpMessageDialogWindow", this->size(), this);
+
+ header = tr("Bitcoin Core") + " " + tr("version") + " " +
+ QString::fromStdString(FormatFullVersion()) + "\n\n" +
+ tr("Usage:") + "\n" +
+ " bitcoin-qt [" + tr("command-line options") + "] " + "\n";
+
+ coreOptions = QString::fromStdString(HelpMessage(HMM_BITCOIN_QT));
+
+ uiOptions = tr("UI options") + ":\n" +
+ " -lang=<lang> " + tr("Set language, for example \"de_DE\" (default: system locale)") + "\n" +
+ " -min " + tr("Start minimized") + "\n" +
+ " -splash " + tr("Show splash screen on startup (default: 1)") + "\n" +
+ " -choosedatadir " + tr("Choose data directory on startup (default: 0)");
+
+ ui->helpMessageLabel->setFont(GUIUtil::bitcoinAddressFont());
+
+ // Set help message text
+ ui->helpMessageLabel->setText(header + "\n" + coreOptions + "\n" + uiOptions);
+}
+
+HelpMessageDialog::~HelpMessageDialog()
+{
+ GUIUtil::saveWindowGeometry("nHelpMessageDialogWindow", this);
+ delete ui;
+}
+
+void HelpMessageDialog::printToConsole()
+{
+ // On other operating systems, the expected action is to print the message to the console.
+ QString strUsage = header + "\n" + coreOptions + "\n" + uiOptions;
+ fprintf(stdout, "%s", strUsage.toStdString().c_str());
+}
+
+void HelpMessageDialog::showOrPrint()
+{
+#if defined(WIN32)
+ // On Windows, show a message box, as there is no stderr/stdout in windowed applications
+ exec();
+#else
+ // On other operating systems, print help text to console
+ printToConsole();
+#endif
+}
+
+void HelpMessageDialog::on_okButton_accepted()
+{
+ close();
+}
+
+
+/** "Shutdown" window */
+void ShutdownWindow::showShutdownWindow(BitcoinGUI *window)
+{
+ if (!window)
+ return;
+
+ // Show a simple window indicating shutdown status
+ QWidget *shutdownWindow = new QWidget();
+ QVBoxLayout *layout = new QVBoxLayout();
+ layout->addWidget(new QLabel(
+ tr("Bitcoin Core is shutting down...") + "<br /><br />" +
+ tr("Do not shut down the computer until this window disappears.")));
+ shutdownWindow->setLayout(layout);
+
+ // Center shutdown window at where main window was
+ const QPoint global = window->mapToGlobal(window->rect().center());
+ shutdownWindow->move(global.x() - shutdownWindow->width() / 2, global.y() - shutdownWindow->height() / 2);
+ shutdownWindow->show();
+}
diff --git a/src/qt/utilitydialog.h b/src/qt/utilitydialog.h
new file mode 100644
index 0000000000..874daf6a7f
--- /dev/null
+++ b/src/qt/utilitydialog.h
@@ -0,0 +1,69 @@
+// Copyright (c) 2011-2014 The Bitcoin developers
+// Distributed under the MIT/X11 software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#ifndef UTILITYDIALOG_H
+#define UTILITYDIALOG_H
+
+#include <QDialog>
+#include <QObject>
+
+class BitcoinGUI;
+class ClientModel;
+
+namespace Ui {
+ class AboutDialog;
+ class HelpMessageDialog;
+}
+
+/** "About" dialog box */
+class AboutDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit AboutDialog(QWidget *parent);
+ ~AboutDialog();
+
+ void setModel(ClientModel *model);
+
+private:
+ Ui::AboutDialog *ui;
+
+private slots:
+ void on_buttonBox_accepted();
+};
+
+/** "Help message" dialog box */
+class HelpMessageDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit HelpMessageDialog(QWidget *parent);
+ ~HelpMessageDialog();
+
+ void printToConsole();
+ void showOrPrint();
+
+private:
+ Ui::HelpMessageDialog *ui;
+ QString header;
+ QString coreOptions;
+ QString uiOptions;
+
+private slots:
+ void on_okButton_accepted();
+};
+
+
+/** "Shutdown" window */
+class ShutdownWindow : public QObject
+{
+ Q_OBJECT
+
+public:
+ static void showShutdownWindow(BitcoinGUI *window);
+};
+
+#endif // UTILITYDIALOG_H
diff --git a/src/qt/walletmodel.cpp b/src/qt/walletmodel.cpp
index 14f29c933b..ddc8c6ea79 100644
--- a/src/qt/walletmodel.cpp
+++ b/src/qt/walletmodel.cpp
@@ -269,6 +269,8 @@ WalletModel::SendCoinsReturn WalletModel::sendCoins(WalletModelTransaction &tran
rcp.paymentRequest.SerializeToString(&value);
newTx->vOrderForm.push_back(make_pair(key, value));
}
+ else if (!rcp.message.isEmpty()) // Message from normal bitcoin:URI (bitcoin:123...?message=example)
+ newTx->vOrderForm.push_back(make_pair("Message", rcp.message.toStdString()));
}
CReserveKey *keyChange = transaction.getPossibleKeyChange();
@@ -554,3 +556,27 @@ void WalletModel::listLockedCoins(std::vector<COutPoint>& vOutpts)
LOCK(wallet->cs_wallet);
wallet->ListLockedCoins(vOutpts);
}
+
+void WalletModel::loadReceiveRequests(std::vector<std::string>& vReceiveRequests)
+{
+ LOCK(wallet->cs_wallet);
+ BOOST_FOREACH(const PAIRTYPE(CTxDestination, CAddressBookData)& item, wallet->mapAddressBook)
+ BOOST_FOREACH(const PAIRTYPE(std::string, std::string)& item2, item.second.destdata)
+ if (item2.first.size() > 2 && item2.first.substr(0,2) == "rr") // receive request
+ vReceiveRequests.push_back(item2.second);
+}
+
+bool WalletModel::saveReceiveRequest(const std::string &sAddress, const int64_t nId, const std::string &sRequest)
+{
+ CTxDestination dest = CBitcoinAddress(sAddress).Get();
+
+ std::stringstream ss;
+ ss << nId;
+ std::string key = "rr" + ss.str(); // "rr" prefix = "receive request" in destdata
+
+ LOCK(wallet->cs_wallet);
+ if (sRequest.empty())
+ return wallet->EraseDestData(dest, key);
+ else
+ return wallet->AddDestData(dest, key, sRequest);
+}
diff --git a/src/qt/walletmodel.h b/src/qt/walletmodel.h
index 1a4d25615a..6d9d866b25 100644
--- a/src/qt/walletmodel.h
+++ b/src/qt/walletmodel.h
@@ -36,9 +36,9 @@ QT_END_NAMESPACE
class SendCoinsRecipient
{
public:
- explicit SendCoinsRecipient() : amount(0) { }
+ explicit SendCoinsRecipient() : amount(0), nVersion(SendCoinsRecipient::CURRENT_VERSION) { }
explicit SendCoinsRecipient(const QString &addr, const QString &label, quint64 amount, const QString &message):
- address(addr), label(label), amount(amount), message(message) {}
+ address(addr), label(label), amount(amount), message(message), nVersion(SendCoinsRecipient::CURRENT_VERSION) {}
// If from an insecure payment request, this is used for storing
// the addresses, e.g. address-A<br />address-B<br />address-C.
@@ -55,6 +55,41 @@ public:
PaymentRequestPlus paymentRequest;
// Empty if no authentication or invalid signature/cert/etc.
QString authenticatedMerchant;
+
+ static const int CURRENT_VERSION = 1;
+ int nVersion;
+
+ IMPLEMENT_SERIALIZE
+ (
+ SendCoinsRecipient* pthis = const_cast<SendCoinsRecipient*>(this);
+
+ std::string sAddress = pthis->address.toStdString();
+ std::string sLabel = pthis->label.toStdString();
+ std::string sMessage = pthis->message.toStdString();
+ std::string sPaymentRequest;
+ if (!fRead && pthis->paymentRequest.IsInitialized())
+ pthis->paymentRequest.SerializeToString(&sPaymentRequest);
+ std::string sAuthenticatedMerchant = pthis->authenticatedMerchant.toStdString();
+
+ READWRITE(pthis->nVersion);
+ nVersion = pthis->nVersion;
+ READWRITE(sAddress);
+ READWRITE(sLabel);
+ READWRITE(amount);
+ READWRITE(sMessage);
+ READWRITE(sPaymentRequest);
+ READWRITE(sAuthenticatedMerchant);
+
+ if (fRead)
+ {
+ pthis->address = QString::fromStdString(sAddress);
+ pthis->label = QString::fromStdString(sLabel);
+ pthis->message = QString::fromStdString(sMessage);
+ if (!sPaymentRequest.empty())
+ pthis->paymentRequest.parse(QByteArray::fromRawData(sPaymentRequest.data(), sPaymentRequest.size()));
+ pthis->authenticatedMerchant = QString::fromStdString(sAuthenticatedMerchant);
+ }
+ )
};
/** Interface to Bitcoin wallet from Qt view code. */
@@ -152,6 +187,9 @@ public:
void unlockCoin(COutPoint& output);
void listLockedCoins(std::vector<COutPoint>& vOutpts);
+ void loadReceiveRequests(std::vector<std::string>& vReceiveRequests);
+ bool saveReceiveRequest(const std::string &sAddress, const int64_t nId, const std::string &sRequest);
+
private:
CWallet *wallet;
diff --git a/src/rpcdump.cpp b/src/rpcdump.cpp
index c801b284cb..18c8bb6e61 100644
--- a/src/rpcdump.cpp
+++ b/src/rpcdump.cpp
@@ -116,9 +116,14 @@ Value importprivkey(const Array& params, bool fHelp)
if (pwalletMain->HaveKey(vchAddress))
return Value::null;
+ pwalletMain->mapKeyMetadata[vchAddress].nCreateTime = 1;
+
if (!pwalletMain->AddKeyPubKey(key, pubkey))
throw JSONRPCError(RPC_WALLET_ERROR, "Error adding key to wallet");
+ // whenever a key is imported, we need to scan the whole chain
+ pwalletMain->nTimeFirstKey = 1; // 0 would be considered 'no value'
+
if (fRescan) {
pwalletMain->ScanForWalletTransactions(chainActive.Genesis(), true);
pwalletMain->ReacceptWalletTransactions();
diff --git a/src/wallet.cpp b/src/wallet.cpp
index 9065ba8483..84642bee62 100644
--- a/src/wallet.cpp
+++ b/src/wallet.cpp
@@ -1534,7 +1534,19 @@ bool CWallet::SetAddressBook(const CTxDestination& address, const string& strNam
bool CWallet::DelAddressBook(const CTxDestination& address)
{
+
AssertLockHeld(cs_wallet); // mapAddressBook
+
+ if(fFileBacked)
+ {
+ // Delete destdata tuples associated with address
+ std::string strAddress = CBitcoinAddress(address).ToString();
+ BOOST_FOREACH(const PAIRTYPE(string, string) &item, mapAddressBook[address].destdata)
+ {
+ CWalletDB(strWalletFile).EraseDestData(strAddress, item.first);
+ }
+ }
+
mapAddressBook.erase(address);
NotifyAddressBookChanged(this, address, "", ::IsMine(*this, address), "", CT_DELETED);
if (!fFileBacked)
@@ -2008,3 +2020,45 @@ void CWallet::GetKeyBirthTimes(std::map<CKeyID, int64_t> &mapKeyBirth) const {
for (std::map<CKeyID, CBlockIndex*>::const_iterator it = mapKeyFirstBlock.begin(); it != mapKeyFirstBlock.end(); it++)
mapKeyBirth[it->first] = it->second->nTime - 7200; // block times can be 2h off
}
+
+bool CWallet::AddDestData(const CTxDestination &dest, const std::string &key, const std::string &value)
+{
+ if (boost::get<CNoDestination>(&dest))
+ return false;
+
+ mapAddressBook[dest].destdata.insert(std::make_pair(key, value));
+ if (!fFileBacked)
+ return true;
+ return CWalletDB(strWalletFile).WriteDestData(CBitcoinAddress(dest).ToString(), key, value);
+}
+
+bool CWallet::EraseDestData(const CTxDestination &dest, const std::string &key)
+{
+ if (!mapAddressBook[dest].destdata.erase(key))
+ return false;
+ if (!fFileBacked)
+ return true;
+ return CWalletDB(strWalletFile).EraseDestData(CBitcoinAddress(dest).ToString(), key);
+}
+
+bool CWallet::LoadDestData(const CTxDestination &dest, const std::string &key, const std::string &value)
+{
+ mapAddressBook[dest].destdata.insert(std::make_pair(key, value));
+ return true;
+}
+
+bool CWallet::GetDestData(const CTxDestination &dest, const std::string &key, std::string *value) const
+{
+ std::map<CTxDestination, CAddressBookData>::const_iterator i = mapAddressBook.find(dest);
+ if(i != mapAddressBook.end())
+ {
+ CAddressBookData::StringMap::const_iterator j = i->second.destdata.find(key);
+ if(j != i->second.destdata.end())
+ {
+ if(value)
+ *value = j->second;
+ return true;
+ }
+ }
+ return false;
+}
diff --git a/src/wallet.h b/src/wallet.h
index e4452a3093..dc8c007ac8 100644
--- a/src/wallet.h
+++ b/src/wallet.h
@@ -83,6 +83,9 @@ public:
{
purpose = "unknown";
}
+
+ typedef std::map<std::string, std::string> StringMap;
+ StringMap destdata;
};
/** A CWallet is an extension of a keystore, which also maintains a set of transactions and balances,
@@ -189,6 +192,15 @@ public:
bool AddCScript(const CScript& redeemScript);
bool LoadCScript(const CScript& redeemScript) { return CCryptoKeyStore::AddCScript(redeemScript); }
+ /// Adds a destination data tuple to the store, and saves it to disk
+ bool AddDestData(const CTxDestination &dest, const std::string &key, const std::string &value);
+ /// Erases a destination data tuple in the store and on disk
+ bool EraseDestData(const CTxDestination &dest, const std::string &key);
+ /// Adds a destination data tuple to the store, without saving it to disk
+ bool LoadDestData(const CTxDestination &dest, const std::string &key, const std::string &value);
+ /// Look up a destination data tuple in the store, return true if found false otherwise
+ bool GetDestData(const CTxDestination &dest, const std::string &key, std::string *value) const;
+
bool Unlock(const SecureString& strWalletPassphrase);
bool ChangeWalletPassphrase(const SecureString& strOldWalletPassphrase, const SecureString& strNewWalletPassphrase);
bool EncryptWallet(const SecureString& strWalletPassphrase);
diff --git a/src/walletdb.cpp b/src/walletdb.cpp
index 9c5bddba60..2e61c6cd58 100644
--- a/src/walletdb.cpp
+++ b/src/walletdb.cpp
@@ -564,6 +564,18 @@ ReadKeyValue(CWallet* pwallet, CDataStream& ssKey, CDataStream& ssValue,
{
ssValue >> pwallet->nOrderPosNext;
}
+ else if (strType == "destdata")
+ {
+ std::string strAddress, strKey, strValue;
+ ssKey >> strAddress;
+ ssKey >> strKey;
+ ssValue >> strValue;
+ if (!pwallet->LoadDestData(CBitcoinAddress(strAddress).Get(), strKey, strValue))
+ {
+ strErr = "Error reading wallet database: LoadDestData failed";
+ return false;
+ }
+ }
} catch (...)
{
return false;
@@ -865,3 +877,15 @@ bool CWalletDB::Recover(CDBEnv& dbenv, std::string filename)
{
return CWalletDB::Recover(dbenv, filename, false);
}
+
+bool CWalletDB::WriteDestData(const std::string &address, const std::string &key, const std::string &value)
+{
+ nWalletDBUpdated++;
+ return Write(boost::make_tuple(std::string("destdata"), address, key), value);
+}
+
+bool CWalletDB::EraseDestData(const std::string &address, const std::string &key)
+{
+ nWalletDBUpdated++;
+ return Erase(boost::make_tuple(string("destdata"), address, key));
+}
diff --git a/src/walletdb.h b/src/walletdb.h
index 88ba89f9d5..15af287245 100644
--- a/src/walletdb.h
+++ b/src/walletdb.h
@@ -124,6 +124,11 @@ public:
bool ReadAccount(const std::string& strAccount, CAccount& account);
bool WriteAccount(const std::string& strAccount, const CAccount& account);
+
+ /// Write destination data key,value tuple to database
+ bool WriteDestData(const std::string &address, const std::string &key, const std::string &value);
+ /// Erase destination data tuple from wallet database
+ bool EraseDestData(const std::string &address, const std::string &key);
private:
bool WriteAccountingEntry(const uint64_t nAccEntryNum, const CAccountingEntry& acentry);
public: