#ifndef __LEDGERACQUIRE__ #define __LEDGERACQUIRE__ #include #include #include "boost/enable_shared_from_this.hpp" #include "boost/function.hpp" #include "Ledger.h" #include "Peer.h" #include "../obj/src/newcoin.pb.h" class LedgerAcquire : public boost::enable_shared_from_this { // A ledger we are trying to acquire public: typedef boost::shared_ptr pointer; protected: boost::recursive_mutex mLock; Ledger::pointer mLedger; uint256 mHash; bool mComplete, mFailed, mHaveBase, mHaveState, mHaveTransactions; std::vector< boost::function > mOnComplete; std::list > mPeers; // peers known to have this ledger void done(); void trigger(bool timer); static void timerEntry(boost::weak_ptr); void sendRequest(boost::shared_ptr message); void setTimer(); public: LedgerAcquire(const uint256& hash); const uint256& getHash() const { return mHash; } bool isComplete() const { return mComplete; } bool isFailed() const { return mFailed; } bool isBase() const { return mHaveBase; } bool isAcctStComplete() const { return mHaveState; } bool isTransComplete() const { return mHaveTransactions; } Ledger::pointer getLedger() { return mLedger; } void addOnComplete(boost::function); void peerHas(Peer::pointer); void badPeer(Peer::pointer); bool takeBase(const std::string& data); bool takeTxNode(const std::list& IDs, const std::list >& data); bool takeAsNode(const std::list& IDs, const std::list >& data); }; class LedgerAcquireMaster { protected: boost::mutex mLock; std::map mLedgers; public: LedgerAcquireMaster() { ; } LedgerAcquire::pointer findCreate(const uint256& hash); LedgerAcquire::pointer find(const uint256& hash); bool hasLedger(const uint256& ledgerHash); bool gotLedgerData(newcoin::TMLedgerData& packet); }; #endif