int vine_dp_destroy(vine_dp_h dp);
/**
+ * @brief Gets the Id for DP_TYPE_PUBSUB.
+ * @remarks This should be called after completing vine_dp_open()
+ * @since_tizen 6.5
+ * @param[in] dp The data path handle
+ * @param[out] id The PubSub Id
+ * @return 0 on success, otherwise a negative error value
+ * @retval #VINE_ERROR_NONE Successful
+ * @retval #VINE_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #VINE_ERROR_INVALID_OPERATION Invalid operation
+ * @retval #VINE_ERROR_NOT_SUPPORTED Not supported
+ * @see vine_dp_create()
+ */
+int vine_dp_get_id(vine_dp_h dp, char **id);
+
+/**
* @brief Sets the interface name to use for datapath.
* @remarks If the interface has multiple IP addresses, please set an IP address as @a iface_name.
* @since_tizen 6.5
* @brief Called when a pubsub peer is joined.
* @since_tizen 6.5
* @param[in] dp The datapath handle
- * @param[in] ip The peer's IP address
- * @param[in] port The peer's port
+ * @param[in] peer_id The peer's Id
* @param[in] user_data The user data passed from the callback registration function
* @see vine_dp_set_peer_joined_cb()
* @see vine_dp_unset_peer_joined_cb()
*/
-typedef void(*vine_dp_peer_joined_cb)(vine_dp_h dp, const char *ip, int port, void *user_data);
+typedef void(*vine_dp_peer_joined_cb)(vine_dp_h dp, const char *peer_id, void *user_data);
/**
* @brief Registers the callback called when a pubsub peer is joined.
* @brief Called when a pubsub peer is left.
* @since_tizen 6.5
* @param[in] dp The datapath handle. VINE_DP_TYPE_PUBSUB only
- * @param[in] ip The peer's IP address
- * @param[in] port The peer's port
+ * @param[in] peer_id The peer's Id
* @param[in] user_data The user data passed from the callback registration function
* @see vine_dp_set_peer_left_cb()
* @see vine_dp_unset_peer_left_cb()
*/
-typedef void(*vine_dp_peer_left_cb)(vine_dp_h dp, const char *ip, int port, void *user_data);
+typedef void(*vine_dp_peer_left_cb)(vine_dp_h dp, const char *peer_id, void *user_data);
/**
* @brief Registers the callback called when a pubsub peer is left.
%bcond_without lws_static_prebuilt
Name: capi-network-vine
Summary: An service discovery framework
-Version: 1.0.2
+Version: 1.0.3
Release: 0
Group: Network & Connectivity/API
License: Apache-2.0
virtual int set_peer_left_cb(vine_dp_peer_left_cb callback, void *user_data);
virtual int unset_peer_left_cb();
- void invoke_peer_joined_cb(const char *ip, int port);
- void invoke_peer_left_cb(const char *ip, int port);
+ void invoke_peer_joined_cb(const char *peer_id);
+ void invoke_peer_left_cb(const char *peer_id);
int connect(const char *service_name, const char *ip, int port);
int close_server_dp();
bool is_joined_peer(const char *service_name, const char *ip);
int get_joined_peer();
+ const char *get_joined_peer_id(vine_data_path_h datapath);
void add_joined_peer(const char *service_name, vine_data_path_h datapath);
void del_joined_peer(vine_data_path_h datapath);
void clear_joined_peer();
int publish_service();
int subscribe_service();
- void set_service_name(const char *service_name) { mServiceName = service_name; }
+ void set_id(const char *id) { mId = id; }
bool check_if_connect(const char *peer_rank,
vine_address_family_e ip_type, const char *peer_ip, int peer_port);
int get_rank() { return mRank; }
std::string mTopic;
vine_disc_h mSdSub;
vine_disc_h mSdPub;
- std::string mServiceName;
+ std::string mId;
vine_address_family_e mAddrFamily;
std::set<std::string> mIpList;
int create_rank();
int compare_ip_priority(const char *peer_ip);
+ void create_id(char id[]);
+
};
} // namespace vine
VINE_LOGD("datapath[%p] is terminated by peer.", datapath);
DPPubSub *dp = static_cast<DPPubSub *>(user_data);
- dp->del_joined_peer(datapath);
- const char *ip = vine_data_path_get_ip(datapath);
- int port = vine_data_path_get_port(datapath);
- dp->invoke_peer_left_cb(ip, port);
+ char *peer_id = STRDUP(dp->get_joined_peer_id(datapath));
+ dp->del_joined_peer(datapath);
+ if (peer_id) {
+ dp->invoke_peer_left_cb(peer_id);
+ free(peer_id);
+ }
vine_data_path_destroy(datapath);
}
}
dp->add_joined_peer(token, datapath);
- free(token);
vine_data_path_set_received_cb(datapath, _pubsub_received_cb, user_data);
vine_data_path_set_terminated_cb(datapath, _pubsub_terminated_cb, user_data);
- const char *ip = vine_data_path_get_ip(datapath);
- int port = vine_data_path_get_port(datapath);
- dp->invoke_peer_joined_cb(ip, port);
+ dp->invoke_peer_joined_cb(token);
+ free(token);
}
struct pubsub_connect_data {
vine_data_path_set_received_cb(datapath, _pubsub_received_cb, conn_data->dp);
vine_data_path_set_terminated_cb(datapath, _pubsub_terminated_cb, conn_data->dp);
- const char *ip = vine_data_path_get_ip(datapath);
- int port = vine_data_path_get_port(datapath);
- dp->invoke_peer_joined_cb(ip, port);
-
+ dp->invoke_peer_joined_cb(conn_data->service_name);
conn_data->dp = NULL;
free(conn_data);
}
return;
DPPubSub *dp = static_cast<DPPubSub *>(user_data);
- dp->set_service_name(service_name);
+ dp->set_id(service_name);
int ret = dp->subscribe_service();
if (ret != VINE_ERROR_NONE)
dp->close();
mTopic = "";
mSdSub = NULL;
mSdPub = NULL;
- mServiceName = "";
+ mId = "";
// Network Info
mAddrFamily = VINE_ADDRESS_FAMILY_DEFAULT;
return VINE_ERROR_NONE;
}
-void DPPubSub::invoke_peer_joined_cb(const char *ip, int port)
+void DPPubSub::invoke_peer_joined_cb(const char *peer_id)
{
if (mPeerJoinedCb)
- mPeerJoinedCb(static_cast<void *>(this), ip, port, mPeerJoinedCbData);
+ mPeerJoinedCb(static_cast<void *>(this), peer_id, mPeerJoinedCbData);
}
-void DPPubSub::invoke_peer_left_cb(const char *ip, int port)
+void DPPubSub::invoke_peer_left_cb(const char *peer_id)
{
if (mPeerLeftCb)
- mPeerLeftCb(static_cast<void *>(this), ip, port, mPeerJoinedCbData);
+ mPeerLeftCb(static_cast<void *>(this), peer_id, mPeerJoinedCbData);
}
int DPPubSub::connect(const char *service_name, const char *ip, int port)
conn_data->service_name = STRDUP(service_name);
int ret = vine_data_path_connect(mAddrFamily, ip, port, iface_name,
- mSecurity, mServiceName.c_str(),
+ mSecurity, mId.c_str(),
_pubsub_connected_cb, (void *)conn_data,
&datapath, mEventFd);
return ret;
return ret;
}
+void DPPubSub::create_id(char id[])
+{
+ const char *map = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
+ const size_t map_len = strlen(map);
+
+ string rand_str;
+ generate_n(back_inserter(rand_str), 6,
+ [&](){
+ return map[rand() % map_len];
+ });
+ snprintf(id, VINE_MAX_SERVICE_NAME_LEN, "%s-%s",
+ VINE_DP_PUBSUB_SERVICE_NAME_PREFIX, rand_str.c_str());
+}
+
int DPPubSub::publish_service()
{
vine_service_h service;
mRank = create_rank();
sprintf(rank_str, "%d", mRank);
- snprintf(service_name, VINE_MAX_SERVICE_NAME_LEN,
- "%s-%d", VINE_DP_PUBSUB_SERVICE_NAME_PREFIX, mRank);
+ create_id(service_name);
vine_service_set_name(service, service_name);
vine_service_add_attribute(service, VINE_DP_PUBSUB_RANK_KEY, (const char *)rank_str);
bool DPPubSub::is_joined_peer(const char *service_name, const char *ip)
{
- if (mServiceName.compare(service_name) == 0) {
+ if (mId.compare(service_name) == 0) {
VINE_LOGD("It's me!");
mIpList.insert(ip);
return true;
return mDataPathList.size();
}
+const char *DPPubSub::get_joined_peer_id(vine_data_path_h datapath)
+{
+ if (!datapath)
+ return NULL;
+
+ DPMap::iterator found = std::find_if(mDataPathList.begin(),
+ mDataPathList.end(),
+ [datapath](std::pair<std::string, vine_data_path_h> const& item)
+ {
+ VINE_LOGD("item.second[%p]", item.second);
+ return (item.second == datapath);
+ });
+
+ if (found == mDataPathList.end()) {
+ VINE_LOGE("Cannot find the datapath[%p].", datapath);
+ return NULL;
+ }
+
+ return found->first.c_str();
+}
+
void DPPubSub::add_joined_peer(const char *service_name, vine_data_path_h datapath)
{
if (!service_name || !datapath)
{
}
-static void __peer_joined_cb(vine_dp_h dp, const char *ip, int port, void *user_data)
+static void __peer_joined_cb(vine_dp_h dp, const char *peer_id, void *user_data)
{
}
-static void __peer_left_cb(vine_dp_h dp, const char *ip, int port, void *user_data)
+static void __peer_left_cb(vine_dp_h dp, const char *peer_id, void *user_data)
{
}
PRINT_LOG("dp[%p] is closed.", dp);
}, NULL), "vine_dp_set_terminated_cb");
PRINT_IF_ERROR(vine_dp_set_peer_joined_cb(dp,
- [](vine_dp_h dp, const char *ip, int port, void *user_data) {
- PRINT_LOG("dp[%p]'s peer[%s:%d] is joined.", dp, ip, port);
+ [](vine_dp_h dp, const char *peer_id, void *user_data) {
+ PRINT_LOG("dp[%p]'s peer[%s] is joined.", dp, peer_id);
}, NULL), "vine_dp_set_peer_joined_cb");
PRINT_IF_ERROR(vine_dp_set_peer_left_cb(dp,
- [](vine_dp_h dp, const char *ip, int port, void *user_data) {
- PRINT_LOG("dp[%p]'s peer[%s:%d] is left.", dp, ip, port);
+ [](vine_dp_h dp, const char *peer_id, void *user_data) {
+ PRINT_LOG("dp[%p]'s peer[%s] is left.", dp, peer_id);
}, NULL), "vine_dp_set_peer_left_cb");
PRINT_IF_ERROR(vine_dp_open(dp,
[](vine_dp_h dp, vine_error_e result, void *user_data) {
send_message(accepted_dp);
}
-static void __peer_joined_cb(vine_dp_h dp, const char *ip, int port, void *user_data)
+static void __peer_joined_cb(vine_dp_h dp, const char *peer_id, void *user_data)
{
- printf("pubsub peer(%s:%d) is joined.\n", ip, port);
+ printf("pubsub peer(%s) is joined.\n", peer_id);
send_message(dp);
}
-static void __peer_left_cb(vine_dp_h dp, const char *ip, int port, void *user_data)
+static void __peer_left_cb(vine_dp_h dp, const char *peer_id, void *user_data)
{
- printf("pubsub peer(%s:%d) is left.\n", ip, port);
+ printf("pubsub peer(%s) is left.\n", peer_id);
}
static void __registered_cb(vine_session_h session,