/** * @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; }