processFrame10 method

void processFrame10(
  1. UdpAddress? sourceAddress,
  2. Uint8List frame
)

Implementation

void processFrame10(UdpAddress? sourceAddress, Uint8List frame) {
  Transaction transaction = Transaction.fromBinary(frame, 0, frame.length);

  List<String> transactionsToRemove = [];
  for (var trKey in incomingTransactions.keys) {
    Transaction? incomingTransaction = incomingTransactions[trKey];
    if (incomingTransaction != null) {
      var diff = DateTime.now().difference(incomingTransaction.dtBegin);
      if (diff.inSeconds > 10) {
        transactionsToRemove.add(trKey);
      }
    }
  }
  for (String trKey in transactionsToRemove) {
    incomingTransactions.remove(trKey);
  }

  Transaction incomingTransaction =
      Transaction(0, "", "", 0, 0, 0, 0, Uint8List(0));

  String incomingTransactionCode =
      sourceAddress.toString() + "-" + transaction.transactionId.toString();
  if (incomingTransactions.containsKey(incomingTransactionCode)) {
    incomingTransaction = incomingTransactions[incomingTransactionCode]!;
  } else {
    incomingTransaction = Transaction(0, "", "", 0, 0, 0, 0, Uint8List(0));
    incomingTransaction.frameType = transaction.frameType;
    incomingTransaction.transactionId = transaction.frameType;
    incomingTransaction.sessionId = transaction.frameType;
    incomingTransaction.offset = 0;
    incomingTransaction.totalSize = transaction.totalSize;
    incomingTransaction.dtBegin = DateTime.now();
    incomingTransaction.srcAddress = transaction.srcAddress;
    incomingTransaction.destAddress = transaction.destAddress;
  }

  if (incomingTransaction.data.length != incomingTransaction.totalSize) {
    incomingTransaction.data = Uint8List(incomingTransaction.totalSize);
  }

  for (int i = 0; i < transaction.data.length; i++) {
    int targetIndex = transaction.offset + i;
    if (targetIndex < incomingTransaction.data.length) {
      incomingTransaction.data[targetIndex] = transaction.data[i];
    }
  }
  incomingTransaction.receivedDataLen += transaction.data.length;

  if (incomingTransaction.receivedDataLen < incomingTransaction.totalSize) {
    return;
  }

  incomingTransactions.remove(incomingTransactionCode);

  {
    // TODO: process Call
  }
}