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 
34 #pragma once
35 
36 #include "../../OrthancFramework/Sources/DicomNetworking/DicomFindAnswers.h"
37 #include "../../OrthancFramework/Sources/DicomNetworking/RemoteModalityParameters.h"
38 
39 namespace Orthanc
40 {
41   class ServerContext;
42 
43   class QueryRetrieveHandler : public IDynamicObject
44   {
45   private:
46     ServerContext&             context_;
47     std::string                localAet_;
48     bool                       done_;
49     RemoteModalityParameters   modality_;
50     ResourceType               level_;
51     DicomMap                   query_;
52     DicomFindAnswers           answers_;
53     std::string                modalityName_;
54     bool                       findNormalized_;
55     uint32_t                   timeout_;  // New in Orthanc 1.9.1
56 
57     void Invalidate();
58 
59   public:
60     explicit QueryRetrieveHandler(ServerContext& context);
61 
62     void SetModality(const std::string& symbolicName);
63 
GetRemoteModality()64     const RemoteModalityParameters& GetRemoteModality() const
65     {
66       return modality_;
67     }
68 
69     void SetLocalAet(const std::string& localAet);
70 
GetLocalAet()71     const std::string& GetLocalAet() const
72     {
73       return localAet_;
74     }
75 
GetModalitySymbolicName()76     const std::string& GetModalitySymbolicName() const
77     {
78       return modalityName_;
79     }
80 
81     void SetLevel(ResourceType level);
82 
GetLevel()83     ResourceType GetLevel() const
84     {
85       return level_;
86     }
87 
88     void SetQuery(const DicomTag& tag,
89                   const std::string& value);
90 
GetQuery()91     const DicomMap& GetQuery() const
92     {
93       return query_;
94     }
95 
96     void CopyStringTag(const DicomMap& from,
97                        const DicomTag& tag);
98 
99     void Run();
100 
101     size_t GetAnswersCount();
102 
103     void GetAnswer(DicomMap& target,
104                    size_t i);
105 
IsFindNormalized()106     bool IsFindNormalized() const
107     {
108       return findNormalized_;
109     }
110 
111     void SetFindNormalized(bool normalized);
112 
SetTimeout(uint32_t seconds)113     void SetTimeout(uint32_t seconds)
114     {
115       timeout_ = seconds;
116     }
117 
GetTimeout()118     uint32_t GetTimeout() const
119     {
120       return timeout_;
121     }
122 
HasTimeout()123     bool HasTimeout() const
124     {
125       return timeout_ != 0;
126     }
127   };
128 }
129