/*
* Copyright (C) 2015 Actor LLC. <https://actor.im>
*/
package im.actor.core.network;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import im.actor.runtime.bser.Bser;
import im.actor.runtime.bser.BserObject;
import im.actor.runtime.bser.BserValues;
import im.actor.runtime.bser.BserWriter;
import im.actor.runtime.mtproto.ConnectionEndpoint;
public class Endpoints extends BserObject {
private int roundRobin = 0;
private ConnectionEndpoint[] endpoints;
private TrustedKey[] trustedKeys;
public Endpoints() {
}
public Endpoints(ConnectionEndpoint[] endpoints, TrustedKey[] trustedKeys) {
this.endpoints = endpoints;
this.trustedKeys = trustedKeys;
}
public TrustedKey[] getTrustedKeys() {
return trustedKeys;
}
public ConnectionEndpoint fetchEndpoint(boolean preferEncrypted) {
// Trying to find secure endpoint
if (preferEncrypted) {
ArrayList<ConnectionEndpoint> secure = new ArrayList<>();
for (ConnectionEndpoint e : endpoints) {
if (e.getType() == ConnectionEndpoint.TYPE_TCP_TLS ||
e.getType() == ConnectionEndpoint.TYPE_WS_TLS) {
secure.add(e);
}
}
if (secure.size() > 0) {
roundRobin = (roundRobin + 1) % secure.size();
return secure.get(roundRobin);
}
} else {
ArrayList<ConnectionEndpoint> plainText = new ArrayList<>();
for (ConnectionEndpoint e : endpoints) {
if (e.getType() == ConnectionEndpoint.TYPE_TCP ||
e.getType() == ConnectionEndpoint.TYPE_WS) {
plainText.add(e);
}
}
if (plainText.size() > 0) {
roundRobin = (roundRobin + 1) % plainText.size();
return plainText.get(roundRobin);
}
}
roundRobin = (roundRobin + 1) % endpoints.length;
return endpoints[roundRobin];
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Endpoints endpoints1 = (Endpoints) o;
return Arrays.equals(endpoints, endpoints1.endpoints) && Arrays.equals(trustedKeys, endpoints1.trustedKeys);
}
public static Endpoints fromBytes(byte[] data) throws IOException {
return Bser.parse(new Endpoints(), data);
}
@Override
public void parse(BserValues values) throws IOException {
List<byte[]> endpointsRepeatedBytes = values.getRepeatedBytes(1);
endpoints = new ConnectionEndpoint[endpointsRepeatedBytes.size()];
for (int i = 0; i < endpoints.length; i++) {
endpoints[i] = ConnectionEndpoint.fromBytes(endpointsRepeatedBytes.get(i));
}
List<byte[]> trustedKeysRepeatedBytes = values.getRepeatedBytes(2);
trustedKeys = new TrustedKey[trustedKeysRepeatedBytes.size()];
for (int i = 0; i < trustedKeys.length; i++) {
trustedKeys[i] = TrustedKey.fromBytes(trustedKeysRepeatedBytes.get(i));
}
}
@Override
public void serialize(BserWriter writer) throws IOException {
writer.writeRepeatedObj(1, new ArrayList<>(Arrays.asList(endpoints)));
writer.writeRepeatedObj(2, new ArrayList<>(Arrays.asList(trustedKeys)));
}
}