Mercurial > hg > orthanc
changeset 619:70d0f27e5bd3 find-move-scp
refactoring
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Fri, 25 Oct 2013 11:57:30 +0200 |
parents | 5ab377df6d8b |
children | 4aa6f0d79947 |
files | CMakeLists.txt OrthancServer/OrthancMoveRequestHandler.cpp OrthancServer/OrthancMoveRequestHandler.h OrthancServer/main.cpp |
diffstat | 4 files changed, 238 insertions(+), 148 deletions(-) [+] |
line wrap: on
line diff
--- a/CMakeLists.txt Fri Oct 25 11:50:17 2013 +0200 +++ b/CMakeLists.txt Fri Oct 25 11:57:30 2013 +0200 @@ -210,6 +210,7 @@ OrthancServer/ServerEnumerations.cpp OrthancServer/ServerToolbox.cpp OrthancServer/OrthancFindRequestHandler.cpp + OrthancServer/OrthancMoveRequestHandler.cpp ) # Ensure autogenerated code is built before building ServerLibrary
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancServer/OrthancMoveRequestHandler.cpp Fri Oct 25 11:57:30 2013 +0200 @@ -0,0 +1,179 @@ +/** + * 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 "OrthancMoveRequestHandler.h" + +#include <glog/logging.h> + +#include "DicomProtocol/DicomUserConnection.h" +#include "OrthancInitialization.h" + +namespace Orthanc +{ + namespace + { + // Anonymous namespace to avoid clashes between compilation modules + + class OrthancMoveRequestIterator : public IMoveRequestIterator + { + private: + ServerContext& context_; + std::vector<std::string> instances_; + DicomUserConnection connection_; + size_t position_; + + public: + OrthancMoveRequestIterator(ServerContext& context, + const std::string& target, + const std::string& publicId) : + context_(context), + position_(0) + { + LOG(INFO) << "Sending resource " << publicId << " to modality \"" << target << "\""; + + std::list<std::string> tmp; + context_.GetIndex().GetChildInstances(tmp, publicId); + + instances_.reserve(tmp.size()); + for (std::list<std::string>::iterator it = tmp.begin(); it != tmp.end(); it++) + { + instances_.push_back(*it); + } + + ConnectToModalityUsingAETitle(connection_, target); + } + + virtual unsigned int GetSubOperationCount() const + { + return instances_.size(); + } + + virtual Status DoNext() + { + if (position_ >= instances_.size()) + { + return Status_Failure; + } + + const std::string& id = instances_[position_++]; + + std::string dicom; + context_.ReadFile(dicom, id, FileContentType_Dicom); + connection_.Store(dicom); + + return Status_Success; + } + }; + } + + + bool OrthancMoveRequestHandler::LookupResource(std::string& publicId, + DicomTag tag, + const DicomMap& input) + { + if (!input.HasTag(tag)) + { + return false; + } + + std::string value = input.GetValue(tag).AsString(); + + std::list<std::string> ids; + context_.GetIndex().LookupTagValue(ids, tag, value); + + if (ids.size() != 1) + { + return false; + } + else + { + publicId = ids.front(); + return true; + } + } + + + IMoveRequestIterator* OrthancMoveRequestHandler::Handle(const std::string& target, + const DicomMap& input) + { + LOG(WARNING) << "Move-SCU request received for AET \"" << target << "\""; + + + /** + * Retrieve the query level. + **/ + + const DicomValue* levelTmp = input.TestAndGetValue(DICOM_TAG_QUERY_RETRIEVE_LEVEL); + if (levelTmp == NULL) + { + throw OrthancException(ErrorCode_BadRequest); + } + + ResourceType level = StringToResourceType(levelTmp->AsString().c_str()); + + + /** + * Lookup for the resource to be sent. + **/ + + bool ok; + std::string publicId; + + switch (level) + { + case ResourceType_Patient: + ok = LookupResource(publicId, DICOM_TAG_PATIENT_ID, input); + break; + + case ResourceType_Study: + ok = LookupResource(publicId, DICOM_TAG_STUDY_INSTANCE_UID, input); + break; + + case ResourceType_Series: + ok = LookupResource(publicId, DICOM_TAG_SERIES_INSTANCE_UID, input); + break; + + case ResourceType_Instance: + ok = LookupResource(publicId, DICOM_TAG_SOP_INSTANCE_UID, input); + break; + + default: + ok = false; + } + + if (!ok) + { + throw OrthancException(ErrorCode_BadRequest); + } + + return new OrthancMoveRequestIterator(context_, target, publicId); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancServer/OrthancMoveRequestHandler.h Fri Oct 25 11:57:30 2013 +0200 @@ -0,0 +1,57 @@ +/** + * 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 "DicomProtocol/IMoveRequestHandler.h" +#include "ServerContext.h" + +namespace Orthanc +{ + class OrthancMoveRequestHandler : public IMoveRequestHandler + { + private: + ServerContext& context_; + + bool LookupResource(std::string& publicId, + DicomTag tag, + const DicomMap& input); + + public: + OrthancMoveRequestHandler(ServerContext& context) : + context_(context) + { + } + + virtual IMoveRequestIterator* Handle(const std::string& target, + const DicomMap& input); + }; +}
--- a/OrthancServer/main.cpp Fri Oct 25 11:50:17 2013 +0200 +++ b/OrthancServer/main.cpp Fri Oct 25 11:57:30 2013 +0200 @@ -45,6 +45,7 @@ #include "OrthancInitialization.h" #include "ServerContext.h" #include "OrthancFindRequestHandler.h" +#include "OrthancMoveRequestHandler.h" using namespace Orthanc; @@ -75,154 +76,6 @@ -class OrthancMoveRequestIterator : public IMoveRequestIterator -{ -private: - ServerContext& context_; - std::vector<std::string> instances_; - DicomUserConnection connection_; - size_t position_; - -public: - OrthancMoveRequestIterator(ServerContext& context, - const std::string& target, - const std::string& publicId) : - context_(context), - position_(0) - { - LOG(INFO) << "Sending resource " << publicId << " to modality \"" << target << "\""; - - std::list<std::string> tmp; - context_.GetIndex().GetChildInstances(tmp, publicId); - - instances_.reserve(tmp.size()); - for (std::list<std::string>::iterator it = tmp.begin(); it != tmp.end(); it++) - { - instances_.push_back(*it); - } - - ConnectToModalityUsingAETitle(connection_, target); - } - - virtual unsigned int GetSubOperationCount() const - { - return instances_.size(); - } - - virtual Status DoNext() - { - if (position_ >= instances_.size()) - { - return Status_Failure; - } - - const std::string& id = instances_[position_++]; - - std::string dicom; - context_.ReadFile(dicom, id, FileContentType_Dicom); - connection_.Store(dicom); - - return Status_Success; - } -}; - - - -class OrthancMoveRequestHandler : public IMoveRequestHandler -{ -private: - ServerContext& context_; - - bool LookupResource(std::string& publicId, - DicomTag tag, - const DicomMap& input) - { - if (!input.HasTag(tag)) - { - return false; - } - - std::string value = input.GetValue(tag).AsString(); - - std::list<std::string> ids; - context_.GetIndex().LookupTagValue(ids, tag, value); - - if (ids.size() != 1) - { - return false; - } - else - { - publicId = ids.front(); - return true; - } - } - -public: - OrthancMoveRequestHandler(ServerContext& context) : - context_(context) - { - } - -public: - virtual IMoveRequestIterator* Handle(const std::string& target, - const DicomMap& input) - { - LOG(WARNING) << "Move-SCU request received for AET \"" << target << "\""; - - - /** - * Retrieve the query level. - **/ - - const DicomValue* levelTmp = input.TestAndGetValue(DICOM_TAG_QUERY_RETRIEVE_LEVEL); - if (levelTmp == NULL) - { - throw OrthancException(ErrorCode_BadRequest); - } - - ResourceType level = StringToResourceType(levelTmp->AsString().c_str()); - - - /** - * Lookup for the resource to be sent. - **/ - - bool ok; - std::string publicId; - - switch (level) - { - case ResourceType_Patient: - ok = LookupResource(publicId, DICOM_TAG_PATIENT_ID, input); - break; - - case ResourceType_Study: - ok = LookupResource(publicId, DICOM_TAG_STUDY_INSTANCE_UID, input); - break; - - case ResourceType_Series: - ok = LookupResource(publicId, DICOM_TAG_SERIES_INSTANCE_UID, input); - break; - - case ResourceType_Instance: - ok = LookupResource(publicId, DICOM_TAG_SOP_INSTANCE_UID, input); - break; - - default: - ok = false; - } - - if (!ok) - { - throw OrthancException(ErrorCode_BadRequest); - } - - return new OrthancMoveRequestIterator(context_, target, publicId); - } -}; - - class MyDicomServerFactory : public IStoreRequestHandlerFactory, public IFindRequestHandlerFactory,