Fix stub callback types 18/170718/2
authorHwankyu Jhun <h.jhun@samsung.com>
Wed, 21 Feb 2018 23:43:15 +0000 (08:43 +0900)
committerHwankyu Jhun <h.jhun@samsung.com>
Thu, 22 Feb 2018 00:42:59 +0000 (09:42 +0900)
To handle each request, a unique ID is needed.

Change-Id: I9d9a9928795f15f8560569cffa93c434470f8fba
Signed-off-by: Hwankyu Jhun <h.jhun@samsung.com>
CMakeLists.txt
include/rpc-port.h
packaging/rpc-port.spec
src/port-internal.cc
src/port-internal.h
src/rpc-port.cc
src/stub-internal.cc
src/stub-internal.h
unit_tests/src/rpc_port_test.cc

index d787267..74d68ba 100644 (file)
@@ -6,7 +6,7 @@ INCLUDE_DIRECTORIES (
        ${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})
index 7ba6e8e..7897990 100755 (executable)
@@ -53,11 +53,11 @@ int rpc_port_proxy_add_received_event_cb(rpc_port_proxy_h h,
 /* 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);
index 8ac8896..a7bcda7 100755 (executable)
@@ -16,6 +16,7 @@ BuildRequires:  pkgconfig(pkgmgr-info)
 BuildRequires:  pkgconfig(gmock)
 BuildRequires:  pkgconfig(cynara-client)
 BuildRequires:  pkgconfig(cynara-creds-gdbus)
+BuildRequires:  pkgconfig(uuid)
 
 Requires(post): /sbin/ldconfig
 Requires(post): coreutils
index 695f617..7f95add 100644 (file)
@@ -23,6 +23,7 @@
 #include <stdio.h>
 #include <poll.h>
 #include <unistd.h>
+#include <uuid/uuid.h>
 #include <dlog.h>
 
 #include "port-internal.h"
@@ -40,7 +41,13 @@ namespace rpc_port {
 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_);
@@ -133,4 +140,4 @@ int Port::Write(const void* buf, unsigned int size) {
 }
 
 }  // namespace internal
-}  // namespace rpc_port
\ No newline at end of file
+}  // namespace rpc_port
index 67bc1e5..9d52ae2 100644 (file)
@@ -44,9 +44,14 @@ class Port {
     return mutex_;
   }
 
+  const std::string& GetInstance() const {
+    return instance_;
+  }
+
  private:
   int fd_;
   std::string id_;
+  std::string instance_;
   mutable std::recursive_mutex mutex_;
 };
 
index ba9ead2..5c81f93 100755 (executable)
@@ -133,21 +133,25 @@ class StubExt : public Stub, public Stub::IEventListener {
         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;
     }
index 994195b..18a2dbb 100644 (file)
@@ -65,7 +65,7 @@ gboolean Stub::OnDataReceived(GIOChannel *gio, GIOCondition cond,
     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)
@@ -74,11 +74,11 @@ gboolean Stub::OnDataReceived(GIOChannel *gio, GIOCondition cond,
         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)
@@ -102,7 +102,7 @@ gboolean Stub::OnSocketDisconnected(GIOChannel *gio, GIOCondition cond,
   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;
     }
@@ -116,7 +116,12 @@ gboolean Stub::OnSocketDisconnected(GIOChannel *gio, GIOCondition cond,
 
 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)
index 13a809b..5819428 100644 (file)
@@ -35,9 +35,12 @@ class Stub : private FdBroker::IEventListener {
  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);
index d69c593..5d8686e 100644 (file)
@@ -103,7 +103,8 @@ class RpcPortConnection : public RpcPortBase {
 
   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();
@@ -112,7 +113,7 @@ class RpcPortConnection : public RpcPortBase {
     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();
@@ -164,7 +165,7 @@ class RpcPortConnection : public RpcPortBase {
 
 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;