version 1.3.8 o Works with Java 1.2 version 1.3.7 o NetComponents.jar file is now compressed and includes an auto-generated manifest so that it may be used with the HotJava web browser. o Fixed a date parsing bug in DefaultFTPFileListeParser. Months would not always be properly converted (e.g., April would turn up as August). We must have inadvertently introduced this bug with release 1.3, when we rewrote DefaultFTPFileListParser. We're really sorry for goofing that up. o Added isConversionRequired() static final method to com.oroinc.io.FromNetASCIIInputStream. o Fixed a bug whereby the InputStream returned by TelnetClient.getInputStream might return an incorrect available() value. Also added documentation to the FromNetASCIIInputStream available() method indicating that its return value is unreliable. In other words, you can rely on the available() value returned by the TelnetClient InputStream, but you can't rely on the FromNetASCIIInputStream available() value. version 1.3.6 o added SocketFactory and DatagramSocketFactory interfaces as well as DefaultSocketFactory and DefaultDatagramSocketFactory classes to the com.oroinc.net package. Also added setSocketFactory and setDatagramSocketFactory methods to SocketClient and DatagramSocketClient respectively. This new functionality allows you to use your own SSL sockets with any of the NetComponents classes, request browser capabilities in an applet before creating a socket, and other customizations dependent on the ability to control the Socket creation process. o added setRemoteVerificationEnabled(boolean) and isRemoteVerificationEnabled()methods to FTPClient and RExecClient so that you may disable the host-based incoming connection security check when behind a proxy or firewall. o Fixed a bug in com.oroinc.net.tftp.TFTPRequestPacket whereby the TFTPRequestPacket(int, DatagramPacket) constructor would not properly parse out the transfer mode. This was only an issue for people writing TFTP servers using the TFTP package. o Implemented setting of FTPFile raw listing so that getRawListing() will no longer just return null. At some point after changing DefaultFTPListPaser, the raw listing of FTPFile was no longer being set. This error is now corrected. o Removed the final keyword from the declaration of FTPClient, NNTPClient, SMTPClient, POP3Client, and TFTPClient so that programmers may derive subclasses rather than use aggregation to extend functionality. version 1.3.5 o Added ProtocolCommandEvent, ProtocolCommandListener, and ProtocolCommandSupport classes to com.oroinc.net to facilitate the interception of command/reply traffic from protocols that rely on text commands, including FTP, SMTP, NNTP, and POP3. Some of the example programs, including ftp.java and mail.java demonstrate how to register a ProtocolCommandListener, using the example PrintCommandListener class. o Modified reply parsing code in SMTP, FTP, and NNTP classes to handle server replies consisting of only a 3 digit reply code. The various RFC's are ambiguous as to whether these kinds of replies are legal, but since some servers produce them, NetComponents will handle them. o Made com.oroinc.net.ftp.FTPFile implement the Serializable interface so that the NetComponents Pro FTP bean may be properly serialized. version 1.3 o Added com.oroinc.net.bsd package which includes new RExecClient, RCommandClient, and RLoginClient classes which implement BSD Unix rexec(), rcmd() (rshell), and rlogin functionality. o Added rexec.java, rshell.java, and rlogin.java example programs o Common reader/writer thread behavior shared by weatherTelnet, rexec, rshell, and rlogin examples moved into IOUtil class in examples directory. o Added verifyRemote() convenience method to SocketClient for making it easier to verify that the remote end of a socket is the same as the host the SocketClient is connected to. This is used for verifying things like rexec() error stream connections and FTP data connections. o Enhanced performance of DefaultFTPFileListParser and also made it better able to handle unusual variations of the "default" listing format. This was prompted by not being able to list an ftp site that had the following entry: drwxrwsr-x1170 18280 25051 34304 Jan 31 22:36 faq There was no whitespace between the permissions field and the hard link count. The new parser can deal with this situation. version 1.2.6 Fixed bug in SimpleSMTPHeader which would add an extra blank line between headers added with addHeaderField() and the default headers from the constructor. version 1.2.5 o Due to developer requests, changed the behavior of FTPClient enterLocalPassiveMode(). Up to now, enterLocalPassiveMode() would issue a PASV command to the server immediately, and you would have to call enterLocalPassiveMode manually before every file transfer or other operation requiring a data connection. Now enterLocalPassiveMode() has been changed to not issue a PASV command to the server immediately. If you wish to do this, you should use the pasv() command in the FTP class. Now you only have to call enterLocalPassiveMode() once, and from then on FTPClient will automatically issue PASV commands to the server before opening a data connection. To return to normal mode, you only have to call enterLocalActiveMode(). Because of this change, enterLocalPassiveMode() now is of type void and doesn't throw any exceptions. You may have to make some changes to existing code. Additionally, getPassiveHost() and getPassivePort() now only return valid data AFTER the first data connection has been established in passive mode since enterLocalPassiveMode() no longer issues a PASV command immediately, but rather causes PASV commands to be automatically sent before the opening of all future data connections. o Added CopyStreamEvent, CopyStreamListener, and CopyStreamAdapter support classes that are required by NetComponents Pro to track the progress of file transfer operations using the Util copyStream() methods. o Changed com.oroinc.io.Util copyStream and copyReader methods to return a long value instead of int for number of bytes copied. This was previously reported to have been done for version 1.2.3, but the change really hadn't been made. o Added com.oroinc.io.CopyStreamException and changed changed com.oroinc.io.Util copyStream and copyReader methods to throw CopyStreamException. CopyStreamException stores the number of bytes confirmed to have been transferred before the throwing of an IOException. It also stores the original IOException responsible for the failure of a complete copy. o storeFile, retrieveFile, appendFile, and storeUniqueFile in FTPClient now can also throw a CopyStreamException. No changes in existing code are necessary since CopyStreamException is a subclass of IOException. The only point in doing this is so that you may retrieve the number of bytes transferred before failure. o Relaxed the multi-line reply parsing code in the FTP class to handle non-conformant FTP servers. For example, the FTP server running on ftp.funet.fi ends a 426 multi-line reply with a line starting with 226 rather than 426. Previously this would cause the FTP and FTPClient classes to block indefinitely waiting for the correctly formatted multi-line reply ending. This was further complicated by the fact that the multi-line reply ending detection was already relaxed to handle other non-conformant FTP servers. Right now all deviations from RFC 959 that we have encountered are handled. o Changed write(byte b[], int offset, int length) in SocketOutputStream and FromNetASCIIOutputStream to bypass the equivalent method in FilterOutputStream because the FilterOutputStream method is very inefficient. The change was made after noticing that FTP file uploads were noticeably slower than downloads and tracing the bottleneck to FilterOutputStream. o Adjusted DefaultFTPFileLister to handle block and character device listings which include major and minor device numbers. version 1.2.4 o Included class files in a jar file called NetComponents.jar so that Macintosh developers may use the classes without problems resulting from the MacOS 32 character filename limit. o Adjusted ftp.java example to be more correct. Added a call to ftp.quit() in case of login failure rather than disconnecting outright. It is more polite to send the FTP QUIT command to the server before disconnecting. o Fixed bug in a support class for TelnetClient that could cause deadlock in unusual cases. For example, if FTPClient tried to call disconnect() without calling quit() first, deadlock could have happened in the past because the TelnetClient input stream reader thread would be blocked holding a lock on the stream when trying to read while the thread calling disconnect() would be trying to close the stream, blocking while trying to acquire the lock. The correct solution was to not make the close synchronized. version 1.2.3 o Reimplemented workaround for Linux JDK bug. It turns out that users of Solaris x86, FreeBSD, and other x86 Unix implementations using a port of the Sun JDK may be experiencing the same bug. We finally got to the root of the problem and provided a new workaround which doesn't break anything, unlike our previous workaround. You should remove the old workaround if installed and use the new one. o TelnetClient spawns a thread to handle asynchronous events. Fixed a bug where the priority assigned to that thread might be invalid in some cases. o Changed FTPFile getSize() and setSize() methods to return and accept a long value respectively instead of an int to accomodate very large file sizes. o Slightly improved performance of DefaultFTPListParser so very large directory listings will be parsed more quickly. version 1.2.2 o Fixed small bug in DefaultFTPListParser which would truncate the last letter of a filename that contained spaces and also the last letter of the value stored for FTPFile getSymbolicLink() o Corrected the comment of server2serverFTP.java example to reflect that the second host argument should be the host running the program in most cases. o Made an additional fix to InetAddress for BlackDown Linux JDK users. Our workaround fix for the Linux bug had caused an additional problem when InetAddress.getByName() was used, which would break some of the example programs on Linux. version 1.2.1 o Fixed small bug in DefaultFTPListParser which would set the year in the date of FTPFile to a year earlier for some files depending on the FTP server. The year should always be correct now. version 1.2 o Added the SMTP package and mail.java example o Minor performance improvements in FTP, NNTP, and POP3 packages version 1.1.1 o Added some robustness features to FTP, NNTP, and POP3 classes. Specifically, added more lenient handling of malformed server replies and worked around a bug/limitation of the BufferedReader readLine() method. There are enough RFC non-compliant servers out there that it was necessary to try to accommodate them as best as possible. version 1.1 o Added com.oroinc.net.nntp NNTP package. See the new newsgroup.java and post.java examples as well as API documentation. o Added com.oroinc.net.MalformedServerReplyException which most of the IETF protocol client classes will throw when receiving uninterpretable replies from the server. The exception is a subclass of IOException, and therefore does not require you to change existing code. However, if you are trying to develop a robust fault-tolerant application, you will want to test for this exception so your program can recover from the error. o Removed com.oroinc.net.pop3.POP3MessageReader and replaced with the more general com.oroinc.io.DotTerminatedMessageReader. Code written using version 1.0 that specifically refers to POP3MessageReader must be changed. o Added com.oroinc.io.DotTerminatedMessageWriter which is used by the NNTP and SMTP packages o Restructured telnet package. TelnetClient is no longer usable as an active object. You interact with it solely through its input and output streams. The inner classes that caused problems on the Microsoft Java SDK have been removed. See new weatherTelnet example to see how to use the telnet functionality. o Added setting of timeouts to example programs o Added setDataTimeout method to FTPClient so that the timeout on a data connection can be set. o Added com.oroinc.ftp.FTPConnectionClosedException which is now thrown by FTP command methods if an FTP 421 reply (service not available, connection closed) is received in a reply. This exception is a subclass of IOException and consequently will not break any existing code. However, you may now specifically catch FTPConnectionClosedException to detect a server disconnect caused by client idle activity or some other reason. o Added pluggable FTP file listing parser. You can now subclass FTPFile and provide your own implementation of the FTPFileListParser interface to parse unique file listing formats. The new class DefaultFTPFileListParser provides a default implementation compatible with most FTP server listing formats. Also changed the default list parser to handle the common "total xx" listing prefix in non-English servers (essentially, any single-line listing prefix is now accepted). o Significantly changed FingerClient and WhoisClient. FingerClient now subclasses SocketClient and WhoisClient subclasses FingerClient. This makes the classes more flexible and consistent with the rest of the package. It will break old code, but the necessary code changes are very easy to make. See finger.java and fwhois.java examples and compare to old. o Removed _getInputStream_() and _getOutputStream_() protected methods from SocketClient. They are superfluous. Instead, customization of connection streams should be peformed in _connectAction_(). version 1.0.1 o retrieveFileStream was inadvertently left out of com.oroinc.net.ftp.FTPClient and its javadoc comments were listed for storeFile in version 1.0. This has been fixed. retrieveFileStream is back in version 1.0.1 and the comments are correct. o The documentation for listFiles and listNames was in error in version 1.0. These methods return null if no files are found. The original documentation erroneously stated that a zero length array would be returned for an empty directory. The documentation has been changed in 1.0.1 to reflect the actual behavior, which is to return null.