# HUPnP Changelog

HUPnP 1.0.0 [Mar. 28, 2011]
--------------------------------------------------------------------------------
- Added support for adding a new root device into HDeviceHost instance after 
the instance is initialized.

- Fixed a possible crash bug in device host.

- Fixed a possible crash bug relating to HControlPoint::quit().

- Fixed HDeviceHost::quit() to clear the state appropriately.
 
- Reorganized parts of the project structure and restructured some of the project files.
    
- Modified the build to check if the qmake's CONFIG variable contains 
USE_QT_INSTALL_LOC flag and if so, install HUPnP headers to QT_INSTALL_HEADERS 
and binaries to QT_INSTALL_LIBS.
    
- Did some small improvements and modifications not worth mentioning individually.
  
- Updated documentation.

Special thanks to Maximilian Lang <Lang@kellendonk.de> and Jaroslav Reznik 
<jreznik@redhat.com> for reporting their ideas and findings to me. Much appreciated.

HUPnP 0.9.1 [Feb. 23, 2011]
--------------------------------------------------------------------------------
- Modified the main project file to check if the qmake's CONFIG parameter contains:
  * DISABLE_QTSOAP, in which case qtsoap is not built,
  * DISABLE_CORE, in which case the hupnp core is not built or
  * DISABLE_TESTAPP, in which case the simple test app is not built.
  
- Updated the copyright statements to include the year 2011.

- Added macros detailing the API version and a function for querying the library version at runtime.

- Removed an unimplemented member function declaration from HProductToken.

- Added equality operators to HServiceSetup and HServicesSetupData classes.

- Updated documentation.

Special thanks to Nikhil Marathe <nsm.nikhil@gmail.com> and Jaroslav Reznik <jreznik@redhat.com> for reporting their ideas and findings to me. Much appreciated.   

HUPnP 0.9.0 [Feb. 1, 2011]
--------------------------------------------------------------------------------
- Modified the client side action invocation and the signaling of action completion to use clearer and more extensible API.

- Modified the HActionArgument class to use explicit sharing, which enabled the HActionArguments class to take in and return instances of HActionArgument, rather than pointers to them.

- Added the possibility to replace the implementation of HServerService::createActionInvokes() with the use of Qt's Meta Object system. That is, HUPnP can now do the mapping of action names to HActionInvoke objects automatically, if the desired methods use the Q_INVOKABLE macro. See the documentation for more details.

- Added convenience methods to HClientService and HServerService for retrieving the value of a state variable. HServerService also has a convenience method for setting the value of a state variable.

- Fixed the HControlPoint to properly relay UPnP action error codes to the user.

- Fixed the HDeviceHost to send proper error codes to control points when action invocation fails.

- Fixed HControlPoint::quit() to properly clean its state as it was supposed to do.

- Fixed a logic error in the handling of client side action invocations.

- Removed a link-time dependency to QtGui library. The dependency to QtGui was in the QtSoap library that is currently included with HUPnP.

- Modified error handling and reporting of the description document parser to be clearer and more thorough.

- Modified the description document parser at client-side to ignore the error of missing the <specVersion> element. This was done to improve interoperability with other UPnP software.

Special thanks to Nikhil Marathe <nsm.nikhil@gmail.com> and Yury G. Kudryashov <urkud.urkud@gmail.com> for reporting their findings to me. Much appreciated. 

HUPnP 0.8.0 [Dec 19, 2010]
--------------------------------------------------------------------------------
- Separated the client-side and server-side to use their own device model types.
For example, there's now HClientDevice and HServerDevice in place of HDevice.

- Fine tuned the device model types for their purposes more precisely.
For instance, server-side action type does not have asynchronous invocation API and client-side 
action types does not have synchronous invocation API anymore.

- Removed the possibility for the user to plug-in client-side device model classes.

- Decoupled the "type creation" and "setup data" API away from the device model 
components to their own types (HDeviceModelCreator and HDeviceModelInfoProvider).

- Modified the client-side action invocation semantics to send the "results" 
directly through the specified callback or the invokeComplete() signal.

- Moved the UPnP action return codes directly to Herqq::Upnp namespace.

- Modified the HControlPoint and HDeviceHost to run in a single thread only.

- Removed exceptions from HUPnP altogether.

- Removed the dependency to QtGui library by replacing the use of QImage with 
QByteArray. QImage was used to store icon data. 

- Replaced the internal use of QHttpHeader, QHttpRequestHeader and QHttpResponseHeader 
with similar custom classes.

- Added convenience methods to HActionArguments for getting and setting a state 
variable value safely.

- Fixed a few bugs in HTTP header parsing.

- Fixed a few memory leaks.

- Fixed several errors in the project files and added the possibility to define the
install location of HUPnP.

- Did various optimizations that improve speed and decrease the memory foot print.

- Fixed a problem with QtCreator's "shadow build feature" that caused the launch of 
SimpleTestApp's HTestDevice to fail, as the required description documents could not be found.

- Did internal refactoring in various places.

- Did code cleansing and a number of general improvements not worth mentioning individually.
 
- Updated documentation.

Special thanks to Jukka Kinnunen <kinnujuk@gmail.com> and 
Joćo Xavier <smogzer@gmail.com> for reporting their findings to me.
Much appreciated. 

HUPnP 0.7.0 [Oct 6, 2010]
--------------------------------------------------------------------------------
- Added classes for setting up each component of the device model. 
See the reference documentation about the device model creation for more details.

- Modified the structure and contents of the "include" directory and 
added the possibility to "deploy" the built binaries and public headers to a 
folder for easier deployment (using "make install").

- Introduced "information" classes for each core component of the device model. 
These classes contain static information read from description documents.

- Added the possibility to define whether HDeviceHost runs user code in a 
single or multiple threads.

- Added support for HTTP authentication during client-side action invocation.

- Added the possibility to execute action invocation in a "fire and forget" manner.

- Improved the extensibility of HControlPoint's and HDeviceHost's configuration 
classes.

- Modified the HActionArgument and HActionArguments to use value-semantics in full.

- Modified the access modifiers of several methods in the components of the 
device model to improve extensibility.

- Modified the HAction's generic error codes to use an enumeration rather 
than static member functions.

- Unified some of the names of similar methods amongst device model components.

- Removed the use of Qt's event dispatcher from HControlPoint and HDeviceHost.

- Prefixed the include directives to Qt headers in public HUPnP header files to 
include the Qt module name.

- Fixed a bug, which exposed a few private exception classes to public interface. 
HUPnP should not expose exceptions into the public interface anymore.

- Fixed several bugs in event handling, action invocation and component 
initialization that could  have caused dead-lock situations.

- Fixed a possible crash bug in generation of a SOAP error message.

- Fixed a bug in service description parse code in relation to allowed value ranges.

- Fixed a possible crash bug in client-side action invocation.

- Fixed a possible crash bug in the shutdown of a control point and device host.

- Fixed a bug in generic HTTP messaging related to handling packets that lack 
the "content-length" header.

- Modified build settings to enable the Qt Creator's "shadow build" feature.

- Did internal refactoring in various places.

- Many small optimizations, code cleansing and general improvements not worth 
mentioning individually. 

- Updated documentation.

Special thanks to Nikhil Marathe <nsm.nikhil@gmail.com>, 
Sebastian Marek <s.marek@avm.de>, Jukka Kinnunen <kinnujuk@gmail.com> 
and Paulo Romulo <p.romuloo@gmail.com> for testing and using the library 
and reporting their findings and ideas to me. Much appreciated. 

HUPnP 0.6.0 [June 25, 2010]
--------------------------------------------------------------------------------
- License changed from GPLv3 to LGPLv3.

- Significant modifications to the HUPnP device model. See the reference documentation for more information.

- Added support for specifying the network interfaces to be used with the HUPnP hosting API.

- Added support for a unicast device discovery into the HControlPoint.

- Added various helper methods to some of the members of the device model and the hosting API.

- Added support for retrieving runtime status information of a HDeviceHost.

- Modified asynchronous action invocation to use a class named HAsyncOp to abstract 
the use of various input and output arguments controlling the execution and waiting of an asynchronous operation.

- Modified the usage semantics and the interface of HSsdp. See the reference documentation for more information.

- Modified the SSDP layer to send messages with the destination UDP port set to 0 to the port 1900.

- Renamed several classes and enumerations to improve clarity.

- Fixed a bug in HMulticastSocket relating to operations targeted at a multicast group using a specific network interface.

- Fixed a bug in the initialization of HControlPoint.

- Fixed a bug relating to client-side action invocation, which in certain error scenarios resulted in a null pointer dereference.

- Did internal refactoring in various places.

- Many small optimizations, code cleansing and general improvements not worth mentioning individually. 

- Updated documentation.

Special thanks to Nikhil Marathe <nsm.nikhil@gmail.com> for testing and using the library and reporting his findings to me. Much appreciated.
--------------------------------------------------------------------------------

HUPnP 0.5.0 [May 1, 2010]

The changes done between 0.4 and 0.5 were significant and the list below is far from complete. For much more information of what has been you can check the version control history.

- Major redesign of the hosting API. Both HControlPoint and HDeviceHost were changed notably in an attempt to add more power, configurability and extensibility to the classes.
  
- HDeviceHost and HControlPoint no longer expose the device trees (HUPnP device model) using QSharedPointer. Raw pointers are used instead.

- Modified the HControlPoint and HDeviceHost API regarding return values of various methods. Now methods signal failure with a boolean return value and the last error occurred can be checked with a separate call.

- Modified the design of action arguments. Input and output arguments are no longer separated at type-level.

- Did numerous modifications to improve interoperability with other UPnP software. Generally this meant lessening the strictness of HUPnP or making the level of strictness "configurable".

- Did significant changes to the SSDP layer. Mainly the changes were about cleaning the API and making it more powerful. However, the implementation was improved as well. The changes include several bug fixes and improve interoperability with other UPnP software.

- Event subscription at the control point now uses Qt event loop only (used threads before). This change is part of the plan of reducing worker thread usage to absolute minimum and attempting to utilize the Qt event loop as much as possible instead.

- Added proper support for MX wait time during discovery.

- Removed the 'T' postfix of certain type definitions, as it isn't part of the Qt's design conventions. Along with this change some type definitions were also renamed, such as HServicePtrList was changed to HServiceList and HDevicePtrList was changed to HDeviceList.

- Renamed the toReadable() and toWritable() methods in HStateVariable to readable() and writable() to better convey the semantics that new unrelated types are not created. 

- Fixed several bugs relating to URL handling.

- Fixed a possible null pointer dereference bug in HException.

- Fixed a few bugs in creation of event subscription messages.

- Fixed a few bugs in the HDeviceHost relating to UPnP event handling.

- Fixed a crash bug in the simple test app.

- Fixed a bug relating to multicast address check in HEndpoint.

- Fixed a few bugs in general HTTP messaging / handling.

- Various logging improvements.

- Did internal refactoring in various places.

- Removed insulation from several small classes that are unlikely to change.

- Many small optimizations, code cleansing and general improvements not worth mentioning individually.

- Updated documentation.

Special thanks to Bart Cerneels <bart.cerneels@kde.org>, Thiago Macieira, James Wa <jw@jameswa.com>, Nikhil Marathe <nsm.nikhil@gmail.com>, Jukka Kinnunen <jukka.kinnunen@tieto.com>, Simon Zsolt <zsolt.simon@tieto.com> and Pekka Turunen <pekka.m.turunen@tieto.com> for testing and using the library or otherwise checking it out, and reporting their findings to me. Much appreciated.

HUPnP 0.4.0 [Mar. 4, 2010]
- Modified the design of state variables and their use. More specifically, the API is now clear 
that state variables can be changed directly only at server-side.

- Added the possibility of locking a writable state variable for exclusive access at server-side.

- Modified the design of action arguments. Input and output arguments are no longer separated at type-level.

- Removed exception usage from HTTP messaging. This was mainly because of a MinGW bug (http://sourceforge.net/tracker/index.php?func=detail&aid=2837096&group_id=2435&atid=102435), which essentially causes multi-threaded exception usage be unsafe. Please note, HUPnP still uses exceptions elsewhere, which means that with MinGW 4.4.0 HUPnP is subject to crashes. The HUPnP HTTP messaging used exceptions to signal timeouts, peer disconnects and such, which made the bug all too easy to appear in case multiple threads were simultaneously running their own HUPnP HTTP messaging "engines". This is the case with the simple HUPnP test app, which enables the launch of a HDeviceHost and multiple HControlPoints within the same process using separate threads.

- Modified the server-side action invocation mechanics when the invocations come over the network.

- Modified the example application to use the state variable locker, which fixes a race condition.

- Fixed a few errors in internal HTTP messaging code. These mainly affected action invocation and
event notification.

- Modified the internal asynch. HTTP handler code to support chunked encoding.

- Removed insulation from a few small classes that are unlikely to change.

- Some small optimizations here and there.

- Updated documentation.

- Many smaller improvements not worth mentioning individually.

HUPnP 0.3.0 [Feb. 17, 2010]
- Significant refactoring of the project, file and class structures.

- Added a simple example application to be distributed along with HUPnP. The example demonstrates basic
HUPnP usage.

- Reduced thread usage by utilizing the Qt's eventloop more.

- Removed exceptions from the public interface. This affected HDeviceInfo + several classes in the
SSDP "module".

- Removed the HCore and HUtils libraries and moved their code directly into the HUpnp library.

- Modified the action invocation semantics. This changed the HAction interface as well.

- Modified the HControlPoint interface.

- Modified the initialization of HSsdp. This also meant a change to the interface.

- Fixed several memory leaks and memory access errors.

- Improved logging by feeding more information to the messages.

- Updated documentation.

- Many smaller improvements not worth mentioning individually.

HUPnP 0.2.0 [Feb. 2, 2010]
- Significant refactoring of the project, file and class structures.

- Fixed several bugs relating to URL handling in HDeviceHost and HControlPoint.

- Changed action invocation on the control point side to use persistent sockets.

- Fixed a bug in HStateVariable, which caused "allowed value ranges" to be parsed improperly.

- Fixed a bug in HDeviceHost, which caused the HDeviceHost to announce wrong cache-control max-age timeouts.

- Fixed a bug in HDeviceHost, which in a certain scenario caused a failure in transmission of an event NOTIFY message.

- Added support for enabling/disabling warning logs that relate to non-standard behaviour discovered
in other UPnP software.

- Updated documentation.

- Several other improvements not worth mentioning individually.

Special thanks goes to Jochen Becher <jochen_becher at gmx.de> for testing the library and reporting
of his findings. Some of the above-mentioned bugs were discovered due to his efforts. In addition, he
suggested the possibility of disabling warnings that relate to non-standard behaviour discovered in
other UPnP software. Thank you!

HUPnP 0.1.1 [Jan. 26, 2010]

- Added support for chunked encoding.

- Fixed several deficiences relating to action invocation error handling.

- Fixed a bug in HControlPoint where the HTTP Host header field was not always sent in a GET request. 
  * This was found by Jochen Becher <jochen_becher at gmx.de>. Thanks!

- Fixed a bug in HDeviceHost, which forced description documents to reside in the current directory to be found.

- Removed exception usage from "simple" classes in Ssdp module.

- A few small improvements not worth mentioning individually.

- Updated documentation.

- Created this change log.
