void TransportTCP::close() { Callback disconnect_cb; if (!closed_) { { boost::recursive_mutex::scoped_lock lock(close_mutex_); if (!closed_) { closed_ = true; ROS_ASSERT(sock_ != ROS_INVALID_SOCKET); if (poll_set_) { poll_set_->delSocket(sock_); } ::shutdown(sock_, ROS_SOCKETS_SHUT_RDWR); if ( close_socket(sock_) != 0 ) { ROS_ERROR("Error closing socket [%d]: [%s]", sock_, last_socket_error_string()); } else { ROSCPP_LOG_DEBUG("TCP socket [%d] closed", sock_); } sock_ = ROS_INVALID_SOCKET; disconnect_cb = disconnect_cb_; disconnect_cb_ = Callback(); read_cb_ = Callback(); write_cb_ = Callback(); accept_cb_ = AcceptCallback(); } } } if (disconnect_cb) { disconnect_cb(shared_from_this()); } }
void DeviceProxy_Callback::disconnect() { if(disconnect_cb) disconnect_cb(); }
void obc_session_shutdown(struct obc_session *session) { struct pending_request *p; GError *err; DBG("%p", session); if (session->disconnecting == TRUE) { DBG("%p already disconnecting", session); return; } session->disconnecting = TRUE; obc_session_ref(session); /* Unregister any pending transfer */ err = g_error_new(OBEX_IO_ERROR, OBEX_IO_DISCONNECTED, "Session closed by user"); if (session->p != NULL && session->p->id != 0) { p = session->p; session->p = NULL; if (p->func) p->func(session, p->transfer, err, p->data); pending_request_free(p); } while ((p = g_queue_pop_head(session->queue))) { if (p->func) p->func(session, p->transfer, err, p->data); pending_request_free(p); } g_error_free(err); /* Unregister interfaces */ if (session->path) session_unregistered(session); DBG("Checking the need for disconnect request"); /* Send a disconnect request and wait for reply */ if (session->id > 0 && session->transport != NULL && session->obex != NULL) { DBG("Generating disconnect request. "); err = NULL; p = pending_request_new(session, NULL, NULL, NULL); p->req_id = g_obex_disconnect(session->obex, disconnect_cb, p, &err); if (err != NULL) { DBG("Generating disconnect request failed. "); disconnect_cb(session->obex, NULL, NULL, p); } else { /* Finalize when reply arrives */ DBG("Generating disconnect request succeeded. "); } } else { DBG("Unreferring without disconnect request."); obc_session_unref(session); } }