diff --git a/src/pEpmodule.cc b/src/pEpmodule.cc index 2479cb6..07bcc09 100644 --- a/src/pEpmodule.cc +++ b/src/pEpmodule.cc @@ -196,7 +196,10 @@ BOOST_PYTHON_MODULE(pEp) // key sync API - auto sync_mixin_class = class_("SyncMixIn", "p≡p Sync MixIn"); + auto sync_mixin_class = class_( + "SyncMixIn", "p≡p Sync MixIn") + .def("messageToSend", &SyncMixIn::messageToSend) + .def("showHandshake", &SyncMixIn::showHandshake); // init() and release() diff --git a/src/sync_mixin.cc b/src/sync_mixin.cc index 21aa695..c5fd64f 100644 --- a/src/sync_mixin.cc +++ b/src/sync_mixin.cc @@ -7,7 +7,7 @@ namespace pEp { SyncMixIn::SyncMixIn() { PEP_STATUS status = register_sync_callbacks(session, (void *) this, - messageToSend, showHandshake); + _messageToSend, _showHandshake); assert(status == PEP_STATUS_OK); } @@ -15,7 +15,7 @@ namespace pEp { unregister_sync_callbacks(session); } - PEP_STATUS SyncMixIn::messageToSend(void *obj, message *msg) + PEP_STATUS SyncMixIn::_messageToSend(void *obj, message *msg) { if (!obj) return PEP_SEND_FUNCTION_NOT_REGISTERED; @@ -23,26 +23,38 @@ namespace pEp { if (!msg) return PEP_ILLEGAL_VALUE; - object *that = (object *) obj; - that->attr("messageToSend")(Message(msg)); + 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 *self, pEp_identity *partner) + PEP_STATUS SyncMixIn::_showHandshake(void *obj, + pEp_identity *me, pEp_identity *partner) { if (!obj) return PEP_SEND_FUNCTION_NOT_REGISTERED; - if (!(self && partner)) + if (!(me && partner)) return PEP_ILLEGAL_VALUE; - object *that = (object *) obj; - that->attr("showHandshake")(Identity(self), Identity(partner)); + auto that = dynamic_cast< SyncMixIn_callback * >( + static_cast< SyncMixIn * > (obj)); + that->showHandshake(Identity(me), Identity(partner)); return PEP_STATUS_OK; } + + 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); + } } } diff --git a/src/sync_mixin.hh b/src/sync_mixin.hh index eae6fa4..df4814a 100644 --- a/src/sync_mixin.hh +++ b/src/sync_mixin.hh @@ -9,10 +9,27 @@ namespace pEp { SyncMixIn(); virtual ~SyncMixIn(); + virtual void messageToSend(Message msg) { + throw runtime_error("override this method"); + } + virtual void showHandshake(Identity me, Identity partner) { + throw runtime_error("override this method"); + } + protected: - static PEP_STATUS messageToSend(void *obj, message *msg); - static PEP_STATUS showHandshake(void *obj, - pEp_identity *self, pEp_identity *partner); + static PEP_STATUS _messageToSend(void *obj, message *msg); + static PEP_STATUS _showHandshake(void *obj, + pEp_identity *me, pEp_identity *partner); + }; + + class SyncMixIn_callback : public SyncMixIn { + PyObject* const _self; + + public: + SyncMixIn_callback(PyObject *self) : _self(self) { } + + void _messageToSend(Message msg); + void _showHandshake(Identity me, Identity partner); }; } }