private void Process(PDFApi pdfApi, ImageApi imageApi, int workerNumber, FileProductionRules fileProductionRules, OperationsWorkflow workflow, string destinationFolder, bool fileSizeReductionIsIntended) { while (PickFile(out FileToProcess fileToProcess)) { if (_cancellationPending) { break; } try { long inputFileSize = FileUtils.GetFileSize(fileToProcess.FileAbsolutePath); bool inputIsPDF = Path.GetExtension(fileToProcess.FileAbsolutePath).ToUpper() == ".PDF"; if (!CheckInputFileSizeValidity(inputFileSize, fileToProcess.FileAbsolutePath)) { continue; } WorkflowProcessingResult workFlowProcessingResult = ProcessWorkflow(pdfApi, imageApi, workflow, fileToProcess, workerNumber); if (workFlowProcessingResult != null) { string outputFileAbsolutePath = destinationFolder + fileToProcess.FileRelativePath; bool fileSuccesfullyProcessed = HandleOutputFileProduction(fileToProcess, workFlowProcessingResult.FileID, workerNumber, workflow.SaveOperation, workflow.SaveOperationConfiguration, pdfApi, imageApi, fileProductionRules, workFlowProcessingResult, fileSizeReductionIsIntended, inputIsPDF, inputFileSize, outputFileAbsolutePath); TryCloseDocumentAsync(pdfApi, workFlowProcessingResult.FileID); if (fileSuccesfullyProcessed) { OnFileSuccesfullyProcessed(new FileOperationsResult(fileToProcess.FileAbsolutePath, inputFileSize, FileUtils.GetFileSize(outputFileAbsolutePath), !inputIsPDF), workFlowProcessingResult.WarningMessages); } else { continue; } } } catch (Exception exception) { OnError(ErrorManager.GetMessageFromException(exception, fileToProcess.FileAbsolutePath)); } if (_workPaused && !_cancellationPending) { // If pause has been requested, wait for resume signal WorkerPauseEventHandler.Invoke(workerNumber); _waitHandle.WaitOne(); } } OnWorkerWorkCompletion(workerNumber); }
public void Start(int workerCount, string destinationFolder, FileProductionRules fileProductionRules, OperationsWorkflow workflow, string apiKey) { lock (_locker) { _cancellationPending = false; } InitializeApiInstances(out PDFApi pdfApiInstance, out ImageApi imageApiInstance, apiKey); destinationFolder = ParsingUtils.EnsureFolderPathEndsWithBackSlash(destinationFolder); bool fileSizeReductionIsIntended = OperationsWorkflowUtilities.IsFileSizeReductionIntended(workflow); for (int i = 1; i <= workerCount; i++) { int workerNumber = i; // Launch the workers. Thread thread = new Thread(() => Process(pdfApiInstance, imageApiInstance, workerNumber, fileProductionRules, workflow, destinationFolder, fileSizeReductionIsIntended)); thread.Start(); _busyWorkersCount++; } }
private bool HandleOutputFileProduction(FileToProcess fileToProcess, string fileId, int workerNumber, OperationsWorkflow.SaveOperationType saveOperationType, object saveOperationConfiguration, PDFApi pdfApi, ImageApi imageApi, FileProductionRules fileProductionRules, WorkflowProcessingResult workflowProcessingResult, bool fileSizeReductionIsIntended, bool inputIsPDF, long inputFileSize, string outputFileAbsolutePath) { if (!DownloadAndSaveDocument(pdfApi, imageApi, fileId, workerNumber, saveOperationType, saveOperationConfiguration, DownloadOperationStartEventHandler, fileToProcess.FileAbsolutePath, out string downloadedDocumentFileName)) { return(false); } bool keepProducedFile = MustProducedFileBeKept(workflowProcessingResult, fileSizeReductionIsIntended, inputIsPDF, inputFileSize, FileUtils.GetFileSize(downloadedDocumentFileName)); bool outputIsInput = FileUtils.AreSamePath(fileToProcess.FileAbsolutePath, outputFileAbsolutePath); if (keepProducedFile) { if (fileProductionRules.DeleteOriginalFileOnSuccess && !outputIsInput) { try { FileUtils.DeleteFile(fileToProcess.FileAbsolutePath); } catch (Exception exception) { OnWarning(LogMessagesUtils.ReplaceMessageSequencesAndReferences(FrameworkGlobals.MessagesLocalizer.GetString("message_original_file_deletion_failure", FrameworkGlobals.ApplicationLanguage), fileName: fileToProcess.FileAbsolutePath, additionalMessage: exception.Message)); } } FileUtils.MoveFile(downloadedDocumentFileName, outputFileAbsolutePath); File.SetCreationTime(outputFileAbsolutePath, File.GetCreationTime(fileToProcess.FileAbsolutePath)); } else { if (!outputIsInput) { FileUtils.CopyFile(fileToProcess.FileAbsolutePath, outputFileAbsolutePath); } if (fileSizeReductionIsIntended) { // Inform file size reduction failure workflowProcessingResult.WarningMessages.Add(LogMessagesUtils.GetWarningStatustext(new ReduceWarningInfo() { WarningCode = ReduceWarningCode.FileSizeReductionFailure }, fileToProcess.FileAbsolutePath)); } FileUtils.DeleteFile(downloadedDocumentFileName); } if (fileProductionRules.KeepWriteAndAccessTime) { FileUtils.SetOriginalLastAccessTime(fileToProcess.FileAbsolutePath, outputFileAbsolutePath); } return(true); }