mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-12 18:59:06 +01:00
This Introduction BSP Client uses its own group to communicate with existing contacts. It uses four types of messages to facilitate introductions: the introduction, the response, the ack and the abort. The protocol logic is encapsulated in two protocol engines, one for the introducer and one for the introducee. The introduction client keeps the local state for each engine, hands messages over to the engines and processes the result and state changes they return.
77 lines
2.0 KiB
Java
77 lines
2.0 KiB
Java
package org.briarproject.api.introduction;
|
|
|
|
import static org.briarproject.api.introduction.IntroduceeAction.ACK;
|
|
import static org.briarproject.api.introduction.IntroduceeAction.LOCAL_ACCEPT;
|
|
import static org.briarproject.api.introduction.IntroduceeAction.LOCAL_DECLINE;
|
|
import static org.briarproject.api.introduction.IntroduceeAction.REMOTE_ACCEPT;
|
|
import static org.briarproject.api.introduction.IntroduceeAction.REMOTE_DECLINE;
|
|
import static org.briarproject.api.introduction.IntroduceeAction.REMOTE_REQUEST;
|
|
|
|
public enum IntroduceeProtocolState {
|
|
|
|
ERROR(0),
|
|
AWAIT_REQUEST(1) {
|
|
@Override
|
|
public IntroduceeProtocolState next(IntroduceeAction a) {
|
|
if (a == REMOTE_REQUEST) return AWAIT_RESPONSES;
|
|
return ERROR;
|
|
}
|
|
},
|
|
AWAIT_RESPONSES(2) {
|
|
@Override
|
|
public IntroduceeProtocolState next(IntroduceeAction a) {
|
|
if (a == REMOTE_ACCEPT) return AWAIT_LOCAL_RESPONSE;
|
|
if (a == REMOTE_DECLINE) return FINISHED;
|
|
if (a == LOCAL_ACCEPT) return AWAIT_REMOTE_RESPONSE;
|
|
if (a == LOCAL_DECLINE) return FINISHED;
|
|
return ERROR;
|
|
}
|
|
},
|
|
AWAIT_REMOTE_RESPONSE(3) {
|
|
@Override
|
|
public IntroduceeProtocolState next(IntroduceeAction a) {
|
|
if (a == REMOTE_ACCEPT) return AWAIT_ACK;
|
|
if (a == REMOTE_DECLINE) return FINISHED;
|
|
return ERROR;
|
|
}
|
|
},
|
|
AWAIT_LOCAL_RESPONSE(4) {
|
|
@Override
|
|
public IntroduceeProtocolState next(IntroduceeAction a) {
|
|
if (a == LOCAL_ACCEPT) return AWAIT_ACK;
|
|
if (a == LOCAL_DECLINE) return FINISHED;
|
|
return ERROR;
|
|
}
|
|
},
|
|
AWAIT_ACK(5) {
|
|
@Override
|
|
public IntroduceeProtocolState next(IntroduceeAction a) {
|
|
if (a == ACK) return FINISHED;
|
|
return ERROR;
|
|
}
|
|
},
|
|
FINISHED(6);
|
|
|
|
private final int value;
|
|
|
|
IntroduceeProtocolState(int value) {
|
|
this.value = value;
|
|
}
|
|
|
|
public int getValue() {
|
|
return value;
|
|
}
|
|
|
|
public static IntroduceeProtocolState fromValue(int value) {
|
|
for (IntroduceeProtocolState s : values()) {
|
|
if (s.value == value) return s;
|
|
}
|
|
throw new IllegalArgumentException();
|
|
}
|
|
|
|
public IntroduceeProtocolState next(IntroduceeAction a) {
|
|
return this;
|
|
}
|
|
|
|
}
|