package im.rosetta.packet; import im.rosetta.packet.runtime.NetworkSignalType; import io.orprotocol.Stream; import io.orprotocol.packet.Packet; /** * Пакет cигналинга для совершения звонка. Учавствует в обмене ключами, * иницилизации звонка. */ public class Packet26SignalPeer extends Packet { /** * Идентификатор отправителя сигнала, обычно это PK пользователя, который отправляет пакет */ private String src; /** * Идентификатор получателя сигнала, обычно это PK пользователя, который должен принять пакет */ private String dst; /** * Если сигнал предназначен для обмена ключами, то в это поле * будет помещаться sharedPublic публичная часть ключа DH алгоритма */ private String sharedPublic; /** * Тип сигнала */ private NetworkSignalType signalType; /** * callId и joinToken нужны для того, чтобы идентифицировать сессию звонка. Так как roomId это только ID комнаты на sfu */ private String callId; private String joinToken; @Override public void read(Stream stream) { this.signalType = NetworkSignalType.fromCode(stream.readInt8()); if(this.signalType == NetworkSignalType.END_CALL_BECAUSE_BUSY || this.signalType == NetworkSignalType.END_CALL_BECAUSE_PEER_DISCONNECTED || this.signalType == NetworkSignalType.RINGING_TIMEOUT) { return; } this.src = stream.readString(); this.dst = stream.readString(); if (signalType == NetworkSignalType.KEY_EXCHANGE) { this.sharedPublic = stream.readString(); } if(signalType == NetworkSignalType.CALL || signalType == NetworkSignalType.ACCEPT || signalType == NetworkSignalType.END_CALL) { this.callId = stream.readString(); this.joinToken = stream.readString(); } } @Override public Stream write() { Stream stream = new Stream(); stream.writeInt16(this.packetId); stream.writeInt8(this.signalType.getCode()); if(this.signalType == NetworkSignalType.END_CALL_BECAUSE_BUSY || this.signalType == NetworkSignalType.END_CALL_BECAUSE_PEER_DISCONNECTED || this.signalType == NetworkSignalType.RINGING_TIMEOUT) { return stream; } stream.writeString(this.src); stream.writeString(this.dst); if (signalType == NetworkSignalType.KEY_EXCHANGE) { stream.writeString(this.sharedPublic); } if(signalType == NetworkSignalType.CALL || signalType == NetworkSignalType.ACCEPT || signalType == NetworkSignalType.END_CALL) { stream.writeString(this.callId); stream.writeString(this.joinToken); } 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; } /** * Получить идентификатор сессии звонка, если тип сигнала CALL или ACCEPT * @return идентификатор сессии звонка, если тип сигнала CALL или ACCEPT, иначе null */ public String getCallId() { return callId; } /** * Установить идентификатор сессии звонка, если тип сигнала CALL или ACCEPT * @param callId идентификатор сессии звонка, если тип сигнала CALL или ACCEPT */ public void setCallId(String callId) { this.callId = callId; } /** * Получить токен для присоединения к сессии звонка, если тип сигнала CALL или ACCEPT * @return токен для присоединения к сессии звонка, если тип сигнала CALL или ACCEPT, иначе null */ public String getJoinToken() { return joinToken; } /** * Установить токен для присоединения к сессии звонка, если тип сигнала CALL или ACCEPT * @param joinToken токен для присоединения к сессии звонка, если тип сигнала CALL или ACCEPT */ public void setJoinToken(String joinToken) { this.joinToken = joinToken; } }