# HG changeset patch # User Sebastien Jodogne # Date 1573817735 -3600 # Node ID 2da8b4d6f8c1135a2efed6e0b3d9564a5289ca41 # Parent 5e164c629923fe39455bdcffed3169b33470a371 renamed ParsedDicomFileCache as ParsedDicomCache diff -r 5e164c629923 -r 2da8b4d6f8c1 Framework/Oracle/GenericOracleRunner.cpp --- a/Framework/Oracle/GenericOracleRunner.cpp Fri Nov 15 10:42:16 2019 +0100 +++ b/Framework/Oracle/GenericOracleRunner.cpp Fri Nov 15 12:35:35 2019 +0100 @@ -217,7 +217,6 @@ c = a / b; } - LOG(TRACE) << "Oracle reading file: " << c.string(); return c.string(); } @@ -228,6 +227,7 @@ const ReadFileCommand& command) { std::string path = GetPath(root, command.GetPath()); + LOG(TRACE) << "Oracle reading file: " << path; std::string content; Orthanc::SystemToolbox::ReadFile(content, path, true /* log */); @@ -262,7 +262,7 @@ } LOG(TRACE) << "Parsing DICOM file, " - << (command.IsPixelDataIncluded() ? "with" : "witout") + << (command.IsPixelDataIncluded() ? "with" : "without") << " pixel data: " << path; boost::posix_time::ptime start = boost::posix_time::microsec_clock::local_time(); diff -r 5e164c629923 -r 2da8b4d6f8c1 Framework/Toolbox/ParsedDicomCache.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Framework/Toolbox/ParsedDicomCache.cpp Fri Nov 15 12:35:35 2019 +0100 @@ -0,0 +1,137 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2019 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#include "ParsedDicomCache.h" + +namespace OrthancStone +{ + class ParsedDicomCache::Item : public Orthanc::ICacheable + { + private: + boost::mutex mutex_; + std::auto_ptr dicom_; + size_t fileSize_; + bool hasPixelData_; + + public: + Item(Orthanc::ParsedDicomFile* dicom, + size_t fileSize, + bool hasPixelData) : + dicom_(dicom), + fileSize_(fileSize), + hasPixelData_(hasPixelData) + { + if (dicom == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + } + + boost::mutex& GetMutex() + { + return mutex_; + } + + virtual size_t GetMemoryUsage() const + { + return fileSize_; + } + + Orthanc::ParsedDicomFile& GetDicom() const + { + assert(dicom_.get() != NULL); + return *dicom_; + } + + bool HasPixelData() const + { + return hasPixelData_; + } + }; + + + void ParsedDicomCache::Acquire(const std::string& key, + Orthanc::ParsedDicomFile* dicom, + size_t fileSize, + bool hasPixelData) + { + cache_.Acquire(key, new Item(dicom, fileSize, hasPixelData)); + } + + + ParsedDicomCache::Reader::Reader(ParsedDicomCache& cache, + const std::string& key) : + /** + * The "DcmFileFormat" object cannot be accessed from multiple + * threads, even if using only getters. An unique lock (mutex) is + * mandatory. + **/ + accessor_(cache.cache_, key, true /* unique */) + { + if (accessor_.IsValid()) + { + item_ = &dynamic_cast(accessor_.GetValue()); + } + else + { + item_ = NULL; + } + } + + + bool ParsedDicomCache::Reader::HasPixelData() const + { + if (item_ == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + return item_->HasPixelData(); + } + } + + + Orthanc::ParsedDicomFile& ParsedDicomCache::Reader::GetDicom() const + { + if (item_ == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + return item_->GetDicom(); + } + } + + + size_t ParsedDicomCache::Reader::GetFileSize() const + { + if (item_ == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + return item_->GetMemoryUsage(); + } + } +} diff -r 5e164c629923 -r 2da8b4d6f8c1 Framework/Toolbox/ParsedDicomCache.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Framework/Toolbox/ParsedDicomCache.h Fri Nov 15 12:35:35 2019 +0100 @@ -0,0 +1,74 @@ +/** + * Stone of Orthanc + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2019 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero 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 + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + **/ + + +#pragma once + +#include +#include + +namespace OrthancStone +{ + class ParsedDicomCache : public boost::noncopyable + { + private: + class Item; + + Orthanc::MemoryObjectCache cache_; + + public: + ParsedDicomCache(size_t size) + { + cache_.SetMaximumSize(size); + } + + void Invalidate(const std::string& key) + { + cache_.Invalidate(key); + } + + void Acquire(const std::string& key, + Orthanc::ParsedDicomFile* dicom, + size_t fileSize, + bool hasPixelData); + + class Reader : public boost::noncopyable + { + private: + Orthanc::MemoryObjectCache::Accessor accessor_; + Item* item_; + + public: + Reader(ParsedDicomCache& cache, + const std::string& key); + + bool IsValid() const + { + return item_ != NULL; + } + + bool HasPixelData() const; + + Orthanc::ParsedDicomFile& GetDicom() const; + + size_t GetFileSize() const; + }; + }; +} diff -r 5e164c629923 -r 2da8b4d6f8c1 Framework/Toolbox/ParsedDicomFileCache.cpp --- a/Framework/Toolbox/ParsedDicomFileCache.cpp Fri Nov 15 10:42:16 2019 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,137 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2019 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#include "ParsedDicomFileCache.h" - -namespace OrthancStone -{ - class ParsedDicomFileCache::Item : public Orthanc::ICacheable - { - private: - boost::mutex mutex_; - std::auto_ptr dicom_; - size_t fileSize_; - bool hasPixelData_; - - public: - Item(Orthanc::ParsedDicomFile* dicom, - size_t fileSize, - bool hasPixelData) : - dicom_(dicom), - fileSize_(fileSize), - hasPixelData_(hasPixelData) - { - if (dicom == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); - } - } - - boost::mutex& GetMutex() - { - return mutex_; - } - - virtual size_t GetMemoryUsage() const - { - return fileSize_; - } - - Orthanc::ParsedDicomFile& GetDicom() const - { - assert(dicom_.get() != NULL); - return *dicom_; - } - - bool HasPixelData() const - { - return hasPixelData_; - } - }; - - - void ParsedDicomFileCache::Acquire(const std::string& path, - Orthanc::ParsedDicomFile* dicom, - size_t fileSize, - bool hasPixelData) - { - cache_.Acquire(path, new Item(dicom, fileSize, hasPixelData)); - } - - - ParsedDicomFileCache::Reader::Reader(ParsedDicomFileCache& cache, - const std::string& path) : - /** - * The "DcmFileFormat" object cannot be accessed from multiple - * threads, even if using only getters. An unique lock (mutex) is - * mandatory. - **/ - accessor_(cache.cache_, path, true /* unique */) - { - if (accessor_.IsValid()) - { - item_ = &dynamic_cast(accessor_.GetValue()); - } - else - { - item_ = NULL; - } - } - - - bool ParsedDicomFileCache::Reader::HasPixelData() const - { - if (item_ == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else - { - return item_->HasPixelData(); - } - } - - - Orthanc::ParsedDicomFile& ParsedDicomFileCache::Reader::GetDicom() const - { - if (item_ == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else - { - return item_->GetDicom(); - } - } - - - size_t ParsedDicomFileCache::Reader::GetFileSize() const - { - if (item_ == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } - else - { - return item_->GetMemoryUsage(); - } - } -} diff -r 5e164c629923 -r 2da8b4d6f8c1 Framework/Toolbox/ParsedDicomFileCache.h --- a/Framework/Toolbox/ParsedDicomFileCache.h Fri Nov 15 10:42:16 2019 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,74 +0,0 @@ -/** - * Stone of Orthanc - * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics - * Department, University Hospital of Liege, Belgium - * Copyright (C) 2017-2019 Osimis S.A., Belgium - * - * This program is free software: you can redistribute it and/or - * modify it under the terms of the GNU Affero 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 - * Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - **/ - - -#pragma once - -#include -#include - -namespace OrthancStone -{ - class ParsedDicomFileCache : public boost::noncopyable - { - private: - class Item; - - Orthanc::MemoryObjectCache cache_; - - public: - ParsedDicomFileCache(size_t size) - { - cache_.SetMaximumSize(size); - } - - void Invalidate(const std::string& path) - { - cache_.Invalidate(path); - } - - void Acquire(const std::string& path, - Orthanc::ParsedDicomFile* dicom, - size_t fileSize, - bool hasPixelData); - - class Reader : public boost::noncopyable - { - private: - Orthanc::MemoryObjectCache::Accessor accessor_; - Item* item_; - - public: - Reader(ParsedDicomFileCache& cache, - const std::string& path); - - bool IsValid() const - { - return item_ != NULL; - } - - bool HasPixelData() const; - - Orthanc::ParsedDicomFile& GetDicom() const; - - size_t GetFileSize() const; - }; - }; -} diff -r 5e164c629923 -r 2da8b4d6f8c1 Resources/CMake/OrthancStoneConfiguration.cmake --- a/Resources/CMake/OrthancStoneConfiguration.cmake Fri Nov 15 10:42:16 2019 +0100 +++ b/Resources/CMake/OrthancStoneConfiguration.cmake Fri Nov 15 12:35:35 2019 +0100 @@ -402,7 +402,7 @@ if (ENABLE_DCMTK) list(APPEND ORTHANC_STONE_SOURCES ${ORTHANC_STONE_ROOT}/Framework/Oracle/ParseDicomFileCommand.cpp - ${ORTHANC_STONE_ROOT}/Framework/Toolbox/ParsedDicomFileCache.cpp + ${ORTHANC_STONE_ROOT}/Framework/Toolbox/ParsedDicomCache.cpp ) endif()