Network code now works well enough for the server to think it successfully established a connection

This commit is contained in:
2015-04-07 18:48:58 +02:00
parent 3299d8ca4a
commit 35088ca033
27 changed files with 636 additions and 150 deletions

View File

@ -17,10 +17,10 @@
package ch.dissem.bitmessage.factory;
import ch.dissem.bitmessage.entity.NetworkMessage;
import ch.dissem.bitmessage.entity.payload.GenericPayload;
import ch.dissem.bitmessage.entity.payload.GetPubkey;
import ch.dissem.bitmessage.entity.payload.ObjectPayload;
import ch.dissem.bitmessage.entity.payload.*;
import ch.dissem.bitmessage.utils.Decode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.io.InputStream;
@ -29,26 +29,63 @@ import java.io.InputStream;
* Creates {@link NetworkMessage} objects from {@link InputStream InputStreams}
*/
public class Factory {
public static final Logger LOG = LoggerFactory.getLogger(Factory.class);
public static NetworkMessage getNetworkMessage(int version, InputStream stream) throws IOException {
return new V3MessageFactory().read(stream);
}
static ObjectPayload getObjectPayload(long objectType, long version, InputStream stream, int length) throws IOException {
static ObjectPayload getObjectPayload(long objectType, long version, long streamNumber, InputStream stream, int length) throws IOException {
if (objectType < 4) {
switch ((int) objectType) {
case 0: // getpubkey
return new GetPubkey(Decode.bytes(stream, length));
return new GetPubkey(streamNumber, Decode.bytes(stream, length));
case 1: // pubkey
break;
return parsePubkey((int) version, streamNumber, stream, length);
case 2: // msg
break;
return parseMsg((int) version, streamNumber, stream, length);
case 3: // broadcast
break;
return parseBroadcast((int) version, streamNumber, stream, length);
}
throw new RuntimeException("This must not happen, someone broke something in the code!");
} else {
// passthrough message
return new GenericPayload(Decode.bytes(stream, length));
LOG.error("This should not happen, someone broke something in the code!");
}
// fallback: just store the message - we don't really care what it is
LOG.error("Unexpected object type: " + objectType);
return new GenericPayload(streamNumber, Decode.bytes(stream, length));
}
private static ObjectPayload parsePubkey(int version, long streamNumber, InputStream stream, int length) throws IOException {
switch (version) {
case 2:
return new V2Pubkey.Builder()
.streamNumber(streamNumber)
.behaviorBitfield(Decode.int64(stream))
.publicSigningKey(Decode.bytes(stream, 64))
.publicEncryptionKey(Decode.bytes(stream, 64))
.build();
case 3:
V3Pubkey.Builder v3 = new V3Pubkey.Builder()
.streamNumber(streamNumber)
.behaviorBitfield(Decode.int64(stream))
.publicSigningKey(Decode.bytes(stream, 64))
.publicEncryptionKey(Decode.bytes(stream, 64))
.nonceTrialsPerByte(Decode.varInt(stream))
.extraBytes(Decode.varInt(stream));
int sigLength = (int) Decode.varInt(stream);
v3.signature(Decode.bytes(stream, sigLength));
return v3.build();
case 4:
// TODO
}
LOG.debug("Unexpected pubkey version " + version + ", handling as generic payload object");
return new GenericPayload(streamNumber, Decode.bytes(stream, length));
}
private static ObjectPayload parseMsg(int version, long streamNumber, InputStream stream, int length) throws IOException {
return new Msg(streamNumber, Decode.bytes(stream, length));
}
private static ObjectPayload parseBroadcast(int version, long streamNumber, InputStream stream, int length) throws IOException {
return new Broadcast(streamNumber, Decode.bytes(stream, 32), Decode.bytes(stream, length - 32));
}
}