1 /**
2  * Orthanc - A Lightweight, RESTful DICOM Store
3  * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
4  * Department, University Hospital of Liege, Belgium
5  * Copyright (C) 2017-2021 Osimis S.A., Belgium
6  *
7  * This program is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License as
9  * published by the Free Software Foundation, either version 3 of the
10  * License, or (at your option) any later version.
11  *
12  * In addition, as a special exception, the copyright holders of this
13  * program give permission to link the code of its release with the
14  * OpenSSL project's "OpenSSL" library (or with modified versions of it
15  * that use the same license as the "OpenSSL" library), and distribute
16  * the linked executables. You must obey the GNU General Public License
17  * in all respects for all of the code used other than "OpenSSL". If you
18  * modify file(s) with this exception, you may extend this exception to
19  * your version of the file(s), but you are not obligated to do so. If
20  * you do not wish to do so, delete this exception statement from your
21  * version. If you delete this exception statement from all source files
22  * in the program, then also delete it here.
23  *
24  * This program is distributed in the hope that it will be useful, but
25  * WITHOUT ANY WARRANTY; without even the implied warranty of
26  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
27  * General Public License for more details.
28  *
29  * You should have received a copy of the GNU General Public License
30  * along with this program. If not, see <http://www.gnu.org/licenses/>.
31  **/
32 
33 #pragma once
34 
35 #include "../../OrthancFramework/Sources/Compatibility.h"  // For ORTHANC_OVERRIDE
36 #include "../../OrthancFramework/Sources/DicomNetworking/IGetRequestHandler.h"
37 #include "../../OrthancFramework/Sources/DicomNetworking/RemoteModalityParameters.h"
38 
39 #include <dcmtk/dcmnet/dimse.h>
40 
41 #include <list>
42 
43 class DcmFileFormat;
44 
45 namespace Orthanc
46 {
47   class ServerContext;
48 
49   class OrthancGetRequestHandler : public IGetRequestHandler
50   {
51   private:
52     ServerContext& context_;
53     std::string localAet_;
54     std::vector<std::string> instances_;
55     size_t position_;
56     std::string originatorAet_;
57 
58     unsigned int completedCount_;
59     unsigned int warningCount_;
60     unsigned int failedCount_;
61     std::string failedUIDs_;
62 
63     uint32_t timeout_;
64     bool allowTranscoding_;
65 
66     bool LookupIdentifiers(std::list<std::string>& publicIds,
67                            ResourceType level,
68                            const DicomMap& input) const;
69 
70     // Returns "false" iff cancel
71     bool PerformGetSubOp(T_ASC_Association *assoc,
72                          const std::string& sopClassUid,
73                          const std::string& sopInstanceUid,
74                          DcmFileFormat* datasetRaw);
75 
76     void AddFailedUIDInstance(const std::string& sopInstance);
77 
78   public:
79     explicit OrthancGetRequestHandler(ServerContext& context);
80 
81     virtual bool Handle(const DicomMap& input,
82                         const std::string& originatorIp,
83                         const std::string& originatorAet,
84                         const std::string& calledAet,
85                         uint32_t timeout) ORTHANC_OVERRIDE;
86 
87     virtual bool DoNext(T_ASC_Association *assoc) ORTHANC_OVERRIDE;
88 
GetSubOperationCount()89     virtual unsigned int GetSubOperationCount() const ORTHANC_OVERRIDE
90     {
91       return static_cast<unsigned int>(instances_.size());
92     }
93 
GetCompletedCount()94     virtual unsigned int GetCompletedCount() const ORTHANC_OVERRIDE
95     {
96       return completedCount_;
97     }
98 
GetWarningCount()99     virtual unsigned int GetWarningCount() const ORTHANC_OVERRIDE
100     {
101       return warningCount_;
102     }
103 
GetFailedCount()104     virtual unsigned int GetFailedCount() const ORTHANC_OVERRIDE
105     {
106       return failedCount_;
107     }
108 
GetFailedUids()109     virtual const std::string& GetFailedUids() const ORTHANC_OVERRIDE
110     {
111       return failedUIDs_;
112     }
113   };
114 }
115