170 lines
6.3 KiB
C#
170 lines
6.3 KiB
C#
using System;
|
|
using System.IO;
|
|
using System.Printing;
|
|
|
|
using JetBrains.Annotations;
|
|
|
|
using VirtualPrinter.Agent.Core;
|
|
|
|
namespace VirtualPrinter.Agent.Lib.Misc
|
|
{
|
|
public class JobService : IJobService
|
|
{
|
|
[NotNull]
|
|
private readonly IRegistryRepository _registryRepository;
|
|
|
|
[NotNull]
|
|
private readonly IJobFactory _jobFactory;
|
|
|
|
[NotNull]
|
|
private readonly IShell _shell;
|
|
private IDirectoryHelper _directoryHelper;
|
|
|
|
public JobService
|
|
(
|
|
[NotNull]IRegistryRepository registryRepository,
|
|
[NotNull]IJobFactory jobFactory,
|
|
[NotNull]IShell shell,
|
|
[NotNull]IDirectoryHelper directoryHelper
|
|
)
|
|
{
|
|
if (registryRepository == null)
|
|
{
|
|
throw new ArgumentNullException(nameof(registryRepository));
|
|
}
|
|
|
|
if (jobFactory == null)
|
|
{
|
|
throw new ArgumentNullException(nameof(jobFactory));
|
|
}
|
|
|
|
if (shell == null)
|
|
{
|
|
throw new ArgumentNullException(nameof(shell));
|
|
}
|
|
|
|
if (directoryHelper == null)
|
|
{
|
|
throw new ArgumentNullException(nameof(directoryHelper));
|
|
}
|
|
|
|
_registryRepository = registryRepository;
|
|
_jobFactory = jobFactory;
|
|
_shell = shell;
|
|
_directoryHelper = directoryHelper;
|
|
}
|
|
|
|
public void Start(IJob job)
|
|
{
|
|
if (job == null)
|
|
{
|
|
throw new ArgumentNullException(nameof(job));
|
|
}
|
|
|
|
const PrintStatus status = PrintStatus.Paused;
|
|
|
|
var iniFile = Path.GetFullPath(job.IniDataPath);
|
|
var config = _registryRepository.GetRegistryConfig();
|
|
var pre = config.ResolvedPreconverter;
|
|
WriteJobStartIni(job, status);
|
|
|
|
_shell.Execute(job.JobInfo, job.SessionInfo, pre.Item1, $"{pre.Item2} \"{iniFile}\"");
|
|
}
|
|
|
|
public IJob CreateJob(string iniFile, string rawFile)
|
|
{
|
|
var jobInfo = GetJobInfo(iniFile);
|
|
|
|
var sessionInfo = GetSessionInfo(iniFile);
|
|
|
|
return _jobFactory.Create(iniFile, rawFile, jobInfo, sessionInfo);
|
|
}
|
|
|
|
public PrintStatus ReadStatus(string iniPath)
|
|
{
|
|
var txt = _shell.ReadIniEntry<string>("Preconverting", "Status", iniPath);
|
|
Enum.TryParse(txt, true, out PrintStatus result);
|
|
|
|
return result;
|
|
}
|
|
|
|
public JobStatus ReadJobStatus(string iniPath)
|
|
{
|
|
var status = _shell.ReadIniEntry<string>("Job", "Status", iniPath);
|
|
Enum.TryParse(status, true, out JobStatus result);
|
|
return result;
|
|
}
|
|
|
|
public void Finish(IJob job)
|
|
{
|
|
var config = _registryRepository.GetRegistryConfig();
|
|
WriteJobFinishIni(job.IniDataPath, config);
|
|
var iniFile = Path.GetFullPath(job.IniDataPath);
|
|
var post = config.ResolvedPostconverter;
|
|
|
|
_shell.Execute(job.JobInfo, job.SessionInfo, post.Item1, $"{post.Item2} \"{iniFile}\"");
|
|
}
|
|
|
|
private void WriteJobStartIni([NotNull]IJob job, PrintStatus status)
|
|
{
|
|
_shell.WriteIniEntry("Job", "Status", JobStatus.InProgress.ToString().ToLowerInvariant(), job.IniDataPath);
|
|
_shell.WriteIniEntry("Device", "DeviceName", job.JobInfo.DeviceName, job.IniDataPath);
|
|
_shell.WriteIniEntry("Document", "Name", job.JobInfo.Name.Normalize(), job.IniDataPath);
|
|
_shell.WriteIniEntry("Document", "JobID", $"{job.JobInfo.JobId}", job.IniDataPath);
|
|
_shell.WriteIniEntry("Document", "DomainName", job.JobInfo.DomainName, job.IniDataPath);
|
|
_shell.WriteIniEntry("Document", "MachineName", job.JobInfo.MachineName, job.IniDataPath);
|
|
_shell.WriteIniEntry("Document", "UserName", job.JobInfo.UserName, job.IniDataPath);
|
|
_shell.WriteIniEntry("Document", "SessionID", $"{job.SessionInfo.Id}", job.IniDataPath);
|
|
_shell.WriteIniEntry("Document", "Desktop", $"{job.SessionInfo.Desktop}", job.IniDataPath);
|
|
_shell.WriteIniEntry("Document", "SID", $"{job.SessionInfo.Sid}", job.IniDataPath);
|
|
_shell.WriteIniEntry("Document", "Status", job.JobInfo.Status.ToString(), job.IniDataPath);
|
|
_shell.WriteIniEntry("Preconverting", "Status", status.ToIni(), job.IniDataPath);
|
|
}
|
|
|
|
private SessionInfo GetSessionInfo(string iniFile)
|
|
{
|
|
var sessionInfo = new SessionInfo
|
|
{
|
|
Id = _shell.ReadIniEntry<int>("Document",
|
|
"SessionID",
|
|
iniFile),
|
|
Sid = _shell.ReadIniEntry<string>("Document", "SID", iniFile),
|
|
Desktop = _shell.ReadIniEntry<string>("Document", "Desktop", iniFile)
|
|
};
|
|
return sessionInfo;
|
|
}
|
|
|
|
private JobInfo GetJobInfo(string iniFile)
|
|
{
|
|
var jobInfo = new JobInfo
|
|
{
|
|
DomainName = _shell.ReadIniEntry<string>("Document",
|
|
"DomainName",
|
|
iniFile),
|
|
MachineName = _shell.ReadIniEntry<string>("Document",
|
|
"MachineName",
|
|
iniFile),
|
|
UserName = _shell.ReadIniEntry<string>("Document",
|
|
"UserName",
|
|
iniFile)
|
|
};
|
|
return jobInfo;
|
|
}
|
|
|
|
private void WriteJobFinishIni(string iniPath, [NotNull]IExConfig config)
|
|
{
|
|
const PrintStatus status = PrintStatus.Complete;
|
|
const PrintJobStatus spoolerState = PrintJobStatus.Printed;
|
|
|
|
_shell.WriteIniEntry("Preconverting", "Status", status.ToIni(), iniPath);
|
|
var pdfFile = Path.GetFileNameWithoutExtension(iniPath) + ".pdf";
|
|
var tiffFile = Path.GetFileNameWithoutExtension(iniPath) + ".tif";
|
|
var dir = _directoryHelper.GetOutputDirectory(config);
|
|
pdfFile = Path.Combine(dir, pdfFile);
|
|
tiffFile = Path.Combine(dir, tiffFile);
|
|
_shell.WriteIniEntry("PDF", "File0", pdfFile, iniPath);
|
|
_shell.WriteIniEntry("TIFF", "File0", tiffFile, iniPath);
|
|
_shell.WriteIniEntry("Document", "Status", spoolerState.ToString(), iniPath);
|
|
}
|
|
}
|
|
}
|