diff --git a/src/init.cpp b/src/init.cpp index 48fd5ae9..1eee4d24 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -3,11 +3,12 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. +#include "init.h" +#include "main.h" #include "txdb.h" #include "walletdb.h" #include "bitcoinrpc.h" #include "net.h" -#include "init.h" #include "util.h" #include "ui_interface.h" #include "checkpoints.h" @@ -569,6 +570,10 @@ bool AppInit2(boost::thread_group& threadGroup) // ********************************************************* Step 6: network initialization + SetProcessMessagesHandler(ProcessMessages); + SetSendMessagesHandler(SendMessages); + SetStartShutdownHandler(StartShutdown); + int nSocksVersion = GetArg("-socks", 5); if (nSocksVersion != 4 && nSocksVersion != 5) return InitError(strprintf(_("Unknown -socks proxy version requested: %i"), nSocksVersion)); diff --git a/src/net.cpp b/src/net.cpp index 7a1fcc50..5932f5f8 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -5,7 +5,7 @@ #include "db.h" #include "net.h" -#include "init.h" +#include "main.h" #include "addrman.h" #include "ui_interface.h" #include "script.h" @@ -68,6 +68,28 @@ CCriticalSection cs_vAddedNodes; static CSemaphore *semOutbound = NULL; +// +// Handlers that need to be registered +// +static ProcessMessagesHandler fnProcessMessages = NULL; +static SendMessagesHandler fnSendMessages = NULL; +static StartShutdownHandler fnStartShutdown = NULL; + +void SetProcessMessagesHandler(ProcessMessagesHandler handler) +{ + fnProcessMessages = handler; +} + +void SetSendMessagesHandler(SendMessagesHandler handler) +{ + fnSendMessages = handler; +} + +void SetStartShutdownHandler(StartShutdownHandler handler) +{ + fnStartShutdown = handler; +} + void AddOneShot(string strDest) { LOCK(cs_vOneShots); @@ -1632,8 +1654,8 @@ void ThreadMessageHandler() // Send messages { TRY_LOCK(pnode->cs_vSend, lockSend); - if (lockSend) - SendMessages(pnode, pnode == pnodeTrickle); + if (lockSend && fnSendMessages) + fnSendMessages(pnode, pnode == pnodeTrickle); } boost::this_thread::interruption_point(); } diff --git a/src/net.h b/src/net.h index 6f7bea93..1c8c99aa 100644 --- a/src/net.h +++ b/src/net.h @@ -45,6 +45,17 @@ void StartNode(boost::thread_group& threadGroup); bool StopNode(); void SocketSendData(CNode *pnode); +// +// Handlers that require registration +// +typedef bool (*ProcessMessagesHandler)(CNode* pfrom); +typedef bool (*SendMessagesHandler)(CNode* pto, bool fSendTrickle); +typedef void (*StartShutdownHandler)(); + +void SetProcessMessagesHandler(ProcessMessagesHandler handler); +void SetSendMessagesHandler(SendMessagesHandler handler); +void SetStartShutdownHandler(StartShutdownHandler handler); + enum { LOCAL_NONE, // unknown diff --git a/src/protocol.cpp b/src/protocol.cpp index 88bbe49a..1e22467a 100644 --- a/src/protocol.cpp +++ b/src/protocol.cpp @@ -6,7 +6,6 @@ #include "protocol.h" #include "util.h" #include "netbase.h" -#include "main.h" #ifndef WIN32 # include