Первичная реализация Packet26Signal

This commit is contained in:
RoyceDa
2026-02-28 18:31:58 +02:00
parent 2016b06cd2
commit d679a53f6e
3 changed files with 170 additions and 0 deletions

View File

@@ -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() {

View File

@@ -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;
}
}

View File

@@ -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);
}
}