mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-08-13 08:35:45 -04:00
allowed some clients to Event handler to register with type NONE, which means that all event types will be sent to the client
This commit is contained in:
parent
f76b81ba49
commit
6a4c98b2ed
2 changed files with 20 additions and 25 deletions
|
@ -331,13 +331,13 @@ JsonApiServer::JsonApiServer(): configMutex("JsonApiServer config"),
|
||||||
rsEvents, "rsEvents", cAns, session ) )
|
rsEvents, "rsEvents", cAns, session ) )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
uint32_t event_type;
|
RsEventType eventType = RsEventType::NONE;
|
||||||
|
|
||||||
// deserialize input parameters from JSON
|
// deserialize input parameters from JSON
|
||||||
{
|
{
|
||||||
RsGenericSerializer::SerializeContext& ctx(cReq);
|
RsGenericSerializer::SerializeContext& ctx(cReq);
|
||||||
RsGenericSerializer::SerializeJob j(RsGenericSerializer::FROM_JSON);
|
RsGenericSerializer::SerializeJob j(RsGenericSerializer::FROM_JSON);
|
||||||
RS_SERIAL_PROCESS(event_type);
|
RS_SERIAL_PROCESS(eventType);
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::weak_ptr<rb::Session> weakSession(session);
|
const std::weak_ptr<rb::Session> weakSession(session);
|
||||||
|
@ -374,7 +374,7 @@ JsonApiServer::JsonApiServer(): configMutex("JsonApiServer config"),
|
||||||
} );
|
} );
|
||||||
};
|
};
|
||||||
|
|
||||||
bool retval = rsEvents->registerEventsHandler(static_cast<RsEventType>(event_type),multiCallback, hId);
|
bool retval = rsEvents->registerEventsHandler(eventType,multiCallback, hId);
|
||||||
|
|
||||||
{
|
{
|
||||||
RsGenericSerializer::SerializeContext& ctx(cAns);
|
RsGenericSerializer::SerializeContext& ctx(cAns);
|
||||||
|
|
|
@ -176,30 +176,25 @@ void RsEventsService::handleEvent(std::shared_ptr<const RsEvent> event)
|
||||||
{
|
{
|
||||||
std::function<void(std::shared_ptr<const RsEvent>)> mCallback;
|
std::function<void(std::shared_ptr<const RsEvent>)> mCallback;
|
||||||
|
|
||||||
uint32_t event_type_index = (uint32_t)event->mType;
|
uint32_t event_type_index = static_cast<uint32_t>(event->mType);
|
||||||
|
|
||||||
|
{
|
||||||
|
RS_STACK_MUTEX(mHandlerMapMtx); /* LOCKED AREA */
|
||||||
|
|
||||||
mHandlerMapMtx.lock();
|
|
||||||
if(event_type_index >= mHandlerMaps.size() || event_type_index < 1)
|
if(event_type_index >= mHandlerMaps.size() || event_type_index < 1)
|
||||||
{
|
{
|
||||||
RsErr() << "Cannot handle an event of type " << event_type_index << ": out of scope!" << std::endl;
|
RsErr() << "Cannot handle an event of type " << event_type_index << ": out of scope!" << std::endl;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
auto cbpt = mHandlerMaps[event_type_index].begin();
|
|
||||||
mHandlerMapMtx.unlock();
|
|
||||||
|
|
||||||
getHandlerFromMapLock:
|
// Call all clients that registered a callback for this event type
|
||||||
mHandlerMapMtx.lock();
|
|
||||||
if(cbpt != mHandlerMaps[event_type_index].end())
|
|
||||||
{
|
|
||||||
mCallback = cbpt->second;
|
|
||||||
++cbpt;
|
|
||||||
}
|
|
||||||
mHandlerMapMtx.unlock();
|
|
||||||
|
|
||||||
if(mCallback)
|
for(auto cbit: mHandlerMaps[event_type_index])
|
||||||
{
|
cbit.second(event);
|
||||||
mCallback(event); // It is relevant that this happens outside mutex
|
|
||||||
mCallback = std::function<void(std::shared_ptr<const RsEvent>)>(nullptr);
|
// Also call all clients that registered with NONE, meaning that they expect all events
|
||||||
goto getHandlerFromMapLock;
|
|
||||||
|
for(auto cbit: mHandlerMaps[static_cast<uint32_t>(RsEventType::NONE)])
|
||||||
|
cbit.second(event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue