New Features as of version 1.03 Augmented prettyPrint routine in C++ and Python to be able to change the indentation: old interfaces are still the same, we've just added a new default parameter (how far in to indent). Cleaned-up and fixed a few minor bugs. Added tests as well. Augmented prettyPrintOpal routine in C++ to be able to change the indentation (like prettyPrint above, except for OpalTables). Oversight: Added close method to the C++ version of MidasTalker and MidasServer (just aliases for cleanUp) Python/C++: Made it so the "open" on the MidasTalker/Server/Listener/Yeller really does pay attention to the timeout value passed in (before it was sort of awkwardedly put in on the DUAL/SINGLE negotiation): This requires using non-blocking I/O on the socket. This shouldn't break anyone; it simply fixes the open so it works correctly with a timeout. (Had trouble with Python 2.2, so Python 2.2 doesn't support this feature). Python: When Midas* socket components throw exceptions, they now throw more informative exceptions: they all still inherit from the same base (socket.error) so no old code will have to change, but anyone who wishes to catch more informative exceptions can. The open can return a socket.gaierror, herror, or timeout (as used by the socket module). The midastalker_ex2.py shows how you may reconsider these errors (and codes around them for Python2.2). C++: When the Midas* socket components throw exceptions, there is a simple new hierarchy: timeout, gaierror, herror all inheriting from runtime_error. This corresponds to Python exceptions. Note that since they all inherit from runtime_error, there are no backward compatibility concerns as they originally threw runtime_error. To see sample usage of the new hierarchy, take a look at midastalker_ex2.cc In MidasServer (both Python and C++), a *broken pipe* would cause the main thread to exit, thus aborting the MidasServer. Fixed by catching the exception with the broken pipe. dataReady_ in MidasSocket (C++/Python) needs to throw an exception when passed a closed file descriptor Added the ability of the OpenContainers to set automatically the OC_BYTES_IN_POINTER and OC_LONGINT_IS_64BIT so the user doesn't have to worry about it. This caused a few minor ripples, but most handled easily. In general, this makes it easy for a new user to get on board: we figure this out for the user at compile-time so they don't have to. Updated the X-Midas option tree build flags so it doesn't need to set OC_BYTES_IN_POINTER/OC_LONGINT_IS_64BIT etc. anymore. This allows us to simplify the cfg scripts as well as get rid of the LINUX_BYTES in the build script. Also made it so the oc_port uses the X-Midas typedefs. New OpenContainers changes: Tab has a method called "get" which is like Python's dict get, where you lookup a key, and if it is not in there, it returns a default value instead without modifying the Table. Tab t; cout << t.get("not there", None); // outputs None, default value Tests were added. Added a new global method called "MakeTabInPlace" which will force a Val to be a Tab, no matter what it is. It is an inplace operation. If the Val is a Tab, no change. Otherwise, it creates a Table with a single key: "VALUE" with the new Value. Note that is a constant time operation, as no linear copies are made. A new test was created. Also added "MakeTab" which always returns a Tab from a Val (similarly). Testing with X-Midas 4.6.0, 4.4.4 with 32-bit and 64-bit. Minor Testing with OSF1. Testing with RedHat Enterprise 4 and 5.