package com.limegroup.gnutella.messagehandlers; import java.util.Arrays; import java.util.Set; import org.limewire.collection.IntSet; import org.limewire.io.GUID; import org.limewire.security.SecurityToken; import com.limegroup.gnutella.Response; import com.limegroup.gnutella.URN; /** * A session of OOB result exchange between the local host and a remote host. */ class OOBSession { private final SecurityToken token; private final IntSet urnHashCodes; private IntSet responseHashCodes; private final int requestedResponseCount; private final GUID guid; OOBSession(SecurityToken token, int requestedResponseCount, GUID guid) { this.token = token; this.requestedResponseCount = requestedResponseCount; this.urnHashCodes = new IntSet(requestedResponseCount); this.guid = guid; } GUID getGUID() { return guid; } /** * Counts the responses uniquely. */ int countAddedResponses(Response[] responses) { int added = 0; for (Response response : responses) { Set<URN> urns = response.getUrns(); if (!urns.isEmpty()) { added += urnHashCodes.add(urns.iterator().next().hashCode()) ? 1 : 0; } else { // create lazily since responses should have urns if (responseHashCodes == null) { responseHashCodes = new IntSet(); } added += responseHashCodes.add(response.hashCode()) ? 1 : 0; } } return added; } /** * Returns the number of results that are still expected to come in. */ final int getRemainingResultsCount() { return requestedResponseCount - urnHashCodes.size() - (responseHashCodes != null ? responseHashCodes.size() : 0); } @Override public boolean equals(Object o) { if (! (o instanceof OOBSession)) return false; OOBSession other = (OOBSession) o; return Arrays.equals(token.getBytes(), other.token.getBytes()); } }