/** * @see javax.print.PrintService#getSupportedAttributeCategories() */ public Class<?>[] getSupportedAttributeCategories() { Set<Class<? extends Attribute>> categories = new HashSet<Class<? extends Attribute>>(); // Should only be job template attributes as of section 4.2 if (printerAttr.containsKey(JobPrioritySupported.class)) categories.add(JobPriority.class); if (printerAttr.containsKey(JobHoldUntilSupported.class)) categories.add(JobHoldUntil.class); if (printerAttr.containsKey(JobSheetsSupported.class)) categories.add(JobSheets.class); if (printerAttr.containsKey(MultipleDocumentHandlingSupported.class)) categories.add(MultipleDocumentHandling.class); if (printerAttr.containsKey(CopiesSupported.class)) categories.add(Copies.class); if (printerAttr.containsKey(FinishingsSupported.class)) { // if only none finishing is supported - it does not count as supported Set<FinishingsSupported> set = getPrinterAttributeSet(FinishingsSupported.class); if (! (set.size() == 1 && set.contains(FinishingsSupported.NONE))) categories.add(Finishings.class); } if (printerAttr.containsKey(PageRangesSupported.class)) categories.add(PageRanges.class); if (printerAttr.containsKey(SidesSupported.class)) categories.add(Sides.class); if (printerAttr.containsKey(NumberUpSupported.class)) categories.add(NumberUp.class); if (printerAttr.containsKey(OrientationRequestedSupported.class)) categories.add(OrientationRequested.class); if (printerAttr.containsKey(MediaSupported.class)) categories.add(Media.class); if (printerAttr.containsKey(PrinterResolutionSupported.class)) categories.add(PrinterResolution.class); if (printerAttr.containsKey(PrintQualitySupported.class)) categories.add(PrintQuality.class); // Chromaticity, Destination, MediaPrintableArea, // SheetCollate, PresentationDirection - not IPP attributes // attributes outside section 4.2 if (printerAttr.containsKey(CompressionSupported.class)) categories.add(Compression.class); if (printerAttr.containsKey(JobImpressionsSupported.class)) categories.add(JobImpressions.class); if (printerAttr.containsKey(JobKOctetsSupported.class)) categories.add(JobKOctets.class); if (printerAttr.containsKey(JobMediaSheetsSupported.class)) categories.add(JobMediaSheets.class); // always supported as required by IPP specification categories.add(Fidelity.class); categories.add(JobName.class); categories.add(RequestingUserName.class); return categories.toArray(new Class[categories.size()]); }
/** * Called to handle the supported attribute values response for the given * category. This might be overridden by subclasses with different requirements * for parsing/handling the response from the GetPrinterAttributes. * * @param response the response of the GetPrinterAttributes IPP request * @param category the category for which the supported values are requested * @return A object indicating the supported values for the given attribute * category, or <code>null</code> if this print service doesn't support the * given attribute category at all. * * @see #getSupportedAttributeValues(Class, DocFlavor, AttributeSet) */ protected Object handleSupportedAttributeValuesResponse(IppResponse response, Class<? extends Attribute> category) { List<Map<Class<? extends Attribute>, Set<Attribute>>> printerAtts = response.getPrinterAttributes(); // only one will be returned Map<Class<? extends Attribute>, Set<Attribute>> printerAttribute = printerAtts.get(0); Class<? extends Attribute> suppCategory = IppUtilities.getSupportedCategory(category); Set<Attribute> attr = printerAttribute.get(suppCategory); // We sometime assume its a single instance with arbritrary value just indicating // support or an array which is returned. This is because I sometimes just choosed // what sounds right to me - as I have yet to find a printer which supports every // special category in the SUN implementation to see what they return :-) // Map whats in the JSP API if (suppCategory.equals(JobPrioritySupported.class)) return (JobPrioritySupported) attr.iterator().next(); if (suppCategory.equals(JobHoldUntilSupported.class)) return new JobHoldUntil(new Date()); if (suppCategory.equals(JobSheetsSupported.class)) return JobSheetsSupported.getAssociatedAttributeArray(attr); if (suppCategory.equals(MultipleDocumentHandlingSupported.class)) return MultipleDocumentHandlingSupported.getAssociatedAttributeArray(attr); if (suppCategory.equals(CopiesSupported.class)) return (CopiesSupported) attr.iterator().next(); if (suppCategory.equals(FinishingsSupported.class)) return FinishingsSupported.getAssociatedAttributeArray(attr); if (suppCategory.equals(PageRangesSupported.class)) return new PageRanges[] { new PageRanges(1, Integer.MAX_VALUE) }; if (suppCategory.equals(OrientationRequestedSupported.class)) return OrientationRequestedSupported.getAssociatedAttributeArray(attr); if (suppCategory.equals(MediaSupported.class)) return MediaSupported.getAssociatedAttributeArray(attr); if (suppCategory.equals(PrinterResolutionSupported.class)) return PrinterResolutionSupported.getAssociatedAttributeArray(attr); if (suppCategory.equals(PrintQualitySupported.class)) return PrintQualitySupported.getAssociatedAttributeArray(attr); if (suppCategory.equals(CompressionSupported.class)) return CompressionSupported.getAssociatedAttributeArray(attr); // Special handling as it might also be in range of integers if (suppCategory.equals(NumberUpSupported.class)) { if (attr.size() == 1) // number-up maybe in rangeofintegers return attr.iterator().next(); int[][] members = new int[attr.size()][2]; Iterator<Attribute> it = attr.iterator(); for (int j = 0; j < attr.size(); j++) { int value = ((NumberUpSupported) it.next()).getMembers()[0][0]; members[j] = new int[] { value, value }; } NumberUpSupported supported = new NumberUpSupported(members); return supported; } return null; }
/** * @see PrintService#isAttributeValueSupported(Attribute, DocFlavor, AttributeSet) */ public boolean isAttributeValueSupported(Attribute attrval, DocFlavor flavor, AttributeSet attributes) { // just redirect to getSupportedAttributeValues Object values = getSupportedAttributeValues(attrval.getCategory(), flavor, attributes); // null means none supported if (values == null) return false; // object may be an array if (values.getClass().isArray()) return Arrays.asList((Object[]) values).contains(attrval); // may be a single instance of the category (value is irrelevant) if (values.getClass().equals(attrval.getCategory())) return true; // a single instance of another class to give the bounds // copies if (values.getClass().equals(CopiesSupported.class)) return ((CopiesSupported) values).contains((IntegerSyntax) attrval); // number up if (values.getClass().equals(NumberUpSupported.class)) return ((NumberUpSupported) values).contains((IntegerSyntax) attrval); // job priority if (values.getClass().equals(JobPrioritySupported.class)) { JobPriority priority = (JobPriority) attrval; JobPrioritySupported maxSupported = (JobPrioritySupported) values; if (priority.getValue() < maxSupported.getValue()) return true; } // I am unsure if these might also show up - not yet found a printer where // Suns implementation supports them: // JobImpressionsSupported, JobKOctetsSupported, JobMediaSheetsSupported return false; }
/** * @see javax.print.PrintService#getSupportedAttributeCategories() */ public Class[] getSupportedAttributeCategories() { Set categories = new HashSet(); // Should only be job template attributes as of section 4.2 if (printerAttr.containsKey(JobPrioritySupported.class)) categories.add(JobPriority.class); if (printerAttr.containsKey(JobHoldUntilSupported.class)) categories.add(JobHoldUntil.class); if (printerAttr.containsKey(JobSheetsSupported.class)) categories.add(JobSheets.class); if (printerAttr.containsKey(MultipleDocumentHandlingSupported.class)) categories.add(MultipleDocumentHandling.class); if (printerAttr.containsKey(CopiesSupported.class)) categories.add(Copies.class); if (printerAttr.containsKey(FinishingsSupported.class)) { // if only none finishing is supported - it does not count as supported Set set = getPrinterAttributeSet(FinishingsSupported.class); if (! (set.size() == 1 && set.contains(FinishingsSupported.NONE))) categories.add(Finishings.class); } if (printerAttr.containsKey(PageRangesSupported.class)) categories.add(PageRanges.class); if (printerAttr.containsKey(SidesSupported.class)) categories.add(Sides.class); if (printerAttr.containsKey(NumberUpSupported.class)) categories.add(NumberUp.class); if (printerAttr.containsKey(OrientationRequestedSupported.class)) categories.add(OrientationRequested.class); if (printerAttr.containsKey(MediaSupported.class)) categories.add(Media.class); if (printerAttr.containsKey(PrinterResolutionSupported.class)) categories.add(PrinterResolution.class); if (printerAttr.containsKey(PrintQualitySupported.class)) categories.add(PrintQuality.class); // Chromaticity, Destination, MediaPrintableArea, // SheetCollate, PresentationDirection - not IPP attributes // attributes outside section 4.2 if (printerAttr.containsKey(CompressionSupported.class)) categories.add(Compression.class); if (printerAttr.containsKey(JobImpressionsSupported.class)) categories.add(JobImpressions.class); if (printerAttr.containsKey(JobKOctetsSupported.class)) categories.add(JobKOctets.class); if (printerAttr.containsKey(JobMediaSheetsSupported.class)) categories.add(JobMediaSheets.class); // always supported as required by IPP specification categories.add(Fidelity.class); categories.add(JobName.class); categories.add(RequestingUserName.class); return (Class[]) categories.toArray(new Class[categories.size()]); }
/** * Called to handle the supported attribute values response for the given * category. This might be overridden by subclasses with different requirements * for parsing/handling the response from the GetPrinterAttributes. * * @param response the response of the GetPrinterAttributes IPP request * @param category the category for which the supported values are requested * @return A object indicating the supported values for the given attribute * category, or <code>null</code> if this print service doesn't support the * given attribute category at all. * * @see #getSupportedAttributeValues(Class, DocFlavor, AttributeSet) */ protected Object handleSupportedAttributeValuesResponse(IppResponse response, Class category) { List printerAtts = response.getPrinterAttributes(); // only one will be returned Map printerAttribute = (Map) printerAtts.get(0); Class suppCategory = IppUtilities.getSupportedCategory(category); Set attr = (Set) printerAttribute.get(suppCategory); // We sometime assume its a single instance with arbritrary value just indicating // support or an array which is returned. This is because I sometimes just choosed // what sounds right to me - as I have yet to find a printer which supports every // special category in the SUN implementation to see what they return :-) // Map whats in the JSP API if (suppCategory.equals(JobPrioritySupported.class)) return (JobPrioritySupported) attr.toArray(new JobPrioritySupported[1])[0]; if (suppCategory.equals(JobHoldUntilSupported.class)) return new JobHoldUntil(new Date()); if (suppCategory.equals(JobSheetsSupported.class)) return JobSheetsSupported.getAssociatedAttributeArray(attr); if (suppCategory.equals(MultipleDocumentHandlingSupported.class)) return MultipleDocumentHandlingSupported.getAssociatedAttributeArray(attr); if (suppCategory.equals(CopiesSupported.class)) return (CopiesSupported) attr.toArray(new CopiesSupported[1])[0]; if (suppCategory.equals(FinishingsSupported.class)) return FinishingsSupported.getAssociatedAttributeArray(attr); if (suppCategory.equals(PageRangesSupported.class)) return new PageRanges[] { new PageRanges(1, Integer.MAX_VALUE) }; if (suppCategory.equals(OrientationRequestedSupported.class)) return OrientationRequestedSupported.getAssociatedAttributeArray(attr); if (suppCategory.equals(MediaSupported.class)) return MediaSupported.getAssociatedAttributeArray(attr); if (suppCategory.equals(PrinterResolutionSupported.class)) return PrinterResolutionSupported.getAssociatedAttributeArray(attr); if (suppCategory.equals(PrintQualitySupported.class)) return PrintQualitySupported.getAssociatedAttributeArray(attr); if (suppCategory.equals(CompressionSupported.class)) return CompressionSupported.getAssociatedAttributeArray(attr); // Special handling as it might also be in range of integers if (suppCategory.equals(NumberUpSupported.class)) { NumberUpSupported[] tmp = (NumberUpSupported[]) attr.toArray(new NumberUpSupported[attr.size()]); if (attr.size() == 1) // number-up maybe in rangeofintegers return tmp[0]; int[][] members = new int[attr.size()][2]; for (int j = 0; j < attr.size(); j++) { int value = tmp[j].getMembers()[0][0]; members[j] = new int[] { value, value }; } NumberUpSupported supported = new NumberUpSupported(members); return supported; } return null; }
public Object getSupportedAttributeValues( final Class<? extends Attribute> category, final DocFlavor flavor, final AttributeSet attributes) { checkArgs(category, flavor); try { if (OrientationRequested.class.equals(category)) { return WinPrinterFactory .getSupportedOrientations(getPrinterHandle()); } else if (Media.class.equals(category) || MediaSizeName.class.equals(category)) { return WinPrinterFactory .getSupportedMediaSizeNames(getPrinterHandle()); } else if (MediaSize.class.equals(category)) { return WinPrinterFactory .getSupportedMediaSizes(getPrinterHandle()); } else if (CopiesSupported.class.equals(category)) { final int max = WinPrinterFactory .getMaxNumberOfCopies(getPrinterHandle()); return max > 1 ? new CopiesSupported(1, max) : new CopiesSupported(1); } else if (PrintQuality.class.equals(category)) { return new PrintQuality[] { PrintQuality.HIGH, PrintQuality.NORMAL, PrintQuality.DRAFT }; } else if (Sides.class.equals(category)) { return WinPrinterFactory.isDuplexSupported(getPrinterHandle()) ? new Sides[] { Sides.ONE_SIDED, Sides.TWO_SIDED_SHORT_EDGE, Sides.TWO_SIDED_LONG_EDGE } : new Sides[] { Sides.ONE_SIDED }; } else if (SheetCollate.class.equals(category)) { return WinPrinterFactory.isDuplexSupported(getPrinterHandle()) ? new SheetCollate[] { SheetCollate.COLLATED, SheetCollate.UNCOLLATED } : new SheetCollate[] { SheetCollate.UNCOLLATED }; } else if (Chromaticity.class.equals(category)) { return WinPrinterFactory .isColorPrintingSupported(getPrinterHandle()) ? new Chromaticity[] { Chromaticity.MONOCHROME, Chromaticity.COLOR } : new Chromaticity[] { Chromaticity.MONOCHROME }; } else if (PrinterResolution.class.equals(category)) { return WinPrinterFactory .getSupportedPrinterResolutions(getPrinterHandle()); } else if (PrintQuality.class.equals(category)) { return new PrintQuality[] { PrintQuality.HIGH, PrintQuality.NORMAL, PrintQuality.DRAFT }; } } catch (final PrintException ex) { throw new RuntimeException(ex); } return null; }
public Object getSupportedAttributeValues(Class category, DocFlavor flavor, AttributeSet attributes) { if (flavor != null && (flavor.equals(DocFlavor.INPUT_STREAM.AUTOSENSE) || flavor.equals(DocFlavor.BYTE_ARRAY.AUTOSENSE) || flavor.equals(DocFlavor.URL.AUTOSENSE) || flavor.equals(DocFlavor.INPUT_STREAM.POSTSCRIPT) || flavor.equals(DocFlavor.BYTE_ARRAY.POSTSCRIPT) || flavor.equals(DocFlavor.URL.POSTSCRIPT))) { return null; } if (category.equals(Copies.class)) { int copies = getCopiesSupported(serviceName); if (copies == 1) { return new CopiesSupported(1); } else if (copies > 1) { return new CopiesSupported(1, copies); } } else if (category.equals(Sides.class)) { if (getSidesSupported(serviceName)) { return new Sides[] {Sides.ONE_SIDED, Sides.TWO_SIDED_SHORT_EDGE, Sides.TWO_SIDED_LONG_EDGE, Sides.DUPLEX, Sides.TUMBLE}; } } else if (category.equals(Media.class)) { return getSupportedMediaSizeNames(); } else if (category.equals(MediaSizeName.class)) { return getSupportedMediaSizeNames(); } else if (category.equals(Chromaticity.class)) { if (getColorSupported(serviceName)) { return new Chromaticity[] { Chromaticity.MONOCHROME, Chromaticity.COLOR }; } else { return new Chromaticity[] { Chromaticity.MONOCHROME }; } } else if (category.equals(OrientationRequested.class)) { if (getOrientationSupported(serviceName)) { return new OrientationRequested[] { OrientationRequested.PORTRAIT, OrientationRequested.LANDSCAPE }; } } else if (category.equals(PrinterResolution.class)) { int[] resolutions = getResolutionsSupported(serviceName); if (resolutions != null && resolutions.length > 1) { PrinterResolution[] res = new PrinterResolution[resolutions.length / 2]; for (int i = 0; i < resolutions.length / 2; i++) { res[i] = new PrinterResolution(resolutions[i * 2], resolutions[i * 2 + 1], PrinterResolution.DPI); } return res; } } else if (category.equals(SheetCollate.class)) { if (getCollateSupported(serviceName)) { return new SheetCollate[] { SheetCollate.COLLATED, SheetCollate.UNCOLLATED }; } } return null; }