Example #1
0
        /// <summary>
        ///     Print-Job Request
        ///     https://tools.ietf.org/html/rfc2911#section-3.2.1.1
        /// </summary>
        /// <param name="request"></param>
        public IppRequestMessage Construct(PrintJobRequest request)
        {
            if (request.Document == null)
            {
                throw new ArgumentException($"{nameof(request.Document)} must be set");
            }

            return(ConstructIppRequest(request));
        }
Example #2
0
        public async Task PrintJobAsync_Simple()
        {
            var file = Path.Combine(TestContext.CurrentContext.WorkDirectory, "Resources", "word-2-pages.pdf");

            await using var stream = new FileStream(file, FileMode.Open, FileAccess.Read);
            var request = new PrintJobRequest {
                PrinterUri = Options.Value.PrinterUrl, Document = stream
            };

            await TestRequestAsync(request, (client, r) => client.PrintJobAsync(r));
        }
Example #3
0
        public static async Task QueuePrintJobAsync(ConnectionMultiplexer redis, PrintJobRequest job)
        {
            var db         = redis.GetDatabase();
            var subscriber = redis.GetSubscriber();

            var queue   = RedisConstants.Queues.PrintJobQueue(job.SpoolerId);
            var jobJson = JsonSerializer.Serialize(job);
            await db.ListRightPushAsync(queue, jobJson);

            await subscriber.PublishAsync(RedisConstants.Channels.JobCreated, queue);
        }
Example #4
0
        public void PrintJobAsync_Simple()
        {
            var file = Path.Combine(TestContext.CurrentContext.WorkDirectory, "Resources", "word-2-pages.pdf");

            using var fileStream = new FileStream(file, FileMode.Open, FileAccess.Read);
            var request = new PrintJobRequest {
                PrinterUri = PrinterUrl, Document = fileStream
            };

            var result = _protocol.Construct(request);

            CheckResult(result);
        }
Example #5
0
        private async Task HandlePrintJobAsync(PrintJobRequest request)
        {
            var db           = _redis.GetDatabase();
            var connectionId = await db.HashGetAsync(RedisConstants.ConnectedClients, request.SpoolerId);

            if (connectionId.HasValue)
            {
                var spoolerClient = _printingHubContext.Clients.Client(connectionId);
                await spoolerClient.SpoolJob(new SpoolerJob()
                {
                    PrinterName = request.PrinterName,
                    ContentType = request.ContentType,
                    Content     = request.Content
                });
            }
            else
            {
                throw new Exception("Spooler is not connected"); // This effectively re-adds the job to the queue
            }
        }
Example #6
0
            public override async Task <ActionResult> HandleAsync(Command request, CancellationToken cancellationToken)
            {
                var projectId = User.GetProjectId();

                var document = await _db.Documents.FirstOrDefaultAsync(x => x.ProjectId == projectId && x.Id == request.DocumentId);

                if (document is null)
                {
                    return(NotFound());
                }

                PrinterRoute route = null;

                if (User.TryGetTerminalId(out var terminalId))
                {
                    route = await GetPrinterByTerminal(projectId, terminalId, request.Route);
                }

                if (route is null && User.TryGetZoneId(out var zoneId))
                {
                    route = await GetPrinterByZone(projectId, zoneId, request.Route);
                }

                if (route is null)
                {
                    return(BadRequest("Printer not found from route"));
                }

                var job = new PrintJobRequest()
                {
                    SpoolerId   = route.SpoolerId,
                    PrinterName = route.PrinterName,
                    ContentType = document.ContentType,
                    Content     = document.Content
                };

                await PrintHelpers.QueuePrintJobAsync(_redis, job);

                return(Accepted());
            }
Example #7
0
        public void PrintJobAsync_Full()
        {
            var file = Path.Combine(TestContext.CurrentContext.WorkDirectory, "Resources", "EmptyTwoPage.pdf");

            using var fileStream = new FileStream(file, FileMode.Open, FileAccess.Read);
            var request = new PrintJobRequest
            {
                PrinterUri         = PrinterUrl,
                Document           = fileStream,
                DocumentAttributes = new DocumentAttributes
                {
                    DocumentName            = "Document Name",
                    DocumentFormat          = "application/octet-stream",
                    DocumentNaturalLanguage = "en"
                },
                NewJobAttributes = new NewJobAttributes
                {
                    JobName = "Test Job",
                    IppAttributeFidelity = false,
                    // JobPriority = 50, //unsupported most of the time
                    // JobHoldUntil = JobHoldUntil.NoHold //unsupported most of the time
                    MultipleDocumentHandling = MultipleDocumentHandling.SeparateDocumentsCollatedCopies,
                    Copies               = 1,
                    Finishings           = Finishings.None,
                    PageRanges           = new[] { new Range(1, 2) },
                    Sides                = Sides.OneSided,
                    NumberUp             = 1,
                    OrientationRequested = Orientation.Portrait,
                    PrinterResolution    = new Resolution(600, 600, ResolutionUnit.DotsPerInch),
                    PrintQuality         = PrintQuality.Normal,
                    PrintScaling         = PrintScaling.Fit
                }
            };

            var result = _protocol.Construct(request);

            CheckResult(result);
        }
Example #8
0
            public override async Task <ActionResult> HandleAsync(Command request, CancellationToken cancellationToken)
            {
                var projectId = User.GetProjectId();

                if (!await _db.Spoolers.AnyAsync(x => x.Zone.ProjectId == projectId && x.Id == request.SpoolerId))
                {
                    return(NotFound());
                }

                using var body = new MemoryStream();
                await Request.Body.CopyToAsync(body);

                var job = new PrintJobRequest()
                {
                    SpoolerId   = request.SpoolerId,
                    PrinterName = request.PrinterName,
                    ContentType = Request.ContentType,
                    Content     = body.ToArray()
                };

                await PrintHelpers.QueuePrintJobAsync(_redis, job);

                return(Accepted());
            }
Example #9
0
 /// <summary>
 ///     Print-Job Operation
 ///     https://tools.ietf.org/html/rfc2911#section-3.2.1
 /// </summary>
 /// <param name="request"></param>
 /// <returns></returns>
 public async Task <PrintJobResponse> PrintJobAsync(PrintJobRequest request)
 {
     return(await SendAsync(request.PrinterUri, () => _ippProtocol.Construct(request),
                            ippResponse => _ippProtocol.ConstructPrintJobResponse(ippResponse)));
 }