This is an automated email from the git hooks/post-receive script. jodogne-guest pushed a commit to branch master in repository orthanc.
commit 8bc80999ae67209b8fc78b1f7da5e5adb15b519a Author: jodogne-guest <s.jodo...@gmail.com> Date: Fri Dec 11 08:56:33 2015 +0100 Imported Upstream version 0.9.6+dfsg --- .hg_archival.txt | 6 ++--- CMakeLists.txt | 2 +- Core/HttpServer/HttpOutput.cpp | 2 +- NEWS | 11 +++++++++ OrthancServer/FromDcmtkBridge.cpp | 21 +++++++++++++---- OrthancServer/Search/HierarchicalMatcher.cpp | 6 ++--- OrthancServer/ServerToolbox.cpp | 32 ++++++++++++++++++-------- OrthancServer/SliceOrdering.cpp | 13 ++++++++++- OrthancServer/main.cpp | 34 +++++++++++++++++++++++++--- Resources/Configuration.json | 2 +- 10 files changed, 102 insertions(+), 27 deletions(-) diff --git a/.hg_archival.txt b/.hg_archival.txt index a3a599b..2cc1f3b 100644 --- a/.hg_archival.txt +++ b/.hg_archival.txt @@ -1,5 +1,5 @@ repo: 3959d33612ccaadc0d4d707227fbed09ac35e5fe -node: 2684ded7c7b3a0176af645476eb9ad56a36e48e4 -branch: Orthanc-0.9.5 +node: b4e8a031b0d86caf89e1a99fb7b86bb94d00c6a8 +branch: Orthanc-0.9.6 latesttag: null -latesttagdistance: 1598 +latesttagdistance: 1612 diff --git a/CMakeLists.txt b/CMakeLists.txt index b2058ca..2737e27 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 2.8) project(Orthanc) # Version of the build, should always be "mainline" except in release branches -set(ORTHANC_VERSION "0.9.5") +set(ORTHANC_VERSION "0.9.6") # Version of the database schema. History: # * Orthanc 0.1.0 -> Orthanc 0.3.0 = no versioning diff --git a/Core/HttpServer/HttpOutput.cpp b/Core/HttpServer/HttpOutput.cpp index 80f1770..d28ae80 100644 --- a/Core/HttpServer/HttpOutput.cpp +++ b/Core/HttpServer/HttpOutput.cpp @@ -463,7 +463,7 @@ namespace Orthanc stream_.Send(false, item, length); } - stream_.Send(false, "\r\n", 1); + stream_.Send(false, "\r\n", 2); } diff --git a/NEWS b/NEWS index 01c7329..b762a16 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,17 @@ Pending changes in the mainline =============================== +Version 0.9.6 (2015/12/08) +========================== + +* Promiscuous mode (accept unknown SOP class UID) is now turned off by default +* Fix serialization of DICOM buffers that might contain garbage trailing +* Fix modality worklists server if some fields are null +* More tolerant "/series/.../ordered-slices" with broken series +* Improved logging information if upgrade fails +* Fix formatting of multipart HTTP answers (bis) + + Version 0.9.5 (2015/12/02) ========================== diff --git a/OrthancServer/FromDcmtkBridge.cpp b/OrthancServer/FromDcmtkBridge.cpp index 019d59c..581fa7b 100644 --- a/OrthancServer/FromDcmtkBridge.cpp +++ b/OrthancServer/FromDcmtkBridge.cpp @@ -1040,9 +1040,12 @@ namespace Orthanc ff.removeInvalidGroups(); // Create a memory buffer with the proper size - uint32_t s = ff.calcElementLength(xfer, encodingType); - buffer.resize(s); - DcmOutputBufferStream ob(&buffer[0], s); + { + const uint32_t estimatedSize = ff.calcElementLength(xfer, encodingType); // (*) + buffer.resize(estimatedSize); + } + + DcmOutputBufferStream ob(&buffer[0], buffer.size()); // Fill the memory buffer with the meta-header and the dataset ff.transferInit(); @@ -1051,13 +1054,23 @@ namespace Orthanc /*opt_paddingType*/ EPD_withoutPadding); ff.transferEnd(); - // Handle errors if (c.good()) { + // The DICOM file is successfully written, truncate the target + // buffer if its size was overestimated by (*) + ob.flush(); + + size_t effectiveSize = static_cast<size_t>(ob.tell()); + if (effectiveSize < buffer.size()) + { + buffer.resize(effectiveSize); + } + return true; } else { + // Error buffer.clear(); return false; } diff --git a/OrthancServer/Search/HierarchicalMatcher.cpp b/OrthancServer/Search/HierarchicalMatcher.cpp index 2b3a81e..115c9f0 100644 --- a/OrthancServer/Search/HierarchicalMatcher.cpp +++ b/OrthancServer/Search/HierarchicalMatcher.cpp @@ -123,12 +123,12 @@ namespace Orthanc std::auto_ptr<DicomValue> value(FromDcmtkBridge::ConvertLeafElement (*element, DicomToJsonFlags_None, encoding)); - if (value->IsBinary() || - value->IsNull()) + if (value->IsBinary()) { throw OrthancException(ErrorCode_BadRequest); } - else if (value->GetContent().empty()) + else if (value->IsNull() || + value->GetContent().empty()) { // This is an universal matcher constraints_[tag] = NULL; diff --git a/OrthancServer/ServerToolbox.cpp b/OrthancServer/ServerToolbox.cpp index 201b463..afd7532 100644 --- a/OrthancServer/ServerToolbox.cpp +++ b/OrthancServer/ServerToolbox.cpp @@ -322,6 +322,8 @@ namespace Orthanc tmp != level || !FindOneChildInstance(instance, database, resource, level)) { + LOG(ERROR) << "Cannot find an instance for " << EnumerationToString(level) + << " with identifier " << *it; throw OrthancException(ErrorCode_InternalError); } @@ -329,23 +331,33 @@ namespace Orthanc FileInfo attachment; if (!database.LookupAttachment(attachment, instance, FileContentType_Dicom)) { + LOG(ERROR) << "Cannot retrieve the DICOM file associated with instance " << database.GetPublicId(instance); throw OrthancException(ErrorCode_InternalError); } - // Read and parse the content of the DICOM file - StorageAccessor accessor(storageArea); + try + { + // Read and parse the content of the DICOM file + StorageAccessor accessor(storageArea); - std::string content; - accessor.Read(content, attachment); + std::string content; + accessor.Read(content, attachment); - ParsedDicomFile dicom(content); + ParsedDicomFile dicom(content); - // Update the tags of this resource - DicomMap dicomSummary; - dicom.Convert(dicomSummary); + // Update the tags of this resource + DicomMap dicomSummary; + dicom.Convert(dicomSummary); - database.ClearMainDicomTags(resource); - Toolbox::SetMainDicomTags(database, resource, level, dicomSummary); + database.ClearMainDicomTags(resource); + Toolbox::SetMainDicomTags(database, resource, level, dicomSummary); + } + catch (OrthancException&) + { + LOG(ERROR) << "Cannot decode the DICOM file with UUID " << attachment.GetUuid() + << " associated with instance " << database.GetPublicId(instance); + throw; + } } } } diff --git a/OrthancServer/SliceOrdering.cpp b/OrthancServer/SliceOrdering.cpp index efeb1e5..0b7266f 100644 --- a/OrthancServer/SliceOrdering.cpp +++ b/OrthancServer/SliceOrdering.cpp @@ -320,7 +320,8 @@ namespace Orthanc if (instances_[i - 1]->GetIndexInSeries() == instances_[i]->GetIndexInSeries()) { // The current "IndexInSeries" occurs 2 times: Not a proper ordering - return false; + LOG(WARNING) << "This series contains 2 slices with the same index, trying to display it anyway"; + break; } } @@ -398,6 +399,8 @@ namespace Orthanc result["Dicom"] = tmp; + Json::Value slicesShort = Json::arrayValue; + tmp.clear(); for (size_t i = 0; i < GetInstancesCount(); i++) { @@ -406,8 +409,16 @@ namespace Orthanc { tmp.append(base + "/frames/" + boost::lexical_cast<std::string>(j)); } + + Json::Value tmp2 = Json::arrayValue; + tmp2.append(GetInstanceId(i)); + tmp2.append(0); + tmp2.append(GetFramesCount(i)); + + slicesShort.append(tmp2); } result["Slices"] = tmp; + result["SlicesShort"] = slicesShort; } } diff --git a/OrthancServer/main.cpp b/OrthancServer/main.cpp index 3e8ee6b..8c6d613 100644 --- a/OrthancServer/main.cpp +++ b/OrthancServer/main.cpp @@ -269,7 +269,7 @@ public: } } - return Configuration::GetGlobalBoolParameter(configuration, true); + return Configuration::GetGlobalBoolParameter(configuration, false); } }; @@ -835,7 +835,17 @@ static bool UpgradeDatabase(IDatabaseWrapper& database, LOG(WARNING) << "Upgrading the database from schema version " << currentVersion << " to " << ORTHANC_DATABASE_VERSION; - database.Upgrade(ORTHANC_DATABASE_VERSION, storageArea); + + try + { + database.Upgrade(ORTHANC_DATABASE_VERSION, storageArea); + } + catch (OrthancException&) + { + LOG(ERROR) << "Unable to run the automated upgrade, please use the replication instructions: " + << "https://orthanc.chu.ulg.ac.be/book/users/replication.html"; + throw; + } // Sanity check currentVersion = database.GetDatabaseVersion(); @@ -1099,7 +1109,25 @@ int main(int argc, char* argv[]) * Launch Orthanc. **/ - LOG(WARNING) << "Orthanc version: " << ORTHANC_VERSION; + { + std::string version(ORTHANC_VERSION); + + if (std::string(ORTHANC_VERSION) == "mainline") + { + try + { + boost::filesystem::path exe(Toolbox::GetPathToExecutable()); + std::time_t creation = boost::filesystem::last_write_time(exe); + boost::posix_time::ptime converted(boost::posix_time::from_time_t(creation)); + version += " (" + boost::posix_time::to_iso_string(converted) + ")"; + } + catch (...) + { + } + } + + LOG(WARNING) << "Orthanc version: " << version; + } int status = 0; try diff --git a/Resources/Configuration.json b/Resources/Configuration.json index 3f39293..024347f 100644 --- a/Resources/Configuration.json +++ b/Resources/Configuration.json @@ -104,7 +104,7 @@ // Whether Orthanc accepts to act as C-Store SCP for unknown storage // SOP classes (aka. "promiscuous mode") - "UnknownSopClassAccepted" : true, + "UnknownSopClassAccepted" : false, -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/orthanc.git _______________________________________________ debian-med-commit mailing list debian-med-commit@lists.alioth.debian.org http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/debian-med-commit