#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; bool mComplete, mFailed; 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; } 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; } private: static void TimerEntry(boost::weak_ptr, const boost::system::error_code& result); }; typedef TaggedCache< uint256, std::vector > NodeCache; typedef std::vector VUC; class THSyncFilter : public SHAMapSyncFilter { protected: NodeCache* mCache; // holds nodes we see during the consensus process public: THSyncFilter(NodeCache* cache) : mCache(cache) { ; } virtual void gotNode(const SHAMapNode& id, const uint256& nodeHash, const std::vector& nodeData, bool) { boost::shared_ptr ptr = boost::make_shared(nodeData); mCache->canonicalize(nodeHash, ptr); } virtual bool haveNode(const SHAMapNode& id, const uint256& nodeHash, std::vector& nodeData) { boost::shared_ptr entry = mCache->fetch(nodeHash); if (!entry) return false; nodeData = *entry; return true; } }; 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; THSyncFilter mFilter; bool mHaveBase, mHaveState, mHaveTransactions; std::vector< boost::function > mOnComplete; void done(); void onTimer() { trigger(Peer::pointer()); } void newPeer(Peer::pointer peer) { trigger(peer); } void trigger(Peer::pointer); 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 addOnComplete(boost::function); bool takeBase(const std::string& data, Peer::pointer); bool takeTxNode(const std::list& IDs, const std::list >& data, Peer::pointer); bool takeAsNode(const std::list& IDs, const std::list >& data, 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