diff --git a/src/NetworkOPs.cpp b/src/NetworkOPs.cpp index 8ffeba80e..218313844 100644 --- a/src/NetworkOPs.cpp +++ b/src/NetworkOPs.cpp @@ -324,6 +324,19 @@ void NetworkOPs::switchLastClosedLedger(Ledger::pointer newLedger, bool normal) { // this ledger has already closed } + newcoin::TMStatusChange* s = new newcoin::TMStatusChange(); + + s->set_newevent(normal ? newcoin::neACCEPTED_LEDGER : newcoin::neSWITCHED_LEDGER); + s->set_ledgerseq(newLedger->getLedgerSeq()); + s->set_networktime(getNetworkTimeNC()); + + uint256 lhash = newLedger->getHash(); + s->set_ledgerhash(lhash.begin(), lhash.size()); + lhash = newLedger->getParentHash(); + s->set_previousledgerhash(lhash.begin(), lhash.size()); + + PackedMessage::pointer packet = + boost::make_shared(PackedMessage::MessagePointer(s), newcoin::mtSTATUS_CHANGE); + theApp->getConnectionPool().relayMessage(NULL, packet); } -// FIXME: We have to tell peers when we change our active ledger diff --git a/src/Peer.cpp b/src/Peer.cpp index b2c04561f..9b318d1f0 100644 --- a/src/Peer.cpp +++ b/src/Peer.cpp @@ -34,7 +34,7 @@ void Peer::handle_write(const boost::system::error_code& error, size_t bytes_tra std::cerr << "Peer::handle_write bytes: "<< bytes_transferred << std::endl; #endif - mSendingPacket=PackedMessage::pointer(); + mSendingPacket = PackedMessage::pointer(); if(error) { @@ -400,6 +400,17 @@ void Peer::processReadBuffer() } break; + case newcoin::mtSTATUS_CHANGE: + { + newcoin::TMStatusChange msg; + if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE)) + recvStatus(msg); + else std::cerr << "parse error: " << type << std::endl; + } + break; + + + case newcoin::mtGET_LEDGER: { newcoin::TMGetLedger msg; @@ -627,33 +638,49 @@ void Peer::recvAccount(newcoin::TMAccount& packet) { } +void Peer::recvStatus(newcoin::TMStatusChange& packet) +{ + if (packet.has_ledgerhash() && (packet.ledgerhash().size() == (256 / 8))) + { // a peer has changed ledgers + if (packet.has_previousledgerhash() && (packet.previousledgerhash().size() == (256 / 8))) + memcpy(mPreviousLedgerHash.begin(), packet.previousledgerhash().data(), 256 / 8); + else + mPreviousLedgerHash = mClosedLedgerHash; + memcpy(mClosedLedgerHash.begin(), packet.ledgerhash().data(), 256 / 8); + if (packet.has_networktime()) + mClosedLedgerTime = ptFromSeconds(packet.networktime()); + else + mClosedLedgerTime = theApp->getOPs().getNetworkTimePT(); + } +} + void Peer::recvGetLedger(newcoin::TMGetLedger& packet) { // Figure out what ledger they want Ledger::pointer ledger; - if(packet.has_ledgerhash()) + if (packet.has_ledgerhash()) { uint256 ledgerhash; - if(packet.ledgerhash().size()!=32) + if (packet.ledgerhash().size() != 32) { punishPeer(PP_INVALID_REQUEST); return; } memcpy(&ledgerhash, packet.ledgerhash().data(), 32); - ledger=theApp->getMasterLedger().getLedgerByHash(ledgerhash); + ledger = theApp->getMasterLedger().getLedgerByHash(ledgerhash); } - else if(packet.has_ledgerseq()) - ledger=theApp->getMasterLedger().getLedgerBySeq(packet.ledgerseq()); - else if(packet.has_ltype() && (packet.ltype() == newcoin::ltCURRENT) ) - ledger=theApp->getMasterLedger().getCurrentLedger(); - else if(packet.has_ltype() && (packet.ltype() == newcoin::ltCLOSING) ) + else if (packet.has_ledgerseq()) + ledger = theApp->getMasterLedger().getLedgerBySeq(packet.ledgerseq()); + else if (packet.has_ltype() && (packet.ltype() == newcoin::ltCURRENT)) + ledger = theApp->getMasterLedger().getCurrentLedger(); + else if (packet.has_ltype() && (packet.ltype() == newcoin::ltCLOSING)) { ledger = theApp->getMasterLedger().getClosedLedger(); } - else if(packet.has_ltype() && (packet.ltype() == newcoin::ltCLOSED) ) + else if (packet.has_ltype() && (packet.ltype() == newcoin::ltCLOSED) ) { ledger = theApp->getMasterLedger().getClosedLedger(); - if(ledger && !ledger->isClosed()) + if (ledger && !ledger->isClosed()) ledger = theApp->getMasterLedger().getLedgerBySeq(ledger->getLedgerSeq() - 1); } else @@ -669,8 +696,8 @@ void Peer::recvGetLedger(newcoin::TMGetLedger& packet) } // Figure out what information they want - newcoin::TMLedgerData* data=new newcoin::TMLedgerData; - uint256 lHash=ledger->getHash(); + newcoin::TMLedgerData* data =new newcoin::TMLedgerData; + uint256 lHash = ledger->getHash(); data->set_ledgerhash(lHash.begin(), lHash.size()); data->set_ledgerseq(ledger->getLedgerSeq()); data->set_type(packet.itype()); @@ -788,6 +815,8 @@ void Peer::sendHello() { uint256 hash = closedLedger->getHash(); h->set_closedledger(hash.begin(), hash.GetSerializeSize()); + hash = closedLedger->getParentHash(); + h->set_previousledger(hash.begin(), hash.GetSerializeSize()); } PackedMessage::pointer packet = boost::make_shared diff --git a/src/Peer.h b/src/Peer.h index fbb3b8063..8f8c2b573 100644 --- a/src/Peer.h +++ b/src/Peer.h @@ -83,6 +83,7 @@ protected: void recvAccount(newcoin::TMAccount& packet); void recvGetLedger(newcoin::TMGetLedger& packet); void recvLedger(newcoin::TMLedgerData& packet); + void recvStatus(newcoin::TMStatusChange& packet); void getSessionCookie(std::string& strDst);