To handle each request, a unique ID is needed.
Change-Id: I9d9a9928795f15f8560569cffa93c434470f8fba
Signed-off-by: Hwankyu Jhun <h.jhun@samsung.com>
${CMAKE_SOURCE_DIR}/src
)
-SET(${this_target}_requires "dlog bundle glib-2.0 gio-2.0 aul capi-base-common pkgmgr-info gio-unix-2.0 cynara-client cynara-creds-gdbus")
+SET(${this_target}_requires "dlog bundle glib-2.0 gio-2.0 aul capi-base-common pkgmgr-info gio-unix-2.0 cynara-client cynara-creds-gdbus uuid")
INCLUDE(FindPkgConfig)
pkg_check_modules(${this_target} REQUIRED ${${this_target}_requires})
/* stub */
typedef void *rpc_port_stub_h;
typedef void (*rpc_port_stub_connected_event_cb)(const char *sender,
- void *data);
+ const char *instance, void *data);
typedef void (*rpc_port_stub_disconnected_event_cb)(const char *sender,
- void *data);
+ const char *instance, void *data);
typedef int (*rpc_port_stub_received_event_cb)(const char *sender,
- rpc_port_h port, void *data);
+ const char *instance, 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);
int rpc_port_stub_listen(rpc_port_stub_h h);
BuildRequires: pkgconfig(gmock)
BuildRequires: pkgconfig(cynara-client)
BuildRequires: pkgconfig(cynara-creds-gdbus)
+BuildRequires: pkgconfig(uuid)
Requires(post): /sbin/ldconfig
Requires(post): coreutils
#include <stdio.h>
#include <poll.h>
#include <unistd.h>
+#include <uuid/uuid.h>
#include <dlog.h>
#include "port-internal.h"
namespace internal {
Port::Port(int fd, const std::string& id)
- : fd_(fd), id_(id) {}
+ : fd_(fd), id_(id) {
+ char uuid[37];
+ uuid_t u;
+ uuid_generate(u);
+ uuid_unparse(u, uuid);
+ instance_ = std::string(uuid) + ":" + id;
+}
Port::~Port() {
close(fd_);
}
} // namespace internal
-} // namespace rpc_port
\ No newline at end of file
+} // namespace rpc_port
return mutex_;
}
+ const std::string& GetInstance() const {
+ return instance_;
+ }
+
private:
int fd_;
std::string id_;
+ std::string instance_;
mutable std::recursive_mutex mutex_;
};
new Event<rpc_port_stub_received_event_cb>(cb, user_data));
}
- void OnConnected(const std::string& sender) override {
+ void OnConnected(const std::string& sender,
+ const std::string& instance) override {
for (auto& ev : connected_events_) {
- ev->cb_(sender.c_str(), ev->user_data_);
+ ev->cb_(sender.c_str(), instance.c_str(), ev->user_data_);
}
}
- void OnDisconnected(const std::string& sender) override {
+ void OnDisconnected(const std::string& sender,
+ const std::string& instance) override {
for (auto& ev : disconnected_events_) {
- ev->cb_(sender.c_str(), ev->user_data_);
+ ev->cb_(sender.c_str(), instance.c_str(), ev->user_data_);
}
}
- int OnReceived(const std::string& sender, Port& port) override {
+ int OnReceived(const std::string& sender,
+ const std::string& instance, Port& port) override {
for (auto& ev : received_events_) {
- int ret = ev->cb_(sender.c_str(), &port, ev->user_data_);
+ int ret = ev->cb_(sender.c_str(), instance.c_str(), &port,
+ ev->user_data_);
if (ret != 0)
return -1;
}
if (p->GetFd() == fd) {
if (recv(fd, buffer, sizeof(buffer), MSG_PEEK | MSG_DONTWAIT) == 0) {
LOGW("Socket was disconnected from proxy");
- stub->listener_->OnDisconnected(p->GetId());
+ stub->listener_->OnDisconnected(p->GetId(), p->GetInstance());
stub->ports_.remove(p);
if (aul_rpc_port_notify_rpc_finished() != AUL_R_OK)
return FALSE;
}
- int ret = stub->listener_->OnReceived(p->GetId(), *p);
+ int ret = stub->listener_->OnReceived(p->GetId(), p->GetInstance(), *p);
if (ret != 0) {
LOGW("Invalid protocol");
- stub->listener_->OnDisconnected(p->GetId());
+ stub->listener_->OnDisconnected(p->GetId(), p->GetInstance());
stub->ports_.remove(p);
if (aul_rpc_port_notify_rpc_finished() != AUL_R_OK)
LOGW("Socket was disconnected");
for (auto& p : stub->ports_) {
if (p->GetFd() == fd) {
- stub->listener_->OnDisconnected(p->GetId());
+ stub->listener_->OnDisconnected(p->GetId(), p->GetInstance());
stub->ports_.remove(p);
break;
}
void Stub::OnFdReceived(const std::string& sender, int fd) {
ports_.emplace_back(new AcceptedPort(this, fd, sender));
- listener_->OnConnected(sender);
+ for (auto& p : ports_) {
+ if (p->GetFd() == fd) {
+ listener_->OnConnected(p->GetId(), p->GetInstance());
+ break;
+ }
+ }
}
Stub::AcceptedPort::AcceptedPort(Stub* parent, int fd, const std::string& id)
public:
class IEventListener {
public:
- virtual void OnConnected(const std::string& sender) = 0;
- virtual void OnDisconnected(const std::string& sender) = 0;
- virtual int OnReceived(const std::string& sender, Port& port) = 0;
+ virtual void OnConnected(const std::string& sender,
+ const std::string& instance) = 0;
+ virtual void OnDisconnected(const std::string& sender,
+ const std::string& instance) = 0;
+ virtual int OnReceived(const std::string& sender,
+ const std::string& instance, 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) -> int {
+ [](const char* sender, const char* instance,
+ rpc_port_h port, void *data) -> int {
RpcPortConnection* p = static_cast<RpcPortConnection*>(data);
p->stub_port_ = port;
p->Finish();
ASSERT_EQ(ret, 0);
ret = rpc_port_stub_add_disconnected_event_cb(stub_handle_,
- [](const char* sender, void *data) {
+ [](const char* sender, const char* instance, void *data) {
RpcPortConnection* p = static_cast<RpcPortConnection*>(data);
p->touch_stub_disconnected_event_cb_ = true;
p->Finish();
TEST_F(RpcPortBase, rpc_port_event_connect) {
int ret = rpc_port_stub_add_connected_event_cb(stub_handle_,
- [](const char *sender, void *data) {
+ [](const char *sender, const char* instance, void *data) {
RpcPortBase* p = static_cast<RpcPortBase*>(data);
p->touch_stub_connected_event_cb_ = true;