diff --git a/libbitdht/src/bitdht/bdiface.h b/libbitdht/src/bitdht/bdiface.h index 8b2a0631c..82720d9e5 100644 --- a/libbitdht/src/bitdht/bdiface.h +++ b/libbitdht/src/bitdht/bdiface.h @@ -198,6 +198,35 @@ class bdBucket std::list entries; }; +class bdQueryStatus +{ + public: + uint32_t mStatus; + uint32_t mQFlags; + std::list mResults; +}; + +class bdQuerySummary +{ + public: + + bdNodeId mId; + bdMetric mLimit; + uint32_t mState; + time_t mQueryTS; + uint32_t mQueryFlags; + int32_t mSearchTime; + + int32_t mQueryIdlePeerRetryPeriod; // seconds between retries. + + // closest peers + std::multimap mClosest; + std::multimap mPotentialClosest; + std::list mPotentialProxies; +}; + + + /* Status options */ #define BITDHT_QUERY_READY 1 @@ -268,6 +297,9 @@ virtual int getDhtPeerAddress(const bdNodeId *id, struct sockaddr_in &from) = 0; virtual int getDhtValue(const bdNodeId *id, std::string key, std::string &value) = 0; virtual int getDhtBucket(const int idx, bdBucket &bucket) = 0; +virtual int getDhtQueries(std::map &queries) = 0; +virtual int getDhtQueryStatus(const bdNodeId *id, bdQuerySummary &query) = 0; + /* stats and Dht state */ virtual int startDht() = 0; virtual int stopDht() = 0; diff --git a/libbitdht/src/bitdht/bdmanager.cc b/libbitdht/src/bitdht/bdmanager.cc index 6dc4fca55..493baec92 100644 --- a/libbitdht/src/bitdht/bdmanager.cc +++ b/libbitdht/src/bitdht/bdmanager.cc @@ -802,6 +802,16 @@ int bdNodeManager::getDhtBucket(const int idx, bdBucket &bucket) return mNodeSpace.getDhtBucket(idx, bucket); } +int bdNodeManager::getDhtQueries(std::map &queries) +{ + bdNode::QueryStatus(queries); + return 1; +} + +int bdNodeManager::getDhtQueryStatus(const bdNodeId *id, bdQuerySummary &query) +{ + return bdNode::QuerySummary(id, query); +} /***** Add / Remove Callback Clients *****/ diff --git a/libbitdht/src/bitdht/bdmanager.h b/libbitdht/src/bitdht/bdmanager.h index f0d452c0b..ac2ccf015 100644 --- a/libbitdht/src/bitdht/bdmanager.h +++ b/libbitdht/src/bitdht/bdmanager.h @@ -115,6 +115,9 @@ virtual int getDhtPeerAddress(const bdNodeId *id, struct sockaddr_in &from); virtual int getDhtValue(const bdNodeId *id, std::string key, std::string &value); virtual int getDhtBucket(const int idx, bdBucket &bucket); +virtual int getDhtQueries(std::map &queries); +virtual int getDhtQueryStatus(const bdNodeId *id, bdQuerySummary &query); + /***** Connection Interface ****/ virtual void ConnectionRequest(struct sockaddr_in *laddr, bdNodeId *target, uint32_t mode); virtual void ConnectionAuth(bdId *srcId, bdId *proxyId, bdId *destId, diff --git a/libbitdht/src/bitdht/bdnode.cc b/libbitdht/src/bitdht/bdnode.cc index 3e9afc2ce..0b2fa1db0 100644 --- a/libbitdht/src/bitdht/bdnode.cc +++ b/libbitdht/src/bitdht/bdnode.cc @@ -686,6 +686,30 @@ void bdNode::QueryStatus(std::map &statusMap) } } +int bdNode::QuerySummary(const bdNodeId *id, bdQuerySummary &query) +{ + std::list::iterator it; + for(it = mLocalQueries.begin(); it != mLocalQueries.end(); it++) + { + if ((*it)->mId == *id) + { + query.mId = (*it)->mId; + query.mLimit = (*it)->mLimit; + query.mState = (*it)->mState; + query.mQueryTS = (*it)->mQueryTS; + query.mQueryFlags = (*it)->mQueryFlags; + query.mSearchTime = (*it)->mSearchTime; + query.mClosest = (*it)->mClosest; + query.mPotentialClosest = (*it)->mPotentialClosest; + query.mPotentialProxies = (*it)->mPotentialProxies; + + return 1; + } + } + return 0; +} + + /************************************ Process Remote Query *************************/ void bdNode::processRemoteQuery() diff --git a/libbitdht/src/bitdht/bdnode.h b/libbitdht/src/bitdht/bdnode.h index fc865dc3a..4e0bdde7f 100644 --- a/libbitdht/src/bitdht/bdnode.h +++ b/libbitdht/src/bitdht/bdnode.h @@ -114,6 +114,7 @@ class bdNode void addQuery(const bdNodeId *id, uint32_t qflags); void clearQuery(const bdNodeId *id); void QueryStatus(std::map &statusMap); + int QuerySummary(const bdNodeId *id, bdQuerySummary &query); /* connection functions */ void requestConnection(bdNodeId *id, uint32_t modes); diff --git a/libbitdht/src/bitdht/bdquery.h b/libbitdht/src/bitdht/bdquery.h index a0fa633e0..08f7c2a33 100644 --- a/libbitdht/src/bitdht/bdquery.h +++ b/libbitdht/src/bitdht/bdquery.h @@ -63,7 +63,7 @@ int printQuery(); int32_t mQueryIdlePeerRetryPeriod; // seconds between retries. - private: + //private: // closest peers std::multimap mClosest; @@ -73,6 +73,8 @@ int printQuery(); bdDhtFunctions *mFns; }; +#if 0 + class bdQueryStatus { public: @@ -81,6 +83,8 @@ class bdQueryStatus std::list mResults; }; +#endif + /* this is just a container class. diff --git a/libbitdht/src/udp/udpbitdht.cc b/libbitdht/src/udp/udpbitdht.cc index aa2b72f48..5044243fb 100644 --- a/libbitdht/src/udp/udpbitdht.cc +++ b/libbitdht/src/udp/udpbitdht.cc @@ -168,6 +168,23 @@ int UdpBitDht::getDhtBucket(const int idx, bdBucket &bucket) } + +int UdpBitDht::getDhtQueries(std::map &queries) +{ + bdStackMutex stack(dhtMtx); /********** MUTEX LOCKED *************/ + + return mBitDhtManager->getDhtQueries(queries); +} + +int UdpBitDht::getDhtQueryStatus(const bdNodeId *id, bdQuerySummary &query) +{ + bdStackMutex stack(dhtMtx); /********** MUTEX LOCKED *************/ + + return mBitDhtManager->getDhtQueryStatus(id, query); +} + + + /* stats and Dht state */ int UdpBitDht:: startDht() { diff --git a/libbitdht/src/udp/udpbitdht.h b/libbitdht/src/udp/udpbitdht.h index 0c75aae7e..036686cc4 100644 --- a/libbitdht/src/udp/udpbitdht.h +++ b/libbitdht/src/udp/udpbitdht.h @@ -77,6 +77,9 @@ virtual int getDhtPeerAddress(const bdNodeId *id, struct sockaddr_in &from); virtual int getDhtValue(const bdNodeId *id, std::string key, std::string &value); virtual int getDhtBucket(const int idx, bdBucket &bucket); +virtual int getDhtQueries(std::map &queries); +virtual int getDhtQueryStatus(const bdNodeId *id, bdQuerySummary &query); + /* stats and Dht state */ virtual int startDht(); virtual int stopDht();