mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			304 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Java
		
	
	
	
			
		
		
	
	
			304 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Java
		
	
	
	
/* PrintServiceLookup.java --
 | 
						|
   Copyright (C) 2004, 2006 Free Software Foundation, Inc.
 | 
						|
 | 
						|
This file is part of GNU Classpath.
 | 
						|
 | 
						|
GNU Classpath is free software; you can redistribute it and/or modify
 | 
						|
it under the terms of the GNU General Public License as published by
 | 
						|
the Free Software Foundation; either version 2, or (at your option)
 | 
						|
any later version.
 | 
						|
 | 
						|
GNU Classpath is distributed in the hope that it will be useful, but
 | 
						|
WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
						|
General Public License for more details.
 | 
						|
 | 
						|
You should have received a copy of the GNU General Public License
 | 
						|
along with GNU Classpath; see the file COPYING.  If not, write to the
 | 
						|
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
						|
02110-1301 USA.
 | 
						|
 | 
						|
Linking this library statically or dynamically with other modules is
 | 
						|
making a combined work based on this library.  Thus, the terms and
 | 
						|
conditions of the GNU General Public License cover the whole
 | 
						|
combination.
 | 
						|
 | 
						|
As a special exception, the copyright holders of this library give you
 | 
						|
permission to link this library with independent modules to produce an
 | 
						|
executable, regardless of the license terms of these independent
 | 
						|
modules, and to copy and distribute the resulting executable under
 | 
						|
terms of your choice, provided that you also meet, for each linked
 | 
						|
independent module, the terms and conditions of the license of that
 | 
						|
module.  An independent module is a module which is not derived from
 | 
						|
or based on this library.  If you modify this library, you may extend
 | 
						|
this exception to your version of the library, but you are not
 | 
						|
obligated to do so.  If you do not wish to do so, delete this
 | 
						|
exception statement from your version. */
 | 
						|
 | 
						|
 | 
						|
package javax.print;
 | 
						|
 | 
						|
import gnu.classpath.ServiceFactory;
 | 
						|
import gnu.javax.print.CupsPrintServiceLookup;
 | 
						|
 | 
						|
import java.util.ArrayList;
 | 
						|
import java.util.Arrays;
 | 
						|
import java.util.HashSet;
 | 
						|
import java.util.Iterator;
 | 
						|
 | 
						|
import javax.print.attribute.AttributeSet;
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
 * <code>PrintServiceLookup</code> implementations provide a way to lookup
 | 
						|
 * print services based on different constraints.
 | 
						|
 * <p>
 | 
						|
 * Implementations are located and loaded automatically through the SPI JAR
 | 
						|
 * file specification. Therefore implementation classes must provide a default
 | 
						|
 * constructor for instantiation. Furthermore, applications are able to
 | 
						|
 * register further instances directly at runtime.
 | 
						|
 * </p><p>
 | 
						|
 * If an SecurityManager is installed implementors should call
 | 
						|
 * <code>checkPrintJobAccess()</code> to disable access for untrusted code.
 | 
						|
 * This check is to be made in every lookup service implementation for
 | 
						|
 * flexibility. Print services registered by applications through
 | 
						|
 * <code>registerService(PrintService)</code> are suppressed in the
 | 
						|
 * lookup results if a security manager is installed and disallows access.
 | 
						|
 * </p>
 | 
						|
 *
 | 
						|
 * @author Michael Koch (konqueror@gmx.de)
 | 
						|
 * @author Wolfgang Baer (WBaer@gmx.de)
 | 
						|
 */
 | 
						|
public abstract class PrintServiceLookup
 | 
						|
{
 | 
						|
 | 
						|
  private static final CupsPrintServiceLookup systemProvider;
 | 
						|
  private static final HashSet printServices;
 | 
						|
  private static final HashSet printServiceLookups;
 | 
						|
 | 
						|
  static
 | 
						|
  {
 | 
						|
    systemProvider = new CupsPrintServiceLookup();
 | 
						|
 | 
						|
    printServices = new HashSet();
 | 
						|
    printServiceLookups = new HashSet();
 | 
						|
 | 
						|
    // check for service providers
 | 
						|
    Iterator it = ServiceFactory.lookupProviders(PrintServiceLookup.class);
 | 
						|
 | 
						|
    while (it.hasNext())
 | 
						|
      printServiceLookups.add(it.next());
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Constructs a <code>PrintServiceLookup</code> object.
 | 
						|
   */
 | 
						|
  public PrintServiceLookup()
 | 
						|
  {
 | 
						|
    // nothing to do here
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Explicitly registers the provided print service lookup implementation.
 | 
						|
   * <p>
 | 
						|
   * The registration will silently fail (returning <code>false</code>) if
 | 
						|
   * the lookup service is already registered or the registration somehow
 | 
						|
   * else fails.
 | 
						|
   * </p>
 | 
						|
   *
 | 
						|
   * @param sp the print service lookup implementation to register.
 | 
						|
   * @return <code>true</code> if registered, <code>false</code> otherwise.
 | 
						|
   */
 | 
						|
  public static boolean registerServiceProvider(PrintServiceLookup sp)
 | 
						|
  {
 | 
						|
    return printServiceLookups.add(sp);
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Explicitly registers the provided print service instance.
 | 
						|
   * <p>
 | 
						|
   * The registration will silently fail (returning <code>false</code>) if
 | 
						|
   * the print service instance is already registered or the registration
 | 
						|
   * somehow else fails.
 | 
						|
   * </p>
 | 
						|
   * @param service the single print service to register.
 | 
						|
   * @return <code>true</code> if registered, <code>false</code> otherwise.
 | 
						|
   */
 | 
						|
  public static boolean registerService(PrintService service)
 | 
						|
  {
 | 
						|
    if (service instanceof StreamPrintService)
 | 
						|
      return false;
 | 
						|
 | 
						|
    // security
 | 
						|
    try
 | 
						|
      {
 | 
						|
        SecurityManager sm = System.getSecurityManager();
 | 
						|
        if (sm != null)
 | 
						|
          sm.checkPrintJobAccess();
 | 
						|
 | 
						|
        return printServices.add(service);
 | 
						|
      }
 | 
						|
    catch (SecurityException se)
 | 
						|
      {
 | 
						|
        return false;
 | 
						|
      }
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Searches print services capable of printing in the given document flavor
 | 
						|
   * which supports the specified printing attributes.
 | 
						|
   *
 | 
						|
   * @param flavor the document flavor to support. If <code>null</code> this
 | 
						|
   * constraint is ignored during lookup.
 | 
						|
   * @param attributes the printing attributes to support. If
 | 
						|
   * <code>null</code> this constraint is ignored during lookup.
 | 
						|
   * @return The resulting available print services, or an array of length 0
 | 
						|
   * if none is found.
 | 
						|
   */
 | 
						|
  public static final PrintService[] lookupPrintServices(DocFlavor flavor,
 | 
						|
    AttributeSet attributes)
 | 
						|
  {
 | 
						|
    ArrayList result = new ArrayList();
 | 
						|
 | 
						|
    PrintService[] services =
 | 
						|
      systemProvider.getPrintServices(flavor, attributes);
 | 
						|
    result.addAll(Arrays.asList(services));
 | 
						|
 | 
						|
    for (Iterator it = printServiceLookups.iterator(); it.hasNext(); )
 | 
						|
      {
 | 
						|
        PrintServiceLookup lookup = (PrintServiceLookup) it.next();
 | 
						|
        services = lookup.getPrintServices(flavor, attributes);
 | 
						|
        result.addAll(Arrays.asList(services));
 | 
						|
      }
 | 
						|
 | 
						|
    for (Iterator it = printServices.iterator(); it.hasNext(); )
 | 
						|
      {
 | 
						|
        PrintService service = (PrintService) it.next();
 | 
						|
        if (systemProvider.checkPrintService(flavor, attributes, service))
 | 
						|
          result.add(service);
 | 
						|
      }
 | 
						|
 | 
						|
    return (PrintService[]) result.toArray(new PrintService[result.size()]);
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Searches print services capable of multi document printing in all of the
 | 
						|
   * given document flavors and supporting the specified printing attributes.
 | 
						|
   *
 | 
						|
   * @param flavors the document flavors to support. If <code>null</code> this
 | 
						|
   * constraint is ignored during lookup.
 | 
						|
   * @param attributes the printing attributes to support. If
 | 
						|
   * <code>null</code> this constraint is ignored during lookup.
 | 
						|
   * @return The resulting available multi document print services, or an
 | 
						|
   * array of length 0 if none is found.
 | 
						|
   */
 | 
						|
  public static final MultiDocPrintService[] lookupMultiDocPrintServices(
 | 
						|
    DocFlavor[] flavors, AttributeSet attributes)
 | 
						|
  {
 | 
						|
    ArrayList result = new ArrayList();
 | 
						|
 | 
						|
    MultiDocPrintService[] services =
 | 
						|
      systemProvider.getMultiDocPrintServices(flavors, attributes);
 | 
						|
    result.addAll(Arrays.asList(services));
 | 
						|
 | 
						|
    for (Iterator it = printServiceLookups.iterator(); it.hasNext(); )
 | 
						|
      {
 | 
						|
        PrintServiceLookup lookup = (PrintServiceLookup) it.next();
 | 
						|
        services = lookup.getMultiDocPrintServices(flavors, attributes);
 | 
						|
        result.addAll(Arrays.asList(services));
 | 
						|
      }
 | 
						|
 | 
						|
    for (Iterator it = printServices.iterator(); it.hasNext(); )
 | 
						|
      {
 | 
						|
        PrintService service = (PrintService) it.next();
 | 
						|
        if (systemProvider.checkMultiDocPrintService(flavors, attributes, service))
 | 
						|
          result.add(service);
 | 
						|
      }
 | 
						|
 | 
						|
    return (MultiDocPrintService[]) result.toArray(
 | 
						|
      new MultiDocPrintService[result.size()]);
 | 
						|
  }
 | 
						|
 | 
						|
 | 
						|
  /**
 | 
						|
   * Searches the default print service in the current environment.
 | 
						|
   * <p>
 | 
						|
   * If multiple lookup services are registered and each has a default
 | 
						|
   * print service the result is not specified. Usually the default
 | 
						|
   * print service of the native platform lookup service is returned.
 | 
						|
   * </p><p>
 | 
						|
   * The GNU classpath implementation will return the CUPS default
 | 
						|
   * printing service as the default print service, if available.
 | 
						|
   * </p><p>
 | 
						|
   * The default print service may be overriden by users through
 | 
						|
   * the property <code>javax.print.defaultPrinter</code>. A service
 | 
						|
   * specified must be found to be returned as the default.
 | 
						|
   * </p>
 | 
						|
   *
 | 
						|
   * @return The default print service, or <code>null</code> if none found.
 | 
						|
   */
 | 
						|
  public static final PrintService lookupDefaultPrintService()
 | 
						|
  {
 | 
						|
    // TODO Find out what the property controls and use it
 | 
						|
    // String defaultPrinter = System.getProperty("javax.print.defaultPrinter");
 | 
						|
 | 
						|
    // first test for platform specified default services
 | 
						|
    PrintService service = systemProvider.getDefaultPrintService();
 | 
						|
 | 
						|
    if (service != null)
 | 
						|
      return service;
 | 
						|
 | 
						|
    // none available by systemDefaultProvider
 | 
						|
    // search in other registered ones and take first
 | 
						|
    for (Iterator it = printServiceLookups.iterator(); it.hasNext(); )
 | 
						|
      {
 | 
						|
        service = ((PrintServiceLookup) it.next()).getDefaultPrintService();
 | 
						|
        if (service != null)
 | 
						|
          return service;
 | 
						|
      }
 | 
						|
 | 
						|
    return null;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Not to be called directly by applications.
 | 
						|
   *
 | 
						|
   * @return The default lookup service of the implementing lookup service or
 | 
						|
   * <code>null</code> if there is no default one.
 | 
						|
   */
 | 
						|
  public abstract PrintService getDefaultPrintService();
 | 
						|
 | 
						|
  /**
 | 
						|
   * Not to be called directly by applications.
 | 
						|
   *
 | 
						|
   * @param flavors the document flavors which have to be supported.
 | 
						|
   * @param attributes the attributes which have to be supported.
 | 
						|
   *
 | 
						|
   * @return The multidoc print services of the implementing lookup service
 | 
						|
   * for the given parameters, or an array of length 0 if none is available.
 | 
						|
   */
 | 
						|
  public abstract MultiDocPrintService[]
 | 
						|
    getMultiDocPrintServices(DocFlavor[] flavors, AttributeSet attributes);
 | 
						|
 | 
						|
  /**
 | 
						|
   * Not to be called directly by applications.
 | 
						|
   *
 | 
						|
   * @return All known print services of the implementing lookup service
 | 
						|
   * regardless of supported features, or an array of length 0 if none is
 | 
						|
   * available.
 | 
						|
   */
 | 
						|
  public abstract PrintService[] getPrintServices();
 | 
						|
 | 
						|
  /**
 | 
						|
   * Not to be called directly by applications.
 | 
						|
   *
 | 
						|
   * @param flavor the document flavor which has to be supported.
 | 
						|
   * @param attributes the attributes which have to be supported.
 | 
						|
   *
 | 
						|
   * @return The print services of the implementing lookup service
 | 
						|
   * for the given parameters, or an array of length 0 if none is available.
 | 
						|
   */
 | 
						|
  public abstract PrintService[]
 | 
						|
    getPrintServices(DocFlavor flavor, AttributeSet attributes);
 | 
						|
}
 |