#include <vine.h>
#include <memory>
+#include <utility>
#include <vector>
#include "cion/common/exception.hh"
}
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: "
<< 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_)
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
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 {