/**
*
*/
package com.limegroup.gnutella.messages.vendor;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import com.limegroup.gnutella.ErrorService;
import com.limegroup.gnutella.URN;
import com.limegroup.gnutella.messages.BadGGEPBlockException;
import com.limegroup.gnutella.messages.BadGGEPPropertyException;
import com.limegroup.gnutella.messages.BadPacketException;
import com.limegroup.gnutella.messages.GGEP;
/**
* A response of content.
*/
public class ContentResponse extends VendorMessage {
public static final int VERSION = 1;
/** The ggep contained in here. */
private GGEP ggep;
/**
* Constructs a new ContentRequest with data from the network.
*/
public ContentResponse(byte[] guid, byte ttl, byte hops, int version, byte[] payload)
throws BadPacketException {
super(guid, ttl, hops, F_LIME_VENDOR_ID, F_CONTENT_RESP, version, payload);
if (getPayload().length < 1)
throw new BadPacketException("UNSUPPORTED PAYLOAD LENGTH: " + getPayload().length);
try {
this.ggep = new GGEP(getPayload(), 0);
} catch(BadGGEPBlockException bgbe) {
throw new BadPacketException(bgbe);
}
}
/**
* Constructs a new ContentRequest for the given SHA1 URN.
*/
public ContentResponse(URN sha1, boolean okay) {
super(F_LIME_VENDOR_ID, F_CONTENT_RESP, VERSION, derivePayload(sha1, okay));
try {
this.ggep = new GGEP(getPayload(), 0);
} catch(BadGGEPBlockException bgbe) {
ErrorService.error(bgbe);
}
}
/**
* Constructs the payload from given SHA1 Urn & okay flag.
*/
private static byte[] derivePayload(URN sha1, boolean okay) {
if(sha1 == null)
throw new NullPointerException("null sha1");
GGEP ggep = new GGEP(true);
// TODO use bytes instead of String, or pack into GUID.
ggep.put(GGEP.GGEP_HEADER_SHA1, sha1.getBytes());
ggep.put(GGEP.GGEP_HEADER_SHA1_VALID, okay ? 1 : 0);
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
ggep.write(out);
} catch(IOException iox) {
ErrorService.error(iox); // impossible.
}
return out.toByteArray();
}
/**
* Gets the URN this msg is for.
*/
public URN getURN() {
try {
return URN.createSHA1UrnFromBytes(ggep.getBytes(GGEP.GGEP_HEADER_SHA1));
} catch(IOException iox) {
return null;
} catch(BadGGEPPropertyException bgpe) {
return null;
}
}
/**
* Gets the 'ok' flag for the URN.
*/
public boolean getOK() {
try {
// nonzero values are okay.
return ggep.getInt(GGEP.GGEP_HEADER_SHA1_VALID) != 0;
} catch(BadGGEPPropertyException bgpe) {
return false;
}
}
}