changeset 4830:089b6c841da1 openssl-3.x

integration mainline->openssl-3.x
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 25 Nov 2021 18:54:02 +0100
parents 70d2a97ca8cb (current diff) c847b0dfd255 (diff)
children 2e71a08eea15
files NEWS
diffstat 29 files changed, 320 insertions(+), 59 deletions(-) [+]
line wrap: on
line diff
--- a/NEWS	Thu Nov 25 13:12:32 2021 +0100
+++ b/NEWS	Thu Nov 25 18:54:02 2021 +0100
@@ -25,7 +25,7 @@
   the new storage cache.
 * New configuration option "ZipLoaderThreads" to configure the number of threads used
   to read instances from storage when createing a Zip archive/media.
-
+* Support decoding of black-and-white images (with 1 bit per pixel), notably DICOM SEG
 
 Maintenance
 -----------
--- a/OrthancFramework/Sources/DicomFormat/DicomImageInformation.cpp	Thu Nov 25 13:12:32 2021 +0100
+++ b/OrthancFramework/Sources/DicomFormat/DicomImageInformation.cpp	Thu Nov 25 18:54:02 2021 +0100
@@ -124,6 +124,11 @@
         bitsStored_ = bitsAllocated_;
       }
 
+      if (bitsStored_ > bitsAllocated_)
+      {
+        throw OrthancException(ErrorCode_BadFileFormat);
+      }
+
       if (!values.ParseUnsignedInteger32(highBit_, DICOM_TAG_HIGH_BIT))
       {
         highBit_ = bitsStored_ - 1;
@@ -168,7 +173,8 @@
     }
 
     if (bitsAllocated_ != 8 && bitsAllocated_ != 16 &&
-        bitsAllocated_ != 24 && bitsAllocated_ != 32)
+        bitsAllocated_ != 24 && bitsAllocated_ != 32 &&
+        bitsAllocated_ != 1 /* new in Orthanc 1.9.8 */)
     {
       throw OrthancException(ErrorCode_IncompatibleImageFormat, "Image not supported: " + boost::lexical_cast<std::string>(bitsAllocated_) + " bits allocated");
     }
@@ -186,7 +192,26 @@
       throw OrthancException(ErrorCode_IncompatibleImageFormat, "Image not supported: samples per pixel is 0");
     }
 
-    bytesPerValue_ = bitsAllocated_ / 8;
+    if (bitsStored_ == 1)
+    {
+      // This is the case of DICOM SEG, new in Orthanc 1.9.8
+      if (bitsAllocated_ != 1)
+      {
+        throw OrthancException(ErrorCode_BadFileFormat);
+      }
+      else if (width_ % 8 != 0)
+      {
+        throw OrthancException(ErrorCode_BadFileFormat, "Bad number of columns for a black-and-white image");
+      }
+      else
+      {
+        bytesPerValue_ = 0;  // Arbitrary initialization
+      }
+    }
+    else
+    {
+      bytesPerValue_ = bitsAllocated_ / 8;
+    }
 
     isPlanar_ = (planarConfiguration != 0 ? true : false);
     isSigned_ = (pixelRepresentation != 0 ? true : false);
@@ -237,7 +262,16 @@
 
   size_t DicomImageInformation::GetBytesPerValue() const
   {
-    return bytesPerValue_;
+    if (bitsStored_ == 1)
+    {
+      throw OrthancException(ErrorCode_BadSequenceOfCalls,
+                             "This call is incompatible with black-and-white images");
+    }
+    else
+    {
+      assert(bitsAllocated_ >= 8);
+      return bytesPerValue_;
+    }
   }
 
   bool DicomImageInformation::IsSigned() const
@@ -315,6 +349,13 @@
         format = PixelFormat_Grayscale32;
         return true;
       }
+
+      if (GetBitsStored() == 1 && GetChannelCount() == 1 && !IsSigned())
+      {
+        // This is the case of DICOM SEG, new in Orthanc 1.9.8
+        format = PixelFormat_Grayscale8;
+        return true;
+      }
     }
 
     if (GetBitsStored() == 8 &&
@@ -332,10 +373,27 @@
 
   size_t DicomImageInformation::GetFrameSize() const
   {
-    return (GetHeight() *
-            GetWidth() *
-            GetBytesPerValue() *
-            GetChannelCount());
+    if (bitsStored_ == 1)
+    {
+      assert(GetWidth() % 8 == 0);
+      
+      if (GetChannelCount() == 1)
+      {
+        return GetHeight() * GetWidth() / 8;
+      }
+      else
+      {
+        throw OrthancException(ErrorCode_IncompatibleImageFormat,
+                               "Image not supported (multi-channel black-and-image image)");
+      }
+    }
+    else
+    {
+      return (GetHeight() *
+              GetWidth() *
+              GetBytesPerValue() *
+              GetChannelCount());
+    }
   }
 
 
--- a/OrthancFramework/Sources/DicomFormat/DicomIntegerPixelAccessor.cpp	Thu Nov 25 13:12:32 2021 +0100
+++ b/OrthancFramework/Sources/DicomFormat/DicomIntegerPixelAccessor.cpp	Thu Nov 25 18:54:02 2021 +0100
@@ -88,7 +88,24 @@
        * means the order of the pixel values sent shall be R1, G1, B1,
        * R2, G2, B2, ..., etc.
        **/
-      rowOffset_ = information_.GetWidth() * information_.GetBytesPerValue() * information_.GetChannelCount();
+      if (information_.GetBitsStored() == 1)
+      {
+        if (information_.GetChannelCount() == 1 &&
+            information_.GetBitsAllocated() == 1)
+        {
+          assert(information_.GetWidth() % 8 == 0);  // Tested by DicomImageInformation
+          rowOffset_ = information_.GetWidth() / 8;
+        }
+        else
+        {
+          throw OrthancException(ErrorCode_IncompatibleImageFormat,
+                                 "Image not supported (multi-channel black-and-image image)");
+        }
+      }
+      else
+      {
+        rowOffset_ = information_.GetWidth() * information_.GetBytesPerValue() * information_.GetChannelCount();
+      }
     }
   }
 
@@ -115,7 +132,7 @@
       {
         for (unsigned int c = 0; c < channels; c++)
         {
-          int32_t v = GetValue(x, y);
+          int32_t v = GetValue(x, y, c);
           if (v < min)
             min = v;
           if (v > max)
@@ -133,53 +150,74 @@
     assert(x < information_.GetWidth() && 
            y < information_.GetHeight() && 
            channel < information_.GetChannelCount());
+
+    const uint8_t* pixel = (reinterpret_cast<const uint8_t*>(pixelData_) + 
+                            y * rowOffset_ + frame_ * frameOffset_);
     
-    const uint8_t* pixel = reinterpret_cast<const uint8_t*>(pixelData_) + 
-      y * rowOffset_ + frame_ * frameOffset_;
-
-    // http://dicom.nema.org/medical/dicom/current/output/html/part03.html#sect_C.7.6.3.1.3
-    if (information_.IsPlanar())
+    if (information_.GetBitsStored() == 1)
     {
-      /**
-       * Each color plane shall be sent contiguously. For RGB images,
-       * this means the order of the pixel values sent is R1, R2, R3,
-       * ..., G1, G2, G3, ..., B1, B2, B3, etc.
-       **/
-      assert(frameOffset_ % information_.GetChannelCount() == 0);
-      pixel += channel * frameOffset_ / information_.GetChannelCount() + x * information_.GetBytesPerValue();
+      // New in Orthanc 1.9.8, notably for DICOM SEG
+      assert(information_.GetBitsAllocated() == 1 &&
+             information_.GetChannelCount() == 1 &&
+             !information_.IsPlanar());
+      
+      uint8_t b = pixel[x / 8];
+
+      if (b & (1 << (x % 8)))
+      {
+        return 255;
+      }
+      else
+      {
+        return 0;
+      }
     }
     else
     {
-      /**
-       * The sample values for the first pixel are followed by the
-       * sample values for the second pixel, etc. For RGB images, this
-       * means the order of the pixel values sent shall be R1, G1, B1,
-       * R2, G2, B2, ..., etc.
-       **/
-      pixel += channel * information_.GetBytesPerValue() + x * information_.GetChannelCount() * information_.GetBytesPerValue();
-    }
+      // http://dicom.nema.org/medical/dicom/current/output/html/part03.html#sect_C.7.6.3.1.3
+      if (information_.IsPlanar())
+      {
+        /**
+         * Each color plane shall be sent contiguously. For RGB images,
+         * this means the order of the pixel values sent is R1, R2, R3,
+         * ..., G1, G2, G3, ..., B1, B2, B3, etc.
+         **/
+        assert(frameOffset_ % information_.GetChannelCount() == 0);
+        pixel += channel * frameOffset_ / information_.GetChannelCount() + x * information_.GetBytesPerValue();
+      }
+      else
+      {
+        /**
+         * The sample values for the first pixel are followed by the
+         * sample values for the second pixel, etc. For RGB images, this
+         * means the order of the pixel values sent shall be R1, G1, B1,
+         * R2, G2, B2, ..., etc.
+         **/
+        pixel += channel * information_.GetBytesPerValue() + x * information_.GetChannelCount() * information_.GetBytesPerValue();
+      }
 
-    uint32_t v;
-    v = pixel[0];
-    if (information_.GetBytesPerValue() >= 2)
-      v = v + (static_cast<uint32_t>(pixel[1]) << 8);
-    if (information_.GetBytesPerValue() >= 3)
-      v = v + (static_cast<uint32_t>(pixel[2]) << 16);
-    if (information_.GetBytesPerValue() >= 4)
-      v = v + (static_cast<uint32_t>(pixel[3]) << 24);
+      uint32_t v;
+      v = pixel[0];
+      if (information_.GetBytesPerValue() >= 2)
+        v = v + (static_cast<uint32_t>(pixel[1]) << 8);
+      if (information_.GetBytesPerValue() >= 3)
+        v = v + (static_cast<uint32_t>(pixel[2]) << 16);
+      if (information_.GetBytesPerValue() >= 4)
+        v = v + (static_cast<uint32_t>(pixel[3]) << 24);
 
-    v = v >> information_.GetShift();
+      v = v >> information_.GetShift();
 
-    if (v & signMask_)
-    {
-      // Signed value
-      // http://en.wikipedia.org/wiki/Two%27s_complement#Subtraction_from_2N
-      return -static_cast<int32_t>(mask_) + static_cast<int32_t>(v & mask_) - 1;
-    }
-    else
-    {
-      // Unsigned value
-      return static_cast<int32_t>(v & mask_);
+      if (v & signMask_)
+      {
+        // Signed value
+        // http://en.wikipedia.org/wiki/Two%27s_complement#Subtraction_from_2N
+        return -static_cast<int32_t>(mask_) + static_cast<int32_t>(v & mask_) - 1;
+      }
+      else
+      {
+        // Unsigned value
+        return static_cast<int32_t>(v & mask_);
+      }
     }
   }
 
--- a/OrthancFramework/Sources/DicomFormat/DicomIntegerPixelAccessor.h	Thu Nov 25 13:12:32 2021 +0100
+++ b/OrthancFramework/Sources/DicomFormat/DicomIntegerPixelAccessor.h	Thu Nov 25 18:54:02 2021 +0100
@@ -64,7 +64,9 @@
     void GetExtremeValues(int32_t& min, 
                           int32_t& max) const;
 
-    int32_t GetValue(unsigned int x, unsigned int y, unsigned int channel = 0) const;
+    int32_t GetValue(unsigned int x,
+                     unsigned int y,
+                     unsigned int channel) const;
 
     const void* GetPixelData() const
     {
--- a/OrthancFramework/Sources/DicomParsing/Internals/DicomImageDecoder.cpp	Thu Nov 25 13:12:32 2021 +0100
+++ b/OrthancFramework/Sources/DicomParsing/Internals/DicomImageDecoder.cpp	Thu Nov 25 18:54:02 2021 +0100
@@ -542,6 +542,7 @@
     bool fastVersionSuccess = false;
     PixelFormat sourceFormat;
     if (!info.IsPlanar() &&
+        info.GetBitsStored() != 1 &&  // Black-and-white image, notably DICOM SEG (new in Orthanc 1.9.8)
         info.ExtractPixelFormat(sourceFormat, false))
     {
       try
--- a/OrthancFramework/Sources/FileStorage/StorageCache.cpp	Thu Nov 25 13:12:32 2021 +0100
+++ b/OrthancFramework/Sources/FileStorage/StorageCache.cpp	Thu Nov 25 18:54:02 2021 +0100
@@ -53,9 +53,16 @@
     }
   }
 
-  void GetCacheKey(std::string& key, const std::string& uuid, FileContentType contentType)
+  bool GetCacheKey(std::string& key, const std::string& uuid, FileContentType contentType)
   {
+    if (contentType == FileContentType_Unknown || contentType >= FileContentType_StartUser)
+    {
+      return false;
+    }
+
     key = uuid + ":" + std::string(ToString(contentType));
+
+    return true;
   }
   
   void StorageCache::SetMaximumSize(size_t size)
@@ -73,8 +80,11 @@
     }
 
     std::string key;
-    GetCacheKey(key, uuid, contentType);
-    cache_.Add(key, value);
+
+    if (GetCacheKey(key, uuid, contentType))
+    {
+      cache_.Add(key, value);
+    }
   }
 
   void StorageCache::Add(const std::string& uuid, 
@@ -88,15 +98,21 @@
     }
     
     std::string key;
-    GetCacheKey(key, uuid, contentType);
-    cache_.Add(key, buffer, size);
+
+    if (GetCacheKey(key, uuid, contentType))
+    {
+      cache_.Add(key, buffer, size);
+    }
   }
 
   void StorageCache::Invalidate(const std::string& uuid, FileContentType contentType)
   {
     std::string key;
-    GetCacheKey(key, uuid, contentType);
-    cache_.Invalidate(key);
+    
+    if (GetCacheKey(key, uuid, contentType))
+    {
+      cache_.Invalidate(key);
+    }
   }
 
   bool StorageCache::Fetch(std::string& value, 
@@ -109,9 +125,12 @@
     }
 
     std::string key;
-    GetCacheKey(key, uuid, contentType);
+    if (GetCacheKey(key, uuid, contentType))
+    {
+      return cache_.Fetch(value, key);
+    }
 
-    return cache_.Fetch(value, key);
+    return false;
   }
 
 
--- a/OrthancFramework/Sources/SQLite/Connection.cpp	Thu Nov 25 13:12:32 2021 +0100
+++ b/OrthancFramework/Sources/SQLite/Connection.cpp	Thu Nov 25 18:54:02 2021 +0100
@@ -3,6 +3,7 @@
  *
  * Copyright (C) 2012-2016 Sebastien Jodogne <s.jodogne@orthanc-labs.com>,
  * Medical Physics Department, CHU of Liege, Belgium
+ * Copyright (C) 2017-2021 Osimis S.A., Belgium
  *
  * Copyright (c) 2012 The Chromium Authors. All rights reserved.
  *
--- a/OrthancFramework/Sources/SQLite/Connection.h	Thu Nov 25 13:12:32 2021 +0100
+++ b/OrthancFramework/Sources/SQLite/Connection.h	Thu Nov 25 18:54:02 2021 +0100
@@ -3,6 +3,7 @@
  *
  * Copyright (C) 2012-2016 Sebastien Jodogne <s.jodogne@orthanc-labs.com>,
  * Medical Physics Department, CHU of Liege, Belgium
+ * Copyright (C) 2017-2021 Osimis S.A., Belgium
  *
  * Copyright (c) 2012 The Chromium Authors. All rights reserved.
  *
--- a/OrthancFramework/Sources/SQLite/FunctionContext.cpp	Thu Nov 25 13:12:32 2021 +0100
+++ b/OrthancFramework/Sources/SQLite/FunctionContext.cpp	Thu Nov 25 18:54:02 2021 +0100
@@ -3,6 +3,7 @@
  *
  * Copyright (C) 2012-2016 Sebastien Jodogne <s.jodogne@orthanc-labs.com>,
  * Medical Physics Department, CHU of Liege, Belgium
+ * Copyright (C) 2017-2021 Osimis S.A., Belgium
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
--- a/OrthancFramework/Sources/SQLite/FunctionContext.h	Thu Nov 25 13:12:32 2021 +0100
+++ b/OrthancFramework/Sources/SQLite/FunctionContext.h	Thu Nov 25 18:54:02 2021 +0100
@@ -3,6 +3,7 @@
  *
  * Copyright (C) 2012-2016 Sebastien Jodogne <s.jodogne@orthanc-labs.com>,
  * Medical Physics Department, CHU of Liege, Belgium
+ * Copyright (C) 2017-2021 Osimis S.A., Belgium
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
--- a/OrthancFramework/Sources/SQLite/IScalarFunction.h	Thu Nov 25 13:12:32 2021 +0100
+++ b/OrthancFramework/Sources/SQLite/IScalarFunction.h	Thu Nov 25 18:54:02 2021 +0100
@@ -3,6 +3,7 @@
  *
  * Copyright (C) 2012-2016 Sebastien Jodogne <s.jodogne@orthanc-labs.com>,
  * Medical Physics Department, CHU of Liege, Belgium
+ * Copyright (C) 2017-2021 Osimis S.A., Belgium
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
--- a/OrthancFramework/Sources/SQLite/ITransaction.h	Thu Nov 25 13:12:32 2021 +0100
+++ b/OrthancFramework/Sources/SQLite/ITransaction.h	Thu Nov 25 18:54:02 2021 +0100
@@ -3,6 +3,7 @@
  *
  * Copyright (C) 2012-2016 Sebastien Jodogne <s.jodogne@orthanc-labs.com>,
  * Medical Physics Department, CHU of Liege, Belgium
+ * Copyright (C) 2017-2021 Osimis S.A., Belgium
  *
  * Copyright (c) 2012 The Chromium Authors. All rights reserved.
  *
--- a/OrthancFramework/Sources/SQLite/NonCopyable.h	Thu Nov 25 13:12:32 2021 +0100
+++ b/OrthancFramework/Sources/SQLite/NonCopyable.h	Thu Nov 25 18:54:02 2021 +0100
@@ -3,6 +3,7 @@
  *
  * Copyright (C) 2012-2016 Sebastien Jodogne <s.jodogne@orthanc-labs.com>,
  * Medical Physics Department, CHU of Liege, Belgium
+ * Copyright (C) 2017-2021 Osimis S.A., Belgium
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
--- a/OrthancFramework/Sources/SQLite/OrthancSQLiteException.h	Thu Nov 25 13:12:32 2021 +0100
+++ b/OrthancFramework/Sources/SQLite/OrthancSQLiteException.h	Thu Nov 25 18:54:02 2021 +0100
@@ -3,6 +3,7 @@
  *
  * Copyright (C) 2012-2016 Sebastien Jodogne <s.jodogne@orthanc-labs.com>,
  * Medical Physics Department, CHU of Liege, Belgium
+ * Copyright (C) 2017-2021 Osimis S.A., Belgium
  *
  * Copyright (c) 2012 The Chromium Authors. All rights reserved.
  *
--- a/OrthancFramework/Sources/SQLite/SQLiteTypes.h	Thu Nov 25 13:12:32 2021 +0100
+++ b/OrthancFramework/Sources/SQLite/SQLiteTypes.h	Thu Nov 25 18:54:02 2021 +0100
@@ -3,6 +3,7 @@
  *
  * Copyright (C) 2012-2016 Sebastien Jodogne <s.jodogne@orthanc-labs.com>,
  * Medical Physics Department, CHU of Liege, Belgium
+ * Copyright (C) 2017-2021 Osimis S.A., Belgium
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
--- a/OrthancFramework/Sources/SQLite/Statement.cpp	Thu Nov 25 13:12:32 2021 +0100
+++ b/OrthancFramework/Sources/SQLite/Statement.cpp	Thu Nov 25 18:54:02 2021 +0100
@@ -3,6 +3,7 @@
  *
  * Copyright (C) 2012-2016 Sebastien Jodogne <s.jodogne@orthanc-labs.com>,
  * Medical Physics Department, CHU of Liege, Belgium
+ * Copyright (C) 2017-2021 Osimis S.A., Belgium
  *
  * Copyright (c) 2012 The Chromium Authors. All rights reserved.
  *
--- a/OrthancFramework/Sources/SQLite/Statement.h	Thu Nov 25 13:12:32 2021 +0100
+++ b/OrthancFramework/Sources/SQLite/Statement.h	Thu Nov 25 18:54:02 2021 +0100
@@ -3,6 +3,7 @@
  *
  * Copyright (C) 2012-2016 Sebastien Jodogne <s.jodogne@orthanc-labs.com>,
  * Medical Physics Department, CHU of Liege, Belgium
+ * Copyright (C) 2017-2021 Osimis S.A., Belgium
  *
  * Copyright (c) 2012 The Chromium Authors. All rights reserved.
  *
--- a/OrthancFramework/Sources/SQLite/StatementId.cpp	Thu Nov 25 13:12:32 2021 +0100
+++ b/OrthancFramework/Sources/SQLite/StatementId.cpp	Thu Nov 25 18:54:02 2021 +0100
@@ -3,6 +3,7 @@
  *
  * Copyright (C) 2012-2016 Sebastien Jodogne <s.jodogne@orthanc-labs.com>,
  * Medical Physics Department, CHU of Liege, Belgium
+ * Copyright (C) 2017-2021 Osimis S.A., Belgium
  *
  * Copyright (c) 2012 The Chromium Authors. All rights reserved.
  *
--- a/OrthancFramework/Sources/SQLite/StatementId.h	Thu Nov 25 13:12:32 2021 +0100
+++ b/OrthancFramework/Sources/SQLite/StatementId.h	Thu Nov 25 18:54:02 2021 +0100
@@ -3,6 +3,7 @@
  *
  * Copyright (C) 2012-2016 Sebastien Jodogne <s.jodogne@orthanc-labs.com>,
  * Medical Physics Department, CHU of Liege, Belgium
+ * Copyright (C) 2017-2021 Osimis S.A., Belgium
  *
  * Copyright (c) 2012 The Chromium Authors. All rights reserved.
  *
--- a/OrthancFramework/Sources/SQLite/StatementReference.cpp	Thu Nov 25 13:12:32 2021 +0100
+++ b/OrthancFramework/Sources/SQLite/StatementReference.cpp	Thu Nov 25 18:54:02 2021 +0100
@@ -3,6 +3,7 @@
  *
  * Copyright (C) 2012-2016 Sebastien Jodogne <s.jodogne@orthanc-labs.com>,
  * Medical Physics Department, CHU of Liege, Belgium
+ * Copyright (C) 2017-2021 Osimis S.A., Belgium
  *
  * Copyright (c) 2012 The Chromium Authors. All rights reserved.
  *
--- a/OrthancFramework/Sources/SQLite/StatementReference.h	Thu Nov 25 13:12:32 2021 +0100
+++ b/OrthancFramework/Sources/SQLite/StatementReference.h	Thu Nov 25 18:54:02 2021 +0100
@@ -3,6 +3,7 @@
  *
  * Copyright (C) 2012-2016 Sebastien Jodogne <s.jodogne@orthanc-labs.com>,
  * Medical Physics Department, CHU of Liege, Belgium
+ * Copyright (C) 2017-2021 Osimis S.A., Belgium
  *
  * Copyright (c) 2012 The Chromium Authors. All rights reserved.
  *
--- a/OrthancFramework/Sources/SQLite/Transaction.cpp	Thu Nov 25 13:12:32 2021 +0100
+++ b/OrthancFramework/Sources/SQLite/Transaction.cpp	Thu Nov 25 18:54:02 2021 +0100
@@ -3,6 +3,7 @@
  *
  * Copyright (C) 2012-2016 Sebastien Jodogne <s.jodogne@orthanc-labs.com>,
  * Medical Physics Department, CHU of Liege, Belgium
+ * Copyright (C) 2017-2021 Osimis S.A., Belgium
  *
  * Copyright (c) 2012 The Chromium Authors. All rights reserved.
  *
--- a/OrthancFramework/Sources/SQLite/Transaction.h	Thu Nov 25 13:12:32 2021 +0100
+++ b/OrthancFramework/Sources/SQLite/Transaction.h	Thu Nov 25 18:54:02 2021 +0100
@@ -3,6 +3,7 @@
  *
  * Copyright (C) 2012-2016 Sebastien Jodogne <s.jodogne@orthanc-labs.com>,
  * Medical Physics Department, CHU of Liege, Belgium
+ * Copyright (C) 2017-2021 Osimis S.A., Belgium
  *
  * Copyright (c) 2012 The Chromium Authors. All rights reserved.
  *
--- a/OrthancServer/Resources/Samples/CppHelpers/Logging/ILogger.h	Thu Nov 25 13:12:32 2021 +0100
+++ b/OrthancServer/Resources/Samples/CppHelpers/Logging/ILogger.h	Thu Nov 25 18:54:02 2021 +0100
@@ -1,3 +1,24 @@
+/**
+ * Orthanc - A Lightweight, RESTful DICOM Store
+ * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
+ * Department, University Hospital of Liege, Belgium
+ * Copyright (C) 2017-2021 Osimis S.A., 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.
+ *
+ * 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 <string>
--- a/OrthancServer/Resources/Samples/CppHelpers/Logging/NullLogger.h	Thu Nov 25 13:12:32 2021 +0100
+++ b/OrthancServer/Resources/Samples/CppHelpers/Logging/NullLogger.h	Thu Nov 25 18:54:02 2021 +0100
@@ -1,3 +1,24 @@
+/**
+ * Orthanc - A Lightweight, RESTful DICOM Store
+ * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
+ * Department, University Hospital of Liege, Belgium
+ * Copyright (C) 2017-2021 Osimis S.A., 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.
+ *
+ * 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 "ILogger.h"
--- a/OrthancServer/Resources/Samples/CppHelpers/Logging/OrthancLogger.cpp	Thu Nov 25 13:12:32 2021 +0100
+++ b/OrthancServer/Resources/Samples/CppHelpers/Logging/OrthancLogger.cpp	Thu Nov 25 18:54:02 2021 +0100
@@ -1,3 +1,24 @@
+/**
+ * Orthanc - A Lightweight, RESTful DICOM Store
+ * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
+ * Department, University Hospital of Liege, Belgium
+ * Copyright (C) 2017-2021 Osimis S.A., 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.
+ *
+ * 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 "OrthancLogger.h"
 #include "Logging.h"
 
--- a/OrthancServer/Resources/Samples/CppHelpers/Logging/OrthancLogger.h	Thu Nov 25 13:12:32 2021 +0100
+++ b/OrthancServer/Resources/Samples/CppHelpers/Logging/OrthancLogger.h	Thu Nov 25 18:54:02 2021 +0100
@@ -1,3 +1,24 @@
+/**
+ * Orthanc - A Lightweight, RESTful DICOM Store
+ * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
+ * Department, University Hospital of Liege, Belgium
+ * Copyright (C) 2017-2021 Osimis S.A., 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.
+ *
+ * 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 "ILogger.h"
--- a/OrthancServer/Resources/Samples/CppHelpers/Logging/OrthancPluginLogger.cpp	Thu Nov 25 13:12:32 2021 +0100
+++ b/OrthancServer/Resources/Samples/CppHelpers/Logging/OrthancPluginLogger.cpp	Thu Nov 25 18:54:02 2021 +0100
@@ -1,3 +1,24 @@
+/**
+ * Orthanc - A Lightweight, RESTful DICOM Store
+ * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
+ * Department, University Hospital of Liege, Belgium
+ * Copyright (C) 2017-2021 Osimis S.A., 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.
+ *
+ * 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 "OrthancPluginLogger.h"
 
 namespace OrthancHelpers
--- a/OrthancServer/Resources/Samples/CppHelpers/Logging/OrthancPluginLogger.h	Thu Nov 25 13:12:32 2021 +0100
+++ b/OrthancServer/Resources/Samples/CppHelpers/Logging/OrthancPluginLogger.h	Thu Nov 25 18:54:02 2021 +0100
@@ -1,3 +1,24 @@
+/**
+ * Orthanc - A Lightweight, RESTful DICOM Store
+ * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
+ * Department, University Hospital of Liege, Belgium
+ * Copyright (C) 2017-2021 Osimis S.A., 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.
+ *
+ * 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 "ILogger.h"