package com.limegroup.gnutella.uploader; import java.io.IOException; import java.io.OutputStream; import java.io.Writer; import java.util.Iterator; import java.util.Set; import com.limegroup.gnutella.FileDesc; import com.limegroup.gnutella.IncompleteFileDesc; import com.limegroup.gnutella.RouterService; import com.limegroup.gnutella.URN; import com.limegroup.gnutella.http.HTTPHeaderName; import com.limegroup.gnutella.http.HTTPHeaderValueCollection; import com.limegroup.gnutella.http.HTTPMessage; import com.limegroup.gnutella.http.HTTPUtils; import com.limegroup.gnutella.util.IpPort; /** * an Upload State. has some utility methods all upload states can use. */ public abstract class UploadState implements HTTPMessage { protected final HTTPUploader UPLOADER; protected final FileDesc FILE_DESC; public UploadState() { this(null); } public UploadState(HTTPUploader uploader) { UPLOADER=uploader; if (uploader!=null) FILE_DESC=uploader.getFileDesc(); else FILE_DESC=null; } protected void writeAlts(Writer os) throws IOException { if(FILE_DESC != null) { // write the URN in case the caller wants it URN sha1 = FILE_DESC.getSHA1Urn(); if(sha1 != null) { HTTPUtils.writeHeader(HTTPHeaderName.GNUTELLA_CONTENT_URN, sha1, os); Set alts = UPLOADER.getNextSetOfAltsToSend(); if(alts.size() > 0) { HTTPUtils.writeHeader(HTTPHeaderName.ALT_LOCATION, new HTTPHeaderValueCollection(alts), os); } if (UPLOADER.wantsFAlts()) { alts = UPLOADER.getNextSetOfPushAltsToSend(); if (alts.size()>0) HTTPUtils.writeHeader(HTTPHeaderName.FALT_LOCATION, new HTTPHeaderValueCollection(alts), os); } } } } protected void writeAlts(OutputStream os) throws IOException { if(FILE_DESC != null) { // write the URN in case the caller wants it URN sha1 = FILE_DESC.getSHA1Urn(); if(sha1 != null) { HTTPUtils.writeHeader(HTTPHeaderName.GNUTELLA_CONTENT_URN, sha1, os); Set alts = UPLOADER.getNextSetOfAltsToSend(); if(alts.size() > 0) { HTTPUtils.writeHeader(HTTPHeaderName.ALT_LOCATION, new HTTPHeaderValueCollection(alts), os); } if (UPLOADER.wantsFAlts()) { alts = UPLOADER.getNextSetOfPushAltsToSend(); if (alts.size()>0) HTTPUtils.writeHeader(HTTPHeaderName.FALT_LOCATION, new HTTPHeaderValueCollection(alts), os); } } } } protected void writeRanges(Writer os) throws IOException { if (FILE_DESC !=null && FILE_DESC instanceof IncompleteFileDesc){ URN sha1 = FILE_DESC.getSHA1Urn(); if (sha1!=null) { IncompleteFileDesc iFILE_DESC = (IncompleteFileDesc)FILE_DESC; HTTPUtils.writeHeader(HTTPHeaderName.AVAILABLE_RANGES, iFILE_DESC, os); } } } protected void writeRanges(OutputStream os) throws IOException { if (FILE_DESC !=null && FILE_DESC instanceof IncompleteFileDesc){ URN sha1 = FILE_DESC.getSHA1Urn(); if (sha1!=null) { IncompleteFileDesc iFILE_DESC = (IncompleteFileDesc)FILE_DESC; HTTPUtils.writeHeader(HTTPHeaderName.AVAILABLE_RANGES, iFILE_DESC, os); } } } /** * writes out the X-Push-Proxies header as specified by * section 4.2 of the Push Proxy proposal, v. 0.7 */ protected void writeProxies(Writer os) throws IOException { if (RouterService.acceptedIncomingConnection()) return; Set proxies = RouterService.getConnectionManager().getPushProxies(); StringBuffer buf = new StringBuffer(); int proxiesWritten =0; for (Iterator iter = proxies.iterator(); iter.hasNext() && proxiesWritten <4 ;) { IpPort current = (IpPort)iter.next(); buf.append(current.getAddress()) .append(":") .append(current.getPort()) .append(","); proxiesWritten++; } if (proxiesWritten >0) buf.deleteCharAt(buf.length()-1); else return; HTTPUtils.writeHeader(HTTPHeaderName.PROXIES,buf.toString(),os); } /** * writes out the X-Push-Proxies header as specified by * section 4.2 of the Push Proxy proposal, v. 0.7 */ protected void writeProxies(OutputStream os) throws IOException { if (RouterService.acceptedIncomingConnection()) return; Set proxies = RouterService.getConnectionManager().getPushProxies(); StringBuffer buf = new StringBuffer(); int proxiesWritten =0; for (Iterator iter = proxies.iterator(); iter.hasNext() && proxiesWritten <4 ;) { IpPort current = (IpPort)iter.next(); buf.append(current.getAddress()) .append(":") .append(current.getPort()) .append(","); proxiesWritten++; } if (proxiesWritten >0) buf.deleteCharAt(buf.length()-1); else return; HTTPUtils.writeHeader(HTTPHeaderName.PROXIES,buf.toString(),os); } }