
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