#ifndef __LEDGERACQUIRE__ #define __LEDGERACQUIRE__ #include #include #include #include #include #include #include #include #include "Ledger.h" #include "Peer.h" #include "TaggedCache.h" #include "../obj/src/newcoin.pb.h" class PeerSet { protected: uint256 mHash; int mTimerInterval, mTimeouts; bool mComplete, mFailed, mProgress; boost::recursive_mutex mLock; boost::asio::deadline_timer mTimer; std::vector< boost::weak_ptr > mPeers; PeerSet(const uint256& hash, int interval); virtual ~PeerSet() { ; } void sendRequest(const newcoin::TMGetLedger& message); void sendRequest(const newcoin::TMGetLedger& message, Peer::pointer peer); public: const uint256& getHash() const { return mHash; } bool isComplete() const { return mComplete; } bool isFailed() const { return mFailed; } int getTimeouts() const { return mTimeouts; } void progress() { mProgress = true; } void peerHas(Peer::pointer); void badPeer(Peer::pointer); void resetTimer(); protected: virtual void newPeer(Peer::pointer) = 0; virtual void onTimer(void) = 0; virtual boost::weak_ptr pmDowncast() = 0; void setComplete() { mComplete = true; } void setFailed() { mFailed = true; } void invokeOnTimer(); private: static void TimerEntry(boost::weak_ptr, const boost::system::error_code& result); }; class LedgerAcquire : public PeerSet, public boost::enable_shared_from_this { // A ledger we are trying to acquire public: typedef boost::shared_ptr pointer; protected: Ledger::pointer mLedger; bool mHaveBase, mHaveState, mHaveTransactions, mAborted; std::vector< boost::function > mOnComplete; void done(); void onTimer() { trigger(Peer::pointer()); } void newPeer(Peer::pointer peer) { trigger(peer); } boost::weak_ptr pmDowncast(); public: LedgerAcquire(const uint256& hash); bool isBase() const { return mHaveBase; } bool isAcctStComplete() const { return mHaveState; } bool isTransComplete() const { return mHaveTransactions; } Ledger::pointer getLedger() { return mLedger; } void abort() { mAborted = true; } void addOnComplete(boost::function); bool takeBase(const std::string& data); bool takeTxNode(const std::list& IDs, const std::list >& data); bool takeTxRootNode(const std::vector& data); bool takeAsNode(const std::list& IDs, const std::list >& data); bool takeAsRootNode(const std::vector& data); void trigger(Peer::pointer); }; 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); void dropLedger(const uint256& ledgerHash); bool gotLedgerData(newcoin::TMLedgerData& packet, Peer::pointer); }; #endif // vim:ts=4