📄 commportidentifier.java
字号:
/* * @(#)SimpleRead.java 1.12 98/06/25 SMI * * Copyright (c) 1998 Sun Microsystems, Inc. All Rights Reserved. * * Sun grants you ("Licensee") a non-exclusive, royalty free, license * to use, modify and redistribute this software in source and binary * code form, provided that i) this copyright notice and license appear * on all copies of the software; and ii) Licensee does not utilize the * software in a manner which is disparaging to Sun. * * This software is provided "AS IS," without a warranty of any kind. * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND * ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE * SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS * BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, * HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING * OUT OF THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. * * This software is not designed or intended for use in on-line control * of aircraft, air traffic, aircraft navigation or aircraft * communications; or in the design, construction, operation or * maintenance of any nuclear facility. Licensee represents and * warrants that it will not use or redistribute the Software for such * purposes. */package javax.comm;import java.io.*;import java.util.*;/** * Communications port management. <CODE>CommPortIdentifier</CODE> * is the central class for controlling access to communications ports. * It includes methods for: * <UL> * <LI> * Determining the communications ports made available by the driver. * <LI> * Opening communications ports for I/O operations. * <LI> * Determining port ownership. * <LI> * Resolving port ownership contention. * <LI> * Managing events that indicate changes in port ownership status. * </UL> * <P> * An application first uses methods in <CODE>CommPortIdentifier</CODE> * to negotiate with the driver to discover which communication ports * are available and then select a port for opening. It then uses * methods in other classes like <CODE>CommPort</CODE>, <CODE>ParallelPort</CODE> * and <CODE>SerialPort</CODE> to communicate through the port. * * @author Jagane Sundar * @version 1.11, 23 Jan 1998 * @see javax.comm.CommPort * @see javax.comm.CommPortOwnershipListener * @see javax.comm.ParallelPort * @see javax.comm.SerialPort */public class CommPortIdentifier { /** * Obtains an enumeration object that contains a <CODE>CommPortIdentifier</CODE> * object for each port in the system. * * @return an <CODE> Enumeration </CODE> object that can be used to * enumerate all the ports known to the system * * @see java.util.Enumeration */ static public Enumeration getPortIdentifiers() { SecurityManager sec = System.getSecurityManager(); if (sec != null) { sec.checkRead(propfilename); } return new CommPortEnumerator(); } /** * Obtains a <CODE>CommPortIdentifier</CODE> object by using a port name. * The port name may have been stored in persistent storage by the application. * * @param <CODE>portName</CODE> name of the port to open * @return a <CODE>CommPortIdentifier</CODE> object * @exception NoSuchPortException if the port does not exist */ static public CommPortIdentifier getPortIdentifier(String portName) throws NoSuchPortException { SecurityManager sec = System.getSecurityManager(); if (sec != null) { sec.checkRead(propfilename); } CommPortIdentifier portId = null; synchronized (lock) { portId = masterIdList; while (portId != null) { if (portId.name.equals(portName)) break; portId = portId.next; } } if (portId != null) { return portId; } else { throw new NoSuchPortException(); } } /** * Obtains the <CODE>CommPortIdentifier</CODE> object corresponding * to a port that has already been opened by the application. * * @param port a CommPort object obtained from a previous open * @return a CommPortIdentifier object * @exception NoSuchPortException if the port object is invalid */ static public CommPortIdentifier getPortIdentifier(CommPort port) throws NoSuchPortException { SecurityManager sec = System.getSecurityManager(); if (sec != null) { sec.checkRead(propfilename); } CommPortIdentifier portId = null; synchronized (lock) { portId = masterIdList; while (portId != null) { if (portId.port == port) break; portId = portId.next; } } if (portId != null) { return portId; } else { throw new NoSuchPortException(); } } /** * Adds <CODE>CommPort</CODE> object to the list of ports. */ private static void addPort(CommPort port, int portType) { SecurityManager sec = System.getSecurityManager(); if (sec != null) { sec.checkRead(propfilename); } CommPortIdentifier newentry = new CommPortIdentifier(port.getName(), port, portType, null); CommPortIdentifier cur = masterIdList, prev = null; synchronized (lock) { while (cur != null) { prev = cur; cur = cur.next; } if (prev != null) { prev.next = newentry; } else { masterIdList = newentry; } } } /** * Adds <CODE>portName</CODE> to the list of ports. * @param portName The name of the port being added * @param portType The type of the port being added * @param driver The driver representing the port being added * @see javax.comm.CommDriver * @since CommAPI 1.1 */ public static void addPortName(String portName, int portType, CommDriver driver) { SecurityManager sec = System.getSecurityManager(); if (sec != null) { sec.checkRead(propfilename); } CommPortIdentifier newentry = new CommPortIdentifier(portName, null, portType, driver); CommPortIdentifier cur = masterIdList, prev = null; synchronized (lock) { while (cur != null) { prev = cur; cur = cur.next; } if (prev != null) { prev.next = newentry; } else { masterIdList = newentry; } } } /** * Returns the name of the port. The port name should be identifiable * by the user. Ideally, it should be the label on the hardware. * For example, "COM1" and "COM2" on PCs; "Serial A" and "Serial B" * on Sun Ultra workstations. The port name may be stored by an application * and subsequently used to create a <CODE>CommPortIdentifier</CODE> * object using <CODE>getPortIdentifier(String portName)</CODE> method. * * @return the name of the port */ public String getName() { return name; } String name; private int portType; /** * RS-232 serial port */ public static final int PORT_SERIAL = 1; /** * IEEE 1284 parallel port */ public static final int PORT_PARALLEL = 2; /** * Returns the port type. * * @return portType - PORT_SERIAL or PORT_PARALLEL */ public int getPortType() { return portType; } private boolean maskOwnershipEvents; /** * Opens the communications port. <CODE>open</CODE> obtains * exclusive ownership of the port. If the port is owned by some * other application, a <CODE>PORT_OWNERSHIP_REQUESTED</CODE> event * is propagated using the <CODE>CommPortOwnershipListener</CODE> * event mechanism. If the application that owns the port calls * <CODE>close</CODE> during the event processing, then this * <CODE>open</CODE> will succeed. * * There is one <CODE>InputStream</CODE> and one <CODE>OutputStream</CODE> * associated with each port. After a port is opened with * <CODE>open</CODE>, then all calls to <CODE>getInputStream</CODE> * will return the same stream object until <CODE>close</CODE> * is called. * * @param appname Name of application making this call. * This name will become the owner of the port. * Useful when resolving ownership contention. * @param timeout time in milliseconds to block waiting * for port open. * @return a <CODE>CommPort</CODE> object * @exception PortInUseException if the port is in use by some * other application that is not willing to relinquish * ownership */ public synchronized CommPort open(String appname, int timeout) throws PortInUseException { if (owned) { maskOwnershipEvents = true; fireOwnershipEvent( CommPortOwnershipListener.PORT_OWNERSHIP_REQUESTED); maskOwnershipEvents = false; if (owned) { throw new PortInUseException(owner); } } port = driver.getCommPort(name, portType); if (port == null) { /* * Unable to create port. Most likely, port is in use by * another application */ /******************************************************************* * FILL IN HERE. * Use underlying OS's IPC mechanisms to communicate with * other Java VMs that may be willing to give up ownership of * port. ******************************************************************/ if (port == null) { throw new PortInUseException("Unknown Windows Application"); } } owned = true; owner = appname; return port; } /** * Returns the owner of the port. * * @return current owner of the port. */ public String getCurrentOwner() { if (owned) { return owner; } else { /******************************************************************* * FILL IN HERE. * Use underlying OS's IPC mechanisms to obtain information * about the current owner of the port. The current owner * may be another Java COMM application or an OS native app. ******************************************************************/ } } /** * Checks whether the port is owned. * * @return boolean <CODE>true</CODE> if the port is owned by some application, * <CODE>false</CODE> if the port is not owned. */ public boolean isCurrentlyOwned() { if (owned) { return true; } else { /******************************************************************* * FILL IN HERE. * Use underlying OS's IPC mechanisms to obtain information * about the current owner of the port. The current owner * may be another Java COMM application or an OS native app. ******************************************************************/ } } OwnershipEventThread oeThread; CpoList cpoList = new CpoList(); /** * Registers an interested application so that it can receive notification * of changes in port ownership. This includes notification of the following events: * <UL> * <LI> * <CODE>PORT_OWNED</CODE>: Port became owned * <LI> * <CODE>PORT_UNOWNED</CODE>: Port became unowned * <LI> * <CODE>PORT_OWNERSHIP_REQUESTED</CODE>: If the application owns this port * and is willing to give up ownership, then it should call * <CODE>close</CODE> now. * </UL> * The <CODE>ownershipChange</CODE> method of the listener registered * using <CODE>addPortOwnershipListener</CODE> will be called with one * of the above events. * * @param listener a <CODE>CommPortOwnershipListener</CODE> callback object */ public void addPortOwnershipListener(CommPortOwnershipListener listener) { cpoList.add(listener); if (oeThread == null) { oeThread = new OwnershipEventThread(this); oeThread.start(); } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -