getMessage method

Future<MimeMessage> getMessage(
  1. int messageIndex,
  2. MailClient mailClient, {
  3. Mailbox? mailbox,
  4. FetchPreference fetchPreference = FetchPreference.envelope,
})

Retrieves the message at the given index.

Note that the messageIndex is expected to be based on full messageSequence, where index 0 is newest message and size-1 is the oldest message.

Implementation

Future<MimeMessage> getMessage(int messageIndex, MailClient mailClient,
    {Mailbox? mailbox,
    FetchPreference fetchPreference = FetchPreference.envelope}) async {
  Future<List<MimeMessage>> queue(int pageIndex) {
    final sequence = pagedSequence.getSequence(pageIndex);
    final future = mailClient.fetchMessageSequence(sequence,
        mailbox: mailbox, fetchPreference: fetchPreference);
    _requestedPages[pageIndex] = future;
    return future;
  }

  if (isAvailable(messageIndex)) {
    return this[messageIndex];
  }
  final pageIndex = pagedSequence.pageIndexOf(messageIndex);
  if (pageIndex > 0) {
    // ensure that previous pages are loaded first:
    final previousRequest = _requestedPages[pageIndex - 1];
    if (previousRequest != null) {
      await previousRequest;
    }
  }
  final request = _requestedPages[pageIndex] ?? queue(pageIndex);
  final messages = await request;
  if (_requestedPages.containsKey(pageIndex)) {
    unawaited(_requestedPages.remove(pageIndex));
    insertAll(messages);
  }
  final relativeIndex =
      (pageIndex * pagedSequence.pageSize + messages.length) -
          (messageIndex + 1);
  return messages[relativeIndex];
}