diff --git a/src/main/java/im/rosetta/Boot.java b/src/main/java/im/rosetta/Boot.java index 1a45a6a..795f4e0 100644 --- a/src/main/java/im/rosetta/Boot.java +++ b/src/main/java/im/rosetta/Boot.java @@ -44,6 +44,7 @@ import im.rosetta.packet.Packet22GroupBan; import im.rosetta.packet.Packet23DeviceList; import im.rosetta.packet.Packet24DeviceResolve; import im.rosetta.packet.Packet25Sync; +import im.rosetta.packet.Packet26Signal; import im.rosetta.packet.Packet2Result; import im.rosetta.packet.Packet3Search; import im.rosetta.packet.Packet4OnlineSubscribe; @@ -194,6 +195,7 @@ public class Boot { this.packetManager.registerPacket(23, Packet23DeviceList.class); this.packetManager.registerPacket(24, Packet24DeviceResolve.class); this.packetManager.registerPacket(25, Packet25Sync.class); + this.packetManager.registerPacket(26, Packet26Signal.class); } private void registerAllExecutors() { diff --git a/src/main/java/im/rosetta/packet/Packet26Signal.java b/src/main/java/im/rosetta/packet/Packet26Signal.java new file mode 100644 index 0000000..03f2674 --- /dev/null +++ b/src/main/java/im/rosetta/packet/Packet26Signal.java @@ -0,0 +1,122 @@ +package im.rosetta.packet; + +import im.rosetta.packet.runtime.NetworkSignalType; +import io.orprotocol.Stream; +import io.orprotocol.packet.Packet; + +/** + * Пакет cигналинга для совершения звонка. Учавствует в обмене ключами, + * иницилизации звонка. + */ +public class Packet26Signal extends Packet { + + /** + * Идентификатор отправителя сигнала, обычно это PK пользователя, который отправляет пакет + */ + private String src; + /** + * Идентификатор получателя сигнала, обычно это PK пользователя, который должен принять пакет + */ + private String dst; + + /** + * Если сигнал предназначен для обмена ключами, то в это поле + * будет помещаться sharedPublic публичная часть ключа DH алгоритма + */ + private String sharedPublic; + + /** + * Тип сигнала + */ + private NetworkSignalType signalType; + + @Override + public void read(Stream stream) { + this.signalType = NetworkSignalType.fromCode(stream.readInt8()); + this.src = stream.readString(); + this.dst = stream.readString(); + if (signalType == NetworkSignalType.KEY_EXCHANGE) { + this.sharedPublic = stream.readString(); + } else { + this.sharedPublic = null; + } + } + + @Override + public Stream write() { + Stream stream = new Stream(); + stream.writeInt16(this.packetId); + stream.writeInt8(this.signalType.getCode()); + stream.writeString(this.src); + stream.writeString(this.dst); + if (signalType == NetworkSignalType.KEY_EXCHANGE) { + stream.writeString(this.sharedPublic); + } + return stream; + } + + /** + * Получить идентификатор отправителя сигнала + * @return идентификатор отправителя сигнала + */ + public String getSrc() { + return src; + } + + /** + * Установить идентификатор отправителя сигнала + * @param src идентификатор отправителя сигнала + */ + public void setSrc(String src) { + this.src = src; + } + + /** + * Получить идентификатор получателя сигнала + * @return идентификатор получателя сигнала + */ + public String getDst() { + return dst; + } + + /** + * Установить идентификатор получателя сигнала + * @param dst идентификатор получателя сигнала + */ + public void setDst(String dst) { + this.dst = dst; + } + + /** + * Получить публичную часть ключа DH алгоритма, если сигнал предназначен для обмена ключами + * @return публичная часть ключа DH алгоритма или null, если сигнал не предназначен для обмена ключами + */ + public String getSharedPublic() { + return sharedPublic; + } + + /** + * Установить публичную часть ключа DH алгоритма, если сигнал предназначен для обмена ключами + * @param sharedPublic публичная часть ключа DH алгоритма + */ + public void setSharedPublic(String sharedPublic) { + this.sharedPublic = sharedPublic; + } + + /** + * Получить тип сигнала + * @return тип сигнала + */ + + public NetworkSignalType getSignalType() { + return signalType; + } + + /** + * Установить тип сигнала + * @param signalType тип сигнала + */ + public void setSignalType(NetworkSignalType signalType) { + this.signalType = signalType; + } +} diff --git a/src/main/java/im/rosetta/packet/runtime/NetworkSignalType.java b/src/main/java/im/rosetta/packet/runtime/NetworkSignalType.java new file mode 100644 index 0000000..ccaa4f1 --- /dev/null +++ b/src/main/java/im/rosetta/packet/runtime/NetworkSignalType.java @@ -0,0 +1,46 @@ +package im.rosetta.packet.runtime; + +/** + * Типы сигналов, используемых в сетевом взаимодействии при звонках + */ +public enum NetworkSignalType { + /** + * CALL - сигнал для совершения звонка, инициирует процесс звонка + */ + CALL(0), + /** + * KEY_EXCHANGE - сигнал для обмена ключами, используется для обмена DH ключами между участниками звонка + */ + KEY_EXCHANGE(1), + /** + * ICE_CANDIDATE - сигнал для обмена ICE кандидатами, используется для обмена сетевыми кандидатами между участниками звонка + */ + ICE_CONFIG(2), + /** + * ACTIVE_CALL - сигнал для активного звонка, указывает на то, что звонок активен и участники могут обмениваться данными + */ + ACTIVE_CALL(3), + /** + * END_CALL - сигнал для завершения звонка, указывает на то, что звонок завершен и участники должны прекратить обмен данными + */ + END_CALL(4); + + private final int code; + + NetworkSignalType(int code) { + this.code = code; + } + + public int getCode() { + return code; + } + + public static NetworkSignalType fromCode(int code) { + for (NetworkSignalType type : NetworkSignalType.values()) { + if (type.code == code) { + return type; + } + } + throw new IllegalArgumentException("Unknown NetworkSignalType code: " + code); + } +}