From 507fd9d15baac950df494742d67bcbafdaa4752c Mon Sep 17 00:00:00 2001 From: Giel van Schijndel Date: Thu, 11 Aug 2011 18:14:53 +0200 Subject: [PATCH] Start moving protocol-specific code to protocol.[ch]pp Move CMessageHeader from net.h to protocol.[ch]pp, with the implementation in the .cpp compilation unit (compiling once is enough). This commit does *not* and should not modify *any* code, it only moves it from net.h and splits it across protocol.cpp and protocol.hpp. Indentation changes aside the closest thing to a modification of code is the addition of the 'TODO' comment (the execution of which requires code modifications and thus doesn't belong in this commit). Signed-off-by: Giel van Schijndel --- src/main.h | 1 - src/makefile.linux-mingw | 2 + src/makefile.mingw | 2 + src/makefile.osx | 2 + src/makefile.unix | 2 + src/makefile.vc | 2 + src/net.h | 98 +--------------------------------------- src/protocol.cpp | 61 +++++++++++++++++++++++++ src/protocol.h | 52 +++++++++++++++++++++ 9 files changed, 125 insertions(+), 97 deletions(-) create mode 100644 src/protocol.cpp create mode 100644 src/protocol.h diff --git a/src/main.h b/src/main.h index d4b89225..427067bc 100644 --- a/src/main.h +++ b/src/main.h @@ -21,7 +21,6 @@ class CKeyItem; class CReserveKey; class CWalletDB; -class CMessageHeader; class CAddress; class CInv; class CRequestTracker; diff --git a/src/makefile.linux-mingw b/src/makefile.linux-mingw index c03cb9d2..12f6e212 100644 --- a/src/makefile.linux-mingw +++ b/src/makefile.linux-mingw @@ -48,6 +48,7 @@ HEADERS = \ main.h \ net.h \ noui.h \ + protocol.h \ rpc.h \ script.h \ serialize.h \ @@ -75,6 +76,7 @@ OBJS= \ obj/keystore.o \ obj/main.o \ obj/net.o \ + obj/protocol.o \ obj/rpc.o \ obj/script.o \ obj/util.o \ diff --git a/src/makefile.mingw b/src/makefile.mingw index 55cb8a70..893700b8 100644 --- a/src/makefile.mingw +++ b/src/makefile.mingw @@ -45,6 +45,7 @@ HEADERS = \ main.h \ net.h \ noui.h \ + protocol.h \ rpc.h \ script.h \ serialize.h \ @@ -72,6 +73,7 @@ OBJS= \ obj/keystore.o \ obj/main.o \ obj/net.o \ + obj/protocol.o \ obj/rpc.o \ obj/script.o \ obj/util.o \ diff --git a/src/makefile.osx b/src/makefile.osx index 7172bcc4..48908d9f 100644 --- a/src/makefile.osx +++ b/src/makefile.osx @@ -45,6 +45,7 @@ HEADERS = \ main.h \ net.h \ noui.h \ + protocol.h \ rpc.h \ script.h \ serialize.h \ @@ -63,6 +64,7 @@ OBJS= \ obj/keystore.o \ obj/main.o \ obj/net.o \ + obj/protocol.o \ obj/rpc.o \ obj/script.o \ obj/util.o \ diff --git a/src/makefile.unix b/src/makefile.unix index 7cc72e0e..a4f13ae2 100644 --- a/src/makefile.unix +++ b/src/makefile.unix @@ -51,6 +51,7 @@ HEADERS = \ main.h \ net.h \ noui.h \ + protocol.h \ rpc.h \ script.h \ serialize.h \ @@ -69,6 +70,7 @@ OBJS= \ obj/keystore.o \ obj/main.o \ obj/net.o \ + obj/protocol.o \ obj/rpc.o \ obj/script.o \ obj/util.o \ diff --git a/src/makefile.vc b/src/makefile.vc index edaba80a..a5437bcf 100644 --- a/src/makefile.vc +++ b/src/makefile.vc @@ -58,6 +58,7 @@ HEADERS = \ main.h \ net.h \ noui.h \ + protocol.h \ rpc.h \ script.h \ serialize.h \ @@ -77,6 +78,7 @@ OBJS= \ obj\main.o \ obj\net.o \ obj\rpc.o \ + obj\protocol.o \ obj\script.o \ obj\util.o \ obj\wallet.o \ diff --git a/src/net.h b/src/net.h index 52568ef4..7a4706d5 100644 --- a/src/net.h +++ b/src/net.h @@ -14,7 +14,8 @@ #include #endif -class CMessageHeader; +#include "protocol.h" + class CAddress; class CAddrDB; class CInv; @@ -54,101 +55,6 @@ bool BindListenPort(std::string& strError=REF(std::string())); void StartNode(void* parg); bool StopNode(); - - - - - - - -// -// Message header -// (4) message start -// (12) command -// (4) size -// (4) checksum - -extern unsigned char pchMessageStart[4]; - -class CMessageHeader -{ -public: - enum { COMMAND_SIZE=12 }; - char pchMessageStart[sizeof(::pchMessageStart)]; - char pchCommand[COMMAND_SIZE]; - unsigned int nMessageSize; - unsigned int nChecksum; - - CMessageHeader() - { - memcpy(pchMessageStart, ::pchMessageStart, sizeof(pchMessageStart)); - memset(pchCommand, 0, sizeof(pchCommand)); - pchCommand[1] = 1; - nMessageSize = -1; - nChecksum = 0; - } - - CMessageHeader(const char* pszCommand, unsigned int nMessageSizeIn) - { - memcpy(pchMessageStart, ::pchMessageStart, sizeof(pchMessageStart)); - strncpy(pchCommand, pszCommand, COMMAND_SIZE); - nMessageSize = nMessageSizeIn; - nChecksum = 0; - } - - IMPLEMENT_SERIALIZE - ( - READWRITE(FLATDATA(pchMessageStart)); - READWRITE(FLATDATA(pchCommand)); - READWRITE(nMessageSize); - if (nVersion >= 209) - READWRITE(nChecksum); - ) - - std::string GetCommand() - { - if (pchCommand[COMMAND_SIZE-1] == 0) - return std::string(pchCommand, pchCommand + strlen(pchCommand)); - else - return std::string(pchCommand, pchCommand + COMMAND_SIZE); - } - - bool IsValid() - { - // Check start string - if (memcmp(pchMessageStart, ::pchMessageStart, sizeof(pchMessageStart)) != 0) - return false; - - // Check the command string for errors - for (char* p1 = pchCommand; p1 < pchCommand + COMMAND_SIZE; p1++) - { - if (*p1 == 0) - { - // Must be all zeros after the first zero - for (; p1 < pchCommand + COMMAND_SIZE; p1++) - if (*p1 != 0) - return false; - } - else if (*p1 < ' ' || *p1 > 0x7E) - return false; - } - - // Message size - if (nMessageSize > MAX_SIZE) - { - printf("CMessageHeader::IsValid() : (%s, %u bytes) nMessageSize > MAX_SIZE\n", GetCommand().c_str(), nMessageSize); - return false; - } - - return true; - } -}; - - - - - - static const unsigned char pchIPv4[12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff }; class CAddress diff --git a/src/protocol.cpp b/src/protocol.cpp new file mode 100644 index 00000000..0bb1da93 --- /dev/null +++ b/src/protocol.cpp @@ -0,0 +1,61 @@ +// Copyright (c) 2009-2010 Satoshi Nakamoto +// Copyright (c) 2011 The Bitcoin developers +// Distributed under the MIT/X11 software license, see the accompanying +// file license.txt or http://www.opensource.org/licenses/mit-license.php. + +#include "protocol.h" + +CMessageHeader::CMessageHeader() +{ + memcpy(pchMessageStart, ::pchMessageStart, sizeof(pchMessageStart)); + memset(pchCommand, 0, sizeof(pchCommand)); + pchCommand[1] = 1; + nMessageSize = -1; + nChecksum = 0; +} + +CMessageHeader::CMessageHeader(const char* pszCommand, unsigned int nMessageSizeIn) +{ + memcpy(pchMessageStart, ::pchMessageStart, sizeof(pchMessageStart)); + strncpy(pchCommand, pszCommand, COMMAND_SIZE); + nMessageSize = nMessageSizeIn; + nChecksum = 0; +} + +std::string CMessageHeader::GetCommand() const +{ + if (pchCommand[COMMAND_SIZE-1] == 0) + return std::string(pchCommand, pchCommand + strlen(pchCommand)); + else + return std::string(pchCommand, pchCommand + COMMAND_SIZE); +} + +bool CMessageHeader::IsValid() const +{ + // Check start string + if (memcmp(pchMessageStart, ::pchMessageStart, sizeof(pchMessageStart)) != 0) + return false; + + // Check the command string for errors + for (const char* p1 = pchCommand; p1 < pchCommand + COMMAND_SIZE; p1++) + { + if (*p1 == 0) + { + // Must be all zeros after the first zero + for (; p1 < pchCommand + COMMAND_SIZE; p1++) + if (*p1 != 0) + return false; + } + else if (*p1 < ' ' || *p1 > 0x7E) + return false; + } + + // Message size + if (nMessageSize > MAX_SIZE) + { + printf("CMessageHeader::IsValid() : (%s, %u bytes) nMessageSize > MAX_SIZE\n", GetCommand().c_str(), nMessageSize); + return false; + } + + return true; +} diff --git a/src/protocol.h b/src/protocol.h new file mode 100644 index 00000000..b5baeb2a --- /dev/null +++ b/src/protocol.h @@ -0,0 +1,52 @@ +// Copyright (c) 2009-2010 Satoshi Nakamoto +// Copyright (c) 2011 The Bitcoin developers +// Distributed under the MIT/X11 software license, see the accompanying +// file license.txt or http://www.opensource.org/licenses/mit-license.php. + +#ifndef __cplusplus +# error This header can only be compiled as C++. +#endif + +#ifndef __INCLUDED_PROTOCOL_H__ +#define __INCLUDED_PROTOCOL_H__ + +#include "serialize.h" +#include + +// +// Message header +// (4) message start +// (12) command +// (4) size +// (4) checksum + +extern unsigned char pchMessageStart[4]; + +class CMessageHeader +{ + public: + CMessageHeader(); + CMessageHeader(const char* pszCommand, unsigned int nMessageSizeIn); + + std::string GetCommand() const; + bool IsValid() const; + + IMPLEMENT_SERIALIZE + ( + READWRITE(FLATDATA(pchMessageStart)); + READWRITE(FLATDATA(pchCommand)); + READWRITE(nMessageSize); + if (nVersion >= 209) + READWRITE(nChecksum); + ) + + // TODO: make private (improves encapsulation) + public: + enum { COMMAND_SIZE=12 }; + char pchMessageStart[sizeof(::pchMessageStart)]; + char pchCommand[COMMAND_SIZE]; + unsigned int nMessageSize; + unsigned int nChecksum; +}; + +#endif // __INCLUDED_PROTOCOL_H__