regularCall method
Future<CallResult>
regularCall(
- UdpAddress? remoteConnectionPoint,
- String function,
- Uint8List data,
- 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;
}