⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 commportidentifier.java

📁 JAVA手机短信开发包
💻 JAVA
📖 第 1 页 / 共 2 页
字号:

    /**
     * Deregisters a <CODE>CommPortOwnershipListener</CODE> registered using
     * <CODE>addPortOwnershipListener</CODE>
     *
     * @param	listener The CommPortOwnershipListener object that was
     *		previously registered using addPortOwnershipListener
     */
    public void removePortOwnershipListener(CommPortOwnershipListener lsnr) {

	cpoList.remove(lsnr);

    }

    void ownershipThreadWaiter() {

	    /*******************************************************************
	     * FILL IN HERE.
	     * Use underlying OS's IPC mechanisms to wait for ownership
	     * event notifications from other Java VMs that may be
	     * running Java Communications API applications.
	     ******************************************************************/
	int ret;
	if (ret) {
	    maskOwnershipEvents = true;
	    switch(ret) {
	    case 0:
		fireOwnershipEvent(CommPortOwnershipListener.PORT_OWNED);
		break;
	    case 1:
		fireOwnershipEvent(CommPortOwnershipListener.PORT_UNOWNED);
		break;
	    case 2:
	        fireOwnershipEvent(
			CommPortOwnershipListener.PORT_OWNERSHIP_REQUESTED);
		break;
	    }
	    maskOwnershipEvents = false;
	}

    }

    synchronized void internalClosePort() {
	owned = false;
	owner = null;
	port = null;
	if (!maskOwnershipEvents) {
	    fireOwnershipEvent(CommPortOwnershipListener.PORT_UNOWNED);
	}
    }

    CommPortIdentifier next;
    private CommPort port;
    private CommDriver driver;

    CommPortIdentifier(String name, CommPort port, int portType,CommDriver dr) {
	this.name = name;
	this.port = port;
	this.portType = portType;
	this.next = null;
	this.driver = dr;

    }

    void fireOwnershipEvent(int eventType) {

	/*
	 * Need to clone the ownership listener list, before firing the
	 * event, because the event handlers have a habit of calling
	 * removeOwnershipListener() which causes a deadlock.
	 */
	CpoList clone = cpoList.clonelist();
	clone.fireOwnershipEvent(eventType);

    }

    private static String[] parsePropsFile(InputStream in) {

        Vector strs = new Vector();

        try {

            byte ba[] = new byte[4096];
            int index = 0;
            boolean skip_to_eol = false;
            int b;
            while ((b = in.read()) != -1) {
                // System.err.println("Read - " + b);
                switch (b) {
                case '\t':
                case ' ':
                    break;
                case '\r':
                case '\n':
                    if (index > 0) {
                        String str = new String(ba, 0, 0,index);
                        strs.addElement(str);
                    }
                    index = 0;
                    skip_to_eol = false;
                    break;
                case '#':
                    skip_to_eol = true;
                    if (index > 0) {
                        String str = new String(ba, 0, 0,index);
                        strs.addElement(str);
                    }
                    index = 0;
                    break;
                default:
                    if (!skip_to_eol && index < 4096)
                        ba[index++] = (byte) b;
                }
            }
        } catch (Throwable ex) {
            System.err.println("Caught " + ex + " parsing prop file.");

        }

        // Convert to String array if strs has any elements.
        if (strs.size() > 0) {
            String strarray[] = new String[strs.size()];
            for (int i = 0; i < strs.size(); i++) {
                strarray[i] = (String) strs.elementAt(i);
            }
            return strarray;
        } else {
            return null;
        }

    }

    /* for synchronizing access to the list of ports */
    static Object 	lock;
    static String 	propfilename;
    static {

	System.err.println(
"****************************************************************************");
	System.err.println("Java Communications API - Early Access");
	System.err.println(
	    "Copyright (c) 1997 Sun Microsystems, Inc. All Rights Reserved.");
	System.err.println(
"****************************************************************************");

	lock = new Object();

	/*
	 * Check our property and our properties file for list
	 * of drivers
	 */
	String pdrivers;
	if ((pdrivers = System.getProperty("javax.comm.properties")) != null) {
	    System.err.println("Comm Drivers: " + pdrivers);
	}
	propfilename =   System.getProperty("java.home") +
				File.separator +
				"lib" +
				File.separator +
				"javax.comm.properties";
	File propfile = new File(propfilename);
	InputStream fis;
	try {
	    fis = new BufferedInputStream(new FileInputStream(propfile));

	    String drivers[] = parsePropsFile(fis);

	    if (drivers != null) {
		for (int i = 0; i < drivers.length; i++) {
		    if (drivers[i].regionMatches(true, 0, "driver=", 0, 7)) {
			String drivername = drivers[i].substring(7);
			drivername.trim();
			try {
			    CommDriver driver = (CommDriver)
					Class.forName(drivername).newInstance();
			    driver.initialize();
			} catch (Throwable th) {
			    System.err.println("Caught " + th 
				+ " while loading driver " + drivername);
			}
		    }
		}
	    }

	} catch (Throwable ex) {
	    /* silently ignore any exception */
	    System.err.println(ex);
	}

    }

    static CommPortIdentifier	masterIdList;

    /*
     * ownership of this port
     */
    boolean owned;	/* this boolean indicates ownership in this VM */
    String owner;	/* this value describes ownership within this VM */

    /**
     * Opens the communications port using a <CODE>FileDescriptor</CODE>
     * object on platforms that support this technique.
     *
     * @param		fd	The <CODE>FileDescriptor</CODE> object used to build
                        a <CODE>CommPort</CODE>.
     * @return		a <CODE>CommPort</CODE> object.
     * @exception	UnsupportedCommOperationException	is thrown
     *                  on platforms which do not support this functionality.
     */
    public CommPort open(FileDescriptor fd)
			throws UnsupportedCommOperationException {
	throw new UnsupportedCommOperationException();
    }
}

/**
 * List of ports.
 *
 * @author      Jagane Sundar
 * @version     1.11, 23 Jan 1998
 * @see         javax.comm.CommPort
 * @see         javax.comm.CommPortIdentifier
 */
class CommPortEnumerator implements Enumeration {

    private CommPortIdentifier	curEntry;

    /**
     * Returns the next element of this enumeration.
     *
     * @return	the next element of this enumeration.
     */
    public Object nextElement() {
	synchronized (CommPortIdentifier.lock) {
	    if (curEntry != null) {
		curEntry = curEntry.next;
	    } else {
		curEntry = CommPortIdentifier.masterIdList;
	    }
	}
	return curEntry;
    }

    /**
     * Tests if this enumeration contains more elements. 
     *
     * @return	true if this enumeration contains more elements; false otherwise.
     */
    public boolean hasMoreElements() {
	synchronized (CommPortIdentifier.lock) {
	    if (curEntry != null) {
		return curEntry.next == null ? false : true;
	    } else {
		return CommPortIdentifier.masterIdList == null ? false : true;
	    }
	}
    }
}

/**
 * Port thread management.
 *
 * @author      Jagane Sundar
 * @version     1.11, 23 Jan 1998
 * @see         javax.comm.CommPort
 * @see         javax.comm.CommPortIdentifier
 * @see         java.lang.thread
 */
class OwnershipEventThread extends Thread {

    CommPortIdentifier portId;

    OwnershipEventThread(CommPortIdentifier id) {
	portId = id;
    }

    /**
     * If this thread was constructed using a separate Runnable run object,
     * then that Runnable object's run method is called;
     * otherwise, <CODE>run</CODE> does nothing and returns. 
     */
    public void run() {

	while (!portId.cpoList.isEmpty()) {

	    portId.ownershipThreadWaiter();

	}
	portId.oeThread = null;

    }
}

class CpoListEntry {

    CpoListEntry		next;
    CommPortOwnershipListener	listener;

    CpoListEntry(CommPortOwnershipListener lsnr) {
	listener = lsnr;
	next = null;
    }

}

class CpoList {

    CpoListEntry	listHead = null;

    synchronized void add(CommPortOwnershipListener lsnr) {

	CpoListEntry cur = listHead;
	while (cur != null) {
	    if (cur.listener == lsnr) {
		return;
	    }
	    cur = cur.next;
	}

	CpoListEntry n = new CpoListEntry(lsnr);
	n.next = listHead;
	listHead = n;

    }

    synchronized void remove(CommPortOwnershipListener lsnr) {

	CpoListEntry prev = null;
	CpoListEntry cur = listHead;
	while (cur != null) {
	    if (cur.listener == lsnr) {
		if (prev != null)
		    prev.next = cur.next;
		else
		    listHead = cur.next;
		cur.listener = null;
		cur.next = null;
		return;
	    }
	    prev = cur;
	    cur = cur.next;
	}
    }

    synchronized CpoList clonelist() {
	CpoListEntry clonehead = null;
	CpoListEntry nclone = null;

	CpoListEntry cur = listHead;

	while (cur != null) {

	    nclone = new CpoListEntry(cur.listener);
	    nclone.next = clonehead;
	    clonehead = nclone;

	    cur = cur.next;
	}

	CpoList ret = new CpoList();
	ret.listHead = clonehead;
	return ret;
    }

    synchronized boolean isEmpty() {
	return listHead == null;
    }

    synchronized void fireOwnershipEvent(int eventType) {
	CpoListEntry cur = listHead;
	while (cur != null) {
	    cur.listener.ownershipChange(eventType);
	    cur = cur.next;
	}
    }

    synchronized void dump() {
	CpoListEntry cur = listHead;
	while (cur != null) {
	    System.err.println("    CpoListEntry - " + cur.listener.toString());
	    cur = cur.next;
	}
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -