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 <me@mortis.eu>
This commit is contained in:
parent
82dc6426b4
commit
507fd9d15b
9 changed files with 125 additions and 97 deletions
|
@ -21,7 +21,6 @@ class CKeyItem;
|
||||||
class CReserveKey;
|
class CReserveKey;
|
||||||
class CWalletDB;
|
class CWalletDB;
|
||||||
|
|
||||||
class CMessageHeader;
|
|
||||||
class CAddress;
|
class CAddress;
|
||||||
class CInv;
|
class CInv;
|
||||||
class CRequestTracker;
|
class CRequestTracker;
|
||||||
|
|
|
@ -48,6 +48,7 @@ HEADERS = \
|
||||||
main.h \
|
main.h \
|
||||||
net.h \
|
net.h \
|
||||||
noui.h \
|
noui.h \
|
||||||
|
protocol.h \
|
||||||
rpc.h \
|
rpc.h \
|
||||||
script.h \
|
script.h \
|
||||||
serialize.h \
|
serialize.h \
|
||||||
|
@ -75,6 +76,7 @@ OBJS= \
|
||||||
obj/keystore.o \
|
obj/keystore.o \
|
||||||
obj/main.o \
|
obj/main.o \
|
||||||
obj/net.o \
|
obj/net.o \
|
||||||
|
obj/protocol.o \
|
||||||
obj/rpc.o \
|
obj/rpc.o \
|
||||||
obj/script.o \
|
obj/script.o \
|
||||||
obj/util.o \
|
obj/util.o \
|
||||||
|
|
|
@ -45,6 +45,7 @@ HEADERS = \
|
||||||
main.h \
|
main.h \
|
||||||
net.h \
|
net.h \
|
||||||
noui.h \
|
noui.h \
|
||||||
|
protocol.h \
|
||||||
rpc.h \
|
rpc.h \
|
||||||
script.h \
|
script.h \
|
||||||
serialize.h \
|
serialize.h \
|
||||||
|
@ -72,6 +73,7 @@ OBJS= \
|
||||||
obj/keystore.o \
|
obj/keystore.o \
|
||||||
obj/main.o \
|
obj/main.o \
|
||||||
obj/net.o \
|
obj/net.o \
|
||||||
|
obj/protocol.o \
|
||||||
obj/rpc.o \
|
obj/rpc.o \
|
||||||
obj/script.o \
|
obj/script.o \
|
||||||
obj/util.o \
|
obj/util.o \
|
||||||
|
|
|
@ -45,6 +45,7 @@ HEADERS = \
|
||||||
main.h \
|
main.h \
|
||||||
net.h \
|
net.h \
|
||||||
noui.h \
|
noui.h \
|
||||||
|
protocol.h \
|
||||||
rpc.h \
|
rpc.h \
|
||||||
script.h \
|
script.h \
|
||||||
serialize.h \
|
serialize.h \
|
||||||
|
@ -63,6 +64,7 @@ OBJS= \
|
||||||
obj/keystore.o \
|
obj/keystore.o \
|
||||||
obj/main.o \
|
obj/main.o \
|
||||||
obj/net.o \
|
obj/net.o \
|
||||||
|
obj/protocol.o \
|
||||||
obj/rpc.o \
|
obj/rpc.o \
|
||||||
obj/script.o \
|
obj/script.o \
|
||||||
obj/util.o \
|
obj/util.o \
|
||||||
|
|
|
@ -51,6 +51,7 @@ HEADERS = \
|
||||||
main.h \
|
main.h \
|
||||||
net.h \
|
net.h \
|
||||||
noui.h \
|
noui.h \
|
||||||
|
protocol.h \
|
||||||
rpc.h \
|
rpc.h \
|
||||||
script.h \
|
script.h \
|
||||||
serialize.h \
|
serialize.h \
|
||||||
|
@ -69,6 +70,7 @@ OBJS= \
|
||||||
obj/keystore.o \
|
obj/keystore.o \
|
||||||
obj/main.o \
|
obj/main.o \
|
||||||
obj/net.o \
|
obj/net.o \
|
||||||
|
obj/protocol.o \
|
||||||
obj/rpc.o \
|
obj/rpc.o \
|
||||||
obj/script.o \
|
obj/script.o \
|
||||||
obj/util.o \
|
obj/util.o \
|
||||||
|
|
|
@ -58,6 +58,7 @@ HEADERS = \
|
||||||
main.h \
|
main.h \
|
||||||
net.h \
|
net.h \
|
||||||
noui.h \
|
noui.h \
|
||||||
|
protocol.h \
|
||||||
rpc.h \
|
rpc.h \
|
||||||
script.h \
|
script.h \
|
||||||
serialize.h \
|
serialize.h \
|
||||||
|
@ -77,6 +78,7 @@ OBJS= \
|
||||||
obj\main.o \
|
obj\main.o \
|
||||||
obj\net.o \
|
obj\net.o \
|
||||||
obj\rpc.o \
|
obj\rpc.o \
|
||||||
|
obj\protocol.o \
|
||||||
obj\script.o \
|
obj\script.o \
|
||||||
obj\util.o \
|
obj\util.o \
|
||||||
obj\wallet.o \
|
obj\wallet.o \
|
||||||
|
|
98
src/net.h
98
src/net.h
|
@ -14,7 +14,8 @@
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
class CMessageHeader;
|
#include "protocol.h"
|
||||||
|
|
||||||
class CAddress;
|
class CAddress;
|
||||||
class CAddrDB;
|
class CAddrDB;
|
||||||
class CInv;
|
class CInv;
|
||||||
|
@ -54,101 +55,6 @@ bool BindListenPort(std::string& strError=REF(std::string()));
|
||||||
void StartNode(void* parg);
|
void StartNode(void* parg);
|
||||||
bool StopNode();
|
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 };
|
static const unsigned char pchIPv4[12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff };
|
||||||
|
|
||||||
class CAddress
|
class CAddress
|
||||||
|
|
61
src/protocol.cpp
Normal file
61
src/protocol.cpp
Normal file
|
@ -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;
|
||||||
|
}
|
52
src/protocol.h
Normal file
52
src/protocol.h
Normal file
|
@ -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 <string>
|
||||||
|
|
||||||
|
//
|
||||||
|
// 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__
|
Loading…
Reference in a new issue