changeset 605:b82292ba2083 dicom-rt

integration mainline -> dicom-rt
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 17 Oct 2013 14:21:50 +0200
parents a482948c1fd6 (current diff) 49945044b06d (diff)
children 8cfc6119a5bd
files CMakeLists.txt Core/Toolbox.cpp OrthancServer/OrthancRestApi.cpp Resources/Samples/OrthancCppClient/Basic/CMakeLists.txt Resources/Samples/OrthancCppClient/Basic/main.cpp Resources/Samples/OrthancCppClient/OrthancCppClient.cmake Resources/Samples/OrthancCppClient/Vtk/CMakeLists.txt Resources/Samples/OrthancCppClient/Vtk/main.cpp Resources/Samples/RestApi/CMakeLists.txt Resources/Samples/RestApi/Sample.cpp Resources/Samples/RestApiLinuxDynamic/AutoGeneratedCode.cmake Resources/Samples/RestApiLinuxDynamic/CMakeLists.txt Resources/Samples/RestApiLinuxDynamic/README.txt Resources/Samples/RestApiLinuxDynamic/Sample.cpp Resources/sha1/Makefile Resources/sha1/Makefile.nt Resources/sha1/license.txt Resources/sha1/sha.cpp Resources/sha1/sha1.cpp Resources/sha1/sha1.h Resources/sha1/shacmp.cpp Resources/sha1/shatest.cpp UnitTests/main.cpp
diffstat 91 files changed, 7590 insertions(+), 2366 deletions(-) [+]
line wrap: on
line diff
--- a/AUTHORS	Wed Sep 04 14:19:14 2013 +0200
+++ b/AUTHORS	Thu Oct 17 14:21:50 2013 +0200
@@ -11,6 +11,19 @@
   Overall design and main developper.
 
 
+Client library
+--------------
+
+The client library of Orthanc is automatically wrapped from the C++
+code using the LAAW software. LAAW is the Lightweight, Automated API
+Wrapper from the Jomago team, that comes from the following authors:
+
+* Sebastien Jodogne <s.jodogne@gmail.com>
+* Alain Mazy <alain@mazy.be>
+* Benjamin Golinvaux <golinvauxb@gmail.com>
+
+LAAW should be soon released as a separate open-source project.
+
 
 Contributors
 ------------
--- a/CMakeLists.txt	Wed Sep 04 14:19:14 2013 +0200
+++ b/CMakeLists.txt	Thu Oct 17 14:21:50 2013 +0200
@@ -3,15 +3,19 @@
 project(Orthanc)
 
 # Version of the build, should always be "mainline" except in release branches
-add_definitions(
-  -DORTHANC_VERSION="mainline"
-  )
+set(ORTHANC_VERSION "mainline")
+
+
+#####################################################################
+## CMake parameters tunable at the command line
+#####################################################################
 
 # Parameters of the build
 SET(STATIC_BUILD ON CACHE BOOL "Static build of the third-party libraries (necessary for Windows)")
 SET(STANDALONE_BUILD ON CACHE BOOL "Standalone build (all the resources are embedded, necessary for releases)")
 SET(ENABLE_SSL ON CACHE BOOL "Include support for SSL")
 SET(BUILD_UNIT_TESTS ON CACHE BOOL "Build the unit tests")
+SET(BUILD_CLIENT_LIBRARY ON CACHE BOOL "Build the client library")
 SET(DCMTK_DICTIONARY_DIR "/usr/share/dcmtk" CACHE PATH "Directory containing the DCMTK dictionaries \"dicom.dic\" and \"private.dic\" (ignored in standalone builds)") 
 
 # Advanced parameters to fine-tune linking against system libraries
@@ -37,8 +41,17 @@
 include(${CMAKE_SOURCE_DIR}/Resources/CMake/DownloadPackage.cmake)
 include(${CMAKE_SOURCE_DIR}/Resources/CMake/Compiler.cmake)
 
+set(ORTHANC_ROOT ${CMAKE_SOURCE_DIR})
+
+
+
+
+#####################################################################
+## Inclusion of third-party dependencies
+#####################################################################
+
 # Configuration of the standalone builds
-if (${CMAKE_CROSSCOMPILING})
+if (CMAKE_CROSSCOMPILING)
   # Cross-compilation implies the standalone build
   SET(STANDALONE_BUILD ON)
 endif()
@@ -47,7 +60,6 @@
 SET(THIRD_PARTY_SOURCES
   ${CMAKE_SOURCE_DIR}/Resources/md5/md5.c
   ${CMAKE_SOURCE_DIR}/Resources/base64/base64.cpp
-  ${CMAKE_SOURCE_DIR}/Resources/sha1/sha1.cpp
   )
 
 include(${CMAKE_SOURCE_DIR}/Resources/CMake/GoogleLogConfiguration.cmake)
@@ -70,6 +82,11 @@
 include(${CMAKE_SOURCE_DIR}/Resources/CMake/LuaConfiguration.cmake)
 
 
+
+#####################################################################
+## Autogeneration of files
+#####################################################################
+
 # Prepare the embedded files
 set(EMBEDDED_FILES
   PREPARE_DATABASE ${CMAKE_CURRENT_SOURCE_DIR}/OrthancServer/PrepareDatabase.sql
@@ -97,11 +114,24 @@
 
 
 
-# The main instructions to build the Orthanc binaries
+#####################################################################
+## Build the core of Orthanc
+#####################################################################
+
+add_definitions(
+  -DORTHANC_VERSION="${ORTHANC_VERSION}"
+  )
+
+list(LENGTH OPENSSL_SOURCES OPENSSL_SOURCES_LENGTH)
+if (${OPENSSL_SOURCES_LENGTH} GREATER 0)
+  add_library(OpenSSL STATIC ${OPENSSL_SOURCES})
+endif()
+
 add_library(CoreLibrary
   STATIC
   ${AUTOGENERATED_SOURCES}
   ${THIRD_PARTY_SOURCES}
+  ${CURL_SOURCES}
 
   Core/Cache/MemoryCache.cpp
   Core/ChunkedBuffer.cpp
@@ -156,6 +186,10 @@
   )  
 
 
+#####################################################################
+## Build the Orthanc server
+#####################################################################
+
 add_library(ServerLibrary
   STATIC
   ${DCMTK_SOURCES}
@@ -188,12 +222,21 @@
 
 target_link_libraries(Orthanc ServerLibrary CoreLibrary)
 
+if (${OPENSSL_SOURCES_LENGTH} GREATER 0)
+  target_link_libraries(Orthanc OpenSSL)
+endif()
+
 install(
   TARGETS Orthanc
   RUNTIME DESTINATION bin
   )
 
-# Build the unit tests if required
+
+
+#####################################################################
+## Build the unit tests if required
+#####################################################################
+
 if (BUILD_UNIT_TESTS)
   add_definitions(-DORTHANC_BUILD_UNIT_TESTS=1)
   include(${CMAKE_SOURCE_DIR}/Resources/CMake/GoogleTestConfiguration.cmake)
@@ -212,22 +255,174 @@
     UnitTests/main.cpp
     )
   target_link_libraries(UnitTests ServerLibrary CoreLibrary)
+
+  if (${OPENSSL_SOURCES_LENGTH} GREATER 0)
+    target_link_libraries(UnitTests OpenSSL)
+  endif()
 endif()
 
 
-# Generate the Doxygen documentation if Doxygen is present
+
+#####################################################################
+## Create the standalone DLL containing the Orthanc Client API
+#####################################################################
+
+if (BUILD_CLIENT_LIBRARY)
+  include_directories(${ORTHANC_ROOT}/OrthancCppClient/SharedLibrary/Laaw)
+
+  if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
+    if (CMAKE_CROSSCOMPILING)
+      # Remove the default "lib" prefix from "libOrthancClient.dll" if cross-compiling
+      set(CMAKE_SHARED_LIBRARY_PREFIX "")
+
+      if (${CMAKE_SIZEOF_VOID_P} EQUAL 4)
+        set(ORTHANC_CPP_CLIENT_AUX ${ORTHANC_ROOT}/OrthancCppClient/SharedLibrary/AUTOGENERATED/Windows32.def)
+      elseif (${CMAKE_SIZEOF_VOID_P} EQUAL 8)
+        set(ORTHANC_CPP_CLIENT_AUX ${ORTHANC_ROOT}/OrthancCppClient/SharedLibrary/AUTOGENERATED/Windows64.def)
+      else()
+        message(FATAL_ERROR "Support your platform here")
+      endif()
+    else()
+      # Nothing to do if using Visual Studio
+    endif()
+
+    if (${CMAKE_SIZEOF_VOID_P} EQUAL 4)
+      set(CMAKE_SHARED_LIBRARY_SUFFIX "_Windows32.dll")
+      list(APPEND ORTHANC_CPP_CLIENT_AUX ${ORTHANC_ROOT}/OrthancCppClient/SharedLibrary/AUTOGENERATED/Windows32.rc)
+    elseif (${CMAKE_SIZEOF_VOID_P} EQUAL 8)
+      set(CMAKE_SHARED_LIBRARY_SUFFIX "_Windows64.dll")
+      list(APPEND ORTHANC_CPP_CLIENT_AUX ${ORTHANC_ROOT}/OrthancCppClient/SharedLibrary/AUTOGENERATED/Windows64.rc)
+    else()
+      message(FATAL_ERROR "Support your platform here")
+    endif()    
+
+  else()
+    set(ORTHANC_CPP_CLIENT_AUX ${OPENSSL_SOURCES})
+  endif()
+
+  add_library(OrthancClient SHARED
+    ${ORTHANC_ROOT}/Core/OrthancException.cpp
+    ${ORTHANC_ROOT}/Core/Enumerations.cpp
+    ${ORTHANC_ROOT}/Core/Toolbox.cpp
+    ${ORTHANC_ROOT}/Core/HttpClient.cpp
+    ${ORTHANC_ROOT}/Core/MultiThreading/ArrayFilledByThreads.cpp
+    ${ORTHANC_ROOT}/Core/MultiThreading/ThreadedCommandProcessor.cpp
+    ${ORTHANC_ROOT}/Core/MultiThreading/SharedMessageQueue.cpp
+    ${ORTHANC_ROOT}/Core/FileFormats/PngReader.cpp
+    ${ORTHANC_ROOT}/OrthancCppClient/OrthancConnection.cpp
+    ${ORTHANC_ROOT}/OrthancCppClient/Series.cpp
+    ${ORTHANC_ROOT}/OrthancCppClient/Study.cpp
+    ${ORTHANC_ROOT}/OrthancCppClient/Instance.cpp
+    ${ORTHANC_ROOT}/OrthancCppClient/Patient.cpp
+    ${ORTHANC_ROOT}/OrthancCppClient/SharedLibrary/SharedLibrary.cpp
+    ${ORTHANC_ROOT}/Resources/md5/md5.c
+    ${ORTHANC_ROOT}/Resources/base64/base64.cpp
+    ${ORTHANC_CPP_CLIENT_AUX}
+    ${THIRD_PARTY_SOURCES}
+    ${CURL_SOURCES}
+    )
+
+  if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
+    set_target_properties(OrthancClient
+      PROPERTIES LINK_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined -Wl,--as-needed -Wl,--version-script=${ORTHANC_ROOT}/OrthancCppClient/SharedLibrary/Laaw/VersionScript.map"
+      )
+    target_link_libraries(OrthancClient pthread)
+
+  elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
+    target_link_libraries(OrthancClient OpenSSL ws2_32)
+
+    if (CMAKE_CROSSCOMPILING)
+      set_target_properties(OrthancClient
+        PROPERTIES LINK_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--allow-multiple-definition -static-libgcc -static-libstdc++"
+        )
+    endif()
+
+  else()
+    message(FATAL_ERROR "Support your platform here")
+  endif()
+
+
+  # Set the version of the "Orthanc Client" shared library
+  file(STRINGS
+    ${CMAKE_SOURCE_DIR}/OrthancCppClient/SharedLibrary/Product.json
+    ORTHANC_CLIENT_VERSION_TMP
+    REGEX "^[ \t]*\"Version\"[ \t]*")
+
+  string(REGEX REPLACE "^.*\"([0-9]+)\\.([0-9]+)\\.([0-9]+)\"" "\\1.\\2" 
+    ORTHANC_CLIENT_VERSION ${ORTHANC_CLIENT_VERSION_TMP})
+
+  message("Setting the version of the library to ${ORTHANC_CLIENT_VERSION}")
+
+  set_target_properties(OrthancClient PROPERTIES 
+    VERSION ${ORTHANC_CLIENT_VERSION} 
+    SOVERSION ${ORTHANC_CLIENT_VERSION})
+
+
+  install(
+    TARGETS OrthancClient
+    RUNTIME DESTINATION lib    # Destination for Windows
+    LIBRARY DESTINATION lib    # Destination for Linux
+    )
+
+  install(
+    FILES ${ORTHANC_ROOT}/OrthancCppClient/SharedLibrary/AUTOGENERATED/OrthancCppClient.h 
+    DESTINATION include/orthanc
+    )
+endif()
+
+
+        
+
+#####################################################################
+## Generate the documentation if Doxygen is present
+#####################################################################
+
 find_package(Doxygen)
 if (DOXYGEN_FOUND)
   configure_file(
     ${CMAKE_SOURCE_DIR}/Resources/Orthanc.doxygen
     ${CMAKE_CURRENT_BINARY_DIR}/Orthanc.doxygen
     @ONLY)
+
   add_custom_target(doc
     ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Orthanc.doxygen
     WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
-    COMMENT "Generating API documentation with Doxygen" VERBATIM
+    COMMENT "Generating internal documentation with Doxygen" VERBATIM
     )
+
+  if (BUILD_CLIENT_LIBRARY)
+    configure_file(
+      ${CMAKE_SOURCE_DIR}/Resources/OrthancClient.doxygen
+      ${CMAKE_CURRENT_BINARY_DIR}/OrthancClient.doxygen
+      @ONLY)
+
+    add_custom_command(TARGET OrthancClient 
+      POST_BUILD
+      COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/OrthancClient.doxygen
+      WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+      COMMENT "Generating client documentation with Doxygen" VERBATIM
+      )
+
+    install(
+      DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/OrthancClientDocumentation/doc/
+      DESTINATION share/doc/orthanc/OrthancClient
+      )
+  endif()
+
 else()
   message("Doxygen not found. The documentation will not be built.")
 endif()
 
+
+#####################################################################
+## Prepare the "uninstall" target
+## http://www.cmake.org/Wiki/CMake_FAQ#Can_I_do_.22make_uninstall.22_with_CMake.3F
+#####################################################################
+
+configure_file(
+    "${CMAKE_CURRENT_SOURCE_DIR}/Resources/CMake/Uninstall.cmake.in"
+    "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
+    IMMEDIATE @ONLY)
+
+add_custom_target(uninstall
+    COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
--- a/Core/Compression/ZipWriter.cpp	Wed Sep 04 14:19:14 2013 +0200
+++ b/Core/Compression/ZipWriter.cpp	Thu Oct 17 14:21:50 2013 +0200
@@ -29,11 +29,15 @@
  * along with this program. If not, see <http://www.gnu.org/licenses/>.
  **/
 
+#ifdef _WIN32
+#define NOMINMAX
+#endif
 
 #include "ZipWriter.h"
 
 #include "../../Resources/minizip/zip.h"
 #include <boost/date_time/posix_time/posix_time.hpp>
+#include <limits>
 
 #include "../OrthancException.h"
 
--- a/Core/DicomFormat/DicomIntegerPixelAccessor.cpp	Wed Sep 04 14:19:14 2013 +0200
+++ b/Core/DicomFormat/DicomIntegerPixelAccessor.cpp	Thu Oct 17 14:21:50 2013 +0200
@@ -140,11 +140,13 @@
 
     if (pixelRepresentation)
     {
+      // Pixels are signed
       mask_ = (1 << (bitsStored - 1)) - 1;
       signMask_ = (1 << (bitsStored - 1));
     }
     else
     {
+      // Pixels are unsigned
       mask_ = (1 << bitsStored) - 1;
       signMask_ = 0;
     }
--- a/Core/Enumerations.h	Wed Sep 04 14:19:14 2013 +0200
+++ b/Core/Enumerations.h	Thu Oct 17 14:21:50 2013 +0200
@@ -32,6 +32,8 @@
 
 #pragma once
 
+#include "../OrthancCppClient/SharedLibrary/Laaw/laaw.h"
+
 namespace Orthanc
 {
   enum Endianness
@@ -67,19 +69,62 @@
     ErrorCode_FullStorage
   };
 
-  enum PixelFormat
+  /**
+   * {summary}{The memory layout of the pixels (resp. voxels) of a 2D (resp. 3D) image.}
+   **/
+  enum LAAW_API PixelFormat
   {
+    /**
+     * {summary}{Color image in RGB24 format.}
+     * {description}{This format describes a color image. The pixels are stored in 3
+     * consecutive bytes. The memory layout is RGB.
+     **/
     PixelFormat_RGB24,
+
+    /**
+     * {summary}{Graylevel 8bpp image.}
+     * {description}{The image is graylevel. Each pixel is unsigned and stored in one byte.}
+     **/
     PixelFormat_Grayscale8,
+      
+    /**
+     * {summary}{Graylevel, unsigned 16bpp image.}
+     * {description}{The image is graylevel. Each pixel is unsigned and stored in two bytes.}
+     **/
     PixelFormat_Grayscale16,
+      
+    /**
+     * {summary}{Graylevel, signed 16bpp image.}
+     * {description}{The image is graylevel. Each pixel is signed and stored in two bytes.}
+     **/
     PixelFormat_SignedGrayscale16
   };
 
-  enum ImageExtractionMode
+
+  /**
+   * {summary}{The extraction mode specifies the way the values of the pixels are scaled when downloading a 2D image.}
+   **/
+  enum LAAW_API ImageExtractionMode
   {
+    /**
+     * {summary}{Rescaled to 8bpp.}
+     * {description}{The minimum value of the image is set to 0, and its maximum value is set to 255.}
+     **/
     ImageExtractionMode_Preview,
+
+    /**
+     * {summary}{Truncation to the [0, 255] range.}
+     **/
     ImageExtractionMode_UInt8,
+
+    /**
+     * {summary}{Truncation to the [0, 65535] range.}
+     **/
     ImageExtractionMode_UInt16,
+
+    /**
+     * {summary}{Truncation to the [-32768, 32767] range.}
+     **/
     ImageExtractionMode_Int16
   };
 
--- a/Core/Toolbox.cpp	Wed Sep 04 14:19:14 2013 +0200
+++ b/Core/Toolbox.cpp	Thu Oct 17 14:21:50 2013 +0200
@@ -39,6 +39,7 @@
 #include <boost/filesystem.hpp>
 #include <boost/filesystem/fstream.hpp>
 #include <boost/date_time/posix_time/posix_time.hpp>
+#include <boost/uuid/sha1.hpp>
 #include <algorithm>
 #include <ctype.h>
 
@@ -65,7 +66,19 @@
 
 #include "../Resources/md5/md5.h"
 #include "../Resources/base64/base64.h"
-#include "../Resources/sha1/sha1.h"
+
+
+#ifdef _MSC_VER
+// Patch for the missing "_strtoll" symbol when compiling with Visual Studio
+extern "C"
+{
+int64_t _strtoi64(const char *nptr, char **endptr, int base);
+int64_t strtoll(const char *nptr, char **endptr, int base)
+{
+    return _strtoi64(nptr, endptr, base);
+} 
+}
+#endif
 
 
 #if BOOST_HAS_LOCALE == 0
@@ -559,31 +572,27 @@
   void Toolbox::ComputeSHA1(std::string& result,
                             const std::string& data)
   {
-    SHA1 sha1;
+    boost::uuids::detail::sha1 sha1;
+
     if (data.size() > 0)
     {
-      sha1.Input(&data[0], data.size());
+      sha1.process_bytes(&data[0], data.size());
     }
 
-    unsigned digest[5];
+    unsigned int digest[5];
 
     // Sanity check for the memory layout: A SHA-1 digest is 160 bits wide
-    assert(sizeof(unsigned) == 4 && sizeof(digest) == (160 / 8)); 
+    assert(sizeof(unsigned int) == 4 && sizeof(digest) == (160 / 8)); 
     
-    if (sha1.Result(digest))
-    {
-      result.resize(8 * 5 + 4);
-      sprintf(&result[0], "%08x-%08x-%08x-%08x-%08x",
-              digest[0],
-              digest[1],
-              digest[2],
-              digest[3],
-              digest[4]);
-    }
-    else
-    {
-      throw OrthancException(ErrorCode_InternalError);
-    }
+    sha1.get_digest(digest);
+
+    result.resize(8 * 5 + 4);
+    sprintf(&result[0], "%08x-%08x-%08x-%08x-%08x",
+            digest[0],
+            digest[1],
+            digest[2],
+            digest[3],
+            digest[4]);
   }
 
   bool Toolbox::IsSHA1(const std::string& str)
--- a/NEWS	Wed Sep 04 14:19:14 2013 +0200
+++ b/NEWS	Thu Oct 17 14:21:50 2013 +0200
@@ -1,9 +1,28 @@
 Pending changes in the mainline
 ===============================
 
+* Possibility to keep the PatientID during an anonymization
+* Check whether "unzip", "tar" and/or "7-zip" are installed from CMake
+
+
+Version 0.6.2 (2013/10/04)
+==========================
+
+* Build of the C++ client as a shared library
+* Improvements and documentation of the C++ client API
+* Fix of Debian bug #724947 (licensing issue with the SHA-1 library)
+* Switch to Boost 1.54.0 (cf. issue #9)
+* "make uninstall" is now possible
+
+
+Version 0.6.1 (2013/09/16)
+==========================
+
 * Detection of stable patients/studies/series
 * C-Find SCU at the instance level
 * Link from modified to original resource in Orthanc Explorer
+* Fix of issue #8
+* Anonymization of the medical alerts tag (0010,2000)
 
 
 Version 0.6.0 (2013/07/16)
--- a/OrthancCppClient/Instance.cpp	Wed Sep 04 14:19:14 2013 +0200
+++ b/OrthancCppClient/Instance.cpp	Thu Oct 17 14:21:50 2013 +0200
@@ -33,7 +33,6 @@
 #include "Instance.h"
 
 #include "OrthancConnection.h"
-#include "../Core/OrthancException.h"
 
 #include <boost/lexical_cast.hpp>
 
@@ -63,16 +62,16 @@
           break;
           
         default:
-          throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented);
+          throw OrthancClientException(Orthanc::ErrorCode_NotImplemented);
       }
 
       Orthanc::HttpClient client(connection_.GetHttpClient());
-      client.SetUrl(connection_.GetOrthancUrl() +  "/instances/" + id_ + "/" + suffix);
+      client.SetUrl(std::string(connection_.GetOrthancUrl()) +  "/instances/" + id_ + "/" + suffix);
       std::string png;
 
       if (!client.Apply(png))
       {
-        throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented);
+        throw OrthancClientException(Orthanc::ErrorCode_NotImplemented);
       }
      
       reader_.reset(new Orthanc::PngReader);
@@ -80,35 +79,51 @@
     }
   }
 
+  void Instance::DownloadDicom()
+  {
+    if (dicom_.get() == NULL)
+    {
+      Orthanc::HttpClient client(connection_.GetHttpClient());
+      client.SetUrl(std::string(connection_.GetOrthancUrl()) +  "/instances/" + id_ + "/file");
+
+      dicom_.reset(new std::string);
+
+      if (!client.Apply(*dicom_))
+      {
+        throw OrthancClientException(Orthanc::ErrorCode_NetworkProtocol);
+      }
+    }
+  }
+
   Instance::Instance(const OrthancConnection& connection,
-                     const std::string& id) :
+                     const char* id) :
     connection_(connection),
     id_(id),
     mode_(Orthanc::ImageExtractionMode_Int16)
   {
     Orthanc::HttpClient client(connection_.GetHttpClient());
             
-    client.SetUrl(connection_.GetOrthancUrl() + "/instances/" + id_ + "/simplified-tags");
+    client.SetUrl(std::string(connection_.GetOrthancUrl()) + "/instances/" + id_ + "/simplified-tags");
     Json::Value v;
     if (!client.Apply(tags_))
     {
-      throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol);
+      throw OrthancClientException(Orthanc::ErrorCode_NetworkProtocol);
     }
   }
 
-  std::string Instance::GetTagAsString(const char* tag)
+  const char* Instance::GetTagAsString(const char* tag) const
   {
     if (tags_.isMember(tag))
     {
-      return tags_[tag].asString();
+      return tags_[tag].asCString();
     }
     else
     {
-      throw Orthanc::OrthancException(Orthanc::ErrorCode_InexistentItem);
+      throw OrthancClientException(Orthanc::ErrorCode_InexistentItem);
     }
   }
 
-  float Instance::GetTagAsFloat(const char* tag)
+  float Instance::GetTagAsFloat(const char* tag) const
   {
     std::string value = GetTagAsString(tag);
 
@@ -118,11 +133,11 @@
     }
     catch (boost::bad_lexical_cast)
     {
-      throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
+      throw OrthancClientException(Orthanc::ErrorCode_BadFileFormat);
     }
   }
 
-  int Instance::GetTagAsInt(const char* tag)
+  int Instance::GetTagAsInt(const char* tag) const
   {
     std::string value = GetTagAsString(tag);
 
@@ -132,7 +147,7 @@
     }
     catch (boost::bad_lexical_cast)
     {
-      throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
+      throw OrthancClientException(Orthanc::ErrorCode_BadFileFormat);
     }
   }
 
@@ -177,6 +192,11 @@
     reader_.reset();
   }
 
+  void Instance::DiscardDicom()
+  {
+    dicom_.reset();
+  }
+
 
   void Instance::SetImageExtractionMode(Orthanc::ImageExtractionMode mode)
   {
@@ -218,7 +238,31 @@
     catch (boost::bad_lexical_cast)
     {
       // Unable to parse the Image Orientation Patient.
-      throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
+      throw OrthancClientException(Orthanc::ErrorCode_BadFileFormat);
     }
   }
+
+
+  const uint64_t Instance::GetDicomSize()
+  {
+    DownloadDicom();
+    assert(dicom_.get() != NULL);
+    return dicom_->size();
+  }
+
+  const void* Instance::GetDicom()
+  {
+    DownloadDicom();
+    assert(dicom_.get() != NULL);
+
+    if (dicom_->size() == 0)
+    {
+      return NULL;
+    }
+    else
+    {
+      return &((*dicom_) [0]);
+    }
+  }
+
 }
--- a/OrthancCppClient/Instance.h	Wed Sep 04 14:19:14 2013 +0200
+++ b/OrthancCppClient/Instance.h	Thu Oct 17 14:21:50 2013 +0200
@@ -35,6 +35,7 @@
 #include <string>
 #include <json/value.h>
 
+#include "OrthancClientException.h"
 #include "../Core/IDynamicObject.h"
 #include "../Core/FileFormats/PngReader.h"
 
@@ -42,7 +43,12 @@
 {
   class OrthancConnection;
 
-  class Instance : public Orthanc::IDynamicObject
+  /**
+   * {summary}{Connection to an instance stored in %Orthanc.}
+   * {description}{This class encapsulates a connection to an image instance
+   * from a remote instance of %Orthanc.}
+   **/
+  class LAAW_API Instance : public Orthanc::IDynamicObject
   {
   private:
     const OrthancConnection& connection_;
@@ -50,46 +56,134 @@
     Json::Value tags_;
     std::auto_ptr<Orthanc::PngReader> reader_;
     Orthanc::ImageExtractionMode mode_;
+    std::auto_ptr<std::string> dicom_;
 
     void DownloadImage();
 
-  public:
-    Instance(const OrthancConnection& connection,
-             const std::string& id);
+    void DownloadDicom();
 
-    const std::string& GetId() const
+  public:
+     /**
+     * {summary}{Create a connection to some image instance.}
+     * {param}{connection The remote instance of %Orthanc.}
+     * {param}{id The %Orthanc identifier of the image instance.}
+     **/
+    Instance(const OrthancConnection& connection,
+             const char* id);
+
+    
+    /**
+     * {summary}{Get the %Orthanc identifier of this identifier.}
+     * {returns}{The identifier.}
+     **/
+    const char* GetId() const
     {
-      return id_;
+      return id_.c_str();
     }
 
+
+    /**
+     * {summary}{Set the extraction mode for the 2D image corresponding to this instance.}
+     * {param}{mode The extraction mode.}
+     **/
     void SetImageExtractionMode(Orthanc::ImageExtractionMode mode);
 
+    /**
+     * {summary}{Get the extraction mode for the 2D image corresponding to this instance.}
+     * {returns}{The extraction mode.}
+     **/
     Orthanc::ImageExtractionMode GetImageExtractionMode() const
     {
       return mode_;
     }
 
-    std::string GetTagAsString(const char* tag);
+    
+    /**
+     * {summary}{Get the string value of some DICOM tag of this instance.}
+     * {param}{tag The name of the tag of interest.}
+     * {returns}{The value of the tag.}
+     **/
+    const char* GetTagAsString(const char* tag) const;
 
-    float GetTagAsFloat(const char* tag);
+    /**
+     * {summary}{Get the floating point value that is stored in some DICOM tag of this instance.}
+     * {param}{tag The name of the tag of interest.}
+     * {returns}{The value of the tag.}
+     **/
+    float GetTagAsFloat(const char* tag) const;
 
-    int GetTagAsInt(const char* tag);
+    /**
+     * {summary}{Get the integer value that is stored in some DICOM tag of this instance.}
+     * {param}{tag The name of the tag of interest.}
+     * {returns}{The value of the tag.}
+     **/
+    int32_t GetTagAsInt(const char* tag) const;
 
-    unsigned int GetWidth();
+    
+    /**
+     * {summary}{Get the width of the 2D image.}
+     * {description}{Get the width of the 2D image that is encoded by this DICOM instance.}
+     * {returns}{The width.}
+     **/
+    uint32_t GetWidth();
 
-    unsigned int GetHeight();
+    /**
+     * {summary}{Get the height of the 2D image.}
+     * {description}{Get the height of the 2D image that is encoded by this DICOM instance.}
+     * {returns}{The height.}
+     **/
+    uint32_t GetHeight();
 
-    unsigned int GetPitch();
+    /**
+     * {summary}{Get the number of bytes between two lines of the image (pitch).}
+     * {description}{Get the number of bytes between two lines of the image in the memory buffer returned by GetBuffer(). This value depends on the extraction mode for the image.}
+     * {returns}{The pitch.}
+     **/
+    uint32_t GetPitch();
 
+    /**
+     * {summary}{Get the format of the pixels of the 2D image.}
+     * {description}{Return the memory layout that is used for the 2D image that is encoded by this DICOM instance. This value depends on the extraction mode for the image.}
+     * {returns}{The pixel format.}
+     **/
     Orthanc::PixelFormat GetPixelFormat();
 
+    /**
+     * {summary}{Access the memory buffer in which the raw pixels of the 2D image are stored.}
+     * {returns}{A pointer to the memory buffer.}
+     **/
     const void* GetBuffer();
 
-    const void* GetBuffer(unsigned int y);
+    /**
+     * {summary}{Access the memory buffer in which the raw pixels of some line of the 2D image are stored.}
+     * {param}{y The line of interest.}
+     * {returns}{A pointer to the memory buffer.}
+     **/
+    const void* GetBuffer(uint32_t y);
 
+    /**
+     * {summary}{Get the size of the DICOM file corresponding to this instance.}
+     * {returns}{The file size.}
+     **/
+    const uint64_t GetDicomSize();
+
+    /**
+     * {summary}{Get a pointer to the content of the DICOM file corresponding to this instance.}
+     * {returns}{The DICOM file.}
+     **/
+    const void* GetDicom();
+
+    /**
+     * {summary}{Discard the downloaded 2D image, so as to make room in memory.}
+     **/
     void DiscardImage();
 
-    void SplitVectorOfFloats(std::vector<float>& target,
-                             const char* tag);
+    /**
+     * {summary}{Discard the downloaded DICOM file, so as to make room in memory.}
+     **/
+    void DiscardDicom();
+
+    LAAW_API_INTERNAL void SplitVectorOfFloats(std::vector<float>& target,
+                                               const char* tag);
   };
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OrthancCppClient/OrthancClientException.h	Thu Oct 17 14:21:50 2013 +0200
@@ -0,0 +1,58 @@
+/**
+ * Orthanc - A Lightweight, RESTful DICOM Store
+ * Copyright (C) 2012-2013 Medical Physics Department, CHU of Liege,
+ * Belgium
+ *
+ * This program is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * In addition, as a special exception, the copyright holders of this
+ * program give permission to link the code of its release with the
+ * OpenSSL project's "OpenSSL" library (or with modified versions of it
+ * that use the same license as the "OpenSSL" library), and distribute
+ * the linked executables. You must obey the GNU General Public License
+ * in all respects for all of the code used other than "OpenSSL". If you
+ * modify file(s) with this exception, you may extend this exception to
+ * your version of the file(s), but you are not obligated to do so. If
+ * you do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source files
+ * in the program, then also delete it here.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ **/
+
+
+#pragma once
+
+#include "../Core/OrthancException.h"
+#include "SharedLibrary/Laaw/laaw.h"
+
+namespace OrthancClient
+{
+  class OrthancClientException : public ::Laaw::LaawException
+  {
+  public:
+    OrthancClientException(Orthanc::ErrorCode code) :
+      LaawException(Orthanc::OrthancException::GetDescription(code))
+    { 
+    }
+
+    OrthancClientException(const char* message) : 
+      LaawException(message)
+    {    
+    }
+
+    OrthancClientException(const std::string& message) : 
+      LaawException(message)
+    {    
+    }
+  };
+}
--- a/OrthancCppClient/OrthancConnection.cpp	Wed Sep 04 14:19:14 2013 +0200
+++ b/OrthancCppClient/OrthancConnection.cpp	Thu Oct 17 14:21:50 2013 +0200
@@ -32,24 +32,27 @@
 
 #include "OrthancConnection.h"
 
-#include "../Core/OrthancException.h"
+#include "../Core/Toolbox.h"
 
 namespace OrthancClient
 {
   void OrthancConnection::ReadPatients()
   {
+    client_.SetMethod(Orthanc::HttpMethod_Get);
     client_.SetUrl(orthancUrl_ + "/patients");
+
     Json::Value v;
     if (!client_.Apply(content_))
     {
-      throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol);
+      throw OrthancClientException(Orthanc::ErrorCode_NetworkProtocol);
     }
   }
 
   Orthanc::IDynamicObject* OrthancConnection::GetFillerItem(size_t index)
   {
     Json::Value::ArrayIndex tmp = static_cast<Json::Value::ArrayIndex>(index);
-    return new Patient(*this, content_[tmp].asString());
+    std::string id = content_[tmp].asString();
+    return new Patient(*this, id.c_str());
   }
 
   Patient& OrthancConnection::GetPatient(unsigned int index)
@@ -73,4 +76,39 @@
   }
 
 
+  void OrthancConnection::Store(const void* dicom, uint64_t size)
+  {
+    if (size == 0)
+    {
+      return;
+    }
+
+    client_.SetMethod(Orthanc::HttpMethod_Post);
+    client_.SetUrl(orthancUrl_ + "/instances");
+
+    // Copy the DICOM file in the POST body. TODO - Avoid memory copy
+    client_.AccessPostData().resize(static_cast<size_t>(size));
+    memcpy(&client_.AccessPostData()[0], dicom, static_cast<size_t>(size));
+
+    Json::Value v;
+    if (!client_.Apply(v))
+    {
+      throw OrthancClientException(Orthanc::ErrorCode_NetworkProtocol);
+    }
+    
+    Reload();
+  }
+
+
+  void  OrthancConnection::StoreFile(const char* filename)
+  {
+    std::string content;
+    Orthanc::Toolbox::ReadFile(content, filename);
+
+    if (content.size() != 0)
+    {
+      Store(&content[0], content.size());
+    }
+  }
+
 }
--- a/OrthancCppClient/OrthancConnection.h	Wed Sep 04 14:19:14 2013 +0200
+++ b/OrthancCppClient/OrthancConnection.h	Thu Oct 17 14:21:50 2013 +0200
@@ -38,7 +38,12 @@
 
 namespace OrthancClient
 {
-  class OrthancConnection : 
+  /**
+   * {summary}{Connection to an instance of %Orthanc.}
+   * {description}{This class encapsulates a connection to a remote instance
+   * of %Orthanc through its REST API.}
+   **/  
+  class LAAW_API OrthancConnection : 
     public boost::noncopyable,
     private Orthanc::ArrayFilledByThreads::IFiller
   {
@@ -58,42 +63,118 @@
     virtual Orthanc::IDynamicObject* GetFillerItem(size_t index);
 
   public:
+    /**
+     * {summary}{Create a connection to an instance of %Orthanc.}
+     * {param}{orthancUrl URL to which the REST API of %Orthanc is listening.}
+     **/
     OrthancConnection(const char* orthancUrl);
 
+    /**
+     * {summary}{Create a connection to an instance of %Orthanc, with authentication.}
+     * {param}{orthancUrl URL to which the REST API of %Orthanc is listening.}
+     * {param}{username The username.}
+     * {param}{password The password.}
+     **/
     OrthancConnection(const char* orthancUrl,
                       const char* username, 
                       const char* password);
 
-    unsigned int GetThreadCount() const
+    virtual ~OrthancConnection()
+    {
+    }
+
+    /**
+     * {summary}{Returns the number of threads for this connection.}
+     * {description}{Returns the number of simultaneous connections
+     * that are used when downloading information from this instance
+     * of %Orthanc.} 
+     * {returns}{The number of threads.}
+     **/
+    uint32_t GetThreadCount() const
     {
       return patients_.GetThreadCount();
     }
 
-    void SetThreadCount(unsigned int threadCount)
+    /**
+     * {summary}{Sets the number of threads for this connection.}
+     * {description}{Sets  the number of simultaneous connections
+     * that are used when downloading information from this instance
+     * of %Orthanc.} 
+     * {param}{threadCount The number of threads.}
+     **/
+    void SetThreadCount(uint32_t threadCount)
     {
       patients_.SetThreadCount(threadCount);
     }
 
+    /**
+     * {summary}{Reload the list of the patients.}
+     * {description}{This method will reload the list of the patients from the remote instance of %Orthanc. Pay attention to the fact that the patients that have been previously returned by GetPatient() will be invalidated.}
+     **/
     void Reload()
     {
-      patients_.Reload();
+      ReadPatients();
+      patients_.Invalidate();
     }
 
-    const Orthanc::HttpClient& GetHttpClient() const
+    LAAW_API_INTERNAL const Orthanc::HttpClient& GetHttpClient() const
     {
       return client_;
     }
 
-    const std::string& GetOrthancUrl() const
+    /**
+     * {summary}{Returns the URL of this instance of %Orthanc.}
+     * {description}{Returns the URL of the remote %Orthanc instance to which this object is connected.}
+     * {returns}{The URL.}
+     **/
+    const char* GetOrthancUrl() const
     {
-      return orthancUrl_;
+      return orthancUrl_.c_str();
     }
 
-    unsigned int GetPatientCount()
+    /**
+     * {summary}{Returns the number of patients.}
+     * {description}{Returns the number of patients that are stored in the remote instance of %Orthanc.}
+     * {returns}{The number of patients.}
+     **/
+    uint32_t GetPatientCount()
     {
       return patients_.GetSize();
     }
 
-    Patient& GetPatient(unsigned int index);
+    /**
+     * {summary}{Get some patient.}
+     * {description}{This method will return an object that contains information about some patient. The patients are indexed by a number between 0 (inclusive) and the result of GetPatientCount() (exclusive).}
+     * {param}{index The index of the patient of interest.}
+     * {returns}{The patient.}
+     **/
+    Patient& GetPatient(uint32_t index);
+
+    /**
+     * {summary}{Delete some patient.}
+     * {description}{Delete some patient from the remote instance of %Orthanc. Pay attention to the fact that the patients that have been previously returned by GetPatient() will be invalidated.}
+     * {param}{index The index of the patient of interest.}
+     * {returns}{The patient.}
+     **/
+    void DeletePatient(uint32_t index)
+    {
+      GetPatient(index).Delete();
+      Reload();
+    }
+
+    /**
+     * {summary}{Send a DICOM file.}
+     * {description}{This method will store a DICOM file in the remote instance of %Orthanc. Pay attention to the fact that the patients that have been previously returned by GetPatient() will be invalidated.}
+     * {param}{filename Path to the DICOM file}
+     **/
+    void StoreFile(const char* filename);
+
+    /**
+     * {summary}{Send a DICOM file that is contained inside a memory buffer.}
+     * {description}{This method will store a DICOM file in the remote instance of %Orthanc. Pay attention to the fact that the patients that have been previously returned by GetPatient() will be invalidated.}
+     * {param}{dicom The memory buffer containing the DICOM file.}
+     * {param}{size The size of the DICOM file.}
+     **/    
+    void Store(const void* dicom, uint64_t size);
   };
 }
--- a/OrthancCppClient/Patient.cpp	Wed Sep 04 14:19:14 2013 +0200
+++ b/OrthancCppClient/Patient.cpp	Thu Oct 17 14:21:50 2013 +0200
@@ -33,29 +33,30 @@
 #include "Patient.h"
 
 #include "OrthancConnection.h"
-#include "../Core/OrthancException.h"
 
 namespace OrthancClient
 {
   void Patient::ReadPatient()
   {
     Orthanc::HttpClient client(connection_.GetHttpClient());
-    client.SetUrl(connection_.GetOrthancUrl() + "/patients/" + id_);
+    client.SetUrl(std::string(connection_.GetOrthancUrl()) + "/patients/" + id_);
+
     Json::Value v;
     if (!client.Apply(patient_))
     {
-      throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol);
+      throw OrthancClientException(Orthanc::ErrorCode_NetworkProtocol);
     }
   }
 
   Orthanc::IDynamicObject* Patient::GetFillerItem(size_t index)
   {
     Json::Value::ArrayIndex tmp = static_cast<Json::Value::ArrayIndex>(index);
-    return new Study(connection_, patient_["Studies"][tmp].asString());
+    std::string id = patient_["Studies"][tmp].asString();
+    return new Study(connection_, id.c_str());
   }
 
   Patient::Patient(const OrthancConnection& connection,
-                   const std::string& id) :
+                   const char* id) :
     connection_(connection),
     id_(id),
     studies_(*this)
@@ -64,15 +65,28 @@
     ReadPatient();
   }
 
-  std::string Patient::GetMainDicomTag(const char* tag, const char* defaultValue) const
+  const char* Patient::GetMainDicomTag(const char* tag, const char* defaultValue) const
   {
     if (patient_["MainDicomTags"].isMember(tag))
     {
-      return patient_["MainDicomTags"][tag].asString();
+      return patient_["MainDicomTags"][tag].asCString();
     }
     else
     {
       return defaultValue;
     }
   }
+  
+  void Patient::Delete()
+  {
+    Orthanc::HttpClient client(connection_.GetHttpClient());
+    client.SetMethod(Orthanc::HttpMethod_Delete);
+    client.SetUrl(std::string(connection_.GetOrthancUrl()) + "/patients/" + id_);
+    
+    std::string s;
+    if (!client.Apply(s))
+    {
+      throw OrthancClientException(Orthanc::ErrorCode_NetworkProtocol);
+    }
+  }
 }
--- a/OrthancCppClient/Patient.h	Wed Sep 04 14:19:14 2013 +0200
+++ b/OrthancCppClient/Patient.h	Thu Oct 17 14:21:50 2013 +0200
@@ -36,7 +36,12 @@
 
 namespace OrthancClient
 {
-  class Patient : 
+  /**
+   * {summary}{Connection to a patient stored in %Orthanc.}
+   * {description}{This class encapsulates a connection to a patient
+   * from a remote instance of %Orthanc.}
+   **/
+  class LAAW_API Patient : 
     public Orthanc::IDynamicObject, 
     private Orthanc::ArrayFilledByThreads::IFiller
   {
@@ -56,30 +61,61 @@
     virtual Orthanc::IDynamicObject* GetFillerItem(size_t index);
 
   public:
+    /**
+     * {summary}{Create a connection to some patient.}
+     * {param}{connection The remote instance of %Orthanc.}
+     * {param}{id The %Orthanc identifier of the patient.}
+     **/
     Patient(const OrthancConnection& connection,
-            const std::string& id);
+            const char* id);
 
+    /**
+     * {summary}{Reload the studies of this patient.}
+     * {description}{This method will reload the list of the studies of this patient. Pay attention to the fact that the studies that have been previously returned by GetStudy() will be invalidated.}
+     **/
     void Reload()
     {
       studies_.Reload();
     }
 
-    unsigned int GetStudyCount()
+    /**
+     * {summary}{Return the number of studies for this patient.}
+     * {returns}{The number of studies.}
+     **/
+    uint32_t GetStudyCount()
     {
       return studies_.GetSize();
     }
 
-    Study& GetStudy(unsigned int index)
+    /**
+     * {summary}{Get some study of this patient.}
+     * {description}{This method will return an object that contains information about some study. The studies are indexed by a number between 0 (inclusive) and the result of GetStudyCount() (exclusive).}
+     * {param}{index The index of the study of interest.}
+     * {returns}{The study.}
+     **/
+    Study& GetStudy(uint32_t index)
     {
       return dynamic_cast<Study&>(studies_.GetItem(index));
     }
 
-    const std::string& GetId() const
+    /**
+     * {summary}{Get the %Orthanc identifier of this patient.}
+     * {returns}{The identifier.}
+     **/
+    const char* GetId() const
     {
-      return id_;
+      return id_.c_str();
     }
 
-    std::string GetMainDicomTag(const char* tag, 
+    /**
+     * {summary}{Get the value of one of the main DICOM tags for this patient.}
+     * {param}{tag The name of the tag of interest ("PatientName", "PatientID", "PatientSex" or "PatientBirthDate").}
+     * {param}{defaultValue The default value to be returned if this tag does not exist.}
+     * {returns}{The value of the tag.}
+     **/
+    const char* GetMainDicomTag(const char* tag, 
                                 const char* defaultValue) const;
+
+    LAAW_API_INTERNAL void Delete();
   };
 }
--- a/OrthancCppClient/Series.cpp	Wed Sep 04 14:19:14 2013 +0200
+++ b/OrthancCppClient/Series.cpp	Thu Oct 17 14:21:50 2013 +0200
@@ -33,7 +33,6 @@
 #include "Series.h"
 
 #include "OrthancConnection.h"
-#include "../Core/OrthancException.h"
 
 #include <set>
 #include <boost/lexical_cast.hpp>
@@ -61,7 +60,7 @@
 
         if (cosines.size() != 6)
         {
-          throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
+          throw OrthancClientException(Orthanc::ErrorCode_BadFileFormat);
         }
 
         normal_[0] = cosines[1] * cosines[5] - cosines[2] * cosines[4];
@@ -79,7 +78,7 @@
         instance.SplitVectorOfFloats(ipp, "ImagePositionPatient");
         if (ipp.size() != 3)
         {
-          throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
+          throw OrthancClientException(Orthanc::ErrorCode_BadFileFormat);
         }
 
         float dist = 0;
@@ -144,7 +143,7 @@
           }
           else
           {
-            throw OrthancException(ErrorCode_NotImplemented);
+            throw OrthancClientException(ErrorCode_NotImplemented);
           }
         }
 
@@ -154,6 +153,47 @@
         return true;
       }
     };
+
+
+    class ProgressToFloatListener : public Orthanc::ThreadedCommandProcessor::IListener
+    {
+    private:
+      float* target_;
+
+    public:
+      ProgressToFloatListener(float* target) : target_(target)
+      {
+      }
+
+      virtual void SignalProgress(unsigned int current,
+                                  unsigned int total)
+      {
+        if (total == 0)
+        {
+          *target_ = 0;
+        }
+        else
+        {
+          *target_ = static_cast<float>(current) / static_cast<float>(total);
+        }
+      }
+
+      virtual void SignalSuccess(unsigned int total)
+      {
+        *target_ = 1;
+      }
+
+      virtual void SignalFailure()
+      {
+        *target_ = 0;
+      }
+
+      virtual void SignalCancel()
+      {
+        *target_ = 0;
+      }
+    };
+
   }
 
 
@@ -161,7 +201,7 @@
   {
     if (!Is3DImage())
     {
-      throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented);
+      throw OrthancClientException(Orthanc::ErrorCode_NotImplemented);
     }
   }
 
@@ -174,13 +214,17 @@
         return true;
       }
 
+      Instance& i1 = GetInstance(0);
+
       for (unsigned int i = 0; i < GetInstanceCount(); i++)
       {
-        if (GetInstance(0).GetTagAsString("Columns") != GetInstance(i).GetTagAsString("Columns") ||
-            GetInstance(0).GetTagAsString("Rows") != GetInstance(i).GetTagAsString("Rows") ||
-            GetInstance(0).GetTagAsString("ImageOrientationPatient") != GetInstance(i).GetTagAsString("ImageOrientationPatient") ||
-            GetInstance(0).GetTagAsString("SliceThickness") != GetInstance(i).GetTagAsString("SliceThickness") ||
-            GetInstance(0).GetTagAsString("PixelSpacing") != GetInstance(i).GetTagAsString("PixelSpacing"))
+        Instance& i2 = GetInstance(i);
+
+        if (std::string(i1.GetTagAsString("Columns")) != std::string(i2.GetTagAsString("Columns")) ||
+            std::string(i1.GetTagAsString("Rows")) != std::string(i2.GetTagAsString("Rows")) ||
+            std::string(i1.GetTagAsString("ImageOrientationPatient")) != std::string(i2.GetTagAsString("ImageOrientationPatient")) ||
+            std::string(i1.GetTagAsString("SliceThickness")) != std::string(i2.GetTagAsString("SliceThickness")) ||
+            std::string(i1.GetTagAsString("PixelSpacing")) != std::string(i2.GetTagAsString("PixelSpacing")))
         {
           return false;
         }              
@@ -195,7 +239,7 @@
 
       return l.size() == GetInstanceCount();
     }
-    catch (Orthanc::OrthancException)
+    catch (OrthancClientException)
     {
       return false;
     }
@@ -205,28 +249,31 @@
   {
     Orthanc::HttpClient client(connection_.GetHttpClient());
 
-    client.SetUrl(connection_.GetOrthancUrl() + "/series/" + id_);
+    client.SetUrl(std::string(connection_.GetOrthancUrl()) + "/series/" + id_);
     Json::Value v;
     if (!client.Apply(series_))
     {
-      throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol);
+      throw OrthancClientException(Orthanc::ErrorCode_NetworkProtocol);
     }
   }
 
   Orthanc::IDynamicObject* Series::GetFillerItem(size_t index)
   {
     Json::Value::ArrayIndex tmp = static_cast<Json::Value::ArrayIndex>(index);
-    return new Instance(connection_, series_["Instances"][tmp].asString());
+    std::string id = series_["Instances"][tmp].asString();
+    return new Instance(connection_, id.c_str());
   }
 
   Series::Series(const OrthancConnection& connection,
-                 const std::string& id) :
+                 const char* id) :
     connection_(connection),
     id_(id),
     instances_(*this)
   {
     ReadSeries();
     status_ = Status3DImage_NotTested;
+    url_ = std::string(connection_.GetOrthancUrl()) + "/series/" + id_;
+    isVoxelSizeRead_ = false;
 
     instances_.SetThreadCount(connection.GetThreadCount());
   }
@@ -252,11 +299,6 @@
     return dynamic_cast<Instance&>(instances_.GetItem(index));
   }
 
-  std::string Series::GetUrl() const
-  {
-    return connection_.GetOrthancUrl() + "/series/" + id_;
-  }
-
   unsigned int Series::GetWidth()
   {
     Check3DImage();
@@ -277,15 +319,21 @@
       return GetInstance(0).GetTagAsInt("Rows");
   }
 
-  void Series::GetVoxelSize(float& sizeX, float& sizeY, float& sizeZ)
+  void Series::LoadVoxelSize()
   {
+    if (isVoxelSizeRead_)
+    {
+      return;
+    }
+
     Check3DImage();
 
     if (GetInstanceCount() == 0)
     {
-      sizeX = 0;
-      sizeY = 0;
-      sizeZ = 0;
+      // Empty image, use some default value
+      voxelSizeX_ = 1;
+      voxelSizeY_ = 1;
+      voxelSizeZ_ = 1;
     }
     else
     {
@@ -297,23 +345,25 @@
         std::string sy = s.substr(0, pos);
         std::string sx = s.substr(pos + 1);
 
-        sizeX = boost::lexical_cast<float>(sx);
-        sizeY = boost::lexical_cast<float>(sy);
-        sizeZ = GetInstance(0).GetTagAsFloat("SliceThickness");
+        voxelSizeX_ = boost::lexical_cast<float>(sx);
+        voxelSizeY_ = boost::lexical_cast<float>(sy);
+        voxelSizeZ_ = GetInstance(0).GetTagAsFloat("SliceThickness");
       }
       catch (boost::bad_lexical_cast)
       {
-        throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented);
+        throw OrthancClientException(Orthanc::ErrorCode_NotImplemented);
       }
     }
+
+    isVoxelSizeRead_ = true;
   }
 
 
-  std::string Series::GetMainDicomTag(const char* tag, const char* defaultValue) const
+  const char* Series::GetMainDicomTag(const char* tag, const char* defaultValue) const
   {
     if (series_["MainDicomTags"].isMember(tag))
     {
-      return series_["MainDicomTags"][tag].asString();
+      return series_["MainDicomTags"][tag].asCString();
     }
     else
     {
@@ -323,11 +373,11 @@
 
 
   
-  void Series::Load3DImage(void* target,
-                           Orthanc::PixelFormat format,
-                           size_t lineStride,
-                           size_t stackStride,
-                           Orthanc::ThreadedCommandProcessor::IListener* listener)
+  void Series::Load3DImageInternal(void* target,
+                                   Orthanc::PixelFormat format,
+                                   size_t lineStride,
+                                   size_t stackStride,
+                                   Orthanc::ThreadedCommandProcessor::IListener* listener)
   {
     using namespace Orthanc;
 
@@ -361,7 +411,7 @@
         break;
 
       default:
-        throw OrthancException(ErrorCode_NotImplemented);
+        throw OrthancClientException(ErrorCode_NotImplemented);
     }
 
 
@@ -372,7 +422,7 @@
     if (lineStride < sx * bytesPerPixel ||
         stackStride < sx * sy * bytesPerPixel)
     {
-      throw OrthancException(ErrorCode_BadRequest);
+      throw OrthancClientException(ErrorCode_BadRequest);
     }
 
     if (sx == 0 || sy == 0 || GetInstanceCount() == 0)
@@ -402,7 +452,7 @@
     if (instances.size() != GetInstanceCount())
     {
       // Several instances have the same Z coordinate
-      throw OrthancException(ErrorCode_NotImplemented);
+      throw OrthancClientException(ErrorCode_NotImplemented);
     }
 
 
@@ -425,8 +475,36 @@
     // Wait for all the stacks to be downloaded
     if (!processor.Join())
     {
-      throw OrthancException(ErrorCode_NetworkProtocol);
+      throw OrthancClientException(ErrorCode_NetworkProtocol);
     }
   }
 
+  float Series::GetVoxelSizeX()
+  {
+    LoadVoxelSize();
+    return voxelSizeX_;
+  }
+
+  float Series::GetVoxelSizeY()
+  {
+    LoadVoxelSize();
+    return voxelSizeY_;
+  }
+
+  float Series::GetVoxelSizeZ()
+  {
+    LoadVoxelSize();
+    return voxelSizeZ_;
+  }
+
+  void Series::Load3DImage(void* target,
+                           Orthanc::PixelFormat format,
+                           int64_t lineStride,
+                           int64_t stackStride,
+                           float* progress)
+  {
+    ProgressToFloatListener listener(progress);
+    Load3DImageInternal(target, format, static_cast<size_t>(lineStride), 
+                        static_cast<size_t>(stackStride), &listener);
+  }
 }
--- a/OrthancCppClient/Series.h	Wed Sep 04 14:19:14 2013 +0200
+++ b/OrthancCppClient/Series.h	Thu Oct 17 14:21:50 2013 +0200
@@ -39,7 +39,12 @@
 
 namespace OrthancClient
 {
-  class Series :
+  /**
+   * {summary}{Connection to a series stored in %Orthanc.}
+   * {description}{This class encapsulates a connection to a series
+   * from a remote instance of %Orthanc.}
+   **/
+  class LAAW_API Series :
     public Orthanc::IDynamicObject, 
     private Orthanc::ArrayFilledByThreads::IFiller
   {
@@ -52,10 +57,15 @@
     };
 
     const OrthancConnection& connection_;
-    std::string id_;
+    std::string id_, url_;
     Json::Value series_;
     Orthanc::ArrayFilledByThreads  instances_;
     Status3DImage status_;
+
+    bool isVoxelSizeRead_;
+    float voxelSizeX_;
+    float voxelSizeY_;
+    float voxelSizeZ_;
   
     void Check3DImage();
 
@@ -70,58 +80,155 @@
 
     virtual Orthanc::IDynamicObject* GetFillerItem(size_t index);
 
-    void Load3DImage(void* target,
-                     Orthanc::PixelFormat format,
-                     size_t lineStride,
-                     size_t stackStride,
-                     Orthanc::ThreadedCommandProcessor::IListener* listener);
+    void Load3DImageInternal(void* target,
+                             Orthanc::PixelFormat format,
+                             size_t lineStride,
+                             size_t stackStride,
+                             Orthanc::ThreadedCommandProcessor::IListener* listener);
+
+    void LoadVoxelSize();  
 
   public:
+    /**
+     * {summary}{Create a connection to some series.}
+     * {param}{connection The remote instance of %Orthanc.}
+     * {param}{id The %Orthanc identifier of the series.}
+     **/
     Series(const OrthancConnection& connection,
-           const std::string& id);
+           const char* id);
 
+     /**
+     * {summary}{Reload the instances of this series.}
+     * {description}{This method will reload the list of the instances of this series. Pay attention to the fact that the instances that have been previously returned by GetInstance() will be invalidated.}
+     **/
     void Reload()
     {
       instances_.Reload();
     }
 
-    bool Is3DImage();
-
-    unsigned int GetInstanceCount();
+    /**
+     * {summary}{Return the number of instances for this series.}
+     * {returns}{The number of instances.}
+     **/
+    uint32_t GetInstanceCount();
+    
+    /**
+     * {summary}{Get some instance of this series.}
+     * {description}{This method will return an object that contains information about some instance. The instances are indexed by a number between 0 (inclusive) and the result of GetInstanceCount() (exclusive).}
+     * {param}{index The index of the instance of interest.}
+     * {returns}{The instance.}
+     **/
+    Instance& GetInstance(uint32_t index);
 
-    Instance& GetInstance(unsigned int index);
+    /**
+     * {summary}{Get the %Orthanc identifier of this series.}
+     * {returns}{The identifier.}
+     **/
+    const char* GetId() const
+    {
+      return id_.c_str();
+    }
 
-    const std::string& GetId() const
+    /**
+     * {summary}{Returns the URL to this series.}
+     * {returns}{The URL.}
+     **/
+    const char* GetUrl() const
     {
-      return id_;
+      return url_.c_str();
     }
 
-    std::string GetUrl() const;
-
-    unsigned int GetWidth();
-
-    unsigned int GetHeight();
-
-    void GetVoxelSize(float& sizeX, float& sizeY, float& sizeZ);  
-
-    std::string GetMainDicomTag(const char* tag, 
+   
+    /**
+     * {summary}{Get the value of one of the main DICOM tags for this series.}
+     * {param}{tag The name of the tag of interest ("Modality", "Manufacturer", "SeriesDate", "SeriesDescription", "SeriesInstanceUID"...).}
+     * {param}{defaultValue The default value to be returned if this tag does not exist.}
+     * {returns}{The value of the tag.}
+     **/
+    const char* GetMainDicomTag(const char* tag, 
                                 const char* defaultValue) const;
 
+    /**
+     * {summary}{Test whether this series encodes a 3D image that can be downloaded from %Orthanc.}
+     * {returns}{"true" if and only if this is a 3D image.}
+     **/
+    bool Is3DImage();
+
+    /**
+     * {summary}{Get the width of the 3D image.}
+     * {description}{Get the width of the 3D image (i.e. along the X-axis). This call is only valid if this series corresponds to a 3D image.}
+     * {returns}{The width.}
+     **/
+    uint32_t GetWidth();
+
+    /**
+     * {summary}{Get the height of the 3D image.}
+     * {description}{Get the height of the 3D image (i.e. along the Y-axis). This call is only valid if this series corresponds to a 3D image.}
+     * {returns}{The height.}
+     **/
+    uint32_t GetHeight();
+
+    /**
+     * {summary}{Get the physical size of a voxel along the X-axis.}
+     * {description}{Get the physical size of a voxel along the X-axis. This call is only valid if this series corresponds to a 3D image.}
+     * {returns}{The voxel size.}
+     **/
+    float GetVoxelSizeX();
+
+    /**
+     * {summary}{Get the physical size of a voxel along the Y-axis.}
+     * {description}{Get the physical size of a voxel along the Y-axis. This call is only valid if this series corresponds to a 3D image.}
+     * {returns}{The voxel size.}
+     **/
+    float GetVoxelSizeY();
+
+    /**
+     * {summary}{Get the physical size of a voxel along the Z-axis.}
+     * {description}{Get the physical size of a voxel along the Z-axis. This call is only valid if this series corresponds to a 3D image.}
+     * {returns}{The voxel size.}
+     **/
+    float GetVoxelSizeZ();
+
+    LAAW_API_INTERNAL void Load3DImage(void* target,
+                                       Orthanc::PixelFormat format,
+                                       int64_t lineStride,
+                                       int64_t stackStride,
+                                       Orthanc::ThreadedCommandProcessor::IListener& listener)
+    {
+      Load3DImageInternal(target, format, static_cast<size_t>(lineStride), 
+                          static_cast<size_t>(stackStride), &listener);
+    }
+
+    /**
+     * {summary}{Load the 3D image into a memory buffer.}
+     * {description}{Load the 3D image into a memory buffer. This call is only valid if this series corresponds to a 3D image. The "target" buffer must be wide enough to store all the voxels of the image.}
+     * {param}{target The target memory buffer.}
+     * {param}{format The memory layout of the voxels.}
+     * {param}{lineStride The number of bytes between two lines in the target memory buffer.}
+     * {param}{stackStride The number of bytes between two 2D slices in the target memory buffer.}
+     **/
     void Load3DImage(void* target,
                      Orthanc::PixelFormat format,
-                     size_t lineStride,
-                     size_t stackStride,
-                     Orthanc::ThreadedCommandProcessor::IListener& listener)
+                     int64_t lineStride,
+                     int64_t stackStride)
     {
-      Load3DImage(target, format, lineStride, stackStride, &listener);
+      Load3DImageInternal(target, format, static_cast<size_t>(lineStride),
+                          static_cast<size_t>(stackStride), NULL);
     }
 
+    /**
+     * {summary}{Load the 3D image into a memory buffer.}
+     * {description}{Load the 3D image into a memory buffer. This call is only valid if this series corresponds to a 3D image. The "target" buffer must be wide enough to store all the voxels of the image. This method will also update a progress indicator to monitor the loading of the image.}
+     * {param}{target The target memory buffer.}
+     * {param}{format The memory layout of the voxels.}
+     * {param}{lineStride The number of bytes between two lines in the target memory buffer.}
+     * {param}{stackStride The number of bytes between two 2D slices in the target memory buffer.}
+     * {param}{progress A pointer to a floating-point number that is continuously updated by the download threads to reflect the percentage of completion (between 0 and 1). This value can be read from a separate thread.}
+     **/
     void Load3DImage(void* target,
                      Orthanc::PixelFormat format,
-                     size_t lineStride,
-                     size_t stackStride)
-    {
-      Load3DImage(target, format, lineStride, stackStride, NULL);
-    }
+                     int64_t lineStride,
+                     int64_t stackStride,
+                     float* progress);
   };
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OrthancCppClient/SharedLibrary/AUTOGENERATED/ExternC.cpp	Thu Oct 17 14:21:50 2013 +0200
@@ -0,0 +1,1456 @@
+/**
+ * Laaw - Lightweight, Automated API Wrapper
+ * Copyright (C) 2010-2013 Jomago - Alain Mazy, Benjamin Golinvaux,
+ * Sebastien Jodogne
+ *
+ * This program is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * In addition, as a special exception, the copyright holders of this
+ * program give permission to link the code of its release with the
+ * OpenSSL project's "OpenSSL" library (or with modified versions of it
+ * that use the same license as the "OpenSSL" library), and distribute
+ * the linked executables. You must obey the GNU General Public License
+ * in all respects for all of the code used other than "OpenSSL". If you
+ * modify file(s) with this exception, you may extend this exception to
+ * your version of the file(s), but you are not obligated to do so. If
+ * you do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source files
+ * in the program, then also delete it here.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ **/
+
+
+#include <laaw.h>
+#include <string.h>  // For strcpy() and strlen()
+#include <stdlib.h>  // For free()
+
+static char* LAAW_EXTERNC_CopyString(const char* str)
+{
+  char* copy = reinterpret_cast<char*>(malloc(strlen(str) + 1));
+  strcpy(copy, str);
+  return copy;
+}
+
+extern "C"
+{
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_1f1acb322ea4d0aad65172824607673c(void** newObject, const char* arg0)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          *newObject = new OrthancClient::OrthancConnection(reinterpret_cast< const char* >(arg0));
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_f3fd272e4636f6a531aabb72ee01cd5b(void** newObject, const char* arg0, const char* arg1, const char* arg2)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          *newObject = new OrthancClient::OrthancConnection(reinterpret_cast< const char* >(arg0), reinterpret_cast< const char* >(arg1), reinterpret_cast< const char* >(arg2));
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_12d3de0a96e9efb11136a9811bb9ed38(void* thisObject)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          delete static_cast<OrthancClient::OrthancConnection*>(thisObject);
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_557aee7b61817292a0f31269d3c35db7(const void* thisObject, uint32_t* result)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          const OrthancClient::OrthancConnection* this_ = static_cast<const OrthancClient::OrthancConnection*>(thisObject);
+*result = this_->GetThreadCount();
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_0b8dff0ce67f10954a49b059e348837e(void* thisObject, uint32_t arg0)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          OrthancClient::OrthancConnection* this_ = static_cast<OrthancClient::OrthancConnection*>(thisObject);
+this_->SetThreadCount(arg0);
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_e05097c153f676e5a5ee54dcfc78256f(void* thisObject)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          OrthancClient::OrthancConnection* this_ = static_cast<OrthancClient::OrthancConnection*>(thisObject);
+this_->Reload();
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_e840242bf58d17d3c1d722da09ce88e0(const void* thisObject, const char** result)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          const OrthancClient::OrthancConnection* this_ = static_cast<const OrthancClient::OrthancConnection*>(thisObject);
+*result = this_->GetOrthancUrl();
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_c9af31433001b5dfc012a552dc6d0050(void* thisObject, uint32_t* result)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          OrthancClient::OrthancConnection* this_ = static_cast<OrthancClient::OrthancConnection*>(thisObject);
+*result = this_->GetPatientCount();
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_3fba4d6b818180a44cd1cae6046334dc(void* thisObject, void** result, uint32_t arg0)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          OrthancClient::OrthancConnection* this_ = static_cast<OrthancClient::OrthancConnection*>(thisObject);
+*result = &this_->GetPatient(arg0);
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_aeb20dc75b9246188db857317e5e0ce7(void* thisObject, uint32_t arg0)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          OrthancClient::OrthancConnection* this_ = static_cast<OrthancClient::OrthancConnection*>(thisObject);
+this_->DeletePatient(arg0);
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_62689803d9871e4d9c51a648640b320b(void* thisObject, const char* arg0)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          OrthancClient::OrthancConnection* this_ = static_cast<OrthancClient::OrthancConnection*>(thisObject);
+this_->StoreFile(reinterpret_cast< const char* >(arg0));
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_2fb64c9e5a67eccd413b0e913469a421(void* thisObject, const void* arg0, uint64_t arg1)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          OrthancClient::OrthancConnection* this_ = static_cast<OrthancClient::OrthancConnection*>(thisObject);
+this_->Store(reinterpret_cast< const void* >(arg0), arg1);
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_6cf0d7268667f9b0aa4511bacf184919(void** newObject, void* arg0, const char* arg1)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          *newObject = new OrthancClient::Patient(*reinterpret_cast< ::OrthancClient::OrthancConnection* >(arg0), reinterpret_cast< const char* >(arg1));
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_7d81cd502ee27e859735d0ea7112b5a1(void* thisObject)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          delete static_cast<OrthancClient::Patient*>(thisObject);
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_f756172daf04516eec3a566adabb4335(void* thisObject)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          OrthancClient::Patient* this_ = static_cast<OrthancClient::Patient*>(thisObject);
+this_->Reload();
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_ddb68763ec902a97d579666a73a20118(void* thisObject, uint32_t* result)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          OrthancClient::Patient* this_ = static_cast<OrthancClient::Patient*>(thisObject);
+*result = this_->GetStudyCount();
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_fba3c68b4be7558dbc65f7ce1ab57d63(void* thisObject, void** result, uint32_t arg0)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          OrthancClient::Patient* this_ = static_cast<OrthancClient::Patient*>(thisObject);
+*result = &this_->GetStudy(arg0);
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_b4ca99d958f843493e58d1ef967340e1(const void* thisObject, const char** result)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          const OrthancClient::Patient* this_ = static_cast<const OrthancClient::Patient*>(thisObject);
+*result = this_->GetId();
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_78d5cc76d282437b6f93ec3b82c35701(const void* thisObject, const char** result, const char* arg0, const char* arg1)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          const OrthancClient::Patient* this_ = static_cast<const OrthancClient::Patient*>(thisObject);
+*result = this_->GetMainDicomTag(reinterpret_cast< const char* >(arg0), reinterpret_cast< const char* >(arg1));
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_193599b9e345384fcdfcd47c29c55342(void** newObject, void* arg0, const char* arg1)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          *newObject = new OrthancClient::Series(*reinterpret_cast< ::OrthancClient::OrthancConnection* >(arg0), reinterpret_cast< const char* >(arg1));
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_7c97f17063a357d38c5fab1136ad12a0(void* thisObject)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          delete static_cast<OrthancClient::Series*>(thisObject);
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_48a2a1a9d68c047e22bfba23014643d2(void* thisObject)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          OrthancClient::Series* this_ = static_cast<OrthancClient::Series*>(thisObject);
+this_->Reload();
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_852bf8296ca21c5fde5ec565cc10721d(void* thisObject, uint32_t* result)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          OrthancClient::Series* this_ = static_cast<OrthancClient::Series*>(thisObject);
+*result = this_->GetInstanceCount();
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_efd04574e0779faa83df1f2d8f9888db(void* thisObject, void** result, uint32_t arg0)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          OrthancClient::Series* this_ = static_cast<OrthancClient::Series*>(thisObject);
+*result = &this_->GetInstance(arg0);
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_736247ff5e8036dac38163da6f666ed5(const void* thisObject, const char** result)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          const OrthancClient::Series* this_ = static_cast<const OrthancClient::Series*>(thisObject);
+*result = this_->GetId();
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_d82d2598a7a73f4b6fcc0c09c25b08ca(const void* thisObject, const char** result)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          const OrthancClient::Series* this_ = static_cast<const OrthancClient::Series*>(thisObject);
+*result = this_->GetUrl();
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_88134b978f9acb2aecdadf54aeab3c64(const void* thisObject, const char** result, const char* arg0, const char* arg1)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          const OrthancClient::Series* this_ = static_cast<const OrthancClient::Series*>(thisObject);
+*result = this_->GetMainDicomTag(reinterpret_cast< const char* >(arg0), reinterpret_cast< const char* >(arg1));
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_152cb1b704c053d24b0dab7461ba6ea3(void* thisObject, int32_t* result)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          OrthancClient::Series* this_ = static_cast<OrthancClient::Series*>(thisObject);
+*result = this_->Is3DImage();
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_eee03f337ec81d9f1783cd41e5238757(void* thisObject, uint32_t* result)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          OrthancClient::Series* this_ = static_cast<OrthancClient::Series*>(thisObject);
+*result = this_->GetWidth();
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_006f08237bd7611636fc721baebfb4c5(void* thisObject, uint32_t* result)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          OrthancClient::Series* this_ = static_cast<OrthancClient::Series*>(thisObject);
+*result = this_->GetHeight();
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_b794f5cd3dad7d7b575dd1fd902afdd0(void* thisObject, float* result)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          OrthancClient::Series* this_ = static_cast<OrthancClient::Series*>(thisObject);
+*result = this_->GetVoxelSizeX();
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_8ee2e50dd9df8f66a3c1766090dd03ab(void* thisObject, float* result)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          OrthancClient::Series* this_ = static_cast<OrthancClient::Series*>(thisObject);
+*result = this_->GetVoxelSizeY();
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_046aed35bbe4751691f4c34cc249a61d(void* thisObject, float* result)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          OrthancClient::Series* this_ = static_cast<OrthancClient::Series*>(thisObject);
+*result = this_->GetVoxelSizeZ();
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_4dcc7a0fd025efba251ac6e9b701c2c5(void* thisObject, void* arg0, int32_t arg1, int64_t arg2, int64_t arg3)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          OrthancClient::Series* this_ = static_cast<OrthancClient::Series*>(thisObject);
+this_->Load3DImage(reinterpret_cast< void* >(arg0), static_cast< ::Orthanc::PixelFormat >(arg1), arg2, arg3);
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_b2601a161c24ad0a1d3586246f87452c(void* thisObject, void* arg0, int32_t arg1, int64_t arg2, int64_t arg3, float* arg4)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          OrthancClient::Series* this_ = static_cast<OrthancClient::Series*>(thisObject);
+this_->Load3DImage(reinterpret_cast< void* >(arg0), static_cast< ::Orthanc::PixelFormat >(arg1), arg2, arg3, reinterpret_cast< float* >(arg4));
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_b01c6003238eb46c8db5dc823d7ca678(void** newObject, void* arg0, const char* arg1)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          *newObject = new OrthancClient::Study(*reinterpret_cast< ::OrthancClient::OrthancConnection* >(arg0), reinterpret_cast< const char* >(arg1));
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_0147007fb99bad8cd95a139ec8795376(void* thisObject)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          delete static_cast<OrthancClient::Study*>(thisObject);
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_e65b20b7e0170b67544cd6664a4639b7(void* thisObject)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          OrthancClient::Study* this_ = static_cast<OrthancClient::Study*>(thisObject);
+this_->Reload();
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_470e981b0e41f17231ba0ae6f3033321(void* thisObject, uint32_t* result)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          OrthancClient::Study* this_ = static_cast<OrthancClient::Study*>(thisObject);
+*result = this_->GetSeriesCount();
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_04cefd138b6ea15ad909858f2a0a8f05(void* thisObject, void** result, uint32_t arg0)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          OrthancClient::Study* this_ = static_cast<OrthancClient::Study*>(thisObject);
+*result = &this_->GetSeries(arg0);
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_aee5b1f6f0c082f2c3b0986f9f6a18c7(const void* thisObject, const char** result)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          const OrthancClient::Study* this_ = static_cast<const OrthancClient::Study*>(thisObject);
+*result = this_->GetId();
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_93965682bace75491413e1f0b8d5a654(const void* thisObject, const char** result, const char* arg0, const char* arg1)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          const OrthancClient::Study* this_ = static_cast<const OrthancClient::Study*>(thisObject);
+*result = this_->GetMainDicomTag(reinterpret_cast< const char* >(arg0), reinterpret_cast< const char* >(arg1));
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_6c5ad02f91b583e29cebd0bd319ce21d(void** newObject, void* arg0, const char* arg1)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          *newObject = new OrthancClient::Instance(*reinterpret_cast< ::OrthancClient::OrthancConnection* >(arg0), reinterpret_cast< const char* >(arg1));
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_4068241c44a9c1367fe0e57be523f207(void* thisObject)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          delete static_cast<OrthancClient::Instance*>(thisObject);
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_236ee8b403bc99535a8a4695c0cd45cb(const void* thisObject, const char** result)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          const OrthancClient::Instance* this_ = static_cast<const OrthancClient::Instance*>(thisObject);
+*result = this_->GetId();
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_2a437b7aba6bb01e81113835be8f0146(void* thisObject, int32_t arg0)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          OrthancClient::Instance* this_ = static_cast<OrthancClient::Instance*>(thisObject);
+this_->SetImageExtractionMode(static_cast< ::Orthanc::ImageExtractionMode >(arg0));
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_2bcbcb850934ae0bb4c6f0cc940e6cda(const void* thisObject, int32_t* result)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          const OrthancClient::Instance* this_ = static_cast<const OrthancClient::Instance*>(thisObject);
+*result = this_->GetImageExtractionMode();
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_8d415c3a78a48e7e61d9fd24e7c79484(const void* thisObject, const char** result, const char* arg0)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          const OrthancClient::Instance* this_ = static_cast<const OrthancClient::Instance*>(thisObject);
+*result = this_->GetTagAsString(reinterpret_cast< const char* >(arg0));
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_70d2f8398bbc63b5f792b69b4ad5fecb(const void* thisObject, float* result, const char* arg0)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          const OrthancClient::Instance* this_ = static_cast<const OrthancClient::Instance*>(thisObject);
+*result = this_->GetTagAsFloat(reinterpret_cast< const char* >(arg0));
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_1729a067d902771517388eedd7346b23(const void* thisObject, int32_t* result, const char* arg0)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          const OrthancClient::Instance* this_ = static_cast<const OrthancClient::Instance*>(thisObject);
+*result = this_->GetTagAsInt(reinterpret_cast< const char* >(arg0));
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_72e2aeee66cd3abd8ab7e987321c3745(void* thisObject, uint32_t* result)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          OrthancClient::Instance* this_ = static_cast<OrthancClient::Instance*>(thisObject);
+*result = this_->GetWidth();
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_1ea3df5a1ac1a1a687fe7325adddb6f0(void* thisObject, uint32_t* result)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          OrthancClient::Instance* this_ = static_cast<OrthancClient::Instance*>(thisObject);
+*result = this_->GetHeight();
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_99b4f370e4f532d8b763e2cb49db92f8(void* thisObject, uint32_t* result)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          OrthancClient::Instance* this_ = static_cast<OrthancClient::Instance*>(thisObject);
+*result = this_->GetPitch();
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_c41c742b68617f1c0590577a0a5ebc0c(void* thisObject, int32_t* result)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          OrthancClient::Instance* this_ = static_cast<OrthancClient::Instance*>(thisObject);
+*result = this_->GetPixelFormat();
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_142dd2feba0fc1d262bbd0baeb441a8b(void* thisObject, const void** result)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          OrthancClient::Instance* this_ = static_cast<OrthancClient::Instance*>(thisObject);
+*result = this_->GetBuffer();
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_5f5c9f81a4dff8daa6c359f1d0488fef(void* thisObject, const void** result, uint32_t arg0)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          OrthancClient::Instance* this_ = static_cast<OrthancClient::Instance*>(thisObject);
+*result = this_->GetBuffer(arg0);
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_9ca979fffd08fa256306d4e68d8b0e91(void* thisObject, uint64_t* result)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          OrthancClient::Instance* this_ = static_cast<OrthancClient::Instance*>(thisObject);
+*result = this_->GetDicomSize();
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_6f2d77a26edc91c28d89408dbc3c271e(void* thisObject, const void** result)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          OrthancClient::Instance* this_ = static_cast<OrthancClient::Instance*>(thisObject);
+*result = this_->GetDicom();
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_c0f494b80d4ff8b232df7a75baa0700a(void* thisObject)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          OrthancClient::Instance* this_ = static_cast<OrthancClient::Instance*>(thisObject);
+this_->DiscardImage();
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+      LAAW_EXPORT_DLL_API char* LAAW_CALL_CONVENTION LAAW_EXTERNC_d604f44bd5195e082e745e9cbc164f4c(void* thisObject)
+      {
+        try
+        {
+          #ifdef LAAW_EXTERNC_START_FUNCTION
+          LAAW_EXTERNC_START_FUNCTION;
+          #endif
+
+          OrthancClient::Instance* this_ = static_cast<OrthancClient::Instance*>(thisObject);
+this_->DiscardDicom();
+
+          return NULL;
+        }
+        catch (::Laaw::LaawException& e)
+        {
+          return LAAW_EXTERNC_CopyString(e.What());
+        }
+        catch (...)
+        {
+          return LAAW_EXTERNC_CopyString("...");
+        }
+      }
+
+
+  LAAW_EXPORT_DLL_API const char* LAAW_CALL_CONVENTION LAAW_EXTERNC_GetDescription()
+  {
+    return "Native client to the REST API of Orthanc";
+  }
+
+  LAAW_EXPORT_DLL_API const char* LAAW_CALL_CONVENTION LAAW_EXTERNC_GetCompany()
+  {
+    return "CHU of Liege";
+  }
+
+  LAAW_EXPORT_DLL_API const char* LAAW_CALL_CONVENTION LAAW_EXTERNC_GetProduct()
+  {
+    return "OrthancClient";
+  }
+
+  LAAW_EXPORT_DLL_API const char* LAAW_CALL_CONVENTION LAAW_EXTERNC_GetCopyright()
+  {
+    return "(c) 2012-2013, Sebastien Jodogne, CHU of Liege";
+  }
+
+  LAAW_EXPORT_DLL_API const char* LAAW_CALL_CONVENTION LAAW_EXTERNC_GetVersion()
+  {
+    return "0.6";
+  }
+
+  LAAW_EXPORT_DLL_API const char* LAAW_CALL_CONVENTION LAAW_EXTERNC_GetFileVersion()
+  {
+    return "0.6.0.2";
+  }
+
+  LAAW_EXPORT_DLL_API const char* LAAW_CALL_CONVENTION LAAW_EXTERNC_GetFullVersion()
+  {
+    return "0.6.2";
+  }
+
+  LAAW_EXPORT_DLL_API void LAAW_CALL_CONVENTION LAAW_EXTERNC_FreeString(char* str)
+  {
+    if (str != NULL)
+      free(str);
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OrthancCppClient/SharedLibrary/AUTOGENERATED/OrthancCppClient.h	Thu Oct 17 14:21:50 2013 +0200
@@ -0,0 +1,1749 @@
+/**
+ * Laaw - Lightweight, Automated API Wrapper
+ * Copyright (C) 2010-2013 Jomago - Alain Mazy, Benjamin Golinvaux,
+ * Sebastien Jodogne
+ *
+ * This program is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * In addition, as a special exception, the copyright holders of this
+ * program give permission to link the code of its release with the
+ * OpenSSL project's "OpenSSL" library (or with modified versions of it
+ * that use the same license as the "OpenSSL" library), and distribute
+ * the linked executables. You must obey the GNU General Public License
+ * in all respects for all of the code used other than "OpenSSL". If you
+ * modify file(s) with this exception, you may extend this exception to
+ * your version of the file(s), but you are not obligated to do so. If
+ * you do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source files
+ * in the program, then also delete it here.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ **/
+
+
+/**
+ * @file
+ **/
+
+#pragma once
+
+#include <stdexcept>
+#include <memory>
+#include <string>
+#include <string.h>
+
+#if defined(_WIN32)
+
+/********************************************************************
+ ** This is the Windows-specific section
+ ********************************************************************/
+
+#include <windows.h>
+
+/* cf. http://sourceforge.net/p/predef/wiki/Architectures/ */
+#ifdef _M_X64
+/* 64 bits target */
+#define LAAW_ORTHANC_CLIENT_CALL_CONV  __fastcall
+#define LAAW_ORTHANC_CLIENT_CALL_DECORATION(Name, StdCallSuffix) Name
+#define LAAW_ORTHANC_CLIENT_DEFAULT_PATH  "OrthancClient_Windows64.dll"
+#else
+/* 32 bits target */
+#define LAAW_ORTHANC_CLIENT_CALL_CONV  __stdcall
+#define LAAW_ORTHANC_CLIENT_CALL_DECORATION(Name, StdCallSuffix) "_" Name "@" StdCallSuffix
+#define LAAW_ORTHANC_CLIENT_DEFAULT_PATH  "OrthancClient_Windows32.dll"
+#endif
+
+#define LAAW_ORTHANC_CLIENT_HANDLE_TYPE  HINSTANCE
+#define LAAW_ORTHANC_CLIENT_HANDLE_NULL  0
+#define LAAW_ORTHANC_CLIENT_FUNCTION_TYPE  FARPROC
+#define LAAW_ORTHANC_CLIENT_LOADER(path) LoadLibraryA(path)
+#define LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle, name, decoration) GetProcAddress(handle, LAAW_ORTHANC_CLIENT_CALL_DECORATION(name, decoration))
+#define LAAW_ORTHANC_CLIENT_CLOSER(handle) FreeLibrary(handle)
+
+
+/********************************************************************
+ ** This is the Linux-specific section
+ ********************************************************************/
+
+#elif defined (__linux)
+
+#include <stdlib.h>
+#include <dlfcn.h>
+
+/* cf. http://sourceforge.net/p/predef/wiki/Architectures/ */
+#ifdef __amd64__
+#define LAAW_ORTHANC_CLIENT_DEFAULT_PATH  "libOrthancClient.so.0.6"
+#else
+#define LAAW_ORTHANC_CLIENT_DEFAULT_PATH  "libOrthancClient.so.0.6"
+#endif
+
+#define LAAW_ORTHANC_CLIENT_CALL_CONV
+#define LAAW_ORTHANC_CLIENT_HANDLE_TYPE  void*
+#define LAAW_ORTHANC_CLIENT_HANDLE_NULL  NULL
+#define LAAW_ORTHANC_CLIENT_FUNCTION_TYPE  intptr_t
+#define LAAW_ORTHANC_CLIENT_LOADER(path) dlopen(path, RTLD_LAZY)
+#define LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle, name, decoration) (LAAW_ORTHANC_CLIENT_FUNCTION_TYPE) dlsym(handle, name)
+#define LAAW_ORTHANC_CLIENT_CLOSER(handle) dlclose(handle)
+
+
+#else
+#error Please support your platform here
+#endif
+
+
+/********************************************************************
+ ** Definition of the integer types
+ ********************************************************************/
+
+#ifndef LAAW_INT8  // Only define the integer types once
+
+#if defined(__GNUC__)
+
+// Under GCC (including MinGW), the stdint.h standard header is used.
+
+#include <stdint.h>
+
+#define LAAW_INT8  int8_t
+#define LAAW_UINT8  uint8_t
+#define LAAW_INT16  int16_t
+#define LAAW_UINT16  uint16_t
+#define LAAW_INT32  int32_t
+#define LAAW_UINT32  uint32_t
+#define LAAW_INT64  int64_t
+#define LAAW_UINT64  uint64_t
+
+#elif defined(_MSC_VER)
+
+// Under Visual Studio, it is required to define the various integer
+// types by hand.
+
+#if (_MSC_VER < 1300)
+typedef signed char       LAAW_INT8;
+typedef signed short      LAAW_INT16;
+typedef signed int        LAAW_INT32;
+typedef unsigned char     LAAW_UINT8;
+typedef unsigned short    LAAW_UINT16;
+typedef unsigned int      LAAW_UINT32;
+#else
+typedef signed __int8     LAAW_INT8;
+typedef signed __int16    LAAW_INT16;
+typedef signed __int32    LAAW_INT32;
+typedef unsigned __int8   LAAW_UINT8;
+typedef unsigned __int16  LAAW_UINT16;
+typedef unsigned __int32  LAAW_UINT32;
+#endif
+
+typedef signed __int64   LAAW_INT64;
+typedef unsigned __int64 LAAW_UINT64;
+
+#else
+#error "Please support your compiler here"
+#endif
+
+#endif
+
+
+
+
+
+/********************************************************************
+ ** This is a shared section between Windows and Linux
+ ********************************************************************/
+
+namespace OrthancClient { 
+/**
+ * @brief Exception class that is thrown by the functions of this shared library.
+ **/
+class OrthancClientException : public std::exception
+  {
+  private:
+    std::string message_;
+
+  public:
+    /**
+     * @brief Constructs an exception.
+     * @param message The error message.
+     **/
+    OrthancClientException(std::string message) : message_(message) 
+    {
+    }
+
+    ~OrthancClientException() throw()
+    {
+    }
+
+    /**
+     * @brief Get the error message associated with this exception.
+     * @returns The error message.
+     **/
+    const std::string& What() const throw()
+    {
+      return message_; 
+    }
+};
+}
+
+
+namespace OrthancClient { namespace Internals { 
+/**
+ * This internal class implements a Singleton design pattern that will
+ * store a reference to the shared library handle, together with a
+ * pointer to each function in the shared library.
+ **/
+class Library
+  {
+  private:
+    LAAW_ORTHANC_CLIENT_HANDLE_TYPE  handle_;
+    LAAW_ORTHANC_CLIENT_FUNCTION_TYPE  functionsIndex_[60 + 1];
+
+
+
+    void Load(const char* sharedLibraryPath)
+    {
+
+      if (handle_ != LAAW_ORTHANC_CLIENT_HANDLE_NULL)
+      {
+        // Do nothing if the library is already loaded
+        return;
+      }
+
+      /* Setup the path to the default shared library if not provided */
+      if (sharedLibraryPath == NULL)
+      {
+        sharedLibraryPath = LAAW_ORTHANC_CLIENT_DEFAULT_PATH;
+      }
+
+      /* Load the shared library */
+      handle_ = LAAW_ORTHANC_CLIENT_LOADER(sharedLibraryPath);
+
+
+      if (handle_ == LAAW_ORTHANC_CLIENT_HANDLE_NULL)
+      {
+        throw ::OrthancClient::OrthancClientException("Error loading shared library");
+      }
+
+      LoadFunctions();
+    }
+
+    inline void LoadFunctions();
+
+    void FreeString(char* str)
+    {
+      typedef void (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (char*);
+      Function function = (Function) GetFunction(60);
+      function(str);
+    }
+
+    Library()
+    {
+      handle_ = LAAW_ORTHANC_CLIENT_HANDLE_NULL;
+    }
+
+    ~Library()
+    {
+      Finalize();
+    }
+
+  public:
+    LAAW_ORTHANC_CLIENT_FUNCTION_TYPE  GetFunction(unsigned int index)
+    {
+      /**
+       * If the library has not been manually initialized by a call to
+       * ::OrthancClient::Initialize(), it is loaded from
+       * the default location (lazy initialization).
+       **/
+      if (handle_ == NULL)
+      {
+        Load(NULL);
+      }
+
+      return functionsIndex_[index];
+    }
+
+    void ThrowExceptionIfNeeded(char* message)
+    {
+      if (message != NULL)
+      {
+        std::string tmp(message);
+        FreeString(message);
+        throw ::OrthancClient::OrthancClientException(tmp);
+      }
+    }
+
+    static inline Library& GetInstance()
+    {
+      /**
+       * This function defines a "static variable" inside a "static
+       * inline method" of a class.  This ensures that a single
+       * instance of this variable will be used across all the
+       * compilation modules of the software.
+       * http://stackoverflow.com/a/1389403/881731
+       **/
+
+      static Library singleton;
+      return singleton;
+    }
+
+    static void Initialize(const char* sharedLibraryPath)
+    {
+      GetInstance().Load(sharedLibraryPath);
+    }
+
+    void Finalize()
+    {
+      if (handle_ != LAAW_ORTHANC_CLIENT_HANDLE_NULL)
+      {
+        LAAW_ORTHANC_CLIENT_CLOSER(handle_);
+        handle_ = LAAW_ORTHANC_CLIENT_HANDLE_NULL;
+      }
+    }
+};
+}}
+
+
+/*!
+ * \addtogroup Global Global definitions.
+ * @{
+ * @}
+ */
+
+
+namespace OrthancClient { 
+/*!
+ * \addtogroup Initialization Initialization of the shared library.
+ * @{
+ */
+
+/**
+ * @brief Manually initialize the shared library, using the default library name.
+ * 
+ * Call this method before using the library to ensure correct
+ * behaviour in multi-threaded applications.  This method is also
+ * useful to control the time at which the shared library is
+ * loaded (e.g. for real-time applications).
+ **/
+inline void Initialize()
+{
+  ::OrthancClient::Internals::Library::Initialize(NULL);
+}
+
+/**
+ * @brief Manually initialize the shared library.
+ * 
+ * Call this method before using the library to ensure correct
+ * behaviour in multi-threaded applications.  This method is also
+ * useful to control the time at which the shared library is
+ * loaded (e.g. for real-time applications).
+ *
+ * @param sharedLibraryPath The path to the shared library that
+ * contains the module.
+ **/
+inline void Initialize(const std::string& sharedLibraryPath)
+{
+  ::OrthancClient::Internals::Library::Initialize(sharedLibraryPath.c_str());
+}
+
+/**
+ * @brief Manually finalize the shared library.
+ * 
+ * Calling explicitly this function is not mandatory. It is useful to
+ * force the release of the resources acquired by the shared library,
+ * or to manually control the order in which the global variables get
+ * deleted.
+ **/
+inline void Finalize()
+{
+  ::OrthancClient::Internals::Library::GetInstance().Finalize();
+}
+
+
+/**
+ * @}
+ */
+}
+
+
+
+void ::OrthancClient::Internals::Library::LoadFunctions()
+{
+  typedef const char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) ();
+  Function getVersion = (Function) LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_GetVersion", "0");
+  if (getVersion == NULL)
+  {
+    throw ::OrthancClient::OrthancClientException("Unable to get the library version");
+  }
+
+  /**
+   * It is assumed that the API does not change when the revision
+   * number (MAJOR.MINOR.REVISION) changes.
+   **/
+  if (strcmp(getVersion(), "0.6"))
+  {
+    throw ::OrthancClient::OrthancClientException("Mismatch between the C++ header and the library version");
+  }
+
+  functionsIndex_[60] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_FreeString", "4");
+  functionsIndex_[3] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_557aee7b61817292a0f31269d3c35db7", "8");
+  functionsIndex_[4] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_0b8dff0ce67f10954a49b059e348837e", "8");
+  functionsIndex_[5] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_e05097c153f676e5a5ee54dcfc78256f", "4");
+  functionsIndex_[6] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_e840242bf58d17d3c1d722da09ce88e0", "8");
+  functionsIndex_[7] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_c9af31433001b5dfc012a552dc6d0050", "8");
+  functionsIndex_[8] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_3fba4d6b818180a44cd1cae6046334dc", "12");
+  functionsIndex_[9] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_aeb20dc75b9246188db857317e5e0ce7", "8");
+  functionsIndex_[10] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_62689803d9871e4d9c51a648640b320b", "8");
+  functionsIndex_[11] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_2fb64c9e5a67eccd413b0e913469a421", "16");
+  functionsIndex_[0] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_1f1acb322ea4d0aad65172824607673c", "8");
+  functionsIndex_[1] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_f3fd272e4636f6a531aabb72ee01cd5b", "16");
+  functionsIndex_[2] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_12d3de0a96e9efb11136a9811bb9ed38", "4");
+  functionsIndex_[14] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_f756172daf04516eec3a566adabb4335", "4");
+  functionsIndex_[15] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_ddb68763ec902a97d579666a73a20118", "8");
+  functionsIndex_[16] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_fba3c68b4be7558dbc65f7ce1ab57d63", "12");
+  functionsIndex_[17] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_b4ca99d958f843493e58d1ef967340e1", "8");
+  functionsIndex_[18] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_78d5cc76d282437b6f93ec3b82c35701", "16");
+  functionsIndex_[12] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_6cf0d7268667f9b0aa4511bacf184919", "12");
+  functionsIndex_[13] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_7d81cd502ee27e859735d0ea7112b5a1", "4");
+  functionsIndex_[21] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_48a2a1a9d68c047e22bfba23014643d2", "4");
+  functionsIndex_[22] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_852bf8296ca21c5fde5ec565cc10721d", "8");
+  functionsIndex_[23] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_efd04574e0779faa83df1f2d8f9888db", "12");
+  functionsIndex_[24] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_736247ff5e8036dac38163da6f666ed5", "8");
+  functionsIndex_[25] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_d82d2598a7a73f4b6fcc0c09c25b08ca", "8");
+  functionsIndex_[26] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_88134b978f9acb2aecdadf54aeab3c64", "16");
+  functionsIndex_[27] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_152cb1b704c053d24b0dab7461ba6ea3", "8");
+  functionsIndex_[28] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_eee03f337ec81d9f1783cd41e5238757", "8");
+  functionsIndex_[29] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_006f08237bd7611636fc721baebfb4c5", "8");
+  functionsIndex_[30] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_b794f5cd3dad7d7b575dd1fd902afdd0", "8");
+  functionsIndex_[31] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_8ee2e50dd9df8f66a3c1766090dd03ab", "8");
+  functionsIndex_[32] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_046aed35bbe4751691f4c34cc249a61d", "8");
+  functionsIndex_[33] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_4dcc7a0fd025efba251ac6e9b701c2c5", "28");
+  functionsIndex_[34] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_b2601a161c24ad0a1d3586246f87452c", "32");
+  functionsIndex_[19] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_193599b9e345384fcdfcd47c29c55342", "12");
+  functionsIndex_[20] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_7c97f17063a357d38c5fab1136ad12a0", "4");
+  functionsIndex_[37] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_e65b20b7e0170b67544cd6664a4639b7", "4");
+  functionsIndex_[38] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_470e981b0e41f17231ba0ae6f3033321", "8");
+  functionsIndex_[39] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_04cefd138b6ea15ad909858f2a0a8f05", "12");
+  functionsIndex_[40] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_aee5b1f6f0c082f2c3b0986f9f6a18c7", "8");
+  functionsIndex_[41] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_93965682bace75491413e1f0b8d5a654", "16");
+  functionsIndex_[35] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_b01c6003238eb46c8db5dc823d7ca678", "12");
+  functionsIndex_[36] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_0147007fb99bad8cd95a139ec8795376", "4");
+  functionsIndex_[44] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_236ee8b403bc99535a8a4695c0cd45cb", "8");
+  functionsIndex_[45] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_2a437b7aba6bb01e81113835be8f0146", "8");
+  functionsIndex_[46] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_2bcbcb850934ae0bb4c6f0cc940e6cda", "8");
+  functionsIndex_[47] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_8d415c3a78a48e7e61d9fd24e7c79484", "12");
+  functionsIndex_[48] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_70d2f8398bbc63b5f792b69b4ad5fecb", "12");
+  functionsIndex_[49] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_1729a067d902771517388eedd7346b23", "12");
+  functionsIndex_[50] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_72e2aeee66cd3abd8ab7e987321c3745", "8");
+  functionsIndex_[51] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_1ea3df5a1ac1a1a687fe7325adddb6f0", "8");
+  functionsIndex_[52] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_99b4f370e4f532d8b763e2cb49db92f8", "8");
+  functionsIndex_[53] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_c41c742b68617f1c0590577a0a5ebc0c", "8");
+  functionsIndex_[54] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_142dd2feba0fc1d262bbd0baeb441a8b", "8");
+  functionsIndex_[55] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_5f5c9f81a4dff8daa6c359f1d0488fef", "12");
+  functionsIndex_[56] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_9ca979fffd08fa256306d4e68d8b0e91", "8");
+  functionsIndex_[57] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_6f2d77a26edc91c28d89408dbc3c271e", "8");
+  functionsIndex_[58] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_c0f494b80d4ff8b232df7a75baa0700a", "4");
+  functionsIndex_[59] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_d604f44bd5195e082e745e9cbc164f4c", "4");
+  functionsIndex_[42] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_6c5ad02f91b583e29cebd0bd319ce21d", "12");
+  functionsIndex_[43] = LAAW_ORTHANC_CLIENT_GET_FUNCTION(handle_, "LAAW_EXTERNC_4068241c44a9c1367fe0e57be523f207", "4");
+  
+  /* Check whether the functions were properly loaded */
+  for (unsigned int i = 0; i <= 60; i++)
+  {
+    if (functionsIndex_[i] == (LAAW_ORTHANC_CLIENT_FUNCTION_TYPE) NULL)
+    {
+      throw ::OrthancClient::OrthancClientException("Unable to load the functions of the shared library");
+    }
+  }
+}
+namespace OrthancClient
+{
+  class OrthancConnection;
+}
+
+namespace OrthancClient
+{
+  class Patient;
+}
+
+namespace OrthancClient
+{
+  class Series;
+}
+
+namespace OrthancClient
+{
+  class Study;
+}
+
+namespace OrthancClient
+{
+  class Instance;
+}
+
+namespace Orthanc
+{
+  /**
+  * @brief The memory layout of the pixels (resp. voxels) of a 2D (resp. 3D) image.
+  *
+  * The memory layout of the pixels (resp. voxels) of a 2D (resp. 3D) image.
+  *
+  * @ingroup Global
+  **/
+  enum PixelFormat
+  {
+    /**
+    * @brief Graylevel, signed 16bpp image.
+    *
+    * The image is graylevel. Each pixel is signed and stored in two bytes.
+    *
+    **/
+    PixelFormat_SignedGrayscale16 = 3,
+    /**
+    * @brief Color image in RGB24 format.
+    *
+    * Color image in RGB24 format.
+    *
+    **/
+    PixelFormat_RGB24 = 0,
+    /**
+    * @brief Graylevel 8bpp image.
+    *
+    * The image is graylevel. Each pixel is unsigned and stored in one byte.
+    *
+    **/
+    PixelFormat_Grayscale8 = 1,
+    /**
+    * @brief Graylevel, unsigned 16bpp image.
+    *
+    * The image is graylevel. Each pixel is unsigned and stored in two bytes.
+    *
+    **/
+    PixelFormat_Grayscale16 = 2
+  };
+}
+
+namespace Orthanc
+{
+  /**
+  * @brief The extraction mode specifies the way the values of the pixels are scaled when downloading a 2D image.
+  *
+  * The extraction mode specifies the way the values of the pixels are scaled when downloading a 2D image.
+  *
+  * @ingroup Global
+  **/
+  enum ImageExtractionMode
+  {
+    /**
+    * @brief Truncation to the [-32768, 32767] range.
+    *
+    * Truncation to the [-32768, 32767] range.
+    *
+    **/
+    ImageExtractionMode_Int16 = 3,
+    /**
+    * @brief Rescaled to 8bpp.
+    *
+    * The minimum value of the image is set to 0, and its maximum value is set to 255.
+    *
+    **/
+    ImageExtractionMode_Preview = 0,
+    /**
+    * @brief Truncation to the [0, 255] range.
+    *
+    * Truncation to the [0, 255] range.
+    *
+    **/
+    ImageExtractionMode_UInt8 = 1,
+    /**
+    * @brief Truncation to the [0, 65535] range.
+    *
+    * Truncation to the [0, 65535] range.
+    *
+    **/
+    ImageExtractionMode_UInt16 = 2
+  };
+}
+
+namespace OrthancClient
+{
+  /**
+  * @brief Connection to an instance of %Orthanc.
+  *
+  * This class encapsulates a connection to a remote instance of %Orthanc through its REST API.
+  *
+  **/
+  class OrthancConnection
+  {
+    friend class ::OrthancClient::Patient;
+    friend class ::OrthancClient::Series;
+    friend class ::OrthancClient::Study;
+    friend class ::OrthancClient::Instance;
+  private:
+    bool isReference_;
+    OrthancConnection& operator= (const OrthancConnection&); // Assignment is forbidden
+    void* pimpl_;
+    OrthancConnection(void* pimpl) : isReference_(true), pimpl_(pimpl) {}
+  public:
+    /**
+     * @brief Construct a new reference to this object.
+     *
+     * Construct a new reference to this object. Pay attention to the fact that when the referenced object is deleted, the content of this object will be invalid.
+     *
+     * @param other The original object.
+     **/
+    OrthancConnection(const OrthancConnection& other) : pimpl_(other.pimpl_), isReference_(true) { }
+    inline OrthancConnection(const ::std::string& orthancUrl);
+    inline OrthancConnection(const ::std::string& orthancUrl, const ::std::string& username, const ::std::string& password);
+    inline ~OrthancConnection();
+    inline LAAW_UINT32 GetThreadCount() const;
+    inline void SetThreadCount(LAAW_UINT32 threadCount);
+    inline void Reload();
+    inline ::std::string GetOrthancUrl() const;
+    inline LAAW_UINT32 GetPatientCount();
+    inline ::OrthancClient::Patient GetPatient(LAAW_UINT32 index);
+    inline void DeletePatient(LAAW_UINT32 index);
+    inline void StoreFile(const ::std::string& filename);
+    inline void Store(const void* dicom, LAAW_UINT64 size);
+  };
+}
+
+namespace OrthancClient
+{
+  /**
+  * @brief Connection to a patient stored in %Orthanc.
+  *
+  * This class encapsulates a connection to a patient from a remote instance of %Orthanc.
+  *
+  **/
+  class Patient
+  {
+    friend class ::OrthancClient::OrthancConnection;
+    friend class ::OrthancClient::Series;
+    friend class ::OrthancClient::Study;
+    friend class ::OrthancClient::Instance;
+  private:
+    bool isReference_;
+    Patient& operator= (const Patient&); // Assignment is forbidden
+    void* pimpl_;
+    Patient(void* pimpl) : isReference_(true), pimpl_(pimpl) {}
+  public:
+    /**
+     * @brief Construct a new reference to this object.
+     *
+     * Construct a new reference to this object. Pay attention to the fact that when the referenced object is deleted, the content of this object will be invalid.
+     *
+     * @param other The original object.
+     **/
+    Patient(const Patient& other) : pimpl_(other.pimpl_), isReference_(true) { }
+    inline Patient(::OrthancClient::OrthancConnection& connection, const ::std::string& id);
+    inline ~Patient();
+    inline void Reload();
+    inline LAAW_UINT32 GetStudyCount();
+    inline ::OrthancClient::Study GetStudy(LAAW_UINT32 index);
+    inline ::std::string GetId() const;
+    inline ::std::string GetMainDicomTag(const ::std::string& tag, const ::std::string& defaultValue) const;
+  };
+}
+
+namespace OrthancClient
+{
+  /**
+  * @brief Connection to a series stored in %Orthanc.
+  *
+  * This class encapsulates a connection to a series from a remote instance of %Orthanc.
+  *
+  **/
+  class Series
+  {
+    friend class ::OrthancClient::OrthancConnection;
+    friend class ::OrthancClient::Patient;
+    friend class ::OrthancClient::Study;
+    friend class ::OrthancClient::Instance;
+  private:
+    bool isReference_;
+    Series& operator= (const Series&); // Assignment is forbidden
+    void* pimpl_;
+    Series(void* pimpl) : isReference_(true), pimpl_(pimpl) {}
+  public:
+    /**
+     * @brief Construct a new reference to this object.
+     *
+     * Construct a new reference to this object. Pay attention to the fact that when the referenced object is deleted, the content of this object will be invalid.
+     *
+     * @param other The original object.
+     **/
+    Series(const Series& other) : pimpl_(other.pimpl_), isReference_(true) { }
+    inline Series(::OrthancClient::OrthancConnection& connection, const ::std::string& id);
+    inline ~Series();
+    inline void Reload();
+    inline LAAW_UINT32 GetInstanceCount();
+    inline ::OrthancClient::Instance GetInstance(LAAW_UINT32 index);
+    inline ::std::string GetId() const;
+    inline ::std::string GetUrl() const;
+    inline ::std::string GetMainDicomTag(const ::std::string& tag, const ::std::string& defaultValue) const;
+    inline bool Is3DImage();
+    inline LAAW_UINT32 GetWidth();
+    inline LAAW_UINT32 GetHeight();
+    inline float GetVoxelSizeX();
+    inline float GetVoxelSizeY();
+    inline float GetVoxelSizeZ();
+    inline void Load3DImage(void* target, ::Orthanc::PixelFormat format, LAAW_INT64 lineStride, LAAW_INT64 stackStride);
+    inline void Load3DImage(void* target, ::Orthanc::PixelFormat format, LAAW_INT64 lineStride, LAAW_INT64 stackStride, float progress[]);
+  };
+}
+
+namespace OrthancClient
+{
+  /**
+  * @brief Connection to a study stored in %Orthanc.
+  *
+  * This class encapsulates a connection to a study from a remote instance of %Orthanc.
+  *
+  **/
+  class Study
+  {
+    friend class ::OrthancClient::OrthancConnection;
+    friend class ::OrthancClient::Patient;
+    friend class ::OrthancClient::Series;
+    friend class ::OrthancClient::Instance;
+  private:
+    bool isReference_;
+    Study& operator= (const Study&); // Assignment is forbidden
+    void* pimpl_;
+    Study(void* pimpl) : isReference_(true), pimpl_(pimpl) {}
+  public:
+    /**
+     * @brief Construct a new reference to this object.
+     *
+     * Construct a new reference to this object. Pay attention to the fact that when the referenced object is deleted, the content of this object will be invalid.
+     *
+     * @param other The original object.
+     **/
+    Study(const Study& other) : pimpl_(other.pimpl_), isReference_(true) { }
+    inline Study(::OrthancClient::OrthancConnection& connection, const ::std::string& id);
+    inline ~Study();
+    inline void Reload();
+    inline LAAW_UINT32 GetSeriesCount();
+    inline ::OrthancClient::Series GetSeries(LAAW_UINT32 index);
+    inline ::std::string GetId() const;
+    inline ::std::string GetMainDicomTag(const ::std::string& tag, const ::std::string& defaultValue) const;
+  };
+}
+
+namespace OrthancClient
+{
+  /**
+  * @brief Connection to an instance stored in %Orthanc.
+  *
+  * This class encapsulates a connection to an image instance from a remote instance of %Orthanc.
+  *
+  **/
+  class Instance
+  {
+    friend class ::OrthancClient::OrthancConnection;
+    friend class ::OrthancClient::Patient;
+    friend class ::OrthancClient::Series;
+    friend class ::OrthancClient::Study;
+  private:
+    bool isReference_;
+    Instance& operator= (const Instance&); // Assignment is forbidden
+    void* pimpl_;
+    Instance(void* pimpl) : isReference_(true), pimpl_(pimpl) {}
+  public:
+    /**
+     * @brief Construct a new reference to this object.
+     *
+     * Construct a new reference to this object. Pay attention to the fact that when the referenced object is deleted, the content of this object will be invalid.
+     *
+     * @param other The original object.
+     **/
+    Instance(const Instance& other) : pimpl_(other.pimpl_), isReference_(true) { }
+    inline Instance(::OrthancClient::OrthancConnection& connection, const ::std::string& id);
+    inline ~Instance();
+    inline ::std::string GetId() const;
+    inline void SetImageExtractionMode(::Orthanc::ImageExtractionMode mode);
+    inline ::Orthanc::ImageExtractionMode GetImageExtractionMode() const;
+    inline ::std::string GetTagAsString(const ::std::string& tag) const;
+    inline float GetTagAsFloat(const ::std::string& tag) const;
+    inline LAAW_INT32 GetTagAsInt(const ::std::string& tag) const;
+    inline LAAW_UINT32 GetWidth();
+    inline LAAW_UINT32 GetHeight();
+    inline LAAW_UINT32 GetPitch();
+    inline ::Orthanc::PixelFormat GetPixelFormat();
+    inline const void* GetBuffer();
+    inline const void* GetBuffer(LAAW_UINT32 y);
+    inline LAAW_UINT64 GetDicomSize();
+    inline const void* GetDicom();
+    inline void DiscardImage();
+    inline void DiscardDicom();
+  };
+}
+
+namespace OrthancClient
+{
+  /**
+  * @brief Create a connection to an instance of %Orthanc.
+  *
+  * Create a connection to an instance of %Orthanc.
+  *
+  * @param orthancUrl URL to which the REST API of %Orthanc is listening.
+  **/
+  inline OrthancConnection::OrthancConnection(const ::std::string& orthancUrl)
+  {
+    isReference_ = false;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void**, const char*);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(0);
+    char* error = function(&pimpl_, orthancUrl.c_str());
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+  }
+  /**
+  * @brief Create a connection to an instance of %Orthanc, with authentication.
+  *
+  * Create a connection to an instance of %Orthanc, with authentication.
+  *
+  * @param orthancUrl URL to which the REST API of %Orthanc is listening.
+  * @param username The username.
+  * @param password The password.
+  **/
+  inline OrthancConnection::OrthancConnection(const ::std::string& orthancUrl, const ::std::string& username, const ::std::string& password)
+  {
+    isReference_ = false;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void**, const char*, const char*, const char*);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(1);
+    char* error = function(&pimpl_, orthancUrl.c_str(), username.c_str(), password.c_str());
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+  }
+  /**
+  * @brief Destructs the object.
+  *
+  * Destructs the object.
+  *
+  **/
+  inline OrthancConnection::~OrthancConnection()
+  {
+    if (isReference_) return;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void*);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(2);
+    char* error = function(pimpl_);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+  }
+  /**
+  * @brief Returns the number of threads for this connection.
+  *
+  * Returns the number of simultaneous connections that are used when downloading information from this instance of %Orthanc.
+  *
+  * @return The number of threads.
+  **/
+  inline LAAW_UINT32 OrthancConnection::GetThreadCount() const
+  {
+    LAAW_UINT32 result_;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (const void*, LAAW_UINT32*);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(3);
+    char* error = function(pimpl_, &result_);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+    return result_;
+  }
+  /**
+  * @brief Sets the number of threads for this connection.
+  *
+  * Sets the number of simultaneous connections that are used when downloading information from this instance of %Orthanc.
+  *
+  * @param threadCount The number of threads.
+  **/
+  inline void OrthancConnection::SetThreadCount(LAAW_UINT32 threadCount)
+  {
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void*, LAAW_UINT32);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(4);
+    char* error = function(pimpl_, threadCount);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+  }
+  /**
+  * @brief Reload the list of the patients.
+  *
+  * This method will reload the list of the patients from the remote instance of %Orthanc. Pay attention to the fact that the patients that have been previously returned by GetPatient() will be invalidated.
+  *
+  **/
+  inline void OrthancConnection::Reload()
+  {
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void*);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(5);
+    char* error = function(pimpl_);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+  }
+  /**
+  * @brief Returns the URL of this instance of %Orthanc.
+  *
+  * Returns the URL of the remote %Orthanc instance to which this object is connected.
+  *
+  * @return The URL.
+  **/
+  inline ::std::string OrthancConnection::GetOrthancUrl() const
+  {
+    const char* result_;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (const void*, const char**);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(6);
+    char* error = function(pimpl_, &result_);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+    return std::string(result_);
+  }
+  /**
+  * @brief Returns the number of patients.
+  *
+  * Returns the number of patients that are stored in the remote instance of %Orthanc.
+  *
+  * @return The number of patients.
+  **/
+  inline LAAW_UINT32 OrthancConnection::GetPatientCount()
+  {
+    LAAW_UINT32 result_;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void*, LAAW_UINT32*);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(7);
+    char* error = function(pimpl_, &result_);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+    return result_;
+  }
+  /**
+  * @brief Get some patient.
+  *
+  * This method will return an object that contains information about some patient. The patients are indexed by a number between 0 (inclusive) and the result of GetPatientCount() (exclusive).
+  *
+  * @param index The index of the patient of interest.
+  * @return The patient.
+  **/
+  inline ::OrthancClient::Patient OrthancConnection::GetPatient(LAAW_UINT32 index)
+  {
+    void* result_;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void*, void**, LAAW_UINT32);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(8);
+    char* error = function(pimpl_, &result_, index);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+    return ::OrthancClient::Patient(result_);
+  }
+  /**
+  * @brief Delete some patient.
+  *
+  * Delete some patient from the remote instance of %Orthanc. Pay attention to the fact that the patients that have been previously returned by GetPatient() will be invalidated.
+  *
+  * @param index The index of the patient of interest.
+  * @return The patient.
+  **/
+  inline void OrthancConnection::DeletePatient(LAAW_UINT32 index)
+  {
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void*, LAAW_UINT32);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(9);
+    char* error = function(pimpl_, index);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+  }
+  /**
+  * @brief Send a DICOM file.
+  *
+  * This method will store a DICOM file in the remote instance of %Orthanc. Pay attention to the fact that the patients that have been previously returned by GetPatient() will be invalidated.
+  *
+  * @param filename Path to the DICOM file
+  **/
+  inline void OrthancConnection::StoreFile(const ::std::string& filename)
+  {
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void*, const char*);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(10);
+    char* error = function(pimpl_, filename.c_str());
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+  }
+  /**
+  * @brief Send a DICOM file that is contained inside a memory buffer.
+  *
+  * This method will store a DICOM file in the remote instance of %Orthanc. Pay attention to the fact that the patients that have been previously returned by GetPatient() will be invalidated.
+  *
+  * @param dicom The memory buffer containing the DICOM file.
+  * @param size The size of the DICOM file.
+  **/
+  inline void OrthancConnection::Store(const void* dicom, LAAW_UINT64 size)
+  {
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void*, const void*, LAAW_UINT64);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(11);
+    char* error = function(pimpl_, dicom, size);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+  }
+}
+
+namespace OrthancClient
+{
+  /**
+  * @brief Create a connection to some patient.
+  *
+  * Create a connection to some patient.
+  *
+  * @param connection The remote instance of %Orthanc.
+  * @param id The %Orthanc identifier of the patient.
+  **/
+  inline Patient::Patient(::OrthancClient::OrthancConnection& connection, const ::std::string& id)
+  {
+    isReference_ = false;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void**, void*, const char*);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(12);
+    char* error = function(&pimpl_, connection.pimpl_, id.c_str());
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+  }
+  /**
+  * @brief Destructs the object.
+  *
+  * Destructs the object.
+  *
+  **/
+  inline Patient::~Patient()
+  {
+    if (isReference_) return;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void*);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(13);
+    char* error = function(pimpl_);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+  }
+  /**
+  * @brief Reload the studies of this patient.
+  *
+  * This method will reload the list of the studies of this patient. Pay attention to the fact that the studies that have been previously returned by GetStudy() will be invalidated.
+  *
+  **/
+  inline void Patient::Reload()
+  {
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void*);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(14);
+    char* error = function(pimpl_);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+  }
+  /**
+  * @brief Return the number of studies for this patient.
+  *
+  * Return the number of studies for this patient.
+  *
+  * @return The number of studies.
+  **/
+  inline LAAW_UINT32 Patient::GetStudyCount()
+  {
+    LAAW_UINT32 result_;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void*, LAAW_UINT32*);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(15);
+    char* error = function(pimpl_, &result_);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+    return result_;
+  }
+  /**
+  * @brief Get some study of this patient.
+  *
+  * This method will return an object that contains information about some study. The studies are indexed by a number between 0 (inclusive) and the result of GetStudyCount() (exclusive).
+  *
+  * @param index The index of the study of interest.
+  * @return The study.
+  **/
+  inline ::OrthancClient::Study Patient::GetStudy(LAAW_UINT32 index)
+  {
+    void* result_;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void*, void**, LAAW_UINT32);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(16);
+    char* error = function(pimpl_, &result_, index);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+    return ::OrthancClient::Study(result_);
+  }
+  /**
+  * @brief Get the %Orthanc identifier of this patient.
+  *
+  * Get the %Orthanc identifier of this patient.
+  *
+  * @return The identifier.
+  **/
+  inline ::std::string Patient::GetId() const
+  {
+    const char* result_;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (const void*, const char**);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(17);
+    char* error = function(pimpl_, &result_);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+    return std::string(result_);
+  }
+  /**
+  * @brief Get the value of one of the main DICOM tags for this patient.
+  *
+  * Get the value of one of the main DICOM tags for this patient.
+  *
+  * @param tag The name of the tag of interest ("PatientName", "PatientID", "PatientSex" or "PatientBirthDate").
+  * @param defaultValue The default value to be returned if this tag does not exist.
+  * @return The value of the tag.
+  **/
+  inline ::std::string Patient::GetMainDicomTag(const ::std::string& tag, const ::std::string& defaultValue) const
+  {
+    const char* result_;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (const void*, const char**, const char*, const char*);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(18);
+    char* error = function(pimpl_, &result_, tag.c_str(), defaultValue.c_str());
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+    return std::string(result_);
+  }
+}
+
+namespace OrthancClient
+{
+  /**
+  * @brief Create a connection to some series.
+  *
+  * Create a connection to some series.
+  *
+  * @param connection The remote instance of %Orthanc.
+  * @param id The %Orthanc identifier of the series.
+  **/
+  inline Series::Series(::OrthancClient::OrthancConnection& connection, const ::std::string& id)
+  {
+    isReference_ = false;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void**, void*, const char*);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(19);
+    char* error = function(&pimpl_, connection.pimpl_, id.c_str());
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+  }
+  /**
+  * @brief Destructs the object.
+  *
+  * Destructs the object.
+  *
+  **/
+  inline Series::~Series()
+  {
+    if (isReference_) return;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void*);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(20);
+    char* error = function(pimpl_);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+  }
+  /**
+  * @brief Reload the instances of this series.
+  *
+  * This method will reload the list of the instances of this series. Pay attention to the fact that the instances that have been previously returned by GetInstance() will be invalidated.
+  *
+  **/
+  inline void Series::Reload()
+  {
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void*);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(21);
+    char* error = function(pimpl_);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+  }
+  /**
+  * @brief Return the number of instances for this series.
+  *
+  * Return the number of instances for this series.
+  *
+  * @return The number of instances.
+  **/
+  inline LAAW_UINT32 Series::GetInstanceCount()
+  {
+    LAAW_UINT32 result_;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void*, LAAW_UINT32*);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(22);
+    char* error = function(pimpl_, &result_);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+    return result_;
+  }
+  /**
+  * @brief Get some instance of this series.
+  *
+  * This method will return an object that contains information about some instance. The instances are indexed by a number between 0 (inclusive) and the result of GetInstanceCount() (exclusive).
+  *
+  * @param index The index of the instance of interest.
+  * @return The instance.
+  **/
+  inline ::OrthancClient::Instance Series::GetInstance(LAAW_UINT32 index)
+  {
+    void* result_;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void*, void**, LAAW_UINT32);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(23);
+    char* error = function(pimpl_, &result_, index);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+    return ::OrthancClient::Instance(result_);
+  }
+  /**
+  * @brief Get the %Orthanc identifier of this series.
+  *
+  * Get the %Orthanc identifier of this series.
+  *
+  * @return The identifier.
+  **/
+  inline ::std::string Series::GetId() const
+  {
+    const char* result_;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (const void*, const char**);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(24);
+    char* error = function(pimpl_, &result_);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+    return std::string(result_);
+  }
+  /**
+  * @brief Returns the URL to this series.
+  *
+  * Returns the URL to this series.
+  *
+  * @return The URL.
+  **/
+  inline ::std::string Series::GetUrl() const
+  {
+    const char* result_;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (const void*, const char**);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(25);
+    char* error = function(pimpl_, &result_);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+    return std::string(result_);
+  }
+  /**
+  * @brief Get the value of one of the main DICOM tags for this series.
+  *
+  * Get the value of one of the main DICOM tags for this series.
+  *
+  * @param tag The name of the tag of interest ("Modality", "Manufacturer", "SeriesDate", "SeriesDescription", "SeriesInstanceUID"...).
+  * @param defaultValue The default value to be returned if this tag does not exist.
+  * @return The value of the tag.
+  **/
+  inline ::std::string Series::GetMainDicomTag(const ::std::string& tag, const ::std::string& defaultValue) const
+  {
+    const char* result_;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (const void*, const char**, const char*, const char*);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(26);
+    char* error = function(pimpl_, &result_, tag.c_str(), defaultValue.c_str());
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+    return std::string(result_);
+  }
+  /**
+  * @brief Test whether this series encodes a 3D image that can be downloaded from %Orthanc.
+  *
+  * Test whether this series encodes a 3D image that can be downloaded from %Orthanc.
+  *
+  * @return "true" if and only if this is a 3D image.
+  **/
+  inline bool Series::Is3DImage()
+  {
+    LAAW_INT32 result_;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void*, LAAW_INT32*);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(27);
+    char* error = function(pimpl_, &result_);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+    return result_ != 0;
+  }
+  /**
+  * @brief Get the width of the 3D image.
+  *
+  * Get the width of the 3D image (i.e. along the X-axis). This call is only valid if this series corresponds to a 3D image.
+  *
+  * @return The width.
+  **/
+  inline LAAW_UINT32 Series::GetWidth()
+  {
+    LAAW_UINT32 result_;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void*, LAAW_UINT32*);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(28);
+    char* error = function(pimpl_, &result_);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+    return result_;
+  }
+  /**
+  * @brief Get the height of the 3D image.
+  *
+  * Get the height of the 3D image (i.e. along the Y-axis). This call is only valid if this series corresponds to a 3D image.
+  *
+  * @return The height.
+  **/
+  inline LAAW_UINT32 Series::GetHeight()
+  {
+    LAAW_UINT32 result_;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void*, LAAW_UINT32*);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(29);
+    char* error = function(pimpl_, &result_);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+    return result_;
+  }
+  /**
+  * @brief Get the physical size of a voxel along the X-axis.
+  *
+  * Get the physical size of a voxel along the X-axis. This call is only valid if this series corresponds to a 3D image.
+  *
+  * @return The voxel size.
+  **/
+  inline float Series::GetVoxelSizeX()
+  {
+    float result_;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void*, float*);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(30);
+    char* error = function(pimpl_, &result_);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+    return result_;
+  }
+  /**
+  * @brief Get the physical size of a voxel along the Y-axis.
+  *
+  * Get the physical size of a voxel along the Y-axis. This call is only valid if this series corresponds to a 3D image.
+  *
+  * @return The voxel size.
+  **/
+  inline float Series::GetVoxelSizeY()
+  {
+    float result_;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void*, float*);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(31);
+    char* error = function(pimpl_, &result_);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+    return result_;
+  }
+  /**
+  * @brief Get the physical size of a voxel along the Z-axis.
+  *
+  * Get the physical size of a voxel along the Z-axis. This call is only valid if this series corresponds to a 3D image.
+  *
+  * @return The voxel size.
+  **/
+  inline float Series::GetVoxelSizeZ()
+  {
+    float result_;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void*, float*);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(32);
+    char* error = function(pimpl_, &result_);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+    return result_;
+  }
+  /**
+  * @brief Load the 3D image into a memory buffer.
+  *
+  * Load the 3D image into a memory buffer. This call is only valid if this series corresponds to a 3D image. The "target" buffer must be wide enough to store all the voxels of the image.
+  *
+  * @param target The target memory buffer.
+  * @param format The memory layout of the voxels.
+  * @param lineStride The number of bytes between two lines in the target memory buffer.
+  * @param stackStride The number of bytes between two 2D slices in the target memory buffer.
+  **/
+  inline void Series::Load3DImage(void* target, ::Orthanc::PixelFormat format, LAAW_INT64 lineStride, LAAW_INT64 stackStride)
+  {
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void*, void*, LAAW_INT32, LAAW_INT64, LAAW_INT64);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(33);
+    char* error = function(pimpl_, target, format, lineStride, stackStride);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+  }
+  /**
+  * @brief Load the 3D image into a memory buffer.
+  *
+  * Load the 3D image into a memory buffer. This call is only valid if this series corresponds to a 3D image. The "target" buffer must be wide enough to store all the voxels of the image. This method will also update a progress indicator to monitor the loading of the image.
+  *
+  * @param target The target memory buffer.
+  * @param format The memory layout of the voxels.
+  * @param lineStride The number of bytes between two lines in the target memory buffer.
+  * @param stackStride The number of bytes between two 2D slices in the target memory buffer.
+  * @param progress A pointer to a floating-point number that is continuously updated by the download threads to reflect the percentage of completion (between 0 and 1). This value can be read from a separate thread.
+  **/
+  inline void Series::Load3DImage(void* target, ::Orthanc::PixelFormat format, LAAW_INT64 lineStride, LAAW_INT64 stackStride, float progress[])
+  {
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void*, void*, LAAW_INT32, LAAW_INT64, LAAW_INT64, float*);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(34);
+    char* error = function(pimpl_, target, format, lineStride, stackStride, progress);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+  }
+}
+
+namespace OrthancClient
+{
+  /**
+  * @brief Create a connection to some study.
+  *
+  * Create a connection to some study.
+  *
+  * @param connection The remote instance of %Orthanc.
+  * @param id The %Orthanc identifier of the study.
+  **/
+  inline Study::Study(::OrthancClient::OrthancConnection& connection, const ::std::string& id)
+  {
+    isReference_ = false;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void**, void*, const char*);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(35);
+    char* error = function(&pimpl_, connection.pimpl_, id.c_str());
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+  }
+  /**
+  * @brief Destructs the object.
+  *
+  * Destructs the object.
+  *
+  **/
+  inline Study::~Study()
+  {
+    if (isReference_) return;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void*);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(36);
+    char* error = function(pimpl_);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+  }
+  /**
+  * @brief Reload the series of this study.
+  *
+  * This method will reload the list of the series of this study. Pay attention to the fact that the series that have been previously returned by GetSeries() will be invalidated.
+  *
+  **/
+  inline void Study::Reload()
+  {
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void*);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(37);
+    char* error = function(pimpl_);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+  }
+  /**
+  * @brief Return the number of series for this study.
+  *
+  * Return the number of series for this study.
+  *
+  * @return The number of series.
+  **/
+  inline LAAW_UINT32 Study::GetSeriesCount()
+  {
+    LAAW_UINT32 result_;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void*, LAAW_UINT32*);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(38);
+    char* error = function(pimpl_, &result_);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+    return result_;
+  }
+  /**
+  * @brief Get some series of this study.
+  *
+  * This method will return an object that contains information about some series. The series are indexed by a number between 0 (inclusive) and the result of GetSeriesCount() (exclusive).
+  *
+  * @param index The index of the series of interest.
+  * @return The series.
+  **/
+  inline ::OrthancClient::Series Study::GetSeries(LAAW_UINT32 index)
+  {
+    void* result_;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void*, void**, LAAW_UINT32);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(39);
+    char* error = function(pimpl_, &result_, index);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+    return ::OrthancClient::Series(result_);
+  }
+  /**
+  * @brief Get the %Orthanc identifier of this study.
+  *
+  * Get the %Orthanc identifier of this study.
+  *
+  * @return The identifier.
+  **/
+  inline ::std::string Study::GetId() const
+  {
+    const char* result_;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (const void*, const char**);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(40);
+    char* error = function(pimpl_, &result_);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+    return std::string(result_);
+  }
+  /**
+  * @brief Get the value of one of the main DICOM tags for this study.
+  *
+  * Get the value of one of the main DICOM tags for this study.
+  *
+  * @param tag The name of the tag of interest ("StudyDate", "StudyDescription", "StudyInstanceUID" or "StudyTime").
+  * @param defaultValue The default value to be returned if this tag does not exist.
+  * @return The value of the tag.
+  **/
+  inline ::std::string Study::GetMainDicomTag(const ::std::string& tag, const ::std::string& defaultValue) const
+  {
+    const char* result_;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (const void*, const char**, const char*, const char*);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(41);
+    char* error = function(pimpl_, &result_, tag.c_str(), defaultValue.c_str());
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+    return std::string(result_);
+  }
+}
+
+namespace OrthancClient
+{
+  /**
+  * @brief Create a connection to some image instance.
+  *
+  * Create a connection to some image instance.
+  *
+  * @param connection The remote instance of %Orthanc.
+  * @param id The %Orthanc identifier of the image instance.
+  **/
+  inline Instance::Instance(::OrthancClient::OrthancConnection& connection, const ::std::string& id)
+  {
+    isReference_ = false;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void**, void*, const char*);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(42);
+    char* error = function(&pimpl_, connection.pimpl_, id.c_str());
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+  }
+  /**
+  * @brief Destructs the object.
+  *
+  * Destructs the object.
+  *
+  **/
+  inline Instance::~Instance()
+  {
+    if (isReference_) return;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void*);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(43);
+    char* error = function(pimpl_);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+  }
+  /**
+  * @brief Get the %Orthanc identifier of this identifier.
+  *
+  * Get the %Orthanc identifier of this identifier.
+  *
+  * @return The identifier.
+  **/
+  inline ::std::string Instance::GetId() const
+  {
+    const char* result_;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (const void*, const char**);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(44);
+    char* error = function(pimpl_, &result_);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+    return std::string(result_);
+  }
+  /**
+  * @brief Set the extraction mode for the 2D image corresponding to this instance.
+  *
+  * Set the extraction mode for the 2D image corresponding to this instance.
+  *
+  * @param mode The extraction mode.
+  **/
+  inline void Instance::SetImageExtractionMode(::Orthanc::ImageExtractionMode mode)
+  {
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void*, LAAW_INT32);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(45);
+    char* error = function(pimpl_, mode);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+  }
+  /**
+  * @brief Get the extraction mode for the 2D image corresponding to this instance.
+  *
+  * Get the extraction mode for the 2D image corresponding to this instance.
+  *
+  * @return The extraction mode.
+  **/
+  inline ::Orthanc::ImageExtractionMode Instance::GetImageExtractionMode() const
+  {
+    LAAW_INT32 result_;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (const void*, LAAW_INT32*);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(46);
+    char* error = function(pimpl_, &result_);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+    return static_cast< ::Orthanc::ImageExtractionMode >(result_);
+  }
+  /**
+  * @brief Get the string value of some DICOM tag of this instance.
+  *
+  * Get the string value of some DICOM tag of this instance.
+  *
+  * @param tag The name of the tag of interest.
+  * @return The value of the tag.
+  **/
+  inline ::std::string Instance::GetTagAsString(const ::std::string& tag) const
+  {
+    const char* result_;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (const void*, const char**, const char*);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(47);
+    char* error = function(pimpl_, &result_, tag.c_str());
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+    return std::string(result_);
+  }
+  /**
+  * @brief Get the floating point value that is stored in some DICOM tag of this instance.
+  *
+  * Get the floating point value that is stored in some DICOM tag of this instance.
+  *
+  * @param tag The name of the tag of interest.
+  * @return The value of the tag.
+  **/
+  inline float Instance::GetTagAsFloat(const ::std::string& tag) const
+  {
+    float result_;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (const void*, float*, const char*);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(48);
+    char* error = function(pimpl_, &result_, tag.c_str());
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+    return result_;
+  }
+  /**
+  * @brief Get the integer value that is stored in some DICOM tag of this instance.
+  *
+  * Get the integer value that is stored in some DICOM tag of this instance.
+  *
+  * @param tag The name of the tag of interest.
+  * @return The value of the tag.
+  **/
+  inline LAAW_INT32 Instance::GetTagAsInt(const ::std::string& tag) const
+  {
+    LAAW_INT32 result_;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (const void*, LAAW_INT32*, const char*);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(49);
+    char* error = function(pimpl_, &result_, tag.c_str());
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+    return result_;
+  }
+  /**
+  * @brief Get the width of the 2D image.
+  *
+  * Get the width of the 2D image that is encoded by this DICOM instance.
+  *
+  * @return The width.
+  **/
+  inline LAAW_UINT32 Instance::GetWidth()
+  {
+    LAAW_UINT32 result_;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void*, LAAW_UINT32*);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(50);
+    char* error = function(pimpl_, &result_);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+    return result_;
+  }
+  /**
+  * @brief Get the height of the 2D image.
+  *
+  * Get the height of the 2D image that is encoded by this DICOM instance.
+  *
+  * @return The height.
+  **/
+  inline LAAW_UINT32 Instance::GetHeight()
+  {
+    LAAW_UINT32 result_;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void*, LAAW_UINT32*);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(51);
+    char* error = function(pimpl_, &result_);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+    return result_;
+  }
+  /**
+  * @brief Get the number of bytes between two lines of the image (pitch).
+  *
+  * Get the number of bytes between two lines of the image in the memory buffer returned by GetBuffer(). This value depends on the extraction mode for the image.
+  *
+  * @return The pitch.
+  **/
+  inline LAAW_UINT32 Instance::GetPitch()
+  {
+    LAAW_UINT32 result_;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void*, LAAW_UINT32*);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(52);
+    char* error = function(pimpl_, &result_);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+    return result_;
+  }
+  /**
+  * @brief Get the format of the pixels of the 2D image.
+  *
+  * Return the memory layout that is used for the 2D image that is encoded by this DICOM instance. This value depends on the extraction mode for the image.
+  *
+  * @return The pixel format.
+  **/
+  inline ::Orthanc::PixelFormat Instance::GetPixelFormat()
+  {
+    LAAW_INT32 result_;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void*, LAAW_INT32*);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(53);
+    char* error = function(pimpl_, &result_);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+    return static_cast< ::Orthanc::PixelFormat >(result_);
+  }
+  /**
+  * @brief Access the memory buffer in which the raw pixels of the 2D image are stored.
+  *
+  * Access the memory buffer in which the raw pixels of the 2D image are stored.
+  *
+  * @return A pointer to the memory buffer.
+  **/
+  inline const void* Instance::GetBuffer()
+  {
+    const void* result_;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void*, const void**);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(54);
+    char* error = function(pimpl_, &result_);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+    return reinterpret_cast< const void* >(result_);
+  }
+  /**
+  * @brief Access the memory buffer in which the raw pixels of some line of the 2D image are stored.
+  *
+  * Access the memory buffer in which the raw pixels of some line of the 2D image are stored.
+  *
+  * @param y The line of interest.
+  * @return A pointer to the memory buffer.
+  **/
+  inline const void* Instance::GetBuffer(LAAW_UINT32 y)
+  {
+    const void* result_;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void*, const void**, LAAW_UINT32);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(55);
+    char* error = function(pimpl_, &result_, y);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+    return reinterpret_cast< const void* >(result_);
+  }
+  /**
+  * @brief Get the size of the DICOM file corresponding to this instance.
+  *
+  * Get the size of the DICOM file corresponding to this instance.
+  *
+  * @return The file size.
+  **/
+  inline LAAW_UINT64 Instance::GetDicomSize()
+  {
+    LAAW_UINT64 result_;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void*, LAAW_UINT64*);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(56);
+    char* error = function(pimpl_, &result_);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+    return result_;
+  }
+  /**
+  * @brief Get a pointer to the content of the DICOM file corresponding to this instance.
+  *
+  * Get a pointer to the content of the DICOM file corresponding to this instance.
+  *
+  * @return The DICOM file.
+  **/
+  inline const void* Instance::GetDicom()
+  {
+    const void* result_;
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void*, const void**);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(57);
+    char* error = function(pimpl_, &result_);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+    return reinterpret_cast< const void* >(result_);
+  }
+  /**
+  * @brief Discard the downloaded 2D image, so as to make room in memory.
+  *
+  * Discard the downloaded 2D image, so as to make room in memory.
+  *
+  **/
+  inline void Instance::DiscardImage()
+  {
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void*);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(58);
+    char* error = function(pimpl_);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+  }
+  /**
+  * @brief Discard the downloaded DICOM file, so as to make room in memory.
+  *
+  * Discard the downloaded DICOM file, so as to make room in memory.
+  *
+  **/
+  inline void Instance::DiscardDicom()
+  {
+    typedef char* (LAAW_ORTHANC_CLIENT_CALL_CONV* Function) (void*);
+    Function function = (Function) ::OrthancClient::Internals::Library::GetInstance().GetFunction(59);
+    char* error = function(pimpl_);
+    ::OrthancClient::Internals::Library::GetInstance().ThrowExceptionIfNeeded(error);
+  }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OrthancCppClient/SharedLibrary/AUTOGENERATED/Windows32.def	Thu Oct 17 14:21:50 2013 +0200
@@ -0,0 +1,70 @@
+LIBRARY some.dll
+EXPORTS
+  _LAAW_EXTERNC_557aee7b61817292a0f31269d3c35db7@8 = LAAW_EXTERNC_557aee7b61817292a0f31269d3c35db7@8
+  _LAAW_EXTERNC_0b8dff0ce67f10954a49b059e348837e@8 = LAAW_EXTERNC_0b8dff0ce67f10954a49b059e348837e@8
+  _LAAW_EXTERNC_e05097c153f676e5a5ee54dcfc78256f@4 = LAAW_EXTERNC_e05097c153f676e5a5ee54dcfc78256f@4
+  _LAAW_EXTERNC_e840242bf58d17d3c1d722da09ce88e0@8 = LAAW_EXTERNC_e840242bf58d17d3c1d722da09ce88e0@8
+  _LAAW_EXTERNC_c9af31433001b5dfc012a552dc6d0050@8 = LAAW_EXTERNC_c9af31433001b5dfc012a552dc6d0050@8
+  _LAAW_EXTERNC_3fba4d6b818180a44cd1cae6046334dc@12 = LAAW_EXTERNC_3fba4d6b818180a44cd1cae6046334dc@12
+  _LAAW_EXTERNC_aeb20dc75b9246188db857317e5e0ce7@8 = LAAW_EXTERNC_aeb20dc75b9246188db857317e5e0ce7@8
+  _LAAW_EXTERNC_62689803d9871e4d9c51a648640b320b@8 = LAAW_EXTERNC_62689803d9871e4d9c51a648640b320b@8
+  _LAAW_EXTERNC_2fb64c9e5a67eccd413b0e913469a421@16 = LAAW_EXTERNC_2fb64c9e5a67eccd413b0e913469a421@16
+  _LAAW_EXTERNC_1f1acb322ea4d0aad65172824607673c@8 = LAAW_EXTERNC_1f1acb322ea4d0aad65172824607673c@8
+  _LAAW_EXTERNC_f3fd272e4636f6a531aabb72ee01cd5b@16 = LAAW_EXTERNC_f3fd272e4636f6a531aabb72ee01cd5b@16
+  _LAAW_EXTERNC_12d3de0a96e9efb11136a9811bb9ed38@4 = LAAW_EXTERNC_12d3de0a96e9efb11136a9811bb9ed38@4
+  _LAAW_EXTERNC_f756172daf04516eec3a566adabb4335@4 = LAAW_EXTERNC_f756172daf04516eec3a566adabb4335@4
+  _LAAW_EXTERNC_ddb68763ec902a97d579666a73a20118@8 = LAAW_EXTERNC_ddb68763ec902a97d579666a73a20118@8
+  _LAAW_EXTERNC_fba3c68b4be7558dbc65f7ce1ab57d63@12 = LAAW_EXTERNC_fba3c68b4be7558dbc65f7ce1ab57d63@12
+  _LAAW_EXTERNC_b4ca99d958f843493e58d1ef967340e1@8 = LAAW_EXTERNC_b4ca99d958f843493e58d1ef967340e1@8
+  _LAAW_EXTERNC_78d5cc76d282437b6f93ec3b82c35701@16 = LAAW_EXTERNC_78d5cc76d282437b6f93ec3b82c35701@16
+  _LAAW_EXTERNC_6cf0d7268667f9b0aa4511bacf184919@12 = LAAW_EXTERNC_6cf0d7268667f9b0aa4511bacf184919@12
+  _LAAW_EXTERNC_7d81cd502ee27e859735d0ea7112b5a1@4 = LAAW_EXTERNC_7d81cd502ee27e859735d0ea7112b5a1@4
+  _LAAW_EXTERNC_48a2a1a9d68c047e22bfba23014643d2@4 = LAAW_EXTERNC_48a2a1a9d68c047e22bfba23014643d2@4
+  _LAAW_EXTERNC_852bf8296ca21c5fde5ec565cc10721d@8 = LAAW_EXTERNC_852bf8296ca21c5fde5ec565cc10721d@8
+  _LAAW_EXTERNC_efd04574e0779faa83df1f2d8f9888db@12 = LAAW_EXTERNC_efd04574e0779faa83df1f2d8f9888db@12
+  _LAAW_EXTERNC_736247ff5e8036dac38163da6f666ed5@8 = LAAW_EXTERNC_736247ff5e8036dac38163da6f666ed5@8
+  _LAAW_EXTERNC_d82d2598a7a73f4b6fcc0c09c25b08ca@8 = LAAW_EXTERNC_d82d2598a7a73f4b6fcc0c09c25b08ca@8
+  _LAAW_EXTERNC_88134b978f9acb2aecdadf54aeab3c64@16 = LAAW_EXTERNC_88134b978f9acb2aecdadf54aeab3c64@16
+  _LAAW_EXTERNC_152cb1b704c053d24b0dab7461ba6ea3@8 = LAAW_EXTERNC_152cb1b704c053d24b0dab7461ba6ea3@8
+  _LAAW_EXTERNC_eee03f337ec81d9f1783cd41e5238757@8 = LAAW_EXTERNC_eee03f337ec81d9f1783cd41e5238757@8
+  _LAAW_EXTERNC_006f08237bd7611636fc721baebfb4c5@8 = LAAW_EXTERNC_006f08237bd7611636fc721baebfb4c5@8
+  _LAAW_EXTERNC_b794f5cd3dad7d7b575dd1fd902afdd0@8 = LAAW_EXTERNC_b794f5cd3dad7d7b575dd1fd902afdd0@8
+  _LAAW_EXTERNC_8ee2e50dd9df8f66a3c1766090dd03ab@8 = LAAW_EXTERNC_8ee2e50dd9df8f66a3c1766090dd03ab@8
+  _LAAW_EXTERNC_046aed35bbe4751691f4c34cc249a61d@8 = LAAW_EXTERNC_046aed35bbe4751691f4c34cc249a61d@8
+  _LAAW_EXTERNC_4dcc7a0fd025efba251ac6e9b701c2c5@28 = LAAW_EXTERNC_4dcc7a0fd025efba251ac6e9b701c2c5@28
+  _LAAW_EXTERNC_b2601a161c24ad0a1d3586246f87452c@32 = LAAW_EXTERNC_b2601a161c24ad0a1d3586246f87452c@32
+  _LAAW_EXTERNC_193599b9e345384fcdfcd47c29c55342@12 = LAAW_EXTERNC_193599b9e345384fcdfcd47c29c55342@12
+  _LAAW_EXTERNC_7c97f17063a357d38c5fab1136ad12a0@4 = LAAW_EXTERNC_7c97f17063a357d38c5fab1136ad12a0@4
+  _LAAW_EXTERNC_e65b20b7e0170b67544cd6664a4639b7@4 = LAAW_EXTERNC_e65b20b7e0170b67544cd6664a4639b7@4
+  _LAAW_EXTERNC_470e981b0e41f17231ba0ae6f3033321@8 = LAAW_EXTERNC_470e981b0e41f17231ba0ae6f3033321@8
+  _LAAW_EXTERNC_04cefd138b6ea15ad909858f2a0a8f05@12 = LAAW_EXTERNC_04cefd138b6ea15ad909858f2a0a8f05@12
+  _LAAW_EXTERNC_aee5b1f6f0c082f2c3b0986f9f6a18c7@8 = LAAW_EXTERNC_aee5b1f6f0c082f2c3b0986f9f6a18c7@8
+  _LAAW_EXTERNC_93965682bace75491413e1f0b8d5a654@16 = LAAW_EXTERNC_93965682bace75491413e1f0b8d5a654@16
+  _LAAW_EXTERNC_b01c6003238eb46c8db5dc823d7ca678@12 = LAAW_EXTERNC_b01c6003238eb46c8db5dc823d7ca678@12
+  _LAAW_EXTERNC_0147007fb99bad8cd95a139ec8795376@4 = LAAW_EXTERNC_0147007fb99bad8cd95a139ec8795376@4
+  _LAAW_EXTERNC_236ee8b403bc99535a8a4695c0cd45cb@8 = LAAW_EXTERNC_236ee8b403bc99535a8a4695c0cd45cb@8
+  _LAAW_EXTERNC_2a437b7aba6bb01e81113835be8f0146@8 = LAAW_EXTERNC_2a437b7aba6bb01e81113835be8f0146@8
+  _LAAW_EXTERNC_2bcbcb850934ae0bb4c6f0cc940e6cda@8 = LAAW_EXTERNC_2bcbcb850934ae0bb4c6f0cc940e6cda@8
+  _LAAW_EXTERNC_8d415c3a78a48e7e61d9fd24e7c79484@12 = LAAW_EXTERNC_8d415c3a78a48e7e61d9fd24e7c79484@12
+  _LAAW_EXTERNC_70d2f8398bbc63b5f792b69b4ad5fecb@12 = LAAW_EXTERNC_70d2f8398bbc63b5f792b69b4ad5fecb@12
+  _LAAW_EXTERNC_1729a067d902771517388eedd7346b23@12 = LAAW_EXTERNC_1729a067d902771517388eedd7346b23@12
+  _LAAW_EXTERNC_72e2aeee66cd3abd8ab7e987321c3745@8 = LAAW_EXTERNC_72e2aeee66cd3abd8ab7e987321c3745@8
+  _LAAW_EXTERNC_1ea3df5a1ac1a1a687fe7325adddb6f0@8 = LAAW_EXTERNC_1ea3df5a1ac1a1a687fe7325adddb6f0@8
+  _LAAW_EXTERNC_99b4f370e4f532d8b763e2cb49db92f8@8 = LAAW_EXTERNC_99b4f370e4f532d8b763e2cb49db92f8@8
+  _LAAW_EXTERNC_c41c742b68617f1c0590577a0a5ebc0c@8 = LAAW_EXTERNC_c41c742b68617f1c0590577a0a5ebc0c@8
+  _LAAW_EXTERNC_142dd2feba0fc1d262bbd0baeb441a8b@8 = LAAW_EXTERNC_142dd2feba0fc1d262bbd0baeb441a8b@8
+  _LAAW_EXTERNC_5f5c9f81a4dff8daa6c359f1d0488fef@12 = LAAW_EXTERNC_5f5c9f81a4dff8daa6c359f1d0488fef@12
+  _LAAW_EXTERNC_9ca979fffd08fa256306d4e68d8b0e91@8 = LAAW_EXTERNC_9ca979fffd08fa256306d4e68d8b0e91@8
+  _LAAW_EXTERNC_6f2d77a26edc91c28d89408dbc3c271e@8 = LAAW_EXTERNC_6f2d77a26edc91c28d89408dbc3c271e@8
+  _LAAW_EXTERNC_c0f494b80d4ff8b232df7a75baa0700a@4 = LAAW_EXTERNC_c0f494b80d4ff8b232df7a75baa0700a@4
+  _LAAW_EXTERNC_d604f44bd5195e082e745e9cbc164f4c@4 = LAAW_EXTERNC_d604f44bd5195e082e745e9cbc164f4c@4
+  _LAAW_EXTERNC_6c5ad02f91b583e29cebd0bd319ce21d@12 = LAAW_EXTERNC_6c5ad02f91b583e29cebd0bd319ce21d@12
+  _LAAW_EXTERNC_4068241c44a9c1367fe0e57be523f207@4 = LAAW_EXTERNC_4068241c44a9c1367fe0e57be523f207@4
+  _LAAW_EXTERNC_GetDescription@0 = LAAW_EXTERNC_GetDescription@0
+  _LAAW_EXTERNC_GetCompany@0 = LAAW_EXTERNC_GetCompany@0
+  _LAAW_EXTERNC_GetProduct@0 = LAAW_EXTERNC_GetProduct@0
+  _LAAW_EXTERNC_GetCopyright@0 = LAAW_EXTERNC_GetCopyright@0
+  _LAAW_EXTERNC_GetVersion@0 = LAAW_EXTERNC_GetVersion@0
+  _LAAW_EXTERNC_GetFileVersion@0 = LAAW_EXTERNC_GetFileVersion@0
+  _LAAW_EXTERNC_GetFullVersion@0 = LAAW_EXTERNC_GetFullVersion@0
+  _LAAW_EXTERNC_FreeString@4 = LAAW_EXTERNC_FreeString@4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OrthancCppClient/SharedLibrary/AUTOGENERATED/Windows32.rc	Thu Oct 17 14:21:50 2013 +0200
@@ -0,0 +1,30 @@
+#include <winver.h>
+
+VS_VERSION_INFO VERSIONINFO
+   FILEVERSION 0,6,0,2
+   PRODUCTVERSION 0,6,0,0
+   FILEOS VOS_NT_WINDOWS32
+   FILETYPE VFT_DLL
+   BEGIN
+      BLOCK "StringFileInfo"
+      BEGIN
+         BLOCK "040904E4"
+         BEGIN
+            VALUE "Comments", "Release 0.6.2"
+            VALUE "CompanyName", "CHU of Liege"
+            VALUE "FileDescription", "Native client to the REST API of Orthanc"
+            VALUE "FileVersion", "0.6.0.2"
+            VALUE "InternalName", "OrthancClient"
+            VALUE "LegalCopyright", "(c) 2012-2013, Sebastien Jodogne, CHU of Liege"
+            VALUE "LegalTrademarks", "Licensing information is available on https://code.google.com/p/orthanc/"
+            VALUE "OriginalFilename", "OrthancClient_Windows32.dll"
+            VALUE "ProductName", "OrthancClient"
+            VALUE "ProductVersion", "0.6"
+         END
+      END
+
+      BLOCK "VarFileInfo"
+      BEGIN
+        VALUE "Translation", 0x409, 1252  // U.S. English
+      END
+   END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OrthancCppClient/SharedLibrary/AUTOGENERATED/Windows64.def	Thu Oct 17 14:21:50 2013 +0200
@@ -0,0 +1,70 @@
+LIBRARY some.dll
+EXPORTS
+  LAAW_EXTERNC_557aee7b61817292a0f31269d3c35db7
+  LAAW_EXTERNC_0b8dff0ce67f10954a49b059e348837e
+  LAAW_EXTERNC_e05097c153f676e5a5ee54dcfc78256f
+  LAAW_EXTERNC_e840242bf58d17d3c1d722da09ce88e0
+  LAAW_EXTERNC_c9af31433001b5dfc012a552dc6d0050
+  LAAW_EXTERNC_3fba4d6b818180a44cd1cae6046334dc
+  LAAW_EXTERNC_aeb20dc75b9246188db857317e5e0ce7
+  LAAW_EXTERNC_62689803d9871e4d9c51a648640b320b
+  LAAW_EXTERNC_2fb64c9e5a67eccd413b0e913469a421
+  LAAW_EXTERNC_1f1acb322ea4d0aad65172824607673c
+  LAAW_EXTERNC_f3fd272e4636f6a531aabb72ee01cd5b
+  LAAW_EXTERNC_12d3de0a96e9efb11136a9811bb9ed38
+  LAAW_EXTERNC_f756172daf04516eec3a566adabb4335
+  LAAW_EXTERNC_ddb68763ec902a97d579666a73a20118
+  LAAW_EXTERNC_fba3c68b4be7558dbc65f7ce1ab57d63
+  LAAW_EXTERNC_b4ca99d958f843493e58d1ef967340e1
+  LAAW_EXTERNC_78d5cc76d282437b6f93ec3b82c35701
+  LAAW_EXTERNC_6cf0d7268667f9b0aa4511bacf184919
+  LAAW_EXTERNC_7d81cd502ee27e859735d0ea7112b5a1
+  LAAW_EXTERNC_48a2a1a9d68c047e22bfba23014643d2
+  LAAW_EXTERNC_852bf8296ca21c5fde5ec565cc10721d
+  LAAW_EXTERNC_efd04574e0779faa83df1f2d8f9888db
+  LAAW_EXTERNC_736247ff5e8036dac38163da6f666ed5
+  LAAW_EXTERNC_d82d2598a7a73f4b6fcc0c09c25b08ca
+  LAAW_EXTERNC_88134b978f9acb2aecdadf54aeab3c64
+  LAAW_EXTERNC_152cb1b704c053d24b0dab7461ba6ea3
+  LAAW_EXTERNC_eee03f337ec81d9f1783cd41e5238757
+  LAAW_EXTERNC_006f08237bd7611636fc721baebfb4c5
+  LAAW_EXTERNC_b794f5cd3dad7d7b575dd1fd902afdd0
+  LAAW_EXTERNC_8ee2e50dd9df8f66a3c1766090dd03ab
+  LAAW_EXTERNC_046aed35bbe4751691f4c34cc249a61d
+  LAAW_EXTERNC_4dcc7a0fd025efba251ac6e9b701c2c5
+  LAAW_EXTERNC_b2601a161c24ad0a1d3586246f87452c
+  LAAW_EXTERNC_193599b9e345384fcdfcd47c29c55342
+  LAAW_EXTERNC_7c97f17063a357d38c5fab1136ad12a0
+  LAAW_EXTERNC_e65b20b7e0170b67544cd6664a4639b7
+  LAAW_EXTERNC_470e981b0e41f17231ba0ae6f3033321
+  LAAW_EXTERNC_04cefd138b6ea15ad909858f2a0a8f05
+  LAAW_EXTERNC_aee5b1f6f0c082f2c3b0986f9f6a18c7
+  LAAW_EXTERNC_93965682bace75491413e1f0b8d5a654
+  LAAW_EXTERNC_b01c6003238eb46c8db5dc823d7ca678
+  LAAW_EXTERNC_0147007fb99bad8cd95a139ec8795376
+  LAAW_EXTERNC_236ee8b403bc99535a8a4695c0cd45cb
+  LAAW_EXTERNC_2a437b7aba6bb01e81113835be8f0146
+  LAAW_EXTERNC_2bcbcb850934ae0bb4c6f0cc940e6cda
+  LAAW_EXTERNC_8d415c3a78a48e7e61d9fd24e7c79484
+  LAAW_EXTERNC_70d2f8398bbc63b5f792b69b4ad5fecb
+  LAAW_EXTERNC_1729a067d902771517388eedd7346b23
+  LAAW_EXTERNC_72e2aeee66cd3abd8ab7e987321c3745
+  LAAW_EXTERNC_1ea3df5a1ac1a1a687fe7325adddb6f0
+  LAAW_EXTERNC_99b4f370e4f532d8b763e2cb49db92f8
+  LAAW_EXTERNC_c41c742b68617f1c0590577a0a5ebc0c
+  LAAW_EXTERNC_142dd2feba0fc1d262bbd0baeb441a8b
+  LAAW_EXTERNC_5f5c9f81a4dff8daa6c359f1d0488fef
+  LAAW_EXTERNC_9ca979fffd08fa256306d4e68d8b0e91
+  LAAW_EXTERNC_6f2d77a26edc91c28d89408dbc3c271e
+  LAAW_EXTERNC_c0f494b80d4ff8b232df7a75baa0700a
+  LAAW_EXTERNC_d604f44bd5195e082e745e9cbc164f4c
+  LAAW_EXTERNC_6c5ad02f91b583e29cebd0bd319ce21d
+  LAAW_EXTERNC_4068241c44a9c1367fe0e57be523f207
+  LAAW_EXTERNC_GetDescription
+  LAAW_EXTERNC_GetCompany
+  LAAW_EXTERNC_GetProduct
+  LAAW_EXTERNC_GetCopyright
+  LAAW_EXTERNC_GetVersion
+  LAAW_EXTERNC_GetFileVersion
+  LAAW_EXTERNC_GetFullVersion
+  LAAW_EXTERNC_FreeString
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OrthancCppClient/SharedLibrary/AUTOGENERATED/Windows64.rc	Thu Oct 17 14:21:50 2013 +0200
@@ -0,0 +1,30 @@
+#include <winver.h>
+
+VS_VERSION_INFO VERSIONINFO
+   FILEVERSION 0,6,0,2
+   PRODUCTVERSION 0,6,0,0
+   FILEOS VOS_NT_WINDOWS32
+   FILETYPE VFT_DLL
+   BEGIN
+      BLOCK "StringFileInfo"
+      BEGIN
+         BLOCK "040904E4"
+         BEGIN
+            VALUE "Comments", "Release 0.6.2"
+            VALUE "CompanyName", "CHU of Liege"
+            VALUE "FileDescription", "Native client to the REST API of Orthanc"
+            VALUE "FileVersion", "0.6.0.2"
+            VALUE "InternalName", "OrthancClient"
+            VALUE "LegalCopyright", "(c) 2012-2013, Sebastien Jodogne, CHU of Liege"
+            VALUE "LegalTrademarks", "Licensing information is available on https://code.google.com/p/orthanc/"
+            VALUE "OriginalFilename", "OrthancClient_Windows64.dll"
+            VALUE "ProductName", "OrthancClient"
+            VALUE "ProductVersion", "0.6"
+         END
+      END
+
+      BLOCK "VarFileInfo"
+      BEGIN
+        VALUE "Translation", 0x409, 1252  // U.S. English
+      END
+   END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OrthancCppClient/SharedLibrary/ConfigurationCpp.json	Thu Oct 17 14:21:50 2013 +0200
@@ -0,0 +1,5 @@
+{
+  "InternalsNamespace" : [ "OrthancClient", "Internals" ],
+  "PublicNamespace" : [ "OrthancClient" ],
+  "ExceptionClassName" : "OrthancClientException"
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OrthancCppClient/SharedLibrary/Generate.sh	Thu Oct 17 14:21:50 2013 +0200
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+set -e
+
+mkdir -p AUTOGENERATED
+LAAW_ROOT=~/Subversion/Jomago/Src/Labo/Laaw
+
+${LAAW_ROOT}/Parser/Build/LaawParser.exe AUTOGENERATED/CodeModelRaw.json ../OrthancConnection.h -I`pwd`/../../s/jsoncpp-src-0.6.0-rc2/include -fms-extensions
+python ${LAAW_ROOT}/Generators/CodeModelPostProcessing.py AUTOGENERATED/CodeModel.json AUTOGENERATED/CodeModelRaw.json Product.json
+python ${LAAW_ROOT}/Generators/GenerateWrapperCpp.py AUTOGENERATED/OrthancCppClient.h AUTOGENERATED/CodeModel.json Product.json ConfigurationCpp.json
+python ${LAAW_ROOT}/Generators/GenerateExternC.py AUTOGENERATED/ExternC.cpp AUTOGENERATED/CodeModel.json Product.json
+python ${LAAW_ROOT}/Generators/GenerateWindows32Def.py AUTOGENERATED/Windows32.def AUTOGENERATED/CodeModel.json
+python ${LAAW_ROOT}/Generators/GenerateWindows64Def.py AUTOGENERATED/Windows64.def AUTOGENERATED/CodeModel.json
+python ${LAAW_ROOT}/Generators/ApplyProductSubstitutions.py AUTOGENERATED/Windows32.rc ${LAAW_ROOT}/Resources/DllResources.rc.mustache Product.json PLATFORM_SUFFIX "_Windows32"
+python ${LAAW_ROOT}/Generators/ApplyProductSubstitutions.py AUTOGENERATED/Windows64.rc ${LAAW_ROOT}/Resources/DllResources.rc.mustache Product.json PLATFORM_SUFFIX "_Windows64"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OrthancCppClient/SharedLibrary/Laaw/VersionScript.map	Thu Oct 17 14:21:50 2013 +0200
@@ -0,0 +1,9 @@
+# This is a version-script
+
+{
+global:
+  LAAW_EXTERNC_*;
+
+local:
+  *;
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OrthancCppClient/SharedLibrary/Laaw/laaw-exports.h	Thu Oct 17 14:21:50 2013 +0200
@@ -0,0 +1,85 @@
+/**
+ * Laaw - Lightweight, Automated API Wrapper
+ * Copyright (C) 2010-2013 Jomago - Alain Mazy, Benjamin Golinvaux,
+ * Sebastien Jodogne
+ *
+ * This program is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * In addition, as a special exception, the copyright holders of this
+ * program give permission to link the code of its release with the
+ * OpenSSL project's "OpenSSL" library (or with modified versions of it
+ * that use the same license as the "OpenSSL" library), and distribute
+ * the linked executables. You must obey the GNU General Public License
+ * in all respects for all of the code used other than "OpenSSL". If you
+ * modify file(s) with this exception, you may extend this exception to
+ * your version of the file(s), but you are not obligated to do so. If
+ * you do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source files
+ * in the program, then also delete it here.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ **/
+
+
+#pragma once
+
+/********************************************************************
+ ** Windows target
+ ********************************************************************/
+
+#if defined _WIN32
+
+#include <windows.h>
+
+#if defined(__GNUC__)
+// This is Mingw
+#define LAAW_EXPORT_DLL_API  // The exports are handled by the .DEF file
+#else
+// This is MSVC
+#define LAAW_EXPORT_DLL_API __declspec(dllexport)
+#endif
+
+#ifdef _M_X64
+// 64 bits target
+#define LAAW_CALL_CONVENTION
+#else
+// 32 bits target
+#define LAAW_CALL_CONVENTION  __stdcall  // Use the StdCall in Windows32 (for VB6)
+#endif
+
+
+/********************************************************************
+ ** Linux target
+ ********************************************************************/
+
+#elif defined(__linux)
+
+// Try the gcc visibility support
+// http://gcc.gnu.org/wiki/Visibility
+#if ((__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
+#define LAAW_EXPORT_DLL_API  __attribute__ ((visibility("default")))
+#define LAAW_CALL_CONVENTION
+#else
+#error No support for visibility in your version of GCC
+#endif
+
+
+/********************************************************************
+ ** Max OS X target
+ ********************************************************************/
+
+#else
+
+#define LAAW_EXPORT_DLL_API  __attribute__ ((visibility("default")))
+#define LAAW_CALL_CONVENTION
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OrthancCppClient/SharedLibrary/Laaw/laaw.h	Thu Oct 17 14:21:50 2013 +0200
@@ -0,0 +1,89 @@
+/**
+ * Laaw - Lightweight, Automated API Wrapper
+ * Copyright (C) 2010-2013 Jomago - Alain Mazy, Benjamin Golinvaux,
+ * Sebastien Jodogne
+ *
+ * This program is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * In addition, as a special exception, the copyright holders of this
+ * program give permission to link the code of its release with the
+ * OpenSSL project's "OpenSSL" library (or with modified versions of it
+ * that use the same license as the "OpenSSL" library), and distribute
+ * the linked executables. You must obey the GNU General Public License
+ * in all respects for all of the code used other than "OpenSSL". If you
+ * modify file(s) with this exception, you may extend this exception to
+ * your version of the file(s), but you are not obligated to do so. If
+ * you do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source files
+ * in the program, then also delete it here.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ **/
+
+
+#pragma once
+
+#include "laaw-exports.h"
+#include <stddef.h>
+#include <string>
+
+#if (LAAW_PARSING == 1)
+
+#define LAAW_API   __attribute__((deprecated("")))
+#define LAAW_API_INTERNAL  __attribute__((deprecated("")))
+#define LAAW_API_OVERLOAD(name)  __attribute__((deprecated("")))
+#define LAAW_API_PROPERTY  __attribute__((deprecated("")))
+#define LAAW_API_STATIC_CLASS  __attribute__((deprecated("")))
+#define LAAW_API_CUSTOM(name, value)  __attribute__((deprecated("")))
+
+#else
+
+#define LAAW_API
+#define LAAW_API_INTERNAL
+#define LAAW_API_OVERLOAD(name)
+#define LAAW_API_PROPERTY
+#define LAAW_API_STATIC_CLASS
+#define LAAW_API_CUSTOM(name, value)
+
+#endif
+
+
+namespace Laaw
+{
+  /**
+   * This is the base class from which all the public exceptions in
+   * the SDK should derive.
+   **/
+  class LaawException
+  {
+  private:
+    std::string what_;
+
+  public:
+    LaawException()
+    {
+    }
+
+    LaawException(const std::string& what) : what_(what)
+    {
+    }
+
+    LaawException(const char* what) : what_(what)
+    {
+    }
+
+    virtual const char* What() const
+    {
+      return what_.c_str();
+    }
+  };
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OrthancCppClient/SharedLibrary/Product.json	Thu Oct 17 14:21:50 2013 +0200
@@ -0,0 +1,8 @@
+{
+  "Product" : "OrthancClient",
+  "Description" : "Native client to the REST API of Orthanc",
+  "Company" : "CHU of Liege",
+  "Copyright" : "(c) 2012-2013, Sebastien Jodogne, CHU of Liege",
+  "Legal" : "Licensing information is available on https://code.google.com/p/orthanc/",
+  "Version" : "0.6.2"
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OrthancCppClient/SharedLibrary/SharedLibrary.cpp	Thu Oct 17 14:21:50 2013 +0200
@@ -0,0 +1,56 @@
+/**
+ * Orthanc - A Lightweight, RESTful DICOM Store
+ * Copyright (C) 2012-2013 Medical Physics Department, CHU of Liege,
+ * Belgium
+ *
+ * This program is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * In addition, as a special exception, the copyright holders of this
+ * program give permission to link the code of its release with the
+ * OpenSSL project's "OpenSSL" library (or with modified versions of it
+ * that use the same license as the "OpenSSL" library), and distribute
+ * the linked executables. You must obey the GNU General Public License
+ * in all respects for all of the code used other than "OpenSSL". If you
+ * modify file(s) with this exception, you may extend this exception to
+ * your version of the file(s), but you are not obligated to do so. If
+ * you do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source files
+ * in the program, then also delete it here.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ **/
+
+
+
+#include "../../Core/HttpClient.h"
+#include "../OrthancConnection.h"
+
+
+class SharedLibrarySingleton
+{
+public:
+  SharedLibrarySingleton()
+  {
+    Orthanc::HttpClient::GlobalInitialize();
+  }
+
+  ~SharedLibrarySingleton()
+  {
+    Orthanc::HttpClient::GlobalFinalize();
+  }
+};
+
+
+static SharedLibrarySingleton  singleton_;
+
+
+#include "AUTOGENERATED/ExternC.cpp"
--- a/OrthancCppClient/Study.cpp	Wed Sep 04 14:19:14 2013 +0200
+++ b/OrthancCppClient/Study.cpp	Thu Oct 17 14:21:50 2013 +0200
@@ -33,29 +33,30 @@
 #include "Study.h"
 
 #include "OrthancConnection.h"
-#include "../Core/OrthancException.h"
 
 namespace OrthancClient
 {
   void Study::ReadStudy()
   {
     Orthanc::HttpClient client(connection_.GetHttpClient());
-    client.SetUrl(connection_.GetOrthancUrl() + "/studies/" + id_);
+    client.SetUrl(std::string(connection_.GetOrthancUrl()) + "/studies/" + id_);
+
     Json::Value v;
     if (!client.Apply(study_))
     {
-      throw Orthanc::OrthancException(Orthanc::ErrorCode_NetworkProtocol);
+      throw OrthancClientException(Orthanc::ErrorCode_NetworkProtocol);
     }
   }
 
   Orthanc::IDynamicObject* Study::GetFillerItem(size_t index)
   {
     Json::Value::ArrayIndex tmp = static_cast<Json::Value::ArrayIndex>(index);
-    return new Series(connection_, study_["Series"][tmp].asString());
+    std::string id = study_["Series"][tmp].asString();
+    return new Series(connection_, id.c_str());
   }
 
   Study::Study(const OrthancConnection& connection,
-               const std::string& id) :
+               const char* id) :
     connection_(connection),
     id_(id),
     series_(*this)
@@ -64,11 +65,11 @@
     ReadStudy();
   }
 
-  std::string Study::GetMainDicomTag(const char* tag, const char* defaultValue) const
+  const char* Study::GetMainDicomTag(const char* tag, const char* defaultValue) const
   {
     if (study_["MainDicomTags"].isMember(tag))
     {
-      return study_["MainDicomTags"][tag].asString();
+      return study_["MainDicomTags"][tag].asCString();
     }
     else
     {
--- a/OrthancCppClient/Study.h	Wed Sep 04 14:19:14 2013 +0200
+++ b/OrthancCppClient/Study.h	Thu Oct 17 14:21:50 2013 +0200
@@ -36,7 +36,12 @@
 
 namespace OrthancClient
 {
-  class Study : 
+  /**
+   * {summary}{Connection to a study stored in %Orthanc.}
+   * {description}{This class encapsulates a connection to a study
+   * from a remote instance of %Orthanc.}
+   **/
+  class LAAW_API Study : 
     public Orthanc::IDynamicObject, 
     private Orthanc::ArrayFilledByThreads::IFiller
   {
@@ -56,30 +61,59 @@
     virtual Orthanc::IDynamicObject* GetFillerItem(size_t index);
 
   public:
+    /**
+     * {summary}{Create a connection to some study.}
+     * {param}{connection The remote instance of %Orthanc.}
+     * {param}{id The %Orthanc identifier of the study.}
+     **/
     Study(const OrthancConnection& connection,
-          const std::string& id);
+          const char* id);
 
+    /**
+     * {summary}{Reload the series of this study.}
+     * {description}{This method will reload the list of the series of this study. Pay attention to the fact that the series that have been previously returned by GetSeries() will be invalidated.}
+     **/
     void Reload()
     {
       series_.Reload();
     }
 
-    unsigned int GetSeriesCount()
+    /**
+     * {summary}{Return the number of series for this study.}
+     * {returns}{The number of series.}
+     **/
+    uint32_t GetSeriesCount()
     {
       return series_.GetSize();
     }
 
-    Series& GetSeries(unsigned int index)
+    /**
+     * {summary}{Get some series of this study.}
+     * {description}{This method will return an object that contains information about some series. The series are indexed by a number between 0 (inclusive) and the result of GetSeriesCount() (exclusive).}
+     * {param}{index The index of the series of interest.}
+     * {returns}{The series.}
+     **/
+    Series& GetSeries(uint32_t index)
     {
       return dynamic_cast<Series&>(series_.GetItem(index));
     }
-
-    const std::string& GetId() const
+    
+    /**
+     * {summary}{Get the %Orthanc identifier of this study.}
+     * {returns}{The identifier.}
+     **/
+    const char* GetId() const
     {
-      return id_;
+      return id_.c_str();
     }
 
-    std::string GetMainDicomTag(const char* tag, 
+    /**
+     * {summary}{Get the value of one of the main DICOM tags for this study.}
+     * {param}{tag The name of the tag of interest ("StudyDate", "StudyDescription", "StudyInstanceUID" or "StudyTime").}
+     * {param}{defaultValue The default value to be returned if this tag does not exist.}
+     * {returns}{The value of the tag.}
+     **/
+    const char* GetMainDicomTag(const char* tag, 
                                 const char* defaultValue) const;
   };
 }
--- a/OrthancServer/DatabaseWrapper.cpp	Wed Sep 04 14:19:14 2013 +0200
+++ b/OrthancServer/DatabaseWrapper.cpp	Thu Oct 17 14:21:50 2013 +0200
@@ -243,7 +243,7 @@
   {
     SQLite::Statement s(db_, SQLITE_FROM_HERE, 
                         "SELECT parentId FROM Resources WHERE internalId=?");
-    s.BindInt(0, resourceId);
+    s.BindInt64(0, resourceId);
 
     if (!s.Step())
     {
@@ -265,7 +265,7 @@
   {
     SQLite::Statement s(db_, SQLITE_FROM_HERE, 
                         "SELECT publicId FROM Resources WHERE internalId=?");
-    s.BindInt(0, resourceId);
+    s.BindInt64(0, resourceId);
     
     if (!s.Step())
     { 
@@ -280,7 +280,7 @@
   {
     SQLite::Statement s(db_, SQLITE_FROM_HERE, 
                         "SELECT resourceType FROM Resources WHERE internalId=?");
-    s.BindInt(0, resourceId);
+    s.BindInt64(0, resourceId);
     
     if (!s.Step())
     { 
@@ -295,8 +295,8 @@
                                     int64_t child)
   {
     SQLite::Statement s(db_, SQLITE_FROM_HERE, "UPDATE Resources SET parentId = ? WHERE internalId = ?");
-    s.BindInt(0, parent);
-    s.BindInt(1, child);
+    s.BindInt64(0, parent);
+    s.BindInt64(1, child);
     s.Run();
   }
 
@@ -304,7 +304,7 @@
                                     int64_t id)
   {
     SQLite::Statement s(db_, SQLITE_FROM_HERE, "SELECT publicId FROM Resources WHERE parentId=?");
-    s.BindInt(0, id);
+    s.BindInt64(0, id);
 
     childrenPublicIds = Json::arrayValue;
     while (s.Step())
@@ -319,7 +319,7 @@
     signalRemainingAncestor_->Reset();
 
     SQLite::Statement s(db_, SQLITE_FROM_HERE, "DELETE FROM Resources WHERE internalId=?");
-    s.BindInt(0, id);
+    s.BindInt64(0, id);
     s.Run();
 
     if (signalRemainingAncestor_->HasRemainingAncestor())
@@ -334,7 +334,7 @@
                                     const std::string& value)
   {
     SQLite::Statement s(db_, SQLITE_FROM_HERE, "INSERT OR REPLACE INTO Metadata VALUES(?, ?, ?)");
-    s.BindInt(0, id);
+    s.BindInt64(0, id);
     s.BindInt(1, type);
     s.BindString(2, value);
     s.Run();
@@ -344,7 +344,7 @@
                                        MetadataType type)
   {
     SQLite::Statement s(db_, SQLITE_FROM_HERE, "DELETE FROM Metadata WHERE id=? and type=?");
-    s.BindInt(0, id);
+    s.BindInt64(0, id);
     s.BindInt(1, type);
     s.Run();
   }
@@ -355,7 +355,7 @@
   {
     SQLite::Statement s(db_, SQLITE_FROM_HERE, 
                         "SELECT value FROM Metadata WHERE id=? AND type=?");
-    s.BindInt(0, id);
+    s.BindInt64(0, id);
     s.BindInt(1, type);
 
     if (!s.Step())
@@ -375,7 +375,7 @@
     target.clear();
 
     SQLite::Statement s(db_, SQLITE_FROM_HERE, "SELECT type FROM Metadata WHERE id=?");
-    s.BindInt(0, id);
+    s.BindInt64(0, id);
 
     while (s.Step())
     {
@@ -429,11 +429,11 @@
                                       const FileInfo& attachment)
   {
     SQLite::Statement s(db_, SQLITE_FROM_HERE, "INSERT INTO AttachedFiles VALUES(?, ?, ?, ?, ?, ?)");
-    s.BindInt(0, id);
+    s.BindInt64(0, id);
     s.BindInt(1, attachment.GetContentType());
     s.BindString(2, attachment.GetUuid());
-    s.BindInt(3, attachment.GetCompressedSize());
-    s.BindInt(4, attachment.GetUncompressedSize());
+    s.BindInt64(3, attachment.GetCompressedSize());
+    s.BindInt64(4, attachment.GetUncompressedSize());
     s.BindInt(5, attachment.GetCompressionType());
     s.Run();
   }
@@ -445,7 +445,7 @@
 
     SQLite::Statement s(db_, SQLITE_FROM_HERE, 
                         "SELECT fileType FROM AttachedFiles WHERE id=?");
-    s.BindInt(0, id);
+    s.BindInt64(0, id);
 
     while (s.Step())
     {
@@ -459,7 +459,7 @@
   {
     SQLite::Statement s(db_, SQLITE_FROM_HERE, 
                         "SELECT uuid, uncompressedSize, compressionType, compressedSize FROM AttachedFiles WHERE id=? AND fileType=?");
-    s.BindInt(0, id);
+    s.BindInt64(0, id);
     s.BindInt(1, contentType);
 
     if (!s.Step())
@@ -484,7 +484,7 @@
     for (size_t i = 0; i < flattened.GetSize(); i++)
     {
       SQLite::Statement s(db_, SQLITE_FROM_HERE, "INSERT INTO MainDicomTags VALUES(?, ?, ?, ?)");
-      s.BindInt(0, id);
+      s.BindInt64(0, id);
       s.BindInt(1, flattened.GetElement(i).GetTag().GetGroup());
       s.BindInt(2, flattened.GetElement(i).GetTag().GetElement());
       s.BindString(3, flattened.GetElement(i).GetValue().AsString());
@@ -498,7 +498,7 @@
     map.Clear();
 
     SQLite::Statement s(db_, SQLITE_FROM_HERE, "SELECT * FROM MainDicomTags WHERE id=?");
-    s.BindInt(0, id);
+    s.BindInt64(0, id);
     while (s.Step())
     {
       map.SetValue(s.ColumnInt(1),
@@ -513,7 +513,7 @@
   {
     SQLite::Statement s(db_, SQLITE_FROM_HERE, "SELECT a.publicId FROM Resources AS a, Resources AS b "
                         "WHERE a.internalId = b.parentId AND b.internalId = ?");     
-    s.BindInt(0, id);
+    s.BindInt64(0, id);
 
     if (s.Step())
     {
@@ -532,7 +532,7 @@
   {
     SQLite::Statement s(db_, SQLITE_FROM_HERE, "SELECT a.publicId FROM Resources AS a, Resources AS b  "
                         "WHERE a.parentId = b.internalId AND b.internalId = ?");     
-    s.BindInt(0, id);
+    s.BindInt64(0, id);
 
     result.clear();
 
@@ -548,7 +548,7 @@
   {
     SQLite::Statement s(db_, SQLITE_FROM_HERE, "SELECT a.internalId FROM Resources AS a, Resources AS b  "
                         "WHERE a.parentId = b.internalId AND b.internalId = ?");     
-    s.BindInt(0, id);
+    s.BindInt64(0, id);
 
     result.clear();
 
@@ -566,7 +566,7 @@
   {
     SQLite::Statement s(db_, SQLITE_FROM_HERE, "INSERT INTO Changes VALUES(NULL, ?, ?, ?, ?)");
     s.BindInt(0, changeType);
-    s.BindInt(1, internalId);
+    s.BindInt64(1, internalId);
     s.BindInt(2, resourceType);
     s.BindString(3, boost::posix_time::to_iso_string(date));
     s.Run();      
@@ -614,7 +614,7 @@
                                    unsigned int maxResults)
   {
     SQLite::Statement s(db_, SQLITE_FROM_HERE, "SELECT * FROM Changes WHERE seq>? ORDER BY seq LIMIT ?");
-    s.BindInt(0, since);
+    s.BindInt64(0, since);
     s.BindInt(1, maxResults + 1);
     GetChangesInternal(target, s, since, maxResults);
   }
@@ -711,7 +711,7 @@
   {
     SQLite::Statement s(db_, SQLITE_FROM_HERE, 
                         "SELECT * FROM ExportedResources WHERE seq>? ORDER BY seq LIMIT ?");
-    s.BindInt(0, since);
+    s.BindInt64(0, since);
     s.BindInt(1, maxResults + 1);
     GetExportedResources(target, s, since, maxResults);
   }
@@ -873,7 +873,7 @@
     SQLite::Statement s(db_, SQLITE_FROM_HERE,
                         "SELECT patientId FROM PatientRecyclingOrder "
                         "WHERE patientId != ? ORDER BY seq ASC LIMIT 1");
-    s.BindInt(0, patientIdToAvoid);
+    s.BindInt64(0, patientIdToAvoid);
 
     if (!s.Step())
     {
@@ -891,7 +891,7 @@
   {
     SQLite::Statement s(db_, SQLITE_FROM_HERE,
                         "SELECT * FROM PatientRecyclingOrder WHERE patientId = ?");
-    s.BindInt(0, internalId);
+    s.BindInt64(0, internalId);
     return !s.Step();
   }
 
@@ -901,13 +901,13 @@
     if (isProtected)
     {
       SQLite::Statement s(db_, SQLITE_FROM_HERE, "DELETE FROM PatientRecyclingOrder WHERE patientId=?");
-      s.BindInt(0, internalId);
+      s.BindInt64(0, internalId);
       s.Run();
     }
     else if (IsProtectedPatient(internalId))
     {
       SQLite::Statement s(db_, SQLITE_FROM_HERE, "INSERT INTO PatientRecyclingOrder VALUES(NULL, ?)");
-      s.BindInt(0, internalId);
+      s.BindInt64(0, internalId);
       s.Run();
     }
     else
@@ -955,7 +955,7 @@
   {
     SQLite::Statement s(db_, SQLITE_FROM_HERE, 
                         "SELECT * FROM Resources WHERE internalId=?");
-    s.BindInt(0, internalId);
+    s.BindInt64(0, internalId);
     return s.Step();
   }
 
--- a/OrthancServer/Internals/StoreScp.cpp	Wed Sep 04 14:19:14 2013 +0200
+++ b/OrthancServer/Internals/StoreScp.cpp	Thu Oct 17 14:21:50 2013 +0200
@@ -117,7 +117,7 @@
             FromDcmtkBridge::Convert(summary, **imageDataSet);
             FromDcmtkBridge::ToJson(dicomJson, **imageDataSet);       
 
-            if (FromDcmtkBridge::SaveToMemoryBuffer(buffer, *imageDataSet) < 0)
+            if (!FromDcmtkBridge::SaveToMemoryBuffer(buffer, *imageDataSet))
             {
               LOG(ERROR) << "cannot write DICOM file to memory";
               rsp->DimseStatus = STATUS_STORE_Refused_OutOfResources;
--- a/OrthancServer/OrthancRestApi.cpp	Wed Sep 04 14:19:14 2013 +0200
+++ b/OrthancServer/OrthancRestApi.cpp	Thu Oct 17 14:21:50 2013 +0200
@@ -1133,6 +1133,7 @@
     removals.insert(DicomTag(0x0010, 0x1040));  // Patient's Address
     removals.insert(DicomTag(0x0032, 0x1032));  // Requesting Physician
     removals.insert(DicomTag(0x0010, 0x2154));  // PatientTelephoneNumbers
+    removals.insert(DicomTag(0x0010, 0x2000));  // Medical Alerts
 
     // Set the DeidentificationMethod tag
     replacements.insert(std::make_pair(DicomTag(0x0012, 0x0063), "Orthanc " ORTHANC_VERSION " - PS 3.15-2008 Table E.1-1"));
@@ -1185,11 +1186,13 @@
   static bool ParseAnonymizationRequest(Removals& removals,
                                         Replacements& replacements,
                                         bool& removePrivateTags,
+                                        bool& keepPatientId,
                                         RestApi::PostCall& call)
   {
     RETRIEVE_CONTEXT(call);
 
     removePrivateTags = true;
+    keepPatientId = false;
 
     Json::Value request;
     if (call.ParseJsonRequest(request) &&
@@ -1221,6 +1224,11 @@
 
       for (Removals::iterator it = toKeep.begin(); it != toKeep.end(); it++)
       {
+        if (*it == DICOM_TAG_PATIENT_ID)
+        {
+          keepPatientId = true;
+        }
+
         removals.erase(*it);
       }
 
@@ -1236,9 +1244,10 @@
       ParseReplacements(replacements, replacementsPart);
 
       // Generate random Patient's Name if none is specified
-      if (replacements.find(DicomTag(0x0010, 0x0010)) == replacements.end())
+      if (toKeep.find(DICOM_TAG_PATIENT_NAME) == toKeep.end() &&
+          replacements.find(DICOM_TAG_PATIENT_NAME) == replacements.end())
       {
-        replacements.insert(std::make_pair(DicomTag(0x0010, 0x0010), GeneratePatientName(context)));
+        replacements.insert(std::make_pair(DICOM_TAG_PATIENT_NAME, GeneratePatientName(context)));
       }
 
       return true;
@@ -1319,10 +1328,10 @@
   }
 
 
-  static void AnonymizeOrModifyResource(bool isAnonymization,
-                                        Removals& removals,
+  static void AnonymizeOrModifyResource(Removals& removals,
                                         Replacements& replacements,
                                         bool removePrivateTags,
+                                        bool keepPatientId,
                                         MetadataType metadataType,
                                         ChangeType changeType,
                                         ResourceType resourceType,
@@ -1359,9 +1368,8 @@
 
       DicomInstanceHasher originalHasher = original.GetHasher();
 
-      if (isFirst && !isAnonymization)
+      if (isFirst && keepPatientId)
       {
-        // If modifying a study or a series, keep the original patient ID.
         std::string patientId = originalHasher.GetPatientId();
         uidMap[std::make_pair(DicomRootLevel_Patient, patientId)] = patientId;
       }
@@ -1471,10 +1479,12 @@
   {
     Removals removals;
     Replacements replacements;
-    bool removePrivateTags;
+    bool removePrivateTags, keepPatientId;
 
-    if (ParseAnonymizationRequest(removals, replacements, removePrivateTags, call))
+    if (ParseAnonymizationRequest(removals, replacements, removePrivateTags, keepPatientId, call))
     {
+      // TODO Handle "keepPatientId"
+
       // Generate random patient ID if not specified
       if (replacements.find(DICOM_TAG_PATIENT_ID) == replacements.end())
       {
@@ -1509,7 +1519,7 @@
 
     if (ParseModifyRequest(removals, replacements, removePrivateTags, call))
     {
-      AnonymizeOrModifyResource(false, removals, replacements, removePrivateTags, 
+      AnonymizeOrModifyResource(removals, replacements, removePrivateTags, true /*keepPatientId*/,
                                 MetadataType_ModifiedFrom, ChangeType_ModifiedSeries, 
                                 ResourceType_Series, call);
     }
@@ -1520,11 +1530,11 @@
   {
     Removals removals;
     Replacements replacements;
-    bool removePrivateTags;
+    bool removePrivateTags, keepPatientId;
 
-    if (ParseAnonymizationRequest(removals, replacements, removePrivateTags, call))
+    if (ParseAnonymizationRequest(removals, replacements, removePrivateTags, keepPatientId, call))
     {
-      AnonymizeOrModifyResource(true, removals, replacements, removePrivateTags, 
+      AnonymizeOrModifyResource(removals, replacements, removePrivateTags, keepPatientId,
                                 MetadataType_AnonymizedFrom, ChangeType_AnonymizedSeries, 
                                 ResourceType_Series, call);
     }
@@ -1539,7 +1549,7 @@
 
     if (ParseModifyRequest(removals, replacements, removePrivateTags, call))
     {
-      AnonymizeOrModifyResource(false, removals, replacements, removePrivateTags, 
+      AnonymizeOrModifyResource(removals, replacements, removePrivateTags, true /*keepPatientId*/,
                                 MetadataType_ModifiedFrom, ChangeType_ModifiedStudy, 
                                 ResourceType_Study, call);
     }
@@ -1550,11 +1560,11 @@
   {
     Removals removals;
     Replacements replacements;
-    bool removePrivateTags;
+    bool removePrivateTags, keepPatientId;
 
-    if (ParseAnonymizationRequest(removals, replacements, removePrivateTags, call))
+    if (ParseAnonymizationRequest(removals, replacements, removePrivateTags, keepPatientId, call))
     {
-      AnonymizeOrModifyResource(true, removals, replacements, removePrivateTags, 
+      AnonymizeOrModifyResource(removals, replacements, removePrivateTags, keepPatientId,
                                 MetadataType_AnonymizedFrom, ChangeType_AnonymizedStudy, 
                                 ResourceType_Study, call);
     }
@@ -1580,11 +1590,11 @@
   {
     Removals removals;
     Replacements replacements;
-    bool removePrivateTags;
+    bool removePrivateTags, keepPatientId;
 
-    if (ParseAnonymizationRequest(removals, replacements, removePrivateTags, call))
+    if (ParseAnonymizationRequest(removals, replacements, removePrivateTags, keepPatientId, call))
     {
-      AnonymizeOrModifyResource(true, removals, replacements, removePrivateTags, 
+      AnonymizeOrModifyResource(removals, replacements, removePrivateTags, keepPatientId,
                                 MetadataType_AnonymizedFrom, ChangeType_AnonymizedPatient, 
                                 ResourceType_Patient, call);
     }
--- a/OrthancServer/ServerIndex.cpp	Wed Sep 04 14:19:14 2013 +0200
+++ b/OrthancServer/ServerIndex.cpp	Thu Oct 17 14:21:50 2013 +0200
@@ -584,7 +584,7 @@
 
 
 
-  SeriesStatus ServerIndex::GetSeriesStatus(int id)
+  SeriesStatus ServerIndex::GetSeriesStatus(int64_t id)
   {
     // Get the expected number of instances in this series (from the metadata)
     std::string s = db_->GetMetadata(id, MetadataType_Series_ExpectedNumberOfInstances);
--- a/OrthancServer/ServerIndex.h	Wed Sep 04 14:19:14 2013 +0200
+++ b/OrthancServer/ServerIndex.h	Thu Oct 17 14:21:50 2013 +0200
@@ -78,7 +78,7 @@
     void MainDicomTagsToJson(Json::Value& result,
                              int64_t resourceId);
 
-    SeriesStatus GetSeriesStatus(int id);
+    SeriesStatus GetSeriesStatus(int64_t id);
 
     bool IsRecyclingNeeded(uint64_t instanceSize);
 
--- a/README	Wed Sep 04 14:19:14 2013 +0200
+++ b/README	Thu Oct 17 14:21:50 2013 +0200
@@ -48,10 +48,15 @@
 cite our work using the following BibTeX entry:
 
 @inproceedings{Jodogne:ISBI2013,
-  author = "Jodogne, S. and Bernard, C. and Devillers, M. and Lenaerts, E. and Coucke, P.",
-  title = "Orthanc -- {A} Lightweight, {REST}ful {DICOM} Server for Healthcare and Medical Research",
-  booktitle = "Proc. of the International Symposium on Biomedical Imaging ({ISBI})",
-  year = "2013",
+  author = {Jodogne, S. and Bernard, C. and Devillers, M. and Lenaerts, E. and Coucke, P.},
+  title = {Orthanc -- {A} Lightweight, {REST}ful {DICOM} Server for Healthcare and Medical Research},
+  booktitle={Biomedical Imaging ({ISBI}), {IEEE} 10th International Symposium on}, 
+  year={2013}, 
+  pages={190-193}, 
+  ISSN={1945-7928},
+  month=apr,
+  url={http://ieeexplore.ieee.org/xpl/articleDetails.jsp?tp=&arnumber=6556444},
+  address={San Francisco, {CA}, {USA}}
 }
 
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Resources/Archives/OrthancCppClient.cmake	Thu Oct 17 14:21:50 2013 +0200
@@ -0,0 +1,62 @@
+include_directories(${ORTHANC_ROOT}/OrthancCppClient/Package/Laaw)
+
+set(STATIC_BUILD ON)
+include(${ORTHANC_ROOT}/Resources/CMake/DownloadPackage.cmake)
+include(${ORTHANC_ROOT}/Resources/CMake/JsonCppConfiguration.cmake)
+include(${ORTHANC_ROOT}/Resources/CMake/LibCurlConfiguration.cmake)
+include(${ORTHANC_ROOT}/Resources/CMake/LibPngConfiguration.cmake)
+include(${ORTHANC_ROOT}/Resources/CMake/BoostConfiguration.cmake)
+include(${ORTHANC_ROOT}/Resources/CMake/ZlibConfiguration.cmake)
+
+if (${CMAKE_COMPILER_IS_GNUCXX})
+  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -pedantic -Wno-implicit-function-declaration")  # --std=c99 makes libcurl not to compile
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -pedantic -Wno-long-long -Wno-variadic-macros")
+  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--as-needed")
+  set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined")
+elseif (${MSVC})
+  add_definitions(-D_CRT_SECURE_NO_WARNINGS=1)  
+endif()
+
+if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
+  if (${CMAKE_SIZEOF_VOID_P} EQUAL 4)
+    set(WINDOWS_DEF ${ORTHANC_ROOT}/OrthancCppClient/Package/Build/Windows32.def)
+  elseif (${CMAKE_SIZEOF_VOID_P} EQUAL 8)
+    set(WINDOWS_DEF ${ORTHANC_ROOT}/OrthancCppClient/Package/Build/Windows64.def)
+  else()
+    message(FATAL_ERROR "Support your platform here")
+  endif()
+endif()
+
+add_library(OrthancCppClient SHARED
+  ${THIRD_PARTY_SOURCES}
+  ${ORTHANC_ROOT}/Core/OrthancException.cpp
+  ${ORTHANC_ROOT}/Core/Enumerations.cpp
+  ${ORTHANC_ROOT}/Core/Toolbox.cpp
+  ${ORTHANC_ROOT}/Core/HttpClient.cpp
+  ${ORTHANC_ROOT}/Core/MultiThreading/ArrayFilledByThreads.cpp
+  ${ORTHANC_ROOT}/Core/MultiThreading/ThreadedCommandProcessor.cpp
+  ${ORTHANC_ROOT}/Core/MultiThreading/SharedMessageQueue.cpp
+  ${ORTHANC_ROOT}/Core/FileFormats/PngReader.cpp
+  ${ORTHANC_ROOT}/OrthancCppClient/OrthancConnection.cpp
+  ${ORTHANC_ROOT}/OrthancCppClient/Series.cpp
+  ${ORTHANC_ROOT}/OrthancCppClient/Study.cpp
+  ${ORTHANC_ROOT}/OrthancCppClient/Instance.cpp
+  ${ORTHANC_ROOT}/OrthancCppClient/Patient.cpp
+  ${ORTHANC_ROOT}/OrthancCppClient/Package/SharedLibrary.cpp
+  ${ORTHANC_ROOT}/Resources/sha1/sha1.cpp
+  ${ORTHANC_ROOT}/Resources/md5/md5.c
+  ${ORTHANC_ROOT}/Resources/base64/base64.cpp
+  ${WINDOWS_DEF}
+  )
+
+if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
+  set_target_properties(OrthancCppClient
+    PROPERTIES LINK_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined -Wl,--version-script=${ORTHANC_ROOT}/OrthancCppClient/Package/Laaw/VersionScript.map"
+    )
+  target_link_libraries(OrthancCppClient pthread)
+else()
+  set_target_properties(OrthancCppClient
+    PROPERTIES LINK_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--allow-multiple-definition -static-libgcc -static-libstdc++"
+    )
+  target_link_libraries(OrthancCppClient ws2_32)
+endif()
--- a/Resources/CMake/BoostConfiguration.cmake	Wed Sep 04 14:19:14 2013 +0200
+++ b/Resources/CMake/BoostConfiguration.cmake	Thu Oct 17 14:21:50 2013 +0200
@@ -39,14 +39,17 @@
 
 
 if (BOOST_STATIC)
-  SET(BOOST_NAME boost_1_49_0)
+  # Parameters for Boost 1.54.0
+  SET(BOOST_NAME boost_1_54_0)
+  SET(BOOST_BCP_SUFFIX bcpdigest-0.6.2)
+  SET(BOOST_MD5 "a464288a976ba133f9b325f454cb503d")
+  SET(BOOST_FILESYSTEM_SOURCES_DIR "${BOOST_NAME}/libs/filesystem/src")
+  
   SET(BOOST_SOURCES_DIR ${CMAKE_BINARY_DIR}/${BOOST_NAME})
   DownloadPackage(
-    "e0defc8c818e4f1c5bbb29d0292b76ca"
-    "http://www.montefiore.ulg.ac.be/~jodogne/Orthanc/ThirdPartyDownloads/${BOOST_NAME}.tar.gz"
-    "${BOOST_SOURCES_DIR}" "${BOOST_PRELOADED}" 
-    # Only uncompress the Boost modules we need
-    "${BOOST_NAME}/boost ${BOOST_NAME}/libs/thread/src ${BOOST_NAME}/libs/system/src ${BOOST_NAME}/libs/filesystem/v3/src ${BOOST_NAME}/libs/locale/src ${BOOST_NAME}/libs/date_time/src"
+    "${BOOST_MD5}"
+    "http://www.montefiore.ulg.ac.be/~jodogne/Orthanc/ThirdPartyDownloads/${BOOST_NAME}_${BOOST_BCP_SUFFIX}.tar.gz"
+    "${BOOST_SOURCES_DIR}"
     )
 
   set(BOOST_SOURCES)
@@ -68,7 +71,7 @@
       ${BOOST_SOURCES_DIR}/libs/thread/src/win32/tss_dll.cpp
       ${BOOST_SOURCES_DIR}/libs/thread/src/win32/thread.cpp
       ${BOOST_SOURCES_DIR}/libs/thread/src/win32/tss_pe.cpp
-      ${BOOST_SOURCES_DIR}/libs/filesystem/v3/src/windows_file_codecvt.cpp
+      ${BOOST_FILESYSTEM_SOURCES_DIR}/windows_file_codecvt.cpp
       )
     add_definitions(
       -DBOOST_LOCALE_WITH_WCONV=1
@@ -79,10 +82,10 @@
 
   list(APPEND BOOST_SOURCES
     ${BOOST_SOURCES_DIR}/libs/date_time/src/gregorian/greg_month.cpp
-    ${BOOST_SOURCES_DIR}/libs/filesystem/v3/src/codecvt_error_category.cpp
-    ${BOOST_SOURCES_DIR}/libs/filesystem/v3/src/operations.cpp
-    ${BOOST_SOURCES_DIR}/libs/filesystem/v3/src/path.cpp
-    ${BOOST_SOURCES_DIR}/libs/filesystem/v3/src/path_traits.cpp
+    ${BOOST_FILESYSTEM_SOURCES_DIR}/codecvt_error_category.cpp
+    ${BOOST_FILESYSTEM_SOURCES_DIR}/operations.cpp
+    ${BOOST_FILESYSTEM_SOURCES_DIR}/path.cpp
+    ${BOOST_FILESYSTEM_SOURCES_DIR}/path_traits.cpp
     ${BOOST_SOURCES_DIR}/libs/locale/src/encoding/codepage.cpp
     ${BOOST_SOURCES_DIR}/libs/system/src/error_code.cpp
     )
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Resources/CMake/BoostConfiguration.sh	Thu Oct 17 14:21:50 2013 +0200
@@ -0,0 +1,29 @@
+#!/bin/bash
+
+set -e
+set -u
+
+## Starting with version 0.6.2, Orthanc is shipped with a subset of the
+## Boost libraries that is generated with the BCP tool:
+##
+## http://www.boost.org/doc/libs/1_54_0/tools/bcp/doc/html/index.html
+##
+## This script generates this subset.
+
+rm -rf /tmp/boost_1_54_0
+rm -rf /tmp/bcp/boost_1_54_0
+
+cd /tmp
+echo "Uncompressing the source of Boost 1.54.0..."
+tar xfz boost_1_54_0.tar.gz 
+
+echo "Generating the subset..."
+mkdir -p /tmp/bcp/boost_1_54_0
+bcp --boost=/tmp/boost_1_54_0 thread system locale date_time filesystem math/special_functions algorithm uuid /tmp/bcp/boost_1_54_0
+cd /tmp/bcp
+
+echo "Compressing the subset..."
+tar cfz boost_1_54_0_bcpdigest-0.6.2.tar.gz boost_1_54_0
+ls -l boost_1_54_0_bcpdigest-0.6.2.tar.gz
+md5sum boost_1_54_0_bcpdigest-0.6.2.tar.gz
+readlink -f boost_1_54_0_bcpdigest-0.6.2.tar.gz
--- a/Resources/CMake/Compiler.cmake	Wed Sep 04 14:19:14 2013 +0200
+++ b/Resources/CMake/Compiler.cmake	Thu Oct 17 14:21:50 2013 +0200
@@ -5,7 +5,15 @@
   # --std=c99 makes libcurl not to compile
   # -pedantic gives a lot of warnings on OpenSSL 
   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -pedantic -Wno-long-long -Wno-variadic-macros")
+
+  if (CMAKE_CROSSCOMPILING)
+    # http://stackoverflow.com/a/3543845/881731
+    set(CMAKE_RC_COMPILE_OBJECT "<CMAKE_RC_COMPILER> -O coff -I<CMAKE_CURRENT_SOURCE_DIR> <SOURCE> <OBJECT>")
+  endif()
+
 elseif (${MSVC})
+  # Use static runtime under Visual Studio
+  # http://www.cmake.org/Wiki/CMake_FAQ#Dynamic_Replace
   # http://stackoverflow.com/a/6510446
   foreach(flag_var
     CMAKE_C_FLAGS_DEBUG
@@ -19,6 +27,7 @@
     string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
     string(REGEX REPLACE "/MDd" "/MTd" ${flag_var} "${${flag_var}}")
   endforeach(flag_var)
+
   add_definitions(
     -D_CRT_SECURE_NO_WARNINGS=1
     -D_CRT_SECURE_NO_DEPRECATE=1
@@ -30,7 +39,9 @@
 
 if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
   if ("${CMAKE_SYSTEM_VERSION}" STREQUAL "LinuxStandardBase")
-    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -nostdinc++ -I${LSB_PATH}/include -I${LSB_PATH}/include/c++ -I${LSB_PATH}/include/c++/backward -fpermissive")
+    SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --lsb-target-version=${LSB_TARGET_VERSION} -I${LSB_PATH}/include")
+    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --lsb-target-version=${LSB_TARGET_VERSION} -nostdinc++ -I${LSB_PATH}/include -I${LSB_PATH}/include/c++ -I${LSB_PATH}/include/c++/backward -fpermissive")
+    SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} --lsb-target-version=${LSB_TARGET_VERSION} -L${LSB_LIBPATH}")
   endif()
 
   add_definitions(
--- a/Resources/CMake/DcmtkConfiguration.cmake	Wed Sep 04 14:19:14 2013 +0200
+++ b/Resources/CMake/DcmtkConfiguration.cmake	Thu Oct 17 14:21:50 2013 +0200
@@ -6,7 +6,7 @@
   DownloadPackage(
     "219ad631b82031806147e4abbfba4fa4"
     "http://www.montefiore.ulg.ac.be/~jodogne/Orthanc/ThirdPartyDownloads/dcmtk-3.6.0.zip" 
-    "${DCMTK_SOURCES_DIR}" "" "")
+    "${DCMTK_SOURCES_DIR}")
 
   IF(CMAKE_CROSSCOMPILING)
     SET(C_CHAR_UNSIGNED 1 CACHE INTERNAL "Whether char is unsigned.")
--- a/Resources/CMake/DownloadPackage.cmake	Wed Sep 04 14:19:14 2013 +0200
+++ b/Resources/CMake/DownloadPackage.cmake	Thu Oct 17 14:21:50 2013 +0200
@@ -10,20 +10,39 @@
 endmacro()
 
 
-macro(DownloadPackage MD5 Url TargetDirectory PreloadedVariable UncompressArguments)
+##
+## Check the existence of the required decompression tools
+##
+
+if ("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Windows")
+  find_program(ZIP_EXECUTABLE 7z PATHS "$ENV{ProgramFiles}/7-Zip")
+  if (${ZIP_EXECUTABLE} MATCHES "ZIP_EXECUTABLE-NOTFOUND")
+    message(FATAL_ERROR "Please install the '7-zip' software (http://www.7-zip.org/)")
+  endif()
+
+else()
+  find_program(UNZIP_EXECUTABLE unzip)
+  if (${UNZIP_EXECUTABLE} MATCHES "UNZIP_EXECUTABLE-NOTFOUND")
+    message(FATAL_ERROR "Please install the 'unzip' package")
+  endif()
+
+  find_program(TAR_EXECUTABLE tar)
+  if (${TAR_EXECUTABLE} MATCHES "TAR_EXECUTABLE-NOTFOUND")
+    message(FATAL_ERROR "Please install the 'tar' package")
+  endif()
+endif()
+
+
+macro(DownloadPackage MD5 Url TargetDirectory)
   if (NOT IS_DIRECTORY "${TargetDirectory}")
     GetUrlFilename(TMP_FILENAME "${Url}")
-    if ("${PreloadedVariable}" STREQUAL "")
-      set(TMP_PATH "${CMAKE_SOURCE_DIR}/ThirdPartyDownloads/${TMP_FILENAME}")
-      if (NOT EXISTS "${TMP_PATH}")
-        message("Downloading ${Url}")
-        file(DOWNLOAD "${Url}" "${TMP_PATH}" SHOW_PROGRESS EXPECTED_MD5 "${MD5}")
-      else()
-        message("Using local copy of ${Url}")
-      endif()
+
+    set(TMP_PATH "${CMAKE_SOURCE_DIR}/ThirdPartyDownloads/${TMP_FILENAME}")
+    if (NOT EXISTS "${TMP_PATH}")
+      message("Downloading ${Url}")
+      file(DOWNLOAD "${Url}" "${TMP_PATH}" SHOW_PROGRESS EXPECTED_MD5 "${MD5}")
     else()
-      message("Using preloaded archive ${PreloadedVariable} for ${Url}")
-      set(TMP_PATH "${PreloadedVariable}")
+      message("Using local copy of ${Url}")
     endif()
 
     GetUrlExtension(TMP_EXTENSION "${Url}")
@@ -34,8 +53,6 @@
       # How to silently extract files using 7-zip
       # http://superuser.com/questions/331148/7zip-command-line-extract-silently-quietly
 
-      FIND_PROGRAM(ZIP_EXECUTABLE 7z PATHS "$ENV{ProgramFiles}/7-Zip") 
-
       if (("${TMP_EXTENSION}" STREQUAL "gz") OR ("${TMP_EXTENSION}" STREQUAL "tgz"))
         execute_process(
           COMMAND ${ZIP_EXECUTABLE} e -y ${TMP_PATH}
@@ -48,37 +65,18 @@
           message(FATAL_ERROR "Error while running the uncompression tool")
         endif()
 
-        set(ARGS ${UncompressArguments})
-        SEPARATE_ARGUMENTS(ARGS)
-        list(LENGTH ARGS TMP_LENGTH)
-
         if ("${TMP_EXTENSION}" STREQUAL "tgz")
           string(REGEX REPLACE ".tgz$" ".tar" TMP_FILENAME2 "${TMP_FILENAME}")
         else()
           string(REGEX REPLACE ".gz$" "" TMP_FILENAME2 "${TMP_FILENAME}")
         endif()
 
-        if (TMP_LENGTH EQUAL 0)
-          execute_process(
-            COMMAND ${ZIP_EXECUTABLE} x -y ${TMP_FILENAME2}
-            WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
-            RESULT_VARIABLE Failure
-            OUTPUT_QUIET
-            )
-        else()
-          foreach(SUBDIR ${ARGS})
-            execute_process(
-              COMMAND ${ZIP_EXECUTABLE} x -y "-i!${SUBDIR}" "${TMP_FILENAME2}"
-              WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
-              RESULT_VARIABLE Failure
-              OUTPUT_QUIET
-              )
-
-            if (Failure)
-              message(FATAL_ERROR "Error while running the uncompression tool")
-            endif()
-          endforeach()
-        endif()
+        execute_process(
+          COMMAND ${ZIP_EXECUTABLE} x -y ${TMP_FILENAME2}
+          WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
+          RESULT_VARIABLE Failure
+          OUTPUT_QUIET
+          )
       elseif ("${TMP_EXTENSION}" STREQUAL "zip")
         execute_process(
           COMMAND ${ZIP_EXECUTABLE} x -y ${TMP_PATH}
@@ -93,20 +91,20 @@
     else()
       if ("${TMP_EXTENSION}" STREQUAL "zip")
         execute_process(
-          COMMAND sh -c "unzip -q ${TMP_PATH} ${UncompressArguments}"
+          COMMAND sh -c "${UNZIP_EXECUTABLE} -q ${TMP_PATH}"
           WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
           RESULT_VARIABLE Failure
         )
       elseif (("${TMP_EXTENSION}" STREQUAL "gz") OR ("${TMP_EXTENSION}" STREQUAL "tgz"))
-        #message("tar xvfz ${TMP_PATH} ${UncompressArguments}")
+        #message("tar xvfz ${TMP_PATH}")
         execute_process(
-          COMMAND sh -c "tar xfz ${TMP_PATH} ${UncompressArguments}"
+          COMMAND sh -c "${TAR_EXECUTABLE} xfz ${TMP_PATH}"
           WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
           RESULT_VARIABLE Failure
           )
       elseif ("${TMP_EXTENSION}" STREQUAL "bz2")
         execute_process(
-          COMMAND sh -c "tar xfj ${TMP_PATH} ${UncompressArguments}"
+          COMMAND sh -c "${TAR_EXECUTABLE} xfj ${TMP_PATH}"
           WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
           RESULT_VARIABLE Failure
           )
@@ -124,4 +122,3 @@
     endif()
   endif()
 endmacro()
-
--- a/Resources/CMake/GoogleLogConfiguration.cmake	Wed Sep 04 14:19:14 2013 +0200
+++ b/Resources/CMake/GoogleLogConfiguration.cmake	Thu Oct 17 14:21:50 2013 +0200
@@ -3,13 +3,7 @@
   DownloadPackage(
     "897fbff90d91ea2b6d6e78c8cea641cc"
     "http://www.montefiore.ulg.ac.be/~jodogne/Orthanc/ThirdPartyDownloads/glog-0.3.2.tar.gz"
-    "${GOOGLE_LOG_SOURCES_DIR}" "" "")
-
-  #SET(GOOGLE_LOG_SOURCES_DIR ${CMAKE_BINARY_DIR}/glog-0.3.3)
-  #DownloadPackage(
-  #  "a6fd2c22f8996846e34c763422717c18"
-  #  "http://www.montefiore.ulg.ac.be/~jodogne/Orthanc/ThirdPartyDownloads/glog-0.3.3.tar.gz"
-  #  "${GOOGLE_LOG_SOURCES_DIR}" "" "")
+    "${GOOGLE_LOG_SOURCES_DIR}")
 
   set(GOOGLE_LOG_HEADERS
     ${GOOGLE_LOG_SOURCES_DIR}/src/glog/logging.h
@@ -55,10 +49,18 @@
     )
 
   if (CMAKE_COMPILER_IS_GNUCXX)
-    execute_process(
-      COMMAND patch utilities.cc ${CMAKE_SOURCE_DIR}/Resources/Patches/glog-utilities.diff
-      WORKING_DIRECTORY ${GOOGLE_LOG_SOURCES_DIR}/src
-      )
+    if ("${CMAKE_SYSTEM_VERSION}" STREQUAL "LinuxStandardBase")
+      execute_process(
+        COMMAND patch utilities.cc ${CMAKE_SOURCE_DIR}/Resources/Patches/glog-utilities-lsb.diff
+        WORKING_DIRECTORY ${GOOGLE_LOG_SOURCES_DIR}/src
+        )
+    else()
+      execute_process(
+        COMMAND patch utilities.cc ${CMAKE_SOURCE_DIR}/Resources/Patches/glog-utilities.diff
+        WORKING_DIRECTORY ${GOOGLE_LOG_SOURCES_DIR}/src
+        )
+    endif()
+
     execute_process(
       COMMAND patch port.h ${CMAKE_SOURCE_DIR}/Resources/Patches/glog-port-h.diff 
       WORKING_DIRECTORY ${GOOGLE_LOG_SOURCES_DIR}/src/windows
@@ -70,10 +72,18 @@
   endif()
 
   if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
-    configure_file(
-      ${CMAKE_SOURCE_DIR}/Resources/CMake/GoogleLogConfiguration.h
-      ${GOOGLE_LOG_SOURCES_DIR}/src/config.h
-      COPYONLY)
+    if ("${CMAKE_SYSTEM_VERSION}" STREQUAL "LinuxStandardBase")
+      # Install the specific configuration for LSB SDK
+      configure_file(
+        ${CMAKE_SOURCE_DIR}/Resources/CMake/GoogleLogConfigurationLSB.h
+        ${GOOGLE_LOG_SOURCES_DIR}/src/config.h
+        COPYONLY)
+    else()
+      configure_file(
+        ${CMAKE_SOURCE_DIR}/Resources/CMake/GoogleLogConfiguration.h
+        ${GOOGLE_LOG_SOURCES_DIR}/src/config.h
+        COPYONLY)
+    endif()
 
     set(GOOGLE_LOG_SOURCES
       ${GOOGLE_LOG_SOURCES_DIR}/src/demangle.cc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Resources/CMake/GoogleLogConfigurationLSB.h	Thu Oct 17 14:21:50 2013 +0200
@@ -0,0 +1,175 @@
+/* src/config.h.  Generated from config.h.in by configure.  */
+/* src/config.h.in.  Generated from configure.ac by autoheader.  */
+
+/* Namespace for Google classes */
+#define GOOGLE_NAMESPACE google
+
+/* Define if you have the `dladdr' function */
+/* #undef HAVE_DLADDR */
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#define HAVE_DLFCN_H 1
+
+/* Define to 1 if you have the <execinfo.h> header file. */
+#define HAVE_EXECINFO_H 1
+
+/* Define if you have the `fcntl' function */
+#define HAVE_FCNTL 1
+
+/* Define to 1 if you have the <glob.h> header file. */
+#define HAVE_GLOB_H 1
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#define HAVE_INTTYPES_H 1
+
+/* Define to 1 if you have the `pthread' library (-lpthread). */
+#define HAVE_LIBPTHREAD 1
+
+/* Define to 1 if you have the <libunwind.h> header file. */
+/* #undef HAVE_LIBUNWIND_H */
+
+/* define if you have google gflags library */
+/* #undef HAVE_LIB_GFLAGS */
+
+/* define if you have google gmock library */
+/* #undef HAVE_LIB_GMOCK */
+
+/* define if you have google gtest library */
+/* #undef HAVE_LIB_GTEST */
+
+/* define if you have libunwind */
+/* #undef HAVE_LIB_UNWIND */
+
+/* Define to 1 if you have the <memory.h> header file. */
+#define HAVE_MEMORY_H 1
+
+/* define if the compiler implements namespaces */
+#define HAVE_NAMESPACES 1
+
+/* Define if you have POSIX threads libraries and header files. */
+#define HAVE_PTHREAD 1
+
+/* Define to 1 if you have the <pwd.h> header file. */
+#define HAVE_PWD_H 1
+
+/* define if the compiler implements pthread_rwlock_* */
+#define HAVE_RWLOCK 1
+
+/* Define if you have the `sigaltstack' function */
+#define HAVE_SIGALTSTACK 1
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the <strings.h> header file. */
+#define HAVE_STRINGS_H 1
+
+/* Define to 1 if you have the <string.h> header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if you have the <syscall.h> header file. */
+/* #undef HAVE_SYSCALL_H */
+
+/* Define to 1 if you have the <syslog.h> header file. */
+#define HAVE_SYSLOG_H 1
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/syscall.h> header file. */
+/* #undef HAVE_SYS_SYSCALL_H */
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#define HAVE_SYS_TIME_H 1
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if you have the <sys/ucontext.h> header file. */
+/* #define HAVE_SYS_UCONTEXT_H 1 */
+
+/* Define to 1 if you have the <sys/utsname.h> header file. */
+#define HAVE_SYS_UTSNAME_H 1
+
+/* Define to 1 if you have the <ucontext.h> header file. */
+/* #define HAVE_UCONTEXT_H 1 */
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#define HAVE_UNISTD_H 1
+
+/* define if the compiler supports using expression for operator */
+#define HAVE_USING_OPERATOR 1
+
+/* define if your compiler has __attribute__ */
+#define HAVE___ATTRIBUTE__ 1
+
+/* define if your compiler has __builtin_expect */
+#define HAVE___BUILTIN_EXPECT 1
+
+/* define if your compiler has __sync_val_compare_and_swap */
+#define HAVE___SYNC_VAL_COMPARE_AND_SWAP 1
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+   */
+#define LT_OBJDIR ".libs/"
+
+/* Name of package */
+#define PACKAGE "glog"
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT "opensource@google.com"
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME "glog"
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING "glog 0.3.2"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "glog"
+
+/* Define to the home page for this package. */
+#define PACKAGE_URL ""
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "0.3.2"
+
+/* How to access the PC from a struct ucontext */
+/*#include <ucontext.h>
+#include <sys/ucontext.h>
+#ifdef REG_RIP
+#define PC_FROM_UCONTEXT uc_mcontext.gregs[REG_RIP]
+#else
+#undef PC_FROM_UCONTEXT
+#endif*/
+
+// This is required for older versions of Linux
+#undef PC_FROM_UCONTEXT
+
+/* Define to necessary symbol if this constant uses a non-standard name on
+   your system. */
+/* #undef PTHREAD_CREATE_JOINABLE */
+
+/* The size of `void *', as computed by sizeof. */
+#define SIZEOF_VOID_P 8
+
+/* Define to 1 if you have the ANSI C header files. */
+/* #undef STDC_HEADERS */
+
+/* the namespace where STL code like vector<> is defined */
+#define STL_NAMESPACE std
+
+/* location of source code */
+#define TEST_SRC_DIR "."
+
+/* Version number of package */
+#define VERSION "0.3.2"
+
+/* Stops putting the code inside the Google namespace */
+#define _END_GOOGLE_NAMESPACE_ }
+
+/* Puts following code inside the Google namespace */
+#define _START_GOOGLE_NAMESPACE_ namespace google {
--- a/Resources/CMake/GoogleTestConfiguration.cmake	Wed Sep 04 14:19:14 2013 +0200
+++ b/Resources/CMake/GoogleTestConfiguration.cmake	Thu Oct 17 14:21:50 2013 +0200
@@ -12,7 +12,7 @@
   DownloadPackage(
     "4577b49f2973c90bf9ba69aa8166b786"
     "http://www.montefiore.ulg.ac.be/~jodogne/Orthanc/ThirdPartyDownloads/gtest-1.6.0.zip"
-    "${GTEST_SOURCES_DIR}" "" "")
+    "${GTEST_SOURCES_DIR}")
 
   include_directories(
     ${GTEST_SOURCES_DIR}/include
--- a/Resources/CMake/JsonCppConfiguration.cmake	Wed Sep 04 14:19:14 2013 +0200
+++ b/Resources/CMake/JsonCppConfiguration.cmake	Thu Oct 17 14:21:50 2013 +0200
@@ -12,7 +12,7 @@
   DownloadPackage(
     "363e2f4cbd3aeb63bf4e571f377400fb"
     "http://www.montefiore.ulg.ac.be/~jodogne/Orthanc/ThirdPartyDownloads/jsoncpp-src-0.6.0-rc2.tar.gz"
-    "${JSONCPP_SOURCES_DIR}" "" "")
+    "${JSONCPP_SOURCES_DIR}")
 
   list(APPEND THIRD_PARTY_SOURCES
     ${JSONCPP_SOURCES_DIR}/src/lib_json/json_reader.cpp
--- a/Resources/CMake/LibCurlConfiguration.cmake	Wed Sep 04 14:19:14 2013 +0200
+++ b/Resources/CMake/LibCurlConfiguration.cmake	Thu Oct 17 14:21:50 2013 +0200
@@ -3,14 +3,14 @@
   DownloadPackage(
     "3fa4d5236f2a36ca5c3af6715e837691"
     "http://www.montefiore.ulg.ac.be/~jodogne/Orthanc/ThirdPartyDownloads/curl-7.26.0.tar.gz"
-    "${CURL_SOURCES_DIR}" "" "")
+    "${CURL_SOURCES_DIR}")
 
   include_directories(${CURL_SOURCES_DIR}/include)
   AUX_SOURCE_DIRECTORY(${CURL_SOURCES_DIR}/lib CURL_SOURCES)
   source_group(ThirdParty\\LibCurl REGULAR_EXPRESSION ${CURL_SOURCES_DIR}/.*)
 
-  add_library(Curl STATIC ${CURL_SOURCES})
-  link_libraries(Curl)  
+  #add_library(Curl STATIC ${CURL_SOURCES})
+  #link_libraries(Curl)  
 
   add_definitions(
     -DCURL_STATICLIB=1
--- a/Resources/CMake/LibPngConfiguration.cmake	Wed Sep 04 14:19:14 2013 +0200
+++ b/Resources/CMake/LibPngConfiguration.cmake	Thu Oct 17 14:21:50 2013 +0200
@@ -3,7 +3,7 @@
   DownloadPackage(
     "8ea7f60347a306c5faf70b977fa80e28"
     "http://www.montefiore.ulg.ac.be/~jodogne/Orthanc/ThirdPartyDownloads/libpng-1.5.12.tar.gz"
-    "${LIBPNG_SOURCES_DIR}" "${LIBPNG_PRELOADED}" "")
+    "${LIBPNG_SOURCES_DIR}")
 
   include_directories(
     ${LIBPNG_SOURCES_DIR}
--- a/Resources/CMake/LuaConfiguration.cmake	Wed Sep 04 14:19:14 2013 +0200
+++ b/Resources/CMake/LuaConfiguration.cmake	Thu Oct 17 14:21:50 2013 +0200
@@ -3,7 +3,7 @@
   DownloadPackage(
     "2e115fe26e435e33b0d5c022e4490567"
     "http://www.montefiore.ulg.ac.be/~jodogne/Orthanc/ThirdPartyDownloads/lua-5.1.5.tar.gz"
-    "${LUA_SOURCES_DIR}" "" "")
+    "${LUA_SOURCES_DIR}")
 
   add_definitions(
     #-DLUA_LIB=1
--- a/Resources/CMake/MongooseConfiguration.cmake	Wed Sep 04 14:19:14 2013 +0200
+++ b/Resources/CMake/MongooseConfiguration.cmake	Thu Oct 17 14:21:50 2013 +0200
@@ -3,7 +3,7 @@
   DownloadPackage(
     "e718fc287b4eb1bd523be3fa00942bb0"
     "http://www.montefiore.ulg.ac.be/~jodogne/Orthanc/ThirdPartyDownloads/mongoose-3.1.tgz"
-    "${MONGOOSE_SOURCES_DIR}" "" "")
+    "${MONGOOSE_SOURCES_DIR}")
 
   # Patch mongoose
   execute_process(
--- a/Resources/CMake/OpenSslConfiguration.cmake	Wed Sep 04 14:19:14 2013 +0200
+++ b/Resources/CMake/OpenSslConfiguration.cmake	Thu Oct 17 14:21:50 2013 +0200
@@ -3,7 +3,7 @@
   DownloadPackage(
     "ae412727c8c15b67880aef7bd2999b2e"
     "www.montefiore.ulg.ac.be/~jodogne/Orthanc/ThirdPartyDownloads/openssl-1.0.1c.tar.gz"
-    "${OPENSSL_SOURCES_DIR}" "" "")
+    "${OPENSSL_SOURCES_DIR}")
 
   if (NOT EXISTS "${OPENSSL_SOURCES_DIR}/include/PATCHED")
     if ("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Windows")
@@ -164,6 +164,20 @@
     ${OPENSSL_SOURCES_DIR}/crypto/sha/sha512t.c
     ${OPENSSL_SOURCES_DIR}/crypto/sha/shatest.c
     ${OPENSSL_SOURCES_DIR}/crypto/srp/srptest.c
+
+    ${OPENSSL_SOURCES_DIR}/crypto/bn/divtest.c
+    ${OPENSSL_SOURCES_DIR}/crypto/bn/bnspeed.c
+    ${OPENSSL_SOURCES_DIR}/crypto/des/destest.c
+    ${OPENSSL_SOURCES_DIR}/crypto/dh/p192.c
+    ${OPENSSL_SOURCES_DIR}/crypto/dh/p512.c
+    ${OPENSSL_SOURCES_DIR}/crypto/dh/p1024.c
+    ${OPENSSL_SOURCES_DIR}/crypto/des/rpw.c
+    ${OPENSSL_SOURCES_DIR}/ssl/ssltest.c
+    ${OPENSSL_SOURCES_DIR}/crypto/dsa/dsagen.c
+    ${OPENSSL_SOURCES_DIR}/crypto/dsa/dsatest.c
+    ${OPENSSL_SOURCES_DIR}/crypto/dh/dhtest.c
+    ${OPENSSL_SOURCES_DIR}/crypto/pqueue/pq_test.c
+    ${OPENSSL_SOURCES_DIR}/crypto/des/ncbc_enc.c
     )
 
   #if (${MSVC})
@@ -172,10 +186,16 @@
       ${OPENSSL_SOURCES}
       PROPERTIES COMPILE_DEFINITIONS
       "OPENSSL_SYSNAME_WIN32;SO_WIN32;WIN32_LEAN_AND_MEAN;L_ENDIAN")
+
+  elseif (${CMAKE_SYSTEM_VERSION} STREQUAL "LinuxStandardBase")
+    execute_process(
+      COMMAND patch ui_openssl.c ${CMAKE_SOURCE_DIR}/Resources/Patches/openssl-lsb.diff
+      WORKING_DIRECTORY ${OPENSSL_SOURCES_DIR}/crypto/ui
+      )
   endif()
 
-  add_library(OpenSSL STATIC ${OPENSSL_SOURCES})
-  link_libraries(OpenSSL)
+  #add_library(OpenSSL STATIC ${OPENSSL_SOURCES})
+  #link_libraries(OpenSSL)
 
 else()
   include(FindOpenSSL)
--- a/Resources/CMake/SQLiteConfiguration.cmake	Wed Sep 04 14:19:14 2013 +0200
+++ b/Resources/CMake/SQLiteConfiguration.cmake	Thu Oct 17 14:21:50 2013 +0200
@@ -3,7 +3,7 @@
   DownloadPackage(
     "5fbeff9645ab035a1f580e90b279a16d"
     "http://www.montefiore.ulg.ac.be/~jodogne/Orthanc/ThirdPartyDownloads/sqlite-amalgamation-3071300.zip"
-    "${SQLITE_SOURCES_DIR}" "" "")
+    "${SQLITE_SOURCES_DIR}")
 
   list(APPEND THIRD_PARTY_SOURCES
     ${SQLITE_SOURCES_DIR}/sqlite3.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Resources/CMake/Uninstall.cmake.in	Thu Oct 17 14:21:50 2013 +0200
@@ -0,0 +1,25 @@
+# Code taken from the CMake FAQ
+# http://www.cmake.org/Wiki/CMake_FAQ#Can_I_do_.22make_uninstall.22_with_CMake.3F
+
+if (NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
+  message(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"")
+endif(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
+
+file(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files)
+string(REGEX REPLACE "\n" ";" files "${files}")
+list(REVERSE files)
+foreach (file ${files})
+  message(STATUS "Uninstalling \"$ENV{DESTDIR}${file}\"")
+  if (EXISTS "$ENV{DESTDIR}${file}")
+    execute_process(
+      COMMAND @CMAKE_COMMAND@ -E remove "$ENV{DESTDIR}${file}"
+      OUTPUT_VARIABLE rm_out
+      RESULT_VARIABLE rm_retval
+      )
+    if(NOT ${rm_retval} EQUAL 0)
+      message(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"")
+    endif (NOT ${rm_retval} EQUAL 0)
+  else (EXISTS "$ENV{DESTDIR}${file}")
+    message(STATUS "File \"$ENV{DESTDIR}${file}\" does not exist.")
+  endif (EXISTS "$ENV{DESTDIR}${file}")
+endforeach(file)
--- a/Resources/CMake/ZlibConfiguration.cmake	Wed Sep 04 14:19:14 2013 +0200
+++ b/Resources/CMake/ZlibConfiguration.cmake	Thu Oct 17 14:21:50 2013 +0200
@@ -1,7 +1,7 @@
 # This is the minizip distribution to create ZIP files
 list(APPEND THIRD_PARTY_SOURCES 
-  ${CMAKE_SOURCE_DIR}/Resources/minizip/ioapi.c
-  ${CMAKE_SOURCE_DIR}/Resources/minizip/zip.c
+  ${ORTHANC_ROOT}/Resources/minizip/ioapi.c
+  ${ORTHANC_ROOT}/Resources/minizip/zip.c
   )
 
 if (${STATIC_BUILD})
@@ -9,7 +9,7 @@
   DownloadPackage(
     "60df6a37c56e7c1366cca812414f7b85"
     "http://www.montefiore.ulg.ac.be/~jodogne/Orthanc/ThirdPartyDownloads/zlib-1.2.7.tar.gz"
-    "${ZLIB_SOURCES_DIR}" "${ZLIB_PRELOADED}" "")
+    "${ZLIB_SOURCES_DIR}")
 
   include_directories(
     ${ZLIB_SOURCES_DIR}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Resources/EclipseCodingStyle.xml	Thu Oct 17 14:21:50 2013 +0200
@@ -0,0 +1,167 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<profiles version="1">
+<profile kind="CodeFormatterProfile" name="Orthanc" version="1">
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_new_line_in_empty_block" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.lineSplit" value="80"/>
+<setting id="org.eclipse.cdt.core.formatter.alignment_for_member_access" value="0"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_comma_in_base_types" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.keep_else_statement_on_same_line" value="false"/>
+<setting id="org.eclipse.cdt.core.formatter.indent_switchstatements_compare_to_switch" value="false"/>
+<setting id="org.eclipse.cdt.core.formatter.alignment_for_constructor_initializer_list" value="0"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_exception_specification" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_comma_in_base_types" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_access_specifier" value="true"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_exception_specification" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_comma_in_template_arguments" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.use_tabs_only_for_leading_indentations" value="false"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_colon_in_labeled_statement" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_colon_in_case" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.comment.min_distance_between_code_and_line_comment" value="1"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.alignment_for_expressions_in_array_initializer" value="18"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_comma_in_declarator_list" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_bracket" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.tabulation.size" value="2"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_new_line_before_else_in_if_statement" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.alignment_for_enumerator_list" value="49"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_switch" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.alignment_for_declarator_list" value="16"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.indent_empty_lines" value="false"/>
+<setting id="org.eclipse.cdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/>
+<setting id="org.eclipse.cdt.core.formatter.keep_empty_array_initializer_on_one_line" value="false"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.put_empty_statement_on_new_line" value="true"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_between_empty_braces_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.brace_position_for_method_declaration" value="next_line"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_question_in_conditional" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_semicolon" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_closing_angle_bracket_in_template_arguments" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_colon_in_base_clause" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.indent_breaks_compare_to_cases" value="true"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.join_wrapped_lines" value="true"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_comma_in_declarator_list" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.alignment_for_arguments_in_method_invocation" value="18"/>
+<setting id="org.eclipse.cdt.core.formatter.comment.never_indent_line_comments_on_first_column" value="true"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_between_empty_brackets" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_bracket" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.alignment_for_parameters_in_method_declaration" value="18"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.number_of_empty_lines_to_preserve" value="1"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.brace_position_for_block" value="next_line"/>
+<setting id="org.eclipse.cdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments" value="true"/>
+<setting id="org.eclipse.cdt.core.formatter.brace_position_for_type_declaration" value="next_line"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_assignment_operator" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_angle_bracket_in_template_arguments" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_comma_in_expression_list" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_angle_bracket_in_template_parameters" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.continuation_indentation" value="2"/>
+<setting id="org.eclipse.cdt.core.formatter.alignment_for_expression_list" value="0"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_comma_in_template_parameters" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_binary_operator" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.alignment_for_conditional_expression" value="34"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_comma_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.format_guardian_clause_on_one_line" value="false"/>
+<setting id="org.eclipse.cdt.core.formatter.indent_access_specifier_extra_spaces" value="0"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.indent_access_specifier_compare_to_type_header" value="false"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.continuation_indentation_for_array_initializer" value="2"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_namespace_header" value="true"/>
+<setting id="org.eclipse.cdt.core.formatter.alignment_for_compact_if" value="16"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_assignment_operator" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.alignment_for_assignment" value="16"/>
+<setting id="org.eclipse.cdt.core.formatter.alignment_for_conditional_expression_chain" value="18"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_comma_in_template_parameters" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_comma_in_expression_list" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_exception_specification" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_binary_operator" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_new_line_before_identifier_in_function_declaration" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.alignment_for_base_clause_in_type_declaration" value="80"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_declaration_throws" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_exception_specification" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.indent_declaration_compare_to_template_header" value="false"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_unary_operator" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.indent_statements_compare_to_body" value="true"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.alignment_for_binary_expression" value="18"/>
+<setting id="org.eclipse.cdt.core.formatter.indent_statements_compare_to_block" value="true"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_comma_in_template_arguments" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="16"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_closing_paren_in_cast" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_angle_bracket_in_template_parameters" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.tabulation.char" value="space"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_angle_bracket_in_template_parameters" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_new_line_before_colon_in_constructor_initializer_list" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.brace_position_for_block_in_case" value="next_line"/>
+<setting id="org.eclipse.cdt.core.formatter.compact_else_if" value="true"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_new_line_after_template_declaration" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_colon_in_base_clause" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.keep_then_statement_on_same_line" value="false"/>
+<setting id="org.eclipse.cdt.core.formatter.brace_position_for_switch" value="next_line"/>
+<setting id="org.eclipse.cdt.core.formatter.alignment_for_overloaded_left_shift_chain" value="18"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.keep_imple_if_on_one_line" value="false"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.indentation.size" value="2"/>
+<setting id="org.eclipse.cdt.core.formatter.brace_position_for_namespace_declaration" value="next_line"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_comma_in_enum_declarations" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_angle_bracket_in_template_arguments" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.brace_position_for_array_initializer" value="next_line"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_namespace_declaration" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_postfix_operator" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_closing_bracket" value="do not insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_new_line_before_while_in_do_statement" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_closing_angle_bracket_in_template_parameters" value="insert"/>
+<setting id="org.eclipse.cdt.core.formatter.insert_space_after_opening_angle_bracket_in_template_arguments" value="do not insert"/>
+</profile>
+</profiles>
--- a/Resources/LinuxStandardBaseToolchain.cmake	Wed Sep 04 14:19:14 2013 +0200
+++ b/Resources/LinuxStandardBaseToolchain.cmake	Thu Oct 17 14:21:50 2013 +0200
@@ -11,14 +11,15 @@
 
 IF (EXISTS ${LSB_PATH}/lib64)
   SET(LSB_TARGET_PROCESSOR "x86_64")
+  SET(LSB_LIBPATH ${LSB_PATH}/lib64-${LSB_TARGET_VERSION})
 ELSEIF (EXISTS ${LSB_PATH}/lib)
   SET(LSB_TARGET_PROCESSOR "x86")
+  SET(LSB_LIBPATH ${LSB_PATH}/lib-${LSB_TARGET_VERSION})
 ELSE()
   MESSAGE(FATAL_ERROR "Unable to detect the target processor architecture. Check the LSB_PATH environment variable.")
 ENDIF()
 
 SET(LSB_CPPPATH ${LSB_PATH}/include)
-SET(LSB_LIBPATH ${LSB_PATH}/lib-${LSB_TARGET_VERSION})
 SET(PKG_CONFIG_PATH ${LSB_LIBPATH}/pkgconfig/)
 
 # the name of the target operating system
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Resources/MinGW64Toolchain.cmake	Thu Oct 17 14:21:50 2013 +0200
@@ -0,0 +1,32 @@
+# http://sourceforge.net/apps/trac/mingw-w64/wiki/GeneralUsageInstructions
+
+# the name of the target operating system
+set(CMAKE_SYSTEM_NAME Windows)
+
+# Detect the prefix of the mingw-w64 compiler
+execute_process(
+  COMMAND uname -p
+  OUTPUT_VARIABLE MINGW64_ARCHITECTURE
+  OUTPUT_STRIP_TRAILING_WHITESPACE
+  )
+
+if (${MINGW64_ARCHITECTURE} STREQUAL "x86_64")
+  set(MINGW64_PREFIX "x86_64")
+else()
+  set(MINGW64_PREFIX "i686")
+endif()
+  
+# which compilers to use for C and C++
+set(CMAKE_C_COMPILER ${MINGW64_PREFIX}-w64-mingw32-gcc)
+set(CMAKE_CXX_COMPILER ${MINGW64_PREFIX}-w64-mingw32-g++)
+set(CMAKE_RC_COMPILER ${MINGW64_PREFIX}-w64-mingw32-windres)
+
+# here is the target environment located
+set(CMAKE_FIND_ROOT_PATH /usr/i686-w64-mingw32)
+
+# adjust the default behaviour of the FIND_XXX() commands:
+# search headers and libraries in the target environment, search 
+# programs in the host environment
+set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
--- a/Resources/MinGWToolchain.cmake	Wed Sep 04 14:19:14 2013 +0200
+++ b/Resources/MinGWToolchain.cmake	Thu Oct 17 14:21:50 2013 +0200
@@ -1,15 +1,15 @@
 # http://www.vtk.org/Wiki/CmakeMingw
 
 # the name of the target operating system
-SET(CMAKE_SYSTEM_NAME Windows)
+set(CMAKE_SYSTEM_NAME Windows)
 
 # which compilers to use for C and C++
-SET(CMAKE_C_COMPILER i586-mingw32msvc-gcc)
-SET(CMAKE_CXX_COMPILER i586-mingw32msvc-g++)
-SET(CMAKE_RC_COMPILER i586-mingw32msvc-windres)
+set(CMAKE_C_COMPILER i586-mingw32msvc-gcc)
+set(CMAKE_CXX_COMPILER i586-mingw32msvc-g++)
+set(CMAKE_RC_COMPILER i586-mingw32msvc-windres)
 
 # here is the target environment located
-SET(CMAKE_FIND_ROOT_PATH /usr/i586-mingw32msvc)
+set(CMAKE_FIND_ROOT_PATH /usr/i586-mingw32msvc)
 
 # adjust the default behaviour of the FIND_XXX() commands:
 # search headers and libraries in the target environment, search 
--- a/Resources/Orthanc.doxygen	Wed Sep 04 14:19:14 2013 +0200
+++ b/Resources/Orthanc.doxygen	Thu Oct 17 14:21:50 2013 +0200
@@ -37,21 +37,21 @@
 # for a project that appears at the top of each page and should give viewer
 # a quick idea about the purpose of the project. Keep the description short.
 
-PROJECT_BRIEF          =
+PROJECT_BRIEF          = "Internal documentation of Orthanc"
 
 # With the PROJECT_LOGO tag one can specify an logo or icon that is
 # included in the documentation. The maximum height of the logo should not
 # exceed 55 pixels and the maximum width should not exceed 200 pixels.
 # Doxygen will copy the logo to the output directory.
 
-PROJECT_LOGO           =
+PROJECT_LOGO           = @CMAKE_SOURCE_DIR@/Resources/OrthancLogoDocumentation.png
 
 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
 # base path where the generated documentation will be put.
 # If a relative path is entered, it will be relative to the location
 # where doxygen was started. If left blank the current directory will be used.
 
-OUTPUT_DIRECTORY       =
+OUTPUT_DIRECTORY       = OrthancInternalDocumentation
 
 # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
 # 4096 sub-directories (in 2 levels) under the output directory of each output
@@ -118,7 +118,7 @@
 # path before files name in the file list and in the header files. If set
 # to NO the shortest path that makes the file name unique will be used.
 
-FULL_PATH_NAMES        = YES
+FULL_PATH_NAMES        = NO
 
 # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
 # can be used to strip a user-defined part of the path. Stripping is
@@ -1069,7 +1069,7 @@
 # documentation. Note that a value of 0 will completely suppress the enum
 # values from appearing in the overview section.
 
-ENUM_VALUES_PER_LINE   = 4
+ENUM_VALUES_PER_LINE   = 1
 
 # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
 # structure should be generated to display hierarchical information.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Resources/OrthancClient.doxygen	Thu Oct 17 14:21:50 2013 +0200
@@ -0,0 +1,1716 @@
+# Doxyfile 1.7.4
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a hash (#) is considered a comment and will be ignored.
+# The format is:
+#       TAG = value [value, ...]
+# For lists items can also be appended using:
+#       TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the
+# iconv built into libc) for the transcoding. See
+# http://www.gnu.org/software/libiconv for the list of possible encodings.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
+# by quotes) that should identify the project.
+
+PROJECT_NAME           = "Orthanc Client"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER         = 
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer
+# a quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF          = "Documentation of the client library of Orthanc"
+
+# With the PROJECT_LOGO tag one can specify an logo or icon that is
+# included in the documentation. The maximum height of the logo should not
+# exceed 55 pixels and the maximum width should not exceed 200 pixels.
+# Doxygen will copy the logo to the output directory.
+
+PROJECT_LOGO           = @CMAKE_SOURCE_DIR@/Resources/OrthancLogoDocumentation.png
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = OrthancClientDocumentation
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
+# 4096 sub-directories (in 2 levels) under the output directory of each output
+# format and will distribute the generated files over these directories.
+# Enabling this option can be useful when feeding doxygen a huge amount of
+# source files, where putting all generated files in the same directory would
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS         = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
+# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,
+# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English
+# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian,
+# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak,
+# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF           = NO
+
+# This tag implements a quasi-intelligent brief description abbreviator
+# that is used to form the text in various listings. Each string
+# in this list, if found as the leading text of the brief description, will be
+# stripped from the text and the result after processing the whole list, is
+# used as the annotated text. Otherwise, the brief description is used as-is.
+# If left blank, the following values are used ("$name" is automatically
+# replaced with the name of the entity): "The $name class" "The $name widget"
+# "The $name file" "is" "provides" "specifies" "contains"
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF       =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES        = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user-defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the
+# path to strip.
+
+STRIP_FROM_PATH        =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
+# the path mentioned in the documentation of a class, which tells
+# the reader which header file to include in order to use a class.
+# If left blank only the name of the header file containing the class
+# definition is used. Otherwise one should specify the include paths that
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH    =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful if your file system
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like regular Qt-style comments
+# (thus requiring an explicit @brief command for a brief description.)
+
+JAVADOC_AUTOBRIEF      = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will
+# interpret the first line (until the first dot) of a Qt-style
+# comment as the brief description. If set to NO, the comments
+# will behave just like regular Qt-style comments (thus requiring
+# an explicit \brief command for a brief description.)
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///
+# comments) as a brief description. This used to be the default behaviour.
+# The new default is to treat a multi-line C++ comment block as a detailed
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# re-implements.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
+# a new page for each member. If set to NO, the documentation of a member will
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE               = 8
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user-defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES                =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
+# sources only. Doxygen will then generate output that is more tailored for C.
+# For instance, some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C  = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
+# sources only. Doxygen will then generate output that is more tailored for
+# Java. For instance, namespaces will be presented as packages, qualified
+# scopes will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources only. Doxygen will then generate output that is more tailored for
+# Fortran.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for
+# VHDL.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given extension.
+# Doxygen has a built-in mapping, but you can override or extend it using this
+# tag. The format is ext=language, where ext is a file extension, and language
+# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C,
+# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make
+# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C
+# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions
+# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen.
+
+EXTENSION_MAPPING      =
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should
+# set this tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
+# func(std::string) {}). This also makes the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT    = YES
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.
+# Doxygen will parse them like normal C++ but will assume all classes use public
+# instead of private inheritance when no explicit protection keyword is present.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate getter
+# and setter methods for a property. Setting this option to YES (the default)
+# will make doxygen replace the get and set methods by a property in the
+# documentation. This will only work if the methods are indeed getting or
+# setting a simple type. If this is not the case, or you want to show the
+# methods anyway, you should set this option to NO.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
+# the same type (for instance a group of public functions) to be put as a
+# subgroup of that type (e.g. under the Public Functions section). Set it to
+# NO to prevent subgrouping. Alternatively, this can be done per class using
+# the \nosubgrouping command.
+
+SUBGROUPING            = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and
+# unions are shown inside the group in which they are included (e.g. using
+# @ingroup) instead of on a separate page (for HTML and Man pages) or
+# section (for LaTeX and RTF).
+
+INLINE_GROUPED_CLASSES = NO
+
+# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum
+# is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically
+# be useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to
+# determine which symbols to keep in memory and which to flush to disk.
+# When the cache is full, less often used symbols will be written to disk.
+# For small to medium size projects (<1000 input files) the default value is
+# probably good enough. For larger projects a too small cache size can cause
+# doxygen to be busy swapping symbols to and from disk most of the time
+# causing a significant performance penalty.
+# If the system has enough physical memory increasing the cache will improve the
+# performance by keeping more symbols in memory. Note that the value works on
+# a logarithmic scale so increasing the size by one will roughly double the
+# memory usage. The cache size is given by this formula:
+# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,
+# corresponding to a cache size of 2^16 = 65536 symbols
+
+SYMBOL_CACHE_SIZE      = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL            = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC         = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. When set to YES local
+# methods, which are defined in the implementation section but not in
+# the interface are included in the documentation.
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base
+# name of the file that contains the anonymous namespace. By default
+# anonymous namespaces are hidden.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these classes will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS  = YES
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+# documentation blocks found inside the body of a function.
+# If set to NO (the default) these blocks will be appended to the
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES       = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen
+# will list include files with double quotes in the documentation
+# rather than with sharp brackets.
+
+FORCE_LOCAL_INCLUDES   = NO
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
+# brief documentation of file, namespace and class members alphabetically
+# by member name. If set to NO (the default) the members will appear in
+# declaration order.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen
+# will sort the (brief and detailed) documentation of class members so that
+# constructors and destructors are listed first. If set to NO (the default)
+# the constructors will appear in the respective orders defined by
+# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS.
+# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO
+# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the
+# hierarchy of group names into alphabetical order. If set to NO (the default)
+# the group names will appear in their defined order.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
+# sorted by fully-qualified names, including namespaces. If set to
+# NO (the default), the class list will be sorted only by class name,
+# not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to
+# do proper type resolution of all parameters of a function it will reject a
+# match between the prototype and the implementation of a member function even
+# if there is only one candidate or it is obvious which candidate to choose
+# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen
+# will still accept a match between prototype and implementation in such cases.
+
+STRICT_PROTO_MATCHING  = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+# disable (NO) the deprecated list. This list is created by putting
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS       =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or macro consists of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and macros in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES        = YES
+
+# If the sources in your project are distributed over multiple directories
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES       = NO
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page.
+# This will remove the Files entry from the Quick Index and from the
+# Folder Tree View (if specified). The default is YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the
+# Namespaces page.
+# This will remove the Namespaces entry from the Quick Index
+# and from the Folder Tree View (if specified). The default is YES.
+
+SHOW_NAMESPACES        = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command <command> <input-file>, where <command> is the value of
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
+# provided by doxygen. Whatever the program writes to standard output
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER    =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. The create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option.
+# You can optionally specify a file name after the option, if omitted
+# DoxygenLayout.xml will be used as the name of the layout file.
+
+LAYOUT_FILE            =
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS               = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some
+# parameters in a documented function, or documenting parameters that
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR      = YES
+
+# The WARN_NO_PARAMDOC option can be enabled to get warnings for
+# functions that are documented, but have no documentation for their parameters
+# or return value. If set to NO (the default) doxygen will only warn about
+# wrong or incomplete parameter documentation, but not about the absence of
+# documentation.
+
+WARN_NO_PARAMDOC       = YES
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text. Optionally the format may contain
+# $version, which will be replaced by the version of the file (if it could
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE           =
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT                  =  @CMAKE_SOURCE_DIR@/OrthancCppClient/SharedLibrary/AUTOGENERATED/OrthancCppClient.h
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
+# also the default input encoding. Doxygen uses libiconv (or the iconv built
+# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for
+# the list of possible encodings.
+
+INPUT_ENCODING         = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh
+# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py
+# *.f90 *.f *.for *.vhd *.vhdl
+
+FILE_PATTERNS          = *.h
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE              = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE                =
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories. Note that the wildcards are matched
+# against the file with absolute path, so to exclude all test directories
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       =
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+
+EXCLUDE_SYMBOLS        = OrthancClient::Internals
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH           =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS       =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH             =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output.
+# If FILTER_PATTERNS is specified, this tag will be
+# ignored.
+
+INPUT_FILTER           =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis.
+# Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match.
+# The filters are a list of the form:
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
+# info on how filters are used. If FILTER_PATTERNS is empty or if
+# non of the patterns match the file name, INPUT_FILTER is applied.
+
+FILTER_PATTERNS        =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES    = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any)
+# and it is also possible to disable source filtering for a specific pattern
+# using *.ext= (so without naming a filter). This option only has effect when
+# FILTER_SOURCE_FILES is enabled.
+
+FILTER_SOURCE_PATTERNS =
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+# Note: To get rid of all source code in the generated output, make sure also
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER         = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION    = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
+# link to the source code.
+# Otherwise they will link to the documentation.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code
+# will point to the HTML generated by the htags(1) tool instead of doxygen
+# built-in source browser. The htags tool is part of GNU's global source
+# tagging system (see http://www.gnu.org/software/global/global.html). You
+# will need version 4.8.6 or higher.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS       = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX     = YES
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX          =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT            = doc
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header. Note that when using a custom header you are responsible
+# for the proper inclusion of any scripts and style sheets that doxygen
+# needs, which is dependent on the configuration options used.
+# It is adviced to generate a default header using "doxygen -w html
+# header.html footer.html stylesheet.css YourConfigFile" and then modify
+# that header. Note that the header is subject to change so you typically
+# have to redo this when upgrading to a newer version of doxygen or when changing the value of configuration settings such as GENERATE_TREEVIEW!
+
+HTML_HEADER            =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER            =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet. Note that doxygen will try to copy
+# the style sheet file to the HTML output directory, so don't put your own
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET        =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that
+# the files will be copied as-is; there are no commands or markers available.
+
+HTML_EXTRA_FILES       =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output.
+# Doxygen will adjust the colors in the stylesheet and background images
+# according to this color. Hue is specified as an angle on a colorwheel,
+# see http://en.wikipedia.org/wiki/Hue for more information.
+# For instance the value 0 represents red, 60 is yellow, 120 is green,
+# 180 is cyan, 240 is blue, 300 purple, and 360 is red again.
+# The allowed range is 0 to 359.
+
+HTML_COLORSTYLE_HUE    = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of
+# the colors in the HTML output. For a value of 0 the output will use
+# grayscales only. A value of 255 will produce the most vivid colors.
+
+HTML_COLORSTYLE_SAT    = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to
+# the luminance component of the colors in the HTML output. Values below
+# 100 gradually make the output lighter, whereas values above 100 make
+# the output darker. The value divided by 100 is the actual gamma applied,
+# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2,
+# and 100 does not change the gamma.
+
+HTML_COLORSTYLE_GAMMA  = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting
+# this to NO can help when comparing the output of multiple runs.
+
+HTML_TIMESTAMP         = YES
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS     = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded. For this to work a browser that supports
+# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox
+# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files
+# will be generated that can be used as input for Apple's Xcode 3
+# integrated development environment, introduced with OSX 10.5 (Leopard).
+# To create a documentation set, doxygen will generate a Makefile in the
+# HTML output directory. Running make will produce the docset in that
+# directory and running "make install" will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find
+# it at startup.
+# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+
+GENERATE_DOCSET        = NO
+
+# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the
+# feed. A documentation feed provides an umbrella under which multiple
+# documentation sets from a single provider (such as a company or product suite)
+# can be grouped.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that
+# should uniquely identify the documentation set bundle. This should be a
+# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen
+# will append .docset to the name.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+
+# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
+
+DOCSET_PUBLISHER_NAME  = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP      = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
+# written to the html output directory.
+
+CHM_FILE               =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION           =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI           = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING
+# is used to encode HtmlHelp index (hhk), content (hhc) and project file
+# content.
+
+CHM_INDEX_ENCODING     =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND             = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated
+# that can be used as input for Qt's qhelpgenerator to generate a
+# Qt Compressed Help (.qch) of the generated HTML documentation.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can
+# be used to specify the file name of the resulting .qch file.
+# The path specified is relative to the HTML output folder.
+
+QCH_FILE               =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#namespace
+
+QHP_NAMESPACE          = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#virtual-folders
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to
+# add. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#custom-filters
+
+QHP_CUST_FILTER_NAME   =
+
+# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see
+# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">
+# Qt Help Project / Custom Filters</a>.
+
+QHP_CUST_FILTER_ATTRS  =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's
+# filter section matches.
+# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes">
+# Qt Help Project / Filter Attributes</a>.
+
+QHP_SECT_FILTER_ATTRS  =
+
+# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can
+# be used to specify the location of Qt's qhelpgenerator.
+# If non-empty doxygen will try to run qhelpgenerator on the generated
+# .qhp file.
+
+QHG_LOCATION           =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files
+#  will be generated, which together with the HTML files, form an Eclipse help
+# plugin. To install this plugin and make it available under the help contents
+# menu in Eclipse, the contents of the directory containing the HTML and XML
+# files needs to be copied into the plugins directory of eclipse. The name of
+# the directory within the plugins directory should be the same as
+# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before
+# the help appears.
+
+GENERATE_ECLIPSEHELP   = NO
+
+# A unique identifier for the eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have
+# this name.
+
+ECLIPSE_DOC_ID         = org.doxygen.Project
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it.
+
+DISABLE_INDEX          = NO
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values
+# (range [0,1..20]) that doxygen will group on one line in the generated HTML
+# documentation. Note that a value of 0 will completely suppress the enum
+# values from appearing in the overview section.
+
+ENUM_VALUES_PER_LINE   = 1
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information.
+# If the tag value is set to YES, a side panel will be generated
+# containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).
+# Windows users are probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW      = NO
+
+# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories,
+# and Class Hierarchy pages using a tree view instead of an ordered list.
+
+USE_INLINE_TREES       = NO
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH         = 250
+
+# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open
+# links to external symbols imported via tag files in a separate window.
+
+EXT_LINKS_IN_WINDOW    = NO
+
+# Use this tag to change the font size of Latex formulas included
+# as images in the HTML documentation. The default is 10. Note that
+# when you change the font size after a successful doxygen run you need
+# to manually remove any form_*.png images from the HTML output directory
+# to force them to be regenerated.
+
+FORMULA_FONTSIZE       = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are
+# not supported properly for IE 6.0, but are supported on all modern browsers.
+# Note that when changing this option you need to delete any form_*.png files
+# in the HTML output before the changes have effect.
+
+FORMULA_TRANSPARENT    = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax
+# (see http://www.mathjax.org) which uses client side Javascript for the
+# rendering instead of using prerendered bitmaps. Use this if you do not
+# have LaTeX installed or if you want to formulas look prettier in the HTML
+# output. When enabled you also need to install MathJax separately and
+# configure the path to it using the MATHJAX_RELPATH option.
+
+USE_MATHJAX            = NO
+
+# When MathJax is enabled you need to specify the location relative to the
+# HTML output directory using the MATHJAX_RELPATH option. The destination
+# directory should contain the MathJax.js script. For instance, if the mathjax
+# directory is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the
+# mathjax.org site, so you can quickly see the result without installing
+# MathJax, but it is strongly recommended to install a local copy of MathJax
+# before deployment.
+
+MATHJAX_RELPATH        = http://www.mathjax.org/mathjax
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box
+# for the HTML output. The underlying search engine uses javascript
+# and DHTML and should work on any modern browser. Note that when using
+# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets
+# (GENERATE_DOCSET) there is already a search function so this one should
+# typically be disabled. For large projects the javascript based search engine
+# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.
+
+SEARCHENGINE           = YES
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a PHP enabled web server instead of at the web client
+# using Javascript. Doxygen will generate the search PHP script and index
+# file to put on the web server. The advantage of the server
+# based approach is that it scales better to large projects and allows
+# full text search. The disadvantages are that it is more difficult to setup
+# and does not have live searching capabilities.
+
+SERVER_BASED_SEARCH    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked. If left blank `latex' will be used as the default command name.
+# Note that when enabling USE_PDFLATEX this option is only used for
+# generating bitmaps for formulas in the HTML output, but not in the
+# Makefile that is written to the output directory.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE             = a4
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES         =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER           =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for
+# the generated latex document. The footer should contain everything after
+# the last chapter. If it is left blank doxygen will generate a
+# standard footer. Notice: only use this tag if you know what you are doing!
+
+LATEX_FOOTER           =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE        = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
+# in the output.
+
+LATEX_HIDE_INDICES     = NO
+
+# If LATEX_SOURCE_CODE is set to YES then doxygen will include
+# source code with syntax highlighting in the LaTeX output.
+# Note that which sources are shown also depends on other settings
+# such as SOURCE_BROWSER.
+
+LATEX_SOURCE_CODE      = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimized for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE    =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE    =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION          = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT             = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_SCHEMA             =
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_DTD                =
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+# dump the program listings (including syntax highlighting
+# and cross-referencing information) to the XML output. Note that
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader.
+# This is useful
+# if you want to understand what is going on.
+# On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION        = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF     = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# pointed to by INCLUDE_PATH will be searched when a #include is found.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH           =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS  =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed. To prevent a macro definition from being
+# undefined via #undef or recursively expanded use the := operator
+# instead of the = operator.
+
+PREDEFINED             =
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition that
+# overrules the definition found in the source code.
+
+EXPAND_AS_DEFINED      =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all references to function-like macros
+# that are alone on a line, have an all uppercase name, and do not end with a
+# semicolon, because these will confuse the parser if not removed.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles.
+# Optionally an initial location of the external documentation
+# can be added for each tagfile. The format of a tag file without
+# this location is as follows:
+#
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+#
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where "loc1" and "loc2" can be relative or absolute paths or
+# URLs. If a location is present for each tag, the installdox tool
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES               =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE       =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
+# be listed.
+
+EXTERNAL_GROUPS        = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
+# or super classes. Setting the tag to NO turns the diagrams off. Note that
+# this option also works with HAVE_DOT disabled, but it is recommended to
+# install and use dot, since it yields more powerful graphs.
+
+CLASS_DIAGRAMS         = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see
+# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH            =
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT               = NO
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is
+# allowed to run in parallel. When set to 0 (the default) doxygen will
+# base this on the number of processors available in the system. You can set it
+# explicitly to a value larger than 0 to get control over the balance
+# between CPU load and processing speed.
+
+DOT_NUM_THREADS        = 0
+
+# By default doxygen will write a font called Helvetica to the output
+# directory and reference it in all dot files that doxygen generates.
+# When you want a differently looking font you can specify the font name
+# using DOT_FONTNAME. You need to make sure dot is able to find the font,
+# which can be done by putting it in a standard location or by setting the
+# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory
+# containing the font.
+
+DOT_FONTNAME           = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.
+# The default size is 10pt.
+
+DOT_FONTSIZE           = 10
+
+# By default doxygen will tell dot to use the output directory to look for the
+# FreeSans.ttf font (which doxygen will put there itself). If you specify a
+# different font using DOT_FONTNAME you can set the path where dot
+# can find it using this tag.
+
+DOT_FONTPATH           =
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+
+UML_LOOK               = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH          = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH and HAVE_DOT options are set to YES then
+# doxygen will generate a call dependency graph for every global function
+# or class method. Note that enabling this option will significantly increase
+# the time of a run. So in most cases it will be better to enable call graphs
+# for selected functions only using the \callgraph command.
+
+CALL_GRAPH             = NO
+
+# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then
+# doxygen will generate a caller dependency graph for every global function
+# or class method. Note that enabling this option will significantly increase
+# the time of a run. So in most cases it will be better to enable caller
+# graphs for selected functions only using the \callergraph command.
+
+CALLER_GRAPH           = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will generate a graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
+# then doxygen will show the dependencies a directory has on other directories
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH        = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. Possible values are svg, png, jpg, or gif.
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT       = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH               =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS           =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the
+# \mscfile command).
+
+MSCFILE_DIRS           =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of
+# nodes that will be shown in the graph. If the number of nodes in a graph
+# becomes larger than this value, doxygen will truncate the graph, which is
+# visualized by representing a node as a red box. Note that doxygen if the
+# number of direct children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note
+# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+
+DOT_GRAPH_MAX_NODES    = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+# graphs generated by dot. A depth value of 3 means that only nodes reachable
+# from the root by following a path via at most 3 edges will be shown. Nodes
+# that lay further from the root node will be omitted. Note that setting this
+# option to 1 or 2 may greatly reduce the computation time needed for large
+# code bases. Also note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not
+# seem to support this out of the box. Warning: Depending on the platform used,
+# enabling this option may lead to badly anti-aliased labels on the edges of
+# a graph (i.e. they become hard to read).
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10)
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS      = YES
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
+# the various graphs.
+
+DOT_CLEANUP            = YES
Binary file Resources/OrthancLogo.png has changed
Binary file Resources/OrthancLogoDocumentation.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Resources/Patches/glog-utilities-lsb.diff	Thu Oct 17 14:21:50 2013 +0200
@@ -0,0 +1,52 @@
+--- utilities.cc.orig	2012-01-12 09:40:21.000000000 +0100
++++ utilities.cc	2013-09-23 17:37:35.033275313 +0200
+@@ -233,40 +233,7 @@
+ }
+ 
+ pid_t GetTID() {
+-  // On Linux and FreeBSD, we try to use gettid().
+-#if defined OS_LINUX || defined OS_FREEBSD || defined OS_MACOSX
+-#ifndef __NR_gettid
+-#ifdef OS_MACOSX
+-#define __NR_gettid SYS_gettid
+-#elif ! defined __i386__
+-#error "Must define __NR_gettid for non-x86 platforms"
+-#else
+-#define __NR_gettid 224
+-#endif
+-#endif
+-  static bool lacks_gettid = false;
+-  if (!lacks_gettid) {
+-    pid_t tid = syscall(__NR_gettid);
+-    if (tid != -1) {
+-      return tid;
+-    }
+-    // Technically, this variable has to be volatile, but there is a small
+-    // performance penalty in accessing volatile variables and there should
+-    // not be any serious adverse effect if a thread does not immediately see
+-    // the value change to "true".
+-    lacks_gettid = true;
+-  }
+-#endif  // OS_LINUX || OS_FREEBSD
+-
+-  // If gettid() could not be used, we use one of the following.
+-#if defined OS_LINUX
+-  return getpid();  // Linux:  getpid returns thread ID when gettid is absent
+-#elif defined OS_WINDOWS || defined OS_CYGWIN
+-  return GetCurrentThreadId();
+-#else
+-  // If none of the techniques above worked, we use pthread_self().
+   return (pid_t)(uintptr_t)pthread_self();
+-#endif
+ }
+ 
+ const char* const_basename(const char* filepath) {
+@@ -295,7 +262,7 @@
+     g_my_user_name = "invalid-user";
+   }
+ }
+-REGISTER_MODULE_INITIALIZER(utilities, MyUserNameInitializer());
++REGISTER_MODULE_INITIALIZER(utilities, MyUserNameInitializer())
+ 
+ #ifdef HAVE_STACKTRACE
+ void DumpStackTraceToString(string* stacktrace) {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Resources/Patches/openssl-lsb.diff	Thu Oct 17 14:21:50 2013 +0200
@@ -0,0 +1,118 @@
+--- ui_openssl.c.orig	2013-09-24 15:06:54.264420779 +0200
++++ ui_openssl.c	2013-09-24 14:22:43.512312998 +0200
+@@ -291,7 +291,7 @@
+ static unsigned short channel = 0;
+ #else
+ #if !defined(OPENSSL_SYS_MSDOS) || defined(__DJGPP__)
+-static TTY_STRUCT tty_orig,tty_new;
++//static TTY_STRUCT tty_orig,tty_new;
+ #endif
+ #endif
+ static FILE *tty_in, *tty_out;
+@@ -475,106 +475,21 @@
+ /* Internal functions to open, handle and close a channel to the console.  */
+ static int open_console(UI *ui)
+ 	{
+-	CRYPTO_w_lock(CRYPTO_LOCK_UI);
+-	is_a_tty = 1;
+-
+-#if defined(OPENSSL_SYS_MACINTOSH_CLASSIC) || defined(OPENSSL_SYS_VXWORKS) || defined(OPENSSL_SYS_NETWARE) || defined(OPENSSL_SYS_BEOS)
+-	tty_in=stdin;
+-	tty_out=stderr;
+-#else
+-#  ifdef OPENSSL_SYS_MSDOS
+-#    define DEV_TTY "con"
+-#  else
+-#    define DEV_TTY "/dev/tty"
+-#  endif
+-	if ((tty_in=fopen(DEV_TTY,"r")) == NULL)
+-		tty_in=stdin;
+-	if ((tty_out=fopen(DEV_TTY,"w")) == NULL)
+-		tty_out=stderr;
+-#endif
+-
+-#if defined(TTY_get) && !defined(OPENSSL_SYS_VMS)
+- 	if (TTY_get(fileno(tty_in),&tty_orig) == -1)
+-		{
+-#ifdef ENOTTY
+-		if (errno == ENOTTY)
+-			is_a_tty=0;
+-		else
+-#endif
+-#ifdef EINVAL
+-		/* Ariel Glenn ariel@columbia.edu reports that solaris
+-		 * can return EINVAL instead.  This should be ok */
+-		if (errno == EINVAL)
+-			is_a_tty=0;
+-		else
+-#endif
+-			return 0;
+-		}
+-#endif
+-#ifdef OPENSSL_SYS_VMS
+-	status = sys$assign(&terminal,&channel,0,0);
+-	if (status != SS$_NORMAL)
+-		return 0;
+-	status=sys$qiow(0,channel,IO$_SENSEMODE,&iosb,0,0,tty_orig,12,0,0,0,0);
+-	if ((status != SS$_NORMAL) || (iosb.iosb$w_value != SS$_NORMAL))
+-		return 0;
+-#endif
+ 	return 1;
+ 	}
+ 
+ static int noecho_console(UI *ui)
+ 	{
+-#ifdef TTY_FLAGS
+-	memcpy(&(tty_new),&(tty_orig),sizeof(tty_orig));
+-	tty_new.TTY_FLAGS &= ~ECHO;
+-#endif
+-
+-#if defined(TTY_set) && !defined(OPENSSL_SYS_VMS)
+-	if (is_a_tty && (TTY_set(fileno(tty_in),&tty_new) == -1))
+-		return 0;
+-#endif
+-#ifdef OPENSSL_SYS_VMS
+-	tty_new[0] = tty_orig[0];
+-	tty_new[1] = tty_orig[1] | TT$M_NOECHO;
+-	tty_new[2] = tty_orig[2];
+-	status = sys$qiow(0,channel,IO$_SETMODE,&iosb,0,0,tty_new,12,0,0,0,0);
+-	if ((status != SS$_NORMAL) || (iosb.iosb$w_value != SS$_NORMAL))
+-		return 0;
+-#endif
+ 	return 1;
+ 	}
+ 
+ static int echo_console(UI *ui)
+ 	{
+-#if defined(TTY_set) && !defined(OPENSSL_SYS_VMS)
+-	memcpy(&(tty_new),&(tty_orig),sizeof(tty_orig));
+-	tty_new.TTY_FLAGS |= ECHO;
+-#endif
+-
+-#if defined(TTY_set) && !defined(OPENSSL_SYS_VMS)
+-	if (is_a_tty && (TTY_set(fileno(tty_in),&tty_new) == -1))
+-		return 0;
+-#endif
+-#ifdef OPENSSL_SYS_VMS
+-	tty_new[0] = tty_orig[0];
+-	tty_new[1] = tty_orig[1] & ~TT$M_NOECHO;
+-	tty_new[2] = tty_orig[2];
+-	status = sys$qiow(0,channel,IO$_SETMODE,&iosb,0,0,tty_new,12,0,0,0,0);
+-	if ((status != SS$_NORMAL) || (iosb.iosb$w_value != SS$_NORMAL))
+-		return 0;
+-#endif
+ 	return 1;
+ 	}
+ 
+ static int close_console(UI *ui)
+ 	{
+-	if (tty_in != stdin) fclose(tty_in);
+-	if (tty_out != stderr) fclose(tty_out);
+-#ifdef OPENSSL_SYS_VMS
+-	status = sys$dassgn(channel);
+-#endif
+-	CRYPTO_w_unlock(CRYPTO_LOCK_UI);
+-
+ 	return 1;
+ 	}
+ 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Resources/Samples/OrthancClient/Basic/CMakeLists.txt	Thu Oct 17 14:21:50 2013 +0200
@@ -0,0 +1,11 @@
+cmake_minimum_required(VERSION 2.8)
+
+project(Basic)
+
+add_executable(Test main.cpp)
+
+if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
+  # Linking with "pthread" is necessary, otherwise the software crashes
+  # http://sourceware.org/bugzilla/show_bug.cgi?id=10652#c17
+  target_link_libraries(Test pthread dl)
+endif()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Resources/Samples/OrthancClient/Basic/main.cpp	Thu Oct 17 14:21:50 2013 +0200
@@ -0,0 +1,74 @@
+/**
+ * Orthanc - A Lightweight, RESTful DICOM Store
+ * Copyright (C) 2012-2013 Medical Physics Department, CHU of Liege,
+ * Belgium
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy,
+ * modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ **/
+
+
+#include <iostream>
+#include <orthanc/OrthancCppClient.h>
+
+int main()
+{
+  try
+  {
+    // The following explicit initialization is not required, except
+    // if you wish to specify the full path to the shared library
+    OrthancClient::Initialize();
+
+    // Display the content of the local Orthanc instance
+    OrthancClient::OrthancConnection orthanc("http://localhost:8042");
+
+    for (unsigned int i = 0; i < orthanc.GetPatientCount(); i++)
+    {
+      OrthancClient::Patient patient(orthanc.GetPatient(i));
+      std::cout << "Patient: " << patient.GetId() << std::endl;
+
+      for (unsigned int j = 0; j < patient.GetStudyCount(); j++)
+      {
+        OrthancClient::Study study(patient.GetStudy(j));
+        std::cout << "  Study: " << study.GetId() << std::endl;
+
+        for (unsigned int k = 0; k < study.GetSeriesCount(); k++)
+        {
+          OrthancClient::Series series(study.GetSeries(k));
+          std::cout << "    Series: " << series.GetId() << std::endl;
+
+          for (unsigned int l = 0; l < series.GetInstanceCount(); l++)
+          {
+            std::cout << "      Instance: " << series.GetInstance(l).GetId() << std::endl;
+          }
+        }
+      }
+    }
+
+    OrthancClient::Finalize();
+
+    return 0;
+  }
+  catch (OrthancClient::OrthancClientException e)
+  {
+    std::cerr << "EXCEPTION: [" << e.What() << "]" << std::endl;
+    return -1;
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Resources/Samples/OrthancClient/Vtk/CMakeLists.txt	Thu Oct 17 14:21:50 2013 +0200
@@ -0,0 +1,20 @@
+cmake_minimum_required(VERSION 2.8)
+
+project(Vtk)
+
+find_package(VTK REQUIRED)
+include(${VTK_USE_FILE})
+
+add_executable(Test
+  main.cpp
+  )
+
+# Linking with "pthread" is necessary, otherwise the software crashes
+# http://sourceware.org/bugzilla/show_bug.cgi?id=10652#c17
+target_link_libraries(Test pthread dl)
+
+if(VTK_LIBRARIES)
+  target_link_libraries(Test ${VTK_LIBRARIES})
+else()
+  target_link_libraries(Test vtkHybrid vtkVolumeRendering)
+endif()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Resources/Samples/OrthancClient/Vtk/main.cpp	Thu Oct 17 14:21:50 2013 +0200
@@ -0,0 +1,181 @@
+/**
+ * Orthanc - A Lightweight, RESTful DICOM Store
+ * Copyright (C) 2012-2013 Medical Physics Department, CHU of Liege,
+ * Belgium
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy,
+ * modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ **/
+
+
+#include <iostream>
+
+#include <vtkRenderWindow.h>
+#include <vtkImageData.h>
+#include <vtkPiecewiseFunction.h>
+#include <vtkFixedPointVolumeRayCastMapper.h>
+#include <vtkColorTransferFunction.h>
+#include <vtkVolumeProperty.h>
+#include <vtkRenderWindowInteractor.h>
+#include <vtkRenderer.h>
+#include <vtkSmartPointer.h>
+#include <vtkOpenGLRenderer.h>
+#include <vtkInteractorStyleTrackballCamera.h>
+
+#include <orthanc/OrthancCppClient.h>
+
+
+void Display(OrthancClient::Series& series)
+{
+  /**
+   * Load the 3D image from Orthanc into VTK.
+   **/
+
+  vtkSmartPointer<vtkImageData> image = vtkSmartPointer<vtkImageData>::New();
+  image->SetDimensions(series.GetWidth(), series.GetHeight(), series.GetInstanceCount());
+  image->SetScalarType(VTK_SHORT);
+  image->AllocateScalars();
+
+  if (series.GetWidth() != 0 &&
+      series.GetHeight() != 0 && 
+      series.GetInstanceCount() != 0)
+  {
+    series.Load3DImage(image->GetScalarPointer(0, 0, 0), Orthanc::PixelFormat_SignedGrayscale16,
+                       2 * series.GetWidth(), 2 * series.GetHeight() * series.GetWidth());
+  }
+
+  image->SetSpacing(series.GetVoxelSizeX(), 
+                    series.GetVoxelSizeY(), 
+                    series.GetVoxelSizeZ());
+
+
+  /**
+   * The following code is based on the VTK sample for MIP
+   * http://www.vtk.org/Wiki/VTK/Examples/Cxx/VolumeRendering/MinIntensityRendering
+   **/
+
+  // Create a transfer function mapping scalar value to opacity
+  double range[2];
+  image->GetScalarRange(range);
+
+  vtkSmartPointer<vtkPiecewiseFunction> opacityTransfer = 
+    vtkSmartPointer<vtkPiecewiseFunction>::New();
+  opacityTransfer->AddSegment(range[0], 0.0, range[1], 1.0);
+ 
+  vtkSmartPointer<vtkColorTransferFunction> colorTransfer = 
+    vtkSmartPointer<vtkColorTransferFunction>::New();
+  colorTransfer->AddRGBPoint(0, 1.0, 1.0, 1.0);
+  colorTransfer->AddRGBPoint(range[1], 1.0, 1.0, 1.0);
+ 
+  vtkSmartPointer<vtkVolumeProperty> property = 
+    vtkSmartPointer<vtkVolumeProperty>::New();
+  property->SetScalarOpacity(opacityTransfer);
+  property->SetColor(colorTransfer);
+  property->SetInterpolationTypeToLinear();
+
+  // Create a Maximum Intensity Projection rendering
+  vtkSmartPointer<vtkFixedPointVolumeRayCastMapper> mapper = 
+    vtkSmartPointer<vtkFixedPointVolumeRayCastMapper>::New();
+  mapper->SetBlendModeToMaximumIntensity();
+  mapper->SetInput(image);
+
+  vtkSmartPointer<vtkVolume> volume = vtkSmartPointer<vtkVolume>::New();
+  volume->SetMapper(mapper);
+  volume->SetProperty(property);
+  
+  vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkOpenGLRenderer>::New();
+  renderer->AddViewProp(volume);
+  renderer->SetBackground(0.1, 0.2, 0.3); // Background color dark blue
+
+  vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = 
+    vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
+ 
+  vtkSmartPointer<vtkRenderWindow> window = vtkSmartPointer<vtkRenderWindow>::New();
+  window->AddRenderer(renderer); 
+
+  vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
+  interactor->SetRenderWindow(window);
+  interactor->SetInteractorStyle(style);
+  interactor->Start();
+}
+
+
+int main()
+{
+  try
+  {
+    // The following explicit initialization is not required, except
+    // if you wish to specify the full path to the shared library
+    OrthancClient::Initialize();
+
+    // Use the commented code below if you know the identifier of a
+    // series that corresponds to a 3D image.
+
+    /*
+      {
+      OrthancClient::OrthancConnection orthanc("http://localhost:8042");
+      OrthancClient::Series series(orthanc, "dc5ec3d9-6e1a7b2c-73a829f0-64c609f6-ef976a97");
+      Display(series);
+      return 0;
+      }
+    */
+
+
+    // Try and find a 3D image inside the local store
+    OrthancClient::OrthancConnection orthanc("http://localhost:8042");
+
+    for (unsigned int i = 0; i < orthanc.GetPatientCount(); i++)
+    {
+      OrthancClient::Patient patient(orthanc.GetPatient(i));
+      std::cout << "Patient: " << patient.GetId() << std::endl;
+
+      for (unsigned int j = 0; j < patient.GetStudyCount(); j++)
+      {
+        OrthancClient::Study study(patient.GetStudy(j));
+        std::cout << "  Study: " << study.GetId() << std::endl;
+
+        for (unsigned int k = 0; k < study.GetSeriesCount(); k++)
+        {
+          OrthancClient::Series series(study.GetSeries(k));
+          std::cout << "    Series: " << series.GetId() << std::endl;
+
+          if (series.Is3DImage())
+          {
+            Display(series);
+            return 0;
+          }
+          else
+          {
+            std::cout << "      => Not a 3D image..." << std::endl;
+          }
+        }
+      }
+    }
+
+    std::cout << "Unable to find a 3D image in the local Orthanc store" << std::endl;
+
+    return 0;
+  }
+  catch (OrthancClient::OrthancClientException e)
+  {
+    std::cerr << "EXCEPTION: [" << e.What() << "]" << std::endl;
+    return -1;
+  }
+}
--- a/Resources/Samples/OrthancCppClient/Basic/CMakeLists.txt	Wed Sep 04 14:19:14 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-# Mini-project to check whether "OrthancCppClient" can compile in a
-# standalone fashion
-
-cmake_minimum_required(VERSION 2.8)
-
-project(OrthancCppClientTest)
-
-set(STATIC_BUILD OFF)
-set(ORTHANC_ROOT ${CMAKE_SOURCE_DIR}/../../../..)
-
-include(../OrthancCppClient.cmake)
-
-add_executable(Test
-  main.cpp
-  ${ORTHANC_CPP_CLIENT_SOURCES}
-  )
--- a/Resources/Samples/OrthancCppClient/Basic/main.cpp	Wed Sep 04 14:19:14 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,73 +0,0 @@
-/**
- * Orthanc - A Lightweight, RESTful DICOM Store
- * Copyright (C) 2012-2013 Medical Physics Department, CHU of Liege,
- * Belgium
- *
- * Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation
- * files (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy,
- * modify, merge, publish, distribute, sublicense, and/or sell copies
- * of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- **/
-
-
-#include <iostream>
-
-#include "../../../../Core/HttpClient.h"
-#include "../../../../OrthancCppClient/OrthancConnection.h"
-
-int main()
-{
-  // Prepare a simple call to a Web service
-  Orthanc::HttpClient c;
-  c.SetUrl("http://nominatim.openstreetmap.org/search?format=json&q=chu+liege+belgium");
-  
-  // Do the request and store the result in a JSON structure
-  Json::Value result;
-  c.Apply(result);
-
-  // Display the JSON answer
-  std::cout << result << std::endl;
-
-  // Display the content of the local Orthanc instance
-  OrthancClient::OrthancConnection orthanc("http://localhost:8042");
-
-  for (unsigned int i = 0; i < orthanc.GetPatientCount(); i++)
-  {
-    OrthancClient::Patient& patient = orthanc.GetPatient(i);
-    std::cout << "Patient: " << patient.GetId() << std::endl;
-
-    for (unsigned int j = 0; j < patient.GetStudyCount(); j++)
-    {
-      OrthancClient::Study& study = patient.GetStudy(j);
-      std::cout << "  Study: " << study.GetId() << std::endl;
-
-      for (unsigned int k = 0; k < study.GetSeriesCount(); k++)
-      {
-        OrthancClient::Series& series = study.GetSeries(k);
-        std::cout << "    Series: " << series.GetId() << std::endl;
-
-        for (unsigned int l = 0; l < series.GetInstanceCount(); l++)
-        {
-          std::cout << "      Instance: " << series.GetInstance(l).GetId() << std::endl;
-        }
-      }
-    }
-  }
-
-  return 0;
-}
--- a/Resources/Samples/OrthancCppClient/OrthancCppClient.cmake	Wed Sep 04 14:19:14 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-include(${ORTHANC_ROOT}/Resources/CMake/DownloadPackage.cmake)
-include(${ORTHANC_ROOT}/Resources/CMake/JsonCppConfiguration.cmake)
-include(${ORTHANC_ROOT}/Resources/CMake/LibCurlConfiguration.cmake)
-include(${ORTHANC_ROOT}/Resources/CMake/LibPngConfiguration.cmake)
-include(${ORTHANC_ROOT}/Resources/CMake/BoostConfiguration.cmake)
-
-if (${CMAKE_COMPILER_IS_GNUCXX})
-  set(CMAKE_C_FLAGS "-Wall -pedantic -Wno-implicit-function-declaration")  # --std=c99 makes libcurl not to compile
-  set(CMAKE_CXX_FLAGS "-Wall -pedantic -Wno-long-long -Wno-variadic-macros")
-  set(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed")
-  set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--no-undefined")
-elseif (${MSVC})
-  add_definitions(-D_CRT_SECURE_NO_WARNINGS=1)  
-endif()
-
-set(ORTHANC_CPP_CLIENT_SOURCES
-  ${THIRD_PARTY_SOURCES}
-  ${ORTHANC_ROOT}/Core/OrthancException.cpp
-  ${ORTHANC_ROOT}/Core/Enumerations.cpp
-  ${ORTHANC_ROOT}/Core/Toolbox.cpp
-  ${ORTHANC_ROOT}/Core/HttpClient.cpp
-  ${ORTHANC_ROOT}/Core/MultiThreading/ArrayFilledByThreads.cpp
-  ${ORTHANC_ROOT}/Core/MultiThreading/ThreadedCommandProcessor.cpp
-  ${ORTHANC_ROOT}/Core/MultiThreading/SharedMessageQueue.cpp
-  ${ORTHANC_ROOT}/Core/FileFormats/PngReader.cpp
-  ${ORTHANC_ROOT}/OrthancCppClient/OrthancConnection.cpp
-  ${ORTHANC_ROOT}/OrthancCppClient/Series.cpp
-  ${ORTHANC_ROOT}/OrthancCppClient/Study.cpp
-  ${ORTHANC_ROOT}/OrthancCppClient/Instance.cpp
-  ${ORTHANC_ROOT}/OrthancCppClient/Patient.cpp
-  ${ORTHANC_ROOT}/Resources/sha1/sha1.cpp
-  ${ORTHANC_ROOT}/Resources/md5/md5.c
-  ${ORTHANC_ROOT}/Resources/base64/base64.cpp
-  )
--- a/Resources/Samples/OrthancCppClient/Vtk/CMakeLists.txt	Wed Sep 04 14:19:14 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,23 +0,0 @@
-cmake_minimum_required(VERSION 2.8)
-
-project(OrthancCppClientTest)
-
-set(STATIC_BUILD OFF)
-set(ORTHANC_ROOT ${CMAKE_SOURCE_DIR}/../../../..)
-
-include(../OrthancCppClient.cmake)
-
-find_package(VTK REQUIRED)
-include(${VTK_USE_FILE})
-
-add_executable(Test
-  main.cpp
-  ${ORTHANC_CPP_CLIENT_SOURCES}
-  )
-
-if(VTK_LIBRARIES)
-  target_link_libraries(Test ${VTK_LIBRARIES})
-else()
-  target_link_libraries(Test vtkHybrid vtkVolumeRendering)
-endif()
-
--- a/Resources/Samples/OrthancCppClient/Vtk/main.cpp	Wed Sep 04 14:19:14 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,196 +0,0 @@
-/**
- * Orthanc - A Lightweight, RESTful DICOM Store
- * Copyright (C) 2012-2013 Medical Physics Department, CHU of Liege,
- * Belgium
- *
- * Permission is hereby granted, free of charge, to any person
- * obtaining a copy of this software and associated documentation
- * files (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy,
- * modify, merge, publish, distribute, sublicense, and/or sell copies
- * of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- **/
-
-
-#include <iostream>
-
-#include <vtkRenderWindow.h>
-#include <vtkImageData.h>
-#include <vtkPiecewiseFunction.h>
-#include <vtkFixedPointVolumeRayCastMapper.h>
-#include <vtkColorTransferFunction.h>
-#include <vtkVolumeProperty.h>
-#include <vtkRenderWindowInteractor.h>
-#include <vtkRenderer.h>
-#include <vtkSmartPointer.h>
-#include <vtkOpenGLRenderer.h>
-#include <vtkInteractorStyleTrackballCamera.h>
-
-#include "../../../../OrthancCppClient/OrthancConnection.h"
-
-
-class DisplayProgress : public Orthanc::ThreadedCommandProcessor::IListener
-{
-public:
-  virtual void SignalProgress(unsigned int current,
-                              unsigned int total)
-  {
-    std::cout << "Slice loaded (" << current << "/" << total << ")" << std::endl;
-  }
-
-  virtual void SignalSuccess(unsigned int total)
-  {
-    std::cout << "Success loading image (" << total << " images)" << std::endl;
-  }
-
-  virtual void SignalCancel()
-  {
-  }
-
-  virtual void SignalFailure()
-  {
-    std::cout << "Error loading image" << std::endl;
-  }
-};
-
-
-
-void Display(OrthancClient::Series& series)
-{
-  /**
-   * Load the 3D image from Orthanc into VTK.
-   **/
-
-  vtkSmartPointer<vtkImageData> image = vtkSmartPointer<vtkImageData>::New();
-  image->SetDimensions(series.GetWidth(), series.GetHeight(), series.GetInstanceCount());
-  image->SetScalarType(VTK_SHORT);
-  image->AllocateScalars();
-
-  if (series.GetWidth() != 0 &&
-      series.GetHeight() != 0 && 
-      series.GetInstanceCount() != 0)
-  {
-    DisplayProgress listener;
-    series.Load3DImage(image->GetScalarPointer(0, 0, 0), Orthanc::PixelFormat_SignedGrayscale16,
-                       2 * series.GetWidth(), 2 * series.GetHeight() * series.GetWidth(), listener);
-  }
-
-  float sx, sy, sz;
-  series.GetVoxelSize(sx, sy, sz);
-  image->SetSpacing(sx, sy, sz);
-
-
-  /**
-   * The following code is based on the VTK sample for MIP
-   * http://www.vtk.org/Wiki/VTK/Examples/Cxx/VolumeRendering/MinIntensityRendering
-   **/
-
-  // Create a transfer function mapping scalar value to opacity
-  double range[2];
-  image->GetScalarRange(range);
-
-  vtkSmartPointer<vtkPiecewiseFunction> opacityTransfer = 
-    vtkSmartPointer<vtkPiecewiseFunction>::New();
-  opacityTransfer->AddSegment(range[0], 0.0, range[1], 1.0);
- 
-  vtkSmartPointer<vtkColorTransferFunction> colorTransfer = 
-    vtkSmartPointer<vtkColorTransferFunction>::New();
-  colorTransfer->AddRGBPoint(0, 1.0, 1.0, 1.0);
-  colorTransfer->AddRGBPoint(range[1], 1.0, 1.0, 1.0);
- 
-  vtkSmartPointer<vtkVolumeProperty> property = 
-    vtkSmartPointer<vtkVolumeProperty>::New();
-  property->SetScalarOpacity(opacityTransfer);
-  property->SetColor(colorTransfer);
-  property->SetInterpolationTypeToLinear();
-
-  // Create a Maximum Intensity Projection rendering
-  vtkSmartPointer<vtkFixedPointVolumeRayCastMapper> mapper = 
-    vtkSmartPointer<vtkFixedPointVolumeRayCastMapper>::New();
-  mapper->SetBlendModeToMaximumIntensity();
-  mapper->SetInput(image);
-
-  vtkSmartPointer<vtkVolume> volume = vtkSmartPointer<vtkVolume>::New();
-  volume->SetMapper(mapper);
-  volume->SetProperty(property);
-  
-  vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkOpenGLRenderer>::New();
-  renderer->AddViewProp(volume);
-  renderer->SetBackground(0.1, 0.2, 0.3); // Background color dark blue
-
-  vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = 
-    vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
- 
-  vtkSmartPointer<vtkRenderWindow> window = vtkSmartPointer<vtkRenderWindow>::New();
-  window->AddRenderer(renderer); 
-
-  vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
-  interactor->SetRenderWindow(window);
-  interactor->SetInteractorStyle(style);
-  interactor->Start();
-}
-
-
-int main()
-{
-  // Use the commented code below if you know the identifier of a
-  // series that corresponds to a 3D image.
-
-  /*
-     {
-     OrthancClient::OrthancConnection orthanc("http://localhost:8042");
-     OrthancClient::Series series(orthanc, "c1c4cb95-05e3bd11-8da9f5bb-87278f71-0b2b43f5");
-     Display(series);
-     return 0;
-     }
-  */
-
-
-  // Try and find a 3D image inside the local store
-  OrthancClient::OrthancConnection orthanc("http://localhost:8042");
-
-  for (unsigned int i = 0; i < orthanc.GetPatientCount(); i++)
-  {
-    OrthancClient::Patient& patient = orthanc.GetPatient(i);
-    std::cout << "Patient: " << patient.GetId() << std::endl;
-
-    for (unsigned int j = 0; j < patient.GetStudyCount(); j++)
-    {
-      OrthancClient::Study& study = patient.GetStudy(j);
-      std::cout << "  Study: " << study.GetId() << std::endl;
-
-      for (unsigned int k = 0; k < study.GetSeriesCount(); k++)
-      {
-        OrthancClient::Series& series = study.GetSeries(k);
-        std::cout << "    Series: " << series.GetId() << std::endl;
-
-        if (series.Is3DImage())
-        {
-          Display(series);
-          return 0;
-        }
-        else
-        {
-          std::cout << "      => Not a 3D image..." << std::endl;
-        }
-      }
-    }
-  }
-
-  std::cout << "Unable to find a 3D image in the local Orthanc store" << std::endl;
-
-  return 0;
-}
--- a/Resources/Samples/RestApi/CMakeLists.txt	Wed Sep 04 14:19:14 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-cmake_minimum_required(VERSION 2.8)
-
-project(RestApiSample)
-
-include(ExternalProject)
-
-# Send the toolchain information to the Orthanc 
-if (CMAKE_TOOLCHAIN_FILE)
-  set(TOOLCHAIN "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}")
-endif()
-
-ExternalProject_Add(
-  ORTHANC_CORE
-
-  # We use the Orthanc-0.3.1 branch for this sample
-  DOWNLOAD_COMMAND hg clone https://code.google.com/p/orthanc/ -r Orthanc-0.3.1
-
-  # Optional step, to reuse the third-party downloads
-  PATCH_COMMAND ${CMAKE_COMMAND} -E create_symlink ${CMAKE_SOURCE_DIR}/../../../ThirdPartyDownloads ThirdPartyDownloads
-
-  PREFIX ${CMAKE_BINARY_DIR}/Orthanc/
-  UPDATE_COMMAND ""
-  SOURCE_DIR ${CMAKE_BINARY_DIR}/Orthanc/src/orthanc/
-  CMAKE_COMMAND ${CMAKE_COMMAND}
-  CMAKE_ARGS -DSTATIC_BUILD=ON -DSTANDALONE_BUILD=ON -DUSE_DYNAMIC_GOOGLE_LOG=OFF -DUSE_DYNAMIC_SQLITE=OFF -DENABLE_SSL=OFF ${TOOLCHAIN}
-  BUILD_COMMAND $(MAKE) CoreLibrary
-  INSTALL_COMMAND ""
-  BUILD_IN_SOURCE 0
-  )
-
-ExternalProject_Get_Property(ORTHANC_CORE source_dir)
-include_directories(${source_dir})
-
-ExternalProject_Get_Property(ORTHANC_CORE binary_dir)
-link_directories(${binary_dir})
-include_directories(${binary_dir}/jsoncpp-src-0.5.0/include)
-include_directories(${binary_dir}/glog-0.3.2/src)
-include_directories(${binary_dir}/boost_1_49_0)
-
-
-add_executable(RestApiSample
-  Sample.cpp
-  )
-
-add_dependencies(RestApiSample ORTHANC_CORE)
-
-target_link_libraries(RestApiSample 
-  # From Orthanc
-  CoreLibrary
-  GoogleLog
-
-  # These two libraries are not necessary
-  #OpenSSL
-  #Curl
-  )
-
-if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
-  target_link_libraries(RestApiSample pthread)
-elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
-  add_definitions(-DGOOGLE_GLOG_DLL_DECL=)
-  target_link_libraries(RestApiSample wsock32)
-endif()
--- a/Resources/Samples/RestApi/Sample.cpp	Wed Sep 04 14:19:14 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,105 +0,0 @@
-/**
- * Orthanc - A Lightweight, RESTful DICOM Store
- * Copyright (C) 2012-2013 Medical Physics Department, CHU of Liege,
- * Belgium
- *
- * This program is free software: you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * In addition, as a special exception, the copyright holders of this
- * program give permission to link the code of its release with the
- * OpenSSL project's "OpenSSL" library (or with modified versions of it
- * that use the same license as the "OpenSSL" library), and distribute
- * the linked executables. You must obey the GNU General Public License
- * in all respects for all of the code used other than "OpenSSL". If you
- * modify file(s) with this exception, you may extend this exception to
- * your version of the file(s), but you are not obligated to do so. If
- * you do not wish to do so, delete this exception statement from your
- * version. If you delete this exception statement from all source files
- * in the program, then also delete it here.
- * 
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- **/
-
-
-#include <Core/HttpServer/MongooseServer.h>
-#include <Core/RestApi/RestApi.h>
-#include <Core/Toolbox.h>
-#include <glog/logging.h>
-#include <stdio.h>
-
-
-/**
- * This is a demo program that shows how to setup a REST server with
- * the Orthanc Core API. Once the server is running, here are some 
- * sample command lines to interact with it:
- * 
- *  # curl http://localhost:8042
- *  # curl 'http://localhost:8042?name=Hide'
- *  # curl http://localhost:8042 -X DELETE
- *  # curl http://localhost:8042 -X PUT -d "PutBody"
- *  # curl http://localhost:8042 -X POST -d "PostBody"
- **/
-
-static void GetRoot(Orthanc::RestApi::GetCall& call)
-{
-  std::string answer = "Hello world\n";
-  answer += "Glad to meet you, Mr. " + call.GetArgument("name", "Nobody") + "\n";
-  call.GetOutput().AnswerBuffer(answer, "text/plain");
-}
- 
-static void DeleteRoot(Orthanc::RestApi::DeleteCall& call)
-{
-  call.GetOutput().AnswerBuffer("Hey, you have just deleted the server!\n",
-                                "text/plain");
-}
- 
-static void PostRoot(Orthanc::RestApi::PostCall& call)
-{
-  call.GetOutput().AnswerBuffer("I have received a POST with body: [" +
-                                call.GetPostBody() + "]\n", "text/plain");
-}
- 
-static void PutRoot(Orthanc::RestApi::PutCall& call)
-{
-  call.GetOutput().AnswerBuffer("I have received a PUT with body: [" +
-                                call.GetPutBody() + "]\n", "text/plain");
-}
- 
-int main()
-{
-  // Initialize the logging mechanism
-  google::InitGoogleLogging("Orthanc");
-  FLAGS_logtostderr = true;
-  FLAGS_minloglevel = 0;                      // Use the verbose mode
-  FLAGS_v = 0;
-  
-  // Define the callbacks of the REST API
-  std::auto_ptr<Orthanc::RestApi> rest(new Orthanc::RestApi);
-  rest->Register("/", GetRoot);
-  rest->Register("/", PostRoot);
-  rest->Register("/", PutRoot);
-  rest->Register("/", DeleteRoot);
-
-  // Setup the embedded HTTP server
-  Orthanc::MongooseServer httpServer;
-  httpServer.SetPortNumber(8042);             // Use TCP port 8042
-  httpServer.SetRemoteAccessAllowed(true);    // Do not block remote requests
-  httpServer.RegisterHandler(rest.release()); // The REST API is the handler
-
-  // Start the server and wait for the user to hit "Ctrl-C"
-  httpServer.Start();
-  LOG(WARNING) << "REST server has started";
-  Orthanc::Toolbox::ServerBarrier();
-  LOG(WARNING) << "REST server has stopped";
-
-  return 0;
-}
--- a/Resources/Samples/RestApiLinuxDynamic/AutoGeneratedCode.cmake	Wed Sep 04 14:19:14 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,41 +0,0 @@
-set(AUTOGENERATED_DIR "${CMAKE_CURRENT_BINARY_DIR}/AUTOGENERATED")
-set(AUTOGENERATED_SOURCES)
-
-file(MAKE_DIRECTORY ${AUTOGENERATED_DIR})
-include_directories(${AUTOGENERATED_DIR})
-
-macro(EmbedResources)
-  # Convert a semicolon separated list to a whitespace separated string
-  set(SCRIPT_ARGUMENTS)
-  set(DEPENDENCIES)
-  set(IS_PATH_NAME false)
-  foreach(arg ${ARGN})
-    if (${IS_PATH_NAME})
-      list(APPEND SCRIPT_ARGUMENTS "${arg}")
-      list(APPEND DEPENDENCIES "${arg}")
-      set(IS_PATH_NAME false)
-    else()
-      list(APPEND SCRIPT_ARGUMENTS "${arg}")
-      set(IS_PATH_NAME true)
-    endif()
-  endforeach()
-
-  set(TARGET_BASE "${AUTOGENERATED_DIR}/EmbeddedResources")
-  add_custom_command(
-    OUTPUT
-    "${TARGET_BASE}.h"
-    "${TARGET_BASE}.cpp"
-    COMMAND 
-    python
-    "${ORTHANC_DIR}/Resources/EmbedResources.py"
-    "${AUTOGENERATED_DIR}/EmbeddedResources"
-    ${SCRIPT_ARGUMENTS}
-    DEPENDS
-    "${ORTHANC_DIR}/Resources/EmbedResources.py"
-    ${DEPENDENCIES}
-    )
-
-  list(APPEND AUTOGENERATED_SOURCES
-    "${AUTOGENERATED_DIR}/EmbeddedResources.cpp"
-    ) 
-endmacro()
--- a/Resources/Samples/RestApiLinuxDynamic/CMakeLists.txt	Wed Sep 04 14:19:14 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,107 +0,0 @@
-cmake_minimum_required(VERSION 2.8)
-
-project(RestApiSample)
-
-set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -Wall")
-set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -Wall -std=c++0x")
-
-file(DOWNLOAD 
-  http://mongoose.googlecode.com/files/mongoose-3.1.tgz 
-  ${CMAKE_BINARY_DIR}/mongoose-3.1.tar.gz
-  EXPECTED_MD5 "e718fc287b4eb1bd523be3fa00942bb0"
-  SHOW_PROGRESS
-  )
-
-file(DOWNLOAD 
-  http://downloads.sourceforge.net/project/jsoncpp/jsoncpp/0.5.0/jsoncpp-src-0.5.0.tar.gz
-  ${CMAKE_BINARY_DIR}/jsoncpp-src-0.5.0.tar.gz
-  EXPECTED_MD5 "24482b67c1cb17aac1ed1814288a3a8f"
-  SHOW_PROGRESS
-  )
-
-execute_process(
-  COMMAND hg clone -v -r Orthanc-0.4.0 https://code.google.com/p/orthanc/ Orthanc-0.4.0
-  WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
-  )
-
-execute_process(
-  COMMAND ${CMAKE_COMMAND} -E tar xvfz ${CMAKE_BINARY_DIR}/mongoose-3.1.tar.gz
-  WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
-  )
-
-# Apply a patch to improve Mongoose shutdown
-execute_process(
-  COMMAND patch mongoose.c ${ORTHANC_DIR}/Resources/Patches/mongoose-patch.diff
-  WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/mongoose
-  )
-
-execute_process(
-  COMMAND ${CMAKE_COMMAND} -E tar xvfz ${CMAKE_BINARY_DIR}/jsoncpp-src-0.5.0.tar.gz
-  WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
-  )
-
-include(AutoGeneratedCode.cmake)
-
-add_definitions(
-  -DBOOST_HAS_FILESYSTEM_V3=1
-  -DBOOST_HAS_SCHED_YIELD=1
-  -DORTHANC_SSL_ENABLED=1
-  -DORTHANC_STANDALONE=1
-  -DORTHANC_STATIC=0
-  )
-
-set(ORTHANC_DIR ${CMAKE_BINARY_DIR}/Orthanc-0.4.0)
-set(MONGOOSE_DIR ${CMAKE_BINARY_DIR}/mongoose)
-set(JSONCPP_DIR ${CMAKE_BINARY_DIR}/jsoncpp-src-0.5.0)
-
-include_directories(
-  ${ORTHANC_DIR}
-  ${MONGOOSE_DIR}
-  ${JSONCPP_DIR}/include
-  )
-
-link_libraries(
-  boost_date_time
-  boost_filesystem
-  boost_system
-  boost_thread
-  curl
-  dl
-  glog
-  png
-  pthread
-  sqlite3
-  uuid
-  z
-  )
-
-set(THIRD_PARTY_SOURCES
-  ${MONGOOSE_DIR}/mongoose.c
-  ${JSONCPP_DIR}/src/lib_json/json_reader.cpp
-  ${JSONCPP_DIR}/src/lib_json/json_value.cpp 
-  ${JSONCPP_DIR}/src/lib_json/json_writer.cpp
-  )
-
-file(GLOB ORTHANC_SOURCES 
-  ${ORTHANC_DIR}/Core/*.cpp
-  ${ORTHANC_DIR}/Core/*/*.cpp
-  ${ORTHANC_DIR}/OrthancCppClient/*.cpp
-  ${ORTHANC_DIR}/Resources/base64/base64.cpp
-  ${ORTHANC_DIR}/Resources/md5/md5.c
-  ${ORTHANC_DIR}/Resources/sha1/sha1.cpp
-  ${ORTHANC_DIR}/Resources/minizip/zip.c
-  ${ORTHANC_DIR}/Resources/minizip/ioapi.c
-  )
-
-list(REMOVE_ITEM ORTHANC_SOURCES ${ORTHANC_DIR}/OrthancCppClient/main.cpp)
-
-EmbedResources(
-  #ORTHANC_EXPLORER ${ORTHANC_DIR}/OrthancExplorer
-  )
-
-add_executable(RestApiSample
-  Sample.cpp
-  ${ORTHANC_SOURCES}
-  ${AUTOGENERATED_SOURCES}
-  ${THIRD_PARTY_SOURCES}
-  )
--- a/Resources/Samples/RestApiLinuxDynamic/README.txt	Wed Sep 04 14:19:14 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-This folder shows how it is possible to link against the "Core" and
-"OrthancCppClient" libraries from the Orthanc distribution. It is
-shown how a sample REST API can be created.
-
-This is the same sample than in folder "../RestApi", but with a
-different build script and the use of C++ lambda functions.
-
-The build script of this folder does not rely on the default CMake
-script from Orthanc. It dynamically links against the standard system
-Linux libraries. This results in a simpler, standalone build
-script. However, it will only work on Linux-based systems.
--- a/Resources/Samples/RestApiLinuxDynamic/Sample.cpp	Wed Sep 04 14:19:14 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,97 +0,0 @@
-/**
- * Orthanc - A Lightweight, RESTful DICOM Store
- * Copyright (C) 2012-2013 Medical Physics Department, CHU of Liege,
- * Belgium
- *
- * This program is free software: you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * In addition, as a special exception, the copyright holders of this
- * program give permission to link the code of its release with the
- * OpenSSL project's "OpenSSL" library (or with modified versions of it
- * that use the same license as the "OpenSSL" library), and distribute
- * the linked executables. You must obey the GNU General Public License
- * in all respects for all of the code used other than "OpenSSL". If you
- * modify file(s) with this exception, you may extend this exception to
- * your version of the file(s), but you are not obligated to do so. If
- * you do not wish to do so, delete this exception statement from your
- * version. If you delete this exception statement from all source files
- * in the program, then also delete it here.
- * 
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- **/
-
-
-#include <Core/HttpServer/MongooseServer.h>
-#include <Core/RestApi/RestApi.h>
-#include <Core/Toolbox.h>
-#include <glog/logging.h>
-#include <stdio.h>
-
-
-/**
- * This is a demo program that shows how to setup a REST server with
- * the Orthanc Core API. Once the server is running, here are some 
- * sample command lines to interact with it:
- * 
- *  # curl http://localhost:8042
- *  # curl 'http://localhost:8042?name=Hide'
- *  # curl http://localhost:8042 -X DELETE
- *  # curl http://localhost:8042 -X PUT -d "PutBody"
- *  # curl http://localhost:8042 -X POST -d "PostBody"
- **/
-
-int main()
-{
-  // Initialize the logging mechanism
-  google::InitGoogleLogging("Orthanc");
-  FLAGS_logtostderr = true;
-  FLAGS_minloglevel = 0;                      // Use the verbose mode
-  FLAGS_v = 0;
-  
-  // Define the callbacks of the REST API using C++11 lambda functions
-  std::auto_ptr<Orthanc::RestApi> rest(new Orthanc::RestApi);
-
-  rest->Register("/", [] (Orthanc::RestApi::GetCall& call) {
-      std::string answer = "Hello world\n";
-      answer += "Glad to meet you, Mr. " + call.GetArgument("name", "Nobody") + "\n";
-      call.GetOutput().AnswerBuffer(answer, "text/plain");
-    });
-
-  rest->Register("/", [] (Orthanc::RestApi::DeleteCall& call) {
-      call.GetOutput().AnswerBuffer("Hey, you have just deleted the server!\n",
-                                    "text/plain");
-    });
-    
-  rest->Register("/", [] (Orthanc::RestApi::PostCall& call) {
-      call.GetOutput().AnswerBuffer("I have received a POST with body: [" +
-                                    call.GetPostBody() + "]\n", "text/plain");
-    });
-
-  rest->Register("/", [] (Orthanc::RestApi::PutCall& call) {
-      call.GetOutput().AnswerBuffer("I have received a PUT with body: [" +
-                                    call.GetPutBody() + "]\n", "text/plain");
-    });
-
-  // Setup the embedded HTTP server
-  Orthanc::MongooseServer httpServer;
-  httpServer.SetPortNumber(8042);             // Use TCP port 8042
-  httpServer.SetRemoteAccessAllowed(true);    // Do not block remote requests
-  httpServer.RegisterHandler(rest.release()); // The REST API is the handler
-
-  // Start the server and wait for the user to hit "Ctrl-C"
-  httpServer.Start();
-  LOG(WARNING) << "REST server has started";
-  Orthanc::Toolbox::ServerBarrier();
-  LOG(WARNING) << "REST server has stopped";
-
-  return 0;
-}
--- a/Resources/sha1/Makefile	Wed Sep 04 14:19:14 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,41 +0,0 @@
-#
-#  Makefile
-#  
-#  Copyright (C) 1998, 2009
-#  Paul E. Jones <paulej@packetizer.com>
-#  All Rights Reserved.
-#
-#############################################################################
-#  $Id: Makefile 12 2009-06-22 19:34:25Z paulej $
-#############################################################################
-#
-#  Description:
-#	This is a makefile for UNIX to build the programs sha, shacmp, and
-#	shatest
-#
-#
-
-CC	= g++
-
-CFLAGS	= -c -O2 -Wall -D_FILE_OFFSET_BITS=64
-
-LIBS	=
-
-OBJS	= sha1.o
-
-all: sha shacmp shatest
-
-sha: sha.o $(OBJS)
-	$(CC) -o $@ sha.o $(OBJS) $(LIBS)
-
-shacmp: shacmp.o $(OBJS)
-	$(CC) -o $@ shacmp.o $(OBJS) $(LIBS)
-
-shatest: shatest.o $(OBJS)
-	$(CC) -o $@ shatest.o $(OBJS) $(LIBS)
-
-%.o: %.cpp
-	$(CC) $(CFLAGS) -o $@ $<
-
-clean:
-	$(RM) *.o sha shacmp shatest
--- a/Resources/sha1/Makefile.nt	Wed Sep 04 14:19:14 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
-#
-#  Makefile.nt
-#  
-#  Copyright (C) 1998, 2009
-#  Paul E. Jones <paulej@packetizer.com>
-#  All Rights Reserved.
-#
-#############################################################################
-#  $Id: Makefile.nt 13 2009-06-22 20:20:32Z paulej $
-#############################################################################
-#
-#  Description:
-#	This is a makefile for Win32 to build the programs sha, shacmp, and
-#	shatest
-#
-#  Portability Issues:
-#	Designed to work with Visual C++
-#
-#
-
-.silent:
-
-!include <win32.mak>
-
-RM	= del /q
-
-LIBS	= $(conlibs) setargv.obj
-
-CFLAGS	= -D _CRT_SECURE_NO_WARNINGS /EHsc /O2 /W3
-
-OBJS	= sha1.obj
-
-all: sha.exe shacmp.exe shatest.exe
-
-sha.exe: sha.obj $(OBJS)
-	$(link) $(conflags) -out:$@ sha.obj $(OBJS) $(LIBS)
-
-shacmp.exe: shacmp.obj $(OBJS)
-	$(link) $(conflags) -out:$@ shacmp.obj $(OBJS) $(LIBS)
-
-shatest.exe: shatest.obj $(OBJS)
-	$(link) $(conflags) -out:$@ shatest.obj $(OBJS) $(LIBS)
-
-.cpp.obj:
-	$(cc) $(CFLAGS) $(cflags) $(cvars) $<
-
-clean:
-	$(RM) *.obj sha.exe shacmp.exe shatest.exe
--- a/Resources/sha1/license.txt	Wed Sep 04 14:19:14 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-Copyright (C) 1998, 2009
-Paul E. Jones <paulej@packetizer.com>
-
-Freeware Public License (FPL)
-
-This software is licensed as "freeware."  Permission to distribute
-this software in source and binary forms, including incorporation 
-into other products, is hereby granted without a fee.  THIS SOFTWARE 
-IS PROVIDED 'AS IS' AND WITHOUT ANY EXPRESSED OR IMPLIED WARRANTIES, 
-INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY 
-AND FITNESS FOR A PARTICULAR PURPOSE.  THE AUTHOR SHALL NOT BE HELD 
-LIABLE FOR ANY DAMAGES RESULTING FROM THE USE OF THIS SOFTWARE, EITHER 
-DIRECTLY OR INDIRECTLY, INCLUDING, BUT NOT LIMITED TO, LOSS OF DATA 
-OR DATA BEING RENDERED INACCURATE.
--- a/Resources/sha1/sha.cpp	Wed Sep 04 14:19:14 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,176 +0,0 @@
-/*
- *  sha.cpp
- *
- *  Copyright (C) 1998, 2009
- *  Paul E. Jones <paulej@packetizer.com>
- *  All Rights Reserved
- *
- *****************************************************************************
- *  $Id: sha.cpp 13 2009-06-22 20:20:32Z paulej $
- *****************************************************************************
- *
- *  Description:
- *      This utility will display the message digest (fingerprint) for
- *      the specified file(s).
- *
- *  Portability Issues:
- *      None.
- */
-
-#include <stdio.h>
-#include <string.h>
-#ifdef WIN32
-#include <io.h>
-#endif
-#include <fcntl.h>
-#include "sha1.h"
-
-/*
- *  Function prototype
- */
-void usage();
-
-
-/*  
- *  main
- *
- *  Description:
- *      This is the entry point for the program
- *
- *  Parameters:
- *      argc: [in]
- *          This is the count of arguments in the argv array
- *      argv: [in]
- *          This is an array of filenames for which to compute message digests
- *
- *  Returns:
- *      Nothing.
- *
- *  Comments:
- *
- */
-int main(int argc, char *argv[])
-{
-    SHA1        sha;                        // SHA-1 class
-    FILE        *fp;                        // File pointer for reading files
-    char        c;                          // Character read from file
-    unsigned    message_digest[5];          // Message digest from "sha"
-    int         i;                          // Counter
-    bool        reading_stdin;              // Are we reading standard in?
-    bool        read_stdin = false;         // Have we read stdin?
-
-    /*
-     *  Check the program arguments and print usage information if -?
-     *  or --help is passed as the first argument.
-     */
-    if (argc > 1 && (!strcmp(argv[1],"-?") || !strcmp(argv[1],"--help")))
-    {
-        usage();
-        return 1;
-    }
-
-    /*
-     *  For each filename passed in on the command line, calculate the
-     *  SHA-1 value and display it.
-     */
-    for(i = 0; i < argc; i++)
-    {
-        /*
-         *  We start the counter at 0 to guarantee entry into the for loop.
-         *  So if 'i' is zero, we will increment it now.  If there is no
-         *  argv[1], we will use STDIN below.
-         */
-        if (i == 0)
-        {
-            i++;
-        }
-
-        if (argc == 1 || !strcmp(argv[i],"-"))
-        {
-#ifdef WIN32
-            _setmode(_fileno(stdin), _O_BINARY);
-#endif
-            fp = stdin;
-            reading_stdin = true;
-        }
-        else
-        {
-            if (!(fp = fopen(argv[i],"rb")))
-            {
-                fprintf(stderr, "sha: unable to open file %s\n", argv[i]);
-                return 2;
-            }
-            reading_stdin = false;
-        }
-
-        /*
-         *  We do not want to read STDIN multiple times
-         */
-        if (reading_stdin)
-        {
-            if (read_stdin)
-            {
-                continue;
-            }
-
-            read_stdin = true;
-        }
-
-        /*
-         *  Reset the SHA1 object and process input
-         */
-        sha.Reset();
-
-        c = fgetc(fp);
-        while(!feof(fp))
-        {
-            sha.Input(c);
-            c = fgetc(fp);
-        }
-
-        if (!reading_stdin)
-        {
-            fclose(fp);
-        }
-
-        if (!sha.Result(message_digest))
-        {
-            fprintf(stderr,"sha: could not compute message digest for %s\n",
-                    reading_stdin?"STDIN":argv[i]);
-        }
-        else
-        {
-            printf( "%08X %08X %08X %08X %08X - %s\n",
-                    message_digest[0],
-                    message_digest[1],
-                    message_digest[2],
-                    message_digest[3],
-                    message_digest[4],
-                    reading_stdin?"STDIN":argv[i]);
-        }
-    }
-
-    return 0;
-}
-
-/*  
- *  usage
- *
- *  Description:
- *      This function will display program usage information to the user.
- *
- *  Parameters:
- *      None.
- *
- *  Returns:
- *      Nothing.
- *
- *  Comments:
- *
- */
-void usage()
-{
-    printf("usage: sha <file> [<file> ...]\n");
-    printf("\tThis program will display the message digest (fingerprint)\n");
-    printf("\tfor files using the Secure Hashing Algorithm (SHA-1).\n");
-}
--- a/Resources/sha1/sha1.cpp	Wed Sep 04 14:19:14 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,589 +0,0 @@
-/*
- *  sha1.cpp
- *
- *  Copyright (C) 1998, 2009
- *  Paul E. Jones <paulej@packetizer.com>
- *  All Rights Reserved.
- *
- *****************************************************************************
- *  $Id: sha1.cpp 12 2009-06-22 19:34:25Z paulej $
- *****************************************************************************
- *
- *  Description:
- *      This class implements the Secure Hashing Standard as defined
- *      in FIPS PUB 180-1 published April 17, 1995.
- *
- *      The Secure Hashing Standard, which uses the Secure Hashing
- *      Algorithm (SHA), produces a 160-bit message digest for a
- *      given data stream.  In theory, it is highly improbable that
- *      two messages will produce the same message digest.  Therefore,
- *      this algorithm can serve as a means of providing a "fingerprint"
- *      for a message.
- *
- *  Portability Issues:
- *      SHA-1 is defined in terms of 32-bit "words".  This code was
- *      written with the expectation that the processor has at least
- *      a 32-bit machine word size.  If the machine word size is larger,
- *      the code should still function properly.  One caveat to that
- *      is that the input functions taking characters and character arrays
- *      assume that only 8 bits of information are stored in each character.
- *
- *  Caveats:
- *      SHA-1 is designed to work with messages less than 2^64 bits long.
- *      Although SHA-1 allows a message digest to be generated for
- *      messages of any number of bits less than 2^64, this implementation
- *      only works with messages with a length that is a multiple of 8
- *      bits.
- *
- */
-
-
-#include "sha1.h"
-
-/*  
- *  SHA1
- *
- *  Description:
- *      This is the constructor for the sha1 class.
- *
- *  Parameters:
- *      None.
- *
- *  Returns:
- *      Nothing.
- *
- *  Comments:
- *
- */
-SHA1::SHA1()
-{
-    Reset();
-}
-
-/*  
- *  ~SHA1
- *
- *  Description:
- *      This is the destructor for the sha1 class
- *
- *  Parameters:
- *      None.
- *
- *  Returns:
- *      Nothing.
- *
- *  Comments:
- *
- */
-SHA1::~SHA1()
-{
-    // The destructor does nothing
-}
-
-/*  
- *  Reset
- *
- *  Description:
- *      This function will initialize the sha1 class member variables
- *      in preparation for computing a new message digest.
- *
- *  Parameters:
- *      None.
- *
- *  Returns:
- *      Nothing.
- *
- *  Comments:
- *
- */
-void SHA1::Reset()
-{
-    Length_Low          = 0;
-    Length_High         = 0;
-    Message_Block_Index = 0;
-
-    H[0]        = 0x67452301;
-    H[1]        = 0xEFCDAB89;
-    H[2]        = 0x98BADCFE;
-    H[3]        = 0x10325476;
-    H[4]        = 0xC3D2E1F0;
-
-    Computed    = false;
-    Corrupted   = false;
-}
-
-/*  
- *  Result
- *
- *  Description:
- *      This function will return the 160-bit message digest into the
- *      array provided.
- *
- *  Parameters:
- *      message_digest_array: [out]
- *          This is an array of five unsigned integers which will be filled
- *          with the message digest that has been computed.
- *
- *  Returns:
- *      True if successful, false if it failed.
- *
- *  Comments:
- *
- */
-bool SHA1::Result(unsigned *message_digest_array)
-{
-    int i;                                  // Counter
-
-    if (Corrupted)
-    {
-        return false;
-    }
-
-    if (!Computed)
-    {
-        PadMessage();
-        Computed = true;
-    }
-
-    for(i = 0; i < 5; i++)
-    {
-        message_digest_array[i] = H[i];
-    }
-
-    return true;
-}
-
-/*  
- *  Input
- *
- *  Description:
- *      This function accepts an array of octets as the next portion of
- *      the message.
- *
- *  Parameters:
- *      message_array: [in]
- *          An array of characters representing the next portion of the
- *          message.
- *
- *  Returns:
- *      Nothing.
- *
- *  Comments:
- *
- */
-void SHA1::Input(   const unsigned char *message_array,
-                    unsigned            length)
-{
-    if (!length)
-    {
-        return;
-    }
-
-    if (Computed || Corrupted)
-    {
-        Corrupted = true;
-        return;
-    }
-
-    while(length-- && !Corrupted)
-    {
-        Message_Block[Message_Block_Index++] = (*message_array & 0xFF);
-
-        Length_Low += 8;
-        Length_Low &= 0xFFFFFFFF;               // Force it to 32 bits
-        if (Length_Low == 0)
-        {
-            Length_High++;
-            Length_High &= 0xFFFFFFFF;          // Force it to 32 bits
-            if (Length_High == 0)
-            {
-                Corrupted = true;               // Message is too long
-            }
-        }
-
-        if (Message_Block_Index == 64)
-        {
-            ProcessMessageBlock();
-        }
-
-        message_array++;
-    }
-}
-
-/*  
- *  Input
- *
- *  Description:
- *      This function accepts an array of octets as the next portion of
- *      the message.
- *
- *  Parameters:
- *      message_array: [in]
- *          An array of characters representing the next portion of the
- *          message.
- *      length: [in]
- *          The length of the message_array
- *
- *  Returns:
- *      Nothing.
- *
- *  Comments:
- *
- */
-void SHA1::Input(   const char  *message_array,
-                    unsigned    length)
-{
-    Input((unsigned char *) message_array, length);
-}
-
-/*  
- *  Input
- *
- *  Description:
- *      This function accepts a single octets as the next message element.
- *
- *  Parameters:
- *      message_element: [in]
- *          The next octet in the message.
- *
- *  Returns:
- *      Nothing.
- *
- *  Comments:
- *
- */
-void SHA1::Input(unsigned char message_element)
-{
-    Input(&message_element, 1);
-}
-
-/*  
- *  Input
- *
- *  Description:
- *      This function accepts a single octet as the next message element.
- *
- *  Parameters:
- *      message_element: [in]
- *          The next octet in the message.
- *
- *  Returns:
- *      Nothing.
- *
- *  Comments:
- *
- */
-void SHA1::Input(char message_element)
-{
-    Input((unsigned char *) &message_element, 1);
-}
-
-/*  
- *  operator<<
- *
- *  Description:
- *      This operator makes it convenient to provide character strings to
- *      the SHA1 object for processing.
- *
- *  Parameters:
- *      message_array: [in]
- *          The character array to take as input.
- *
- *  Returns:
- *      A reference to the SHA1 object.
- *
- *  Comments:
- *      Each character is assumed to hold 8 bits of information.
- *
- */
-SHA1& SHA1::operator<<(const char *message_array)
-{
-    const char *p = message_array;
-
-    while(*p)
-    {
-        Input(*p);
-        p++;
-    }
-
-    return *this;
-}
-
-/*  
- *  operator<<
- *
- *  Description:
- *      This operator makes it convenient to provide character strings to
- *      the SHA1 object for processing.
- *
- *  Parameters:
- *      message_array: [in]
- *          The character array to take as input.
- *
- *  Returns:
- *      A reference to the SHA1 object.
- *
- *  Comments:
- *      Each character is assumed to hold 8 bits of information.
- *
- */
-SHA1& SHA1::operator<<(const unsigned char *message_array)
-{
-    const unsigned char *p = message_array;
-
-    while(*p)
-    {
-        Input(*p);
-        p++;
-    }
-
-    return *this;
-}
-
-/*  
- *  operator<<
- *
- *  Description:
- *      This function provides the next octet in the message.
- *
- *  Parameters:
- *      message_element: [in]
- *          The next octet in the message
- *
- *  Returns:
- *      A reference to the SHA1 object.
- *
- *  Comments:
- *      The character is assumed to hold 8 bits of information.
- *
- */
-SHA1& SHA1::operator<<(const char message_element)
-{
-    Input((unsigned char *) &message_element, 1);
-
-    return *this;
-}
-
-/*  
- *  operator<<
- *
- *  Description:
- *      This function provides the next octet in the message.
- *
- *  Parameters:
- *      message_element: [in]
- *          The next octet in the message
- *
- *  Returns:
- *      A reference to the SHA1 object.
- *
- *  Comments:
- *      The character is assumed to hold 8 bits of information.
- *
- */
-SHA1& SHA1::operator<<(const unsigned char message_element)
-{
-    Input(&message_element, 1);
-
-    return *this;
-}
-
-/*  
- *  ProcessMessageBlock
- *
- *  Description:
- *      This function will process the next 512 bits of the message
- *      stored in the Message_Block array.
- *
- *  Parameters:
- *      None.
- *
- *  Returns:
- *      Nothing.
- *
- *  Comments:
- *      Many of the variable names in this function, especially the single
- *      character names, were used because those were the names used
- *      in the publication.
- *
- */
-void SHA1::ProcessMessageBlock()
-{
-    const unsigned K[] =    {               // Constants defined for SHA-1
-                                0x5A827999,
-                                0x6ED9EBA1,
-                                0x8F1BBCDC,
-                                0xCA62C1D6
-                            };
-    int         t;                          // Loop counter
-    unsigned    temp;                       // Temporary word value
-    unsigned    W[80];                      // Word sequence
-    unsigned    A, B, C, D, E;              // Word buffers
-
-    /*
-     *  Initialize the first 16 words in the array W
-     */
-    for(t = 0; t < 16; t++)
-    {
-        W[t] = ((unsigned) Message_Block[t * 4]) << 24;
-        W[t] |= ((unsigned) Message_Block[t * 4 + 1]) << 16;
-        W[t] |= ((unsigned) Message_Block[t * 4 + 2]) << 8;
-        W[t] |= ((unsigned) Message_Block[t * 4 + 3]);
-    }
-
-    for(t = 16; t < 80; t++)
-    {
-       W[t] = CircularShift(1,W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16]);
-    }
-
-    A = H[0];
-    B = H[1];
-    C = H[2];
-    D = H[3];
-    E = H[4];
-
-    for(t = 0; t < 20; t++)
-    {
-        temp = CircularShift(5,A) + ((B & C) | ((~B) & D)) + E + W[t] + K[0];
-        temp &= 0xFFFFFFFF;
-        E = D;
-        D = C;
-        C = CircularShift(30,B);
-        B = A;
-        A = temp;
-    }
-
-    for(t = 20; t < 40; t++)
-    {
-        temp = CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[1];
-        temp &= 0xFFFFFFFF;
-        E = D;
-        D = C;
-        C = CircularShift(30,B);
-        B = A;
-        A = temp;
-    }
-
-    for(t = 40; t < 60; t++)
-    {
-        temp = CircularShift(5,A) +
-               ((B & C) | (B & D) | (C & D)) + E + W[t] + K[2];
-        temp &= 0xFFFFFFFF;
-        E = D;
-        D = C;
-        C = CircularShift(30,B);
-        B = A;
-        A = temp;
-    }
-
-    for(t = 60; t < 80; t++)
-    {
-        temp = CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[3];
-        temp &= 0xFFFFFFFF;
-        E = D;
-        D = C;
-        C = CircularShift(30,B);
-        B = A;
-        A = temp;
-    }
-
-    H[0] = (H[0] + A) & 0xFFFFFFFF;
-    H[1] = (H[1] + B) & 0xFFFFFFFF;
-    H[2] = (H[2] + C) & 0xFFFFFFFF;
-    H[3] = (H[3] + D) & 0xFFFFFFFF;
-    H[4] = (H[4] + E) & 0xFFFFFFFF;
-
-    Message_Block_Index = 0;
-}
-
-/*  
- *  PadMessage
- *
- *  Description:
- *      According to the standard, the message must be padded to an even
- *      512 bits.  The first padding bit must be a '1'.  The last 64 bits
- *      represent the length of the original message.  All bits in between
- *      should be 0.  This function will pad the message according to those
- *      rules by filling the message_block array accordingly.  It will also
- *      call ProcessMessageBlock() appropriately.  When it returns, it
- *      can be assumed that the message digest has been computed.
- *
- *  Parameters:
- *      None.
- *
- *  Returns:
- *      Nothing.
- *
- *  Comments:
- *
- */
-void SHA1::PadMessage()
-{
-    /*
-     *  Check to see if the current message block is too small to hold
-     *  the initial padding bits and length.  If so, we will pad the
-     *  block, process it, and then continue padding into a second block.
-     */
-    if (Message_Block_Index > 55)
-    {
-        Message_Block[Message_Block_Index++] = 0x80;
-        while(Message_Block_Index < 64)
-        {
-            Message_Block[Message_Block_Index++] = 0;
-        }
-
-        ProcessMessageBlock();
-
-        while(Message_Block_Index < 56)
-        {
-            Message_Block[Message_Block_Index++] = 0;
-        }
-    }
-    else
-    {
-        Message_Block[Message_Block_Index++] = 0x80;
-        while(Message_Block_Index < 56)
-        {
-            Message_Block[Message_Block_Index++] = 0;
-        }
-
-    }
-
-    /*
-     *  Store the message length as the last 8 octets
-     */
-    Message_Block[56] = (Length_High >> 24) & 0xFF;
-    Message_Block[57] = (Length_High >> 16) & 0xFF;
-    Message_Block[58] = (Length_High >> 8) & 0xFF;
-    Message_Block[59] = (Length_High) & 0xFF;
-    Message_Block[60] = (Length_Low >> 24) & 0xFF;
-    Message_Block[61] = (Length_Low >> 16) & 0xFF;
-    Message_Block[62] = (Length_Low >> 8) & 0xFF;
-    Message_Block[63] = (Length_Low) & 0xFF;
-
-    ProcessMessageBlock();
-}
-
-
-/*  
- *  CircularShift
- *
- *  Description:
- *      This member function will perform a circular shifting operation.
- *
- *  Parameters:
- *      bits: [in]
- *          The number of bits to shift (1-31)
- *      word: [in]
- *          The value to shift (assumes a 32-bit integer)
- *
- *  Returns:
- *      The shifted value.
- *
- *  Comments:
- *
- */
-unsigned SHA1::CircularShift(int bits, unsigned word)
-{
-    return ((word << bits) & 0xFFFFFFFF) | ((word & 0xFFFFFFFF) >> (32-bits));
-}
--- a/Resources/sha1/sha1.h	Wed Sep 04 14:19:14 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,89 +0,0 @@
-/*
- *  sha1.h
- *
- *  Copyright (C) 1998, 2009
- *  Paul E. Jones <paulej@packetizer.com>
- *  All Rights Reserved.
- *
- *****************************************************************************
- *  $Id: sha1.h 12 2009-06-22 19:34:25Z paulej $
- *****************************************************************************
- *
- *  Description:
- *      This class implements the Secure Hashing Standard as defined
- *      in FIPS PUB 180-1 published April 17, 1995.
- *
- *      Many of the variable names in this class, especially the single
- *      character names, were used because those were the names used
- *      in the publication.
- *
- *      Please read the file sha1.cpp for more information.
- *
- */
-
-#ifndef _SHA1_H_
-#define _SHA1_H_
-
-class SHA1
-{
-
-    public:
-
-        SHA1();
-        virtual ~SHA1();
-
-        /*
-         *  Re-initialize the class
-         */
-        void Reset();
-
-        /*
-         *  Returns the message digest
-         */
-        bool Result(unsigned *message_digest_array);
-
-        /*
-         *  Provide input to SHA1
-         */
-        void Input( const unsigned char *message_array,
-                    unsigned            length);
-        void Input( const char  *message_array,
-                    unsigned    length);
-        void Input(unsigned char message_element);
-        void Input(char message_element);
-        SHA1& operator<<(const char *message_array);
-        SHA1& operator<<(const unsigned char *message_array);
-        SHA1& operator<<(const char message_element);
-        SHA1& operator<<(const unsigned char message_element);
-
-    private:
-
-        /*
-         *  Process the next 512 bits of the message
-         */
-        void ProcessMessageBlock();
-
-        /*
-         *  Pads the current message block to 512 bits
-         */
-        void PadMessage();
-
-        /*
-         *  Performs a circular left shift operation
-         */
-        inline unsigned CircularShift(int bits, unsigned word);
-
-        unsigned H[5];                      // Message digest buffers
-
-        unsigned Length_Low;                // Message length in bits
-        unsigned Length_High;               // Message length in bits
-
-        unsigned char Message_Block[64];    // 512-bit message blocks
-        int Message_Block_Index;            // Index into message block array
-
-        bool Computed;                      // Is the digest computed?
-        bool Corrupted;                     // Is the message digest corruped?
-    
-};
-
-#endif
--- a/Resources/sha1/shacmp.cpp	Wed Sep 04 14:19:14 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,169 +0,0 @@
-/*
- *  shacmp.cpp
- *
- *  Copyright (C) 1998, 2009
- *  Paul E. Jones <paulej@packetizer.com>
- *  All Rights Reserved
- *
- *****************************************************************************
- *  $Id: shacmp.cpp 12 2009-06-22 19:34:25Z paulej $
- *****************************************************************************
- *
- *  Description:
- *      This utility will compare two files by producing a message digest
- *      for each file using the Secure Hashing Algorithm and comparing
- *      the message digests.  This function will return 0 if they
- *      compare or 1 if they do not or if there is an error.
- *      Errors result in a return code higher than 1.
- *
- *  Portability Issues:
- *      none.
- *
- */
-
-#include <stdio.h>
-#include <string.h>
-#include "sha1.h"
-
-/*
- *  Return codes
- */
-#define SHA1_COMPARE        0
-#define SHA1_NO_COMPARE     1
-#define SHA1_USAGE_ERROR    2
-#define SHA1_FILE_ERROR     3
-
-/*
- *  Function prototype
- */
-void usage();
-
-/*  
- *  main
- *
- *  Description:
- *      This is the entry point for the program
- *
- *  Parameters:
- *      argc: [in]
- *          This is the count of arguments in the argv array
- *      argv: [in]
- *          This is an array of filenames for which to compute message digests
- *
- *  Returns:
- *      Nothing.
- *
- *  Comments:
- *
- */
-int main(int argc, char *argv[])
-{
-    SHA1        sha;                        // SHA-1 class
-    FILE        *fp;                        // File pointer for reading files
-    char        c;                          // Character read from file
-    unsigned    message_digest[2][5];       // Message digest for files
-    int         i;                          // Counter
-    bool        message_match;              // Message digest match flag
-    int         returncode;
-
-    /*
-     *  If we have two arguments, we will assume they are filenames.  If
-     *  we do not have to arguments, call usage() and exit.
-     */
-    if (argc != 3)
-    {
-        usage();
-        return SHA1_USAGE_ERROR;
-    }
-
-    /*
-     *  Get the message digests for each file
-     */
-    for(i = 1; i <= 2; i++)
-    {
-        sha.Reset();
-
-        if (!(fp = fopen(argv[i],"rb")))
-        {
-            fprintf(stderr, "sha: unable to open file %s\n", argv[i]);
-            return SHA1_FILE_ERROR;
-        }
-
-        c = fgetc(fp);
-        while(!feof(fp))
-        {
-            sha.Input(c);
-            c = fgetc(fp);
-        }
-
-        fclose(fp);
-
-        if (!sha.Result(message_digest[i-1]))
-        {
-            fprintf(stderr,"shacmp: could not compute message digest for %s\n",
-                    argv[i]);
-            return SHA1_FILE_ERROR;
-        }
-    }
-
-    /*
-     *  Compare the message digest values
-     */
-    message_match = true;
-    for(i = 0; i < 5; i++)
-    {
-        if (message_digest[0][i] != message_digest[1][i])
-        {
-            message_match = false;
-            break;
-        }
-    }
-
-    if (message_match)
-    {
-        printf("Fingerprints match:\n");
-        returncode = SHA1_COMPARE;
-    }
-    else
-    {
-        printf("Fingerprints do not match:\n");
-        returncode = SHA1_NO_COMPARE;
-    }
-
-    printf( "\t%08X %08X %08X %08X %08X\n",
-            message_digest[0][0],
-            message_digest[0][1],
-            message_digest[0][2],
-            message_digest[0][3],
-            message_digest[0][4]);
-    printf( "\t%08X %08X %08X %08X %08X\n",
-            message_digest[1][0],
-            message_digest[1][1],
-            message_digest[1][2],
-            message_digest[1][3],
-            message_digest[1][4]);
-
-    return returncode;
-}
-
-/*  
- *  usage
- *
- *  Description:
- *      This function will display program usage information to the user.
- *
- *  Parameters:
- *      None.
- *
- *  Returns:
- *      Nothing.
- *
- *  Comments:
- *
- */
-void usage()
-{
-    printf("usage: shacmp <file> <file>\n");
-    printf("\tThis program will compare the message digests (fingerprints)\n");
-    printf("\tfor two files using the Secure Hashing Algorithm (SHA-1).\n");
-}
--- a/Resources/sha1/shatest.cpp	Wed Sep 04 14:19:14 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,149 +0,0 @@
-/*
- *  shatest.cpp
- *
- *  Copyright (C) 1998, 2009
- *  Paul E. Jones <paulej@packetizer.com>
- *  All Rights Reserved
- *
- *****************************************************************************
- *  $Id: shatest.cpp 12 2009-06-22 19:34:25Z paulej $
- *****************************************************************************
- *
- *  Description:
- *      This file will exercise the SHA1 class and perform the three
- *      tests documented in FIPS PUB 180-1.
- *
- *  Portability Issues:
- *      None.
- *
- */
-
-#include <iostream>
-#include "sha1.h"
-
-using namespace std;
-
-/*
- *  Define patterns for testing
- */
-#define TESTA   "abc"
-#define TESTB   "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
-
-/*
- *  Function prototype
- */
-void DisplayMessageDigest(unsigned *message_digest);
-
-/*  
- *  main
- *
- *  Description:
- *      This is the entry point for the program
- *
- *  Parameters:
- *      None.
- *
- *  Returns:
- *      Nothing.
- *
- *  Comments:
- *
- */
-int main()
-{
-    SHA1        sha;
-    unsigned    message_digest[5];
-
-    /*
-     *  Perform test A
-     */
-    cout << endl << "Test A: 'abc'" << endl;
-
-    sha.Reset();
-    sha << TESTA;
-
-    if (!sha.Result(message_digest))
-    {
-        cerr << "ERROR-- could not compute message digest" << endl;
-    }
-    else
-    {
-        DisplayMessageDigest(message_digest);
-        cout << "Should match:" << endl;
-        cout << '\t' << "A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D" << endl;
-    }
-
-    /*
-     *  Perform test B
-     */
-    cout << endl << "Test B: " << TESTB << endl;
-
-    sha.Reset();
-    sha << TESTB;
-
-    if (!sha.Result(message_digest))
-    {
-        cerr << "ERROR-- could not compute message digest" << endl;
-    }
-    else
-    {
-        DisplayMessageDigest(message_digest);
-        cout << "Should match:" << endl;
-        cout << '\t' << "84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1" << endl;
-    }
-
-    /*
-     *  Perform test C
-     */
-    cout << endl << "Test C: One million 'a' characters" << endl;
-
-    sha.Reset();
-    for(int i = 1; i <= 1000000; i++) sha.Input('a');
-
-    if (!sha.Result(message_digest))
-    {
-        cerr << "ERROR-- could not compute message digest" << endl;
-    }
-    else
-    {
-        DisplayMessageDigest(message_digest);
-        cout << "Should match:" << endl;
-        cout << '\t' << "34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F" << endl;
-    }
-
-    return 0;
-}
-
-/*  
- *  DisplayMessageDigest
- *
- *  Description:
- *      Display Message Digest array
- *
- *  Parameters:
- *      None.
- *
- *  Returns:
- *      Nothing.
- *
- *  Comments:
- *
- */
-void DisplayMessageDigest(unsigned *message_digest)
-{
-    ios::fmtflags   flags;
-
-    cout << '\t';
-
-    flags = cout.setf(ios::hex|ios::uppercase,ios::basefield);
-    cout.setf(ios::uppercase);
-
-    for(int i = 0; i < 5 ; i++)
-    {
-        cout << message_digest[i] << ' ';
-    }
-
-    cout << endl;
-
-    cout.setf(flags);
-}
--- a/THANKS	Wed Sep 04 14:19:14 2013 +0200
+++ b/THANKS	Thu Oct 17 14:21:50 2013 +0200
@@ -17,6 +17,7 @@
   handling of series with temporal positions (fMRI and dynamic PET).
 * Ryan Walklin (ryanwalklin@gmail.com), for Mac OS X build.
 * Peter Somlo (peter.somlo@gmail.com), for ClearCanvas support.
+* 12maksqwe@gmail.com, for fixing issue #8.
 
 
 Artwork
--- a/UnitTests/Versions.cpp	Wed Sep 04 14:19:14 2013 +0200
+++ b/UnitTests/Versions.cpp	Thu Oct 17 14:21:50 2013 +0200
@@ -57,7 +57,7 @@
 
 TEST(Versions, BoostStatic)
 {
-  ASSERT_STREQ("1_49", BOOST_LIB_VERSION);
+  ASSERT_STREQ("1_54", BOOST_LIB_VERSION);
 }
 
 TEST(Versions, CurlStatic)
--- a/UnitTests/main.cpp	Wed Sep 04 14:19:14 2013 +0200
+++ b/UnitTests/main.cpp	Thu Oct 17 14:21:50 2013 +0200
@@ -445,7 +445,7 @@
     q.Enqueue(new DynamicInteger(20));  
     throw OrthancException("Nope");
   }
-  catch (OrthancException)
+  catch (OrthancException&)
   {
   }
 }