diff --git a/LedgerAcquire.cpp b/LedgerAcquire.cpp new file mode 100644 index 0000000000..033d5eeba0 --- /dev/null +++ b/LedgerAcquire.cpp @@ -0,0 +1,98 @@ + +#include "boost/foreach.hpp" + +#include "Application.h" +#include "LedgerAcquire.h" + +LedgerAcquire::LedgerAcquire(const uint256& hash) : mHash(hash), + mComplete(false), mFailed(false), mHaveBase(false), mHaveState(false), mHaveTransactions(false) +{ +} + +void LedgerAcquire::done() +{ + std::vector< boost::function > triggers; + + mLock.lock(); + triggers=mOnComplete; + mLock.unlock(); + + for(int i=0; i wptr) +{ + LedgerAcquire::pointer ptr=wptr.lock(); + if(ptr) ptr->trigger(true); +} + +void LedgerAcquire::addOnComplete(boost::function trigger) +{ + mLock.lock(); + mOnComplete.push_back(trigger); + mLock.unlock(); +} + +void LedgerAcquire::trigger(bool timer) +{ + // WRITEME +} + +void LedgerAcquire::peerHas(Peer::pointer) +{ + // WRITEME +} + +void LedgerAcquire::badPeer(Peer::pointer) +{ + // WRITEME +} + +bool LedgerAcquire::takeBase(std::vector data) +{ + // WRITEME + return true; +} + +bool LedgerAcquire::takeTxNode(std::list hashes, std::list > data) +{ + // WRITEME + return true; +} + +bool LedgerAcquire::takeAsNode(std::list hashes, std::list > data) +{ + // WRITEME + return true; +} + +bool LedgerAcquire::takeTx(std::list hashes, std::list > data) +{ + // WRITEME + return true; +} + +LedgerAcquire::pointer LedgerAcquireMaster::findCreate(const uint256& hash) +{ + boost::mutex::scoped_lock sl(mLock); + LedgerAcquire::pointer& ptr=mLedgers[hash]; + if(!ptr) ptr=LedgerAcquire::pointer(new LedgerAcquire(hash)); + return ptr; +} + +LedgerAcquire::pointer LedgerAcquireMaster::find(const uint256& hash) +{ + LedgerAcquire::pointer ret; + boost::mutex::scoped_lock sl(mLock); + std::map::iterator it=mLedgers.find(hash); + if(it!=mLedgers.end()) ret=it->second; + return ret; +} + +bool LedgerAcquireMaster::hasLedger(const uint256& hash) +{ + boost::mutex::scoped_lock sl(mLock); + return mLedgers.find(hash)!=mLedgers.end(); +} diff --git a/LedgerAcquire.h b/LedgerAcquire.h index 47037eb25f..f2a4f5eb71 100644 --- a/LedgerAcquire.h +++ b/LedgerAcquire.h @@ -2,13 +2,15 @@ #define __LEDGERACQUIRE__ #include +#include +#include "boost/enable_shared_from_this.hpp" #include "boost/function.hpp" #include "Ledger.h" #include "Peer.h" -class LedgerAcquire +class LedgerAcquire : public boost::enable_shared_from_this { // A ledger we are trying to acquire public: typedef boost::shared_ptr pointer; @@ -18,12 +20,14 @@ protected: Ledger::pointer mLedger; uint256 mHash; bool mComplete, mFailed, mHaveBase, mHaveState, mHaveTransactions; - std::vector< boost::function > mOnComplete; + std::vector< boost::function > mOnComplete; std::list > mPeers; // peers known to have this ledger - void done(void); - void timerEntry(void); + void done(); + void trigger(bool timer); + + static void timerEntry(boost::weak_ptr); public: LedgerAcquire(const uint256& hash); @@ -36,13 +40,14 @@ public: bool isTransComplete() const { return mHaveTransactions; } Ledger::pointer getLedger() { return mLedger; } - void addTrigger(boost::function); + void addOnComplete(boost::function); - void peerHash(Peer::pointer); - void takeBase(std::vector data); - void takeTxNode(std::list hashes, std::list > data); - void takeAsNode(std::list hashes, std::list > data); - void takeTx(std::list hashes, std::list > data); + void peerHas(Peer::pointer); + void badPeer(Peer::pointer); + bool takeBase(std::vector data); + bool takeTxNode(std::list hashes, std::list > data); + bool takeAsNode(std::list hashes, std::list > data); + bool takeTx(std::list hashes, std::list > data); }; class LedgerAcquireMaster