Network code now works well enough for the server to think it successfully established a connection
This commit is contained in:
@ -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));
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user