package com.limegroup.gnutella.dime;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
/**
* Parser for writing DIMERecords to a stream.
*
* See: http://www-106.ibm.com/developerworks/library/ws-dime/
* (or http://www.perfectxml.com/DIME.asp )
* for information about DIME.
*
* To use this class, use:
* DIMEGenerator gen = new DIMEGenerator();
* gen.add(recordOne);
* gen.add(recordTwo);
* etc...
* gen.write(myOutputStream);
* To the same records to another output stream, simply call
* gen.write(anotherOutputStream);
* again.
*/
public class DIMEGenerator {
/**
* The list of records that will be written out.
*/
private final List RECORDS = new LinkedList();
/**
* The amount of bytes that write(OutputStream) will write.
*/
private int _length = 0;
/**
* Adds the given record to the internal list of records.
*/
public void add(DIMERecord record) {
RECORDS.add(record);
_length += record.getRecordLength();
}
/**
* Returns the amount of bytes that write(OutputStream) will write.
*/
public int getLength() {
return _length;
}
/**
* Writes the given list of DIMERecords to a stream.
*
* Does not do chunking.
*/
public void write(OutputStream out) throws IOException {
if(RECORDS.isEmpty())
return;
Iterator iter = RECORDS.iterator();
int size = RECORDS.size();
for(int i = 0; i < size; i++) {
DIMERecord current = (DIMERecord)iter.next();
if(i == 0)
current.setFirstRecord(true);
else
current.setFirstRecord(false);
if(i == size - 1)
current.setLastRecord(true);
else
current.setLastRecord(false);
current.write(out);
}
}
}