Browse Source

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>
tags/v0.15.1
Giel van Schijndel 10 years ago
parent
commit
507fd9d15b
9 changed files with 125 additions and 97 deletions
  1. 0
    1
      src/main.h
  2. 2
    0
      src/makefile.linux-mingw
  3. 2
    0
      src/makefile.mingw
  4. 2
    0
      src/makefile.osx
  5. 2
    0
      src/makefile.unix
  6. 2
    0
      src/makefile.vc
  7. 2
    96
      src/net.h
  8. 61
    0
      src/protocol.cpp
  9. 52
    0
      src/protocol.h

+ 0
- 1
src/main.h View File

@@ -21,7 +21,6 @@ class CKeyItem;
class CReserveKey;
class CWalletDB;

class CMessageHeader;
class CAddress;
class CInv;
class CRequestTracker;

+ 2
- 0
src/makefile.linux-mingw View File

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

+ 2
- 0
src/makefile.mingw View File

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

+ 2
- 0
src/makefile.osx View File

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

+ 2
- 0
src/makefile.unix View File

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

+ 2
- 0
src/makefile.vc View File

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

+ 2
- 96
src/net.h View File

@@ -14,7 +14,8 @@
#include <arpa/inet.h>
#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

+ 61
- 0
src/protocol.cpp 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
- 0
src/protocol.h 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__

Loading…
Cancel
Save