static SimpleFieldSet compressedNoderefToFieldSet(byte[] data, int offset, int length) throws FSParseException {
if(length <= 5)
throw new FSParseException("Too short");
// Lookup table for groups.
DSAGroup group = null;
int firstByte = data[offset];
offset++;
length--;
if((firstByte & 0x2) == 2) {
int groupIndex = (data[offset] & 0xff);
offset++;
length--;
group = Global.getGroup(groupIndex);
if(group == null) throw new FSParseException("Unknown group number "+groupIndex);
if(logMINOR)
Logger.minor(PeerNode.class, "DSAGroup set to "+group.fingerprintToString()+ " using the group-index "+groupIndex);
}
// Is it compressed?
if((firstByte & 1) == 1) {
try {
// Gzipped
Inflater i = new Inflater();
i.setInput(data, offset, length);
// We shouldn't ever need a 4096 bytes long ref!
byte[] output = new byte[4096];
length = i.inflate(output, 0, output.length);
// Finished
data = output;
offset = 0;
if(logMINOR)
Logger.minor(PeerNode.class, "We have decompressed a "+length+" bytes big reference.");
} catch(DataFormatException e) {
throw new FSParseException("Invalid compressed data");
}
}
if(logMINOR)
Logger.minor(PeerNode.class, "Reference: " + HexUtil.bytesToHex(data, offset, length) + '(' + length + ')');
// Now decode it
ByteArrayInputStream bais = new ByteArrayInputStream(data, offset, length);
InputStreamReader isr;
try {
isr = new InputStreamReader(bais, "UTF-8");
} catch(UnsupportedEncodingException e1) {
throw new Error("Impossible: JVM doesn't support UTF-8: " + e1, e1);
}
BufferedReader br = new BufferedReader(isr);
try {
SimpleFieldSet fs = new SimpleFieldSet(br, false, true);
if(group != null) {
SimpleFieldSet sfs = new SimpleFieldSet(true);
sfs.put("dsaGroup", group.asFieldSet());
fs.putAllOverwrite(sfs);
}
return fs;
} catch(IOException e) {
throw (FSParseException)new FSParseException("Impossible: " + e).initCause(e);