Browse Source

exception handling

synchronous
Volker Birk 5 years ago
parent
commit
1b670925f8
  1. 55
      callback_dispatcher.cc

55
callback_dispatcher.cc

@ -32,11 +32,19 @@ namespace pEp {
proc shutdown proc shutdown
) )
{ {
assert(messageToSend);
if (!messageToSend)
throw std::invalid_argument("messageToSend must be set");
targets.push_back({messageToSend, notifyHandshake, on_startup, shutdown}); targets.push_back({messageToSend, notifyHandshake, on_startup, shutdown});
} }
void CallbackDispatcher::remove(::messageToSend_t messageToSend) void CallbackDispatcher::remove(::messageToSend_t messageToSend)
{ {
assert(messageToSend);
if (!messageToSend)
throw std::invalid_argument("messageToSend argument needed");
for (auto target = targets.begin(); target != targets.end(); ++target) { for (auto target = targets.begin(); target != targets.end(); ++target) {
if (target->messageToSend == messageToSend) { if (target->messageToSend == messageToSend) {
targets.erase(target); targets.erase(target);
@ -49,14 +57,18 @@ namespace pEp {
void CallbackDispatcher::on_startup() void CallbackDispatcher::on_startup()
{ {
for (auto target : targets) for (auto target : targets) {
target.on_startup(); if (target.on_startup)
target.on_startup();
}
} }
void CallbackDispatcher::on_shutdown() void CallbackDispatcher::on_shutdown()
{ {
for (auto target : targets) for (auto target : targets) {
target.on_shutdown(); if (target.on_shutdown)
target.on_shutdown();
}
} }
void CallbackDispatcher::start_sync() void CallbackDispatcher::start_sync()
@ -66,16 +78,20 @@ namespace pEp {
&CallbackDispatcher::on_startup, &CallbackDispatcher::on_startup,
&CallbackDispatcher::on_shutdown); &CallbackDispatcher::on_shutdown);
for (auto target : callback_dispatcher.targets) for (auto target : callback_dispatcher.targets) {
target.notifyHandshake(nullptr, nullptr, SYNC_NOTIFY_START); if (target.notifyHandshake)
target.notifyHandshake(nullptr, nullptr, SYNC_NOTIFY_START);
}
} }
void CallbackDispatcher::stop_sync() void CallbackDispatcher::stop_sync()
{ {
pEp::Adapter::shutdown(); pEp::Adapter::shutdown();
for (auto target : callback_dispatcher.targets) for (auto target : callback_dispatcher.targets) {
target.notifyHandshake(nullptr, nullptr, SYNC_NOTIFY_STOP); if (target.notifyHandshake)
target.notifyHandshake(nullptr, nullptr, SYNC_NOTIFY_STOP);
}
} }
PEP_STATUS CallbackDispatcher::_messageToSend(::message *msg) PEP_STATUS CallbackDispatcher::_messageToSend(::message *msg)
@ -85,6 +101,7 @@ namespace pEp {
if (!_msg) if (!_msg)
return PEP_OUT_OF_MEMORY; return PEP_OUT_OF_MEMORY;
assert(target.messageToSend);
target.messageToSend(_msg); target.messageToSend(_msg);
} }
@ -95,17 +112,19 @@ namespace pEp {
::pEp_identity *partner, ::sync_handshake_signal signal) ::pEp_identity *partner, ::sync_handshake_signal signal)
{ {
for (auto target : targets) { for (auto target : targets) {
auto _me = ::identity_dup(me); if (target.notifyHandshake) {
if (!_me) auto _me = ::identity_dup(me);
return PEP_OUT_OF_MEMORY; if (!_me)
return PEP_OUT_OF_MEMORY;
auto _partner = ::identity_dup(partner);
if (!_partner) { auto _partner = ::identity_dup(partner);
free_identity(_me); if (!_partner) {
return PEP_OUT_OF_MEMORY; free_identity(_me);
return PEP_OUT_OF_MEMORY;
}
target.notifyHandshake(_me, _partner, signal);
} }
target.notifyHandshake(_me, _partner, signal);
} }
return PEP_STATUS_OK; return PEP_STATUS_OK;

Loading…
Cancel
Save