diff --git a/callback_dispatcher.cc b/callback_dispatcher.cc new file mode 100644 index 0000000..c6098a8 --- /dev/null +++ b/callback_dispatcher.cc @@ -0,0 +1,68 @@ +#include "callback_dispatcher.hh" +#include +#include + +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; + } +}; + diff --git a/callback_dispatcher.hh b/callback_dispatcher.hh new file mode 100644 index 0000000..8a25303 --- /dev/null +++ b/callback_dispatcher.hh @@ -0,0 +1,32 @@ +#pragma once + +#include +#include "Adapter.hh" + +namespace pEp { + class CallbackDispatcher { + struct callbacks { + ::messageToSend_t messageToSend; + ::notifyHandshake_t notifyHandshake; + }; + + std::vector 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; +}; +