____ _ _______ __
/ __ \ | /| / / __/ |/ /
/ /_/ / |/ |/ / _// /
\____/|__/|__/___/_||_/
owenclave / app/src/main/java/io/nekohasekai/sagernet/fmt/KryoConverters.java
/******************************************************************************
* *
* Copyright (C) 2021 by nekohasekai *
* *
* This program is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program. If not, see . *
* *
******************************************************************************/
package io.nekohasekai.sagernet.fmt;
import androidx.room.TypeConverter;
import com.esotericsoftware.kryo.KryoException;
import com.esotericsoftware.kryo.io.ByteBufferInput;
import com.esotericsoftware.kryo.io.ByteBufferOutput;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import io.nekohasekai.sagernet.database.SubscriptionBean;
import io.nekohasekai.sagernet.fmt.anytls.AnyTLSBean;
import io.nekohasekai.sagernet.fmt.http.HttpBean;
import io.nekohasekai.sagernet.fmt.http3.Http3Bean;
import io.nekohasekai.sagernet.fmt.hysteria2.Hysteria2Bean;
import io.nekohasekai.sagernet.fmt.internal.BalancerBean;
import io.nekohasekai.sagernet.fmt.internal.ChainBean;
import io.nekohasekai.sagernet.fmt.internal.ConfigBean;
import io.nekohasekai.sagernet.fmt.juicity.JuicityBean;
import io.nekohasekai.sagernet.fmt.mieru.MieruBean;
import io.nekohasekai.sagernet.fmt.naive.NaiveBean;
import io.nekohasekai.sagernet.fmt.shadowquic.ShadowQUICBean;
import io.nekohasekai.sagernet.fmt.shadowsocks.ShadowsocksBean;
import io.nekohasekai.sagernet.fmt.shadowsocksr.ShadowsocksRBean;
import io.nekohasekai.sagernet.fmt.socks.SOCKSBean;
import io.nekohasekai.sagernet.fmt.ssh.SSHBean;
import io.nekohasekai.sagernet.fmt.trojan.TrojanBean;
import io.nekohasekai.sagernet.fmt.trusttunnel.TrustTunnelBean;
import io.nekohasekai.sagernet.fmt.snell.SnellBean;
import io.nekohasekai.sagernet.fmt.olcrtc.OLCRTCBean;
import io.nekohasekai.sagernet.fmt.tuic5.Tuic5Bean;
import io.nekohasekai.sagernet.fmt.v2ray.VLESSBean;
import io.nekohasekai.sagernet.fmt.v2ray.VMessBean;
import io.nekohasekai.sagernet.fmt.wireguard.WireGuardBean;
import io.nekohasekai.sagernet.ktx.KryosKt;
import io.nekohasekai.sagernet.ktx.Logs;
public class KryoConverters {
private static final byte[] NULL = new byte[0];
@TypeConverter
public static byte[] serialize(Serializable bean) {
if (bean == null) return NULL;
ByteArrayOutputStream out = new ByteArrayOutputStream();
ByteBufferOutput buffer = KryosKt.byteBuffer(out);
bean.serializeToBuffer(buffer);
buffer.flush();
buffer.close();
return out.toByteArray();
}
public static T deserialize(T bean, byte[] bytes) {
if (bytes == null) return bean;
ByteArrayInputStream input = new ByteArrayInputStream(bytes);
ByteBufferInput buffer = KryosKt.byteBuffer(input);
try {
bean.deserializeFromBuffer(buffer);
} catch (KryoException e) {
Logs.INSTANCE.w(e);
}
bean.initializeDefaultValues();
return bean;
}
@TypeConverter
public static SOCKSBean socksDeserialize(byte[] bytes) {
if (bytes == null || bytes.length == 0) return null;
return deserialize(new SOCKSBean(), bytes);
}
@TypeConverter
public static HttpBean httpDeserialize(byte[] bytes) {
if (bytes == null || bytes.length == 0) return null;
return deserialize(new HttpBean(), bytes);
}
@TypeConverter
public static ShadowsocksBean shadowsocksDeserialize(byte[] bytes) {
if (bytes == null || bytes.length == 0) return null;
return deserialize(new ShadowsocksBean(), bytes);
}
@TypeConverter
public static ShadowsocksRBean shadowsocksRDeserialize(byte[] bytes) {
if (bytes == null || bytes.length == 0) return null;
return deserialize(new ShadowsocksRBean(), bytes);
}
@TypeConverter
public static VMessBean vmessDeserialize(byte[] bytes) {
if (bytes == null || bytes.length == 0) return null;
return deserialize(new VMessBean(), bytes);
}
@TypeConverter
public static VLESSBean vlessDeserialize(byte[] bytes) {
if (bytes == null || bytes.length == 0) return null;
return deserialize(new VLESSBean(), bytes);
}
@TypeConverter
public static TrojanBean trojanDeserialize(byte[] bytes) {
if (bytes == null || bytes.length == 0) return null;
return deserialize(new TrojanBean(), bytes);
}
@TypeConverter
public static NaiveBean naiveDeserialize(byte[] bytes) {
if (bytes == null || bytes.length == 0) return null;
return deserialize(new NaiveBean(), bytes);
}
@TypeConverter
public static Hysteria2Bean hysteria2Deserialize(byte[] bytes) {
if (bytes == null || bytes.length == 0) return null;
return deserialize(new Hysteria2Bean(), bytes);
}
@TypeConverter
public static SSHBean sshDeserialize(byte[] bytes) {
if (bytes == null || bytes.length == 0) return null;
return deserialize(new SSHBean(), bytes);
}
@TypeConverter
public static WireGuardBean wireguardDeserialize(byte[] bytes) {
if (bytes == null || bytes.length == 0) return null;
return deserialize(new WireGuardBean(), bytes);
}
@TypeConverter
public static MieruBean mieruDeserialize(byte[] bytes) {
if (bytes == null || bytes.length == 0) return null;
return deserialize(new MieruBean(), bytes);
}
@TypeConverter
public static Tuic5Bean tuic5Deserialize(byte[] bytes) {
if (bytes == null || bytes.length == 0) return null;
return deserialize(new Tuic5Bean(), bytes);
}
@TypeConverter
public static JuicityBean juicityDeserialize(byte[] bytes) {
if (bytes == null || bytes.length == 0) return null;
return deserialize(new JuicityBean(), bytes);
}
@TypeConverter
public static Http3Bean http3Deserialize(byte[] bytes) {
if (bytes == null || bytes.length == 0) return null;
return deserialize(new Http3Bean(), bytes);
}
@TypeConverter
public static AnyTLSBean anytlsDeserialize(byte[] bytes) {
if (bytes == null || bytes.length == 0) return null;
return deserialize(new AnyTLSBean(), bytes);
}
@TypeConverter
public static ShadowQUICBean shadowquicDeserialize(byte[] bytes) {
if (bytes == null || bytes.length == 0) return null;
return deserialize(new ShadowQUICBean(), bytes);
}
@TypeConverter
public static TrustTunnelBean trusttunnelDeserialize(byte[] bytes) {
if (bytes == null || bytes.length == 0) return null;
return deserialize(new TrustTunnelBean(), bytes);
}
@TypeConverter
public static SnellBean snellDeserialize(byte[] bytes) {
if (bytes == null || bytes.length == 0) return null;
return deserialize(new SnellBean(), bytes);
}
@TypeConverter
public static OLCRTCBean olcrtcDeserialize(byte[] bytes) {
if (bytes == null || bytes.length == 0) return null;
return deserialize(new OLCRTCBean(), bytes);
}
@TypeConverter
public static ConfigBean configDeserialize(byte[] bytes) {
if (bytes == null || bytes.length == 0) return null;
return deserialize(new ConfigBean(), bytes);
}
@TypeConverter
public static ChainBean chainDeserialize(byte[] bytes) {
if (bytes == null || bytes.length == 0) return null;
return deserialize(new ChainBean(), bytes);
}
@TypeConverter
public static BalancerBean balancerBeanDeserialize(byte[] bytes) {
if (bytes == null || bytes.length == 0) return null;
return deserialize(new BalancerBean(), bytes);
}
@TypeConverter
public static SubscriptionBean subscriptionDeserialize(byte[] bytes) {
if (bytes == null || bytes.length == 0) return null;
return deserialize(new SubscriptionBean(), bytes);
}
}