pack method

void pack(
  1. IsoMsg message,
  2. IsoBuffer buffer
)

Implementation

void pack(IsoMsg message, IsoBuffer buffer) {
  final Map<int, IsoComponent<Object>> fields = message.children;
  final int first = firstField;

  final IsoComponent<Object>? mti = fields[0];
  if (first > 0 && mti != null && fieldPackagers[0] is! IsoBitMapPackager) fieldPackagers[0]!.pack(mti, buffer);

  IsoBitSet? tertiary;
  if (emitsBitmap) {
    final IsoComponent<Object> bitmapComponent = fields[bitmapFieldIndex]!;
    final IsoBitSet primary = bitmapComponent.value! as IsoBitSet;
    if (thirdBitmapField >= 0 && fieldPackagers[thirdBitmapField] is IsoBitMapPackager) {
      if (primary.length - 1 > 128) {
        tertiary = primary.range(128, 193);
        tertiary.clear(0);
        primary.set(thirdBitmapField);
        primary.clearRange(129, 193);
        final IsoBitMapField tertiaryField = IsoBitMapField(tertiary);
        message.setComponent(thirdBitmapField, tertiaryField);
        fields[thirdBitmapField] = tertiaryField;
        primary.set(65, fields[65] != null);
      } else {
        message.unset(thirdBitmapField);
        primary.clear(thirdBitmapField);
        fields.remove(thirdBitmapField);
      }
    }
    fieldPackagers[bitmapFieldIndex]!.pack(bitmapComponent, buffer);
  }

  final int ceiling = tertiary != null || fieldPackagers.length > 129 ? 192 : 128;
  final int highest = message.maxField < ceiling ? message.maxField : ceiling;
  for (int i = first; i <= highest; i++) {
    final IsoComponent<Object>? component = fields[i];
    if (component == null) continue;
    final IsoFieldPackager? packager = fieldPackagers[i];
    if (packager == null) throw IsoFieldException(i, "null field $i packager");
    try {
      packager.pack(component, buffer);
    } catch (error) {
      throw IsoFieldException(i, "error packing field $i", error);
    }
  }
}