regularCall method

Future<CallResult> regularCall(
  1. UdpAddress? remoteConnectionPoint,
  2. String function,
  3. Uint8List data,
  4. Uint8List aesKey,
)

Implementation

Future<CallResult> regularCall(UdpAddress? remoteConnectionPoint,
    String function, Uint8List data, Uint8List aesKey) async {
  CallResult result = CallResult();

  Uint8List functionBS = Uint8List.fromList(utf8.encode(function));

  bool encrypted = false;
  int localSessionNonceCounter = sessionNonceCounter;
  sessionNonceCounter++;

  if (functionBS.length > 255) {
    return CallResult.createError("functionBS.length > 255");
  }

  Uint8List frame = Uint8List(0);

  if (aesKey.length == 32) {
    frame = Uint8List(8 + 1 + functionBS.length + data.length);
    frame.buffer.asInt64List()[0] = localSessionNonceCounter;
    frame[8] = functionBS.length;
    copyBytes(frame, 9, functionBS);
    copyBytes(frame, 9 + functionBS.length, data);
    frame = packBytes(frame);
    frame = aesEncrypt(aesKey, frame);
    encrypted = true;
  } else {
    frame = Uint8List(1 + functionBS.length + data.length);
    frame[0] = functionBS.length;
    copyBytes(frame, 1, functionBS);
    copyBytes(frame, 1 + functionBS.length, data);
  }

  if (!function.contains("data_item_history")) {
    //print("regularCall: $function len:${frame.length} sessionId:$sessionId");
  }

  CallResult callResult =
      await executeTransaction(remoteConnectionPoint, sessionId, frame);
  if (callResult.isError()) {
    return callResult;
  }

  if (encrypted) {
    try {
      callResult.data = aesDecrypt(aesKey, callResult.data);
      callResult.data = unpack(callResult.data);
    } catch (ex) {
      sessionId = 0;
      aesKey = Uint8List(0);
      return CallResult.createError(ex.toString());
    }
  }

  if (callResult.data.isEmpty) {
    return CallResult.createError("callResult.data.length < 1");
  }

  if (callResult.data[0] == 0) {
    // Success
    result = CallResult();
    result.data = callResult.data.sublist(1);

    if (!function.contains("data_item_history")) {
      //print("regularCall ok: $function");
    }

    return result;
  }

  if (callResult.data[0] == 1) {
    // High level Error
    result = CallResult.createError(utf8.decode(callResult.data.sublist(1)));
    return result;
  }

  result = CallResult.createError("Wrong response status");

  return result;
}