handleMlsd method

Future<void> handleMlsd(
  1. String argument,
  2. FtpSession session
)

Implementation

Future<void> handleMlsd(String argument, FtpSession session) async {
  if (!await openDataConnection()) {
    return;
  }

  try {
    transferInProgress = true;
    var dirContents = await fileOperations.listDirectory(argument);
    logger.generalLog('Listing directory with MLSD: $argument');

    for (FileSystemEntity entity in dirContents) {
      if (!transferInProgress || dataSocket == null) break;

      try {
        var stat = await entity.stat();
        String facts = _formatMlsdFacts(entity, stat);

        try {
          dataSocket!.write(facts);
        } catch (socketError) {
          logger.generalLog('Socket write error during MLSD: $socketError');
          transferInProgress = false;
          break;
        }
      } catch (entityError) {
        logger
            .generalLog('Error processing entity during MLSD: $entityError');
        // Continue with next entity
        continue;
      }
    }

    if (transferInProgress) {
      transferInProgress = false;
      await _closeDataSocket();
      sendResponse('226 Transfer complete.');
    } else {
      await _closeDataSocket();
      sendResponse('426 Transfer aborted');
    }
  } catch (e) {
    logger.generalLog('Error listing directory with MLSD: $e');
    sendResponse('550 Failed to list directory: $e');
    transferInProgress = false;
    await _closeDataSocket();
  }
}