/*
* Copyright (C) 2015 Actor LLC. <https://actor.im>
*/
package im.actor.core.network.mtp;
import im.actor.runtime.actors.ActorRef;
import im.actor.runtime.actors.messages.PoisonPill;
import im.actor.core.network.Endpoints;
import im.actor.core.network.NetworkState;
import im.actor.core.network.mtp.actors.ManagerActor;
import im.actor.core.network.mtp.actors.ReceiverActor;
import im.actor.core.network.mtp.actors.PusherActor;
import im.actor.core.network.mtp.entity.MTRpcRequest;
import im.actor.core.network.mtp.entity.ProtoStruct;
import im.actor.core.network.util.MTUids;
public class MTProto {
private final long authId;
private final byte[] authKey;
private final long sessionId;
private final Endpoints endpoints;
private final MTProtoCallback callback;
private final ActorRef receiver;
private final ActorRef manager;
private final ActorRef sender;
private final String actorPath;
private final boolean isEnableLog;
private final int minDelay;
private final int maxDelay;
private final int maxFailureCount;
private boolean isClosed;
public MTProto(long authId,
byte[] authKey,
long sessionId,
Endpoints endpoints,
MTProtoCallback callback,
boolean isEnableLog,
String basePath,
int minDelay,
int maxDelay,
int maxFailureCount) {
this.authId = authId;
this.authKey = authKey;
this.sessionId = sessionId;
this.endpoints = endpoints;
this.callback = callback;
this.actorPath = basePath;
this.isEnableLog = isEnableLog;
this.minDelay = minDelay;
this.maxDelay = maxDelay;
this.maxFailureCount = maxFailureCount;
this.isClosed = false;
this.manager = ManagerActor.manager(this);
this.sender = PusherActor.senderActor(this);
this.receiver = ReceiverActor.receiver(this);
}
public MTProtoCallback getCallback() {
return callback;
}
public Endpoints getEndpoints() {
return endpoints;
}
public long getAuthId() {
return authId;
}
public byte[] getAuthKey() {
return authKey;
}
public long getSessionId() {
return sessionId;
}
public String getActorPath() {
return actorPath;
}
public boolean isEnableLog() {
return isEnableLog;
}
public long sendRpcMessage(ProtoStruct protoStruct) {
long mtId = MTUids.nextId();
sender.send(new PusherActor.SendMessage(mtId, new MTRpcRequest(protoStruct.toByteArray()).toByteArray(), true));
return mtId;
}
public void cancelRpc(long mtId) {
sender.send(new PusherActor.ForgetMessage(mtId, true));
}
public void onNetworkChanged(NetworkState state) {
this.manager.send(new ManagerActor.NetworkChanged(state));
}
public void forceNetworkCheck() {
this.manager.send(new ManagerActor.ForceNetworkCheck());
}
public void stopProto() {
this.sender.send(PoisonPill.INSTANCE);
this.manager.send(PoisonPill.INSTANCE);
this.receiver.send(PoisonPill.INSTANCE);
this.isClosed = true;
}
public int getMinDelay() {
return minDelay;
}
public int getMaxDelay() {
return maxDelay;
}
public int getMaxFailureCount() {
return maxFailureCount;
}
}