#include "sync_mixin.hh" #include #ifndef NDEBUG #include #endif #include namespace pEp { namespace PythonAdapter { SyncMixIn::SyncMixIn() { PEP_STATUS status = register_sync_callbacks(session, (void *) this, _messageToSend, _showHandshake, NULL, NULL); assert(status == PEP_STATUS_OK); } SyncMixIn::~SyncMixIn() { unregister_sync_callbacks(session); } PEP_STATUS SyncMixIn::_messageToSend(void *obj, message *msg) { if (!obj) return PEP_SEND_FUNCTION_NOT_REGISTERED; if (!msg) return PEP_ILLEGAL_VALUE; auto that = dynamic_cast< SyncMixIn_callback * >( static_cast< SyncMixIn * > (obj)); that->messageToSend(Message(msg)); return PEP_STATUS_OK; } PEP_STATUS SyncMixIn::_showHandshake(void *obj, pEp_identity *me, pEp_identity *partner) { if (!obj) return PEP_SEND_FUNCTION_NOT_REGISTERED; if (!(me && partner)) return PEP_ILLEGAL_VALUE; auto that = dynamic_cast< SyncMixIn_callback * >( static_cast< SyncMixIn * > (obj)); that->showHandshake(Identity(me), Identity(partner)); return PEP_STATUS_OK; } void SyncMixIn::deliverHandshakeResult(int result) { ::deliverHandshakeResult(session, (sync_handshake_result) result); } #ifndef NDEBUG void SyncMixIn::_inject(int event, Identity partner, object extra) { PEP_STATUS status = fsm_DeviceState_inject(session, (DeviceState_event) event, partner, NULL); } #endif int SyncMixIn::inject_sync_msg(void *msg, void *management) { SyncMixIn *that = (SyncMixIn *) management; val = 0; that->_msg = msg; setjmp(that->env); if (!that->val) do_sync_protocol(session, management); return 0; } void *SyncMixIn::retrieve_next_sync_msg(void *management) { static int twice = 1; twice = !twice; SyncMixIn *that = (SyncMixIn *) management; if (!twice) return (void *) that->_msg; longjmp(that->env, 1); return (void *) 23; } void SyncMixIn_callback::_messageToSend(Message msg) { call_method< void >(_self, "messageToSend", msg); } void SyncMixIn_callback::_showHandshake(Identity me, Identity partner) { call_method< void >(_self, "showHandshake", me, partner); } } }