void *data);
typedef void (*rpc_port_stub_disconnected_event_cb)(const char *sender,
void *data);
-typedef void (*rpc_port_stub_received_event_cb)(const char *sender,
+typedef int (*rpc_port_stub_received_event_cb)(const char *sender,
rpc_port_h port, void *data);
int rpc_port_stub_create(rpc_port_stub_h *h, const char *port_name);
int rpc_port_stub_destroy(rpc_port_stub_h h);
}
}
- void OnReceived(const std::string& sender, Port& port) override {
+ int OnReceived(const std::string& sender, Port& port) override {
for (auto& ev : received_events_) {
- ev->cb_(sender.c_str(), &port, ev->user_data_);
+ int ret = ev->cb_(sender.c_str(), &port, ev->user_data_);
+ if (ret != 0)
+ return -1;
}
+
+ return 0;
}
private:
for (auto& p : stub->ports_) {
if (p->GetFd() == fd) {
- stub->listener_->OnReceived(p->GetId(), *p);
+ int ret = stub->listener_->OnReceived(p->GetId(), *p);
+
+ if (ret != 0) {
+ stub->listener_->OnDisconnected(p->GetId());
+ stub->ports_.remove(p);
+ return FALSE;
+ }
+
break;
}
}
public:
virtual void OnConnected(const std::string& sender) = 0;
virtual void OnDisconnected(const std::string& sender) = 0;
- virtual void OnReceived(const std::string& sender, Port& port) = 0;
+ virtual int OnReceived(const std::string& sender, Port& port) = 0;
};
Stub(const std::string& port_name, bool mock = false);
void StubSetup() {
int ret = rpc_port_stub_add_received_event_cb(stub_handle_,
- [](const char* sender, rpc_port_h port, void *data) {
+ [](const char* sender, rpc_port_h port, void *data) -> int {
RpcPortConnection* p = static_cast<RpcPortConnection*>(data);
p->stub_port_ = port;
p->Finish();
+ return 0;
}, this);
ASSERT_EQ(ret, 0);