void ConnectionManager::Inquired(const Response &response) { QSharedPointer<Edge> edge = response.GetFrom().dynamicCast<Edge>(); if(!edge) { qWarning() << "Received an inquired from a non-Edge: " << response.GetFrom()->ToString(); return; } else if(!edge->Outbound()) { qWarning() << "We would never make an inquire call on an" << "incoming edge: " << response.GetFrom()->ToString(); return; } QByteArray brem_id = response.GetData().toByteArray(); if(brem_id.isEmpty()) { qWarning() << "Invalid ConnectionEstablished, no id"; return; } Id rem_id(brem_id); if(_local_id < rem_id) { BindEdge(edge, rem_id); } else if(rem_id == _local_id) { Address addr = edge->GetRemoteAddress(); qDebug() << "Attempting to connect to ourself"; edge->Stop("Attempting to connect to ourself"); emit ConnectionAttemptFailure(addr, "Attempting to connect to ourself"); } }
void ConnectionManager::BindEdge(const QSharedPointer<Edge> &edge, const Id &rem_id) { /// @TODO add an extra variable to the connection message such as a session ///token so that quick reconnects can be enabled. if(_con_tab.GetConnection(rem_id) != 0) { qDebug() << "Already have a connection to: " << rem_id.ToString() << " closing Edge: " << edge->ToString(); _rpc->SendNotification(edge, "CM::Close", QVariant()); Address addr = edge->GetRemoteAddress(); edge->Stop("Duplicate connection"); emit ConnectionAttemptFailure(addr, "Duplicate connection"); return; } _rpc->SendNotification(edge, "CM::Connect", _local_id.GetByteArray()); CreateConnection(edge, rem_id); }