Changes since version 3.1.3
---------------------------

- The compiler options for the DEC C++ compiler have been updated for
  6.2. 

- Added a workaround for getting rid of annoying GCC 2.95 warning
  messages like: "choosing `CORBA_String_var::operator char *&()' over
  `CORBA_String_var::operator const char *() const' for conversion
  from `CORBA_String_var' to `const char *' because conversion
  sequence for the argument is better".

- A new property ooc.orb.raise_dii_exceptions has been added for
  consistency with ORBacus for Java. If this property is set to true,
  then system exceptions that occur during DII operations (e.g.,
  CORBA_Request::invoke) will be stored in the CORBA_Environment
  object and raised immediately thereafter. If set to false, system
  exceptions will only be stored in CORBA_Environment and will not be
  raised. The default value is false, which produces behavior that is
  backward-compatible with previous ORBacus releases.

- The OCI_Current_impl singleton is now destroyed upon program exit.

- The RegUpdate utility is now installed under Win32.

- Added a new flag `OPTIMIZE' to Make.rules.mak. Setting the value of
  this flag to `yes' compiles the distribution with optimization enabled,
  and debug information disabled.

- Separate debug database files (pdb) are now created for each
  library. These .pdb files are installed into the library
  installation directory.

- Under Win32 a batch mode inference rule for compilation is now
  used. This results in faster build times.

- A third template parameter has been added to the OBHashtable
  class. This defines how the hashtable is internally synchronized.

- Operations on Context now raise exceptions as specified in the
  latest CORBA specification.

- The latest CORBA specification clarifies that the parameter to
  ORB::create_list() is not the number of empty elements to create,
  but only a "hint" for how many elements the user intends to create
  later (with operations such as add_item()). ORBacus has been changed
  to reflect this.

- Fixed a bug with CRLF line endings in hidl and ridl.

- The following IDL caused an assertion:

    union U switch(short)
    {
    default:
    case 0:  boolean b;
    };

  This has been fixed.

- Calling ORB::string_to_object with an unrecognized or invalid
  stringified object reference raises a CORBA::BAD_PARAM exception
  instead of a CORBA::INV_OBJREF exception.

- For improved conformance with the INS specification, connecting a
  named object to the ORB also connects the object with another
  object-key which is the string name without the terminating '\0'
  character.

- Added support for INS iiopname:// and iioploc:// object URLs.
  URLs can contain multiple addresses, but ORBacus only uses the
  first address.

- Added support for the command-line options -ORBInitRef and
  -ORBDefaultInitRef as defined by the INS. Initial references can
  also be defined using the existing ooc.service configuration
  property, and a new property, ooc.orb.default_init_ref, was added.

- The IOR: prefix for stringified IORs is now case insensitive.

- The iiop:// URL prefix is now fully case insensitive.

- Added workaround for HPUX 11 broken h_errno declaration.

- Servers now reliably transmit a CloseConnection message to the
  client on connection shutdown, in all possible concurrency model
  combinations. As a result, clients will now get a TRANSIENT
  exception upon server shutdown (i.e., when the server calls
  deactivate_impl() on the BOA), and not a COMM_FAILURE anymore.

- The OCI shutdown() operations have been renamed to
  unblock_threads(), since this name better describes what these
  operations are supposed to do. The old name shutdown() was
  misleading, since protocol plug-ins are free to choose whatever
  means necessary to unblock blocking threads. Using Berkeley Sockets'
  shutdown() is just one variant, which does not exist in a Java
  environment, for example.

- The OCI operations unblock_threads() and close() for Transport
  objects now have a boolean "discard" parameter. If set to TRUE,
  protocol plug-ins are allowed to discard unsent data buffered by the
  transport.

- Added a workaround for broken non-blocking connect() under Win32.

- The ORBacus test suite used to fail with the following error message
  when egcs or gcc was used along with optimization (i.e., with -O):
  
	Testing any type... Failed!
	Reason: ( (*vp)[i] == d ) == false
	File: TestAny.cpp
	Line: 334
	Aborted

  This has been fixed. The ORBacus test suite works fine now with
  egcs/gcc and optimization.

- Under Windows, shutting down the ORB used to block under certain
  conditions. This has been fixed.

- Fixed bug with OBGIOPServerStarterThreaded::starterRun. If the
  OBGIOPServerWorkerThreaded constructor threw a JTCException then the
  transport was not destroyed.

- Fixed bug with OBGIOPServerWorkerThreaded constructor. If the thread
  creation failed then the reference count was not set to zero.

- Fixed bug with TypeCode indirection.

- Fixed concurrency problem with constant typecodes.

- CORBA::Contained::absolute_name() now returns absolute names with a
  leading "::".

- Added checks for version mismatch.

- The C++ keyword "export" was added to the list of reserved keywords
  for the IDL-to-C++ code generator.

- Any::operator=() can now be used to assign anys that have a type but
  no value.

- `#pragma prefix ""' now resets the prefix to nothing instead of to
  `/'.

- Fixed the dispatchOneEvent() in the Reactors. It was possible that
  true was returned even though no event was processed.

- Fixes for compiling on 64 bit Irix and Solaris systems.

- Fixed an IDL parser bug with #pragma version.

- The --file-list option can now handle multiple IDL files.

- Fixed concurrency bug in GIOPServerWorker.

- Added maximum() for bounded sequences.

Changes since version 3.1.2
---------------------------

- Fixed a bug with a wrong preprocessor macro in OCI_IIOP_impl.cpp.

- Fixed OB::ReconnectPolicy, so that "at most once" semantics is now
  also guaranteed if this policy is set.

- Added const version of operator->() to _var types.

- Fixed a bug that caused the option --output-dir to affect #include
  directives in generated files.

- A new option --file-list has been added to idl and jidl, creating a
  list of all generated files.

- A more detailed error message is now displayed if the preprocessor
  idlcpp is not found.

- idl, jidl, hidl, ridl, irdel, irfeed, and irserv now accept wildcard
  arguments also under Windows, e.g., `jidl *.idl'.

- A new option --ignore-case has been added to hidl and ridl, causing
  symbols to be sorted case-insensitive.

- Bug fix in DynAny::insert_string(): It's now also possible to insert
  strings if if the DynAny TypeCode is for a string alias.

Changes since version 3.1.1
---------------------------

- Fixed a scoping bug with union labels for unions with an enum as
  discriminator type.

- Added 'typename' keyword to HashtableI.h to fix a compiler error
  on HP/UX.

- Fixed a bug in all reactors (SelectReactor, WinReactor, and
  X11Reactor), and improved reactor performance.

- Fixed a bug with OCI::Connector::connect_timeout() under Win32.

- The "identifier" argument to CORBA::Contained::move() used to be
  interpreted as repository id, and not as name. This has been fixed.

- Added missing orb.idl.

- Fixed a problem with the unmarshalling of indirect typecodes.

- BOA::obj_is_ready() and BOA::deactivate_obj() are now
  implemented. obj_is_ready() calls connect(), and deactivate_obj()
  calls disconnect().

- Non-CORBA exceptions thrown in servant implementation now display
  more error information.

- Fixed bug where IDL expressions involving short and unsigned short
  would cause errors in the IDL translators.

- Fixed a bug in marshalling a union TypeCode with a default member.
  Previously, ORBacus was always marshalling an octet, which could
  cause subtle interoperability problems for certain union types. Now
  it correctly marshals a dummy value of the discriminator type. Note
  that this fix may cause interoperability problems with previous
  versions of ORBacus.

- Using a parameter name more than once within the same operation
  definition now causes an error.

- Exceptions derived from UserException didn't implement the _raise()
  method, causing slicing.
  
- Added NTService.h, so that ORBacus servers can be used as native NT
  services.

- Under Win32, Properties will now be loaded from the registry, first
  from HKEY_LOCAL_MACHINE\Software\OOC\Properties, and then from
  HKEY_CURRENT_USER\Software\OOC\Properties.

- DynAny::insert_string() can now also be used to insert bounded
  strings.

- Improved comment tag handling for HIDL and RIDL.

- Fixed a bug in DynAny::to_any() in which the TypeCode of the
  returned Any did not exactly match that of the DynAny object. The
  Any::type() modifier (defined in CORBA 2.3) was added to enable the
  fix.

- Modified TypeCode::equal() to adhere to the specification. In
  particular, it now ignores names and only compares repository IDs
  when necessary.

- Fixed a bug with empty string constants in the IDL translators.

- Fixed bug in OCI_IIOP_Acceptor_impl::listen. If ::listen failed then
  the reference count was set to zero.

- Fixed bug in the OBGIOPServerStarter constructor. If the
  acceptor_->listen() call failed, then the reference count was not
  set to zero.

- Added support for Solaris 2.6. If listen is interrupted then it is
  retried.

- Fixed bug with CORBA_BOA::get_connected_servants.

- Updated README.W95 and README.WINDOWS.

- Bounded string constants are now legal.

- Fixed an IDL parser bug with #pragma id and #pragma version.

- Added a new version of the "ROYALTY-FREE PUBLIC LICENSE AGREEMENT
  FOR ORBACUS SOFTWARE", which clarifies that commercial in-house use
  is also considered commercial use and thus not covered by the
  license agreement.

Changes since version 3.1
-------------------------

- Fixed a bug in the handling of OB::ProtocolPolicy.

- "union uni switch(short) { case 1 : default : long value; };" caused
  an assert in the IDL translators. This has been fixed.

- Fixed the configure script for IRIX, so that now no explicit
  -L/usr/lib is added to the X11 chat client link line.

- Added OCI::Connector::connect_timeout().

- Optimized method lookup in generated skeleton code. The code now
  uses a binary search of the method names instead of a linear
  comparison.

- Fixed a bug in CORBA_Object_skel. A remote request for
  _get_implementation didn't return a CORBA::ImplementationDef, it
  returned a CORBA::InterfaceDef.

- Optimized OBRefCount class under both Win32 and UNIX.

- Fixed a bug in OBClient::decUsage().

- The IR server now ensures that it is ready to accept connection
  requests before displaying its IOR.

- Added `fork' and `random' demo. See ob/demo/fork and ob/demo/random
  for more info.

- Added new option --output-dir to IDL and IRGEN.

- Fixed a bug with sequences of bounded octet/char/boolean sequences.

- Replaced ObjectHash with Hashtable. This hashtable auto-resizes.

- Optimized CORBA_BOA::disconnect.

Changes since version 3.1b1
---------------------------

- Changed JIDL to generate Helper classes that are compatible with
  Netscape.  This fixes the MARSHAL exception that can be raised
  when OB classes are used with Netscape's built-in ORB.

- Fixed bugs in IDL and JIDL when using language keywords as operation
  parameter names.

- Removed a wrong assert() from GIOPClientWorker.cpp and another wrong
  assert from GIOPServerWorker.cpp.

- Fixed a bug with sequence< sequence< octet > >.

- Added the OB_DEC_TRY_FIX macro to work around a bug in the DEC C++
  compiler. See README.DEC for more info.

- The -OAthread_pool options works again.

- Fixed a typo in ORBPolicyManager_impl.h.

- Fixed a bug in CORBA_Container_impl::describe_contents().

- OCI changes: The compare() functions have been replaced by equivalent(),
  is_local() and is_usable().

Changes since version 3.0.1
---------------------------

- Added support for properties. This allows the user to configure
  various ORB and BOA parameters.

- The path to the ORBacus configuration file can be set in an environment
  variable ORBACUS_CONFIG.

- Added the method sequence<Object> get_connected_servants() to the
  BOA, which can be used to return a sequence of all connected
  servants.

- The BOA now uses a hash table instead of an array for implementation
  class lookup for method dispatch. The following method can be used
  for displaying hash table statistics:

  void CORBA_BOA::display_stats(ostream&)

- Fixed marshaling problems CORBA::INV_POLICY. Added test to test suite.

- Added -ORBtrace_level and some connection tracing at level 1.

- GIOP close connection messages are now handled correctly.

- Removed support for GNU C++ 2.7.2 due to the broken exception
  handling in this compiler version. (GNU C++ 2.8.x or EGCS should be
  used instead.)

- Fixed bug with named objects. Attempting to use an empty string for
  an object name will cause a BAD_PARAM exception to be thrown.

- Non-named objects now get unique keys. The unique key is now
  0 + tv_sec + tv_usec + running_count. This increases the length
  of the key from 8 to 16 bytes.

- Added new policies OB::TimeoutPolicy, OB::ReconnectPolicy,
  OB::ProtocolPolicy.

- Renamed constant OB::CONNECTION_REUSE to OB::CONNECTION_REUSE_POLICY.

- Renamed ConnectionReusePolicy attribute reuseConnection to value.

- Renamed ConnectionPolicy attribute connect_policy to value.

- Threads blocking in send() or recv() are now interrupted.

- Added a usage counter to the Client class, so that connections from
  a client to a server are now destroyed when the last proxy using
  that connection is destroyed.

- Modified irfeed and irgen to use the InterfaceRepository initial
  reference and not an IOR on the command line.

- The interface repository server will start on the default
  InterfaceRepository port if the initial reference has been provided.

- A warning message is now displayed in case hostname lookup returns
  "localhost" or "127.0.0.1".

- Host lookup failures with gethostbyname() were able to crash ORBacus
  applications. This has been fixed.

- Added the option --no-virtual-inheritance to the IDL-to-C++
  translator.

- Non-CORBA exceptions thrown in servant implementation code is now
  translated to CORBA::UNKNOWN.

- The IDL-to-Java translator now uses UnknownUserException.except
  instead of UnknownUserException.exception().

Changes since version 3.0
-------------------------

- Changed HANDLE to HINSTANCE in WinReactor.h and WinReactor.cpp.

- The following rule from CORBA 2.2, page 3-36 now works correctly:
  "Two shadow copies of the same original (as results from the diamond
  shape in Figure 3-1 on page 3-17) introduce a single name into the
  derived interface and don't conflict with each other."

- Fixed a bug in the IDL-to-Java translator narrow code generation.

- The constructors of stub classes are now protected.

- The following code caused an assertion:

  union X switch (long)
  {
  case 1: sequence<X> a;
  case 2: sequence<X,1> b;
  };

  This has been fixed.

- Fixed a bug in the unmarshal code generation for unions with
  implicit default value.

- "CORBA::TypeCode" and "CORBA::Principal" now must be used in IDL
  definitions instead of just "TypeCode" and "Principal". (This does
  of course not apply to "TypeCode" and "Principal" used within the
  CORBA module.)

- The following IDL didn't compile:

  interface A { };
  typedef A B;
  interface C : B { };

  This has been fixed.

- It's now guaranteed that Object::_is_equivalent() fails if applied
  to two references for which Object::_hash() returns different hash
  values.

- Fixed several minor bugs in the IDL parser that caused some special
  cases of buggy IDL code to be accepted.

- Changed the interface repository to have a default name
  `DefaultRepository'.

- Made system calls signal safe. If a system call is interrupted it
  will be restarted.

Changes since version 3.0b1
---------------------------

- Portnumbers smaller than 1024 are now also allowed.

- A problem was fixed where, if using the thread pool concurrency
  model, for each newly connected client a new thread pool was created.

- Skeletons now have a pure virtual method for each operation from the
  corresponding IDL interface so that the C++ compiler complains in
  case that not all operations are implemented in the servant class
  derived from the skeleton class.

- Removed bogus method void CORBA_Any::operator<<=(char *).

- Added ORB::add_initial_reference.

- Added support for DEC OSF/1 V4.0 with DEC C++ 6.0-010.

- Added the ability to generate a clone() method for struct, union,
  enum and exception types in the IDL-to-Java translator.

- Fixed #pragma prefix scope bug.

- Fixed a bug in BOA::disconnect() and in the BOA destructor.

- Added support for tie classes to the IDL-to-Java translator.

- Fixed termination bug in demo/perf/simple and demo/perf/nested.

- Some fixes in the IDL-to-RTF translator.

- The IDL translator allowed identifiers to only differ in case. This
  has been fixed.

- Added ConFactoryInfo interface. With this change connection
  callbacks are now symmetrical with acceptor callbacks.

- The OCI accept and connect callbacks can now raise a NO_PERMISSION
  exception.

- Removed the call_..._cb() operations from the OCI info object
  specification, since these operations are ORBacus internal.

- Fixed OCI info object lifetime bug.

- Added OCI close callbacks.

- The following IDL code caused an assertion failure:
  
  struct S { sequence<S> a; sequence<S> b; };

  This has been fixed.

- Fixed a bug in OBBuffer::realloc().

- Removed "hostname is a domainless name ..." warning.
