writeBytes method

  1. @override
Future writeBytes(
  1. List<int> data, {
  2. int? vendorId,
  3. int? productId,
})
override

Implementation

@override
Future writeBytes(List<int> data, {int? vendorId, int? productId}) async {
  if (Platform.isWindows) {
    await connect();

    // Inform the spooler the document is beginning.
    final dwJob = StartDocPrinter(hPrinter, 1, docInfo!);
    if (dwJob == 0) {
      ClosePrinter(hPrinter);
      return Future.error('StartDocPrinter failed');
    }
    // Start a page.
    if (StartPagePrinter(hPrinter) == 0) {
      EndDocPrinter(hPrinter);
      ClosePrinter(hPrinter);
      return Future.error('StartPagePrinter failed');
    }

    // Send data to the printer in chunks to avoid buffer overflow.
    // Writing all data at once can cause some printers to paginate
    // (e.g., printing at A4 height) instead of continuous roll paper.
    const int chunkSize = 4096;
    int totalWritten = 0;
    final chunks = data.chunkBy(chunkSize);

    for (var chunk in chunks) {
      final lpData = chunk.toUint8();
      final chunkLen = chunk.length;

      final writeResult =
          WritePrinter(hPrinter, lpData, chunkLen, dwBytesWritten!);
      totalWritten += dwBytesWritten!.value;

      // Free the native memory after each chunk write.
      free(lpData);

      if (writeResult == 0) {
        EndPagePrinter(hPrinter);
        EndDocPrinter(hPrinter);
        ClosePrinter(hPrinter);
        return Future.error('WritePrinter failed after $totalWritten bytes');
      }
    }

    // End the page.
    if (EndPagePrinter(hPrinter) == 0) {
      EndDocPrinter(hPrinter);
      ClosePrinter(hPrinter);
      return Future.error('EndPagePrinter failed');
    }

    // Inform the spooler that the document is ending.
    if (EndDocPrinter(hPrinter) == 0) {
      ClosePrinter(hPrinter);
      return Future.error('EndDocPrinter failed');
    }

    // Tidy up the printer handle.
    ClosePrinter(hPrinter);
  } else if (Platform.isAndroid) {
    try {
      await connect();

      var bytes = Uint8List.fromList(data);

      int max = 16384;

      /// maxChunk limit on android
      var datas = bytes.chunkBy(max);
      for (var data in datas) {
        await usbPrinter.write(Uint8List.fromList(data));
      }

      await usbPrinter.close();
    } catch (e) {
      return Future.error(e.toString());
    }
  }
}