Fix event interface
authorSangyoon Jang <jeremy.jang@samsung.com>
Mon, 15 Mar 2021 07:29:05 +0000 (16:29 +0900)
committer장상윤/Tizen Platform Lab(SR)/Engineer/삼성전자 <jeremy.jang@samsung.com>
Tue, 16 Mar 2021 03:42:55 +0000 (12:42 +0900)
Since we cannot duplicate vine_dp_h, we need to use shared_ptr for
passing VineDp to event handlers.
For similar reason, copy constructor of VineDp should be deleted.

Change-Id: I64ae939f0592046473b4fd6410c70424c0a73fdb
Signed-off-by: Sangyoon Jang <jeremy.jang@samsung.com>
cion/vine/vine_dp.cc
cion/vine/vine_dp.hh
cion/vine/vine_interfaces.hh
cion/vine/vine_server_dp.cc

index e4c0a826a3435fd659ccd2381f7f0eb4da322938..2f51fba83cbd5952742218e011d527f18080a43c 100644 (file)
@@ -19,6 +19,7 @@
 #include <vine.h>
 
 #include <memory>
+#include <utility>
 #include <vector>
 
 #include "cion/common/exception.hh"
@@ -77,51 +78,15 @@ int VineDp::GetPort() const {
 }
 
 bool VineDp::Open() {
-  int ret = vine_dp_set_received_cb(dp_,
-      [](vine_dp_h dp, size_t received_len, void* user_data) {
-        VineDp* self = static_cast<VineDp*>(user_data);
-        if (!self->received_handler_) {
-          LOG(WARNING) << "No terminated handler for dp("
-                       << static_cast<void*>(self->GetRawDp()) << ")";
-          return;
-        }
-
-        std::vector<unsigned char> data(received_len);
-        size_t bytes = 0;
-        int ret = vine_dp_recv(dp, data.data(), data.size(), &bytes);
-        if (ret != VINE_ERROR_NONE) {
-          LOG(ERROR) << "Failed to recv from dp: " << ret;
-          return;
-        }
-        LOG(DEBUG) << "Recv " << received_len << ", received: " << bytes;
-
-        VineDp sender_dp(dp, false);
-        self->received_handler_->OnReceived(sender_dp, data);
-      }, this);
-  if (ret != VINE_ERROR_NONE) {
-    LOG(ERROR) << "Failed to set received cb of dp("
-               << static_cast<void*>(dp_) << "): " << ret;
+  if (!SetVineDpTerminatedCb()) {
+    LOG(ERROR) << "Failed to set vine dp terminated cb";
     return false;
   }
-
-  ret = vine_dp_set_terminated_cb(dp_,
-      [](vine_dp_h dp, void* user_data) {
-        VineDp* self = static_cast<VineDp*>(user_data);
-        if (!self->terminated_handler_) {
-          LOG(WARNING) << "No terminated event handler for dp("
-                       << static_cast<void*>(self->GetRawDp()) << ")";
-          return;
-        }
-        VineDp terminated_dp(dp, false);
-        self->terminated_handler_->OnTerminated(terminated_dp);
-      }, this);
-  if (ret != VINE_ERROR_NONE) {
-    LOG(ERROR) << "Failed to set terminated cb of dp("
-               << static_cast<void*>(dp_) << "): " << ret;
+  if (!SetVineDpReceivedCb()) {
+    LOG(ERROR) << "Failed to set vine dp received cb";
     return false;
   }
-
-  ret = vine_dp_open(dp_,
+  int ret = vine_dp_open(dp_,
       [](vine_dp_h dp, vine_error_e result, void* user_data) {
         VineDp* self = static_cast<VineDp*>(user_data);
         LOG(INFO) << "dp(" << static_cast<void*>(dp) << ") open result: "
@@ -131,8 +96,7 @@ bool VineDp::Open() {
                        << static_cast<void*>(self->GetRawDp()) << ")";
           return;
         }
-        VineDp opened_dp(dp, false);
-        self->opened_handler_->OnOpened(opened_dp);
+        self->opened_handler_->OnOpened(std::make_shared<VineDp>(dp, false));
       }, this);
   if (ret != VINE_ERROR_NONE) {
     LOG(ERROR) << "Failed to open dp(" << static_cast<void*>(dp_)
@@ -165,4 +129,57 @@ void VineDp::SetDpReceivedEventHandler(IVineDpReceivedEventHandler* handler) {
   received_handler_ = handler;
 }
 
+bool VineDp::SetVineDpTerminatedCb() {
+  int ret = vine_dp_set_terminated_cb(dp_,
+      [](vine_dp_h dp, void* user_data) {
+        VineDp* self = static_cast<VineDp*>(user_data);
+        LOG(DEBUG) << "dp(" << static_cast<void*>(dp) << ") terminated";
+        if (!self->terminated_handler_) {
+          LOG(WARNING) << "No terminated event handler for dp("
+                       << static_cast<void*>(self->GetRawDp()) << ")";
+          return;
+        }
+        self->terminated_handler_->OnTerminated(
+            std::make_shared<VineDp>(dp, false));
+      }, this);
+  if (ret != VINE_ERROR_NONE) {
+    LOG(ERROR) << "Failed to set terminated cb of dp("
+               << static_cast<void*>(dp_) << "): " << ret;
+    return false;
+  }
+  return true;
+}
+
+bool VineDp::SetVineDpReceivedCb() {
+  int ret = vine_dp_set_received_cb(dp_,
+      [](vine_dp_h dp, size_t received_len, void* user_data) {
+        VineDp* self = static_cast<VineDp*>(user_data);
+        if (!self->received_handler_) {
+          LOG(WARNING) << "No received handler for dp("
+                       << static_cast<void*>(self->GetRawDp()) << ")";
+          return;
+        }
+
+        std::vector<unsigned char> data(received_len);
+        size_t bytes = 0;
+        int ret = vine_dp_recv(dp, data.data(), data.size(), &bytes);
+        if (ret != VINE_ERROR_NONE) {
+          LOG(ERROR) << "Failed to recv from dp: " << ret;
+          return;
+        }
+        LOG(DEBUG) << "dp(" << static_cast<void*>(dp) << ") received "
+                   << received_len << " bytes, vine_dp_recv received "
+                   << bytes << " bytes";
+
+        self->received_handler_->OnReceived(
+            std::make_shared<VineDp>(dp, false), data);
+      }, this);
+  if (ret != VINE_ERROR_NONE) {
+    LOG(ERROR) << "Failed to set received cb of dp("
+               << static_cast<void*>(dp_) << "): " << ret;
+    return false;
+  }
+  return true;
+}
+
 }  // namespace cion
index 7b3a3c8c3aefae93f94bf4299ffc68ee0813e04f..8e3d5dc75d01368038744e615b123cce9562780c 100644 (file)
@@ -33,7 +33,9 @@ class VineDp {
  public:
   VineDp(vine_dp_h dp, bool is_owned = true);
   virtual ~VineDp();
-
+  // delete copy constructor
+  VineDp(const VineDp& other) = delete;
+  VineDp& operator=(const VineDp& other) = delete;
   bool SendData(const std::vector<unsigned char>& data);
   bool SendDataAsync(const std::vector<unsigned char>& data);
   vine_dp_h GetRawDp() const;
@@ -43,9 +45,12 @@ class VineDp {
   void SetDpTerminatedEventHandler(IVineDpTerminatedEventHandler* handler);
   void SetDpOpenedEventHandler(IVineDpOpenedEventHandler* handler);
   void SetDpReceivedEventHandler(IVineDpReceivedEventHandler* handler);
+  bool SetVineDpTerminatedCb();
+  bool SetVineDpReceivedCb();
 
  protected:
   VineDp();
+
   vine_dp_h dp_;
   std::shared_ptr<VineSession> session_;
 
index 1e12ed13e8e2f503a42b1f3f1efb7045d61a6994..5db2f43e2d6a3e35462200ebf318c17a40cd7dbe 100644 (file)
@@ -26,28 +26,30 @@ namespace cion {
 class VineDp;
 class VineService;
 
+using VineDpPtr = std::shared_ptr<VineDp>;
+
 class IVineDpTerminatedEventHandler {
  public:
   virtual ~IVineDpTerminatedEventHandler() = default;
-  virtual void OnTerminated(VineDp dp) = 0;
+  virtual void OnTerminated(VineDpPtr dp) = 0;
 };
 
 class IVineDpOpenedEventHandler {
  public:
   virtual ~IVineDpOpenedEventHandler() = default;
-  virtual void OnOpened(VineDp dp) = 0;
+  virtual void OnOpened(VineDpPtr dp) = 0;
 };
 
 class IVineDpReceivedEventHandler {
  public:
   virtual ~IVineDpReceivedEventHandler() = default;
-  virtual void OnReceived(VineDp dp, std::vector<unsigned char> data) = 0;
+  virtual void OnReceived(VineDpPtr dp, std::vector<unsigned char> data) = 0;
 };
 
 class IVineDpAcceptedEventHandler {
  public:
   virtual ~IVineDpAcceptedEventHandler() = default;
-  virtual void OnAccepted(VineDp dp) = 0;
+  virtual void OnAccepted(VineDpPtr dp) = 0;
 };
 
 class IVineBrowser {
index 792b980e88def7bfdfc6f5b125d405281416dc51..8424566ddfe420e3a04ef0814cd508e721567886 100644 (file)
@@ -49,14 +49,23 @@ VineServerDp::VineServerDp() : VineDp(), accepted_handler_(nullptr) {
 
   ret = vine_dp_set_accepted_cb(dp_,
       [](vine_dp_h dp, vine_dp_h accepted_dp, void* user_data) {
-        LOG(INFO) << "Dp(" << static_cast<void*>(accepted_dp) << ") accepted";
+        LOG(INFO) << "dp(" << static_cast<void*>(accepted_dp) << ") accepted";
         VineServerDp* self = static_cast<VineServerDp*>(user_data);
         if (!self->accepted_handler_) {
           LOG(WARNING) << "No accepted handler for server dp("
                        << static_cast<void*>(self->GetRawDp()) << ")";
           return;
         }
-        VineDp adp(dp, false);
+
+        VineDpPtr adp = std::make_shared<VineDp>(accepted_dp);
+        if (!adp->SetVineDpTerminatedCb()) {
+          LOG(ERROR) << "Failed to set vine dp terminated cb";
+          return;
+        }
+        if (!adp->SetVineDpReceivedCb()) {
+          LOG(ERROR) << "Failed to set vine dp received cb";
+          return;
+        }
         self->accepted_handler_->OnAccepted(adp);
       }, this);
   if (ret != VINE_ERROR_NONE) {