convert_provider.dart 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. /// convert_provider.dart
  2. /// Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
  3. ///
  4. /// THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
  5. /// AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
  6. /// UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
  7. /// This notice may not be removed from this file.
  8. import 'package:flutter/material.dart';
  9. import 'package:kmpdfkit_conversion_flutter/cpdf_converter.dart';
  10. import 'package:kmpdfkit_conversion_flutter/models/convert_status.dart';
  11. import 'package:kmpdfkit_conversion_flutter/models/convert_type.dart';
  12. import 'package:kmpdfkit_conversion_flutter/models/options/convert_ppt_options.dart';
  13. import 'package:kmpdfkit_conversion_flutter/models/options/options.dart';
  14. import 'package:kmpdfkit_conversion_flutter/models/task_result.dart';
  15. import 'package:kmpdfkit_conversion_flutter/util/string_extensions.dart';
  16. import 'package:path/path.dart';
  17. import 'package:uuid/uuid.dart';
  18. import '../models/convert_task.dart';
  19. class ConvertTaskQueueProvider extends ChangeNotifier {
  20. final List<ConvertTask> _taskQueue = [];
  21. List<ConvertTask> get taskQueue => _taskQueue;
  22. bool _isExecuting = false;
  23. bool autoTask = true;
  24. void addTask(ConvertType convertType, Options options, List<String> files) {
  25. if (files.isEmpty) {
  26. conversionLog("pdf files is empty");
  27. return;
  28. }
  29. for (var i = 0; i < files.length; i++) {
  30. String? path = files[i];
  31. var taskId = const Uuid().v4();
  32. ConvertTask task = ConvertTask(
  33. taskId: taskId,
  34. filePath: path,
  35. fileName: basenameWithoutExtension(path),
  36. convertType: convertType,
  37. status: TaskStatus.wait,
  38. progress: 0,
  39. options: options);
  40. _taskQueue.add(task);
  41. conversionLog("The task has been added to the queue");
  42. }
  43. if (!_isExecuting && autoTask) {
  44. conversionLog(
  45. "There is no task in progress, and the conversion task is started");
  46. executeNextTask();
  47. }
  48. notifyListeners();
  49. }
  50. void executeNextTask() {
  51. ConvertTask? nextTask = getNextTask();
  52. if (nextTask != null) {
  53. conversionLog(
  54. "The waiting task in the queue is not empty, and the file transfer is started");
  55. startTask(nextTask);
  56. } else {
  57. conversionLog(
  58. "There is no waiting transfer task in the queue, and the task ends");
  59. }
  60. }
  61. void startTask(ConvertTask task) {
  62. _isExecuting = true;
  63. CPDFConverter.convert(
  64. taskId: task.taskId,
  65. filePath: task.filePath,
  66. convertType: task.convertType,
  67. options: task.options,
  68. callback: (TaskResult result) {
  69. conversionLog(
  70. "converting : taskId:${result.taskId}--progress:${result.progress}, status:${result.taskStatus}");
  71. updateStatus(result.taskId, result.progress, result.taskStatus,
  72. result.outPutPath);
  73. if (result.taskStatus == TaskStatus.success ||
  74. result.taskStatus == TaskStatus.fail) {
  75. conversionLog(
  76. "convert:${result.taskStatus.name}, start the next task");
  77. _isExecuting = false;
  78. if (autoTask) {
  79. executeNextTask();
  80. }
  81. }
  82. });
  83. CPDFConverter.cancelTask()
  84. }
  85. void updateStatus(
  86. String taskId, int progress, TaskStatus status, String? outputPath) {
  87. ConvertTask bean =
  88. _taskQueue.firstWhere((element) => element.taskId == taskId);
  89. bean
  90. ..status = status
  91. ..progress = progress
  92. ..outputPath = outputPath;
  93. notifyListeners();
  94. }
  95. ConvertTask? getNextTask() {
  96. try {
  97. if (_taskQueue.any((element) => element.status == TaskStatus.wait)) {
  98. return _taskQueue
  99. .firstWhere((element) => element.status == TaskStatus.wait);
  100. } else {
  101. return null;
  102. }
  103. } catch (e) {
  104. return null;
  105. }
  106. }
  107. }