using namespace vine;
+#define RET_ERR_IF_DP_OPEN_STATE_ISNT_IDLE(state) \
+ do { \
+ if (state == VINE_DP_OPEN_STATE_WAIT) { \
+ VINE_LOGE("Ignore duplicate request."); \
+ return VINE_ERROR_NOW_IN_PROGRESS; \
+ } else if (state == VINE_DP_OPEN_STATE_DONE) { \
+ VINE_LOGE("Already opened."); \
+ return VINE_ERROR_INVALID_OPERATION; \
+ } \
+ } while (0)
+
extern vine_dp_plugin_fn g_dp_plugin_fn;
static bool _check_if_valid_ip(vine_address_family_e addr_family, const char *ip)
_vine_data_path_set_received_cb(datapath, _pubsub_received_cb, user_data);
vine_data_path_set_terminated_cb(datapath, _pubsub_terminated_cb, user_data);
- if (dp->get_open_state() == VINE_DP_PUBSUB_OPEN_STATE_WAIT
+ if (dp->get_open_state() == VINE_DP_OPEN_STATE_WAIT
&& dp->decrease_init_disc_num() <= 0) {
- dp->set_open_state(VINE_DP_PUBSUB_OPEN_STATE_DONE);
+ dp->set_open_state(VINE_DP_OPEN_STATE_DONE);
static_cast<DataPath *>(user_data)->invoke_opened_cb(VINE_ERROR_NONE);
}
}
_vine_data_path_set_received_cb(datapath, _pubsub_received_cb, user_data);
vine_data_path_set_terminated_cb(datapath, _pubsub_terminated_cb, user_data);
- if (dp->get_open_state() == VINE_DP_PUBSUB_OPEN_STATE_WAIT
+ if (dp->get_open_state() == VINE_DP_OPEN_STATE_WAIT
&& dp->decrease_init_disc_num() <= 0) {
- dp->set_open_state(VINE_DP_PUBSUB_OPEN_STATE_DONE);
+ dp->set_open_state(VINE_DP_OPEN_STATE_DONE);
static_cast<DataPath *>(user_data)->invoke_opened_cb(VINE_ERROR_NONE);
}
}
}
DPPubSub *dp = static_cast<DPPubSub *>(user_data);
- if (more_coming && dp->get_open_state() == VINE_DP_PUBSUB_OPEN_STATE_WAIT) {
+ if (more_coming && dp->get_open_state() == VINE_DP_OPEN_STATE_WAIT) {
VINE_LOGD("At least one more result is exist.");
dp->increase_init_disc_num();
}
// called only once.
mOpenedCb = NULL;
mOpenedCbData = NULL;
+ mOpenState = VINE_DP_OPEN_STATE_DONE;
}
int DataPath::set_received_cb(vine_dp_received_cb callback, void *user_data)
void DataPath::invoke_terminated_cb()
{
+ mOpenState = VINE_DP_OPEN_STATE_NONE;
if (mTerminatedCb)
mTerminatedCb(static_cast<void *>(this), mTerminatedCbData);
}
mSecurity = NULL;
mAddrFamily = VINE_ADDRESS_FAMILY_DEFAULT;
mIfaceName = "";
+ mOpenState = VINE_DP_OPEN_STATE_NONE;
mDataPath = NULL;
mListenPort = 0;
mMaxConnNum = VINE_DP_DEFAULT_CONNECTIONS_NUM;
int DPServer::open(vine_dp_opened_cb callback, void *user_data)
{
- const char *iface_name = mIfaceName.size() > 0 ? mIfaceName.c_str() : NULL;
+ RET_ERR_IF_DP_OPEN_STATE_ISNT_IDLE(mOpenState);
mOpenedCb = callback;
mOpenedCbData = user_data;
+ mOpenState = VINE_DP_OPEN_STATE_WAIT;
- return vine_data_path_open(mAddrFamily, mListenPort, iface_name, mMaxConnNum, mSecurity,
+ int ret = vine_data_path_open(mAddrFamily, mListenPort,
+ mIfaceName.size() > 0 ? mIfaceName.c_str() : NULL,
+ mMaxConnNum, mSecurity,
_opened_cb, static_cast<void *>(this),
_accepted_cb, static_cast<void *>(this),
&mDataPath, mEventFd);
+ if (ret != VINE_ERROR_NONE)
+ mOpenState = VINE_DP_OPEN_STATE_NONE;
+
+ return ret;
}
void DPServer::close()
{
+ mOpenState = VINE_DP_OPEN_STATE_NONE;
_vine_data_path_close(mDataPath);
}
VINE_LOGD("DPClient[%p] is created with datapath[%p]", this, datapath);
mEventFd = event_fd;
mSecurity = NULL;
+ mOpenState = VINE_DP_OPEN_STATE_NONE;
mDataPath = datapath;
mAddrFamily = VINE_ADDRESS_FAMILY_IPV4;
mServerIp = "";
int DPClient::open(vine_dp_opened_cb callback, void *user_data)
{
- const char *iface_name = mIfaceName.size() > 0 ? mIfaceName.c_str() : NULL;
+ RET_ERR_IF_DP_OPEN_STATE_ISNT_IDLE(mOpenState);
mOpenedCb = callback;
mOpenedCbData = user_data;
+ mOpenState = VINE_DP_OPEN_STATE_WAIT;
- return vine_data_path_connect(mAddrFamily, mServerIp.c_str(), mServerPort,
- iface_name, mSecurity, NULL,
+ int ret = vine_data_path_connect(mAddrFamily, mServerIp.c_str(), mServerPort,
+ mIfaceName.size() > 0 ? mIfaceName.c_str() : NULL,
+ mSecurity, NULL,
_connected_cb, static_cast<void *>(this), &mDataPath, mEventFd);
+ if (ret != VINE_ERROR_NONE)
+ mOpenState = VINE_DP_OPEN_STATE_NONE;
+ return ret;
}
void DPClient::close()
{
+ mOpenState = VINE_DP_OPEN_STATE_NONE;
_vine_data_path_close(mDataPath);
}
mEventFd = event_fd;
mSecurity = NULL;
mIfaceName = "";
+ mOpenState = VINE_DP_OPEN_STATE_NONE;
mReceivedCb = NULL;
mReceivedCbData = NULL;
mOpenedCb = NULL;
mSdPub = NULL;
mServiceName = "";
mInitDiscNum = 1;
- mOpenState = VINE_DP_PUBSUB_OPEN_STATE_NONE;
mSdPubSubState = VINE_DP_PUBSUB_SD_STATE_NONE;
// Network Info
int DPPubSub::connect(const char *ip, int port)
{
- vine_data_path_h datapath;
+ vine_data_path_h datapath = NULL;
const char *iface_name = mIfaceName.size() > 0 ? mIfaceName.c_str() : NULL;
int ret = vine_data_path_connect(mAddrFamily, ip, port, iface_name,
mSecurity, mServiceName.c_str(),
int DPPubSub::open(vine_dp_opened_cb callback, void *user_data)
{
- if (mOpenState == VINE_DP_PUBSUB_OPEN_STATE_WAIT) {
- VINE_LOGE("Ignore duplicate request.");
- return VINE_ERROR_NOW_IN_PROGRESS;
- } else if (mOpenState == VINE_DP_PUBSUB_OPEN_STATE_DONE) {
- VINE_LOGE("Already opened.");
- return VINE_ERROR_INVALID_OPERATION;
- }
+ RET_ERR_IF_DP_OPEN_STATE_ISNT_IDLE(mOpenState);
- mOpenState = VINE_DP_PUBSUB_OPEN_STATE_WAIT;
+ mOpenState = VINE_DP_OPEN_STATE_WAIT;
mOpenTimer.start(VINE_DP_PUBSUB_OPEN_TIMEOUT_MS, _open_timer, static_cast<void *>(this));
mOpenedCb = callback;
mOpenedCbData = user_data;
- const char *iface_name = mIfaceName.size() > 0 ? mIfaceName.c_str() : NULL;
- int ret = vine_data_path_open(mAddrFamily, mListenPort, iface_name, mMaxConnNum, mSecurity,
+ int ret = vine_data_path_open(mAddrFamily, mListenPort,
+ mIfaceName.size() > 0 ? mIfaceName.c_str() : NULL,
+ mMaxConnNum, mSecurity,
_pubsub_opened_cb, static_cast<void *>(this),
_pubsub_accepted_cb, static_cast<void *>(this),
&mServerDataPath, mEventFd);
if (ret != VINE_ERROR_NONE) {
mOpenedCb = NULL;
mOpenedCbData = NULL;
+ mOpenState = VINE_DP_OPEN_STATE_NONE;
mOpenTimer.stop();
return ret;
}
_vine_data_path_destroy(mServerDataPath);
mServerDataPath = NULL;
- mOpenState = VINE_DP_PUBSUB_OPEN_STATE_NONE;
+ mOpenState = VINE_DP_OPEN_STATE_NONE;
mSdPubSubState = VINE_DP_PUBSUB_SD_STATE_NONE;
}
int sd_state = dp->get_sd_pubsub_state();
if ((sd_state & VINE_DP_PUBSUB_SD_STATE_PUBLISH)
&& (sd_state & VINE_DP_PUBSUB_SD_STATE_SUBSCRIBE)) {
- dp->set_open_state(VINE_DP_PUBSUB_OPEN_STATE_DONE);
+ dp->set_open_state(VINE_DP_OPEN_STATE_DONE);
static_cast<DataPath *>(user_data)->invoke_opened_cb(VINE_ERROR_NONE);
return;
}