
2 changed files with 100 additions and 0 deletions
@ -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