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::Close(const Request &notification)
  {
    QSharedPointer<Edge> edge = notification.GetFrom().dynamicCast<Edge>();
    if(!edge) {
      qWarning() << "Connection attempt Edge close not from an Edge: " <<
        notification.GetFrom()->ToString();
      return;
    }

    edge->Stop("Closed from remote peer");
  }
  void ConnectionManager::Inquire(const Request &request)
  {
    QSharedPointer<Edge> edge = request.GetFrom().dynamicCast<Edge>();
    if(!edge) {
      qWarning() << "Received an inquired from a non-Edge: " <<
        request.GetFrom()->ToString();
      request.Failed(Response::InvalidMessage, "Received on a non-Edge");
      return;
    } else if(edge->Outbound()) {
      qWarning() << "We should never receive an inquire call on an" <<
        "outbound edge: " << request.GetFrom()->ToString();
      request.Failed(Response::InvalidMessage, "Received on outbound edge");
      return;
    }

    QVariantHash data = request.GetData().toHash();
    if(data.value("version").toInt() != VERSION) {
      qDebug() << "Received an inquired from a different version." <<
        "Expected:" << VERSION << "Found:" << data.value("version");
      request.Failed(Response::InvalidInput, "Invalid version");
      return;
    }

    QByteArray brem_id = data.value("peer_id").toByteArray();

    if(brem_id.isEmpty()) {
      qWarning() << "Invalid Inquire, no id";
      request.Failed(Response::InvalidInput, "No remote id");
      return;
    }

    Id rem_id(brem_id);

    request.Respond(_local_id.GetByteArray());

    QString saddr = data.value("persistent").toString();
    Address addr = AddressFactory::GetInstance().CreateAddress(saddr);
    edge->SetRemotePersistentAddress(addr);

    if(_local_id < rem_id) {
      BindEdge(edge, rem_id);
    } else if(_local_id == rem_id) {
      edge->Stop("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);
  }