UNPKG

ipp-printer

Version:
128 lines (108 loc) 3.82 kB
'use strict' var C = require('ipp-encoder').CONSTANTS var once = require('once') var utils = require('./utils') var groups = require('./groups') var Job = require('./job') exports.printJob = printJob exports.validateJob = validateJob exports.getPrinterAttributes = getPrinterAttributes exports.getJobs = getJobs exports.cancelJob = cancelJob exports.getJobAttributes = getJobAttributes function printJob (printer, req, res) { var job = new Job(printer, req) var send = once(res.send) job.on('abort', function (statusCode) { send(statusCode) }) req.on('end', function () { send({ tag: C.JOB_ATTRIBUTES_TAG, attributes: job.attributes(['job-uri', 'job-id', 'job-state']) }) }) job.process() } function validateJob (printer, req, res) { // we could add a more elaborate form of validation, but for now it // must be ok that we were just able to parse the request res.send() } function getPrinterAttributes (printer, req, res) { var requested = utils.requestedAttributes(req._body) || ['all'] var attributes = printer.attributes(requested) var group1 = groups.unsupportedAttributesTag(attributes, requested) var group2 = groups.printerAttributesTag(attributes) res.send(group1.attributes.length > 0 ? [group1, group2] : [group2]) } function getJobs (printer, req, res) { var attributes = utils.getAttributesForGroup(req._body, C.OPERATION_ATTRIBUTES_TAG) var limit = utils.getFirstValueForName(attributes, 'limit') || Infinity var which = utils.getFirstValueForName(attributes, 'which-jobs') var states switch (which) { case 'completed': states = [C.JOB_COMPLETED, C.JOB_CANCELED, C.JOB_ABORTED] break case 'not-completed': states = [C.JOB_PENDING, C.JOB_PROCESSING, C.JOB_PROCESSING_STOPPED, C.JOB_PENDING_HELD] break case undefined: // all is good :) break default: res.send( C.CLIENT_ERROR_ATTRIBUTES_OR_VALUES_NOT_SUPPORTED, { tag: C.UNSUPPORTED_ATTRIBUTES_TAG, attributes: [ { tag: C.UNSUPPORTED, name: 'which-jobs', value: which } ] } ) return } var jobs = states ? printer.jobs.filter(function (job) { return ~states.indexOf(job.state) }) : printer.jobs var requested = utils.requestedAttributes(req._body) || ['job-uri', 'job-id'] var _groups = jobs .sort(function (a, b) { if (a.completedAt && !b.completedAt) return -1 if (!a.completedAt && b.completedAt) return 1 if (!a.completedAt && !b.completedAt) return b.id - a.id return b.completedAt - b.completedAt }) .slice(0, limit) .map(function (job) { var attributes = job.attributes(requested) return groups.jobAttributesTag(attributes) }) if (_groups[0]) { var group = groups.unsupportedAttributesTag(_groups[0].attributes, requested) if (group.attributes.length > 0) _groups.unshift(group) } res.send(_groups) } function cancelJob (printer, req, res) { var job = utils.getJobFromRequest(printer, req._body) if (!job) return res.send(C.CLIENT_ERROR_NOT_FOUND) switch (job.state) { case C.JOB_PENDING: case C.JOB_PENDING_HELD: case C.JOB_PROCESSING: case C.JOB_PROCESSING_STOPPED: job.cancel() res.send(C.SUCCESSFUL_OK) break default: res.send(C.CLIENT_ERROR_NOT_POSSIBLE) } } function getJobAttributes (printer, req, res) { var job = utils.getJobFromRequest(printer, req._body) if (!job) return res.send(C.CLIENT_ERROR_NOT_FOUND) var requested = utils.requestedAttributes(req._body) || ['all'] var attributes = job.attributes(requested) var group1 = groups.unsupportedAttributesTag(attributes, requested) var group2 = groups.jobAttributesTag(attributes) res.send(group1.attributes.length > 0 ? [group1, group2] : [group2]) }