mirror of
https://github.com/PurpleI2P/i2pd
synced 2024-11-10 00:00:29 +03:00
list of request callbacks
This commit is contained in:
parent
9a724b2af9
commit
0f7db8e418
@ -29,7 +29,7 @@ namespace data
|
|||||||
|
|
||||||
RequestedDestination::~RequestedDestination ()
|
RequestedDestination::~RequestedDestination ()
|
||||||
{
|
{
|
||||||
if (m_RequestComplete) m_RequestComplete (nullptr);
|
InvokeRequestComplete (nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<I2NPMessage> RequestedDestination::CreateRequestMessage (std::shared_ptr<const RouterInfo> router,
|
std::shared_ptr<I2NPMessage> RequestedDestination::CreateRequestMessage (std::shared_ptr<const RouterInfo> router,
|
||||||
@ -68,17 +68,23 @@ namespace data
|
|||||||
{
|
{
|
||||||
m_ExcludedPeers.clear ();
|
m_ExcludedPeers.clear ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RequestedDestination::InvokeRequestComplete (std::shared_ptr<RouterInfo> r)
|
||||||
|
{
|
||||||
|
if (!m_RequestComplete.empty ())
|
||||||
|
{
|
||||||
|
for (auto it: m_RequestComplete)
|
||||||
|
if (it != nullptr) it (r);
|
||||||
|
m_RequestComplete.clear ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void RequestedDestination::Success (std::shared_ptr<RouterInfo> r)
|
void RequestedDestination::Success (std::shared_ptr<RouterInfo> r)
|
||||||
{
|
{
|
||||||
if (m_IsActive)
|
if (m_IsActive)
|
||||||
{
|
{
|
||||||
m_IsActive = false;
|
m_IsActive = false;
|
||||||
if (m_RequestComplete)
|
InvokeRequestComplete (r);
|
||||||
{
|
|
||||||
m_RequestComplete (r);
|
|
||||||
m_RequestComplete = nullptr;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -87,11 +93,7 @@ namespace data
|
|||||||
if (m_IsActive)
|
if (m_IsActive)
|
||||||
{
|
{
|
||||||
m_IsActive = false;
|
m_IsActive = false;
|
||||||
if (m_RequestComplete)
|
InvokeRequestComplete (nullptr);
|
||||||
{
|
|
||||||
m_RequestComplete (nullptr);
|
|
||||||
m_RequestComplete = nullptr;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -154,27 +156,22 @@ namespace data
|
|||||||
{
|
{
|
||||||
// request RouterInfo directly
|
// request RouterInfo directly
|
||||||
auto dest = m_RequestedDestinationsPool.AcquireSharedMt (destination, isExploratory, direct);
|
auto dest = m_RequestedDestinationsPool.AcquireSharedMt (destination, isExploratory, direct);
|
||||||
dest->SetRequestComplete (requestComplete);
|
if (requestComplete)
|
||||||
|
dest->AddRequestComplete (requestComplete);
|
||||||
{
|
{
|
||||||
std::unique_lock<std::mutex> l(m_RequestedDestinationsMutex);
|
std::unique_lock<std::mutex> l(m_RequestedDestinationsMutex);
|
||||||
auto ret = m_RequestedDestinations.emplace (destination, dest);
|
auto ret = m_RequestedDestinations.emplace (destination, dest);
|
||||||
if (!ret.second) // not inserted
|
if (!ret.second) // not inserted
|
||||||
{
|
{
|
||||||
dest->SetRequestComplete (nullptr); // don't call requestComplete in destructor
|
dest->ResetRequestComplete (); // don't call requestComplete in destructor
|
||||||
dest = ret.first->second; // existing one
|
dest = ret.first->second; // existing one
|
||||||
if (requestComplete && dest->IsActive ())
|
if (requestComplete)
|
||||||
{
|
{
|
||||||
auto prev = dest->GetRequestComplete ();
|
if (dest->IsActive ())
|
||||||
if (prev) // if already set
|
dest->AddRequestComplete (requestComplete);
|
||||||
dest->SetRequestComplete (
|
|
||||||
[requestComplete, prev](std::shared_ptr<RouterInfo> r)
|
|
||||||
{
|
|
||||||
prev (r); // call previous
|
|
||||||
requestComplete (r); // then new
|
|
||||||
});
|
|
||||||
else
|
else
|
||||||
dest->SetRequestComplete (requestComplete);
|
requestComplete (nullptr);
|
||||||
}
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
#include <unordered_set>
|
#include <unordered_set>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
#include <list>
|
||||||
#include "Identity.h"
|
#include "Identity.h"
|
||||||
#include "RouterInfo.h"
|
#include "RouterInfo.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
@ -53,19 +54,22 @@ namespace data
|
|||||||
std::shared_ptr<I2NPMessage> CreateRequestMessage (std::shared_ptr<const RouterInfo>, std::shared_ptr<const i2p::tunnel::InboundTunnel> replyTunnel);
|
std::shared_ptr<I2NPMessage> CreateRequestMessage (std::shared_ptr<const RouterInfo>, std::shared_ptr<const i2p::tunnel::InboundTunnel> replyTunnel);
|
||||||
std::shared_ptr<I2NPMessage> CreateRequestMessage (const IdentHash& floodfill);
|
std::shared_ptr<I2NPMessage> CreateRequestMessage (const IdentHash& floodfill);
|
||||||
|
|
||||||
void SetRequestComplete (const RequestComplete& requestComplete) { m_RequestComplete = requestComplete; };
|
void AddRequestComplete (const RequestComplete& requestComplete) { m_RequestComplete.push_back (requestComplete); };
|
||||||
RequestComplete GetRequestComplete () const { return m_RequestComplete; };
|
void ResetRequestComplete () { m_RequestComplete.clear (); };
|
||||||
bool IsRequestComplete () const { return m_RequestComplete != nullptr; };
|
|
||||||
void Success (std::shared_ptr<RouterInfo> r);
|
void Success (std::shared_ptr<RouterInfo> r);
|
||||||
void Fail ();
|
void Fail ();
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
void InvokeRequestComplete (std::shared_ptr<RouterInfo> r);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
IdentHash m_Destination;
|
IdentHash m_Destination;
|
||||||
bool m_IsExploratory, m_IsDirect, m_IsActive;
|
bool m_IsExploratory, m_IsDirect, m_IsActive;
|
||||||
std::unordered_set<IdentHash> m_ExcludedPeers;
|
std::unordered_set<IdentHash> m_ExcludedPeers;
|
||||||
uint64_t m_CreationTime, m_LastRequestTime; // in seconds
|
uint64_t m_CreationTime, m_LastRequestTime; // in seconds
|
||||||
RequestComplete m_RequestComplete;
|
std::list<RequestComplete> m_RequestComplete;
|
||||||
int m_NumAttempts;
|
int m_NumAttempts;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user