comparison Orthanc/Core/DicomFormat/DicomMap.h @ 133:3251ec958a29

Option "RestrictTransferSyntaxes" saying which transfer syntaxes should be decoded with GDCM
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 09 Jun 2016 17:04:58 +0200
parents
children d73006baca3f
comparison
equal deleted inserted replaced
132:2fffa4d0f313 133:3251ec958a29
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 *
6 * This program is free software: you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation, either version 3 of the
9 * License, or (at your option) any later version.
10 *
11 * In addition, as a special exception, the copyright holders of this
12 * program give permission to link the code of its release with the
13 * OpenSSL project's "OpenSSL" library (or with modified versions of it
14 * that use the same license as the "OpenSSL" library), and distribute
15 * the linked executables. You must obey the GNU General Public License
16 * in all respects for all of the code used other than "OpenSSL". If you
17 * modify file(s) with this exception, you may extend this exception to
18 * your version of the file(s), but you are not obligated to do so. If
19 * you do not wish to do so, delete this exception statement from your
20 * version. If you delete this exception statement from all source files
21 * in the program, then also delete it here.
22 *
23 * This program is distributed in the hope that it will be useful, but
24 * WITHOUT ANY WARRANTY; without even the implied warranty of
25 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
26 * General Public License for more details.
27 *
28 * You should have received a copy of the GNU General Public License
29 * along with this program. If not, see <http://www.gnu.org/licenses/>.
30 **/
31
32
33 #pragma once
34
35 #include "DicomTag.h"
36 #include "DicomValue.h"
37 #include "../Enumerations.h"
38
39 #include <set>
40 #include <map>
41 #include <json/json.h>
42
43 namespace Orthanc
44 {
45 class DicomMap : public boost::noncopyable
46 {
47 private:
48 friend class DicomArray;
49 friend class FromDcmtkBridge;
50 friend class ToDcmtkBridge;
51
52 typedef std::map<DicomTag, DicomValue*> Map;
53
54 Map map_;
55
56 // Warning: This takes the ownership of "value"
57 void SetValue(uint16_t group,
58 uint16_t element,
59 DicomValue* value);
60
61 void SetValue(DicomTag tag,
62 DicomValue* value);
63
64 void ExtractTags(DicomMap& source,
65 const DicomTag* tags,
66 size_t count) const;
67
68 static void GetMainDicomTagsInternal(std::set<DicomTag>& result, ResourceType level);
69
70 public:
71 DicomMap()
72 {
73 }
74
75 ~DicomMap()
76 {
77 Clear();
78 }
79
80 size_t GetSize() const
81 {
82 return map_.size();
83 }
84
85 DicomMap* Clone() const;
86
87 void Assign(const DicomMap& other);
88
89 void Clear();
90
91 void SetValue(uint16_t group,
92 uint16_t element,
93 const DicomValue& value)
94 {
95 SetValue(group, element, value.Clone());
96 }
97
98 void SetValue(const DicomTag& tag,
99 const DicomValue& value)
100 {
101 SetValue(tag, value.Clone());
102 }
103
104 void SetValue(const DicomTag& tag,
105 const std::string& str,
106 bool isBinary)
107 {
108 SetValue(tag, new DicomValue(str, isBinary));
109 }
110
111 void SetValue(uint16_t group,
112 uint16_t element,
113 const std::string& str,
114 bool isBinary)
115 {
116 SetValue(group, element, new DicomValue(str, isBinary));
117 }
118
119 bool HasTag(uint16_t group, uint16_t element) const
120 {
121 return HasTag(DicomTag(group, element));
122 }
123
124 bool HasTag(const DicomTag& tag) const
125 {
126 return map_.find(tag) != map_.end();
127 }
128
129 const DicomValue& GetValue(uint16_t group, uint16_t element) const
130 {
131 return GetValue(DicomTag(group, element));
132 }
133
134 const DicomValue& GetValue(const DicomTag& tag) const;
135
136 // DO NOT delete the returned value!
137 const DicomValue* TestAndGetValue(uint16_t group, uint16_t element) const
138 {
139 return TestAndGetValue(DicomTag(group, element));
140 }
141
142 // DO NOT delete the returned value!
143 const DicomValue* TestAndGetValue(const DicomTag& tag) const;
144
145 void Remove(const DicomTag& tag);
146
147 void ExtractPatientInformation(DicomMap& result) const;
148
149 void ExtractStudyInformation(DicomMap& result) const;
150
151 void ExtractSeriesInformation(DicomMap& result) const;
152
153 void ExtractInstanceInformation(DicomMap& result) const;
154
155 static void SetupFindPatientTemplate(DicomMap& result);
156
157 static void SetupFindStudyTemplate(DicomMap& result);
158
159 static void SetupFindSeriesTemplate(DicomMap& result);
160
161 static void SetupFindInstanceTemplate(DicomMap& result);
162
163 void CopyTagIfExists(const DicomMap& source,
164 const DicomTag& tag);
165
166 static bool IsMainDicomTag(const DicomTag& tag, ResourceType level);
167
168 static bool IsMainDicomTag(const DicomTag& tag);
169
170 static void GetMainDicomTags(std::set<DicomTag>& result, ResourceType level);
171
172 static void GetMainDicomTags(std::set<DicomTag>& result);
173
174 void Print(FILE* fp) const;
175
176 void GetTags(std::set<DicomTag>& tags) const;
177
178 static void LoadMainDicomTags(const DicomTag*& tags,
179 size_t& size,
180 ResourceType level);
181
182 static bool ParseDicomMetaInformation(DicomMap& result,
183 const char* dicom,
184 size_t size);
185 };
186 }