package com.pisa.util;
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @author Igor A. Pyankov
*/
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FilePermission;
import java.io.InputStream;
import java.lang.reflect.Array;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.ArrayList;
import java.util.Locale;
import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.PrintException;
import javax.print.attribute.Attribute;
import javax.print.attribute.AttributeSet;
import javax.print.attribute.AttributeSetUtilities;
import javax.print.attribute.DocAttributeSet;
import javax.print.attribute.HashAttributeSet;
import javax.print.attribute.HashPrintServiceAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.PrintServiceAttribute;
import javax.print.attribute.PrintServiceAttributeSet;
import javax.print.attribute.standard.Destination;
import javax.print.attribute.standard.DocumentName;
import javax.print.attribute.standard.JobName;
import javax.print.attribute.standard.Media;
import javax.print.attribute.standard.RequestingUserName;
import org.apache.harmony.x.print.PrintClient;
import org.apache.harmony.x.print.ipp.IppAttribute;
import org.apache.harmony.x.print.ipp.IppAttributeGroup;
import org.apache.harmony.x.print.ipp.IppAttributeGroupSet;
import org.apache.harmony.x.print.ipp.IppDocument;
import org.apache.harmony.x.print.ipp.IppPrinter;
import org.apache.harmony.x.print.ipp.IppResponse;
import org.apache.harmony.x.print.ipp.util.Ipp2Java;
/*
* CUPSClient is a print client based on CUPS protocol.
* (see Common UNIX Printing System, http://www.cups.org/)
*
* The CUPS itself extends IPP protocol
* (see Internet Printing Protocol, http://www.pwg.org/ipp/index.html)
*
* So, this class supports as CUPS as IPP print servers
*
* The class uses special IPP package org.apache.harmony.x.print.ipp for
* ipp/cups specific operations.
*
* CUPSClient implements PrintClient interface, therefore
* see PrintClient.java for more information.
*
*
*/
/**
* @author skanion
*
*/
class CUPSClient implements PrintClient {
// for debug
/**
*
*/
private static int verbose = 0;
/**
*
*/
private IppPrinter printer;
/**
*
*/
private URI printeruri;
/**
*
*/
private PrintServiceAttributeSet attributeset;
/**
*
*/
private DocFlavor[] supportedFlavors = null;
/**
* @param name d
* @throws PrintException d
*/
CUPSClient(String name) throws PrintException {
try {
this .printeruri = new URI(name);
this .printer = new IppPrinter(printeruri);
this .attributeset = new HashPrintServiceAttributeSet();
} catch (Exception e) {
throw new PrintException(e);
}
}
/** (non-Javadoc)
* @see org.apache.harmony.x.print.PrintClient#getSupportedDocFlavors()
*/
/*
* SPECIAL - supportedFlavors is global for performance
* but it can be set local for dynamic
*
* @org.apache.harmony.x.print.PrintClient#getSupportedDocFlavors()
*/
public DocFlavor[] getSupportedDocFlavors() {
if (supportedFlavors == null) {
ArrayList df = new ArrayList();
try {
String[] mimetypes = new String[ALLDOCFLAVORS.length];
String[] validmimes;
for (int i = 0, ii = ALLDOCFLAVORS.length; i < ii; i++) {
mimetypes[i] = ALLDOCFLAVORS[i].getMimeType();
}
validmimes = printer
.requestGetSupportedMimeTypes(mimetypes);
for (int i = 0, ii = ALLDOCFLAVORS.length; i < ii; i++) {
if (validmimes[i] != null) {
if (validmimes[i].equals("application/ps")) {
/*
* SPECIAL processing application/ps
*/
df.add(ipp2java(ALLDOCFLAVORS[i]));
} else {
df.add(ALLDOCFLAVORS[i]);
}
}
}
} catch (Exception e) {
// IGNORE exception
e.printStackTrace();
}
supportedFlavors = (df.size() == 0 ? new DocFlavor[] { DocFlavor.INPUT_STREAM.AUTOSENSE }
: (DocFlavor[]) df.toArray(new DocFlavor[0]));
}
return supportedFlavors;
}
/**
* @see org.apache.harmony.x.print.PrintClient#getAttributes()
*/
public PrintServiceAttributeSet getAttributes() {
synchronized (this ) {
try {
IppResponse response;
IppAttributeGroup agroup;
IppAttribute attr;
Object[] attrx = new Object[0];
response = printer
.requestPrinterDescriptionAttributes();
agroup = response
.getGroup(IppAttributeGroup.TAG_GET_PRINTER_ATTRIBUTES);
if (agroup != null) {
attributeset.clear();
for (int i = 0, ii = agroup.size(); i < ii; i++) {
attr = (IppAttribute) agroup.get(i);
attrx = Ipp2Java.getJavaByIpp(attr);
for (int j = 0, jj = attrx.length; j < jj; j++) {
if (attrx[j] instanceof PrintServiceAttribute) {
attributeset.add((Attribute) attrx[j]);
}
}
}
}
} catch (Exception e) {
// IGNORE exception
e.printStackTrace();
}
}
return AttributeSetUtilities.unmodifiableView(attributeset);
}
/** (non-Javadoc)
* @see org.apache.harmony.x.print.PrintClient#getSupportedAttributeCategories()
*/
/*
* @return f
* @see org.apache.harmony.x.PrintClient#getSupportedAttributeCategories()
*/
public Class[] getSupportedAttributeCategories() {
ArrayList clazz = new ArrayList();
try {
IppResponse response = printer.requestPrinterAttributes();
IppAttributeGroup agroup = response
.getGroup(IppAttributeGroup.TAG_GET_PRINTER_ATTRIBUTES);
String aname;
Class claz;
IppAttribute attr;
if (agroup != null) {
for (int i = 0, ii = agroup.size(); i < ii; i++) {
attr = (IppAttribute) agroup.get(i);
aname = new String(attr.getName());
if (aname.indexOf("-supported") > 0) {
claz = Ipp2Java
.getClassByIppAttributeName(aname
.substring(0, aname
.indexOf("-supported")));
if (claz != null) {
clazz.add(claz);
}
}
}
}
// SPECIAL attributes processing
getSupportedAttributeCategoriesEx(clazz);
} catch (Exception e) {
// IGNORE exception
// e.printStackTrace();
}
return (clazz.size() == 0 ? new Class[0] : (Class[]) clazz
.toArray(new Class[0]));
}
/**
* @param clazz fd
*/
private void getSupportedAttributeCategoriesEx(ArrayList clazz) {
if (!clazz.contains(Destination.class)) {
clazz.add(Destination.class);
}
if (!clazz.contains(RequestingUserName.class)) {
clazz.add(RequestingUserName.class);
}
if (!clazz.contains(JobName.class)) {
clazz.add(JobName.class);
}
if (!clazz.contains(DocumentName.class)) {
clazz.add(DocumentName.class);
}
}
/** (non-Javadoc)
* @see org.apache.harmony.x.print.PrintClient#getDefaultAttributeValue(java.lang.Class)
*/
/*
* @see org.apache.harmony.x.print.PrintClient#getDefaultAttributeValue(java.lang.Class)
*/
public Object getDefaultAttributeValue(Class category) {
if (category == null) {
throw new NullPointerException("Argument is null");
}
if (!(Attribute.class.isAssignableFrom(category))) {
throw new IllegalArgumentException(
"Argument must implement interface Attribute");
}
Object defval[] = null;
// SPECIAL attributes processing
defval = getDefaultAttributeValueEx(category);
if (defval != null) {
if (defval.length == 0) {
return null;
}
return defval[0];
}
if (Media.class.isAssignableFrom(category)) {
category = Media.class;
}
try {
IppResponse response = printer.requestPrinterAttributes();
IppAttributeGroup agroup = response
.getGroup(IppAttributeGroup.TAG_GET_PRINTER_ATTRIBUTES);
IppAttribute attr;
String aname;
int andex;
if (agroup != null) {
aname = Ipp2Java.getIppAttributeNameByClass(category);
if (aname != null) {
if (aname.endsWith("-supported")) {
aname = aname.substring(0, aname
.indexOf("-supported"));
}
if (aname.endsWith("-default")) {
aname = aname.substring(0, aname
.indexOf("-default"));
}
andex = agroup.findAttribute(aname + "-default");
if (andex >= 0) {
attr = (IppAttribute) agroup.get(andex);
defval = Ipp2Java.getJavaByIpp(attr);
}
}
}
} catch (Exception e) {
// IGNORE exception
e.printStackTrace();
}
return (defval != null && defval.length > 0 ? defval[0] : null);
}
/**
* If attribute was processed - return Object[1]
* Else - return null
* @param category f
* @return f
*/
private Object[] getDefaultAttributeValueEx(Class category) {
if (Destination.class.isAssignableFrom(category)) {
return new Object[0];
} else if (RequestingUserName.class.isAssignableFrom(category)) {
return new Object[] { new RequestingUserName(
(String) AccessController
.doPrivileged(new PrivilegedAction() {
public Object run() {
return System
.getProperty("user.name");
}
}), Locale.US) };
} else if (JobName.class.isAssignableFrom(category)) {
return new Object[] { new JobName("Java print job",
Locale.US) };
} else if (DocumentName.class.isAssignableFrom(category)) {
return new Object[] { new DocumentName(
"Java print document", Locale.US) };
}
return null;
}
/**
* @see org.apache.harmony.x.print.PrintClient#isAttributeValueSupported(javax.print.attribute.Attribute,
* javax.print.DocFlavor, javax.print.attribute.AttributeSet)
*/
public boolean isAttributeValueSupported(Attribute attribute,
DocFlavor flavor, AttributeSet attributes) {
// verify parameters
if (attribute == null) {
throw new NullPointerException("Argument is null");
}
if (flavor != null && !isDocFlavorSupported(flavor)) {
throw new IllegalArgumentException("DocFlavor '" + flavor
+ "' is not supported by the print service");
}
// SPECIAL attributes processing
boolean[] supportedEx = isAttributeValueSupportedEx(attribute,
flavor);
if (supportedEx != null) {
return supportedEx[0];
}
boolean supported = false;
try {
IppDocument document;
IppResponse response;
IppAttributeGroup agroup;
IppAttributeGroupSet agroupset;
Attribute[] attrs;
String mime = null;
String aname;
aname = Ipp2Java.getIppAttributeNameByClass(attribute
.getClass(), -1);
if (aname == null) {
return false;
}
if (flavor == null) {
mime = "application/octet-stream";
} else {
mime = java2ipp(flavor).getMimeType();
}
if (attributes == null || attributes.isEmpty()) {
document = new IppDocument("Qwerty", mime, "");
agroupset = new IppAttributeGroupSet();
agroupset.setAttribute(aname, Ipp2Java
.getIppByJava(attribute));
response = printer.requestValidateJob(aname, document,
agroupset);
agroup = response
.getGroup(IppAttributeGroup.TAG_UNSUPPORTED_ATTRIBUTES);
if (agroup == null) {
supported = true;
} else if (agroup != null
&& agroup.findAttribute(aname) < 0) {
supported = true;
}
} else {
document = new IppDocument("Qwerty", mime, "");
agroupset = new IppAttributeGroupSet();
agroupset.setAttribute(aname, Ipp2Java
.getIppByJava(attribute));
attrs = attributes.toArray();
for (int i = 0, ii = attrs.length; i < ii; i++) {
agroupset.setAttribute(Ipp2Java
.getIppAttributeNameByClass(attrs[i]
.getClass(), -1), Ipp2Java
.getIppByJava(attrs[i]));
}
response = printer.requestValidateJob(aname, document,
agroupset);
agroup = response
.getGroup(IppAttributeGroup.TAG_UNSUPPORTED_ATTRIBUTES);
if (agroup == null) {
supported = true;
} else if (agroup != null
&& agroup.findAttribute(aname) < 0) {
supported = true;
}
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
return supported;
}
/**
* @param avalue f
* @param flavor f
* @return f
*/
/*
* If attribute was processed - return boolean[1]
* Else return null
*/
private boolean[] isAttributeValueSupportedEx(Attribute avalue,
DocFlavor flavor) {
if (Destination.class.isAssignableFrom(avalue.getCategory())) {
String ms = (flavor != null ? flavor.getMediaSubtype() : "");
Class cls = (flavor != null ? flavor.getClass() : null);
if (ms.equalsIgnoreCase("gif")
|| ms.equalsIgnoreCase("jpeg")
|| ms.equalsIgnoreCase("png")
|| ms.equalsIgnoreCase("postscript")
|| flavor == null
|| cls == DocFlavor.SERVICE_FORMATTED.class) {
if (!canPrintToFile()) {
return new boolean[] { false };
}
URI uri = ((Destination) avalue).getURI();
try {
File file = new File(uri);
if (file.isFile()) {
if (file.canWrite()) {
return new boolean[] { true };
}
return new boolean[] { false };
}
String path = file.getParent();
File parent = new File(path);
if (parent.isDirectory()) {
if (parent.canWrite()) {
return new boolean[] { true };
}
return new boolean[] { false };
}
} catch (Exception e) {
return new boolean[] { false };
}
}
}
return null;
}
/** (non-Javadoc)
* @see org.apache.harmony.x.print.PrintClient#getSupportedAttributeValues(java.lang.Class, javax.print.DocFlavor, javax.print.attribute.AttributeSet)
*/
/*
* @see org.apache.harmony.x.print.PrintClient#getSupportedAttributeValues(java.lang.Class,
* javax.print.DocFlavor, javax.print.attribute.AttributeSet)
*/
public Object getSupportedAttributeValues(Class category,
DocFlavor flavor, AttributeSet attributes) {
if (category == null) {
throw new NullPointerException("Argument is null");
}
if (!(Attribute.class.isAssignableFrom(category))) {
throw new IllegalArgumentException(
"Argument must implement interface Attribute");
}
if (flavor != null && !isDocFlavorSupported(flavor)) {
throw new IllegalArgumentException("DocFlavor '" + flavor
+ "' is not supported by the print service");
}
Object vals = null;
// SPECIAL attributes processing
vals = getSupportedAttributeValuesEx(category, flavor);
if (vals != null) {
if (((Object[]) vals).length == 0) {
return null;
}
return ((Object[]) vals)[0];
}
// General attributes
try {
String aname = Ipp2Java.getIppAttributeNameByClass(
category, 0)
+ "-supported";
doVerbose(2,
"CUPSClient.java: getSupportedAttributeValues(): ipp attribute: "
+ aname);
IppResponse response = printer.requestPrinterAttributes(
aname, (flavor == null ? null : java2ipp(flavor)
.getMimeType()));
doVerbose(2,
"CUPSClient.java: getSupportedAttributeValues(): response: "
+ response.toString());
IppAttributeGroup agroup = response
.getGroup(IppAttributeGroup.TAG_GET_PRINTER_ATTRIBUTES);
doVerbose(1,
"CUPSClient.java: getSupportedAttributeValues(): agroup: "
+ agroup.toString());
if (agroup != null) {
int aind = agroup.findAttribute(aname);
if (aind >= 0) {
IppAttribute attr = (IppAttribute) agroup.get(aind);
vals = Ipp2Java.getJavaByIpp(attr);
}
}
doVerbose(1,
"CUPSClient.java: getSupportedAttributeValues(): 1");
// Make right type/value for return
if (vals != null && vals.getClass().isArray()) {
Object[] ara = (Object[]) vals;
if (ara.length == 1 && ara[0].getClass() != category) {
vals = ara[0];
}
}
doVerbose(1,
"CUPSClient.java: getSupportedAttributeValues(): 2");
if (vals != null && vals.getClass().isArray()) {
int asize = ((Object[]) vals).length;
if (asize > 0) {
Class c = ((Object[]) vals)[0].getClass();
/* SPECIAL case for Media* attributes
*
* Special case for Media* attributes.
* vals[] contains all type of Media classes
* So, c must be Media type, not a[0] type
*/
if (Media.class.isAssignableFrom(c)) {
c = Media.class;
}
doVerbose(1,
"CUPSClient.java: getSupportedAttributeValues(): 3");
Object[] a = (Object[]) Array.newInstance(c, asize);
System.arraycopy(vals, 0, a, 0, a.length);
vals = a;
} else {
vals = null;
}
}
doVerbose(1,
"CUPSClient.java: getSupportedAttributeValues(): 4");
if (vals != null && vals.getClass().isArray()) {
for (int i = 0, ii = ((Attribute[]) vals).length; i < ii; i++) {
if (!isAttributeValueSupported(
((Attribute[]) vals)[i], flavor, attributes)) {
((Attribute[]) vals)[i] = null;
}
}
doVerbose(1,
"CUPSClient.java: getSupportedAttributeValues(): 5");
int newvalslength = 0;
for (int i = 0, ii = ((Attribute[]) vals).length; i < ii; i++) {
if (((Attribute[]) vals)[i] != null) {
newvalslength++;
}
}
doVerbose(1,
"CUPSClient.java: getSupportedAttributeValues(): 6");
if (newvalslength != ((Attribute[]) vals).length) {
Object[] newvals = new Object[newvalslength];
for (int j = 0, i = 0, ii = ((Attribute[]) vals).length; i < ii; i++) {
if (((Attribute[]) vals)[i] != null) {
newvals[j++] = ((Attribute[]) vals)[i];
}
}
vals = newvals;
}
} else if (vals != null) {
if (!isAttributeValueSupported((Attribute) vals,
flavor, attributes)) {
vals = null;
}
}
doVerbose(1,
"CUPSClient.java: getSupportedAttributeValues(): 7");
return vals;
} catch (Exception e) {
// IGNORE exception
e.printStackTrace();
}
doVerbose(1,
"CUPSClient.java: getSupportedAttributeValues(): 8");
return null;
}
/**
* @param category f
* @param flavor f
* @return f
*/
/*
* If category processed - return non-null value
*/
private Object[] getSupportedAttributeValuesEx(Class category,
DocFlavor flavor) {
if (Destination.class.isAssignableFrom(category)) {
String ms = flavor.getMediaSubtype();
if (ms.equalsIgnoreCase("gif")
|| ms.equalsIgnoreCase("jpeg")
|| ms.equalsIgnoreCase("png")
|| ms.equalsIgnoreCase("postscript")
|| flavor.getClass() == DocFlavor.SERVICE_FORMATTED.class) {
try {
return new Object[] { new Destination(new URI(
"file:///foo/bar")) };
} catch (URISyntaxException e) {
// return empty array - values are not supported
return new Object[0];
}
}
} else if (RequestingUserName.class.isAssignableFrom(category)) {
return new Object[] { new RequestingUserName("I.A.Muser",
Locale.US) };
} else if (JobName.class.isAssignableFrom(category)) {
return new Object[] { new JobName("Foo print job",
Locale.US) };
} else if (DocumentName.class.isAssignableFrom(category)) {
return new Object[] { new DocumentName("Foo document",
Locale.US) };
}
return null;
}
/** (non-Javadoc)
* @see org.apache.harmony.x.print.PrintClient#print(javax.print.Doc, javax.print.attribute.PrintRequestAttributeSet)
*/
/*
* @see org.apache.harmony.x.print.PrintClient#print(javax.print.Doc,
* javax.print.attribute.PrintRequestAttributeSet)
*/
public void print(Doc doc, PrintRequestAttributeSet attributes)
throws PrintException {
synchronized (this ) {
doVerbose(1, "Print " + doc.toString());
try {
DocFlavor df = doc.getDocFlavor();
if (!(df instanceof DocFlavor.INPUT_STREAM
|| df instanceof DocFlavor.BYTE_ARRAY
|| df instanceof DocFlavor.CHAR_ARRAY
|| df instanceof DocFlavor.STRING
|| df instanceof DocFlavor.READER || df instanceof DocFlavor.URL)) {
throw new PrintException("Doc flavor "
+ df.getRepresentationClassName()
+ " is not supported yet");
}
HashAttributeSet as = new HashAttributeSet();
DocAttributeSet das;
das = doc.getAttributes();
// construct attributes
if (das != null) {
as.addAll(das);
}
if (attributes != null) {
as.addAll(attributes);
}
as.addAll(attributeset);
// print
if (as.containsKey(Destination.class)) {
print2destination(doc, (Destination) as
.get(Destination.class));
} else {
printsimple(doc, as);
}
} catch (PrintException e) {
throw e;
} catch (Exception e) {
throw new PrintException(e);
}
}
}
/**
* @param doc d
* @param destination d
* @throws PrintException d
*/
/*
* printing to Destination
*/
private void print2destination(Doc doc, Destination destination)
throws PrintException {
try {
DataOutputStream bw = new DataOutputStream(
new BufferedOutputStream(new FileOutputStream(
new File(destination.getURI()))));
if (doc != null) {
if (doc.getDocFlavor() instanceof DocFlavor.INPUT_STREAM) {
InputStream stream = (InputStream) doc
.getPrintData();
byte[] buf = new byte[1024 * 8];
int count = 0;
while ((count = stream.read(buf, 0, buf.length)) != -1) {
bw.write(buf, 0, count);
}
stream.close();
} else if (doc.getDocFlavor() instanceof DocFlavor.URL) {
BufferedInputStream stream = new BufferedInputStream(
((URL) doc.getPrintData()).openStream());
byte[] buf = new byte[1024 * 8];
int count = 0;
while ((count = stream.read(buf, 0, buf.length)) != -1) {
if (count > 0) {
bw.write(buf, 0, count);
}
}
stream.close();
} else if (doc.getDocFlavor() instanceof DocFlavor.BYTE_ARRAY) {
InputStream stream = new ByteArrayInputStream(
(byte[]) doc.getPrintData());
byte[] buf = new byte[1024 * 8];
int count = 0;
while ((count = stream.read(buf, 0, buf.length)) != -1) {
bw.write(buf, 0, count);
}
stream.close();
} else if (doc.getDocFlavor() instanceof DocFlavor.SERVICE_FORMATTED) {
// TODO - print DocFlavor.SERVICE_FORMATTED
}
}
bw.flush();
bw.close();
} catch (Exception e) {
throw new PrintException(e);
}
}
/**
* @param doc d
* @param as d
* @throws PrintException d
*/
/*
* request IppPrinter printer to print document
*/
private void printsimple(Doc doc, HashAttributeSet as)
throws PrintException {
IppDocument document;
IppResponse response;
IppAttributeGroupSet agroupset;
Attribute[] attrs;
DocFlavor df = doc.getDocFlavor();
String docname = doc.toString();
try {
document = new IppDocument(docname, java2ipp(df)
.getMimeType(), doc.getPrintData());
agroupset = new IppAttributeGroupSet();
attrs = as.toArray();
for (int i = 0, ii = attrs.length; i < ii; i++) {
agroupset.setAttribute(Ipp2Java
.getIppAttributeNameByClass(
attrs[i].getClass(), -1), Ipp2Java
.getIppByJava(attrs[i]));
}
document.setAgroups(agroupset);
doVerbose(1, "Validating print job...");
response = printer.requestValidateJob(docname, document,
agroupset);
doVerbose(1, response.toString());
checkResponseIsZero(response, "IPP Validate Job: \n");
doVerbose(1, "Validate OK");
doVerbose(1, "Printing " + docname + "...");
response = printer.requestPrintJob(docname, document,
agroupset);
doVerbose(1, response.toString());
checkResponseIsZero(response, "IPP Print Job: \n");
doVerbose(1, "Printing OK");
} catch (PrintException e) {
throw e;
} catch (Exception e) {
if (getVerbose() > 1) {
e.printStackTrace();
}
throw new PrintException(e);
}
}
/**
* @param response d
* @param prefix d
* @throws PrintException d
*/
/*
* just check that IppResponse is OK
*/
private void checkResponseIsZero(IppResponse response, String prefix)
throws PrintException {
if (response.getStatusCode() != 0) {
String status = Integer.toHexString(response
.getStatusCode());
String id = Integer.toHexString(response.getRequestId());
throw new PrintException(prefix
+ "\n================ IPP response id: 0x" + id
+ " ====================="
+ "\nresponse status code: 0x" + status + "\n"
+ response.toString()
+ "\n================ end IPP response 0x" + id
+ " =====================");
}
}
/**
* @param pDocFlavor d
* @return d
*/
/*
* convert DocFlavor to DocFlavor ;-)
*
* some printers support application/ps instead of application/postscript
* So:
* if mimetype==application/postscript
* && printer does not support mimetype application/postscript
* && printer supports mimetype application/ps
* then
* we change mimetype of docflavor to application/ps
*/
private DocFlavor java2ipp(DocFlavor pDocFlavor) {
DocFlavor ippDocFlavor = pDocFlavor;
String mime = pDocFlavor.getMimeType();
/*
* SPECIAL processing application/ps
*/
if (mime.equals("application/postscript")) {
try {
IppDocument document = new IppDocument("Qwerty",
"application/postscript", "");
IppResponse response = printer.requestValidateJob(
"Qwerty", document, null);
if (response.getStatusCode() != 0) {
document = new IppDocument("Qwerty",
"application/ps", "");
response = printer.requestValidateJob("Qwerty",
document, null);
if (response.getStatusCode() == 0) {
if (pDocFlavor instanceof DocFlavor.INPUT_STREAM) {
ippDocFlavor = new DocFlavor.INPUT_STREAM(
"application/ps");
} else if (ippDocFlavor instanceof DocFlavor.BYTE_ARRAY) {
ippDocFlavor = new DocFlavor.BYTE_ARRAY(
"application/ps");
} else if (ippDocFlavor instanceof DocFlavor.URL) {
ippDocFlavor = new DocFlavor.URL(
"application/ps");
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
return ippDocFlavor;
}
/**
* @param ippDocFlavor d
* @return d
*/
/*
* opposite to java2ipp() method
*/
private DocFlavor ipp2java(DocFlavor ippDocFlavor) {
DocFlavor pDocFlavor = ippDocFlavor;
String mime = ippDocFlavor.getMimeType();
/*
* SPECIAL processing application/ps
*/
if (mime.equals("application/ps")) {
if (ippDocFlavor instanceof DocFlavor.INPUT_STREAM) {
pDocFlavor = DocFlavor.INPUT_STREAM.POSTSCRIPT;
} else if (ippDocFlavor instanceof DocFlavor.BYTE_ARRAY) {
pDocFlavor = DocFlavor.BYTE_ARRAY.POSTSCRIPT;
} else if (ippDocFlavor instanceof DocFlavor.URL) {
pDocFlavor = DocFlavor.URL.POSTSCRIPT;
}
}
return pDocFlavor;
}
/**
* @param flavor d
* @return d
*/
/*
* the method's name is saying all
*/
private boolean isDocFlavorSupported(DocFlavor flavor) {
if (flavor == null) {
throw new NullPointerException("DocFlavor flavor is null");
}
DocFlavor clientFlavors[] = getSupportedDocFlavors();
for (int i = 0; i < clientFlavors.length; i++) {
if (clientFlavors[i].equals(flavor)) {
return true;
}
}
return false;
}
/**
* @return d
*/
/*
* check permission to read/write to any file
*/
private boolean canPrintToFile() {
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
try {
sm.checkPermission(new FilePermission("<<ALL FILES>>",
"read,write"));
return true;
} catch (SecurityException e) {
return false;
}
}
return true;
}
/**
*
*/
/*
* just list of all doc flavors from specification
* it is used in getSupportedDocFlavors() method
*/
private static DocFlavor[] ALLDOCFLAVORS = {
DocFlavor.BYTE_ARRAY.TEXT_PLAIN_HOST,
DocFlavor.BYTE_ARRAY.TEXT_PLAIN_UTF_8,
DocFlavor.BYTE_ARRAY.TEXT_PLAIN_UTF_16,
DocFlavor.BYTE_ARRAY.TEXT_PLAIN_UTF_16BE,
DocFlavor.BYTE_ARRAY.TEXT_PLAIN_UTF_16LE,
DocFlavor.BYTE_ARRAY.TEXT_PLAIN_US_ASCII,
DocFlavor.BYTE_ARRAY.TEXT_HTML_HOST,
DocFlavor.BYTE_ARRAY.TEXT_HTML_UTF_8,
DocFlavor.BYTE_ARRAY.TEXT_HTML_UTF_16,
DocFlavor.BYTE_ARRAY.TEXT_HTML_UTF_16BE,
DocFlavor.BYTE_ARRAY.TEXT_HTML_UTF_16LE,
DocFlavor.BYTE_ARRAY.TEXT_HTML_US_ASCII,
DocFlavor.BYTE_ARRAY.PDF, DocFlavor.BYTE_ARRAY.POSTSCRIPT,
DocFlavor.BYTE_ARRAY.PCL, DocFlavor.BYTE_ARRAY.GIF,
DocFlavor.BYTE_ARRAY.JPEG, DocFlavor.BYTE_ARRAY.PNG,
DocFlavor.BYTE_ARRAY.AUTOSENSE,
DocFlavor.INPUT_STREAM.TEXT_PLAIN_HOST,
DocFlavor.INPUT_STREAM.TEXT_PLAIN_UTF_8,
DocFlavor.INPUT_STREAM.TEXT_PLAIN_UTF_16,
DocFlavor.INPUT_STREAM.TEXT_PLAIN_UTF_16BE,
DocFlavor.INPUT_STREAM.TEXT_PLAIN_UTF_16LE,
DocFlavor.INPUT_STREAM.TEXT_PLAIN_US_ASCII,
DocFlavor.INPUT_STREAM.TEXT_HTML_HOST,
DocFlavor.INPUT_STREAM.TEXT_HTML_UTF_8,
DocFlavor.INPUT_STREAM.TEXT_HTML_UTF_16,
DocFlavor.INPUT_STREAM.TEXT_HTML_UTF_16BE,
DocFlavor.INPUT_STREAM.TEXT_HTML_UTF_16LE,
DocFlavor.INPUT_STREAM.TEXT_HTML_US_ASCII,
DocFlavor.INPUT_STREAM.PDF,
DocFlavor.INPUT_STREAM.POSTSCRIPT,
DocFlavor.INPUT_STREAM.PCL, DocFlavor.INPUT_STREAM.GIF,
DocFlavor.INPUT_STREAM.JPEG, DocFlavor.INPUT_STREAM.PNG,
DocFlavor.INPUT_STREAM.AUTOSENSE,
DocFlavor.URL.TEXT_PLAIN_HOST,
DocFlavor.URL.TEXT_PLAIN_UTF_8,
DocFlavor.URL.TEXT_PLAIN_UTF_16,
DocFlavor.URL.TEXT_PLAIN_UTF_16BE,
DocFlavor.URL.TEXT_PLAIN_UTF_16LE,
DocFlavor.URL.TEXT_PLAIN_US_ASCII,
DocFlavor.URL.TEXT_HTML_HOST,
DocFlavor.URL.TEXT_HTML_UTF_8,
DocFlavor.URL.TEXT_HTML_UTF_16,
DocFlavor.URL.TEXT_HTML_UTF_16BE,
DocFlavor.URL.TEXT_HTML_UTF_16LE,
DocFlavor.URL.TEXT_HTML_US_ASCII, DocFlavor.URL.PDF,
DocFlavor.URL.POSTSCRIPT, DocFlavor.URL.PCL,
DocFlavor.URL.GIF, DocFlavor.URL.JPEG, DocFlavor.URL.PNG,
DocFlavor.URL.AUTOSENSE,
DocFlavor.CHAR_ARRAY.TEXT_PLAIN,
DocFlavor.CHAR_ARRAY.TEXT_HTML,
DocFlavor.STRING.TEXT_PLAIN, DocFlavor.STRING.TEXT_HTML,
DocFlavor.READER.TEXT_PLAIN, DocFlavor.READER.TEXT_HTML,
DocFlavor.SERVICE_FORMATTED.RENDERABLE_IMAGE,
DocFlavor.SERVICE_FORMATTED.PRINTABLE,
DocFlavor.SERVICE_FORMATTED.PAGEABLE,
/*
* Some printers accept "application/ps" instead of "application/postscript"
* So, we have special processing for those DocFlavor
* See comments with phrase:
* SPECIAL processing application/ps
*/
new DocFlavor.INPUT_STREAM("application/ps"),
new DocFlavor.URL("application/ps"),
new DocFlavor.BYTE_ARRAY("application/ps") };
/**
* @return d
*/
public static int getVerbose() {
return verbose;
}
/**
* @param newverbose d
*/
public static void setVerbose(int newverbose) {
verbose = newverbose;
IppPrinter.setVerbose(verbose);
}
/**
* @param v d
*/
public static void doVerbose(String v) {
System.out.println(v);
}
/**
* @param level d
* @param v d
*/
public static void doVerbose(int level, String v) {
if (verbose >= level) {
System.out.println(v);
}
}
}
分享到:
相关推荐
CupsClient for Windows 连接到 Cups 服务器,检索所有打印机(包括名称、型号、位置、评论、颜色、媒体、ppm)。 您可以根据所有信息过滤结果并安装您选择的打印机(带有 postscript 驱动程序)。
请在pom.xml文件中添加以下依赖项:< dependency> < groupId>org.cups4j</ groupId> < artifactId>cups4j</ artifactId> < version>0.7.6</ version></ dependency>用法基本用法CupsClient cupsClient = new ...
离线安装包,亲测可用
Unity + Shader Graph 2D + UV滚动动画效果 + 纹理贴图
MATLAB详解增程式电动汽车EREV建模过程:从亏电到满电的闭环控制策略与仿真结果分析,MATLAB增程式电动汽车EREV MATLAB建模过程详细讲解和MATLAB模型 亏电到满电的控制逻辑 以及整车模型的闭环控制 特别是针对各个模式下离合器,发动机,电机和电池充放电的控制,在pdf给出了详细的说明 仿真结果清晰明确,纯手工搭建没有任何水分 图示给出了十个nedc工况下的仿真结果 如果你看懂了,可以直接拿来加自己的策略发小lunwen应该是简简单单 ,MATLAB; EREV; 建模过程; 模型; 亏电到满电控制逻辑; 整车模型闭环控制; 离合器控制; 发动机控制; 电机控制; 电池充放电控制; NEDC工况仿真结果。,MATLAB模型:增程式电动汽车EREV的仿真与控制策略解析
免费可商用字体,包含思源字体,站酷字体
Matlab领域上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
REVERSIBLE COLUMN NETWORKS,含有完整的代码和论文
1、文件内容:qt5-qtquickcontrols-examples-5.9.7-1.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/qt5-qtquickcontrols-examples-5.9.7-1.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
1、文件内容:qpdf-devel-5.0.1-4.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/qpdf-devel-5.0.1-4.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
资源说明: 1:csdn平台资源详情页的文档预览若发现'异常',属平台多文档切片混合解析和叠加展示风格,请放心使用。 2:32页图文详解文档(从零开始项目全套环境工具安装搭建调试运行部署,保姆级图文详解),旨在为更多的人甚至零基础的人也能运行、使用和学习。 3:配套毕业论文,万字长文,word文档,支持二次编辑。 4:配套答辩ppt,pptx格式,支持二次编辑。 5:工具环境、ppt参考模板、相关电子教程、视频教学资源分享。 6:资源项目源码均已通过严格测试验证,保证能够正常运行,本项目仅用作交流学习参考,请切勿用于商业用途。 7:项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通。 内容概要: 本系统基于B/S网络结构,在IDEA中开发。服务端用Java并借ssm框架(Spring+SpringMVC+MyBatis)搭建后台。用MySQL存储数据,可靠性强。 能学到什么: 使用ssm搭建后台。VUE框架构建前端交互界面、前后端数据交互、MySQL管理数据、从零开始环境搭建、调试、运行、打包、部署流程。
资源说明: 1:csdn平台资源详情页的文档预览若发现'异常',属平台多文档切片混合解析和叠加展示风格,请放心使用。 2:32页图文详解文档(从零开始项目全套环境工具安装搭建调试运行部署,保姆级图文详解),旨在为更多的人甚至零基础的人也能运行、使用和学习。 3:配套毕业论文,万字长文,word文档,支持二次编辑。 4:配套答辩ppt,pptx格式,支持二次编辑。 5:工具环境、ppt参考模板、相关电子教程、视频教学资源分享。 6:资源项目源码均已通过严格测试验证,保证能够正常运行,本项目仅用作交流学习参考,请切勿用于商业用途。 7:项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通。 内容概要: 本系统基于B/S网络结构,在IDEA中开发。服务端用Java并借ssm框架(Spring+SpringMVC+MyBatis)搭建后台。用MySQL存储数据,可靠性强。 能学到什么: 使用ssm搭建后台。学习使用jsp、html构建交互界面、前后端数据交互、MySQL管理数据、从零开始环境搭建、调试、运行、打包、部署流程。
资源说明: 1:csdn平台资源详情页的文档预览若发现'异常',属平台多文档切片混合解析和叠加展示风格,请放心使用。 2:32页图文详解文档(从零开始项目全套环境工具安装搭建调试运行部署,保姆级图文详解),旨在为更多的人甚至零基础的人也能运行、使用和学习。 3:配套毕业论文,万字长文,word文档,支持二次编辑。 4:范例参考答辩ppt,pptx格式,支持二次编辑。 5:工具环境、ppt参考模板、相关电子教程、视频教学资源分享。 6:资源项目源码均已通过严格测试验证,保证能够正常运行,本项目仅用作交流学习参考,请切勿用于商业用途。 7:项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通。 内容概要: 本系统基于B/S网络结构,在IDEA中开发。服务端用Java并借ssm框架(Spring+SpringMVC+MyBatis)搭建后台。用MySQL存储数据,可靠性强。 能学到什么: 使用ssm搭建后台。VUE框架构建前端交互界面、前后端数据交互、MySQL管理数据、从零开始环境搭建、调试、运行、打包、部署流程。
一、智慧档案馆的建设背景与必要性 在信息化时代背景下,档案信息化已成为提升档案管理效率、保障档案安全、促进档案资源开发利用的重要途径。随着《档案法》的修订实施,电子档案与传统档案具有了同等法律效力,这为智慧档案馆的建设提供了法律支撑。智慧档案馆通过运用现代信息技术,实现档案的数字化管理、智能化服务,不仅能够有效解决传统档案管理中存在的诸多难题,如档案查找困难、存储空间有限、档案安全难以保障等,还能够进一步提升档案管理的便捷性、高效性和安全性。同时,智慧档案馆的建设也是响应国家信息化发展战略、推动智慧城市建设的重要举措。 二、智慧档案馆的建设方案与特色亮点 智慧档案馆的建设方案涵盖了档案数字化、管理系统建设、信息安全保障等多个方面。其中,档案数字化是基础,通过扫描、录入等方式将传统纸质档案转化为数字档案,便于存储、检索和利用。管理系统建设则是核心,通过构建功能全面、性能强大、系统安全的电子档案系统,实现档案的自动化管理、智能化检索和多样化利用。此外,智慧档案馆还注重信息安全保障,通过采用数据加密、身份认证等技术手段,确保档案数据的安全性和完整性。在特色亮点方面,智慧档案馆不仅提供了全流程的法律保障支持,如电子数据验证服务、公证服务等,还通过运用人工智能、大数据等先进技术,实现了档案的智能分类、智能检索和智能推荐等功能,大大提升了档案管理的智能化水平。 三、智慧档案馆的运维保障与未来展望 智慧档案馆的运维保障是确保其长期稳定运行的关键。在运维保障方面,需要建立健全的管理制度、专业的运维团队和完善的应急预案等,以确保档案数据的安全性和系统的稳定性。同时,还需要定期对系统进行升级和维护,以适应不断变化的业务需求和技术发展。在未来展望方面,随着信息技术的不断进步和应用场景的不断拓展,智慧档案馆将朝着更加智能化、个性化、便捷化的方向发展。例如,通过运用虚拟现实、增强现实等技术手段,实现档案的沉浸式体验;通过构建档案知识图谱,实现档案的智能化分析和挖掘等。这些都将为智慧档案馆的发展注入新的活力和动力,推动档案管理事业迈向更高的水平。
资源说明: 1:csdn平台资源详情页的文档预览若发现'异常',属平台多文档切片混合解析和叠加展示风格,请放心使用。 2:32页图文详解文档(从零开始项目全套环境工具安装搭建调试运行部署,保姆级图文详解),旨在为更多的人甚至零基础的人也能运行、使用和学习。 3:范例参考毕业论文,万字长文,word文档,支持二次编辑。 4:范例参考答辩ppt,pptx格式,支持二次编辑。 5:工具环境、ppt参考模板、相关电子教程、视频教学资源分享。 6:资源项目源码均已通过严格测试验证,保证能够正常运行,本项目仅用作交流学习参考,请切勿用于商业用途。 7:项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通。 内容概要: 本系统基于B/S网络结构,在IDEA中开发。服务端用Java并借ssm框架(Spring+SpringMVC+MyBatis)搭建后台。用MySQL存储数据,可靠性强。 能学到什么: 使用ssm搭建后台。VUE框架构建前端交互界面、前后端数据交互、MySQL管理数据、从零开始环境搭建、调试、运行、打包、部署流程。
资源说明: 1:csdn平台资源详情页的文档预览若发现'异常',属平台多文档切片混合解析和叠加展示风格,请放心使用。 2:32页图文详解文档(从零开始项目全套环境工具安装搭建调试运行部署,保姆级图文详解),旨在为更多的人甚至零基础的人也能运行、使用和学习。 3:配套毕业论文,万字长文,word文档,支持二次编辑。 4:范例参考答辩ppt,pptx格式,支持二次编辑。 5:工具环境、ppt参考模板、相关电子教程、视频教学资源分享。 6:资源项目源码均已通过严格测试验证,保证能够正常运行,本项目仅用作交流学习参考,请切勿用于商业用途。 7:项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通。 内容概要: 本系统基于B/S网络结构,在IDEA中开发。服务端用Java并借ssm框架(Spring+SpringMVC+MyBatis)搭建后台。用MySQL存储数据,可靠性强。 能学到什么: 使用ssm搭建后台。学习使用jsp、html构建交互界面、前后端数据交互、MySQL管理数据、从零开始环境搭建、调试、运行、打包、部署流程。
资源说明: 1:csdn平台资源详情页的文档预览若发现'异常',属平台多文档切片混合解析和叠加展示风格,请放心使用。 2:32页图文详解文档(从零开始项目全套环境工具安装搭建调试运行部署,保姆级图文详解),旨在为更多的人甚至零基础的人也能运行、使用和学习。 3:配套毕业论文,万字长文,word文档,支持二次编辑。 4:范例参考答辩ppt,pptx格式,支持二次编辑。 5:工具环境、ppt参考模板、相关电子教程、视频教学资源分享。 6:资源项目源码均已通过严格测试验证,保证能够正常运行,本项目仅用作交流学习参考,请切勿用于商业用途。 7:项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通。 内容概要: 本系统基于B/S网络结构,在IDEA中开发。服务端用Java并借ssm框架(Spring+SpringMVC+MyBatis)搭建后台。用MySQL存储数据,可靠性强。 能学到什么: 使用ssm搭建后台。学习使用jsp、html构建交互界面、前后端数据交互、MySQL管理数据、从零开始环境搭建、调试、运行、打包、部署流程。
番茄叶子缺陷图像分类数据集【已标注,约3,000张数据】 数据经过预处理,可以直接作为分类网络输入使用 分类个数【7】:细菌斑点、早疫病、健康、Septoria_spot等【具体查看json文件】 划分了训练集、测试集。存放各自的同一类数据图片。如果想可视化数据集,可以运行资源中的show脚本。 图像分类、分割网络改进:https://blog.csdn.net/qq_44886601/category_12858320.html 计算机视觉完整项目:https://blog.csdn.net/qq_44886601/category_12816068.html
资源说明: 1:csdn平台资源详情页的文档预览若发现'异常',属平台多文档切片混合解析和叠加展示风格,请放心使用。 2:32页图文详解文档(从零开始项目全套环境工具安装搭建调试运行部署,保姆级图文详解),旨在为更多的人甚至零基础的人也能运行、使用和学习。 3:配套毕业论文,万字长文,word文档,支持二次编辑。 4:范例参考答辩ppt,pptx格式,支持二次编辑。 5:工具环境、ppt参考模板、相关电子教程、视频教学资源分享。 6:资源项目源码均已通过严格测试验证,保证能够正常运行,本项目仅用作交流学习参考,请切勿用于商业用途。 7:项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通。 内容概要: 本系统基于B/S网络结构,在IDEA中开发。服务端用Java并借ssm框架(Spring+SpringMVC+MyBatis)搭建后台。用MySQL存储数据,可靠性强。 能学到什么: 使用ssm搭建后台。学习使用jsp、html构建交互界面、前后端数据交互、MySQL管理数据、从零开始环境搭建、调试、运行、打包、部署流程。
西门子S7-200 Smart编程软件编写的双级反渗透混床程序及加药系统,一键制水与清洗,无人值守模式,附带画面与电气原理图,供初学者学习研究,程序详细注释。,120吨双级反渗透程序+混床程序,以及阻垢剂、杀菌剂 加药。 一键制水,一键反洗,一键正洗,无人值守。 西门子S7-200 smart编程软件写的程序,程序+画面+电气原理图。 打包送出去,供初学者学习和研究。 程序有注释。 ,关键词:双级反渗透程序; 混床程序; 阻垢剂; 杀菌剂加药; 一键制水; 一键反洗; 一键正洗; 无人值守; 西门子S7-200 smart编程软件; 程序画面; 电气原理图; 初学者学习研究; 程序注释。,"双级反渗透与混床程序包:智能加药系统与注释丰富的西门子S7-200 Smart程序解析"