readExthHeader static method

Future<MobiExthHeader> readExthHeader(
  1. MobiBuffer buffer
)

Implementation

static Future<MobiExthHeader> readExthHeader(MobiBuffer buffer) async {
  final exthMagic = buffer.getString(4);
  final exthLength = buffer.getInt32() - 12;
  final recCount = buffer.getInt32();
  if (exthMagic != exthMagic ||
      exthLength + buffer.offset > buffer.maxlen ||
      recCount == 0 ||
      recCount > exthMaxCount) {
    throw MobiInvalidDataException("Invalid EXTH Header");
  }

  final savedMaxLen = buffer.maxlen;
  buffer.maxlen = exthLength + buffer.offset;
  final header = MobiExthHeader();
  var curr = header;
  for (int i = 0; i < recCount; i++) {
    if (curr.data != null) {
      curr.next = MobiExthHeader();
      curr = curr.next!;
    }
    curr.tag = buffer.getInt32();
    curr.size = buffer.getInt32() - 8;
    if (curr.size == 0) {
      continue;
    }

    if (buffer.offset + curr.size! > buffer.maxlen) {
      throw MobiInvalidDataException("record ${curr.tag} too long");
    }

    curr.data = buffer.getStringAsByte(curr.size!);
    curr.next = null;
  }
  buffer.maxlen = savedMaxLen;
  return header;
}