예제 #1
0
TransportImpl::AcceptConnectResult
RtpsUdpTransport::connect_datalink(const RemoteTransport& remote,
                                   const ConnectionAttribs& attribs,
                                   TransportClient* client )
{
  GuardThreadType guard_links(this->links_lock_);
  RtpsUdpDataLink_rch link = link_;
  if (link_.is_nil()) {
    link = make_datalink(attribs.local_id_.guidPrefix);
    if (link.is_nil()) {
      return AcceptConnectResult();
    }
  }

  use_datalink(attribs.local_id_, remote.repo_id_, remote.blob_,
               attribs.local_reliable_, remote.reliable_,
               attribs.local_durable_, remote.durable_);

  if (0 == std::memcmp(attribs.local_id_.guidPrefix, remote.repo_id_.guidPrefix,
                       sizeof(GuidPrefix_t))) {
    return AcceptConnectResult(link._retn()); // "loopback" connection return link right away
  }

  if (link->check_handshake_complete(attribs.local_id_, remote.repo_id_)){
    return AcceptConnectResult(link._retn());
  }

  if (!link->add_on_start_callback(client, remote.repo_id_)) {
     // link was started by the reactor thread before we could add a callback
     VDBG_LVL((LM_DEBUG, "(%P|%t) RtpsUdpTransport::connect_datalink got link.\n"), 2);
     return AcceptConnectResult(link._retn());
  }

  GuardType guard(connections_lock_);
  add_pending_connection(client, link.in());
  VDBG_LVL((LM_DEBUG, "(%P|%t) RtpsUdpTransport::connect_datalink pending.\n"), 2);
  return AcceptConnectResult(AcceptConnectResult::ACR_SUCCESS);
/*
  const GuidConverter local_conv(attribs.local_id_), remote_conv(remote.repo_id_);
  VDBG_LVL((LM_DEBUG, "(%P|%t) RtpsUdpTransport::connect_datalink_i "
    "waiting for handshake local %C remote %C\n", std::string(local_conv).c_str(),
    std::string(remote_conv).c_str()), 2);

  //TODO: fix waiting

  if (!link->wait_for_handshake(attribs.local_id_, remote.repo_id_)) {
    VDBG_LVL((LM_ERROR, "(%P|%t) RtpsUdpTransport::connect_datalink_i "
      "ERROR: wait for handshake failed\n"), 2);
    return AcceptConnectResult();
  }
  VDBG_LVL((LM_DEBUG, "(%P|%t) RtpsUdpTransport::connect_datalink_i "
    "wait for handshake completed\n"), 2);


  return AcceptConnectResult(link._retn());
*/
}
예제 #2
0
TransportImpl::AcceptConnectResult
RtpsUdpTransport::accept_datalink(const RemoteTransport& remote,
                                  const ConnectionAttribs& attribs,
                                  TransportClient* )
{
  GuardThreadType guard_links(this->links_lock_);
  RtpsUdpDataLink_rch link = link_;
  if (link_.is_nil()) {
    link = make_datalink(attribs.local_id_.guidPrefix);
    if (link.is_nil()) {
      return AcceptConnectResult();
    }
  }
  use_datalink(attribs.local_id_, remote.repo_id_, remote.blob_,
               attribs.local_reliable_, remote.reliable_,
               attribs.local_durable_, remote.durable_);
  return AcceptConnectResult(link._retn());
}