package org.cups;
/**
* @version 1.00 06-NOV-2003
* @author Easy Software Products
*
* Internet Printing Protocol definitions for the Common UNIX Printing
* System (CUPS).
*
* Copyright 1997-2003 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*/
/**
* A CupsPrinter
holds printer attribute / status information,
* and has methods to process CUPS server responses.
*
* @author TDB
* @version 1.0
* @since JDK1.3
*/
import java.io.*;
import java.net.*;
import java.util.*;
public class CupsPrinter
{
//
// Printer attributes / status members.
//
String printer_name;
String printer_location;
String printer_info;
String printer_more_info;
String[] printer_uri_supported; // Strings
String[] uri_authentication_supported; // Strings
String[] uri_security_supported; // Strings
String attributes_charset;
String attributes_natural_language;
int printer_state;
String printer_state_text;
String printer_state_reasons;
boolean printer_is_accepting_jobs;
long printer_up_time;
long printer_current_time;
int queued_job_count;
String[] pdl_override_supported;
String[] ipp_versions_supported;
int[] operations_supported; // Integers
boolean multiple_document_jobs_supported;
int multiple_operation_time_out;
int[] multiple_document_handling_supported; // Integers
String charset_configured;
String natural_language_configured;
String generated_natural_language_supported;
String[] charset_supported; // Strings
String document_format_default;
String[] document_format_supported; // Strings
String[] compression_supported; // Strings
int job_priority_default;
int job_priority_supported;
int copies_default;
int lower_copies_supported;
int upper_copies_supported;
boolean page_ranges_supported;
int number_up_default;
int[] number_up_supported; // integers
int orientation_requested_default;
int[] orientation_requested_supported; // Integers
int job_quota_period;
int job_k_limit;
int job_page_limit;
String job_sheets_default; // Should this be a list too?
String[] job_sheets_supported; // Strings
String device_uri;
boolean color_supported;
int pages_per_minute;
String printer_make_and_model;
String media_default;
String[] media_supported; // Strings
int finishings_default;
int[] finishings_supported; // Integers
int printer_type;
/**
* Constructor. Does not get status or attributes.
*
* @param c
Cups object.
*
* @see Cups
*/
public CupsPrinter(Cups c)
{
setDefaults();
}
/**
* Constructor with name. Get status and attributes.
*
* @param c
Cups object.
* @param name
Name of printer.
*
* @see Cups
*/
public CupsPrinter(Cups c, String name)
{
setDefaults();
printer_name = name;
//
//
getStatus(c);
getAttributes(c);
}
/**
* Initialize the members with mostly sane values.
*
*/
public void setDefaults()
{
printer_name = "";
printer_location = "";
printer_info = "";
printer_more_info = "";
printer_uri_supported = null;
uri_authentication_supported = null;
uri_security_supported = null;
attributes_charset = "us-ascii";
attributes_natural_language = "en";
printer_state = -1;
printer_state_text = "";
printer_state_reasons = "";
printer_is_accepting_jobs = false;
printer_up_time = 0;
printer_current_time = 0;
queued_job_count = 0;
pdl_override_supported = null;
ipp_versions_supported = null;
operations_supported = null;
multiple_document_jobs_supported = false;
multiple_operation_time_out = 0;
multiple_document_handling_supported = null;
charset_configured = "";
natural_language_configured = "";
generated_natural_language_supported = "";
charset_supported = null;
document_format_default = "";
document_format_supported = null;
compression_supported = null;
job_priority_default = -1;
job_priority_supported = -1;
copies_default = 1;
lower_copies_supported = 1;
upper_copies_supported = 1;
page_ranges_supported = false;
number_up_default = 0;
number_up_supported = null;
orientation_requested_default = 0;
orientation_requested_supported = null;
job_quota_period = 0;
job_k_limit = 0;
job_page_limit = 0;
job_sheets_default = "none,none";
job_sheets_supported = null;
device_uri = "";
color_supported = false;
pages_per_minute = 0;
printer_make_and_model = "";
media_default = "";
media_supported = null;
finishings_default = 0;
finishings_supported = null;
printer_type = 0;
}
/**
* Get the printer's status.
*
* @param c
Cups object.
*
* @return Boolean
True on success.
*
* @see Cups
*/
public boolean getStatus(Cups c)
{
List attrs;
IPPAttribute a;
String p_uri;
try
{
attrs = c.cupsGetPrinterStatus(printer_name);
for (int i=0; i < attrs.size(); i++)
{
a = (IPPAttribute)attrs.get(i);
updateAttribute(a);
}
return(true);
}
catch (IOException e)
{
return(false);
}
}
/**
* Get the printer's attributes.
*
* @param c
Cups object.
*
* @return Boolean
True on success.
*
* @see Cups
*/
public boolean getAttributes(Cups c)
{
List attrs;
IPPAttribute a;
String p_uri;
try
{
attrs = c.cupsGetPrinterAttributes(printer_name);
for (int i=0; i < attrs.size(); i++)
{
a = (IPPAttribute)attrs.get(i);
updateAttribute(a);
}
return(true);
}
catch (IOException e)
{
return(false);
}
}
/**
* Process an attribute from the cups.doRequest() method and move
* the values into local members.
*
* @param a
IPPAttribute.
*
* @see IPPAttributes
* @see IPPValues
*/
public void updateAttribute( IPPAttribute a )
{
IPPValue v;
int i;
// a.dump_values();
if (a.name.compareTo("printer-name") == 0)
{
v = (IPPValue)a.values.get(0);
printer_name = v.text;
}
else if (a.name.compareTo("printer-location") == 0)
{
v = (IPPValue)a.values.get(0);
printer_location = v.text;
}
else if (a.name.compareTo("printer-info") == 0)
{
v = (IPPValue)a.values.get(0);
printer_info = v.text;
}
else if (a.name.compareTo("printer-more-info") == 0)
{
v = (IPPValue)a.values.get(0);
printer_more_info = v.text;
}
else if (a.name.compareTo("printer-uri-supported") == 0)
{
printer_uri_supported = new String[a.values.size()];
for (i=0; i < a.values.size(); i++)
{
v = (IPPValue)a.values.get(i);
printer_uri_supported[i] = v.text;
}
}
else if (a.name.compareTo("uri-authentication-supported") == 0)
{
uri_authentication_supported = new String[a.values.size()];
for (i=0; i < a.values.size(); i++)
{
v = (IPPValue)a.values.get(i);
uri_authentication_supported[i] = v.text;
}
}
else if (a.name.compareTo("uri-security-supported") == 0)
{
uri_security_supported = new String[a.values.size()];
for (i=0; i < a.values.size(); i++)
{
v = (IPPValue)a.values.get(i);
uri_security_supported[i] = v.text;
}
}
else if (a.name.compareTo("attributes-charset") == 0)
{
v = (IPPValue)a.values.get(0);
attributes_charset = v.text;
}
else if (a.name.compareTo("attributes-natural-language") == 0)
{
v = (IPPValue)a.values.get(0);
attributes_natural_language = v.text;
}
else if (a.name.compareTo("printer-state") == 0)
{
v = (IPPValue)a.values.get(0);
printer_state = v.integer_value;
switch( printer_state )
{
case 3: printer_state_text = "idle";
break;
case 4: printer_state_text = "processing";
break;
case 5: printer_state_text = "stopped";
break;
}
}
else if (a.name.compareTo("printer-state-reasons") == 0)
{
v = (IPPValue)a.values.get(0);
printer_state_reasons = v.text;
}
else if (a.name.compareTo("printer-is-accepting-jobs") == 0)
{
v = (IPPValue)a.values.get(0);
printer_is_accepting_jobs = v.boolean_value;
}
else if (a.name.compareTo("printer-up-time") == 0)
{
v = (IPPValue)a.values.get(0);
printer_up_time = v.integer_value;
}
else if (a.name.compareTo("printer-current-time") == 0)
{
v = (IPPValue)a.values.get(0);
printer_current_time = v.unix_time; // *** FIX ***
}
else if (a.name.compareTo("queue-job-count") == 0)
{
v = (IPPValue)a.values.get(0);
queued_job_count = v.integer_value;
}
else if (a.name.compareTo("pdl-override-supported") == 0)
{
pdl_override_supported = new String[a.values.size()];
for (i=0; i < a.values.size(); i++)
{
v = (IPPValue)a.values.get(i);
pdl_override_supported[i] = v.text;
}
}
else if (a.name.compareTo("ipp-versions-supported") == 0)
{
ipp_versions_supported = new String[a.values.size()];
for (i=0; i < a.values.size(); i++)
{
v = (IPPValue)a.values.get(i);
ipp_versions_supported[i] = v.text;
}
}
else if (a.name.compareTo("operations-supported") == 0)
{
operations_supported = new int[a.values.size()];
for (i=0; i < a.values.size(); i++)
{
v = (IPPValue)a.values.get(i);
operations_supported[i] = v.integer_value;
}
}
else if (a.name.compareTo("multiple-document-jobs-supported") == 0)
{
v = (IPPValue)a.values.get(0);
multiple_document_jobs_supported = v.boolean_value;
}
else if (a.name.compareTo("multiple-operation-time-out") == 0)
{
v = (IPPValue)a.values.get(0);
multiple_operation_time_out = v.integer_value;
}
else if (a.name.compareTo("multiple-document-handling-supported") == 0)
{
multiple_document_handling_supported = new int[a.values.size()];
for (i=0; i < a.values.size(); i++)
{
v = (IPPValue)a.values.get(i);
multiple_document_handling_supported[i] = v.integer_value;
}
}
else if (a.name.compareTo("charset-configured") == 0)
{
v = (IPPValue)a.values.get(0);
charset_configured = v.text;
}
else if (a.name.compareTo("natural-language-configured") == 0)
{
v = (IPPValue)a.values.get(0);
natural_language_configured = v.text;
}
else if (a.name.compareTo("generated-natural-language-supported") == 0)
{
// *** Should this be a list too?
v = (IPPValue)a.values.get(0);
generated_natural_language_supported = v.text;
}
else if (a.name.compareTo("charset-supported") == 0)
{
charset_supported = new String[a.values.size()];
for (i=0; i < a.values.size(); i++)
{
v = (IPPValue)a.values.get(i);
charset_supported[i] = v.text;
}
}
else if (a.name.compareTo("document-format-default") == 0)
{
v = (IPPValue)a.values.get(0);
document_format_default = v.text;
}
else if (a.name.compareTo("document-format-supported") == 0)
{
document_format_supported = new String[a.values.size()];
for (i=0; i < a.values.size(); i++)
{
v = (IPPValue)a.values.get(i);
document_format_supported[i] = v.text;
}
}
else if (a.name.compareTo("compression-supported") == 0)
{
compression_supported = new String[a.values.size()];
for (i=0; i < a.values.size(); i++)
{
v = (IPPValue)a.values.get(i);
compression_supported[i] = v.text;
}
}
else if (a.name.compareTo("job-priority-default") == 0)
{
v = (IPPValue)a.values.get(0);
job_priority_default = v.integer_value;
}
else if (a.name.compareTo("job-priority-supported") == 0)
{
// *** Should be a list? ***
v = (IPPValue)a.values.get(0);
job_priority_supported = v.integer_value;
}
else if (a.name.compareTo("copies-default") == 0)
{
v = (IPPValue)a.values.get(0);
copies_default = v.integer_value;
}
else if (a.name.compareTo("copies-supported") == 0)
{
v = (IPPValue)a.values.get(0);
lower_copies_supported = v.lower;
upper_copies_supported = v.upper;
}
else if (a.name.compareTo("page-ranges-supported") == 0)
{
v = (IPPValue)a.values.get(0);
page_ranges_supported = v.boolean_value;
}
else if (a.name.compareTo("number-up-default") == 0)
{
v = (IPPValue)a.values.get(0);
number_up_default = v.integer_value;
}
else if (a.name.compareTo("number-up-supported") == 0)
{
number_up_supported = new int[a.values.size()];
for (i=0; i < a.values.size(); i++)
{
v = (IPPValue)a.values.get(i);
number_up_supported[i] = v.integer_value;
}
}
else if (a.name.compareTo("orientation-requested-default") == 0)
{
v = (IPPValue)a.values.get(0);
orientation_requested_default = v.integer_value;
}
else if (a.name.compareTo("orientation-requested-supported") == 0)
{
orientation_requested_supported = new int[a.values.size()];
for (i=0; i < a.values.size(); i++)
{
v = (IPPValue)a.values.get(i);
orientation_requested_supported[i] = v.integer_value;
}
}
else if (a.name.compareTo("job-quota-period") == 0)
{
v = (IPPValue)a.values.get(0);
job_quota_period = v.integer_value;
}
else if (a.name.compareTo("job-k-limit") == 0)
{
v = (IPPValue)a.values.get(0);
job_k_limit = v.integer_value;
}
else if (a.name.compareTo("job-page-limit") == 0)
{
v = (IPPValue)a.values.get(0);
job_page_limit = v.integer_value;
}
else if (a.name.compareTo("job-sheets-default") == 0)
{
v = (IPPValue)a.values.get(0);
job_sheets_default = v.text;
}
else if (a.name.compareTo("job-sheets-supported") == 0)
{
job_sheets_supported = new String[a.values.size()];
for (i=0; i < a.values.size(); i++)
{
v = (IPPValue)a.values.get(i);
job_sheets_supported[i] = v.text;
}
}
else if (a.name.compareTo("device-uri") == 0)
{
v = (IPPValue)a.values.get(0);
device_uri = v.text;
}
else if (a.name.compareTo("color-supported") == 0)
{
v = (IPPValue)a.values.get(0);
color_supported = v.boolean_value;
}
else if (a.name.compareTo("pages-per-minute") == 0)
{
v = (IPPValue)a.values.get(0);
pages_per_minute = v.integer_value;
}
else if (a.name.compareTo("printer-make-and-model") == 0)
{
v = (IPPValue)a.values.get(0);
printer_make_and_model = v.text;
}
else if (a.name.compareTo("media-default") == 0)
{
v = (IPPValue)a.values.get(0);
media_default = v.text;
}
else if (a.name.compareTo("media-supported") == 0)
{
media_supported = new String[a.values.size()];
for (i=0; i < a.values.size(); i++)
{
v = (IPPValue)a.values.get(i);
media_supported[i] = v.text;
}
}
else if (a.name.compareTo("finishings-default") == 0)
{
v = (IPPValue)a.values.get(0);
finishings_default = v.integer_value;
}
else if (a.name.compareTo("finishings-supported") == 0)
{
finishings_supported = new int[a.values.size()];
for (i=0; i < a.values.size(); i++)
{
v = (IPPValue)a.values.get(i);
finishings_supported[i] = v.integer_value;
}
}
else if (a.name.compareTo("printer-type") == 0)
{
v = (IPPValue)a.values.get(0);
printer_type = v.integer_value;
}
} // End of updateAttribute()
/**
* Get the printer name.
*
* @return String
Printer Name.
*/
public String getPrinterName()
{
return(printer_name);
}
/**
* Get the printer state text.
*
* @return String
State text.
*/
public String getStateText()
{
return(printer_state_text);
}
/**
* Get the printer state reasons.
*
* @return String
State reason.
*/
public String getStateReasons()
{
return(printer_state_reasons);
}
/**
* Get the printer location.
*
* @return String
State location.
*/
public String getLocation()
{
return(printer_location);
}
/**
* Get the printer make and model.
*
* @return String
Make and model.
*/
public String getMakeAndModel()
{
return(printer_make_and_model);
}
/**
* Get the default job sheets.
*
* @return String
Default job sheets.
*/
public String getJobSheetsDefault()
{
return(job_sheets_default);
}
/**
* Get the printer job sheets supported.
*
* @return String[]
Array of supported job sheets.
*/
public String[] getJobSheetsSupported()
{
return(job_sheets_supported);
}
/**
* Get the default orientation.
*
* @return int
Default page orientation.
*/
public int getOrientationDefault()
{
return(orientation_requested_default);
}
/**
* Get the printer orientation supported.
*
* @return int[]
Array of supported orientations.
*/
public int[] getOrientationSupported()
{
return(orientation_requested_supported);
}
/**
* Get the printer lower copies supported.
*
* @return int
Lower of the range.
*/
public int getLowerCopiesSupported()
{
return(lower_copies_supported);
}
/**
* Get the printer upper copies supported.
*
* @return int
Upper of the range.
*/
public int getUpperCopiesSupported()
{
return(upper_copies_supported);
}
/**
* Get the printer number of copies default.
*
* @return int
Default number of copies.
*/
public int getCopiesDefault()
{
return(copies_default);
}
/**
* Get whether the printer supports page ranges.
*
* @return boolean
True or false.
*/
public boolean getPageRangesSupported()
{
return(page_ranges_supported);
}
/**
* Debug method.
*/
void dump()
{
int i;
System.out.println("Printer Name: " + printer_name );
System.out.println("Location: " + printer_location );
System.out.println("Printer Info: " + printer_info );
System.out.println("More Info: " + printer_more_info );
if (printer_uri_supported != null)
{
System.out.println("Printer URI's Supported: ");
for (i=0; i < printer_uri_supported.length; i++)
{
System.out.println(" " + printer_uri_supported[i] );
}
}
if (uri_authentication_supported != null)
{
System.out.println("URI Authentication Supported: ");
for (i=0; i < uri_authentication_supported.length; i++)
{
System.out.println(" " + uri_authentication_supported[i] );
}
}
if (uri_security_supported != null)
{
System.out.println("URI Security Supported: ");
for (i=0; i < uri_security_supported.length; i++)
{
System.out.println(" " + uri_security_supported[i] );
}
}
System.out.println("Attributes Charset: " + attributes_charset );
System.out.println("Attributes Natural Language: " + attributes_natural_language );
System.out.println("Printer State: " + printer_state );
System.out.println("Printer State Text: " + printer_state_text );
System.out.println("Printer State Reasons: " + printer_state_reasons );
if (printer_is_accepting_jobs)
System.out.println("Accepting Jobs: Yes");
else
System.out.println("Accepting Jobs: No");
}
} // End of CupsPrinter class