Skip to content

Commit

Permalink
Start moving protocol-specific code to protocol.[ch]pp
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
muggenhor committed Aug 19, 2011
1 parent 82dc642 commit 507fd9d
Show file tree
Hide file tree
Showing 9 changed files with 125 additions and 97 deletions.
1 change: 0 additions & 1 deletion src/main.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ class CKeyItem;
class CReserveKey;
class CWalletDB;

class CMessageHeader;
class CAddress;
class CInv;
class CRequestTracker;
Expand Down
2 changes: 2 additions & 0 deletions src/makefile.linux-mingw
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ HEADERS = \
main.h \
net.h \
noui.h \
protocol.h \
rpc.h \
script.h \
serialize.h \
Expand Down Expand Up @@ -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 \
Expand Down
2 changes: 2 additions & 0 deletions src/makefile.mingw
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ HEADERS = \
main.h \
net.h \
noui.h \
protocol.h \
rpc.h \
script.h \
serialize.h \
Expand Down Expand Up @@ -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 \
Expand Down
2 changes: 2 additions & 0 deletions src/makefile.osx
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ HEADERS = \
main.h \
net.h \
noui.h \
protocol.h \
rpc.h \
script.h \
serialize.h \
Expand All @@ -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 \
Expand Down
2 changes: 2 additions & 0 deletions src/makefile.unix
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ HEADERS = \
main.h \
net.h \
noui.h \
protocol.h \
rpc.h \
script.h \
serialize.h \
Expand All @@ -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 \
Expand Down
2 changes: 2 additions & 0 deletions src/makefile.vc
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ HEADERS = \
main.h \
net.h \
noui.h \
protocol.h \
rpc.h \
script.h \
serialize.h \
Expand All @@ -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 \
Expand Down
98 changes: 2 additions & 96 deletions src/net.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@
#include <arpa/inet.h>
#endif

class CMessageHeader;
#include "protocol.h"

class CAddress;
class CAddrDB;
class CInv;
Expand Down Expand Up @@ -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
Expand Down
61 changes: 61 additions & 0 deletions src/protocol.cpp
Original file line number Diff line number Diff line change
@@ -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 changes: 52 additions & 0 deletions src/protocol.h
Original file line number Diff line number Diff line change
@@ -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__

0 comments on commit 507fd9d

Please sign in to comment.