Browse Source

callbacks to Python

PYADPT-55
Volker Birk 9 years ago
parent
commit
18b18879d9
  1. 5
      src/pEpmodule.cc
  2. 30
      src/sync_mixin.cc
  3. 23
      src/sync_mixin.hh

5
src/pEpmodule.cc

@ -196,7 +196,10 @@ BOOST_PYTHON_MODULE(pEp)
// key sync API // key sync API
auto sync_mixin_class = class_<SyncMixIn>("SyncMixIn", "p≡p Sync MixIn"); auto sync_mixin_class = class_<SyncMixIn, SyncMixIn_callback, boost::noncopyable>(
"SyncMixIn", "p≡p Sync MixIn")
.def("messageToSend", &SyncMixIn::messageToSend)
.def("showHandshake", &SyncMixIn::showHandshake);
// init() and release() // init() and release()

30
src/sync_mixin.cc

@ -7,7 +7,7 @@ namespace pEp {
SyncMixIn::SyncMixIn() SyncMixIn::SyncMixIn()
{ {
PEP_STATUS status = register_sync_callbacks(session, (void *) this, PEP_STATUS status = register_sync_callbacks(session, (void *) this,
messageToSend, showHandshake); _messageToSend, _showHandshake);
assert(status == PEP_STATUS_OK); assert(status == PEP_STATUS_OK);
} }
@ -15,7 +15,7 @@ namespace pEp {
unregister_sync_callbacks(session); unregister_sync_callbacks(session);
} }
PEP_STATUS SyncMixIn::messageToSend(void *obj, message *msg) PEP_STATUS SyncMixIn::_messageToSend(void *obj, message *msg)
{ {
if (!obj) if (!obj)
return PEP_SEND_FUNCTION_NOT_REGISTERED; return PEP_SEND_FUNCTION_NOT_REGISTERED;
@ -23,26 +23,38 @@ namespace pEp {
if (!msg) if (!msg)
return PEP_ILLEGAL_VALUE; return PEP_ILLEGAL_VALUE;
object *that = (object *) obj; auto that = dynamic_cast< SyncMixIn_callback * >(
that->attr("messageToSend")(Message(msg)); static_cast< SyncMixIn * > (obj));
that->messageToSend(Message(msg));
return PEP_STATUS_OK; return PEP_STATUS_OK;
} }
PEP_STATUS SyncMixIn::showHandshake(void *obj, PEP_STATUS SyncMixIn::_showHandshake(void *obj,
pEp_identity *self, pEp_identity *partner) pEp_identity *me, pEp_identity *partner)
{ {
if (!obj) if (!obj)
return PEP_SEND_FUNCTION_NOT_REGISTERED; return PEP_SEND_FUNCTION_NOT_REGISTERED;
if (!(self && partner)) if (!(me && partner))
return PEP_ILLEGAL_VALUE; return PEP_ILLEGAL_VALUE;
object *that = (object *) obj; auto that = dynamic_cast< SyncMixIn_callback * >(
that->attr("showHandshake")(Identity(self), Identity(partner)); static_cast< SyncMixIn * > (obj));
that->showHandshake(Identity(me), Identity(partner));
return PEP_STATUS_OK; 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);
}
} }
} }

23
src/sync_mixin.hh

@ -9,10 +9,27 @@ namespace pEp {
SyncMixIn(); SyncMixIn();
virtual ~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: protected:
static PEP_STATUS messageToSend(void *obj, message *msg); static PEP_STATUS _messageToSend(void *obj, message *msg);
static PEP_STATUS showHandshake(void *obj, static PEP_STATUS _showHandshake(void *obj,
pEp_identity *self, pEp_identity *partner); 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);
}; };
} }
} }

Loading…
Cancel
Save