--- src/gnu/io/CommPortIdentifier.java.orig 2008-11-27 20:02:34 UTC +++ src/gnu/io/CommPortIdentifier.java @@ -76,85 +76,138 @@ public class CommPortIdentifier extends public static final int PORT_RS485 = 4; // rs485 Port public static final int PORT_RAW = 5; // Raw Port private String PortName; - private boolean Available = true; + private static boolean init_clean = false; + private boolean Available = true; private String Owner; private CommPort commport; private CommDriver RXTXDriver; static CommPortIdentifier CommPortIndex; CommPortIdentifier next; private int PortType; - private final static boolean debug = false; + private final static boolean debug = "true".equals( System.getProperty( "gnu.io.rxtx.DEBUG" ) ); static Object Sync; Vector ownershipListener; -/*------------------------------------------------------------------------------ - static {} aka initialization - accept: - - perform: load the rxtx driver - return: - - exceptions: Throwable - comments: static block to initialize the class -------------------------------------------------------------------------------*/ - // initialization only done once.... + /** + * static {} aka initialization + * accept: - + * perform: load the rxtx driver + * return: - + * exceptions: Throwable + * comments: static block to initialize the class + * + * initialization only done once.... + * + **/ + static { - if(debug) System.out.println("CommPortIdentifier:static initialization()"); + if(debug) System.out.println("CommPortIdentifier:Static()"); + Sync = new Object(); try { + if(debug) System.out.println(" Pre RXTXDriver.Loading New Class (Clean)"); + + init_clean = true; + CommDriver RXTXDriver = (CommDriver) Class.forName("gnu.io.RXTXCommDriver").newInstance(); + + if(debug) System.out.println(" Pre RXTXDriver.initialize()"); + RXTXDriver.initialize(); + + if(debug) System.out.println(" Post RXTXDriver.initialize()"); + } catch (Throwable e) { - System.err.println(e + " thrown while loading " + "gnu.io.RXTXCommDriver"); + + if(debug) System.out.println(" " + e + " thrown while loading gnu.io.RXTXCommDriver"); + + System.err.println(e + " thrown while loading gnu.io.RXTXCommDriver"); + + init_clean = false; + } String OS; OS = System.getProperty("os.name"); + + if(debug) System.out.println(" The OS is " + OS); + if(OS.toLowerCase().indexOf("linux") == -1) { - if (debug) - System.out.println("Have not implemented native_psmisc_report_owner(PortName)); in CommPortIdentifier"); + if (debug) + { + System.out.println(" WARNING:"); + System.out.println(" native_psmisc_System.out.println_owner(@)) not implemented"); + + /** + * Not Implemented: + * + * native_psmisc_System.out.println_owner(PortName) + * in CommPortIdentifier") + **/ + + } } + + if(debug) System.out.println(" Loading Library..."); + System.loadLibrary( "rxtxSerial" ); + + if(debug) System.out.println(" init_clean is " + init_clean); + if(debug) System.out.println("CommPortIdentifier:Static:Exit"); + } - CommPortIdentifier ( String pn, CommPort cp, int pt, CommDriver driver) + CommPortIdentifier + ( + String pn, + CommPort cp, + int pt, + CommDriver driver + ) { PortName = pn; commport = cp; PortType = pt; next = null; RXTXDriver = driver; - } -/*------------------------------------------------------------------------------ - addPortName() - accept: Name of the port s, Port type, - reverence to RXTXCommDriver. - perform: place a new CommPortIdentifier in the linked list - return: none. - exceptions: none. - comments: -------------------------------------------------------------------------------*/ + /** + * addPortName() + * accept: Name of the port s, Port type, + * reference to RXTXCommDriver. + * perform: place a new CommPortIdentifier in the linked list + * return: none. + * exceptions: none. + * comments: + **/ + public static void addPortName(String s, int type, CommDriver c) { - if(debug) System.out.println("CommPortIdentifier:addPortName("+s+")"); + if(debug) System.out.println("CommPortIdentifier:addPortName(" + s + ")"); + AddIdentifierToList(new CommPortIdentifier(s, null, type, c)); + + if(debug) System.out.println("CommPortIdentifier:addPortName:Exit"); } -/*------------------------------------------------------------------------------ - AddIdentifierToList() - accept: The cpi to add to the list. - perform: - return: - exceptions: - comments: -------------------------------------------------------------------------------*/ + + /** + * AddIdentifierToList() + * accept: The cpi to add to the list. + * perform: + * return: + * exceptions: + * comments: + **/ + private static void AddIdentifierToList( CommPortIdentifier cpi) { if(debug) System.out.println("CommPortIdentifier:AddIdentifierToList()"); @@ -163,7 +216,7 @@ public class CommPortIdentifier extends if (CommPortIndex == null) { CommPortIndex = cpi; - if(debug) System.out.println("CommPortIdentifier:AddIdentifierToList() null"); + if(debug) System.out.println(" Com Port Index is null!"); } else { @@ -171,264 +224,351 @@ public class CommPortIdentifier extends while (index.next != null) { index = index.next; - if(debug) System.out.println("CommPortIdentifier:AddIdentifierToList() index.next"); } index.next = cpi; } } + + if(debug) System.out.println("CommPortIdentifier:addIdentifier:Exit"); + } -/*------------------------------------------------------------------------------ - addPortOwnershipListener() - accept: - perform: - return: - exceptions: - comments: -------------------------------------------------------------------------------*/ + public void addPortOwnershipListener(CommPortOwnershipListener c) { if(debug) System.out.println("CommPortIdentifier:addPortOwnershipListener()"); - /* is the Vector instantiated? */ + /** + * is the Vector instantiated? + **/ if( ownershipListener == null ) { ownershipListener = new Vector(); } - /* is the ownership listener already in the list? */ + /** + * is the ownership listener already in the list? + **/ if ( ownershipListener.contains(c) == false) { ownershipListener.addElement(c); } + + if(debug) System.out.println("CommPortIdentifier:addPortOwnershipListener:Exit"); } -/*------------------------------------------------------------------------------ - getCurrentOwner() - accept: - perform: - return: - exceptions: - comments: -------------------------------------------------------------------------------*/ + public String getCurrentOwner() { if(debug) System.out.println("CommPortIdentifier:getCurrentOwner()"); + return( Owner ); + } -/*------------------------------------------------------------------------------ - getName() - accept: - perform: - return: - exceptions: - comments: -------------------------------------------------------------------------------*/ + public String getName() { - if(debug) System.out.println("CommPortIdentifier:getName()"); + if(debug) System.out.println("CommPortIdentifier:getName(" + PortName + ")"); + return( PortName ); + + } -/*------------------------------------------------------------------------------ - getPortIdentifier() - accept: - perform: - return: - exceptions: - comments: -------------------------------------------------------------------------------*/ + static public CommPortIdentifier getPortIdentifier(String s) throws NoSuchPortException { if(debug) System.out.println("CommPortIdentifier:getPortIdentifier(" + s +")"); + CommPortIdentifier index; synchronized (Sync) { index = CommPortIndex; - while (index != null && !index.PortName.equals(s)) { + + while (index != null && !index.PortName.equals(s)) + { index = index.next; } + if (index == null) { - /* This may slow things down but if you pass the string for the port after - a device is plugged in, you can find it now. - - http://bugzilla.qbang.org/show_bug.cgi?id=48 - */ + + /** + * This may slow things down but if you pass the string for the port after + * a device is plugged in, you can find it now. + * + * http://bugzilla.qbang.org/show_bug.cgi?id=48 + **/ + getPortIdentifiers(); + index = CommPortIndex; - while (index != null && !index.PortName.equals(s)) { + + while (index != null && !index.PortName.equals(s)) + { index = index.next; } + } + } + if (index != null) return index; else { - if ( debug ) - System.out.println("not found!" + s); + if (debug) System.out.println(" not found!" + s); + throw new NoSuchPortException(); } + + + } -/*------------------------------------------------------------------------------ - getPortIdentifier() - accept: - perform: - return: - exceptions: - comments: -------------------------------------------------------------------------------*/ + static public CommPortIdentifier getPortIdentifier(CommPort p) throws NoSuchPortException { - if(debug) System.out.println("CommPortIdentifier:getPortIdentifier(CommPort)"); + if(debug) System.out.println("CommPortIdentifier:getPortIdentifier(" + p + ")"); + CommPortIdentifier c; + synchronized( Sync ) { + c = CommPortIndex; - while ( c != null && c.commport != p ) + + while + ( + c != null && + c.commport != p + ) + { c = c.next; + } } + if ( c != null ) return (c); - if ( debug ) - System.out.println("not found!" + p.getName()); + if ( debug ) System.out.println(" not found!" + p.getName()); + throw new NoSuchPortException(); + + } -/*------------------------------------------------------------------------------ - getPortIdentifiers() - accept: - perform: - return: - exceptions: - comments: -------------------------------------------------------------------------------*/ + static public Enumeration getPortIdentifiers() { - if(debug) System.out.println("static CommPortIdentifier:getPortIdentifiers()"); - //Do not allow anybody get any ports while we are re-initializing - //because the CommPortIndex points to invalid instances during that time + if(debug) System.out.println("CommPortIdentifier:getPortIdentifiers()"); + + /** + * Do not allow anybody get any ports while we are re-initializing + * because the CommPortIndex points to invalid instances during that time + */ + synchronized(Sync) { - //Remember old ports in order to restore them for ownership events later + + /** + * Remember old ports in order to restore them for ownership events later + **/ + if(debug) System.out.println(" backing up current ports"); HashMap oldPorts = new HashMap(); CommPortIdentifier p = CommPortIndex; - while(p!=null) { + + while(p!=null) + { oldPorts.put(p.PortName, p); p = p.next; } + CommPortIndex = null; + try { - //Initialize RXTX: This leads to detecting all ports - //and writing them into our CommPortIndex through our method - //{@link #addPortName(java.lang.String, int, gnu.io.CommDriver)} - //This works while lock on Sync is held - CommDriver RXTXDriver = (CommDriver) Class.forName("gnu.io.RXTXCommDriver").newInstance(); - RXTXDriver.initialize(); - //Restore old CommPortIdentifier objects where possible, - //in order to support proper ownership event handling. - //Clients might still have references to old identifiers! + /** + * Initialize RXTX: This leads to detecting all ports + * and writing them into our CommPortIndex through our method + * {@link #addPortName(java.lang.String, int, gnu.io.CommDriver)} + * This works while lock on Sync is held + **/ + + /** + * However, if RXTX is being called invoked by + * CommPortIdentifier:getPortIdentifiers for the first + * time, they have just been enumerated by static() in + * this class, so we don't need to repeat on the first + * time. + **/ + + if ( init_clean == false ) + { + if(debug) System.out.println(" RXTX init() is dirty"); + if(debug) System.out.println(" Creating RXTX new instance"); + CommDriver RXTXDriver = (CommDriver) Class.forName("gnu.io.RXTXCommDriver").newInstance(); + if(debug) System.out.println(" Creating RXTX new instance"); + RXTXDriver.initialize(); + + } + else + { + if(debug) System.out.println(" RXTX init() still clean, now marking as dirty"); + init_clean = false; + } + + /** + * Restore old CommPortIdentifier objects where possible, + * in order to support proper ownership event handling. + * Clients might still have references to old identifiers! + **/ + CommPortIdentifier curPort = CommPortIndex; CommPortIdentifier prevPort = null; - while(curPort!=null) { + while(curPort!=null) + { CommPortIdentifier matchingOldPort = (CommPortIdentifier)oldPorts.get(curPort.PortName); - if(matchingOldPort!=null && matchingOldPort.PortType == curPort.PortType) { - //replace new port by old one + if + ( + matchingOldPort!=null && + matchingOldPort.PortType == curPort.PortType + ) + { + /** + * replace new port by old one + **/ + matchingOldPort.RXTXDriver = curPort.RXTXDriver; matchingOldPort.next = curPort.next; - if(prevPort==null) { + + if (prevPort==null) + { CommPortIndex = matchingOldPort; - } else { + } + else + { prevPort.next = matchingOldPort; } prevPort = matchingOldPort; - } else { + } + else + { prevPort = curPort; } + curPort = curPort.next; + } + } catch (Throwable e) { + + System.out.println(" " + e + " thrown while loading gnu.io.RXTXCommDriver"); + System.err.println(e + " thrown while loading " + "gnu.io.RXTXCommDriver"); + System.err.flush(); + } } + + if(debug) System.out.println("CommPortIdentifier:getPortIdentifiers:Exit"); + return new CommPortEnumerator(); + + + } -/*------------------------------------------------------------------------------ - getPortType() - accept: - perform: - return: - exceptions: - comments: -------------------------------------------------------------------------------*/ + public int getPortType() { - if(debug) System.out.println("CommPortIdentifier:getPortType()"); + if(debug) System.out.println("CommPortIdentifier:getPortType(" + PortType + ")"); + return( PortType ); + + } -/*------------------------------------------------------------------------------ - isCurrentlyOwned() - accept: - perform: - return: - exceptions: - comments: -------------------------------------------------------------------------------*/ + public synchronized boolean isCurrentlyOwned() { if(debug) System.out.println("CommPortIdentifier:isCurrentlyOwned()"); + return(!Available); + + } -/*------------------------------------------------------------------------------ - open() - accept: - perform: - return: - exceptions: - comments: -------------------------------------------------------------------------------*/ + public synchronized CommPort open(FileDescriptor f) throws UnsupportedCommOperationException { if(debug) System.out.println("CommPortIdentifier:open(FileDescriptor)"); + throw new UnsupportedCommOperationException(); + } private native String native_psmisc_report_owner(String PortName); -/*------------------------------------------------------------------------------ - open() - accept: application making the call and milliseconds to block - during open. - perform: open the port if possible - return: CommPort if successful - exceptions: PortInUseException if in use. - comments: -------------------------------------------------------------------------------*/ + /** + * open() + * accept: application making the call and milliseconds to block + * during open. + * perform: open the port if possible + * return: CommPort if successful + * exceptions: PortInUseException if in use. + * comments: + **/ + private boolean HideOwnerEvents; - public CommPort open(String TheOwner, int i) - throws gnu.io.PortInUseException + public CommPort open( + String TheOwner, + int i + ) + throws gnu.io.PortInUseException { - if(debug) System.out.println("CommPortIdentifier:open("+TheOwner + ", " +i+")"); + if(debug) System.out.println("CommPortIdentifier:open(" + TheOwner + ", " + i + ")"); + boolean isAvailable; - synchronized(this) { + + synchronized(this) + { isAvailable = this.Available; + if (isAvailable) { - //assume ownership inside the synchronized block + + /** + * assume ownership inside the synchronized block + * ? Of you and me ! + **/ + this.Available = false; this.Owner = TheOwner; } } + if (!isAvailable) { long waitTimeEnd = System.currentTimeMillis() + i; - //fire the ownership event outside the synchronized block - fireOwnershipEvent(CommPortOwnershipListener.PORT_OWNERSHIP_REQUESTED); + + /** + * Fire the ownership event outside the synchronized block + **/ + + fireOwnershipEvent + ( + CommPortOwnershipListener.PORT_OWNERSHIP_REQUESTED + ); + long waitTimeCurr; - synchronized(this) { - while(!Available && (waitTimeCurr=System.currentTimeMillis()) < waitTimeEnd) { + + synchronized(this) + { + + while + ( + !Available && + ( + waitTimeCurr=System.currentTimeMillis() + ) < waitTimeEnd + ) + { try { wait(waitTimeEnd - waitTimeCurr); @@ -439,91 +579,134 @@ public class CommPortIdentifier extends break; } } + isAvailable = this.Available; + if (isAvailable) { - //assume ownership inside the synchronized block + /** + * Assume ownership inside the synchronized block + * ? of you an me ! + **/ this.Available = false; this.Owner = TheOwner; } } } + if (!isAvailable) { throw new gnu.io.PortInUseException(getCurrentOwner()); } - //At this point, the CommPortIdentifier is owned by us. - try { + + /** + * At this point, the CommPortIdentifier is owned by us. + **/ + + try + { if(commport == null) { - commport = RXTXDriver.getCommPort(PortName,PortType); + commport = RXTXDriver.getCommPort( + PortName, + PortType + ); } + if(commport != null) { - fireOwnershipEvent(CommPortOwnershipListener.PORT_OWNED); + fireOwnershipEvent( + CommPortOwnershipListener.PORT_OWNED + ); + return commport; } else { - throw new gnu.io.PortInUseException( - native_psmisc_report_owner(PortName)); + throw new gnu.io.PortInUseException + ( + native_psmisc_report_owner(PortName) + ); } - } finally { + } + finally + { if(commport == null) { - //something went wrong reserving the commport -> unown the port + + /** + * something went wrong reserving the commport + * -> release ownership (internal) of the port + **/ + synchronized(this) { + this.Available = true; this.Owner = null; + } } + if(debug) System.out.println("CommPortIdentifier:open:Exit"); } - } -/*------------------------------------------------------------------------------ - removePortOwnership() - accept: - perform: - return: - exceptions: - comments: -------------------------------------------------------------------------------*/ + + + + } + public void removePortOwnershipListener(CommPortOwnershipListener c) { if(debug) System.out.println("CommPortIdentifier:removePortOwnershipListener()"); - /* why is this called twice? */ - if(ownershipListener != null) + + /** + * why is this called twice? + **/ + + if(ownershipListener != null) + { + if(debug) System.out.println(" I was owned!"); ownershipListener.removeElement(c); + } + + if(debug) System.out.println("CommPortIdentifier:removePortOwnershipListener()"); } -/*------------------------------------------------------------------------------ - internalClosePort() - accept: None - perform: clean up the Ownership information and send the event - return: None - exceptions: None - comments: None -------------------------------------------------------------------------------*/ + /** + * internalClosePort() + * accept: None + * perform: clean up the Ownership information and send the event + * return: + * exceptions: + * comments: + **/ + void internalClosePort() { + + if(debug) System.out.println("CommPortIdentifier:internalClosePort()"); + synchronized(this) { - if(debug) System.out.println("CommPortIdentifier:internalClosePort()"); + Owner = null; Available = true; commport = null; - /* this tosses null pointer?? */ + + /** + * this tosses null pointer?? + **/ + if(debug) System.out.println(" Notifying all..."); + notifyAll(); + } + fireOwnershipEvent(CommPortOwnershipListener.PORT_UNOWNED); + + if(debug) System.out.println("CommPortIdentifier:internalClosePort:Exit"); } -/*------------------------------------------------------------------------------ - fireOwnershipEvent() - accept: - perform: - return: - exceptions: - comments: -------------------------------------------------------------------------------*/ + void fireOwnershipEvent(int eventType) { + if(debug) System.out.println("CommPortIdentifier:fireOwnershipEvent( " + eventType + " )"); + if (ownershipListener != null) { CommPortOwnershipListener c; @@ -532,6 +715,10 @@ public class CommPortIdentifier extends c.ownershipChange(eventType)) c = (CommPortOwnershipListener) e.nextElement(); } + + if(debug) System.out.println("CommPortIdentifier:fireOwnershipEvent:Exit"); } + + }