Complete the handler for received ledger data.

This commit is contained in:
JoelKatz
2012-02-20 21:10:23 -08:00
parent ef09bf96e7
commit b89d95f83d
4 changed files with 62 additions and 2 deletions

View File

@@ -65,6 +65,25 @@ Ledger::Ledger(const std::vector<unsigned char>& rawLedger) : mFeeHeld(0), mTime
}
}
Ledger::Ledger(const std::string& rawLedger) : mFeeHeld(0), mTimeStamp(0),
mLedgerSeq(0), mClosed(false), mValidHash(false), mAccepted(false), mImmutable(true)
{
Serializer s(rawLedger);
// 32seq, 64fee, 256phash, 256thash, 256ahash, 64ts
if(!s.get32(mLedgerSeq, BLgPIndex)) return;
if(!s.get64(mFeeHeld, BLgPFeeHeld)) return;
if(!s.get256(mParentHash, BLgPPrevLg)) return;
if(!s.get256(mTransHash, BLgPTxT)) return;
if(!s.get256(mAccountHash, BLgPAcT)) return;
if(!s.get64(mTimeStamp, BLgPClTs)) return;
updateHash();
if(mValidHash)
{
mTransactionMap=boost::make_shared<SHAMap>();
mAccountStateMap=boost::make_shared<SHAMap>();
}
}
void Ledger::updateHash()
{
if(!mImmutable)

View File

@@ -67,6 +67,7 @@ public:
Ledger(const uint256 &parentHash, const uint256 &transHash, const uint256 &accountHash,
uint64 feeHeld, uint64 timeStamp, uint32 ledgerSeq); // used for received ledgers
Ledger(const std::vector<unsigned char>& rawLedger);
Ledger(const std::string& rawLedger);
void setClosed() { mClosed=true; }
void setAccepted() { mAccepted=true; }

View File

@@ -199,7 +199,7 @@ void LedgerAcquire::badPeer(Peer::pointer ptr)
}
}
bool LedgerAcquire::takeBase(const std::vector<unsigned char>& data)
bool LedgerAcquire::takeBase(const std::string& data)
{ // Return value: true=normal, false=bad data
boost::recursive_mutex::scoped_lock sl(mLock);
if(mHaveBase) return true;
@@ -270,3 +270,42 @@ bool LedgerAcquireMaster::hasLedger(const uint256& hash)
boost::mutex::scoped_lock sl(mLock);
return mLedgers.find(hash)!=mLedgers.end();
}
bool LedgerAcquireMaster::gotLedgerData(newcoin::TMLedgerData& packet)
{
uint256 hash;
if(packet.ledgerhash().size()!=32) return false;
memcpy(&hash, packet.ledgerhash().data(), 32);
LedgerAcquire::pointer ledger=find(hash);
if(!ledger) return false;
if(packet.type()==newcoin::liBASE)
{
if(packet.nodes_size()!=1) return false;
const newcoin::TMLedgerNode& node=packet.nodes(0);
if(!node.has_nodedata()) return false;
return ledger->takeBase(node.nodedata());
}
else if( (packet.type()==newcoin::liTX_NODE) || (packet.type()==newcoin::liAS_NODE) )
{
std::list<SHAMapNode> nodeIDs;
std::list<std::vector<unsigned char> > nodeData;
if(packet.nodes().size()<=0) return false;
for(int i=0; i<packet.nodes().size(); i++)
{
const newcoin::TMLedgerNode& node=packet.nodes(i);
if(!node.has_nodeid() || !node.has_nodedata()) return false;
nodeIDs.push_back(SHAMapNode(node.nodeid().data(), node.nodeid().size()));
std::vector<unsigned char> rawNode(node.nodedata().size());
memcpy(&rawNode.front(), node.nodedata().data(), node.nodedata().size());
nodeData.push_back(rawNode);
}
if(packet.type()==newcoin::liTX_NODE) return ledger->takeTxNode(nodeIDs, nodeData);
else return ledger->takeAsNode(nodeIDs, nodeData);
}
else return false;
}

View File

@@ -47,7 +47,7 @@ public:
void peerHas(Peer::pointer);
void badPeer(Peer::pointer);
bool takeBase(const std::vector<unsigned char>& data);
bool takeBase(const std::string& data);
bool takeTxNode(const std::list<SHAMapNode>& IDs, const std::list<std::vector<unsigned char> >& data);
bool takeAsNode(const std::list<SHAMapNode>& IDs, const std::list<std::vector<unsigned char> >& data);
};
@@ -64,6 +64,7 @@ public:
LedgerAcquire::pointer findCreate(const uint256& hash);
LedgerAcquire::pointer find(const uint256& hash);
bool hasLedger(const uint256& ledgerHash);
bool gotLedgerData(newcoin::TMLedgerData& packet);
};
#endif