Search in sources :

Example 1 with RpcOk

use of im.actor.core.network.mtp.entity.rpc.RpcOk in project actor-platform by actorapp.

the class ProtoSerializer method readRpcResponsePayload.

public static ProtoStruct readRpcResponsePayload(byte[] data) throws IOException {
    DataInput bs = new DataInput(data, 0, data.length);
    final int header = bs.readByte();
    switch(header) {
        case RpcOk.HEADER:
            return new RpcOk(bs);
        case RpcError.HEADER:
            return new RpcError(bs);
        case RpcFloodWait.HEADER:
            return new RpcFloodWait(bs);
        case RpcInternalError.HEADER:
            return new RpcInternalError(bs);
    }
    throw new IOException("Unable to read proto object");
}
Also used : DataInput(im.actor.runtime.bser.DataInput) RpcOk(im.actor.core.network.mtp.entity.rpc.RpcOk) RpcFloodWait(im.actor.core.network.mtp.entity.rpc.RpcFloodWait) RpcError(im.actor.core.network.mtp.entity.rpc.RpcError) RpcInternalError(im.actor.core.network.mtp.entity.rpc.RpcInternalError) IOException(java.io.IOException)

Example 2 with RpcOk

use of im.actor.core.network.mtp.entity.rpc.RpcOk in project actor-platform by actorapp.

the class ApiBroker method processResponse.

private void processResponse(long authId, long mid, byte[] content) {
    if (authId != currentAuthId) {
        return;
    }
    ProtoStruct protoStruct;
    try {
        protoStruct = ProtoSerializer.readRpcResponsePayload(content);
    } catch (IOException e) {
        e.printStackTrace();
        Log.w(TAG, "Broken response mid#" + mid);
        return;
    }
    // Log.w(TAG, protoStruct + " mid#" + mid);
    long rid;
    if (idMap.containsKey(mid)) {
        rid = idMap.get(mid);
    } else {
        return;
    }
    CommonTimer timer = timeouts.get(rid);
    if (timer != null) {
        timer.cancel();
        timeouts.remove(rid);
    }
    RequestHolder holder;
    if (requests.containsKey(rid)) {
        holder = requests.get(rid);
    } else {
        return;
    }
    if (protoStruct instanceof RpcOk) {
        RpcOk ok = (RpcOk) protoStruct;
        requests.remove(rid);
        if (holder.protoId != 0) {
            idMap.remove(holder.protoId);
        }
        Response response;
        try {
            response = (Response) parserConfig.parseRpc(ok.responseType, ok.payload);
        } catch (IOException e) {
            e.printStackTrace();
            requests.remove(rid);
            if (holder.protoId != 0) {
                idMap.remove(holder.protoId);
            }
            holder.callback.onError(new RpcInternalException());
            return;
        }
        Log.d(TAG, "<- response#" + holder.publicId + ": " + response + " in " + (Runtime.getCurrentTime() - holder.requestTime) + " ms");
        holder.callback.onResult(response);
    } else if (protoStruct instanceof RpcError) {
        RpcError e = (RpcError) protoStruct;
        requests.remove(rid);
        if (holder.protoId != 0) {
            idMap.remove(holder.protoId);
        }
        Log.w(TAG, "<- error#" + holder.publicId + ": " + e.errorTag + " " + e.errorCode + " " + e.userMessage + " in " + (Runtime.getCurrentTime() - holder.requestTime) + " ms");
        holder.callback.onError(new RpcException(e.errorTag, e.errorCode, e.userMessage, e.canTryAgain, e.relatedData));
    } else if (protoStruct instanceof RpcInternalError) {
        RpcInternalError e = ((RpcInternalError) protoStruct);
        Log.d(TAG, "<- internal_error#" + holder.publicId + " " + e.getTryAgainDelay() + " sec" + " in " + (Runtime.getCurrentTime() - holder.requestTime) + " ms");
        if (e.isCanTryAgain()) {
            schedule(new ForceResend(rid), e.getTryAgainDelay() * 1000L);
        } else {
            requests.remove(rid);
            if (holder.protoId != 0) {
                idMap.remove(holder.protoId);
            }
            holder.callback.onError(new RpcInternalException());
        }
    } else if (protoStruct instanceof RpcFloodWait) {
        RpcFloodWait f = (RpcFloodWait) protoStruct;
        Log.d(TAG, "<- flood_wait#" + holder.publicId + " " + f.getDelay() + " sec" + " in " + (Runtime.getCurrentTime() - holder.requestTime) + " ms");
        schedule(new ForceResend(rid), f.getDelay() * 1000L);
    } else {
        Log.d(TAG, "<- unknown_package#" + holder.publicId + " in " + (Runtime.getCurrentTime() - holder.requestTime) + " ms");
    }
}
Also used : RpcError(im.actor.core.network.mtp.entity.rpc.RpcError) CommonTimer(im.actor.runtime.threading.CommonTimer) IOException(java.io.IOException) RpcInternalError(im.actor.core.network.mtp.entity.rpc.RpcInternalError) Response(im.actor.core.network.parser.Response) ProtoStruct(im.actor.core.network.mtp.entity.ProtoStruct) RpcOk(im.actor.core.network.mtp.entity.rpc.RpcOk) RpcFloodWait(im.actor.core.network.mtp.entity.rpc.RpcFloodWait)

Aggregations

RpcError (im.actor.core.network.mtp.entity.rpc.RpcError)2 RpcFloodWait (im.actor.core.network.mtp.entity.rpc.RpcFloodWait)2 RpcInternalError (im.actor.core.network.mtp.entity.rpc.RpcInternalError)2 RpcOk (im.actor.core.network.mtp.entity.rpc.RpcOk)2 IOException (java.io.IOException)2 ProtoStruct (im.actor.core.network.mtp.entity.ProtoStruct)1 Response (im.actor.core.network.parser.Response)1 DataInput (im.actor.runtime.bser.DataInput)1 CommonTimer (im.actor.runtime.threading.CommonTimer)1