add CallbackDispatcher
parent
ab04859950
commit
4920889a4b
@ -0,0 +1,68 @@
|
||||
#include "callback_dispatcher.hh"
|
||||
#include <stdexcept>
|
||||
#include <cassert>
|
||||
|
||||
namespace pEp {
|
||||
CallbackDispatcher dispatcher;
|
||||
|
||||
PEP_STATUS CallbackDispatcher::messageToSend(::message *msg)
|
||||
{
|
||||
return dispatcher._messageToSend(msg);
|
||||
}
|
||||
|
||||
PEP_STATUS CallbackDispatcher::notifyHandshake(::pEp_identity *me,
|
||||
::pEp_identity *partner, ::sync_handshake_signal signal)
|
||||
{
|
||||
return dispatcher._notifyHandshake(me, partner, signal);
|
||||
}
|
||||
|
||||
void CallbackDispatcher::add(::messageToSend_t messageToSend,
|
||||
::notifyHandshake_t notifyHandshake)
|
||||
{
|
||||
targets.push_back({messageToSend, notifyHandshake});
|
||||
}
|
||||
|
||||
void CallbackDispatcher::remove(::messageToSend_t messageToSend)
|
||||
{
|
||||
for (auto target = targets.begin(); target != targets.end(); ++target) {
|
||||
if (target->messageToSend == messageToSend) {
|
||||
targets.erase(target);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
PEP_STATUS CallbackDispatcher::_messageToSend(::message *msg)
|
||||
{
|
||||
for (auto target : targets) {
|
||||
auto _msg = ::message_dup(msg);
|
||||
if (!_msg)
|
||||
return PEP_OUT_OF_MEMORY;
|
||||
|
||||
target.messageToSend(_msg);
|
||||
}
|
||||
|
||||
return PEP_STATUS_OK;
|
||||
}
|
||||
|
||||
PEP_STATUS CallbackDispatcher::_notifyHandshake(::pEp_identity *me,
|
||||
::pEp_identity *partner, ::sync_handshake_signal signal)
|
||||
{
|
||||
for (auto target : targets) {
|
||||
auto _me = ::identity_dup(me);
|
||||
if (!_me)
|
||||
return PEP_OUT_OF_MEMORY;
|
||||
|
||||
auto _partner = ::identity_dup(partner);
|
||||
if (!_partner) {
|
||||
free_identity(_me);
|
||||
return PEP_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
target.notifyHandshake(_me, _partner, signal);
|
||||
}
|
||||
|
||||
return PEP_STATUS_OK;
|
||||
}
|
||||
};
|
||||
|
@ -0,0 +1,32 @@
|
||||
#pragma once
|
||||
|
||||
#include <vector>
|
||||
#include "Adapter.hh"
|
||||
|
||||
namespace pEp {
|
||||
class CallbackDispatcher {
|
||||
struct callbacks {
|
||||
::messageToSend_t messageToSend;
|
||||
::notifyHandshake_t notifyHandshake;
|
||||
};
|
||||
|
||||
std::vector<callbacks> targets;
|
||||
|
||||
public:
|
||||
static PEP_STATUS messageToSend(::message *msg);
|
||||
static PEP_STATUS notifyHandshake(::pEp_identity *me,
|
||||
::pEp_identity *partner, ::sync_handshake_signal signal);
|
||||
|
||||
void add(::messageToSend_t messageToSend,
|
||||
::notifyHandshake_t notifyHandshake);
|
||||
void remove(::messageToSend_t messageToSend);
|
||||
|
||||
protected:
|
||||
PEP_STATUS _messageToSend(::message *msg);
|
||||
PEP_STATUS _notifyHandshake(::pEp_identity *me,
|
||||
::pEp_identity *partner, ::sync_handshake_signal signal);
|
||||
};
|
||||
|
||||
extern CallbackDispatcher dispatcher;
|
||||
};
|
||||
|
Loading…
Reference in New Issue