/** * */ 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 request for content. */ public class ContentRequest extends VendorMessage { public static final int VERSION = 1; /** * Constructs a new ContentRequest with data from the network. */ public ContentRequest(byte[] guid, byte ttl, byte hops, int version, byte[] payload) throws BadPacketException { super(guid, ttl, hops, F_LIME_VENDOR_ID, F_CONTENT_REQ, version, payload); if (getPayload().length < 1) throw new BadPacketException("UNSUPPORTED PAYLOAD LENGTH: " + getPayload().length); } /** * Constructs a new ContentRequest for the given SHA1 URN. */ public ContentRequest(URN sha1) { super(F_LIME_VENDOR_ID, F_CONTENT_REQ, VERSION, derivePayload(sha1)); } /** * Constructs the payload from given SHA1 Urn. */ private static byte[] derivePayload(URN sha1) { if(sha1 == null) throw new NullPointerException("null sha1"); GGEP ggep = new GGEP(true); ggep.put(GGEP.GGEP_HEADER_SHA1, sha1.getBytes()); ByteArrayOutputStream out = new ByteArrayOutputStream(); try { ggep.write(out); } catch(IOException iox) { ErrorService.error(iox); // impossible. } return out.toByteArray(); } /** Gets the URN -- this will inefficiently parse the GGEP each time it's called. */ public URN getURN() { try { GGEP ggep = new GGEP(getPayload(), 0); return URN.createSHA1UrnFromBytes(ggep.getBytes(GGEP.GGEP_HEADER_SHA1)); } catch (BadGGEPBlockException e) { } catch (BadGGEPPropertyException e) { } catch(IOException iox) { } return null; } }