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:
Giel van Schijndel 2011-08-11 18:14:53 +02:00
parent 82dc6426b4
commit 507fd9d15b
9 changed files with 125 additions and 97 deletions

View file

@ -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;

View file

@ -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 \

View file

@ -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 \

View file

@ -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 \

View file

@ -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 \

View file

@ -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 \

View file

@ -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
View 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
View 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__